[
  {
    "pair": 1,
    "idA": "REQ-ACL-ACCESS-REFRESH-VERB",
    "titleA": "`spt api access-refresh` is MINTED THIS WAVE BUT REFUSES \u2014 the verb exists, parses and is documented, and its refusal na",
    "idB": "REQ-ACL-RC-VIEW-SPLIT",
    "titleB": "Watching an endpoint's terminal and DRIVING it are separately grantable: attach gates on the request's AttachIntent \u2014 Vi",
    "docA": "control-surface modes (`open` / `closed`)** (ratified 2026-07-29, access-control grill): Per-surface",
    "docB": "control surface** (ratified 2026-07-28, access-control grill): The unit of access-control granularit"
  },
  {
    "pair": 2,
    "idA": "REQ-ACL-NODE-MODE-SET",
    "titleA": "The node's control-surface modes are settable through the engine room and nowhere else (ADR-0052 decisions 1 and 3, CONT",
    "idB": "REQ-CONSENT-1",
    "titleB": "Consent grant store: capability x subject-agent x target-node rows, enforced at the target node, subnet-settable (replic",
    "docA": "A locked-down **agent endpoint** (harness-adapter-backed, spt-hosted, has a mind \u2014 it can be briefed",
    "docB": "N/A"
  },
  {
    "pair": 3,
    "idA": "REQ-ACL-SURFACE-VOCAB",
    "titleA": "Access control is granular at the CONTROL SURFACE, not at the endpoint. A rule is (target endpoint x surface x subject) ",
    "idB": "REQ-MSG-SENDER-STAMP",
    "titleB": "Daemon-stamped authenticated sender: a NEW additive `WanMessage.sender_proven` field (serde-default) carrying the SESSIO",
    "docA": "control surface** (ratified 2026-07-28, access-control grill): The unit of access-control granularit",
    "docB": "endpoint access whitelist** (distinct from the grant store \u2014 the outer reach gate): A per-endpoint a"
  },
  {
    "pair": 4,
    "idA": "REQ-MSG-6",
    "titleA": "cross-node Gateway user-msg honored via advertised endpoint_type: a user-msg from a Gateway-typed origin survives the re",
    "idB": "REQ-RCVIEW-1",
    "titleB": "Remote-attach controller/viewer model (CONTEXT.md:317): a session's broker OutputLog serves ONE interactive controller (",
    "docA": "_Implemented posture_: the **local** user-backed origins are honored end-to-end \u2014 a locally-hosted G",
    "docB": "BUILT (M12 W2.5).** The controller/viewer model is implemented end-to-end. Attach intent is **three-"
  },
  {
    "pair": 5,
    "idA": "REQ-ADAPTER-FLOOR-ENFORCE",
    "titleA": "F-5 (REMOTE-TRUTH triage \u00a7F-5 + doyle rulings 2026-07-05): BOTH adapter acquisition verbs (spt adapter add + spt adapter",
    "idB": "REQ-HAZARD-ADAPTER-PROFILE-STAMP-CLOBBER",
    "titleB": "A-4 (F029, operator regression): the picker/confirm views drop an endpoint's adapter `:profile` (showed `claude-spt` whe",
    "docA": "`min_spt_core_version` is the **enforced** compatibility floor. Both acquisition verbs \u2014 `spt adapte",
    "docB": "N/A"
  },
  {
    "pair": 6,
    "idA": "REQ-ADAPTER-PROOF-DIR-OVERRIDE",
    "titleA": "The author-time proof commands (`spt adapter digest-proof`, `spt adapter translate-proof`) gain a `--dir <path>` / `--ma",
    "idB": "REQ-HAZARD-DAEMON-SCHED-NONBLOCKING",
    "titleB": "Per-agent pulse/psyche/echo-commune scheduling must not serialize across agents: each agent's bounded LLM call (echo-com",
    "docA": "Proof a DEV build off disk \u2014 `--dir` / `--manifest`.** Both `digest-proof` and `translate-proof` acc",
    "docB": "N/A"
  },
  {
    "pair": 7,
    "idA": "REQ-ADAPTER-UNRESOLVED-HINT-FORM",
    "titleA": "F-034 leg a (perri/hertz field finding 2026-07-09): the ADAPTER_UNRESOLVED refusal hint must print a WORKING command for",
    "idB": "REQ-MANIFEST-7",
    "titleB": "Adapter-declared shortcut basename (M12-W2 follow-on): an optional `[adapter] shortcut_basename` manifest field names th",
    "docA": "N/A",
    "docB": "`shortcut_basename` *(optional, default `spt`)* \u2014 the basename the `spt endpoint run` picker's `s` k"
  },
  {
    "pair": 8,
    "idA": "REQ-API-1",
    "titleA": "api prefix and adapter_name on every machinery invocation",
    "idB": "REQ-SEAM-CAPABILITY",
    "titleB": "Hostable endpoint-types capability declaration",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 9,
    "idA": "REQ-DIGEST-FETCHER-STRATEGY",
    "titleA": "Bug #17 (W6b, closes eel-a end-to-end): [digest] gains a `fetcher` strategy mirroring [history]'s locate/normalize split",
    "idB": "REQ-ECHO-DROP-DIR-RESOLVE",
    "titleB": "W1 (LIFECYCLE-TRUTH): fire_echo resolves the manifest commune_dir through the SAME resolver its siblings use before any ",
    "docA": "`[digest]` supports the same two locate strategies as `[history]` \u2014 pick with `strategy`: / `[digest",
    "docB": "N/A"
  },
  {
    "pair": 10,
    "idA": "REQ-DOC-ECHO-COMMUNE-CONTRACT",
    "titleA": "W6 (LIFECYCLE-TRUTH, docs \u2014 this gap cost a full outage night, priority slot): publish the [session.echo_commune] I/O co",
    "idB": "REQ-RESUME-CONTEXT-PULL",
    "titleB": "Adapter-callable resume-context pull verb + not-yet-synthesized commune/signoff drop append (legacy-SPT parity, operator",
    "docA": "the full echo-commune I/O contract: the role + fields, the key catalog spt-core fills, the no-histor",
    "docB": "resume-session seam** \u2014 two distinct forms: fresh-with-preload:** resume with *cleared* context (a f"
  },
  {
    "pair": 11,
    "idA": "REQ-EP-7",
    "titleA": "Durable live-role.md: a per-agent broad-purpose statement in tracked/agents/<id>/ beside live-context.md (replicates wit",
    "idB": "REQ-MANIFEST-6",
    "titleB": "Cross-adapter fallback target addressing (M12-W3-T3.2): a cross-adapter fallback target is addressed as `<adapter>:<prof",
    "docA": "live role** (`live-role.md`, ratified 2026-06-12 \u2014 core milestone A): A durable statement of an agen",
    "docB": "Command templates are opaque.** spt-core never parses out a model/tool/flag \u2014 the adapter writes the"
  },
  {
    "pair": 12,
    "idA": "REQ-HAZARD-BROKER-SEED-WIRE-SKEW",
    "titleA": "A daemon-state wire-format change (e.g. the v0.9.0 adapter-agnostic Seed) does NOT take effect until a DELIBERATE full b",
    "idB": "REQ-MANIFEST-6",
    "titleB": "Cross-adapter fallback target addressing (M12-W3-T3.2): a cross-adapter fallback target is addressed as `<adapter>:<prof",
    "docA": "7.9 A daemon-state wire change needs a deliberate BROKER restart (the broker is resident across a br",
    "docB": "Command templates are opaque.** spt-core never parses out a model/tool/flag \u2014 the adapter writes the"
  },
  {
    "pair": 13,
    "idA": "REQ-HAZARD-ECHO-BEFORE-SIGNOFF",
    "titleA": "Echo-commune fires before INIT_SIGNOFF on orphan teardown (3.3)",
    "idB": "REQ-RESUME-CONTEXT-PULL",
    "titleB": "Adapter-callable resume-context pull verb + not-yet-synthesized commune/signoff drop append (legacy-SPT parity, operator",
    "docA": "N/A",
    "docB": "resume-session seam** \u2014 two distinct forms: fresh-with-preload:** resume with *cleared* context (a f"
  },
  {
    "pair": 14,
    "idA": "REQ-LISTEN-SEED-CONSUME-AFTER-BIND",
    "titleA": "F-034 leg b (perri/hertz field finding 2026-07-09, hertz's HEADLINE): `api listen` must NOT consume the consume-once eph",
    "idB": "REQ-MANIFEST-NODE-KEY",
    "titleB": "A new session-scoped manifest fill key `{node}` resolves to THIS node's advertised label \u2014 available wherever the sessio",
    "docA": "Recoverable refusals do not consume the seed.** The seed is consumed by a successful bind** \u2014 or by ",
    "docB": "```toml [session.self] {node} fills as one argv token \u2014 the node's advertised label (its hostname). "
  },
  {
    "pair": 15,
    "idA": "REQ-MANIFEST-NODE-KEY",
    "titleA": "A new session-scoped manifest fill key `{node}` resolves to THIS node's advertised label \u2014 available wherever the sessio",
    "idB": "REQ-SEAM-UPDATE",
    "titleB": "Adapter-update avenue (file-pull / delegated command)",
    "docA": "```toml [session.self] {node} fills as one argv token \u2014 the node's advertised label (its hostname). ",
    "docB": "N/A"
  },
  {
    "pair": 16,
    "idA": "REQ-RESUME-CONTEXT-PULL",
    "titleA": "Adapter-callable resume-context pull verb + not-yet-synthesized commune/signoff drop append (legacy-SPT parity, operator",
    "idB": "REQ-RESUME-HARNESS-SESSION-ID",
    "titleB": "B2 (F028, hall-b diagnosis, verified 0.22.0): respawn/`--resume` feeds the SPT session id to `claude -r`. After the 02:0",
    "docA": "resume-session seam** \u2014 two distinct forms: fresh-with-preload:** resume with *cleared* context (a f",
    "docB": "N/A"
  },
  {
    "pair": 17,
    "idA": "REQ-UPDATE-APPLY-RESTART-NOTICE",
    "titleA": "`spt update apply` prints a LOUD restart-required notice whenever the surviving broker will keep running the pre-apply i",
    "idB": "REQ-WHOAMI-EXPLICIT-SID-REFUSAL",
    "titleB": "RULED DESIGN, delivery unowned (doyle 2026-07-26): when a caller hands identity resolution an EXPLICIT non-empty $OWL_SE",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 18,
    "idA": "REQ-HAZARD-HANDOFF-ARGV-COMPAT",
    "titleA": "Broker/brain IPC + handoff argv version-tolerant (2.3)",
    "idB": "REQ-HAZARD-LOCAL-API-AUTH",
    "titleB": "Every local `api` mutation authenticated to an endpoint/session (codex #13)",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 19,
    "idA": "REQ-CLI-1",
    "titleA": "spt endpoint noun namespace: absorbs fork/suspend/wake/shutdown/rename/stop/digest + access (ported 1:1: allow|revoke|op",
    "idB": "REQ-MSG-SELF-DETECT-ANCESTRY",
    "titleB": "#9 (F026, operator field bug): a perch-owned `spt send` from an endpoint's OWN session must self-identify, not mis-stamp",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 20,
    "idA": "REQ-CLI-4",
    "titleA": "User-facing CLI output is human-readable: DIRECT-USER commands (e.g. adapter update/list/use) render friendly prose inst",
    "idB": "REQ-DIGEST-CURSOR",
    "titleB": "`spt endpoint digest` gains incremental turn-end consumption (extends REQ-TERM-4/5): `--last <N>` = the last N TURNS (th",
    "docA": "N/A",
    "docB": "Turn boundaries \u2014 classify delivered messages as `input` (binding).** The projection treats a `role:"
  },
  {
    "pair": 21,
    "idA": "REQ-CLI-HELP-MARKDOWN",
    "titleA": "`spt --help` (and every subcommand --help) renders the inline Markdown authored in the clap doc-comments as terminal sty",
    "idB": "REQ-SHELL-4",
    "titleB": "Shell tunnel (reliable-ordered opaque byte stream): an owner<->shell link may hold a long-lived, reliable-ordered, link-",
    "docA": "N/A",
    "docB": "shell tunnel: a long-lived reliable-ordered link-bound QUIC stream pair carrying opaque bytes the ta"
  },
  {
    "pair": 22,
    "idA": "REQ-CLI-WIN-VT-ENABLE",
    "titleA": "A7 (F028, operator, Win10 conhost): ANSI emitted without VT enable \u2192 garbled console. Evidence (raw PowerShell 7, Win10 ",
    "idB": "REQ-REST-VERB-ROUTING",
    "titleB": "A-3 (REMOTE-TRUTH triage \u00a7A + Q3 operator-law): a BARE-id rest verb (spt wake/suspend <id>) routes across the subnet lik",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 23,
    "idA": "REQ-DIGEST-JSON-SELF-CONTAINED",
    "titleA": "TEARDOWN-AUTHORITY W4 (perri adapter-surface finding 2026-07-19, doyle-grounded and RE-SCOPED; title AMENDED at gate 202",
    "idB": "REQ-SHELL-LIST-DERIVED-PROVENANCE",
    "titleB": "SEED (inactive \u2014 observability, perri-backed 2026-07-26): a status a reader can act on should be distinguishable from a ",
    "docA": "the self-contained --json contract: top-level integer version cursor, stderr-clean under --json, the",
    "docB": "N/A"
  },
  {
    "pair": 24,
    "idA": "REQ-ENDPOINT-LIST-NODE-IDENT",
    "titleA": "Bug #5: spt endpoint list local section header is the hardcoded literal LOCAL (this node) (render_local_section cli.rs:4",
    "idB": "REQ-MSG-SELF-DETECT-ANCESTRY",
    "titleB": "#9 (F026, operator field bug): a perch-owned `spt send` from an endpoint's OWN session must self-identify, not mis-stamp",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 25,
    "idA": "REQ-ER-RULESET-TABLE",
    "titleA": "The engine room presents access rulesets as TABLES (ADR-0052 decision 3). The rendering is a requirement rather than a n",
    "idB": "REQ-SHELL-3",
    "titleB": "Drive channel (owner->shell, REST-only, never-spooled, latest-wins): the owner->shell mirror of sensory for continuous r",
    "docA": "Refuses all inbound except replies to its own outbound (knocks and knock-codes ARE accepted); online",
    "docB": "N/A"
  },
  {
    "pair": 26,
    "idA": "REQ-MSG-2",
    "titleA": "spt binary CLI surface: send/ring/ready(+--once)/list/stop/whoami, stable arg shapes + exit codes",
    "idB": "REQ-MSG-CLI-ORIGIN",
    "titleB": "A bare non-perch CLI `spt send` (no owning perch to name as origin) stamps from = `cli@<node-label>` at compose time (ba",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 27,
    "idA": "REQ-SHELL-1",
    "titleA": "Shell hosting machinery: shell perch under the owner (type/owner/adapter_name/status/alias), broker-launched binary + ap",
    "idB": "REQ-SHELL-LIST-DERIVED-PROVENANCE",
    "titleB": "SEED (inactive \u2014 observability, perri-backed 2026-07-26): a status a reader can act on should be distinguishable from a ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 28,
    "idA": "REQ-DAEMON-REFRESH",
    "titleA": "THE-FORKENING W4 (operator add 2026-07-14): `spt daemon refresh` \u2014 restart the daemon BRAIN without a binary swap and WI",
    "idB": "REQ-HAZARD-CONTROLLER-LEASE",
    "titleB": "RC-RENDER-TRUTH W2 (KNOWN-HAZARDS 7.48 \u2014 umbrella conformance seam for ADR-0044): at most one input-capable controller l",
    "docA": "daemon refresh (`spt daemon refresh`)** \u2014 restart the **brain** in place, no binary swap, broker and",
    "docB": "7.48 At most one input-capable controller lease per PTY session \u2014 takeover revokes atomically and lo"
  },
  {
    "pair": 29,
    "idA": "REQ-HAZARD-INPUT-ACK-BACKPRESSURE",
    "titleA": "A FLOOD of operator input on one brain\u2194broker connection deadlocks the broker PERMANENTLY (entire broker \u2014 no new/existi",
    "idB": "REQ-HAZARD-PTY-INPUT-WRITER-WEDGE",
    "titleB": "Pasting into an `spt rc` session WEDGES the broker \u2014 after a paste the operator can no longer type AND can no longer att",
    "docA": "7.19 An operator input FLOOD must not deadlock the broker via the applied-ack on the same conn `[REQ",
    "docB": "N/A"
  },
  {
    "pair": 30,
    "idA": "REQ-DAEMON-7",
    "titleA": "`daemon run` is foreground-consistent on every platform: the invoking process IS the daemon, blocks until signalled, nev",
    "idB": "REQ-DAEMON-BITS-AMBIGUITY",
    "titleB": "SEED (inactive, RCA-first \u2014 do NOT close on agreement): nothing on a node surfaces WHICH BITS ARE SERVING, and the same ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 31,
    "idA": "REQ-ENSURE-DAEMON-STOP-INHIBIT",
    "titleA": "An operator stop outranks every implicit daemon ensure. (ADR-0047 decision 2, AMENDING REQ-DAEMON-3's anchor; hertz v0.3",
    "idB": "REQ-HAZARD-DROP-FILE-SINGLE-WRITER",
    "titleB": "Drop files are daemon-owned single-writer (6.4)",
    "docA": "\u2026with one exception, because you are allowed to mean it: **`spt daemon stop` sticks.** Auto-start is",
    "docB": "N/A"
  },
  {
    "pair": 32,
    "idA": "REQ-HAZARD-REDISPATCH-STALL",
    "titleA": "REDISPATCH-STALL W1 (KNOWN-HAZARDS 7.43, hertz v0.34 field RCA 2026-07-16 \u2014 recurrent 20-30s PTY/RC freezes, 17-62s DISP",
    "idB": "REQ-LIVE-AGENT-NO-INJECT-DELIVERY",
    "titleB": "F-033 RE-SCOPED (doyle re-ruling 2026-07-10 after the #82 gate falsified the original premise \u2014 the hosting-mode class s",
    "docA": "7.43 One wedged stream subscriber must NEVER stall stream serving \u2014 replay halts at the first failed",
    "docB": "N/A"
  },
  {
    "pair": 33,
    "idA": "REQ-DOCS-1",
    "titleA": "Dual-audience docs (human + AI dev-agent), markdown once / two depths",
    "idB": "REQ-HAZARD-DEFERRED-DRAIN",
    "titleB": "Deferred spool rows excluded from the event-stream drain (1.4)",
    "docA": "the dual-audience contract surfaced to the second audience: agent exports, .md negotiation, schema, ",
    "docB": "N/A"
  },
  {
    "pair": 34,
    "idA": "REQ-DOCS-5",
    "titleA": "Anti-drift: rustdoc/schema/exports/CLI-help generated + CI-checked",
    "idB": "REQ-XTASK-SPT-BIN-TARGET-DIR",
    "titleB": "#13 (F026 micro, tooling): xtask `spt_bin()` (crates/xtask/src/main.rs) BUILDS `spt` via cargo (which honors CARGO_TARGE",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 35,
    "idA": "REQ-HAZARD-DEFERRED-SURVIVE-DRAIN",
    "titleA": "Deferred rows survive poll drain (4.4)",
    "idB": "REQ-HEAVY-UNIT-CLASSIFICATION",
    "titleB": "A unit test that stands up a REAL broker inside a lib/bin `#[cfg(test)]` block must sit in the `heavy-broker-pty` nextes",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 36,
    "idA": "REQ-CONN-POISON-ATTRIBUTION",
    "titleA": "MSG-IDENTITY W6 / F-039 legs b-d (doyle W6 LOCK 2026-07-10, minted per amendment 3): every broker-conn lifecycle record ",
    "idB": "REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT",
    "titleB": "An spt-hosted endpoint driven by a REMOTE controller whose remote is gone but whose broker connection stays OPEN (a wedg",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 37,
    "idA": "REQ-DAEMON-5",
    "titleA": "Pump liveness: the peer pump writes a last-tick heartbeat consumed by daemon status / subnet status (decision 23 render ",
    "idB": "REQ-WHOAMI-1",
    "titleB": "The `endpoint list` SELF pin carries the Self endpoint's authored `endpoint description` (info::read_info(...).resources",
    "docA": "N/A",
    "docB": "whoami** (alias for endpoint list): `spt whoami` is a thin **alias for `spt endpoint list`** \u2014 it pr"
  },
  {
    "pair": 38,
    "idA": "REQ-DAEMON-BITS-AMBIGUITY",
    "titleA": "SEED (inactive, RCA-first \u2014 do NOT close on agreement): nothing on a node surfaces WHICH BITS ARE SERVING, and the same ",
    "idB": "REQ-PID-ROLE-EVIDENCE",
    "titleB": "THE RECORDED PID MUST CARRY WHAT IT MEANS. `info.pid` has two incompatible meanings decided by write path, and every rea",
    "docA": "N/A",
    "docB": "`info.json` \u2014 what the recorded `pid` MEANS (`pid_role`)"
  },
  {
    "pair": 39,
    "idA": "REQ-ENDPOINT-AUTOSTART",
    "titleA": "MSG-IDENTITY W5 / F-038 (flynn operator-directed ask 2026-07-10, SPT-CORE-NEEDS #7 + deployah field-confirm same day: mo",
    "idB": "REQ-HAZARD-DAEMON-HOSTED-LIVENESS",
    "titleB": "Daemon-hosted perches (Psyche, spt-hosted Self) derive liveness from the daemon endpoint table + info.json status, never",
    "docA": "Infrastructure endpoints (a gateway the phone treats as always-there) should not need hands-on bring",
    "docB": "N/A"
  },
  {
    "pair": 40,
    "idA": "REQ-ENDPOINT-CYCLE-HONEST",
    "titleA": "REGISTRY-LIFECYCLE W3 (ADR-0041 decision 6, operator deployah stop/run wedge): cycle verbs share ONE liveness authority ",
    "idB": "REQ-WAKE-RESUME-LEG",
    "titleB": "A-2 (REMOTE-TRUTH triage \u00a7A-2 + ADR-0033): the daemon reconcile gains a WAKE-RESUME LEG \u2014 an endpoint whose rest INTENT ",
    "docA": "1. **Online is earned, not declared.** A creator may stamp `status=online` only from actual persiste",
    "docB": "N/A"
  },
  {
    "pair": 41,
    "idA": "REQ-ENDPOINT-LIST-RENDER-POLISH",
    "titleA": "A6 (F028, operator, 4 asks): `spt endpoint list` render polish. (a) the 'Shared subnets' line is NOT dim \u2014 LIGHT_GRAY = ",
    "idB": "REQ-SOFT-END-PRESERVES-LIVE-LISTENER",
    "titleB": "F-2 (REMOTE-TRUTH triage \u00a7F-2, field-repro'd hall-bf 2026-07-04): a /clear must not sever a SURVIVING poll listener's re",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 42,
    "idA": "REQ-ENDPOINT-MESSAGE-ONLY-DISPLAY",
    "titleA": "An online agent-family endpoint with NO session surface reads as message-reachable, not as a harness-hosted live agent a",
    "idB": "REQ-RESIDENT-SERVICE",
    "titleB": "ResidentService substrate (ADR-0049, design ratified 2026-07-26): a daemon-supervised binary an adapter declares via a `",
    "docA": "N/A",
    "docB": "`command`** \u2014 an **opaque** command string (program token plus args), like every other command seam."
  },
  {
    "pair": 43,
    "idA": "REQ-ENDPOINT-STOP-OFFLINE",
    "titleA": "H3: `spt endpoint stop <id>` marks the endpoint OFFLINE (alive=false), not merely de-readied. cmd_stop (cli.rs:2994-3010",
    "idB": "REQ-PRESENCE-CONTROL-REAP-ON-EXIT",
    "titleB": "B3 (F028, hall-b diagnosis + deferred #11 seed; BROADENED perri F-b CONFIRMED): dead-pid ONLINE decay window + sticky CO",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 44,
    "idA": "REQ-EP-4",
    "titleA": "PresenceChannel broker endpoint (seam day-one)",
    "idB": "REQ-PID-ROLE-EVIDENCE",
    "titleB": "THE RECORDED PID MUST CARRY WHAT IT MEANS. `info.pid` has two incompatible meanings decided by write path, and every rea",
    "docA": "N/A",
    "docB": "`info.json` \u2014 what the recorded `pid` MEANS (`pid_role`)"
  },
  {
    "pair": 45,
    "idA": "REQ-HAZARD-ATTACH-WEDGE",
    "titleA": "A legitimately dead PTY child (real crash/kill) + an undrained operator pump must NOT wedge the broker for all other cli",
    "idB": "REQ-PSYCHE-LEGACY-RESIDENT-SWEEP",
    "titleB": "W5 (F030; doyle+perri 2026-07-04): a dirty daemon upgrade from <=v0.24.0 strands a RESIDENT psyche wrapper the OLD daemo",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 46,
    "idA": "REQ-HAZARD-BOUNDARY-READY-STRAND",
    "titleA": "C-2 (F029, SEAM-2 pinned \u2014 B6's SECOND HALF, the live-wake blocker; perri wakep9 vs wakep4 gate-state dump + doyle code ",
    "idB": "REQ-SHELL-2",
    "titleB": "Shell sleep/wake: link-break always closes the binary (pre-close instruction + termination timeout), ephemeral teardown ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 47,
    "idA": "REQ-HAZARD-CORRUPT-PERCH-COHERENCE",
    "titleA": "Corrupt (present-but-unparseable) info.json is NOT absent: liveness/status readers agree a destroyed record is neither a",
    "idB": "REQ-WAKE-RESUME-LEG",
    "titleB": "A-2 (REMOTE-TRUTH triage \u00a7A-2 + ADR-0033): the daemon reconcile gains a WAKE-RESUME LEG \u2014 an endpoint whose rest INTENT ",
    "docA": "5.14 Corrupt info.json read as ABSENT \u2192 fail-open readers gossip a wiped perch ONLINE `[REQ-HAZARD-C",
    "docB": "N/A"
  },
  {
    "pair": 48,
    "idA": "REQ-HAZARD-DRIVEN-BY-SELFHEAL",
    "titleA": "An spt-hosted endpoint's ONLINE+CONTROLLED state (`driven_by`) must CLEAR even when the detach IPC is lost \u2014 do NOT rely",
    "idB": "REQ-PICKER-3",
    "titleB": "A self-owned subnet row reconciles its status to the LIVE roster: a Subnet-category row whose endpoint_id overlaps a loc",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 49,
    "idA": "REQ-HAZARD-HOSTED-LIVENESS-RECONCILE",
    "titleA": "B2 KEYSTONE: a daemon-hosted (spt-hosted) endpoint's info.json status is RECONCILED to real liveness, not left latched o",
    "idB": "REQ-UPDATE-PROMOTE-DRAINED",
    "titleB": "W3 (LIFECYCLE-TRUTH, mechanic-d MOVED FROM W2 per doyle gate verdict @e5ae7a9 \u2014 binding): the update-apply brain-generat",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 50,
    "idA": "REQ-HAZARD-SHELL-STALE-ONLINE",
    "titleA": "A shell instance's ONLINE-ness is DERIVED (recorded status AND its recorded `shell.pid` not provably dead), never the re",
    "idB": "REQ-SELF-DETECT-PARENT-PID",
    "titleB": "E-1 (REMOTE-TRUTH triage \u00a7E-1 #7): self-detect leg (c) \u2014 the pid-ancestry fallback \u2014 ALSO candidates on `rec.parent_pid`",
    "docA": "| # | Invariant | spt-core surface | |---|---|---| | 1.1 | Grace wait precedes INIT_SIGNOFF | daemon",
    "docB": "N/A"
  },
  {
    "pair": 51,
    "idA": "REQ-INST-4",
    "titleA": "active to dormant/suspended fires a transition echo commune",
    "idB": "REQ-SELF-DETECT-PARENT-PID",
    "titleB": "E-1 (REMOTE-TRUTH triage \u00a7E-1 #7): self-detect leg (c) \u2014 the pid-ancestry fallback \u2014 ALSO candidates on `rec.parent_pid`",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 52,
    "idA": "REQ-LISTEN-PRESERVES-HOSTING-TOPOLOGY",
    "titleA": "`api listen` must not ASSERT hosting topology it does not know. (hertz v0.39.0 field RCA 2026-07-21, doyle re-grounded a",
    "idB": "REQ-UPDATE-PROMOTE-DRAINED",
    "titleB": "W3 (LIFECYCLE-TRUTH, mechanic-d MOVED FROM W2 per doyle gate verdict @e5ae7a9 \u2014 binding): the update-apply brain-generat",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 53,
    "idA": "REQ-PICKER-CONTROL-LINE-STATUS-GATE",
    "titleA": "A2 (F028, operator #2): the picker confirm-panel 'controlled locally' line renders for OFFLINE endpoints. view.rs:425-43",
    "idB": "REQ-SUBNET-COUNT-ROUTABLE",
    "titleB": "Bug #2: a remote node endpoint count drifts (0/2, 1/3) because node_status_rows (cli.rs:5314) increments the per-node to",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 54,
    "idA": "REQ-PSYCHE-LEGACY-RESIDENT-SWEEP",
    "titleA": "W5 (F030; doyle+perri 2026-07-04): a dirty daemon upgrade from <=v0.24.0 strands a RESIDENT psyche wrapper the OLD daemo",
    "idB": "REQ-RELAY-DEATH-CONVERGENCE",
    "titleB": "A dead harness relay MUST converge the endpoint's projection \u2014 an endpoint whose relay process is provably gone cannot k",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 55,
    "idA": "REQ-RUN-PICKER",
    "titleA": "Interactive `spt endpoint run` picker (ratatui TUI): bare `spt endpoint run` (no --adapter/--id) enters an in-process pi",
    "idB": "REQ-WHOAMI-1",
    "titleB": "The `endpoint list` SELF pin carries the Self endpoint's authored `endpoint description` (info::read_info(...).resources",
    "docA": "spt-hosted bringup picker (`spt endpoint run`)** (M12-W2): The user-facing bringup flow for spt-host",
    "docB": "whoami** (alias for endpoint list): `spt whoami` is a thin **alias for `spt endpoint list`** \u2014 it pr"
  },
  {
    "pair": 56,
    "idA": "REQ-API-2",
    "titleA": "The api subcommand surface (bind/listen/poll/state/worker/boundary/...)",
    "idB": "REQ-ER-RESERVED-ENDPOINT",
    "titleB": "A node has exactly ONE engine-room endpoint, and 'exactly one' is STRUCTURAL rather than policed: the engine room lives ",
    "docA": "N/A",
    "docB": "A locked-down **agent endpoint** (harness-adapter-backed, spt-hosted, has a mind \u2014 it can be briefed"
  },
  {
    "pair": 57,
    "idA": "REQ-ER-RESERVED-ENDPOINT",
    "titleA": "A node has exactly ONE engine-room endpoint, and 'exactly one' is STRUCTURAL rather than policed: the engine room lives ",
    "idB": "REQ-SELF-ID-TRUST-INJECTED-ENV",
    "titleB": "DEFERRED to a followup vX.X.n sprint (post-LIFECYCLE-TRUTH, operator-ruled 2026-07-07): self-identity resolution must tr",
    "docA": "A locked-down **agent endpoint** (harness-adapter-backed, spt-hosted, has a mind \u2014 it can be briefed",
    "docB": "N/A"
  },
  {
    "pair": 58,
    "idA": "REQ-SEAM-POSTSPAWN",
    "titleA": "post-spawn / api bind seam with boot nonce",
    "idB": "REQ-SPAWN-COLLISION-GUARD-LIVE-DUP",
    "titleB": "W4 (LIFECYCLE-TRUTH): single-flight wake per endpoint \u2014 the WAKE/RESUME respawn seam must not launch twice for one wake.",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 59,
    "idA": "REQ-ENDPOINT-STOP-RESOLVES",
    "titleA": "`spt endpoint stop <id>` REFUSES an id that nothing on the node knows, instead of stamping success on a no-op \u2014 an uncon",
    "idB": "REQ-HAZARD-SOFT-CLEANUP",
    "titleB": "Soft-cleanup preserves state, removes only the ready marker (6.2)",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 60,
    "idA": "REQ-HAZARD-SEEDMAP-CONNECT-UNBOUNDED",
    "titleA": "SEED (doyle-filed, 2026-07-05, from the REQ-HAZARD-DAEMON-STOP-BARRIER B2 fix): the PRODUCTION seedmap connect callers (",
    "idB": "REQ-SCREENGRID-WIDTH",
    "titleB": "TEARDOWN-AUTHORITY W3 (hertz field RCA 2026-07-19, doyle-confirmed at source): ScreenGrid models every character as ONE ",
    "docA": "N/A",
    "docB": "Server-side **screen grid** \u2014 the clean-room render model behind the clean repaint on attach (field "
  },
  {
    "pair": 61,
    "idA": "REQ-ACL-NODE-MODE-SET",
    "titleA": "The node's control-surface modes are settable through the engine room and nowhere else (ADR-0052 decisions 1 and 3, CONT",
    "idB": "REQ-ER-RULESET-TABLE",
    "titleB": "The engine room presents access rulesets as TABLES (ADR-0052 decision 3). The rendering is a requirement rather than a n",
    "docA": "A locked-down **agent endpoint** (harness-adapter-backed, spt-hosted, has a mind \u2014 it can be briefed",
    "docB": "Refuses all inbound except replies to its own outbound (knocks and knock-codes ARE accepted); online"
  },
  {
    "pair": 62,
    "idA": "REQ-ER-INBOUND-LOCK",
    "titleA": "The engine room refuses ALL inbound except replies to its own outbound, with a dormant knock exemption landed in the sam",
    "idB": "REQ-ER-RESERVED-ENDPOINT",
    "titleB": "A node has exactly ONE engine-room endpoint, and 'exactly one' is STRUCTURAL rather than policed: the engine room lives ",
    "docA": "Refuses all inbound except replies to its own outbound (knocks and knock-codes ARE accepted); online",
    "docB": "A locked-down **agent endpoint** (harness-adapter-backed, spt-hosted, has a mind \u2014 it can be briefed"
  },
  {
    "pair": 63,
    "idA": "REQ-ACTIVITY-LIST-JSON",
    "titleA": "`spt endpoint list --json` carries a per-endpoint `activity` (busy|idle) key, for consumers surveying the idle/busy stat",
    "idB": "REQ-IDLE-PARKED-DELIVERY",
    "titleB": "W5 (LIFECYCLE-TRUTH): a message QUEUED to an ALREADY-idle spt-hosted endpoint is delivered without an operator poke. ROO",
    "docA": "| Command | Top-level shape | |---|---| | `endpoint list` | `{ self, subnets[], local[] }` \u2014 `self`:",
    "docB": "N/A"
  },
  {
    "pair": 64,
    "idA": "REQ-ADAPTER-ADD-SURFACE-ERRORS",
    "titleA": "Bug #1: adapter add runs the install-as-first-update via conduct (cli.rs:6963) which on a non-zero exit prints only the ",
    "idB": "REQ-HAZARD-DEFERRED-MANIFEST",
    "titleB": "A pointer-mode (delegated / GhReleaseManaged) adapter whose binary/manifest is not yet extracted is reported with a CLEA",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 65,
    "idA": "REQ-ADAPTER-GH-TRANSPORT",
    "titleA": "The `gh_release` avenue (and `spt adapter add --release`) gain a fetch `transport`: `https` (current reqwest direct, pub",
    "idB": "REQ-API-4",
    "titleB": "api resolves the adapter manifest (+ profile + install dir) from `--adapter name:profile` via the registry when `--manif",
    "docA": "adapter packaging & live update** (v0.13.2; ADR-0024, ADR-0025): A `.spt` may be **multi-platform**:",
    "docB": "Manifest resolution from `--adapter` (since v0.8.0).** `spt api <cmd> --adapter <name[:profile]>` re"
  },
  {
    "pair": 66,
    "idA": "REQ-ADAPTER-MULTIPLATFORM-SPT",
    "titleA": "A `.spt` adapter archive may pack multiple platforms in one signed asset: shared `manifest.toml` + `strings/` at the roo",
    "idB": "REQ-UPDATE-FETCH-CURRENT-UX",
    "titleB": "`spt update fetch` reports an already-staged / already-applied latest as an ACTIONABLE human outcome (exit 0), not a Deb",
    "docA": "Multi-platform adapter `.spt` packaging",
    "docB": "N/A"
  },
  {
    "pair": 67,
    "idA": "REQ-ADAPTER-UPDATE-MESSAGE",
    "titleA": "An adapter manifest may declare `[update].message` \u2014 a plain (multi-line) human notice surfaced to stdout, markdown-rend",
    "idB": "REQ-RUN-SHORTCUT",
    "titleB": "`<basename>-<id>` launcher shortcut generation (picker `s` keybind, M12-W2-T2.4): from any pre-start options set the pic",
    "docA": "adapter packaging & live update** (v0.13.2; ADR-0024, ADR-0025): A `.spt` may be **multi-platform**:",
    "docB": "`spt-<id>` shortcut** (picker `s` keybind, M12-W2): From any pre-start options set, `s` writes (or u"
  },
  {
    "pair": 68,
    "idA": "REQ-CI-POSTJOB-DAEMON-REAP",
    "titleA": "A CI job REAPS ITS OWN test-spawned daemons at battery end, in-job, and logs a process census at job start AND job end s",
    "idB": "REQ-UPD-6",
    "titleB": "Platform-targeted update sets and debug rollout: signed multi-platform update metadata, recipient platform selection, ch",
    "docA": "N/A",
    "docB": "Build plan \u2014 `xtask debug-converge` (deferred follow-up) / Debug rollout runbook"
  },
  {
    "pair": 69,
    "idA": "REQ-DAEMON-SERVICE-INSTALL",
    "titleA": "F-038 RIDER (flynn nice-to-have, QUEUED not activated): a documented OS-service registration recipe or `spt daemon insta",
    "idB": "REQ-EP-9",
    "titleB": "`#` always-on address sigil: a reserved LEADING sigil marking an AlwaysOnEndpoint, extending the REQ-INST-10 grammar to ",
    "docA": "N/A",
    "docB": "Status: accepted (2026-06-21)"
  },
  {
    "pair": 70,
    "idA": "REQ-HAZARD-DEFERRED-MANIFEST",
    "titleA": "A pointer-mode (delegated / GhReleaseManaged) adapter whose binary/manifest is not yet extracted is reported with a CLEA",
    "idB": "REQ-INST-2",
    "titleB": "Per-node files, synced Psyche mind",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 71,
    "idA": "REQ-HAZARD-WMI-DAEMON-WINDOW",
    "titleA": "`spt daemon start` launches the daemon with NO visible console window. REGRESSION (v0.12.1 L1.5): the WMI job-neutral la",
    "idB": "REQ-INSTALL-5",
    "titleB": "Non-interactive install path: the install path doubles as every adapter's pack-in on-demand install (no second mechanism",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 72,
    "idA": "REQ-INST-11",
    "titleA": "spt rename <id> rippled to all instances (collision-checked, 6.5-reconciled)",
    "idB": "REQ-INST-13",
    "titleB": "Subnet-exclusive sync + per-endpoint subnet-membership list",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 73,
    "idA": "REQ-INST-13",
    "titleA": "Subnet-exclusive sync + per-endpoint subnet-membership list",
    "idB": "REQ-RELEASE-MUSL-ARTIFACT",
    "titleB": "MUSL-TIER W3 (CI build + signed release + update-set publish + self-update E2E): release.yml gains a musl matrix entry (",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 74,
    "idA": "REQ-INST-2",
    "titleA": "Per-node files, synced Psyche mind",
    "idB": "REQ-PICKER-ADAPTER-DESCRIPTION",
    "titleB": "The Create-new adapter-CHOICE screen of `spt endpoint run`'s picker shows a right-hand Description panel (like the Pick-",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 75,
    "idA": "REQ-INST-6",
    "titleA": "Deferred messages not delivered to dormant/suspended instances",
    "idB": "REQ-INST-8",
    "titleB": "Remote-control mode distinct from local operation",
    "docA": "| Feature | Cut from | Why deferred | Trigger to revisit | |---|---|---|---| | Scrollback on-disk sp",
    "docB": "N/A"
  },
  {
    "pair": 76,
    "idA": "REQ-INST-9",
    "titleA": "Multi-subnet membership (same-user N subnets; cross-user seam)",
    "idB": "REQ-PLATFORM-REGISTRY",
    "titleB": "MUSL-TIER W1 (target-triple centralization, behaviour-NEUTRAL refactor): ONE authoritative platform registry from which ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 77,
    "idA": "REQ-INSTALL-12",
    "titleA": "Durable active-profile pointer for bind-time profile selection (ADR-0021): adapters/active-profiles.toml at the registry",
    "idB": "REQ-UPDATE-GH-TRANSPORT",
    "titleB": "THE-FORKENING W1 (ADR-0036, operator-ruled 2026-07-14): the release channel is PRIVATE (`BigscreenVR/spt-bs-releases`) a",
    "docA": "Bind-time adapter/profile resolution (ADR-0021).** Because the seed is adapter-agnostic, `listen`/`p",
    "docB": "release channel (private, gh-carried)** \u2014 the release channel is a **private** GitHub repo (`Bigscre"
  },
  {
    "pair": 78,
    "idA": "REQ-INSTALL-7",
    "titleA": "Windows inbound reachability: the elevated install leg registers the inbound-UDP firewall rule (New-NetFirewallRule); th",
    "idB": "REQ-MIGRATE-1",
    "titleB": "Auto-detect and migrate a legacy claude_skill_owl install",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 79,
    "idA": "REQ-RELEASE-MUSL-ARTIFACT",
    "titleA": "MUSL-TIER W3 (CI build + signed release + update-set publish + self-update E2E): release.yml gains a musl matrix entry (",
    "idB": "REQ-UPD-6",
    "titleB": "Platform-targeted update sets and debug rollout: signed multi-platform update metadata, recipient platform selection, ch",
    "docA": "N/A",
    "docB": "Build plan \u2014 `xtask debug-converge` (deferred follow-up) / Debug rollout runbook"
  },
  {
    "pair": 80,
    "idA": "REQ-BROKER-OUTPUT-BEFORE-EXIT",
    "titleA": "RC-RENDER-TRUTH W3 (ADR-0043 decision 1, hertz stale-glyphs RCA leg 1 P0): the PTY drain/output writer is the SOLE FIFO ",
    "idB": "REQ-MANIFEST-3",
    "titleB": "Adapter strings \u2014 [strings] KV tree, dot-path get-string resolving through the profile leaf-replace overlay, set-string ",
    "docA": "1. **One FIFO sequencer per attach sink.** The PTY drain/output writer is the sole sequencer for ter",
    "docB": "adapter strings** (ratified 2026-06-11, Gateway grill): A `[strings]` manifest section \u2014 an adapter-"
  },
  {
    "pair": 81,
    "idA": "REQ-HAZARD-DIRECT-WRITE-PRECEDENCE",
    "titleA": "Direct-write precedence marker (with node id) guards stale overwrite (6.5)",
    "idB": "REQ-PROJECT-INDEX-STORE",
    "titleB": "PROJECT-INDEX W1 (ADR-0037, RCA .claude/reports/2026-07-10-hertz-session/03): spt-store owns the VERSIONED materialized ",
    "docA": "N/A",
    "docB": "project index** \u2014 a node's endpoint\u2192project attribution is DERIVED state, held as a **persistent mat"
  },
  {
    "pair": 82,
    "idA": "REQ-HAZARD-SINGLE-PATH-SOURCE",
    "titleA": "Single path/registry source of truth; no layout ambiguity (6.1)",
    "idB": "REQ-MANIFEST-7",
    "titleB": "Adapter-declared shortcut basename (M12-W2 follow-on): an optional `[adapter] shortcut_basename` manifest field names th",
    "docA": "N/A",
    "docB": "`shortcut_basename` *(optional, default `spt`)* \u2014 the basename the `spt endpoint run` picker's `s` k"
  },
  {
    "pair": 83,
    "idA": "REQ-INSTALL-4",
    "titleA": "Adapter registration lifecycle: spt adapter add (--github, manifest-first, install-is-first-update) + soft-deregister re",
    "idB": "REQ-STORE-1",
    "titleB": "spt-store::BranchStore (git branch as versioned KV; commit=checkpoint/tip=resume, atomic multi-key, merge-native sync) i",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 84,
    "idA": "REQ-MANIFEST-6",
    "titleA": "Cross-adapter fallback target addressing (M12-W3-T3.2): a cross-adapter fallback target is addressed as `<adapter>:<prof",
    "idB": "REQ-WHOAMI-1",
    "titleB": "The `endpoint list` SELF pin carries the Self endpoint's authored `endpoint description` (info::read_info(...).resources",
    "docA": "Command templates are opaque.** spt-core never parses out a model/tool/flag \u2014 the adapter writes the",
    "docB": "whoami** (alias for endpoint list): `spt whoami` is a thin **alias for `spt endpoint list`** \u2014 it pr"
  },
  {
    "pair": 85,
    "idA": "REQ-CARRIER-CLAIM-EXCLUSIVE",
    "titleA": "MSG-IDENTITY W4 / F-033 + operator self-send probe 2026-07-09 (dup-delivery cluster, RCA-FIRST): a spooled message row i",
    "idB": "REQ-WAN-SPT-HOSTED-DELIVERY",
    "titleB": "A WAN-ARRIVED `spt send` is DELIVERED to an spt-hosted endpoint (broker holds its PTY, NO api-listen relay), not spooled",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 86,
    "idA": "REQ-HAZARD-INBOX-NO-DOUBLE",
    "titleA": "No double-delivery via legacy inbox (4.5)",
    "idB": "REQ-SPOOL-TAKE-AUDIT",
    "titleB": "W5 (LIFECYCLE-TRUTH, RCA cost: proving WHO took delivered=1 rows burned an hour): the spool records the taker per row \u2014 ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 87,
    "idA": "REQ-CONN-BLACKHOLE-LIFECYCLE-HARNESS",
    "titleA": "MSG-IDENTITY W6 / F-039 leg e (doyle W6 LOCK 2026-07-10, minted per amendment 3 \u2014 hertz's five invariants VERBATIM from ",
    "idB": "REQ-DAEMON-SERVICE-INSTALL",
    "titleB": "F-038 RIDER (flynn nice-to-have, QUEUED not activated): a documented OS-service registration recipe or `spt daemon insta",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 88,
    "idA": "REQ-HAZARD-ENVELOPE-CR-LINESAFE",
    "titleA": "Envelope CR-linesafety (4.1): the line-framed EVENT codec must neutralize raw carriage returns \u2014 `event_body_escape` fol",
    "idB": "REQ-HAZARD-ENVELOPE-DECODE-ORDER",
    "titleB": "Envelope decode order, ampersand decoded last (4.1)",
    "docA": "Carriage returns are unrepresentable.** The encoder normalizes `\\r\\n` and lone `\\r` to `\\n` *before*",
    "docB": "Decode order is binding.** Decode a *body* as: `<br>` \u2192 `\\n` **first**, then `&lt;`/`&gt;`/`&quot;`,"
  },
  {
    "pair": 89,
    "idA": "REQ-NOTIF-1",
    "titleA": "Notification primitive: per-subnet replicated spool, seen/dismissed, resurface-at-boundary, subsumes update+consent prom",
    "idB": "REQ-NOTIF-SEAM-DISMISS",
    "titleB": "Staleness is dismissed at the seam that knows, never evaluated at surface: a successful update apply dismisses spt-core:",
    "docA": "N/A",
    "docB": "3. Staleness is dismissed at the seam that knows, never evaluated at surface"
  },
  {
    "pair": 90,
    "idA": "REQ-ER-BRINGUP-TOTP-GATE",
    "titleA": "Bringing the engine room online \u2014 and attaching a controller to it \u2014 requires a same-node CLI call PLUS a member-or-admi",
    "idB": "REQ-PAIR-NTP-MULTIHOME",
    "titleB": "W1/D1 (JOIN-TRUTH): the ceremony NTP query reaches a server on EITHER IP family \u2014 `query_unix_secs` (ntp.rs) must iterat",
    "docA": "Bring-online + controller-attach requires a **same-node CLI call plus a member-or-admin TOTP** for t",
    "docB": "N/A"
  },
  {
    "pair": 91,
    "idA": "REQ-JOIN-DIAGNOSTICS",
    "titleA": "`spt subnet join` never fails SILENTLY (ADR-0030; the field incident showed no output at all). (a) LIVE progress during ",
    "idB": "REQ-PAIR-4",
    "titleB": "Subnet naming on first pairing",
    "docA": "Robust WAN subnet join: meet-before-code + per-family bind gate",
    "docB": "N/A"
  },
  {
    "pair": 92,
    "idA": "REQ-PAIR-2",
    "titleA": "Local trust store with TOFU + warn-on-change",
    "idB": "REQ-SUBNET-ADMIN-SEED-ROTATION",
    "titleB": "Evicting a node rotates BOTH subnet seeds, not just the member seed. ADR-0005 #10 made removal real revocation by rotati",
    "docA": "N/A",
    "docB": "2a. Surfaced only to a proven admin \u2014 at mint and at rotation (amended 2026-07-30, fast-follow grill"
  },
  {
    "pair": 93,
    "idA": "REQ-ENDPOINT-LIST-PALETTE",
    "titleA": "Bugs #11 + #15 (display): spt endpoint list renders status as plain text while the picker turns the same ResourceRow int",
    "idB": "REQ-WORKER-PICKER-EXCLUDED",
    "titleB": "V-2 (WORKER-TRUTH triage, operator rider): non-drivable endpoint classes never render as `spt endpoint run` picker rows ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 94,
    "idA": "REQ-PICKER-1",
    "titleA": "The picker renders a FOUR-state endpoint status (extending the W2 online/offline duality): the list-item square AND a co",
    "idB": "REQ-PICKER-ADAPTER-DESCRIPTION",
    "titleB": "The Create-new adapter-CHOICE screen of `spt endpoint run`'s picker shows a right-hand Description panel (like the Pick-",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 95,
    "idA": "REQ-PICKER-4",
    "titleA": "The picker's Subnet category renders the canonical node LABEL, not bare key-hex: a subnet row's node renders as 'LABEL (",
    "idB": "REQ-PICKER-UX-V013",
    "titleB": "`spt endpoint run` picker UX (v0.13.0 operator dogfooding): (1) SKIP the first screen \u2014 open directly on 'Pick existing'",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 96,
    "idA": "REQ-PICKER-CHOOSE-DEDUP-ALL",
    "titleA": "A4 (F028, operator #5): choose-project duplicate rows. model.rs:314-337 build_project_choices dedups the `Here: <run_cwd",
    "idB": "REQ-PICKER-FORK-LABEL-CWD",
    "titleB": "B-3 (F029, operator): the confirm-panel `Fork endpoint` option label is static and says nothing about WHERE the fork lan",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 97,
    "idA": "REQ-PICKER-NODE-GROUPING",
    "titleA": "Bug #13: the endpoint run Subnet tab shows a machine once PER shared subnet (subnet_rows data.rs:253 iterates per-subnet",
    "idB": "REQ-PICKER-RESUME-CONTEXT-PANEL",
    "titleB": "#6: the 'Resume from history' view keeps the endpoint's 'Confirm selection' top panel and swaps ONLY the bottom panel to",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 98,
    "idA": "REQ-PICKER-SHORTCUT-LABEL-FILENAME",
    "titleA": "B-4 (F029, operator): the confirm-panel shortcut option label is a static `New/Update spt-<id> shortcut (s)` placeholder",
    "idB": "REQ-WORKER-PICKER-EXCLUDED",
    "titleB": "V-2 (WORKER-TRUTH triage, operator rider): non-drivable endpoint classes never render as `spt endpoint run` picker rows ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 99,
    "idA": "REQ-HAZARD-DAEMON-IDENTITY-ENV-SANITIZE",
    "titleA": "MSG-IDENTITY W1 / F-036 leg a (perri field RCA 2026-07-09/10, psyche seat-theft \u2014 doyle ACCEPTED primary fix): the daemo",
    "idB": "REQ-HAZARD-PERCH-RECORD-POWER-LOSS",
    "titleB": "Authoritative/identity records fsync data before the rename (5.13): a hard reset must not resurrect a full-length NUL-fi",
    "docA": "7.39 Per-session identity env (`SPT_ENDPOINT_ID`/`OWL_SESSION_ID`/`SPT_AGENT_ID`) is NEVER inherited",
    "docB": "5.13 Atomic write leaves data un-synced before the rename \u2192 NUL zero-fill on power loss `[REQ-HAZARD"
  },
  {
    "pair": 100,
    "idA": "REQ-API-4",
    "titleA": "api resolves the adapter manifest (+ profile + install dir) from `--adapter name:profile` via the registry when `--manif",
    "idB": "REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE",
    "titleB": "B5: `spt daemon start` does NOT revive phantom Psyches for dead-but-online-latched perches. Today reconcile_once (liveho",
    "docA": "Manifest resolution from `--adapter` (since v0.8.0).** `spt api <cmd> --adapter <name[:profile]>` re",
    "docB": "N/A"
  },
  {
    "pair": 101,
    "idA": "REQ-BIND-PSYCHE-CUSTODY-SQUAT-GUARD",
    "titleA": "MSG-IDENTITY W1 / F-036 leg c (perri field RCA, doyle ACCEPTED defense-in-depth): a bind whose --set-session-id equals a",
    "idB": "REQ-HAZARD-DAEMON-IDENTITY-ENV-SANITIZE",
    "titleB": "MSG-IDENTITY W1 / F-036 leg a (perri field RCA 2026-07-09/10, psyche seat-theft \u2014 doyle ACCEPTED primary fix): the daemo",
    "docA": "N/A",
    "docB": "7.39 Per-session identity env (`SPT_ENDPOINT_ID`/`OWL_SESSION_ID`/`SPT_AGENT_ID`) is NEVER inherited"
  },
  {
    "pair": 102,
    "idA": "REQ-DAEMON-9",
    "titleA": "Net-bind boot-race resilience: a daemon that comes up net-less (NetHost::start failed \u2014 e.g. the systemd unit autostarte",
    "idB": "REQ-HAZARD-BRAIN-RESTART-LIFECYCLE-REHYDRATE",
    "titleB": "B4 (deepest): a bare brain restart (broker survives) REHYDRATES the live-agent lifecycle so post-restart endpoints are h",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 103,
    "idA": "REQ-ECHO-DROP-DIR-RESOLVE",
    "titleA": "W1 (LIFECYCLE-TRUTH): fire_echo resolves the manifest commune_dir through the SAME resolver its siblings use before any ",
    "idB": "REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE",
    "titleB": "B5: `spt daemon start` does NOT revive phantom Psyches for dead-but-online-latched perches. Today reconcile_once (liveho",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 104,
    "idA": "REQ-HAZARD-DAEMON-IDENTITY-ENV-SANITIZE",
    "titleA": "MSG-IDENTITY W1 / F-036 leg a (perri field RCA 2026-07-09/10, psyche seat-theft \u2014 doyle ACCEPTED primary fix): the daemo",
    "idB": "REQ-HOST-RUN-1",
    "titleB": "spt-hosted harness bringup: `spt endpoint run` spawns an adapter's `[session.self]` command template into a broker-held ",
    "docA": "7.39 Per-session identity env (`SPT_ENDPOINT_ID`/`OWL_SESSION_ID`/`SPT_AGENT_ID`) is NEVER inherited",
    "docB": "N/A"
  },
  {
    "pair": 105,
    "idA": "REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT",
    "titleA": "A clean `spt rc` attach to a LIVE spt-hosted (`endpoint run`) harness must DELIVER the harness's PTY output. KEYSTONE \u2014 ",
    "idB": "REQ-PSYCHE-LEGACY-RESIDENT-SWEEP",
    "titleB": "W5 (F030; doyle+perri 2026-07-04): a dirty daemon upgrade from <=v0.24.0 strands a RESIDENT psyche wrapper the OLD daemo",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 106,
    "idA": "REQ-HAZARD-LIVEHOST-BOOT-RACE",
    "titleA": "The brain's daemon-hosted Psyche lifecycle surfaces a host-FAILURE on the live perch (harness-diagnosable) and runs net-",
    "idB": "REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL",
    "titleB": "W3 (LIFECYCLE-TRUTH): daemon restart no longer massacres hosted endpoints \u2014 daemon start RE-RUNS previously-online spt-h",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 107,
    "idA": "REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION",
    "titleA": "W3 (F030 hazard; paid-for: hall-bf churn ordinal 6491+ + adapter v0.13.2 bad-ship brick 2026-07-04): a psyche failure of",
    "idB": "REQ-PSYCHE-CONTEXT-FILE-INDIRECTION",
    "titleB": "W4 (F030; doyle Q2 ruling + perri file-always freeze, 2026-07-04): the composed psyche mind ({psyche_context}) rides the",
    "docA": "7.30 A Psyche failure of ANY shape must NEVER remove or alter the parent endpoint's ready/hosted sta",
    "docB": "Psyche-download \u2014 `{psyche_context_file}` (file-always, replaces `{psyche_context}`).** The composed"
  },
  {
    "pair": 108,
    "idA": "REQ-HAZARD-UNHOST-PSYCHE-REAP",
    "titleA": "On un-host, the detached `{id}-psyche` HARNESS PROCESS is reaped \u2014 not just its in-brain pulse-driver thread. Today stop",
    "idB": "REQ-HOSTING-AUTHORITY-CONTROLLABLE",
    "titleB": "RC-RENDER-TRUTH v0.38.1 fast-follow leg 3 (hertz todlando immortal-hybrid trace, doyle fork ruling 2026-07-18 = controll",
    "docA": "N/A",
    "docB": "Amendment (RC-RENDER-TRUTH v0.38.1 leg 3, doyle ruling 2026-07-19): one hosting authority \u2014 the onli"
  },
  {
    "pair": 109,
    "idA": "REQ-HOST-RUN-1",
    "titleA": "spt-hosted harness bringup: `spt endpoint run` spawns an adapter's `[session.self]` command template into a broker-held ",
    "idB": "REQ-LISTEN-SESSION-ID-FALLBACK",
    "titleB": "F-034 leg c (perri/hertz field finding 2026-07-09): a session that goes live LATE (hours after SessionStart, or after a ",
    "docA": "N/A",
    "docB": "Seed lifetime.** The seed lives **in the daemon's memory only** \u2014 no file \u2014 and survives until exact"
  },
  {
    "pair": 110,
    "idA": "REQ-INST-2",
    "titleA": "Per-node files, synced Psyche mind",
    "idB": "REQ-PSYCHE-EPHEMERAL-DRIVER",
    "titleB": "W1 (F030, design \u00a73): each psyche-relevant event runs exactly ONE bounded per-event turn through the existing driver sta",
    "docA": "N/A",
    "docB": "Psyche**: The Psyche companion's own perch, distinct from its paired LiveAgent's perch. First-class "
  },
  {
    "pair": 111,
    "idA": "REQ-NET-3",
    "titleA": "Cross-node Psyche sync over P2P replaces gh-repo-sync",
    "idB": "REQ-WORKER-SID-SYMMETRIC-AUTH",
    "titleB": "W-2 (WORKER-TRUTH triage, operator-ruled 2026-07-06): worker verbs go sid-symmetric with every sibling id-scoped verb \u2014 ",
    "docA": "N/A",
    "docB": "`api worker-stop <id> --session-id <sid>` \u00b7 `api worker-poll <id> --session-id <sid>`"
  },
  {
    "pair": 112,
    "idA": "REQ-PSYCHE-CONTEXT-FILE-INDIRECTION",
    "titleA": "W4 (F030; doyle Q2 ruling + perri file-always freeze, 2026-07-04): the composed psyche mind ({psyche_context}) rides the",
    "idB": "REQ-PSYCHE-TURN-STREAM-EVIDENCE",
    "titleB": "A failed psyche turn preserves BOTH captured streams as evidence: TurnError::Failed carries the child's stdout alongside",
    "docA": "Psyche-download \u2014 `{psyche_context_file}` (file-always, replaces `{psyche_context}`).** The composed",
    "docB": "N/A"
  },
  {
    "pair": 113,
    "idA": "REQ-PSYCHE-SID-CUSTODY",
    "titleA": "W2 (F030, design \u00a73): the psyche mints and keeps its OWN session id, stored in the nested {id}-psyche perch record \u2014 {se",
    "idB": "REQ-PSYCHE-SPAWN-ENV-PARITY",
    "titleB": "P-2 (WORKER-TRUTH triage addendum, perri-filed field finding 2026-07-06): the per-event psyche_resume spawn threads the ",
    "docA": "Custody sid \u2014 `{session_id}` is the Psyche's OWN id.** In a psyche role template `{session_id}` is t",
    "docB": "N/A"
  },
  {
    "pair": 114,
    "idA": "REQ-START-2",
    "titleA": "Harness-hosted startup: api seed then listen",
    "idB": "REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL",
    "titleB": "W3 (LIFECYCLE-TRUTH): daemon restart no longer massacres hosted endpoints \u2014 daemon start RE-RUNS previously-online spt-h",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 115,
    "idA": "REQ-HAZARD-GRACE-BEFORE-SIGNOFF",
    "titleA": "Grace-period wait completes before composing INIT_SIGNOFF (1.1)",
    "idB": "REQ-HAZARD-INSTANT-UNDERFLOW",
    "titleB": "Scheduling never subtracts a Duration from Instant::now() (underflow-panics on a host booted more recently than the offs",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 116,
    "idA": "REQ-ADAPTER-UPDATE-INPLACE",
    "titleA": "Bug #18: spt adapter update fails at re-register with os error 2 because it derives the install dir from the update repo",
    "idB": "REQ-HAZARD-UPDATE-ROLLBACK",
    "titleB": "Self-update rejects version rollback; metadata expiry + adapter content signing (codex #5)",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 117,
    "idA": "REQ-ADAPTER-UPDATE-POST",
    "titleA": "Composite adapter update \u2014 an avenue-agnostic `[update.post]` sub-table `{ command, self_verifies }` run AFTER the prima",
    "idB": "REQ-UPDATE-ONE-SHOT-FINISH",
    "titleB": "W3 (LIFECYCLE-TRUTH): update apply works daemonless and one command finishes the cycle. ROOT (operator wart): update fet",
    "docA": "`[update.post]` \u2014 the composite post-step (since v0.16.0) / Composite update \u2014 `[update.post]` (sinc",
    "docB": "N/A"
  },
  {
    "pair": 118,
    "idA": "REQ-BROKER-ATTACH-JOURNAL-RESILIENT",
    "titleA": "A poisoned EffectJournal mutex or a sick NetHost runtime must NOT permanently brick all future attaches. Bug #16 (URGENT",
    "idB": "REQ-SEAM-UPDATE",
    "titleB": "Adapter-update avenue (file-pull / delegated command)",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 119,
    "idA": "REQ-DOCS-RELEASE-ASSET",
    "titleA": "THE-FORKENING W2 (ADR-0036 \u00a74): every release ships a platform-independent docs bundle `spt-docs.tar.gz` (BUILT mdbook o",
    "idB": "REQ-HAZARD-ROLLBACK-STATE-COMPAT",
    "titleB": "A brain must not irreversibly migrate durable state before update ready-promotion: the readiness-gated auto-rollback (AD",
    "docA": "docs bundle** \u2014 every release ships a platform-independent archive of the **built docs** (HTML + `ll",
    "docB": "6.8 No irreversible durable-state migration before update ready-promotion `[REQ-HAZARD-ROLLBACK-STAT"
  },
  {
    "pair": 120,
    "idA": "REQ-HAZARD-BROKER-SEED-WIRE-SKEW",
    "titleA": "A daemon-state wire-format change (e.g. the v0.9.0 adapter-agnostic Seed) does NOT take effect until a DELIBERATE full b",
    "idB": "REQ-HAZARD-ROLLBACK-STATE-COMPAT",
    "titleB": "A brain must not irreversibly migrate durable state before update ready-promotion: the readiness-gated auto-rollback (AD",
    "docA": "7.9 A daemon-state wire change needs a deliberate BROKER restart (the broker is resident across a br",
    "docB": "6.8 No irreversible durable-state migration before update ready-promotion `[REQ-HAZARD-ROLLBACK-STAT"
  },
  {
    "pair": 121,
    "idA": "REQ-HAZARD-ROLLBACK-STATE-COMPAT",
    "titleA": "A brain must not irreversibly migrate durable state before update ready-promotion: the readiness-gated auto-rollback (AD",
    "idB": "REQ-UPD-3",
    "titleB": "No endpoint process terminates/suspends during self-update",
    "docA": "6.8 No irreversible durable-state migration before update ready-promotion `[REQ-HAZARD-ROLLBACK-STAT",
    "docB": "N/A"
  },
  {
    "pair": 122,
    "idA": "REQ-INSTALL-4",
    "titleA": "Adapter registration lifecycle: spt adapter add (--github, manifest-first, install-is-first-update) + soft-deregister re",
    "idB": "REQ-UPD-1",
    "titleB": "Peer-propagated update over P2P",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 123,
    "idA": "REQ-RELEASE-MUSL-ARTIFACT",
    "titleA": "MUSL-TIER W3 (CI build + signed release + update-set publish + self-update E2E): release.yml gains a musl matrix entry (",
    "idB": "REQ-UPDATE-APPLY-RESTART-NOTICE",
    "titleB": "`spt update apply` prints a LOUD restart-required notice whenever the surviving broker will keep running the pre-apply i",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 124,
    "idA": "REQ-UPD-4",
    "titleA": "Update gated on user confirmation by default; opt-in full-auto",
    "idB": "REQ-UPDATE-DEFAULT-COMPOSITE",
    "titleB": "THE-FORKENING W4 (operator-grilled 2026-07-14): plain `spt update` = `update fetch --apply` THEN `update adapters` (core",
    "docA": "N/A",
    "docB": "update composite (`spt update`)** \u2014 the plain verb is the primary form: `update fetch --apply` then "
  },
  {
    "pair": 125,
    "idA": "REQ-GOSSIP-CONTROLLED-ANY",
    "titleA": "Bug #3: a locally-controlled endpoint gossips controller_node = None so remote viewers show it free to control. Root: dr",
    "idB": "REQ-RCVIEW-1",
    "titleB": "Remote-attach controller/viewer model (CONTEXT.md:317): a session's broker OutputLog serves ONE interactive controller (",
    "docA": "N/A",
    "docB": "BUILT (M12 W2.5).** The controller/viewer model is implemented end-to-end. Attach intent is **three-"
  },
  {
    "pair": 126,
    "idA": "REQ-HOST-RUN-1",
    "titleA": "spt-hosted harness bringup: `spt endpoint run` spawns an adapter's `[session.self]` command template into a broker-held ",
    "idB": "REQ-RESUME-ADAPTER-FOLLOWS-SESSION",
    "titleB": "D-2 (REMOTE-TRUTH triage \u00a7D-2 + operator Q5 @c248afc): a resume-from-history restores the RECORDED session adapter (REQ-",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 127,
    "idA": "REQ-HOST-RUN-2",
    "titleA": "Project-scoped working directory for spt-hosted bringup: `spt endpoint run` lands the broker-spawned harness PTY in the ",
    "idB": "REQ-WORKER-MINTED-NAME",
    "titleB": "N-1 (WORKER-TRUTH triage, operator rider): worker perch identity is CORE-MINTED and parent-derived \u2014 `{parent}-w{N}` wit",
    "docA": "N/A",
    "docB": "`api worker-start <parent> [--agent-id <id>] [--agent-type <type>]`"
  },
  {
    "pair": 128,
    "idA": "REQ-HAZARD-BRAIN-RESTART-LIFECYCLE-REHYDRATE",
    "titleA": "B4 (deepest): a bare brain restart (broker survives) REHYDRATES the live-agent lifecycle so post-restart endpoints are h",
    "idB": "REQ-HAZARD-HANDOFF-ARGV-COMPAT",
    "titleB": "Broker/brain IPC + handoff argv version-tolerant (2.3)",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 129,
    "idA": "REQ-ENDPOINT-LIST-PROJECT-COL",
    "titleA": "#8: spt endpoint list gains a second column <project>/ (the endpoint's LATEST project) -> 4 columns total: id / <project",
    "idB": "REQ-ENDPOINT-LIST-RENDER-POLISH",
    "titleB": "A6 (F028, operator, 4 asks): `spt endpoint list` render polish. (a) the 'Shared subnets' line is NOT dim \u2014 LIGHT_GRAY = ",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 130,
    "idA": "REQ-HAZARD-CONTROL-STAMP-CONVERGENCE",
    "titleA": "Control/viewer stamps must CONVERGE to broker session-table truth for every session-backed endpoint, not merely edge-tri",
    "idB": "REQ-HAZARD-DAEMON-HOSTED-LIVENESS",
    "titleB": "Daemon-hosted perches (Psyche, spt-hosted Self) derive liveness from the daemon endpoint table + info.json status, never",
    "docA": "7.29 Control/viewer stamps CONVERGE to broker session-table truth, not merely edge-trigger `[REQ-HAZ",
    "docB": "N/A"
  },
  {
    "pair": 131,
    "idA": "REQ-HAZARD-INJECT-CONTROL-COEXIST",
    "titleA": "SPINE INVARIANT (v0.13.0 keystone): the broker must accept INJECTED keystrokes into an spt-hosted PTY (the v0.11.0 raw d",
    "idB": "REQ-SEND-WINDOW-DRAIN-HONOR",
    "titleB": "F-035 (field finding 2026-07-09): active_only = POLL-ONLY for a relay-bearing live agent -- it must NEVER be RELAY-deliv",
    "docA": "N/A",
    "docB": "F-035 RCA \u2014 report-before-fix. F-035 RCA \u2014 idle-edge parked-drain ignores the delivery-window tag"
  },
  {
    "pair": 132,
    "idA": "REQ-HAZARD-DAEMON-STOP-BARRIER",
    "titleA": "B3: `spt daemon stop` then an immediate `spt daemon start` does NOT race \u2014 stop fully completes before it returns. Today",
    "idB": "REQ-TRANSLATE-COMMIT-MISS-TOLERANCE",
    "titleB": "C-1 (F029, B6 ROOT \u2014 rescope of REQ-TRANSLATE-BINARY-LIVENESS-DECAY, now PINNED): at a checkpoint clear boundary the cle",
    "docA": "N/A",
    "docB": "Amendment (2026-07-03, F029 C-1) \u2014 a commit-miss is NOT a fault; real faults respawn"
  },
  {
    "pair": 133,
    "idA": "REQ-ACTIVITY-INFO-PULL",
    "titleA": "The endpoint's current activity state (busy|idle) is readable via `spt api endpoint-info` \u2014 a point-in-time read of the ",
    "idB": "REQ-RUN-PICKER",
    "titleB": "Interactive `spt endpoint run` picker (ratatui TUI): bare `spt endpoint run` (no --adapter/--id) enters an in-process pi",
    "docA": "1. Activity observation is a first-class surface with two avenues \u2014 and the digest is not one of the",
    "docB": "spt-hosted bringup picker (`spt endpoint run`)** (M12-W2): The user-facing bringup flow for spt-host"
  },
  {
    "pair": 134,
    "idA": "REQ-HAZARD-CORRUPT-PERCH-COHERENCE",
    "titleA": "Corrupt (present-but-unparseable) info.json is NOT absent: liveness/status readers agree a destroyed record is neither a",
    "idB": "REQ-LIVENESS-ORACLE-SOUND",
    "titleB": "TEARDOWN-AUTHORITY W2 (todlando W1 gate-round-0 finding, doyle-scoped from the LANDED W1 code 2026-07-19): 'does this pi",
    "docA": "5.14 Corrupt info.json read as ABSENT \u2192 fail-open readers gossip a wiped perch ONLINE `[REQ-HAZARD-C",
    "docB": "Failure (paid-for, found by todlando during TEARDOWN-AUTHORITY W1 gate round 0, 2026-07-19; latent i"
  },
  {
    "pair": 135,
    "idA": "REQ-ENDPOINT-ONLINE-TRUTH",
    "titleA": "REGISTRY-LIFECYCLE W2 (ADR-0041 decisions 1+2, emphasys C1 P0): ONLINE is earned, not declared \u2014 cmd_listen stamps statu",
    "idB": "REQ-ENDPOINT-UNBOUND-ATTACH",
    "titleB": "An spt-hosted endpoint is ATTACHABLE between spawn and bind: gate the attach on the broker SESSION being attachable (ses",
    "docA": "1. **Online is earned, not declared.** A creator may stamp `status=online` only from actual persiste",
    "docB": "Unbound endpoint**: The lifecycle point between *spawn* and *bind*: an spt-hosted endpoint whose bro"
  },
  {
    "pair": 136,
    "idA": "REQ-HAZARD-ELEVATED-DAEMON-SPAWN",
    "titleA": "The daemon always runs unelevated in the invoking user's universe, regardless of which command spawns it: an elevated sp",
    "idB": "REQ-HAZARD-SUDO-SECURE-PATH",
    "titleB": "Elevation guidance on Unix names the binary's ABSOLUTE path under sudo (a user-local install ~/.local/bin \u00b7 ~/.cargo/bin",
    "docA": "5.7 Elevated commands spawn the daemon with the wrong token `[REQ-HAZARD-ELEVATED-DAEMON-SPAWN]` Fai",
    "docB": "N/A"
  },
  {
    "pair": 137,
    "idA": "REQ-CI-POSTJOB-DAEMON-REAP",
    "titleA": "A CI job REAPS ITS OWN test-spawned daemons at battery end, in-job, and logs a process census at job start AND job end s",
    "idB": "REQ-HAZARD-DAEMON-STOP-REAP",
    "titleB": "Breap: `spt daemon stop` REAPS the spt-hosted children it spawned \u2014 no orphaned psyche/harness processes. Today a stop l",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 138,
    "idA": "REQ-SEND-STAMP-AGENT-ID",
    "titleA": "MSG-IDENTITY W4 / endpoint-identity (operator-flagged 2026-07-09 + live-confirmed on flynn's F-038 ask arriving 'cli@HFE",
    "idB": "REQ-SESSIONS-LOG-ENDPOINT-ATTRIBUTION",
    "titleB": "C2 (F028, infra; ROOT-CAUSED + severity-upgraded doyle RCA 2026-07-03): cross-endpoint perch contamination \u2014 a foreign p",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 139,
    "idA": "REQ-BROKER-ATTACH-JOURNAL-RESILIENT",
    "titleA": "A poisoned EffectJournal mutex or a sick NetHost runtime must NOT permanently brick all future attaches. Bug #16 (URGENT",
    "idB": "REQ-PEER-PUMP-CHURN-STALL",
    "titleB": "B5 (F028, perri F-a; DEFECT daemon, OBSERVED-ONCE, HIGH): the peer pump STALLS under rapid rc attach/EOF-detach/--take c",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 140,
    "idA": "REQ-HAZARD-BROKER-QUIC-DEADLINE",
    "titleA": "The broker bounds every brain-waiting QUIC op (dial / open_stream / send_stream) so a black-holed or dead peer fails PRO",
    "idB": "REQ-HAZARD-PUMP-IPC-DEADLINE",
    "titleB": "The single-threaded peer pump's brain-IPC reads are deadline-bounded (PUMP_PEER_IO_TIMEOUT, total-wait per call); a Time",
    "docA": "7.8 The broker must never make a brain wait UNBOUNDED on a QUIC op (the pump-IPC-deadline B-half) `[",
    "docB": "7.6 Pump brain-IPC reads must be deadline-bounded (a blocked read wedges the whole pump) `[REQ-HAZAR"
  },
  {
    "pair": 141,
    "idA": "REQ-PICKER-1",
    "titleA": "The picker renders a FOUR-state endpoint status (extending the W2 online/offline duality): the list-item square AND a co",
    "idB": "REQ-TERM-4",
    "titleB": "Live activity buffer (session digest): projection of normalized session logs, snapshot-pull (spt endpoint digest) + stru",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 142,
    "idA": "REQ-BRAIN-HASH-ONCE",
    "titleA": "REGISTRY-LIFECYCLE W1 (ADR-0040 rider; dropped THE-FORKENING W4 rider escalated \u2014 hertz re-measured live 2026-07-17: 61.",
    "idB": "REQ-SUBNET-DUAL-SEED-MINT",
    "titleB": "`subnet create` mints TWO TOTP seeds in one ceremony \u2014 the member key (today's subnet seed, unchanged) and a second admi",
    "docA": "N/A",
    "docB": "member key / admin key (two-key subnet)** (ratified 2026-07-28, access-control grill): Subnet creati"
  },
  {
    "pair": 143,
    "idA": "REQ-REL-3",
    "titleA": "Two-key release-signing trust anchor: primary + offline never-used recovery, both pubkeys embedded in the binary's trust",
    "idB": "REQ-SUBNET-STATUS-MODES",
    "titleB": "`spt subnet status <name>` states the subnet's three mode facts (surface ruled 2026-07-30 \u2014 the per-subnet view is `subn",
    "docA": "N/A",
    "docB": "access entity** (ratified 2026-07-30, fast-follow grill): Anything that can be granted (or denied) c"
  },
  {
    "pair": 144,
    "idA": "REQ-BROKER-SCREEN-GRID",
    "titleA": "Bugs #6 + #12 + #7/#8-artifacts: the broker is a raw-byte pump with no screen model \u2014 OutputLog replays the raw ring fro",
    "idB": "REQ-PICKER-PURGE-STRUCTURED",
    "titleB": "RC-RENDER-TRUTH W3 (ADR-0043 decision 3, hertz stale-glyphs RCA leg 3 P0): core verbs invoked from inside an active TUI ",
    "docA": "the server-side render grid + clean repaint on attach: a clean-room `ScreenGrid` (vte::Perform) inte",
    "docB": "1. **One FIFO sequencer per attach sink.** The PTY drain/output writer is the sole sequencer for ter"
  },
  {
    "pair": 145,
    "idA": "REQ-RC-DISPLAY-SOLE-WRITER",
    "titleA": "TEARDOWN-AUTHORITY W5 (hertz RCA 3 bug 1, 2026-07-19 \u2014 REPRODUCED on 0.38.1 CLI + 0.38.1 broker; doyle ruled, and it COR",
    "idB": "REQ-RC-IDMARKER-DISABLE",
    "titleB": "Bugs #14 + #7/#8 (marker half): feature-flag the top-right StatusRow endpoint-id marker OFF (rc.rs:198-307). It is a one",
    "docA": "N/A",
    "docB": "N/A"
  },
  {
    "pair": 146,
    "idA": "REQ-RC-SINGLE-PUMP-BRAIN",
    "titleA": "RC-RENDER-TRUTH v0.38.1 fast-follow leg 2 (hertz v0.38.0 field repro 2, hertz RCA confirmed + doyle-accepted): plain `sp",
    "idB": "REQ-RC-VT-TEARDOWN",
    "titleB": "RC-RENDER-TRUTH W3 (ADR-0043 decision 2, hertz stale-glyphs RCA leg 2 P0): rc display teardown is a display RAII guard S",
    "docA": "N/A",
    "docB": "1. **One FIFO sequencer per attach sink.** The PTY drain/output writer is the sole sequencer for ter"
  },
  {
    "pair": 147,
    "idA": "REQ-ACL-MODE-ADVISORY-GOSSIP",
    "titleA": "A subnet-mode change gossips ADVISORILY \u2014 it produces a notification and nothing else. An existing member's EFFECTIVE po",
    "idB": "REQ-HAZARD-MESH-BOOTSTRAP-TRAP",
    "titleB": "MESH-RECOVERY W1 (KNOWN-HAZARDS 7.42, hertz field RCA 2026-07-10 \u2014 HFENDULEAM+ENLYZEAM symmetric green-status sequester)",
    "docA": "control-surface modes (`open` / `closed`)** (ratified 2026-07-29, access-control grill): Per-surface",
    "docB": "7.42 A node holding a valid roster address for a peer is NEVER route-less \u2014 a failed dial must not d"
  },
  {
    "pair": 148,
    "idA": "REQ-ER-NOT-ADVERTISED",
    "titleA": "The engine room is NOT registry-advertised by default, and is advertised only to endpoints it has whitelisted (ADR-0052 ",
    "idB": "REQ-PICKER-CONTROLLED-LOCAL",
    "titleB": "#3 local half: a LOCALLY-controlled endpoint renders CONTROLLED in its own node's picker. display_status() (crates/spt/s",
    "docA": "Refuses all inbound except replies to its own outbound (knocks and knock-codes ARE accepted); online",
    "docB": "N/A"
  },
  {
    "pair": 149,
    "idA": "REQ-MESH-1",
    "titleA": "Membership proof (seed-proof): symmetric current-epoch seed-knowledge replaces is_trusted at EVERY inbound gate (registr",
    "idB": "REQ-PUMP-STAGE-TRUTH",
    "titleB": "MESH-RECOVERY W1 (ADR-0039, RCA wave 3 \u2014 the acceptance surface, same contract): peer-failure telemetry is STAGE-SPLIT a",
    "docA": "N/A",
    "docB": "Decision"
  },
  {
    "pair": 150,
    "idA": "REQ-PEERADDR-INVARIANT",
    "titleA": "MESH-RECOVERY W1 (ADR-0039, RCA wave 2): the peer-addrs cache INVARIANT \u2014 outer peer key == address.id \u2014 is ENFORCED on ",
    "idB": "REQ-PUMP-STAGE-TRUTH",
    "titleB": "MESH-RECOVERY W1 (ADR-0039, RCA wave 3 \u2014 the acceptance surface, same contract): peer-failure telemetry is STAGE-SPLIT a",
    "docA": "Decision",
    "docB": "Decision"
  }
]