# Task26 private lifecycle observer commands

Run from `/home/cube/projects/richard/traning coach`. Create a new 0700 run evidence directory, copy `runtime-manifest.template.json` to it as `observer-manifest.json`, replace every runtime placeholder with the new lifecycle IDs and receipt SHA-256 values, and set the manifest to 0600. Outputs must not exist.

The three compatibility interfaces are:

```bash
H='.omo/evidence/task26/task26-lifecycle-observer-st_01a005b4/lifecycle_observer.py'
P='/home/cube/.hermes/profiles/dualcoachtest'
M='<0700-run-evidence>/observer-manifest.json'

python3 -B "$H" subscribe-outbox --profile "$P" --manifest "$M" --after-seq 0 --timeout 120 --output '<0700-run-evidence>/outbox-transition.redacted.json'
python3 -B "$H" audit-tail --profile "$P" --manifest "$M" --after-seq 0 --timeout 120 --output '<0700-run-evidence>/audit-transition.redacted.json'
python3 -B "$H" watch-deliveries --profile "$P" --manifest "$M" --after-seq 0 --timeout 120 --output '<0700-run-evidence>/delivery-transition.redacted.json'
```

For each re-arm, use the prior receipt's `transition.revision_after` as both the manifest `after_seq` and CLI `--after-seq`, and set the expected next state. A mismatch fails closed.

Read-only arm proof (creates subscriptions and a redacted receipt, then closes without waiting or profile mutation):

```bash
python3 -B "$H" arm-only --profile "$P" --manifest "$M" --receipt '<0700-run-evidence>/arm-only.redacted.json'
```

Coordinated lifecycle observation uses a readiness FD. The parent action controller must create a pipe, pass its write FD as `--ready-fd`, and block service/invite/handset action until one JSON message with `status: READY` names all three observers:

```bash
python3 -B "$H" multi-observer --profile "$P" --manifest "$M" --timeout 600 --ready-fd "$READY_WRITE_FD" --receipt '<0700-run-evidence>/multi-observer.redacted.json'
```

`multi-observer` arms all inotify subscriptions before writing READY. It never starts/stops/replays a service, calls Telegram/provider/network, changes cursors, drops updates, forces publication, or mutates profile authority. Each target is descriptor-opened with `O_NOFOLLOW`; profile descendants and evidence parents must be owner-held 0700 and authority/manifest/output files owner-held 0600 with one link. Outbox/audit/delivery acceptance requires an exact `IN_MOVED_TO` atomic replacement and one candidate-ID-bound transition. Unknown outcomes, duplicates, skipped revisions, wrong IDs, schema drift, symlinks, hardlinks, ownership/mode drift, inotify overflow, and monotonic timeout all fail closed.
