# Memory index — spt-claude-code

> THIS root (`.claude-spt\accounts\alt\projects\…`) is the live memory for `claude-spt:alt` sessions, migrated 2026-08-23 from the `.ccs\instances\bigscreen\projects\…` root (75 files, the authoritative superset; the `.claude\projects\…` root held only a 1-line index + one identical file). The two legacy roots still exist and load for sessions on their own roots; re-check with a name diff before concluding a memory is missing.

- [ACTIVE: commune /clear loop + stale resume briefs](commune-loop-and-stale-brief-task.md) — 2026-09-07 operator task: fix (1) claude-spt file-detection re-firing /clear on a wake-commune drop core never deleted (lia looped) + (2) stale resume briefs every start (echo overwrite, core #276). Full leads + fix candidates + funnel-replay verify steps inside. ⭐ READ THIS if my resume brief looks stale — it is the echo-proof handoff.

- [CI cleanup kill-scoping](ci-kill-scoping.md) — 2026-09-07 SHIPPED (commit 9c87372, test-only): a live-relay cleanup killed EVERY claude-spt.exe on the shared runner (every peer agent's adapter incl. mine); fixed run-scoped by cmdline id + image-name pin, 3 remembered-pid kills gained a kill-time recheck. REQ-HAZARD-CI-KILL-SCOPING. ⭐ The right idiom was already in my repo 3x — grep for the offender AND the sites that do it right. ⭐ wmic self-match: pin an image name beside a cmdline filter.

- [v0.38.7 legacy wake acceptance retired](v0387-legacy-wake-retired.md) — 2026-09-06 SHIPPED: `!!checkpoint!!` + legacy `checkpoint`/`checkpoint_fire` envelopes refused (stage 3 of the wake rename, 40 releases late). ⭐ The gate caught two int scripts still feeding the legacy shape — grep ci/ and tests/ for a wire token before retiring it, not just src/.

- [Brief rule scoped to its mechanism](brief-rule-scoped-to-mechanism.md) — 2026-09-06 operator correction: the "one more tool call after the commune" rule sat under plain Commune, so agents paid it on every commune; a plain commune arms nothing. Rescoped to across-only, SHIPPED v0.38.6 09:54Z. ⭐ Write a workaround rule under the mechanism it serves and name the case it does NOT cover.

- [v0.38.4/0.38.5 commune frame replay guard + newest-wins](v0384-commune-frame-replay.md) — 2026-09-06 SHIPPED both + FIELD-VERIFIED 09:07Z (detached-writer clean test: newest-by-at_ms frame armed, 21 replays refused, echo did not overwrite): io-funnel `seq` is NOT unique (restarts, old blocks stay), so a low cursor replayed week-old COMMUNE frames with live markers into the arming leg; fixed with a session-start age stamp ordered AHEAD of the authorship/marker checks. Core half (iolog 256KB UTF-8 seek) filed by doyle — do not re-derive. ⭐ A cursor is only a position if the numbering is monotone. ⭐ 0.38.5: "stale wake" and "unrequested clear" were ONE defect reported as two — replay the funnel before believing a report's premise (doyle never communed across; 7 clears, 0 authored markers).

- [Wrong-direction refutation](wrong-direction-refutation.md) — 2026-09-06: I refuted a peer's CORRECT replay hypothesis by probing a HIGH cursor (answers empty) when the hazard was a LOW cursor (replays). ⭐ Name the DIRECTION a hazard runs in BEFORE choosing the probe; a clean answer to the wrong question looks identical to a clean answer to the right one. Five same-shape overturns in one day.

- [v0.38.3 echo-commune authorship guard](v0383-echo-commune-authorship.md) — 2026-09-06 SHIPPED + FIELD-VERIFIED both directions: moving detection from the Write TOOL to the drop FILE/frame silently deleted the authorship check the old rule made by accident, so core's echo-communes cleared live agents. ⭐ A replacement can delete a property the old rule supplied incidentally — enumerate what it guaranteed, because the fix's own justification will not mention it (more ⭐ in file).

- [v0.37.0 across-commune drop detect](v0370-commune-drop-detect.md) — 2026-09-06 SHIPPED (#25) then **FIELD-FAILED**: ingest is 2.8-5.8s, not the >15s I was told, so the drop is gone before the next hook looks. ⭐ I named the load-bearing assumption, wrote it down as falsifiable, and never spent the two minutes to falsify it (more ⭐ in file).

- [pacer 0.7.0 boundary frames](pacer-0700-boundary-frames.md) — 2026-08-30 SHIPPED + **FIELD-VERIFIED on a real `clear`** (1 boundary(ies), 0 refused; same fixture proved claude-spt's across-clear `--mid` span): education moved off the digest poll onto `type="boundary"` frames (releases#239); **claude-spt needed NO change** (emission is core-side off seams we already drive). ⭐ Grep your own code for PENDING TRIGGERS when a dependency ships — the work was already specified at the call site months earlier (more ⭐ in file).

- [v0.36.0 io compliance — our parser deleted](v0360-io-compliance-parser-deleted.md) — 2026-08-29 SHIPPED + FIELD-VERIFIED; **#22 closed 2026-09-06** (this index wrongly said 08-29 — I recorded a tracker close I never issued; read remote state back). Core now parses shortform off the payloads we report (span→MSG_OUT→DISPATCH_RESULTS observed end-to-end). ⭐ Moving a capability to core turns every path that SKIPS REPORTING into one that SKIPS THE CAPABILITY — re-walk the early returns; the compiler cannot (more ⭐ in file).

- [v0.35.0 mid-turn spans + disjointness](v0350-midturn-spans-disjointness.md) — 2026-08-29 SHIPPED + FIELD-VERIFIED: `--mid` spans (core 0.66.0 / #238) recover the 12.5%; the real work was a SECOND, CURSOR-BLIND transcript reader the feature exposed. ⭐ A cost that is not constant across a migration earns a release boundary — ship the risky property while an overlap is still just a duplicate record (more ⭐ in file).

- [v0.34.0 now-signal PreToolUse leg + agent-output](v0340-nowsignal-pretool-agent-output.md) — 2026-08-29 SHIPPED + FIELD-VERIFIED: the mid-turn funnel poll, finally feeding `--agent-output` (agent_output-triggered monics/hints had NEVER been able to fire). ⭐ A documented DEFERRAL can EXPIRE rather than be overruled — find the half its reason never priced (more ⭐ in file).

- [v0.33.0 IO funnel — compliance HELD](v0330-io-funnel-hold.md) — 2026-08-28 SHIPPED the USER_INPUT ingest edge + `api hint`→`api now-signal`; HELD `[io] compliance` (#22 open, blocked on releases#238). ⭐ Shortform parses off the STATE PAYLOAD, not now-signal — find which CALL carries the text (more ⭐ in file).

- [IO funnel wave: claude-spt 0.32.0 + pacer 0.6.0](io-funnel-two-release-wave.md) — 2026-08-28 SHIPPED BOTH + FIELD-VERIFIED: pacer reads codes off `AGENT_OUTPUT` io frames instead of parsing its owner's digest. ⭐ A PUBLISHED kind is not an EMITTED kind — claude-spt had 0 payload call sites, so consuming it first would have made pacer deaf; find the code that PRODUCES the data (more ⭐ in file).

- [v0.31.0 attr pass-through](v0310-attr-passthrough.md) — 2026-08-26 SHIPPED + FIELD-OBSERVED: generic carry of every non-consumed envelope attribute closes the 3-time by-name recurrence at render_frames. ⭐ The next attribute is unnamed by construction — a by-name fix cannot close a class (more ⭐ in file).

- [Node-local book gate](node-local-book-gate.md) — 2026-08-26: the docs book at localhost:5474 is served from THIS node's docs bundle, so a section published upstream is absent here until `spt update --core-only` lands it (docs ride the core update; no restart needed to read them). ⭐ "published" ≠ "readable on this node" — update first, then grep. ⭐⭐ Validate the instrument before trusting a zero-hit grep (HTTP 200 + control terms on the SAME fetch).

- [v0.30.0 seal carry](v0300-seal-carry.md) — 2026-08-25 SHIPPED: the sender-authored `seal=` token was dropped by our re-render (3rd attribute lost at that ONE seam). ⭐ The seam is the hazard, not the attribute. ⭐⭐ A SENDER-authored attribute may not be unescaped into a block body — carry the raw wire form in an attribute, as `from` is carried. Same day core turned it into a CLASS RULE (REQ-EVENT-ATTR-PASSTHROUGH, v0.63.0) that BINDS our re-render: pass through every attr we do not consume; minted unactivated, build gated on reading the page locally.

- [v0.29.4/0.29.5 turn-end confirm + canonical root](v0294-0295-turnend-confirm-and-canonical-root.md) — 2026-08-24 SHIPPED both: #17 turn-end tag confirms now park at Stop and surface on the author's next hook (`state/digest/<eid>.confirm`, REQ-TAG-CONFIRM-NEXT-HOOK); #19 alt-root update FAILED because CC checks the shared store's installLocation LEXICALLY — post_update now drives the CLI at the junction target's canonical root. ⭐ A junction shares content, not path identity. ⭐ `cmd | tail` returns tail's exit code.

- [Exit 0 from a flag-order no-op](exit-zero-from-a-flag-order-noop.md) — `mirror-public.sh vX.Y.Z --apply` parses `--apply` ONLY in position 1: it ran as a DRY RUN, printed `DRY-RUN ok`, exited 0. ⭐ An exit code says the script finished, never that it acted — read the mode from the output and confirm at the CONSUMER (`git ls-remote --tags`, `gh release view --json assets`).

- [alchemy shell payload mechanics](alchemy-shell-payload-mechanics.md) — refs need the `#` sigil, and `shell send --file` STAGES for the next create instead of posting — a comment must go through the text form. ⭐ `SHELL_SPOOLED` means accepted for transport, NOT that the op worked; the real answer lands async, a turn or two later.

- [Measuring a process env vs shipping a probe](measuring-a-process-env-vs-shipping-a-probe.md) — flynn: read the target process PEB env (pid from the spawn output, only a process you spawned) — no release, no traffic, cannot be confounded by the path under test. Ship an in-process probe only for EPHEMERAL targets or a standing regression signal. Also: “pass the session id at the send site” does not generalize to broker-spawned residents.

- [Two /tmp namespaces publish trap](two-tmp-namespaces-publish-trap.md) — python /tmp = C:	mp, MSYS sh /tmp = %LOCALAPPDATA%\Temp; a release published ANOTHER project’s notes through that gap. ⭐ I printed back the file I WROTE, not the one gh CONSUMED — verify the artifact the consumer received, and prefer a pipe to a path.

- [v0.28.0 model-invoked skill bodies](v0280-model-invoked-skill-bodies.md) — 2026-08-21 SHIPPED: CC routes to a skill two ways and only the typed one injected a body; every model-invoked /sptc:* call got the skeleton, all 12 skills. Fixed at PreToolUse. ⭐ A missing hook confirm reads EXACTLY like a hook that never fired — discriminate with SPOOLED state, never with state the same turn is still writing.

- [v0.26.2 monic reveal](v0262-monic-reveal.md) — 2026-08-05 SHIPPED + FIELD-CLOSED: our renderer dropped `mnemonics-json`, so core's warning suppression + our drop made a classified peer read as a stranger. ⭐ A re-render is a lossy copy and the loss is invisible at the far end. ⭐⭐ Carries the cross-node recipe for measuring a SUPPRESSION — same-node AND posture-open are both never-warning, so a single node can't.

- [v0.26.1 hints never called](v0261-hints-never-called.md) — 2026-08-04 SHIPPED: `[[hints]]` declared in every manifest since v0.2.x, hook never called `spt api hint` — NO keyword hint had ever fired, for anyone. ⭐ A requirement whose evidence is a config declaration is not covered until you find the consumer call. Open: `#8` model-invoked skills get no body.

- [v0.25.32 verdict-not-catchall](v02532-verdict-not-catchall.md) — 2026-08-03 SHIPPED: tag-send said NO PERCH for a failed `spt` SPAWN (a claim about a peer from evidence never had). ⭐⭐ Trap: my hook-trace covered ONE of two dispatch legs and read exactly like a complete one — I quoted it against a peer and had to retract. Also: a dead test with no `#[test]`.

- [Mirror guard scope + EXCLUDES mechanics](mirror-guard-scope-and-excludes.md) — the leak guard reads COMMITTED HEAD and pins org/repo literals ONLY; "guard passed" ≠ "belongs in public". EXCLUDES applies at mirror time from the running script, so a file inside a published tag can be stripped with NO re-tag.

- [Arm (c) = releases#146; anchor holds](arm-c-anchor-and-statement.md) — FILED 2026-08-03 as `spt-bs-releases#146` (BACKLOG/CHANGE), my measurement is its acceptance criterion. Anchor re-derived at cutoff ≤2026-08-01T00:36:37Z: COUNT 1161, MEAN 6341.9, EXACT. Check the anchor BEFORE the delta, never after. Lesson: a blocker that survives a reset as prose must be FILED. Sibling: #145 knock = sender-side, not ours.

- [Commune path in the wake message](commune-path-in-wake.md) — 2026-08-01: put the commune file's ABSOLUTE path in `!!wake!!`; never glob. File gone = ingest succeeded; file surviving = never ingested. `psyche_host_error` null alone is not freshness — pair with a content check.

- [Stale update-notice spool copies](stale-update-notice-spool-copies.md) — 2026-07-22 doyle RCA: repeated "update vX available" on an already-updated node = spool copies the store's self-clear can't recall. `spt notif list` + `spt --version` are the truth; ignore, never apply off a notice. Falsifier: a copy surviving >1 drain.

- [v0.25.7 internal-session isolation](v0257-internal-session-isolation.md) — 2026-07-22 SHIPPED + FIELD-VERIFIED: psyche/echo-commune now run --safe-mode (probe-gated, disableAllHooks fallback); user hooks/plugins/CLAUDE.md no longer contaminate internal sessions (0 vs 352 control). Reusable disposable-endpoint verify recipe inside.

- [v0.25.6 compact receive-heal](v0256-compact-receive-heal.md) — 2026-07-21 SHIPPED: /compact = 4th stuck-ACTIVE entry point (deployah 46min GO stall, hertz RCA); SessionStart(compact) now idles + redrives msgpark, trigger-gated via transcript compactMetadata.trigger. Field collision verify OWED (needs disposable endpoint or parked deployah). Doyle rider: a 5th shape ⇒ predicate healer, not a longer list.

- [MSYS grep instrument traps](msys-grep-instrument-traps.md) — 2026-08-21: bash `$'[NUL-escape]'` is an EMPTY pattern (matched all ~190 files; truth was 1) and MSYS `grep -e A -e B` CORE-DUMPS silently (read as "no matches" while the leak gate was correctly failing). ⭐ Use python for any repo-wide scan whose GREEN gates a decision; both failures returned the reassuring answer.
- [List vs predicate assertions](list-vs-predicate-assertions.md) — 2026-07-20 doyle catch: a rule keyed on the instances that exist today (`no [profiles.ccs.digest]`) stays GREEN when the case nobody raised arrives. Iterate the shape; a vacuous predicate proves nothing; mutation-check the real file. ⭐ +2026-08-04 sibling: a version gate read a REFUSAL as "feature absent" and passed by SKIPPING on the very version it tested — absent vs MOVED are identical in a grep count. Fail closed; drive the gate, never grep it.

- [digest --json consumption contract](digest-json-consumption-contract.md) — 2026-07-20 REFERENCE from an 8-round blind-read of spt-core's contract page: version is process-lifetime (pair it with max seq + an unconditional poll), a non-default `--last` is a WRITE into shared per-endpoint state, follow can only be deepened via `window_turns`, and a torn-down endpoint serves frozen content (never infer liveness from digest). Our own contamination defect (`--last` in interrupt_watch) FIXED + shipped as v0.25.5 on 2026-07-20; `--follow` migration now unblocked.
- [v0.25.3/0.25.4 shortname + live cap](v0253-0254-shortname-and-live-cap.md) — 2026-07-19 SHIPPED: bare `/ready` was injecting NOTHING (`skill=0ms`, transcript looked healthy); `/sptc:live` overflowed the 9000B cap every time. Both published + field-verified. REQ-DIST-SKELETON-THIN amended: split line is CLI COUPLING, not length.
- [Signature match is not root cause](signature-match-is-not-root-cause.md) — 2026-07-19 operator correction: I pinned an RCA on a mechanism that reproduced the trace byte-identically but wasn't what happened. Ask what the user actually typed. Also: MSYS argv mangling + printf-JSON both faked the same signature.
- [v0.25.2 interrupt-heal agent-activity fix](v0252-interrupt-heal-agent-activity.md) — 2026-07-19 lia RCA: Context/echo_mirror entries on the marker turn read as "resumed" → 37min black hole; heal now counts Agent/ToolSprint only. Fabricated test fixture is why it shipped.
- [v0.25.1 interrupt-watch window scan](v0251-interrupt-watch-window.md) — 2026-07-18 deployah RCA: `--last 1` heal missed a marker buried by messages arriving in the Esc→tick gap; widened to a 12-turn window. The "node-wide trailer outage" I first reported was a `2>&1` artifact — corrected.
- [v0.25.0 symmetric <EVENT> + post-enter settle](v0250-symmetric-event-postentersettle.md) — 2026-07-18 SHIPPED: type-agnostic stub delivery (notify/user-msg/gateway park like peer msg) + 50ms post-enter settle. Field-verify owed.
- [v0.24.0 STALE_SEED / SPT_HOST_PID fix](v0240-stale-seed-hostpid-fix.md) — 2026-07-18 gaki-n RCA: dead inherited SPT_HOST_PID → STALE_SEED; fixed via Win32 Toolhelp; needs full relaunch, not hot-patch.
- [v0.20.0 stub delivery SHIPPED](v0200-stub-delivery-shipped.md) — 2026-07-10 ADR-0007 A+B+C + busy-race no-stall fix, node-applied and field-verified; v0.20.1 added transport="gh". Perch-wedge trap: never run claude/ccs from a live agent's shell. Open: Slice D only.
- [Headless-spawn external-imports gate](headless-spawn-external-imports-gate.md) — 2026-07-10 spt-hosted spawn hangs UNBOUND on CC startup dialogs (trust AND external-CLAUDE.md-imports); pre-seed both flags on the SPAWN's resolved config root, or spawn from an import-free cwd.
- [--active-only semantics + F-035](active-only-semantics-f035.md) — 2026-07-09 REFERENCE: `--active-only` = POLL channel only, delivers only while BUSY, cannot wake; `--idle-only` = opposite; `--ephemeral` = drop-not-spool. F-035 closed adapter-side at v0.18.7 (PreToolUse inlines the tag confirm; Stop drops it).
- [v0.18.5 checkpoint-edu + 70ms submit](v0185-checkpoint-edu-70ms-submit.md) — 2026-07-09 SHIPPED: checkpoint agent-education (a checkpoint does NOT take the perch down) + ENTER_SETTLE_MS=70 at the 4 pre-enter sites (stash-settle stays 50ms).
- [arg-hint parity / plugin 0.1.13](arg-hint-parity-plugin-0113.md) — 2026-07-09 skeleton-only release: `argument-hint` on all 11 /sptc:* skills + validate-skeleton guard. Hints ship via cplugs ONLY — the adapter cannot deliver frontmatter.
- [v0.18.2 /sptc:live bringup fix + F-034](v0182-sptc-live-bringup-f034.md) — 2026-07-09 SHIPPED: live.md rewritten to the chained seed+listen form + SessionStart exports SPT_HOST_PID (v0.18.3 guards a bogus msys `$PPID=1`). OPEN (mine): resolve the real claude WINPID for host_pid.
- [Live delivery model + dup-msg bug](live-delivery-model-and-dupmsg.md) — claude-spt delivers inbound to a live agent via ADAPTER channels ONLY, never core's raw payload+CR PTY-inject. `controllable:true` = attach/rc only, not delivery.
- [v0.18.0/0.18.1 Items 3-5 + F-032 + musl](v0180-items-3-5-and-f032.md) — 2026-07-08 SHIPPED: /sptc:role edit round-trip + version-gated update nudge + the musl 3rd triple. F-032 commune-ingest black hole = core-side. TRACE: live-agent logs live under ~/.ccs/instances/bigscreen/projects, NOT ~/.claude.
- [v0.17.3 send-stderr NO_PERCH fix](v0173-send-stderr-noperch.md) — 2026-07-08 SHIPPED+LIVE-PROVEN: `spt send`'s status token is on STDERR; a stdout-only classifier read DELIVERED sends as NO_PERCH. Also v0.17.4 retired `>>commune<<` and made `@<…@>` the primary fan-out.
- [v0.17.0 tag messaging](v0170-tag-messaging.md) — 2026-07-08 `@<t1,t2 body @>` peer-msg shipped (tag_scan.rs, PreToolUse+Stop). Its "NO_PERCH=flapping peer" claim was WRONG — see [[v0173-send-stderr-noperch]].
- [Stuck-ACTIVE idle black-hole](stuck-active-idle-blackhole.md) — 2026-07-08 v0.15.9: an endpoint that never completed a turn stays ACTIVE forever and every inbound spools unseen. Recovery: `spt api --adapter claude-spt state idle <id> --session-id <sid>`. TRAP: info.json pids are DEAD on every agent — never a liveness signal.
- [/resume rebind wedge](resume-rebind-wedge.md) — 2026-07-07 v0.15.7: CC in-TUI `/resume` re-pinned the perch proofless+silent → core squat-protect refused → perch stranded on the departed sid. Fix: bind carries the departed sid as proof, strict+loud. OPEN: live in-TUI repro.
- [PreToolUse envelope black hole](pretool-envelope-blackhole.md) — 2026-07-07 v0.15.4: CC discards raw PreToolUse stdout, so every mid-turn drain was eaten node-wide; fixed with the hookSpecificOutput envelope. Also holds the CLOSED truncation model: inter-agent sends <350B raw, split long reports.
- [spt reachability notice port](reachability-notice-port.md) — v0.15.3: perched UPS turns close with run_in_background steering + a PreToolUse spawn nudge; perch-gated.
- [echo-commune v0.15.2 + flynn multi-spawn](echo-commune-v0152.md) — "clear boundary broken" = a missing [session.echo_commune] role (core 3-strikes the psyche host) + a daemon triple-spawn of flynn. Fold field-verified 2026-07-07.
- [Adapter record-dir hazard](adapter-record-dir-hazard.md) — NEVER rm adapters/<name>/: Pointer-mode record.toml lives there; recover via `adapter add --release`, never rm.
- [Worker-perch leak diagnosis](worker-perch-leak-diagnosis.md) — 2026-07-06: 3 core bugs → WORKER-TRUTH; v0.14.2 + v0.15.0 shipped (floor 0.27.0).
- [v0.26.0 core wave](v0260-core-wave.md) — floor enforcement LIVE in core ≥0.26; from-stamp fix; core 0.28.0 (JOIN-TRUTH) = zero adapter impact.
- [Boundary rename v0.14.1 + fold](boundary-rename-v0141.md) — /clear re-asserts the display name; never emit two post-clear sequences (they blend) — rename stashes, fire emits ONE combined sequence.
- [Live-perch monitor reachability](live-perch-monitor-reachability.md) — a dead Monitor plus trusted busy-path injection = silent idle unreachability. `spt send` QUEUED-vs-SENT is the reachability truth; the roster and info.json lie stale-ONLINE.
- [Psyche resident multi-subnet churn](psyche-resident-multisubnet-churn.md) — resident psyche crashlooped on 2-subnet homes (v0.13.4 loud exit); class dissolved by the ephemeral redesign.
- [Psyche ephemeral redesign](psyche-ephemeral-redesign.md) — resident wrapper → run-to-completion shim (core-minted psyche sid, F-030); shipped at v0.14.0.
- [.claude.json write hazard](claudejson-write-hazard.md) — NEVER open-truncate the trust store (ENOSPC wiped 16 projects' trust); always tmp + os.replace.
- [Checkpoint wake ARC CLOSED](checkpoint-wake-broken-postclear-forcenative.md) — B6 ghost pinned 2026-07-04, five layers. BAD-SHIP rule: parked-work exclusion check before tagging from HEAD. Broker-PTY sessions leave NO transcripts — assert via side-effect files.
- [F-027 trust-seam ground truth](f027-trust-seam-groundtruth.md) — trust is PER-CONFIG-ROOT; pre-trust must target the SPAWN's resolved root; 6-mode spawn-fail taxonomy.
- [counter-43 RC-window flip-gate](counter43-rc-window.md) — 4 pre-flip ints in an SPT_HOME-isolated candidate → RC-GREEN; caught my own false results before reporting.
- [B6 force-native-decay live-repro hunt](b6-liverepro-hunt.md) — decay NOT reproduced across a 5-cell matrix; trust seed is account-root-sensitive.
- [v0.22.0 validation wave](v0220-validation-wave.md) — endpoint-info + SI-1 GREEN; F-026 root cause (forward-slash trust key); v0.12.1 psyche identity-env scrub.
- [v0.12.0 checkpoint-race + project-names](v0120-checkpoint-race-project-names.md) — arm/fire split + project-named sessions.
- [Release notes = UX-only](release-notes-ux-only.md) — operator rule: succinct before/after UX + recovery step ONLY; never code/env/test specifics or incident narrative.
- [F-023/F-024 cross-node delivery + v0.10.4](f023-f024-crossnode-delivery.md) — /clear wedge fixed, E2E GREEN both nodes; stale-plugin hazard; F-025/026/027 filed.
- [v0.10.3 node-named sessions](v0103-node-named-sessions.md) — launch shim display/RC names; RC-name unify PARKED.
- [v0.10.1 whoami-json fix](v0101-whoami-json-fix.md) — SessionStart id via `whoami --json` .self.id; parse-fail ⇒ empty.
- [owl --reply-to FORBIDDEN](owl-replyto-forbidden.md) — legacy owl `send --reply-to` mis-stamps FROM; always plain send.
- [v0.10.0 digest-fetcher SHIPPED](v0100-digest-fetcher-shipped.md) — [digest] strategy=fetcher + CLAUDE_CONFIG_DIR read-var, floor 0.19.0.
- [v0.9.2 on-node update + skew brick](v092-onnode-update-skew-brick.md) — mid-session update bricked all tools (old dispatch × new hook_cmd); /reload-plugins recovered.
- [v0.9.1 bugfix sweep](v091-bugfix-sweep.md) — an UNQUOTED cached hook_cmd broke every hook; fix = bare-path + QUOTED cache.
- [v0.9.0 D1 SHIPPED](v090-d1-shipped.md) — hook logic → `claude-spt hook <event>` binary (resolve-not-execute); wrappers deleted.
- [Live-agent ints DONE](live-int-gated-m11-counter15.md) — live-bringup recipe = persistent-child `api listen --manifest` (WINPID anchor, bind-before-send).
- [v0.8.1 dogfood → v0.2.x](v074-follow-ups.md) — psyche greedy --prompt fix; auto-update proven; self-contained /sptc:live injection.
- [PREP-4 → v0.3.0 parity closed](prep4-v030-parity-closed.md) — psyche_init in BASE, no :live profile; F-011 Pointer-manifest silent-drop = core gap.
- [Per-OS adapter.spt + setup waves](per-os-and-setup-waves.md) — linux cross-built via cargo-zigbuild (zig at ~/.sptc-zig, on PATH for the build).
- [Succession flip gated](succession-flip-gated.md) — publish as sptc; flip to spt only after proven parity AND legacy owl retired.
- [Psyche sandbox + ADR-leak → v0.4.0](psyche-sandbox-and-adr-leak.md) — psyche sandboxed (ADR-0003); only ADR-0001/0002 real, the rest were foreign-leak.
- [F-019 idle-submit root cause](f019-idle-submit-and-v0142.md) — idle msgs never submitted = a relative translation-binary path not resolved against install_dir; fixed core-side.
- [Checkpoint-commune wave (T1/T2/T3)](checkpoint-commune-wave-built.md) — multi-line idle envelope + marker communes + psyche-download resume; adapter v0.7.0.
- [W3 + F-017 + v0.6.1 fat packaging](v06x-w3-f017-v061.md) — single multi-platform fat adapter.spt (per-triple subdirs, floor 0.13.2).
