# Reviewer Handoff Consistency

Reviewer and final-review controller handoffs must not contradict themselves.
A narrative that says a merge happened, a review was blocked, or a terminal
mutation budget was consumed must match the mutation ledger fields in the same
handoff.

## What gets validated

`reviewer_handoff_consistency.assess_reviewer_handoff_consistency()` checks:

- merge claims appear under `Merge mutations` or `MCP/Gitea mutations`
- terminal-mutation-budget claims name the exact prior mutation in the ledger
- blocked review submission is not paired with "final decision marked"
- reviewer lease acquisition includes a `Review decision`
- blocked/rejected mutations include proof fields:
  - tool called
  - mutation attempted
  - mutation rejected
  - no server-side state changed

`final_report_validator` applies this as `reviewer.handoff_consistency` on
`review_pr` reports and fails closed.

## Blocked review template

When `gitea_submit_pr_review` fails closed, use
`reviewer_handoff_consistency.render_blocked_review_handoff_template()` or the
copy in
[`skills/llm-project-workflow/templates/blocked-review-handoff.md`](../skills/llm-project-workflow/templates/blocked-review-handoff.md).

## Related

- #331 — file-mutation ledger alignment
- #501 — contradictory narrative vs ledger detection