/work/.claude/settings.json defines a Stop hook that kill -9s every xenia_canary at the end of each agent turn and prints "Stop hook killed N stale xenia process(es)". So every run that "died mysteriously" died at a turn boundary, which is why the timings looked random from inside the run (810 s, 54 s, 486 s) and why nothing in the guest, the cgroup or the host explained them. What survives is the measurement and not the story: the memory readings were real and did refute memory pressure - cgroup at 6.5 of 7.0 GB, host 12 GB free at the moment of a kill - but they were refuting a cause that was never in play. The method lesson is recorded because it cost three iterations: when a process dies at a SESSION boundary, check the harness before instrumenting the guest. A failure mode was documented, a hypothesis raised, a per-poll memory sampler written and committed, and host and cgroup counters read - all downstream of the assumption that the kill came from outside the agent. The hook's own message had been printed after every turn. The operational rule that follows: an emulator experiment must COMPLETE INSIDE A SINGLE TURN. Nothing survives the boundary, so runs cannot be left for the next tick, and experiments whose evidence arrives in the first minutes are the ones that work - which is exactly why the two-pass bit-level test succeeded where the long freeze-watches did not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE