I read this as a read-only authority audit - I’ll inspect the V14 r5 artifacts and untouched live roots, trace every required binding and state invariant, then return PASS/FAIL with exact file-and-line proof without executing any product path.


I read this as moving from artifact discovery to invariant tracing - I’ve identified the authoritative r5 roots and will now compare the package/preflight derivation, fixed target chain, registry gate, supersession set, and ledger state machine directly against source and untouched live bytes.


I read this as a read-only authority audit - I inspected the r5 candidate, preseal, preflight, source, and untouched live roots without executing the controller or modifying state.

# FAIL

The r5 package satisfies most binding requirements, but it does **not revalidate the live registry’s sealed shape/content before reserving authorization**. That violates an explicit authority requirement.

## Blocking proof: registry gate is not live-bound

- Registry shape is captured only during package preparation:
  - `scripts/prepare_nutricoach_v150_v14_preseal.py:91-112`
  - Expected two-row shape enforced at `:152-160`.
- Runtime preseal verification checks the saved `registry-shape.json`, not the current live registry:
  - `scripts/verify_nutricoach_v150_preseal_v14.py:119-132`
- Immediately before reservation, the controller calls:
  - `host.capture_preflight()` and `host.verify_preflight()` at `scripts/nutricoach_v150_sealed_controller.py:166-168`
  - then reserves at `:169-174`.
- But `capture_preflight()` computes fresh hashes from whatever bytes currently exist, and `verify_preflight()` compares those bytes only against those freshly captured hashes:
  - `scripts/nutricoach_v150_concrete_host.py:190-202`
- It never compares the live registry against:
  - `registry-shape.json.registry_sha256`, or
  - the registry SHA recorded in `snapshot-before.json`.
- After reservation, `capacity_after()` merely parses the current registry and checks that `admission_policy` is absent:
  - `scripts/nutricoach_v150_host_operations.py:26-39`

Therefore a changed but parseable registry can be accepted, reserved, and migrated. The currently observed registry happens to match the seal, but the transaction does not enforce that fact at the reservation boundary.

## Passing findings

- **Candidate/package/phrase derivation:** PASS.
  - Canonical candidate derivation recomputed to `232725f01e3cdfe7acd4a8927bd0ce46d22438d4c424165de6d83c068a41f628`.
  - Derivation implementation: `seal_nutricoach_v150_candidate.py:195-237`; independent verifier: `verify_nutricoach_v150_candidate.py:165-200`.
  - Canonical package payload recomputed to `fa58fc80a38ca4f4d58db84db9db46ba48b842e2d12b983f4f7eee236cabd147`.
  - Phrase is exactly `AUTHORIZE NUTRICOACH V1.5 LIVE UPGRADE <package_digest>`; enforced at `verify_nutricoach_v150_preseal_v14.py:89-95`.

- **Fixed launcher/bootstrap/worker/controller target:** PASS.
  - Launcher hardcodes r5 bootstrap: `execute_nutricoach_v150_sealed_live.py:14-23`.
  - Bootstrap hardcodes r5 preseal and sealed target: `nutricoach_v150_detached_bootstrap.py:15-18,139-160`.
  - Worker accepts only `--approval`; no target argument.
  - Controller hardcodes r5 `sealed-target.json`: `nutricoach_v150_sealed_controller.py:41-44`.
  - Runtime loads that exact target at `:228-248`.
  - Source and preseal hashes match for launcher, bootstrap, worker, controller, authority, and target modules.

- **No caller-controlled target:** PASS.
  - The only caller input across the live chain is the approval phrase.
  - Profile, service, unit, drop-in, runtimes, ledger, execution root, wheels, and inventory all come from the fixed sealed target.

- **Operations fields approval-payload-bound:** PASS.
  - Package payload includes target binding, weekly authority, capacity, expiry, event limits, wheels, service identity, and protected inventory.
  - Payload digest creation: `prepare_nutricoach_v150_v14_preseal.py:212-251`.
  - Target-to-payload equality enforcement: `verify_nutricoach_v150_preseal_v14.py:108-154`.

- **Supersession:** PASS.
  - All 19 earlier `preflight*/package.json` digests exactly equal the 19 entries in r5 `package-supersession.json`.
  - Every predecessor has `approval_phrase_reusable:false`; r5 is the sole active digest.

- **Ledger replay:** PASS.
  - Reservation uses durable `O_CREAT|O_EXCL`: `nutricoach_v150_sealed_authority.py:190-227`.
  - Existing reservation or consumed record denies replay.
  - Every success or `BaseException` consumes authority: `:229-285`.
  - STOPPING recovery restores/restarts and consumes FAILED; COMMITTING+SUCCEEDED finalizes COMMITTED:
    `nutricoach_v150_sealed_controller.py:207-221`.

- **Expiry:** PASS.
  - Inclusive issue / exclusive expiry check occurs before reservation:
    `nutricoach_v150_sealed_controller.py:159-174`.
  - Sealed window is `2026-08-27T00:00:00+09:00` through, but not including, `2026-09-30T23:59:59+09:00`.

- **Current untouched live roots:** PASS as observed.
  - Live registry SHA-256 is `bd61ed95f80737ba8013db262fd0242a600e540f43f6627f5b9708a599660b29`, matching r5 `registry-shape.json` and protected inventory.
  - Actual registry has exactly two rows: enabled `pilot_20260820_01`, disabled `task26_claim_20260818145508_1b96b23d`.
  - r5 ledger root, execution root, and successor runtime are all absent; authorization is unreserved and unconsumed.

No edits, network access, Telegram/provider calls, authorization, tests invoking product paths, or live execution were performed.