hertz — all three delivered. Details in files; headlines here. === 1. INSTRUMENT — ARMED, and it proved it can say DEAD before I trusted it to say ALIVE === FILE: **C:\Users\decid\.spt-watch\daemon-watch.log** (script beside it, watch-daemon.ps1; its own pid in watcher.pid). Outside the repo on purpose — .spt/ is one `git clean -xdf` from gone. Watcher pid 59736, 1 s cadence, subject pid 48232 path-verified. ARM pid=48232 path=...\spt-core\bin\spt.exe born=2026-09-07T08:03:20Z cmd=... daemon run --detached CONTROL probe of a nonexistent pid returned: NULL (detector can report DEAD) alive poll=90 / 120 / 150 (healthy at time of writing) Design choices worth knowing: it logs EVERY 30th poll so a STALE LAST LINE is itself proof the WATCHER died rather than the subject surviving; it re-verifies image path AND creation time every poll, so a REUSED pid logs `IDENTITY-CHANGED ... subject died unobserved` instead of reading as alive; on death it dumps a WITNESS list (cargo/rustc/nextest/spt/Runner/node/link/cl with command lines) which is how it names the CI step at that instant; then it waits for and timestamps the REPLACEMENT daemon. TWO INSTRUMENT FAULTS I HIT AND FIXED — both are the class I keep filing, so I am reporting them rather than only the working end state: (a) The first launch produced a RUNNING PROCESS THAT COULD NOT WRITE. LocalMachine execution policy is AllSigned, `-File` refused the script, and the process existed while the log stayed empty. I caught it only because I checked for the first LINE rather than for the process. Fixed with `-EncodedCommand`, to which policy does not apply. (b) My verification census matched ITSELF: `Get-CimInstance ... -match 'watch-daemon'` finds every probe whose own command line contains that string, so I "found the watcher" four times and once stopped one of my own probes believing it stale. Fixed by having the watcher write watcher.pid and verifying from the FILE, never from a command-line census. (Disclosure for your incident record: that Stop-Process is the ONLY kill I have issued tonight, at ~08:17Z, against a powershell probe of mine, not against any spt process.) === 2. CENSUS — .spt/PID-KILL-CENSUS.md === THE SPLIT FIRST: a kill through an OWNED handle cannot hit a reused pid — Windows will not recycle a pid while a handle is open — so 22 `child.kill()`-style sites are safe by construction and listed once, not analysed. The population is kills that START FROM A BARE u32. GUARDED: servicehost.rs:651 — the reference implementation, `provably_gone` then `exe_path(pid)` vs the parked image via `same_image`, with a fresh post-kill read. Its comment IS the rule: "The pid is live. WHO is it? The image path decides — never the number." GUARDED: livehost.rs:1135 — kills only on a POSITIVE basename/cmdline match, else LEGACY_PSYCHE_SWEEP_DECLINE ... left running. **UNGUARDED: broker.rs:8102** — the zombie reap. `spid` is a REMEMBERED pid off the session record; `zombie_verdict` consults liveness BY NUMBER (`process_exists`/`is_process_alive`), `adapter_labeled` (a property of the RECORD, not of the live process), descendants and grace. **The live process's image is never read.** UNGUARDED (narrow): daemon.rs:3472 (`is_process_alive` only) and shellhost.rs:639 (inherits its caller). Guarded-by-construction: broker.rs:9736 + the test teardowns, whose pid comes from a live handle held in the same scope. THE FINDING: spt-core already contains the right pattern TWICE and does not apply it at the one production site that reaps a pid remembered across time. Fix shape: lift the image comparison into the zombie path, or into `kill_pid_tree` itself so no caller can forget it. AND THE HONEST PART: this does NOT explain 08:03:15Z on its own. The daemon had a live brain, so `has_live_descendants` is true and the verdict returns false — the thing that would have saved it is ACCIDENTAL (descendants), not deliberate (identity). It protects only while the brain is up. LIMIT: the adapter half is INCOMPLETE. The installed dirs (PACER, alchemy, claude-spt, mobile, omp-spt) hold only manifest.toml/record.toml. The one source I could find, omp-spt.mjs, kills owned handles only (:989, :997). **Four of five adapters are UNCENSUSED — point me at their code.** === 3. BOARD PARAGRAPH — the conn-churn log defect === **The fleet daemon writes ~100 MB/day of stderr from brain-connection churn.** The generation-0 daemon on hfenduleam (pid 14444) accumulated **303,128,498 bytes — 303 MB — over ~72 h uptime** (`mono_ms` 259,193,764 at its last line). Two line families dominate, both tagged `[REQ-CONN-POISON-ATTRIBUTION]` and both `role=brain`: in the FINAL 2 MB alone there are **3,238** `CONN_LIFECYCLE ... event=write-start` and **3,086** `CONN_LIFECYCLE ... event=transport-close poisoned=false timed_out=false`, alongside **1,163** `NET_FAMILY_GATE: binding IPv4-only (IPv6 unreachable or disabled)`. Connection ids had reached **720,837**. The retirement path states the cost plainly: `CONN_WRITE_RETIRED: ... organic write failure (BrokenPipe: The pipe is being closed. (os error 232)); physical broker conn poisoned + retired, never reused (same retire behavior as POISONED — only the failure class differs)`. So a brain conn is opened, written, broken and retired thousands of times per 2 MB of log, each one permanently retired. The log volume is the visible symptom; whether the churn itself is a defect or the instrumentation is merely too loud about a normal reconnect is NOT established here, and the entry should say so — the measured claim is the rate, the two families, the 720,837 conn ids and the never-reused sentence. Noted you are communing across; nothing here needs an answer before you are back.