Repository navigation
One crash, one issue.
A repeat of a crash somebody already reported now comments on that issue instead of filing a new one.
submit() and create_issue() accept a fingerprint; when an open issue already carries it, feedback-hub posts a comment there and returns that issue. The second person to hit a crash lands on the first person's report.
Two invariants:
- An empty fingerprint means do not deduplicate -- never a real value. A hash of nothing would collapse every unparseable report onto one issue.
- Dedup can never lose a report. Every failure path -- network, permissions, a comment that will not post -- falls through to creating a new issue.
The id is built from the exception class and the innermost frames. It deliberately ignores line numbers (they shift every release, exactly when duplicates arrive fastest), the exception message (KeyError: 'a3f9' vs 'b710' is one defect), and absolute paths (they carry usernames and frozen-build layout).
Also adds version_label=, a fingerprint column in the local store (migrated in place), and shared body builders so an issue and its duplicate comment cannot drift apart.
62 tests pass. The GitHub integration is covered against a faked API; verify once against the live tracker after release.