I read this as a full source-only r71b-maintenance implementation and disposable qualification - I’ll first establish the immutable-root baseline and architecture, then drive the smallest complete change through red/green tests and source-freeze evidence without touching authoritative or live state.


The baseline confirms every authoritative r71b/action/observer root is absent; I also found the worktree already contains an unqualified partial maintenance implementation, so I’m treating it as inherited source and will now measure its exact gaps against the addendum before editing. The first tombstone hash command was path-relative and intentionally made no writes; I’m rerunning it from each immutable root.


message: WebSocket error

stop_reason: error


The inherited runtime gate is behaviorally green but violates the normative addendum at its trust boundary: it still serializes a flat hold with `package_digest`, has no deterministic hold-id proof, and package preparation still points at immutable r71 roots. I’m starting the red/green conversion at that shared contract seam so runtime, preparer, and verifier can consume one acyclic derivation rather than duplicating fixes.


The runtime contract and independent two-stage replay are now green, including all 18 named tamper classes, and the candidate closure explicitly includes the maintenance/runtime/controller/observer/test surface. I’m moving into integration and static verification now; any inherited r71 artifact-based test will be classified separately because those tombstones must remain immutable and cannot be regenerated in place.


Static and affected behavioral verification is clean (294 tests), and old-r71 approval is now explicitly rejected before reservation. The remaining qualification gates expose a real blocker rather than a test defect: the inherited preparer/controller still lack the sealed projection/no-send derivation and event-driven maintenance transaction, so I will not fabricate `SOURCE_FREEZE_PASS` or a `DoneClaim`; I’m recording exact partial evidence and immutable-root proofs for the parent to continue safely.


I read this as a full source-only r71b-maintenance implementation and disposable qualification - I implemented the safe subset and recorded the remaining blockers without claiming completion.

`SOURCE_FREEZE_PASS` and `DoneClaim` were not issued because the inherited controller still lacks:
- Transactional hold/credential arming and event-before-start watch.
- `MAINTENANCE_CONFIRMED` fencing.
- Safe rollback with scheduler pause.
- Disposable twin-wheel, preseal, rehearsal, and installed-wheel QA.

Completed:
- Canonical two-stage package-binding/final-digest derivation.
- Runtime `package_binding_digest` contract.
- Independent replay verifier and 18 tamper cases.
- Fresh r71b namespace defaults and old-r71 approval rejection.
- Complete maintenance source overlay.
- 294 affected tests and 122 final focused tests passed.
- Ruff, ty, basedpyright, LSP, compile/import, and no-excuse checks passed.
- All authoritative r71b roots remain absent.
- Existing r71 tombstone hashes remain unchanged.

Evidence: `.omo/evidence/nutricoach-telegram-checkin-stepper/task-10-r71b-package-source-freeze.json`
Status: `SOURCE_FREEZE_BLOCKED`

Architectural review: new modules have single responsibilities, strict Pydantic boundaries, no type escape hatches or redundant verification, and behavior is test-locked. The 240-LOC maintenance contract is in the warning band and should be split before further growth.