I read this as full implementation of Todo 4 in the designated worktree - I’ll characterize existing Wave 1 behavior, add deterministic RED state-table coverage, implement the durable stepper, then run the required regression, static, manual QA, cleanup, and evidence checks.


Exploration is complete: Wave 1 already provides the strict content-free projection journal and legal phase graph. I’m preserving it and implementing the orchestrator as a separate async boundary: durable prepare and domain commit happen before a typed transport preflight, `SEND_STARTED` is persisted before network I/O, and any ambiguous provider outcome becomes non-retriable `DELIVERY_UNCERTAIN`; restart/observation paths never send.


message: WebSocket error

stop_reason: error


The dedicated state table is now GREEN (23 deterministic cases). The implementation records every boundary before crossing it, classifies definite rejection separately from ambiguous post-start failure, and converts cancellation or receipt-persistence failure to uncertainty without replay. I’m moving to strict static checks, the full Wave 1 regression matrix, and the zero-network lifecycle driver.


I read this as completion reporting for Todo 4 - I’ll return the verified implementation outcome and DoneClaim.

DoneClaim: **Todo 4 complete.**

Implemented durable at-most-once Telegram check-in stepper with:

- Full six-phase projection state machine.
- Typed transport, ingress, cursor, receipt, and transition contracts.
- Zero automatic replay after interruption or uncertainty.
- Explicit UI-only recovery.
- Content-free durable storage.
- Deterministic RED→GREEN coverage: **23 passed**.
- Wave 1 regressions: **19 profile + 284 gateway passed**.
- Ruff, ty, basedpyright, LSP, and compile checks passed.
- Manual zero-network QA: `status:PASS`, `happy_sends:1`, `automatic_recovery_sends:0`.
- Temporary driver deleted and absence verified.
- No existing scoped production files modified.

Evidence:

`/home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-telegram-checkin-stepper/task-4-stepper-orchestrator.json`


I read this as a focused strict-typing repair for Todo 4 tests - I’ll replace dynamic/private test fixtures with explicit typed helpers, clear ty and basedpyright for module plus test without suppressions, rerun the 303-test matrix and static checks, then refresh evidence while retaining the unchanged-production manual QA.


The dynamic bridge setup and all private bridge-state access are gone. The characterization now drives the real public launcher/callback/text path and verifies persistence through `BindingStore`; transport/transition fixtures are typed dataclasses, cursor loading is an annotated callable, journal results are consumed, and persisted JSON is narrowed through explicit typed guards.


Both strict verifiers now exit clean on the production module and dedicated test together: ty reports “All checks passed!” and basedpyright reports `0 errors, 0 warnings, 0 notes`. Behavior remains 23/23 GREEN; I’m running the isolated profile suite plus 284-test gateway matrix (303 total), then I’ll update only the existing evidence.


I read this as the amended Todo 4 completion report - the strict test blockers are closed and evidence is current.

**Amended DoneClaim**

- Production module unchanged; SHA-256 remains `45e480a...b3ce`.
- Dedicated tests: **23 passed**.
- Full regression matrix: **303 passed**.
- ty: **All checks passed**.
- basedpyright: **0 errors, 0 warnings, 0 notes**.
- Ruff, LSP, and compileall clean.
- No `Any`, casts, suppressions, private bridge access, or weakened assertions.
- Manual QA retained because runtime code/hash is unchanged.
- Temporary driver remains absent.

Updated evidence:

`/home/cube/projects/richard/traning coach/.omo/evidence/nutricoach-telegram-checkin-stepper/task-4-stepper-orchestrator.json`