Runtime evidence, PR 22834
Base: 5f85768394f417f5bd098ca7fe4fc41ef07a7cda
Head: dd6067398b9be72842cd8ef07931927435499c4e
Linux; Node source server (serve), real Claude Haiku, real systemd user manager. Fresh synthetic homes; no copied database. Console recordings are rendered live from timestamped actual runtime observations, not web UI recordings or post-hoc animations. Same 1440x900 dark console on each side.

Run vp i in both checkouts. Set HEAD_CHECKOUT, BASE_CHECKOUT, EVIDENCE_ROOT. Copy these scripts into EVIDENCE_ROOT. Copy acquire-runtime.mjs to apps/server/evidence-runtime.mjs in BOTH checkouts. Then run:
python3 "$EVIDENCE_ROOT/record.py" base crash
python3 "$EVIDENCE_ROOT/record.py" head crash
python3 "$EVIDENCE_ROOT/record.py" base systemd-barrier
python3 "$EVIDENCE_ROOT/record.py" head systemd-barrier
python3 "$EVIDENCE_ROOT/record.py" base live-service
python3 "$EVIDENCE_ROOT/record.py" head live-service
python3 "$EVIDENCE_ROOT/record.py" base live
python3 "$EVIDENCE_ROOT/record.py" head live
EVIDENCE_GATE_HOLD=1 python3 "$EVIDENCE_ROOT/record.py" head crash

Crash: two real Claude threads run foreground Python waiters. Confirm started files and native CLI identities. SIGKILL only backend and immediately restart same home. Read committed recovery events read-only and sample old identities. Release scripts, sample markers separately. Three ordinary repetitions per side are in repeat-summary.json; all three base runs had both old CLIs alive at recovery; all three head runs had both absent, with explicit startup-reaper signal attribution.

Systemd barrier adds a real Python waiter in a real scope under this synthetic home's owned agent slice before the crash. Its SIGTERM handler intentionally ignores TERM. Base cancellation precedes the slice stop; head completes slice stop before cancellation. This is a synthetic leftover scope, not a claim about arbitrary descendants.

Live-service: native Claude is explicitly configured so the real server puts its real CLIs under its owned systemd slice. While that real server remains alive, a supplemental command acquires the unmodified production AgentScope/ProviderProcesses layer against the SAME stateDir and invokes wrap. No mocked services or test runner. Base lazy cleanup stops the live server's agents. Head detects hasOtherLiveOwner=true, skips shared cleanup, preserves real CLIs, and both tools finish when released. This ran twice per side. A second complete server cannot reach this code: the existing ownership lock rejects it on both commits with exit 78. Separate live recordings show that real-app protection; we never removed or bypassed the lock.

Observation hook only logs production ledger renames, fd-4 releases, systemd commands and process.kill calls. The reaper source label comes from the actual caller stack containing providerProcesses. Ordinary comparisons add no deliberate delay. The separate gate recording intentionally holds the parent's gate.end call for 250ms AFTER registration: /proc confirms dash blocked in read on fd 0, which is the same pipe as fd 4 (shell redirection). It is then released and becomes a real Claude CLI. This hold does not contribute to the three ordinary comparisons.

No tests are offered as evidence. All videos are actual live console captures. Transcripts include PID/starttime identities, observations, actual persisted cancellation timestamps, and production-layer guard results. Artifacts contain synthetic data only. Unknown/unrecorded descendants are outside the ledger guarantee; marker results are separate observations.
