<!-- Canonical page: https://docs.radforge.dev/results/accepted-survivors/ -->

# Accept a reviewed survivor

Accept a reviewed survivor to keep matching future plans from executing and reporting the same mutation again.

## Accept a survivor

Use the run and finding IDs returned by Radforge:

```bash
rad remote accept \
  --run <run-id> \
  --finding <finding-id> \
  --reason equivalent \
  --note "Both forms have the same observable behavior"
```

`--reason` is required. Use a standard reason when it fits, or write a short
custom reason.

| Standard reason     | Use it when                                                           |
| ------------------- | --------------------------------------------------------------------- |
| `equivalent`        | The mutation cannot change observable behavior.                       |
| `not-required`      | The changed behavior is intentionally outside the supported contract. |
| `covered-elsewhere` | Another test surface checks the behavior but is not run by this plan. |
| `accepted-risk`     | The gap is understood and deliberately deferred or accepted.          |
| `tool-limitation`   | The generated mutation is not useful because of a tool limitation.    |

`--note` is optional. Add one when a future reviewer would benefit from the
reasoning or a link to supporting evidence.

The command accepts only a `survived-mutant` finding. It rejects coverage gaps
and other result types. The command writes the decision to
`radforge-waivers.json` at the repository root.

## Share the decision

Commit `radforge-waivers.json` when the decision should apply to teammates, CI,
and agents:

```bash
git add radforge-waivers.json
git commit -m "Accept reviewed mutation survivor"
```

A matching plan carries the waiver into execution. Radforge emits a `waived`
outcome with the recorded reason and does not run the mutant. A waived mutant is
not a killed mutation or a cache hit.

Candidate matching is exact. When a source edit changes the candidate identity,
Radforge runs the new candidate and asks you to review the new result instead of
silently applying an uncertain waiver.

## List active waivers

```bash
rad waivers list
rad waivers list --json
```

Do not expire an accepted mutant only because time passed. Keep the active
waiver while the same mutation candidate remains in the code.

## Prune stale waivers

Create an unbudgeted `rad plan` or `rad scope` artifact that covers the source
files you intend to clean up. Do not use a budgeted plan or a changed-line plan,
because those plans intentionally omit live candidates. Preview the change
before applying it:

```bash
rad plan --target src/example.ts --json > plan.json
rad waivers prune --artifact <plan.json> --json
rad waivers prune --artifact <plan.json> --apply --json
```

Pruning removes a waiver only when its source file is covered by the supplied
plan's complete candidate scope and its exact candidate is absent. Waivers for
source files outside the plan remain unchanged. The CLI rejects artifacts that
do not declare a complete candidate scope. Run cleanup from the main branch with
a plan that covers the intended scope.

The CLI does not try to prove that every fork, remote branch, or unpushed branch
has stopped using the candidate. Those branches may not be visible locally. Git
history retains removed waiver decisions, and an older branch retains the
manifest version in its own history. If a rebase drops a waiver that old code
still needs, Radforge reruns the mutant. That is safer than carrying an uncertain
waiver forward.
