I read this as a production fix with strict regression and verification requirements - I’ll trace the sealed startup lineage and weekly authority contracts, reproduce the failure test-first, implement the smallest canonical builder, then run every requested gate.


I’ve confirmed the V12 root cause against both the rollback receipt and startup contracts: the migration writes only a boolean-style authority marker, while startup requires a registry inode/content binding, full schedule and paths, a canonical sidecar registry with per-customer registrations, and an operator receipt bound to config, owner, consent, candidate, and time. The alternative hypotheses—capacity postimage mismatch, Channel Inbox activation, and runtime/service switching—are excluded by the receipt’s committed capacity/config hashes, zero provider/Telegram events, and the failure occurring specifically in authority config capture. I’m moving to the failing disposable startup regression now.


I read this as continuation under the restored predecessor boundary - I’ll keep all work disposable, treat V12 as consumed evidence only, add the realistic pre-existing schedule ledger required by startup, and continue through GREEN and strict gates without touching live state or sealed artifacts.


The regression is GREEN through the real loader with clean resource closure, and both registry archive/tamper and owner/customer rebinding are denied at their actual authority boundaries. I’m starting broad verification now; any legacy fixture failures will be corrected to model the startup contract rather than bypassing it.


The real `TelegramAdapter` constructor now passes on the disposable migrated profile and closes its retained weekly capabilities without provider, Telegram, network, or customer mutation. The legacy v1.5 fixtures now carry the same realistic registry/canonical schedule prerequisites, and the focused strict diagnostics are clean; I’m running the final all-v1.5, Ruff, basedpyright, ty, and repository no-excuse checks.


All behavioral and static gates are now green, including the no-excuse scanner after moving shared realistic setup into the existing transaction support module; every touched module is below 250 pure LOC. I’m doing one final post-edit pass so the reported commands and results reflect the exact final tree.


I read this as a completed production fix report - I’ll summarize the root cause, exact changes, and verification evidence.

Implemented the canonical NutriCoach v1.5 weekly reminder migration authority.

**Root cause confirmed**

Three hypotheses evaluated:

1. Capacity postimage mismatch — excluded; capacity 5 was committed correctly.
2. Channel Inbox/runtime switching failure — excluded; Inbox remained OFF and V12 recorded zero provider/Telegram events.
3. Incomplete weekly authority/config — confirmed by V12 rollback receipt and startup contract tracing.

The migration wrote a boolean receipt, but startup requires exact post-write registry identity, complete schedule/path configuration, canonical sidecar registration, and a receipt bound to candidate, config, owner, customer, consent, and validity window.

**Changed files**

- `scripts/nutricoach_v150_weekly_authority.py` — new canonical authority builder
- `scripts/nutricoach_v150_host_operations.py`
- `scripts/nutricoach_v150_runtime_ops.py`
- `scripts/nutricoach_v140_authority_fixture.py`
- `tests/nutricoach_v150_transaction_support.py`
- `tests/test_nutricoach_v150_weekly_authority.py` — new regression suite
- `tests/test_nutricoach_v150_sealed_controller.py`
- `tests/test_nutricoach_v150_v3_hardening.py`

The builder now creates:

- Exact post-capacity-write registry inode/content binding
- Profile-relative registry and canonical authority paths
- Complete 20:00 reminder / 23:00 cutoff / Monday schedule
- Topic-59 operator review route
- Canonical authority root and customer registration
- Operator receipt bound to candidate, config, owner, customer, and consent
- Fixed sealed validity window
- Capacity 5 with Channel Inbox omitted/OFF

**RED evidence**

Initial regression:

```text
pytest -q tests/test_nutricoach_v150_weekly_authority.py
2 failed, 2 passed
weekly reminder startup config is invalid
```

This reproduced the V12 startup lineage.

**GREEN evidence**

```text
.venv/bin/pytest -q tests/test_nutricoach_v150_weekly_authority.py
4 passed in 0.32s
```

The test constructs the real `TelegramAdapter`, verifies the registered customer, and closes retained capabilities. It also proves denial for archived/replaced registries and owner/customer rebinding.

```text
.venv/bin/pytest -q tests/test_nutricoach_v150*.py
75 passed in 2.31s
```

Strict gates:

```text
ruff check <8 changed files>
All checks passed!

basedpyright <8 changed files>
0 errors, 0 warnings, 0 notes

ty check <8 changed files>
All checks passed!

check-no-excuse-rules.py <8 changed files>
no violations in 8 file(s)
```

LSP diagnostics: no findings on all changed files. Every touched module remains below 250 pure LOC.

No live profile, service, provider, Telegram, customer, V12 sealed artifact, plan, ledger, or evidence mutation occurred. No remaining blocker.