HERTZ -> DOYLE: PERRI OFFLINE/RUNNING CONTRADICTION RCA Date: 2026-07-17 Node: HFENDULEAM, spt v0.37.1 VERDICT The immediate operator failure is an attach-path authority split, not a duplicate harness and not a dead-process false positive. The broker still hosts an honest live session for perri, while perri's persisted perch row is offline. `spt rc perri` trusts the offline row and refuses before consulting broker session truth; `spt endpoint run --resume ...` consults broker truth first and successfully attaches to that same session. DECISIVE A/B REPRO 1. `spt rc perri` -> `Endpoint 'perri' is offline — nothing to attach to.` (exit 1) 2. `spt endpoint run --adapter claude-spt:ccs --id perri --resume anchor-int-proof` -> `ENDPOINT_ALREADY_LIVE:perri: a live session is already running — attaching to it (not spawning a duplicate)` -> clean detach, exit 0; no second process spawned. 3. `spt endpoint run --adapter claude-spt:ccs --id perri --create --start` -> `ENDPOINT_CREATE_CONFLICT:perri: a live session already exists — no session was created` (exit 1), proving the same honest broker-session gate. STATE EVIDENCE - endpoint-info: perri endpoint_type=live_agent, adapter=claude-spt:ccs, controlled=false, persisted status offline. - merged endpoint list local row: ready=false, alive=false, unbound=false. - perch info.json is old/stale: started=1784197646, pid=47752 (dead), parent_pid=55836 (dead), status=offline, rest_state=active, session_id=64b3da58-... . - latest ledger + resume.pid: session `anchor-int-proof`, resume.pid=49780. - live process tree: 49780 claude-spt.exe launch --cli ccs --id perri --resume anchor-int-proof; descendants cmd 82052, node/ccs 65208, claude.exe 45452. All alive. - daemon fresh-generation lifecycle: conn=33 controller session=3 endpoint=perri attaches; `WAKE_RESUME:perri ... anchor-int-proof ... pid 49780 — online at bind`; startup controller then detaches. No later perri broker-session detach appears. - `SessionProbe::has_live_session_honest` therefore returns true: the session's recorded adapter/client PID tree is alive, so this is not a zombie verdict bug. CODE SEAM - `crates/spt/src/rc.rs::run_attach` performs the persisted offline STATUS short-circuit and emits the refusal before broker-session attach. - `run_attach_session_confirmed` explicitly skips that short-circuit for callers that already proved a broker session. - `crates/spt/src/cli.rs::cmd_endpoint_run`, lines 2004-2010, uses `SessionProbe::has_live_session_honest(id)` as the ADR-0041 single liveness authority; its Reattach arm calls `run_attach_session_confirmed` and works. ROOT CAUSE Two reader paths disagree on liveness authority. The normal `spt rc` surface trusts a stale persisted offline projection; endpoint-run correctly trusts the broker's honest session map. The broker/session and real process tree agree. The perch projection never returned online after the wake-resume startup attach detached (no observed subsequent harness bind), but that projection lag must not make an extant honest broker session unattachable. RECOMMENDED FIX Make normal `spt rc ` use the same bounded honest broker-session gate as endpoint-run before applying the offline fast-fail. If an honest session exists, call the session-confirmed attach path regardless of persisted offline status. Keep the offline refusal only when broker authority confirms no honest session (or the bounded establish path expires). Reuse `SessionProbe`; do not add another liveness heuristic. Add the exact regression matrix: offline persisted row + honest live broker session => `spt rc` attaches; offline + no session => existing refusal; claimed zombie/dead client tree => refusal/reap, never attach. SECONDARY OPEN QUESTION Why the resumed harness never self-bound its perch after `WAKE_RESUME` remains a separate lifecycle/projection issue. The resumed process environment contains SPT_ENDPOINT_ID=perri but no SPT_HOST_PID/OWL_SESSION_ID/CLAUDE_ENV_FILE, and the active adapter hook trace has no perri/49780/45452 entry. That explains the stale offline projection directionally, but it is not required to reproduce or fix the operator-visible attach contradiction.