I read this as a read-only recovery-policy investigation - I’ll trace the approved plan, failed evidence, sealing/authority code, tests, registry, and historical naming, then write one evidence-bound JSON verdict without touching implementation or migration state.


The relevant boundary is now identified: the failed candidate is an evidence-root snapshot, while the migration registry currently ends at sealed r70. I’m narrowing next to Todo 8-10’s exact contract and the digest/path semantics that govern whether a second r71 attempt is legal.


The code and authority model support a same-generation retry: candidate identity is content-derived, selection is digest-derived, and r71 is fixed by the still-unused preseal/authority/controller roots. I’m recording the recovery as a fresh `task-v15r71-candidate-r2`, with the original failed root retained outside trust and with fail-if-present semantics required before any retry is attempted.


The recovery analysis is written. I’m validating the JSON shape, verdict, absence assertions, and the evidence file itself; no product, migration, authority, or service validator will be executed.


I read this as a request for the final recovery verdict - the evidence-bound analysis is complete.

**Verdict: `recoverable`**

Use fresh immutable `task-v15r71-candidate-r2`; generation remains r71. The failed candidate remains an excluded tombstone.

Evidence: `.omo/evidence/nutricoach-telegram-checkin-stepper/task-8-r71-recovery-analysis.json`
SHA-256: `0d7bde1218f3fd979cc832f272c2c3152bd3dc2bcf1e05d74e0f8390f4f8ac81`

Validated JSON, unchanged failed root, and continued absence of retry/r71 effect roots.