Duplicate detection
Most teams report the same bug three to seven times before anyone notices. Qalibr catches the repeats so they don’t each spawn a ticket.
It needs your backlog first
Qalibr matches new reports against the issues it has indexed from your tracker — not against a general idea of what a bug looks like. So the first thing that happens when you connect Linear or Jira is that Qalibr starts reading your existing backlog: the whole configured team or project, not just tickets Qalibr created.
- Indexing starts immediately on connect, then keeps running about every 30 minutes.
- Each pass indexes up to 2,000 issues, so a large project fills in over several passes — a backlog of a few thousand issues is usually complete within a few hours. Tickets Qalibr creates are indexed the moment they’re created.
- The dashboard header shows a Tickets indexed count so you can watch it climb.
Until something is indexed, there is nothing to match against, and a report will simply show no duplicate candidates. That looks identical to “we checked and found nothing” — so if you’re in your first hour and seeing no candidates, that’s why.
If a Slack report finds an empty index, Qalibr says so in the thread rather than staying quiet.
Match score
When a new report comes in, Qalibr compares it against the indexed issues and surfaces the closest matches, each with a Match score — shown as a percentage (for example, 94% match). The higher the score, the more confident the match.
By default it searches your open issues plus anything closed in the last 30 days, so a bug that just came back still finds its ticket.
The percentage is how close the two reports read. Behind it, Qalibr also weighs a shared error signature, overlapping keywords and a similar title, and it deliberately holds back when a report is thin on detail — those decide which candidates are worth showing you and in what order, rather than moving the percentage itself.
You’ll see at most three candidates, and only ones that clear the bar.
What you can do with a match
When Qalibr surfaces candidates, you choose what happens — in the dashboard:
| Action | Result |
|---|---|
| Link to this | Adds a comment to the existing issue. No second ticket. Works on a closed issue too, without reopening it. |
| Reopen as duplicate | Reopens a closed issue and links the new report to it. Offered only when the candidate is closed. |
| Reject as duplicate | Marks the report as a confirmed duplicate — no new ticket, and deliberately no comment on the original, so you don’t add noise to a ticket you’ve already decided about. |
| None of these — route as new | None of the candidates fit. Qalibr opens a fresh ticket. |
Reopening works on Linear and Jira. If the ticket can’t be moved back to an open state, Qalibr files a new ticket linked to the closed one rather than failing.
Slack shows you the similar issues it found, but choosing between them happens in the dashboard.
If nothing clears the bar, there’s nothing to decide — Qalibr simply routes the report as a new bug when you approve it. It never blocks a ticket on a duplicate without asking.
Where duplicates live
Reports you fold into an existing issue — linked, reopened, or rejected as a duplicate — show up under the Duplicates filter in your Inbox. A report that had to be filed as a new ticket linked back to a closed one counts as Routed.
The Dedup rate · 30d tile on your dashboard home tracks how many repeats Qalibr is catching. See The dashboard.