# 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