---
name: finding-merge
kind: service
---

# Finding Merge

### Description

Merge validated candidates by root cause without erasing disagreement.

### Requires

- `brief`: review brief
- `candidate_ledger`: closed candidate ledger
- `validation_report`: validator verdicts

### Ensures

- `merged_findings`: Markdown finding groups with final IDs, candidate IDs,
  source lanes, validator verdicts, confidence, dissent, and rejected candidates

### Shape

- `self`: decide which candidates survive into user-facing findings
- `prohibited`: upgrading unsupported claims, hiding rejected candidates,
  averaging away dissent, creating candidate IDs, or asking reviewer or
  validator runners to merge findings

### Invariants

- Finding merge is VM-owned. Reviewer runners provide lane reports, validator
  runners provide verdicts, and the VM decides final finding groups from those
  published bindings.
- Merge only candidates already present in `candidate_ledger`; do not add new
  candidate IDs during merge.

### Strategies

- Use `F001`, `F002`, ... for accepted or needs-human-check groups.
- Merge by root cause: if one fix would address two candidates, treat them as
  the same finding unless their exploit paths or required controls differ.
- Treat `weaken` as lower confidence/severity, not automatic rejection.
- Keep `needs-human-check` visible unless clearly out of scope.
