---
name: rest-state-suspended-is-not-a-suspend-proof
description: "spt-core's `rest_state = \"suspended\"` is stamped by terminal_normalize on ANY session death, so it cannot discriminate an operator suspend from a killed harness — never branch on it as if it could."
metadata: 
  node_type: memory
  type: project
  originSessionId: e3fe33c1-a4e8-48b0-b5f5-1e65d8c792f2
  modified: 2026-08-04T16:22:25.815Z
---

`spt_store::info::terminal_normalize` stamps `status=offline` + `rest_state=suspended`
whenever a broker session DIES. So a harness that was merely killed reads on disk
**identically** to an endpoint an operator rested with `endpoint suspend`. There is no
on-disk discriminant between them.

**Why:** measured 2026-08-04 on the U3 lane (releases#5). `spt go`'s ratified ladder has
a "suspended → wake then rc" rung; I read `rest_state` for it. In `dummy_harness_e2e`'s
online-race row the harness is KILLED, so the row read `suspended`, `go` took the wake
rung, and the rung ended at `rc` — which re-asks liveness of the persisted row and
fast-fails `offline — nothing to attach to`. The retired `endpoint run` had recovered from
that same state, so the rename silently LOST a capability. Two stacked errors: a
discriminant that does not discriminate, and a terminal rung where an additive one
belonged.

**How to apply:** never branch terminally on `rest_state == "suspended"`. If a step is
only correct for a genuinely-rested endpoint, make it ADDITIVE — do it, then continue into
the path that also serves the dead case (U3's fix: wake, THEN bring up and attach; both
readings then land right). If you need the ambiguity recorded, put it at the FIELD and at
the branch site, not in a commit message. Kin: [[stale-snapshot-equality-proxy]],
[[derived-view-vs-on-disk-record]], [[husk-reads-as-default-defeats-durability]] — a
persisted field answering a question it was never the authority for.

Same lane, same class: `go` reached its live rungs through the HONEST session probe
(ADR-0041 decision 6) and then handed off to `rc`'s status-gated attach, which re-asks the
same question of the persisted row. Attach SESSION-CONFIRMED from a rung the honest probe
already decided — re-asking a worse authority is the ADR-0042 split.
