feat: deterministic crash fingerprinting and clusters #2

Merged
Breadway merged 4 commits from feature/fingerprint into main 2026-10-11 19:47:32 +08:00
Owner

Closes BUG-5

Stacked on #1 (intake). Part of ECO-EP1.

What

  • fingerprint.rs: stable fingerprints from normalized symbols (legacy hash suffix, generics, closure numbering removed), the top 5 non-noise frames (panic machinery, runtime and GLib main-loop frames are skipped), the source file without line numbers or crate versions, and the panic message with numbers and markers removed. Rules are versioned. Unsymbolicated frames fall back to module+offset (groups within one build, still correct).
  • Freezes use the live stack when the user included one; behavior reports and evidence-free freezes get no fingerprint and are left for the fuzzy step (BUG-6).
  • Clusters (migration 2): app, kind, fingerprint, title, status, first/last seen, count, distinct installs, per-version and per-OS-build counts, fixed_in, issue_key, merged_into (resolved on assignment). Deleting a report shrinks its cluster and per-version counts. Quarantined reports are never clustered.
  • Clustering runs on intake and a failure never loses the report (it is stored unclustered and logged).

Tests

  • 10 fingerprint tests: normalization, noise, locations, messages, the same bug across versions/machines hashes the same, different bugs differ, offset/module fallback, only the top frames count, freeze via live stack, no-evidence cases.
  • 4 HTTP integration tests: same bug from two versions/installs is one cluster (count, installs, versions, os builds, title), different bug is a separate cluster, quarantined and fingerprintless reports are unclustered, deleting shrinks the cluster.
  • clippy -D warnings clean.
Closes BUG-5 Stacked on #1 (intake). Part of ECO-EP1. ## What - `fingerprint.rs`: stable fingerprints from normalized symbols (legacy hash suffix, generics, closure numbering removed), the top 5 non-noise frames (panic machinery, runtime and GLib main-loop frames are skipped), the source file without line numbers or crate versions, and the panic message with numbers and markers removed. Rules are versioned. Unsymbolicated frames fall back to `module+offset` (groups within one build, still correct). - Freezes use the live stack when the user included one; behavior reports and evidence-free freezes get no fingerprint and are left for the fuzzy step (BUG-6). - Clusters (migration 2): app, kind, fingerprint, title, status, first/last seen, count, distinct installs, per-version and per-OS-build counts, fixed_in, issue_key, merged_into (resolved on assignment). Deleting a report shrinks its cluster and per-version counts. Quarantined reports are never clustered. - Clustering runs on intake and a failure never loses the report (it is stored unclustered and logged). ## Tests - 10 fingerprint tests: normalization, noise, locations, messages, the same bug across versions/machines hashes the same, different bugs differ, offset/module fallback, only the top frames count, freeze via live stack, no-evidence cases. - 4 HTTP integration tests: same bug from two versions/installs is one cluster (count, installs, versions, os builds, title), different bug is a separate cluster, quarantined and fingerprintless reports are unclustered, deleting shrinks the cluster. - clippy `-D warnings` clean.
feat: deterministic crash fingerprinting and clusters
Some checks failed
check / check (push) Has been cancelled
e5ce497b7e
Reports with stable evidence (panic/crash frames, location, message, or a
live stack for a freeze) are fingerprinted from normalized symbols (hash
suffixes, generics and closure numbers stripped, runtime/panic noise
skipped), source file without line, and the message with numbers removed.
The same bug therefore groups across versions and machines. Clusters track
count, distinct installs, per-version and per-OS-build counts and first/last
seen; deleting a report shrinks its cluster. Quarantined reports are not
clustered. Rules are versioned (RULES_VERSION).

Refs BUG-5
chore: factor a complex type for clippy
Some checks failed
check / check (push) Has been cancelled
812eac0274
feat: re-run fingerprinting over stored reports
All checks were successful
check / check (push) Successful in 28s
5d079f5644
refingerprint_all recomputes fingerprints for every clean stored report,
moves those whose fingerprint changed under new rules, and prunes clusters
left empty unless a human acted on them. Satisfies the 're-runnable' part of
the normalization-rules requirement.

Refs BUG-5
fix: scope raw fingerprints to builds and preserve panic sites
All checks were successful
check / check (push) Successful in 45s
27922a5269
Breadway changed target branch from feature/intake to main 2026-10-11 19:41:09 +08:00
Breadway force-pushed feature/fingerprint from 27922a5269
All checks were successful
check / check (push) Successful in 45s
to cbd201fd59
All checks were successful
check / check (push) Successful in 46s
2026-10-11 19:43:57 +08:00
Compare
Breadway deleted branch feature/fingerprint 2026-10-11 19:47:32 +08:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Breadway/breadbug-server!2
No description provided.