1---
2name: finding-merge
3kind: service
4---
5
6# Finding Merge
7
8### Description
9
10Merge validated candidates by root cause without erasing disagreement.
11
12### Requires
13
14- `brief`: review brief
15- `candidate_ledger`: closed candidate ledger
16- `validation_report`: validator verdicts
17
18### Ensures
19
20- `merged_findings`: Markdown finding groups with final IDs, candidate IDs,
21 source lanes, validator verdicts, confidence, dissent, and rejected candidates
22
23### Shape
24
25- `self`: decide which candidates survive into user-facing findings
26- `prohibited`: upgrading unsupported claims, hiding rejected candidates,
27 averaging away dissent, creating candidate IDs, or asking reviewer or
28 validator runners to merge findings
29
30### Invariants
31
32- Finding merge is VM-owned. Reviewer runners provide lane reports, validator
33 runners provide verdicts, and the VM decides final finding groups from those
34 published bindings.
35- Merge only candidates already present in `candidate_ledger`; do not add new
36 candidate IDs during merge.
37
38### Strategies
39
40- Use `F001`, `F002`, ... for accepted or needs-human-check groups.
41- Merge by root cause: if one fix would address two candidates, treat them as
42 the same finding unless their exploit paths or required controls differ.
43- Treat `weaken` as lower confidence/severity, not automatic rejection.
44- Keep `needs-human-check` visible unless clearly out of scope.