## Verdict
**ITERATE**

## Claim Checks

- The immutable target was read in full. The RALPLAN index records `stage-32-revision.md` at revision stage 32 with SHA-256 `6e73b32d680f340e33390dc562eace84e1f6408618c224203a475296742adca2`, matching the assignment.
- Stage 32 explicitly addresses all six Stage-31 findings: it selects `customer_root/wizard/.events.lock` for canonical event/sequence writes and recovery; removes canonical/overlay mutation from generic adaptive recovery; assigns overlay read/recovery to `.authority-transition.lock`; requires an async deadline/cooperative transport boundary; specifies one terminal unknown/audit-pending chain with no resend; and adds canonical/overlay append/recovery-vs-reader tests.
- The lock-domain correction is grounded in current code. `AdaptiveEventStore.append_canonical_event`, `validate_canonical_prefix`, `freeze_legacy_prefix`, `customer_admin.py`, and tests currently construct `CanonicalSequenceJournal` with `adaptive_root/.events.lock`, while `EventStore._record_lock` writes canonical events under `wizard/.events.lock`. Stage 32 correctly identifies the split and names the authoritative inode.
- The recovery correction is also necessary and correctly directed. Current `AdaptiveEventStore.recover(path=None)` directly includes canonical event, canonical sequence, and overlay targets, while `OverlayJournal` writes under `.authority-transition.lock`. The addendum removes those cross-domain mutations and names domain-owned locked recovery/read APIs.
- The proposed provider boundary fits the actual delivery path only partially. The current coordinator obtains `self.customer_transport` after reservation, accepts sync-or-awaitable results, and swallows `CancelledError` into `delivery_unknown`; `TelegramCustomerTransport.send_adaptive_customer` eventually invokes the strict Telegram sender. Stage 32 correctly requires a diagnostic-only async/deadline branch and cancellation propagation while preserving ordinary behavior.
- Referenced implementation surfaces were verified: profile `adaptive_nutrition.py`, `store.py`, `customer_admin.py`, `wizard_storage.py`, `customer_schedule.py`, `pyproject.toml`, and named tests exist; gateway `nutrition_coaching.py`, `telegram.py`, configuration and named gateway tests exist. `diagnostic_isolation.py`, `diagnostic_evidence.py`, policy package files, and diagnostic-focused tests are intentionally new files from the incorporated Stage-28 plan.

### Representative implementation simulation

1. **Canonical append:** current `EventStore` holds `wizard/.events.lock` around dedupe, raw-payload work, `_append`, and rebuild; `_append` writes only `events.jsonl`. Current `CanonicalSequenceJournal` separately locks, recovers, then appends the event and adaptive-root sequence sidecar. Following Stage 32 literally would either re-open/flock the same inode from inside `EventStore._record_lock`, risking self-deadlock, or release the EventStore transaction and weaken dedupe/import atomicity. `EventStore` also receives only its `wizard` home and is not told the existing `nutrition-plans/canonical-sequence.jsonl` path. The plan therefore does not yet define an executable, compatibility-safe integration for ordinary single and batch imports.
2. **Recovery:** the desired owner split is clear, but current `append()` already calls `recover(path=...)` while holding `.adaptive.lock`, whereas public `read(recover=True)`, `journal_rows(recover=True)`, and `source_day_rows(recover=True)` can call it without an outer lock. “While already holding” does not say whether public wrappers acquire the lock or require it, and blindly adding acquisition creates the same nested-flock problem. A public-wrapper/private-locked split is needed.
3. **Diagnostic delivery:** the host can validate a conforming transport before reservation, but the current adaptive coordinator’s `customer_transport` remains mutable through `set_customer_transport()` and is read again after reservation. Nothing in Stage 32 pins that exact validated instance through provider invocation or synchronizes/rejects a concurrent transport swap. A generic/noncooperative transport can therefore be substituted after the pre-reservation check. Protocol booleans and `inspect.iscoroutinefunction` also do not prove cooperation for structurally admitted test doubles; production/test-double admission must be made non-forgeable in the runtime path.

## Missing Evidence

Definitely missing:

1. The exact `EventStore` → `CanonicalSequenceJournal` transaction API, existing sequence-sidecar location/migration rule, and lock-reentrancy strategy for single appends and multi-event history/baseline imports.
2. The exact public/private recovery locking contract that acquires each owner inode once, rejects arbitrary cross-domain paths, and preserves all current `recover=True` callsites without nested locking.
3. An immutable transport-instance binding from pre-reservation validation through provider invocation. The current mutable coordinator setter makes the proposed precheck subject to a TOCTOU swap.

Thin and requiring expansion:

4. State the full transport signature, retaining `reservation_id` and adding `deadline_monotonic`, and name how the remaining monotonic budget reaches Telegram’s native `connect_timeout`, `pool_timeout`, `write_timeout`, and `read_timeout` (or one explicitly identified equivalent request API).
5. Define how test doubles are admitted only by an explicit test-only injection boundary rather than by forgeable marker attributes in a production host, and test a concurrent transport swap plus a marked-but-cancellation-resistant fake.

## Approval Boundary

Execution may rely on the Stage-28 architecture, packaged-policy contract, physical read-only reader rules, overlay ownership, full-triple/generation fencing, terminal unknown/audit-pending semantics, and the stated canonical/overlay race and no-mutation acceptance tests. Do not begin the canonical writer migration or diagnostic provider path until the transaction/recovery and immutable-transport details above are bound. No live Telegram, network, credentials, manual P2–P6, or deployment is approved.

## Summary

- **Clarity:** Strong intent and domain ownership; canonical transaction and transport pinning remain under-specified.
- **Verifiability:** Strong race/no-mutation outcomes; missing swap/reentrancy cases.
- **Completeness:** Stage-31 findings are textually covered, but findings 1, 2, 4, and 5 are not yet executable without design choices.
- **Big Picture:** The selected fail-closed isolation architecture remains coherent.
- **Principle/Option Consistency:** Shared owner locks and concrete deadline transport align with the principles; mutable transport selection does not yet enforce them.
- **Alternatives Depth:** Adequate; rejected torn-copy, source-only policy, and unfenced drain alternatives remain valid.
- **Risk/Verification Rigor:** High overall, with two load-bearing TOCTOU/reentrancy gaps.

## Required Changes

1. Specify one canonical transaction interface that owns `wizard/.events.lock`, state the authoritative sequence-sidecar path and any migration/legacy-prefix handling, and provide lock-aware single/batch append methods used by every `EventStore` and adaptive append/recovery callsite. Preserve EventStore dedupe/import atomicity without nested `flock`; make constructor/path invariants reject the old adaptive lock.
2. Split adaptive/canonical/overlay recovery into public wrappers that acquire their owner lock exactly once and private `*_locked` implementations; enumerate allowed adaptive paths, reject arbitrary/cross-domain `path`, and route every current `recover=True` callsite through the correct owner.
3. Freeze or explicitly pass the validated diagnostic transport instance through reservation and provider invocation under `_admission_lock`; prevent `set_customer_transport` from racing diagnostic delivery. Limit production admission to the exact registered `TelegramCustomerTransport`/Telegram adapter pair, put doubles behind an explicit test-only injection boundary, retain `reservation_id` in the deadline-aware signature, specify native Telegram timeout kwargs, and add deterministic swap/lying-marker/cancellation-resistance tests.
