---
name: a-daemon-restart-strands-persistent-shells-boot-instant-is-machine-boot
description: "A daemon-only restart (every self-update) leaves every persistent shell (PACER-0, alchemy-N) offline for good — the restore discriminant compares the launch to the MACHINE boot instant, so a daemon restart reads as a force-kill; recovery is `spt shell relink <id>` or any `shell cmd`."
metadata: 
  node_type: memory
  type: project
  originSessionId: 77b77a80-faae-4001-b2bd-37026934e11b
  modified: 2026-09-09T10:58:34.606Z
---

Measured 2026-09-08 10:26Z on hfenduleam (spt-core 0.67.0). Daemon restarted 2026-09-07 08:03Z with no
machine reboot (machine boot 2026-09-04 08:02:53Z). Every persistent shell died with it; the reconciler
healed each record `online -> offline` (8 `SHELL_RECORD_HEALED` lines) and NOTHING relaunched: zero
`SHELL_BOOT_RESTORED` / `SHELL_OWNER_ONLINE_RESTORED` lines in the whole generation. My pacer was silent
27 h before the operator asked why.

**Why:** `shellwake::launch_predates_boot` compares the parked launch stamp to `boot_instant_ms` = now minus
`GetTickCount64` (MACHINE boot). A shell launched at boot+46 s never predates that boot, so all three
triggers (boot sweep, owner-online edge, watcher) land in the "force-killed THIS boot => not eligible" arm.
The freeze that protects an operator's deliberate kill (releases#78 leg c) cannot tell a daemon restart
from a kill. `alchemy-0` came back only because `spt shell cmd` wakes an offline persistent instance on
demand; PACER gets no owner commands, so it stays down. Filed on spt-bs-releases 2026-09-08 (daemon-restart
face of KNOWN-HAZARDS 2.7 / [[REQ-HAZARD-RESTART-STRANDS-PERSISTENT-SHELLS]]).

**OPERATOR RULED 2026-09-08 10:37Z (on #287):** for `persistent = true` shells the force-kill freeze does not
apply — "such shells must come online anytime the endpoint comes online, end of story." The predates-boot
conjunct leaves the persistent path; an operator who wants one down uses teardown or a non-persistent
manifest, never a kill. Until that lands, the how-to-apply below is the workaround, not the contract.

**NARROWED 2026-09-09 (operator via doyle, deployah measuring) — "after ANY restart" OVER-FIRES.**
The strand needs a **session reset** to fire. The v0.68.0 flip on hfenduleam was a **BRAIN-ONLY**
update: the broker stayed alive, endpoint sessions were never reset, and every persistent shell
listed online with no relink needed anywhere — I confirmed alchemy-0 was not merely listed but
genuinely responsive. So the discriminant on the recovery side is not "did something restart" but
**did the BROKER restart**. Brain-only ⇒ `spt shell list` is enough. Broker restarted ⇒ run the
three steps below. (Mechanism above is unchanged and still holds for the case that DOES fire — the
2026-09-07 measurement stands; what narrows is the TRIGGER population, not the cause.)

**How to apply:** after a restart, first ask **which** restarted — brain-only or broker. Brain-only:
read `spt shell list`, done. Broker (or unknown): read `spt shell list` — every persistent instance
offline is this — and `spt shell relink <id>` each of your own (an owner can only relink its own; tell
peers theirs are down). A silent pacer is not "pacer idle"; check the SHELLS block of the now-signal.
Do not wait for the wake edge, it will not come.

**Verifying a shell actually survived — three steps, because the first two cannot see a strand
(doyle recorded this as the post-restart check 2026-09-09):**
1. `spt shell list` → a **registry ROW**, i.e. a state claim. A stranded shell can list `online`.
2. `spt shell cmd <id> <read-only op>` → `SHELL_SPOOLED` + exit 0 is **spool acceptance, NOT
   execution** — same trap as `state 272 acceptance`, which was rejected asynchronously while
   exiting 0 at the v0.68.0 close.
3. **The ANSWER arriving** (on your perch, from the shell) is the proof. Use a free read-only op —
   `help` or `list`. Cheap enough that nobody skips it.
Kin: [[silent-peer-may-be-out-of-usage-not-held]] (an absence that has no way to appear is not data),
[[a-tombstone-silences-the-pump-while-status-reads-held]], [[a-kept-caveat-goes-stale-when-the-evidence-narrows]]
(this entry is that rule applied to itself — narrowed, not kept and not dropped).
