fix(review): one reviewer's two findings on one triplet keep a row each

Pass 1 merged two different /code-review findings on (bin/slug.mjs, 46, CODE_REVIEW_DEFECT) and the second lost its row and its action. A reviewer never duplicates itself: its second finding on a triplet under another title stays its own row, with the id over rule_key#2 (the form critic-diff already uses); fill-finding-ids counts the same way (voyage-lekerepo trial 5, finding 7).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-10-18 19:50:20 +02:00
commit b47cabdf30
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
6 changed files with 112 additions and 23 deletions

View file

@ -76,7 +76,11 @@ re-reading, and fresh finding generation are all forbidden.
### Pass 1 — Dedup by `(file, line, rule_key)` triplet
Two findings collide when their `(file, line, rule_key)` triplets are
identical. When findings collide:
identical, with one exception: **one reviewer never duplicates itself.** Two
findings from the same reviewer on one triplet under different titles are two
findings (an engine's catch-all `rule_key` makes this common): keep both rows,
in input order. A finding from another reviewer joins the row whose title it
shares, else the first one. When findings collide:
- Rank the colliding findings and keep the first:
1. the higher catalogue tier: the severity `lib/review/rule-catalogue.mjs`
gives the `rule_key`, or the finding's own severity when the key is
@ -420,8 +424,9 @@ for the ID list.
where n is its 1-based position in the JSON block's `findings` array.
`/trekreview` Phase 7 runs `lib/review/fill-finding-ids.mjs`, which
replaces each placeholder with the id computed over `(file, line,
rule_key)` (`lib/parsers/finding-id.mjs`) and refuses a placeholder with
no finding behind it.
rule_key)` (`lib/parsers/finding-id.mjs`; the k-th row on one triplet
gets it over `rule_key#k`) and refuses a placeholder with no finding
behind it.
- **Suppressed findings are accountable.** When you remove a finding via
Pass 2 or Pass 3, log it in `## Suppressed Findings` with the reason and
its fate (`[dropped]` / `[unverified]`), and list every `[unverified]` one