I read this as an implementation and evidence-sealing task - I’ll derive an immutable v4 package from v3, fix and test write-all semantics, verify only against the clean state, then seal and report exact artifacts.


Exploration confirms the live lifecycle is already clean and the v3 archive is sealed at `9f5d72...`; v4 must therefore be verification-only in the current state while retaining tested execution code for future integrity, with execution explicitly blocked rather than replayed.


I’m starting the append-only implementation now: the v4 controller will use a bounded write-all loop, carry forward the immutable v3 archive schema, bind the completed archive/v3 seal/current poststate, and make `execute` fail closed because the one-use cleanup has already completed.


The deterministic fault-injection suite now passes all 12 cases, including the explicit v3 truncation regression and v4 exact-write success. I’m moving to read-only live verification, then package inventory and sealing; no execute path will be invoked.


The v4 package is now sealed. Final checks will only recompute the package inventory, predecessor hashes, archive root, and current clean-state verifiers; the sealed root will not be changed.


I read this as completed implementation and evidence delivery - the sealed v4 successor is ready and independently verified.

Root:
`.omo/evidence/task26/task26-post-lifecycle-cleanup-v4-4a6c7ee5-st_01a00e68`

Key hashes:
- Controller: `7750425a92b611fb0ac7155ca3007b3398900de1ae0be2a39eb03071333a8cd0`
- Tests: `7a469b5d8eb8383fb13d1b4165e1053aec0115a5b39c666965252e0e46723393`
- Independent verifier: `e2ef688b72d0bb1548fdb17b1e9ac1ae4cb9a005077282a72ee8c3b9ba4e200e`
- Seal verifier: `2c7499ddca2d977dc4fd84c1659040d4873754d4d24ef14fe71bda533c6a1fd2`
- Inventory: `406b4eb3a18c003c3b14d59af56917ec2e391715a50ce13fdd06aa0416b74ee5`
- Evidence root: `1fd017728ee586e2955b465a9ff7cf56437404bb4074714a7874e781228f7dd4`
- Seal: `188e9e630b53e9329ae185fc8c007aecb7988c16d174d325d68e8e004edb38e9`

Finding closure:
- `write_all()` loops over a `memoryview` until complete.
- Retries `InterruptedError`.
- Rejects zero, negative, non-integer, boolean, and over-length write counts.
- Write/fsync/close failures unlink the temporary file before publication.
- Atomic replacement, file and directory fsync, exclusive mode-0600 temporary creation, and no-follow behavior are preserved.
- All archive and receipt writes remain routed through `atomic()` and therefore `write_all()`.

Verification:
- Pytest: `12 passed`
- Ruff: PASS
- Compile: PASS
- LSP: 0 errors
- Dry-run: PASS, `mutations: 0`, `cleanup_replayed: false`
- Controller verification: PASS
- Independent verification: PASS, 84 checks
- Seal verification: PASS, 19 evidence entries and 172 archive entries
- Regression demonstrates v3 produced `abc` from a simulated partial write of `abcdefgh`; v4 produced exact `abcdefgh`.
- Archive-write failure test proves no rename, no temporary residue, and no mutation command.

Preserved bindings:
- Candidate: `4a6c7ee54cf9526a30de8bb576c1d71b411938beba33a04914738f6e1b6ed1cb`
- Lifecycle seal: `50e7556e58a876d8136fbfb2023ede8bcb46ac816d97d4b85e1d0559f463d008`
- Immutable v3 seal: `84d937ef67c1517bfdbca4cabce9fb4bfbe39aa1165458bb3aedd14decc4bff0`
- Existing archive root: `9f5d72840b4cc1fcb57720a61ebc53529fa00202d9201615e4ebdbb3e047a635`

No cleanup execution or live mutation occurred. V4 explicitly denies mutation replay because cleanup is already complete.