I read this as a release-readiness review - I’ll inspect the changed NutriCoach source and tests without modifying anything, then report a PASS/FAIL with concrete evidence.


message: WebSocket error

stop_reason: error


I read this as an investigation - I audited the current successor source without edits or production access.

**FAIL - 1 blocker. Deployment is not ready.**

- **Future-start activation notices are permanently discarded.**
  - `telegram.py:10682-10692` checks completion notices with the scheduler's current KST date, then marks any denied notice `unknown`.
  - `nutrition_coaching.py:2615-2619` correctly denies customer transport before `starts_on`.
  - A valid activation for `starts_on=2026-09-01`, drained on `2026-08-31`, reproduced: `prepared -> unknown (authority_changed_before_provider)`; on-start authority is `True`. The fake provider was not invoked.
  - Result: the newly added activation-completion notice never reaches a customer whose plan starts in the future, so the invite-to-first-check-in handoff is incomplete.

**Passed evidence**
- Invite TTL and single-use/claim authority, consent recovery, activation replay, activation notice reservation, and onboarding serialization: **117 passed**.
- Multi-customer onboarding-projection replay regression: **1 passed**.
- Scheduler inline-card contracts: **8 passed**.
- Current source also restores a missing bootstrap projection from its append-only journal and normalizes schedule times to KST.
- No live Telegram/customer send or production access occurred; tests and the reproduction used temporary directories and test doubles.

**Verification caveat**
- The broader async scheduler test selection cannot run in this worktree because its venv lacks the declared `pytest-asyncio` development dependency. This is a local validation-environment gap, not an assertion failure.

Fix the notice path to defer a pre-start receipt rather than terminally marking it `unknown`, with a regression test for activation before `starts_on`.


I read this as final verification - I will inspect the updated notice path and run the focused end-to-end goal tests without touching production.


I read this as final verification - focused goal tests passed.

PASS
blocker_count: 0
remaining blocker: none