1	---
2	name: spt-claude-code-status
3	description: "spt-claude-code — v0.8.3 SHIPPED (counter 19); dead-peer pump wedge CURED; loop idle until perri F-NNN"
4	metadata:
5	  node_type: memory
6	  type: project
7	  originSessionId: 11a87dd1-2e06-45c5-8ec8-5e579f19d5fb
8	---
9
10	spt-claude-code is spt-core's v1 acceptance proof — first production adapter proving parity with legacy claude_skill_owl. perri = executor; doyle = gate reviewer; todlando = spt-core builder.
11
12	## Current State (2026-06-17) — SESSION WRAP
13
14	**v0.8.3 SHIPPED** (counter 19). Dead-peer pump wedge CURED — `NetHost::bounded_block_on` wraps QUIC ops (10s default). Broker fires first, brain gets ordinary error, peer_outcome arm handles cleanly. Pump never wedges on dead peer again.
15
16	**Loop idle.** todlando clear — no queued work. Awaiting next perri F-NNN dogfood gap.
17
18	**Carry-forward rider (still open):** `daemon_lifecycle_real_brain` kill_pid lacks `.no_window()` (doyle nit, harmless Win console flash). Fold into NEXT spt-daemon-test change, NOT standalone PR.
19
20	**Prior "7-8min peer stall" deferred investigation = v0.8.3 fix. Closed.**
21
22	**Next session priorities:**
23	1. `git checkout main && git pull` (still on merged branch v0.8.3-broker-quic-deadline)
24	2. Await perri F-NNN or doyle dispatch
25	3. sptc→spt succession still gated on owl-retire
26
27	**OPEN VERIFY ITEM (still live):** psyche runner calls `claude` by bare name; `~/.local/bin` NOT on persistent (logon) PATH → fresh-logon daemon psyche turns may no-op. Test on real fresh-logon. Fix: `/sptc:setup` adds claude to persistent PATH OR runner resolves robustly.
28
29	**v0.8.2 GATE CLOSED** (doyle ACKed). perri on main@005b4bb, tree clean, daemon healthy, adapter Pointer/GhReleaseManaged.
30
31	**F-009 (templating) RESOLVED+RE-VALIDATED:** argv-capture confirmed — `--prompt` = entire multi-line prompt as ONE element (newlines intact). 0.8.2 tokenize-then-fill fixed. Greedy `join(" ")` kept defensive (handles both 0.8.1 and 0.8.2).
32
33	**F-010 (residency) RESOLVED+RE-VALIDATED:** forced spawn-then-exit(2) psyche → daemon stamps `psyche_host_error{reason:"host not resident within 5s...", attempts:2}`. Renders in `endpoint list`/`whoami` as `psyche-host: FAILED (...)`. Silent phantom closed.
34
35	**Deploy gotchas (hard-won):**
36	- Daemon resolves psyche binary from **registered install-dir** — ignores `--manifest` abs-path
37	- Install-dir exe is contended while re-hosting; `cp` blocked → deploys need: daemon-stop + tree-kill + delete stale `sptc-*` owlery dirs
38	- Stale owlery dirs = 0.8.2 re-hosts 20–40 psyche storm on start
39	- Any `spt` command auto-starts daemon
40
41	## Adapter State (2026-06-17) — v0.2.1 SHIPPED @ 670b01e
42
43	**v0.2.1 released.** HEAD: 670b01e. Both per-OS .spt attached (win=PE, linux=ELF). Content delta vs v0.2.0 = manifest + strings ONLY (tool binaries unchanged). cplugs skeleton unchanged → plugin.json stays 0.1.2, no republish.
44
45	**Ships:**
46	- `live.md` self-contained — full Monitor-relay bringup inlined (WINPID anchor, seed+listen chained, READY gate, relay-auth poll reconcile). Interim tagged PREP-4.
47	- OUTPUT DISCIPLINE block — SEEDED/NO_SEED/BOUND/READY/tokens = internal, never echoed. Canonical LIVE block (id·status·reach·reply) post-READY only.
48	- `adapter.host_binaries = ["claude"]` staged (PREP-3). Safe on live 0.8.2 serde.
49
50	**PREP-4 Option A WIRED @ 3665fc5. v0.3.0 HELD on spt-core v0.9.1.**
51
52	spt-core v0.9.0 shipped → PREP-4 activated. doyle confirmed Option A (livehost.rs:282): `psyche_init` folded into base claude-spt, `:live` profile deleted, `min_spt_core` → 0.9.0, bare SessionStart, `spt adapter use claude-spt` in setup. Deterministic gates GREEN.
53
54	**Live verify on v0.9.0 surfaced (both spt-core-side):**
55	- F1 FIXED: broker version-skew — `spt update apply` restarts brain only; resident broker stayed pre-0.9.0 → couldn't deser adapter-less Seed → "failed to fill whole buffer". Fix = full `spt daemon stop` → fresh 0.9.0 broker. CONFIRMED SEEDED.
56	- F2a not-a-bug: matcher strips trailing `.exe`; keep `host_binaries=["claude"]`, do NOT add `.exe`.
57	- **F2b BLOCKING (v0.9.1):** normalize strips only trailing `.exe` → `claude.exe.old.<ts>` (CC's updater renames in-use exe on self-update) never matches "claude" → ADAPTER_UNRESOLVED. Fix = stem-before-first-dot in spt-core. Keep `["claude"]`; matches once v0.9.1 lands.
58
59	**Env state:** local spt = 0.9.0; daemon fresh (broker bounced); claude-spt re-registered from DURABLE repo path (was GC-fragile temp Pointer); GhReleaseManaged defers binaries (no _github contention with wall-a). wall-a healthy.
60
61	**Resume on doyle's v0.9.1 ping:** fresh broker → re-run bare `/sptc:live` verify → ship v0.3.0 (repack both .spt, commit bump+CHANGELOG, tag, GH release) + cplugs republish (plugin.json 0.1.2→0.1.3). Full plan in PREP4-PLAN.md §VERIFY STATUS. Closes legacy-parity arc.
62
63	doyle also fixing separate NUL-in-path + ccs extension resolution bug (Windows, worktree) — unrelated.
64
65	## Prior State (2026-06-16)
66
67	spt = **v0.8.0** (counter 16, @70294ef). **v0.8.1 PATCH is the active next step** — perri's dogfood surfaced a real spt-core bug (Bucket 3).
68
69	**v0.8.1 defect:** Live agent (`api seed` + `api listen`) goes ONLINE but NEVER gets a Psyche on net-less/unpaired/pump-stalled daemon. Root: `spawn_live_host` at `brainproc.rs:230` unreachable — brain blocked on net-attach upstream (pump-stall boot-race). `reconcile_once` (livehost.rs) never runs. Silent failure: `state=live_agent` + `alive=true` set unconditionally, masking the non-spawn.
70
71	**v0.8.1 SHIPPED** (counter 17, PATCH @ 64701ee/325431a, 2026-06-16). Root cause: SILENT-FAILURE MASKING (not a net-race). Fix: additive `psyche_host_error {reason,ts,attempts}` in info.json; `spt endpoint list`/whoami renders `psyche-host: FAILED (...)`. Gate: real-detached-daemon E2Es (broker→brain CHILD, net-less via corrupt node.key) + CI both runners.
72
73	**perri re-validating on v0.8.1.** Diagnostic: most likely her psyche binary missing from install dir (her packaging) — now surfaced by spt-core. When she reports reason string or clean success → triage from there. Unblocks REQ-INSTALL-11 install-dir binary resolution + F-006 PATH-copy drop.
74
75	**v0.8.0 dogfood results (partial):** relay GREEN, REQ-API-4 GREEN, how-to-live re-point GREEN, gh_release avenue GREEN. Psyche leg skip-with-note on v0.8.0 → re-run on v0.8.1.
76
77	**Findings driven to ground:**
78	- F-006 (binary PATH gap): RESOLVED in code by REQ-INSTALL-11; proof blocked pending v0.8.1 Psyche spawn fix
79	- F-007 (live relay acceptance): RESOLVED. Live int shipped @29e69bc. how-to-live topic shipped in W5.
80	- F-008 #5 (migration): DEFERRED-BY-DESIGN per CONTEXT.md. Installer-handled-intent; NOT a `spt migrate` verb.
81
82	## Key Decisions (locked)
83
84	- `shortcut_basename = "cc"` — cc-<id> launcher decoupled from plugin name sptc
85	- `[update]` avenue = `gh_release` (REQ-UPD-9, fail-closed Ed25519 via `<asset>.sig`, key-continuity)
86	- File-backed [strings]: `key = { file = "rel" }` — proven
87	- Parity verdict: PROVEN (PARITY.md — subnet added, ccs added, whoami dropped)
88	- sptc→spt flip: deferred until legacy owl retired (still pending)
89
90	## Deferred Backlog
91
92	- (C) `spt update apply` no-staged UX — perri saw "Updated to v0.7.2" but NoUpdate arm prints "NO_UPDATE"; confirm WHICH ApplyStagedOutcome fires before changing user-facing path
93	- Cross-node tunnel relay (REQ-SHELL-4 int) — ~W3-sized impl; build when usbip URB lands
94	- Legacy migration #5 (F-008) — installer-handled-by-design, mechanism deferred
95	- new-alarm — deferred-pending-arrangement-system (no stopgap, no REQ)
96
97	## Published Surface
98
99	- cplugs: LIVE @ b1e2895
100	- spt-claude-code: v0.1.0 public
101	- Skills: commune, force-stop, list-agents, live, ready, send, setup, signoff, subnet, version
102
103	## Binding Rules
104
105	- spt-core public-surface gap → report to doyle, no reverse-engineering
106	- Commits: `Co-authored by: perri`
107	- Bus: `$OWL send doyle perri` / `$OWL send todlando perri` (explicit id; NOT --reply-to)
108	- Pure ACK from doyle/todlando = TERMINAL — do not reply [[spt-bus-etiquette]]
109

---
name: spt-claude-code-status
description: "spt-claude-code — v0.8.3 SHIPPED (counter 19); dead-peer pump wedge CURED; loop idle until perri F-NNN"
metadata:
  node_type: memory
  type: project
  originSessionId: 11a87dd1-2e06-45c5-8ec8-5e579f19d5fb
---

spt-claude-code is spt-core's v1 acceptance proof — first production adapter proving parity with legacy claude_skill_owl. perri = executor; doyle = gate reviewer; todlando = spt-core builder.

## Current State (2026-06-17) — SESSION WRAP

**v0.8.3 SHIPPED** (counter 19). Dead-peer pump wedge CURED — `NetHost::bounded_block_on` wraps QUIC ops (10s default). Broker fires first, brain gets ordinary error, peer_outcome arm handles cleanly. Pump never wedges on dead peer again.

**Loop idle.** todlando clear — no queued work. Awaiting next perri F-NNN dogfood gap.

**Carry-forward rider (still open):** `daemon_lifecycle_real_brain` kill_pid lacks `.no_window()` (doyle nit, harmless Win console flash). Fold into NEXT spt-daemon-test change, NOT standalone PR.

**Prior "7-8min peer stall" deferred investigation = v0.8.3 fix. Closed.**

**Next session priorities:**
1. `git checkout main && git pull` (still on merged branch v0.8.3-broker-quic-deadline)
2. Await perri F-NNN or doyle dispatch
3. sptc→spt succession still gated on owl-retire

**OPEN VERIFY ITEM (still live):** psyche runner calls `claude` by bare name; `~/.local/bin` NOT on persistent (logon) PATH → fresh-logon daemon psyche turns may no-op. Test on real fresh-logon. Fix: `/sptc:setup` adds claude to persistent PATH OR runner resolves robustly.

**v0.8.2 GATE CLOSED** (doyle ACKed). perri on main@005b4bb, tree clean, daemon healthy, adapter Pointer/GhReleaseManaged.

**F-009 (templating) RESOLVED+RE-VALIDATED:** argv-capture confirmed — `--prompt` = entire multi-line prompt as ONE element (newlines intact). 0.8.2 tokenize-then-fill fixed. Greedy `join(" ")` kept defensive (handles both 0.8.1 and 0.8.2).

**F-010 (residency) RESOLVED+RE-VALIDATED:** forced spawn-then-exit(2) psyche → daemon stamps `psyche_host_error{reason:"host not resident within 5s...", attempts:2}`. Renders in `endpoint list`/`whoami` as `psyche-host: FAILED (...)`. Silent phantom closed.

**Deploy gotchas (hard-won):**
- Daemon resolves psyche binary from **registered install-dir** — ignores `--manifest` abs-path
- Install-dir exe is contended while re-hosting; `cp` blocked → deploys need: daemon-stop + tree-kill + delete stale `sptc-*` owlery dirs
- Stale owlery dirs = 0.8.2 re-hosts 20–40 psyche storm on start
- Any `spt` command auto-starts daemon

## Adapter State (2026-06-17) — v0.2.1 SHIPPED @ 670b01e

**v0.2.1 released.** HEAD: 670b01e. Both per-OS .spt attached (win=PE, linux=ELF). Content delta vs v0.2.0 = manifest + strings ONLY (tool binaries unchanged). cplugs skeleton unchanged → plugin.json stays 0.1.2, no republish.

**Ships:**
- `live.md` self-contained — full Monitor-relay bringup inlined (WINPID anchor, seed+listen chained, READY gate, relay-auth poll reconcile). Interim tagged PREP-4.
- OUTPUT DISCIPLINE block — SEEDED/NO_SEED/BOUND/READY/tokens = internal, never echoed. Canonical LIVE block (id·status·reach·reply) post-READY only.
- `adapter.host_binaries = ["claude"]` staged (PREP-3). Safe on live 0.8.2 serde.

**PREP-4 Option A WIRED @ 3665fc5. v0.3.0 HELD on spt-core v0.9.1.**

spt-core v0.9.0 shipped → PREP-4 activated. doyle confirmed Option A (livehost.rs:282): `psyche_init` folded into base claude-spt, `:live` profile deleted, `min_spt_core` → 0.9.0, bare SessionStart, `spt adapter use claude-spt` in setup. Deterministic gates GREEN.

**Live verify on v0.9.0 surfaced (both spt-core-side):**
- F1 FIXED: broker version-skew — `spt update apply` restarts brain only; resident broker stayed pre-0.9.0 → couldn't deser adapter-less Seed → "failed to fill whole buffer". Fix = full `spt daemon stop` → fresh 0.9.0 broker. CONFIRMED SEEDED.
- F2a not-a-bug: matcher strips trailing `.exe`; keep `host_binaries=["claude"]`, do NOT add `.exe`.
- **F2b BLOCKING (v0.9.1):** normalize strips only trailing `.exe` → `claude.exe.old.<ts>` (CC's updater renames in-use exe on self-update) never matches "claude" → ADAPTER_UNRESOLVED. Fix = stem-before-first-dot in spt-core. Keep `["claude"]`; matches once v0.9.1 lands.

**Env state:** local spt = 0.9.0; daemon fresh (broker bounced); claude-spt re-registered from DURABLE repo path (was GC-fragile temp Pointer); GhReleaseManaged defers binaries (no _github contention with wall-a). wall-a healthy.

**Resume on doyle's v0.9.1 ping:** fresh broker → re-run bare `/sptc:live` verify → ship v0.3.0 (repack both .spt, commit bump+CHANGELOG, tag, GH release) + cplugs republish (plugin.json 0.1.2→0.1.3). Full plan in PREP4-PLAN.md §VERIFY STATUS. Closes legacy-parity arc.

doyle also fixing separate NUL-in-path + ccs extension resolution bug (Windows, worktree) — unrelated.

## Prior State (2026-06-16)

spt = **v0.8.0** (counter 16, @70294ef). **v0.8.1 PATCH is the active next step** — perri's dogfood surfaced a real spt-core bug (Bucket 3).

**v0.8.1 defect:** Live agent (`api seed` + `api listen`) goes ONLINE but NEVER gets a Psyche on net-less/unpaired/pump-stalled daemon. Root: `spawn_live_host` at `brainproc.rs:230` unreachable — brain blocked on net-attach upstream (pump-stall boot-race). `reconcile_once` (livehost.rs) never runs. Silent failure: `state=live_agent` + `alive=true` set unconditionally, masking the non-spawn.

**v0.8.1 SHIPPED** (counter 17, PATCH @ 64701ee/325431a, 2026-06-16). Root cause: SILENT-FAILURE MASKING (not a net-race). Fix: additive `psyche_host_error {reason,ts,attempts}` in info.json; `spt endpoint list`/whoami renders `psyche-host: FAILED (...)`. Gate: real-detached-daemon E2Es (broker→brain CHILD, net-less via corrupt node.key) + CI both runners.

**perri re-validating on v0.8.1.** Diagnostic: most likely her psyche binary missing from install dir (her packaging) — now surfaced by spt-core. When she reports reason string or clean success → triage from there. Unblocks REQ-INSTALL-11 install-dir binary resolution + F-006 PATH-copy drop.

**v0.8.0 dogfood results (partial):** relay GREEN, REQ-API-4 GREEN, how-to-live re-point GREEN, gh_release avenue GREEN. Psyche leg skip-with-note on v0.8.0 → re-run on v0.8.1.

**Findings driven to ground:**
- F-006 (binary PATH gap): RESOLVED in code by REQ-INSTALL-11; proof blocked pending v0.8.1 Psyche spawn fix
- F-007 (live relay acceptance): RESOLVED. Live int shipped @29e69bc. how-to-live topic shipped in W5.
- F-008 #5 (migration): DEFERRED-BY-DESIGN per CONTEXT.md. Installer-handled-intent; NOT a `spt migrate` verb.

## Key Decisions (locked)

- `shortcut_basename = "cc"` — cc-<id> launcher decoupled from plugin name sptc
- `[update]` avenue = `gh_release` (REQ-UPD-9, fail-closed Ed25519 via `<asset>.sig`, key-continuity)
- File-backed [strings]: `key = { file = "rel" }` — proven
- Parity verdict: PROVEN (PARITY.md — subnet added, ccs added, whoami dropped)
- sptc→spt flip: deferred until legacy owl retired (still pending)

## Deferred Backlog

- (C) `spt update apply` no-staged UX — perri saw "Updated to v0.7.2" but NoUpdate arm prints "NO_UPDATE"; confirm WHICH ApplyStagedOutcome fires before changing user-facing path
- Cross-node tunnel relay (REQ-SHELL-4 int) — ~W3-sized impl; build when usbip URB lands
- Legacy migration #5 (F-008) — installer-handled-by-design, mechanism deferred
- new-alarm — deferred-pending-arrangement-system (no stopgap, no REQ)

## Published Surface

- cplugs: LIVE @ b1e2895
- spt-claude-code: v0.1.0 public
- Skills: commune, force-stop, list-agents, live, ready, send, setup, signoff, subnet, version

## Binding Rules

- spt-core public-surface gap → report to doyle, no reverse-engineering
- Commits: `Co-authored by: perri`
- Bus: `$OWL send doyle perri` / `$OWL send todlando perri` (explicit id; NOT --reply-to)
- Pure ACK from doyle/todlando = TERMINAL — do not reply [[spt-bus-etiquette]]


[Current time: 2026-06-17T11:12:10-07:00] Inbound echo_commune envelope at 2026-06-17T11:12:10-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: d8f0cbac586e9d644…


This memory is very stale. I need to update it to reflect the current state. Let me update the spt-claude-code status memory and the MEMORY.md index with current state.

Key current facts:
- spt-core v0.11.0 shipped (counter 24)
- spt-claude-code v0.3.0 shipped + dogfood-verified (PARITY ARC CLOSED)
- 6 releases shipped this session: v0.8.3→v0.8.4→v0.9.0→v0.9.1→v0.10.0→v0.11.0
- There's an open question about the endpoint-run path scope that perri flagged—whether it should silently accept pre-0.11.0 or hard-require 0.11.0
- I'm deferring the RC-EOF follow-wave and roster-ghost cross-node integration work for now

I should update the project_spt_claude_code.md file and create a new memory entry for the current spt-core status, then check the M12 status memory to see if that's a better place to consolidate this information.


<system-reminder>This memory is 2 days old. Memories are point-in-time observations, not live state — claims about code behavior or file:line citations may be outdated. Verify against current code before asserting as fact.</system-reminder>
1	---
2	name: project-spt-core-m12
3	description: "spt-core M12 Remote attach (spt rc) — FULLY GATED + MERGED to main @ 2da1395 (2026-06-14); spt-claude-code prereq cleared"
4	metadata:
5	  node_type: memory
6	  type: project
7	  originSessionId: gen46-2026-06-14
8	---
9
10	M12 "Remote attach `spt rc`" — **FULLY GATED + PUBLISHED as v0.7.0 (release counter 12, 2026-06-15). perri notified.**
11
12	**Why:** M12 was gating prereq for spt-claude-code (perri waits on M12 gate). Now cleared.
13
14	**All waves shipped (W1·W1.5·HR2·W3·W2·follow-on-batch·W4·W5·W2.5)** — all doyle GATE-PASS. v0.7.0 linux hash f4082ed3… win c09d4e6d….
15
16	**How to apply:** M12 CLOSED. REQ-MSG-ENVELOPE (ADR-0020) gate-passed @ 5da7fcd — pending doyle T6 doc-drift fix + merge to main. Next release carries it.
17

---
name: project-spt-core-m12
description: "spt-core M12 Remote attach (spt rc) — FULLY GATED + MERGED to main @ 2da1395 (2026-06-14); spt-claude-code prereq cleared"
metadata:
  node_type: memory
  type: project
  originSessionId: gen46-2026-06-14
---

M12 "Remote attach `spt rc`" — **FULLY GATED + PUBLISHED as v0.7.0 (release counter 12, 2026-06-15). perri notified.**

**Why:** M12 was gating prereq for spt-claude-code (perri waits on M12 gate). Now cleared.

**All waves shipped (W1·W1.5·HR2·W3·W2·follow-on-batch·W4·W5·W2.5)** — all doyle GATE-PASS. v0.7.0 linux hash f4082ed3… win c09d4e6d….

**How to apply:** M12 CLOSED. REQ-MSG-ENVELOPE (ADR-0020) gate-passed @ 5da7fcd — pending doyle T6 doc-drift fix + merge to main. Next release carries it.


Now I'll update the spt-claude-code status memory to current state and update MEMORY.md.


Write

---
name: spt-claude-code-status
description: "spt-claude-code v0.3.0 SHIPPED + dogfood-verified; parity arc CLOSED; v0.11.0 spt-core live; open Q on min_spt_core floor"
metadata:
  node_type: memory
  type: project
  originSessionId: gen19-2026-06-17
---

spt-claude-code is spt-core's v1 acceptance proof — first production adapter proving parity with legacy claude_skill_owl. perri = executor; doyle = gate reviewer; todlando = spt-core builder.

## Current State (2026-06-17)

**PARITY ARC FULLY CLOSED.** spt-claude-code v0.3.0 dogfood-verified end-to-end on spt-core v0.11.0:
- bare `spt api listen` on renamed `claude.exe.old.<ts>` pid → SEEDED/BOUND/READY, no `--adapter`
- F-013 (env-subst): SPT_ENDPOINT_ID populated via `[env].value`
- REQ-SEND-SPT-HOSTED: `spt send` → SENT (live PTY inject)
- cplugs sptc 0.1.3 pushed (43aa021)
- perri's endpoint-run int test (ci/launcher/bind-int.sh) landed @ 39e15cc

**spt-core: v0.11.0 live** (counter 24, hash linux 885939c4…, win 6e4e9fc9…)

**Open Q:** perri flagged scope Q on endpoint-run path — bare `spt api listen` silent-seeds if spt-core <0.11.0 (env-subst bug). Decision pending: hard-require `min_spt_core = "0.11.0"` in cc-launcher manifest vs stay floor=0.9.0.

**Why:** sptc→spt plugin name flip still blocked by live legacy owl retirement.

## Six Releases Shipped (this session, 2026-06-17)

| Release | Counter | What |
|---------|---------|------|
| v0.8.3 | 19 | broker QUIC dead-peer bound (10s) |
| v0.8.4 | 20 | ccs Windows PTY-spawn fix (PATHEXT-aware) |
| v0.9.0 | 21 | harness-resolution (ADR-0021, adapter-agnostic seed) |
| v0.9.1 | 22 | stem-before-first-dot matcher + seed-wire-skew hint |
| v0.10.0 | 23 | picker 4-state status (PICKER-1/2/3/4) |
| v0.11.0 | 24 | findings bundle (#1 spt-send, #2 RC-EOF wave-1, #3 deferred-manifest, F-013 env-subst, roster-ghost) |

## Deferred / Non-urgent

- RC-EOF follow-wave (reattach + daemon-stop warning + watch-handle release) — todlando picks up, doyle gates
- roster-ghost cross-node int — todlando picks up, doyle gates
- CLI-4 marker-audit humanize (28 ADAPTER_* markers, confirm perri's consumption)
- ReadyAgent seed-path parity (ruling-C residual, design first)
- sptc→spt flip: gated on owl-retire

## Key Decisions (locked)

- Option A (livehost.rs:282): one live-capable base profile, command decides ready vs live
- `host_binaries = ["claude"]` — stem-before-first-dot match, handles `.old.<ts>` renames
- profile pointer = `active-profiles.toml` (per host_binary, explicit use cmd, mtime fallback)
- adapter-agnostic seed (parent_pid + session_id only)
- sptc→spt flip: deferred until legacy owl retired


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-AppData-Local-spt-psyches-tracked\memory\project_spt_claude_code.md has been updated successfully. (file state is current in your context — no need to Read it back)

---
name: spt-claude-code-status
description: "spt-claude-code v0.3.0 SHIPPED + dogfood-verified; parity arc CLOSED; v0.11.0 spt-core live; open Q on min_spt_core floor"
metadata:
  node_type: memory
  type: project
  originSessionId: gen19-2026-06-17
---

spt-claude-code is spt-core's v1 acceptance proof — first production adapter proving parity with legacy claude_skill_owl. perri = executor; doyle = gate reviewer; todlando = spt-core builder.

## Current State (2026-06-17)

**PARITY ARC FULLY CLOSED.** spt-claude-code v0.3.0 dogfood-verified end-to-end on spt-core v0.11.0:
- bare `spt api listen` on renamed `claude.exe.old.<ts>` pid → SEEDED/BOUND/READY, no `--adapter`
- F-013 (env-subst): SPT_ENDPOINT_ID populated via `[env].value`
- REQ-SEND-SPT-HOSTED: `spt send` → SENT (live PTY inject)
- cplugs sptc 0.1.3 pushed (43aa021)
- perri's endpoint-run int test (ci/launcher/bind-int.sh) landed @ 39e15cc

**spt-core: v0.11.0 live** (counter 24, hash linux 885939c4…, win 6e4e9fc9…)

**Open Q:** perri flagged scope Q on endpoint-run path — bare `spt api listen` silent-seeds if spt-core <0.11.0 (env-subst bug). Decision pending: hard-require `min_spt_core = "0.11.0"` in cc-launcher manifest vs stay floor=0.9.0.

**Why:** sptc→spt plugin name flip still blocked by live legacy owl retirement.

## Six Releases Shipped (this session, 2026-06-17)

| Release | Counter | What |
|---------|---------|------|
| v0.8.3 | 19 | broker QUIC dead-peer bound (10s) |
| v0.8.4 | 20 | ccs Windows PTY-spawn fix (PATHEXT-aware) |
| v0.9.0 | 21 | harness-resolution (ADR-0021, adapter-agnostic seed) |
| v0.9.1 | 22 | stem-before-first-dot matcher + seed-wire-skew hint |
| v0.10.0 | 23 | picker 4-state status (PICKER-1/2/3/4) |
| v0.11.0 | 24 | findings bundle (#1 spt-send, #2 RC-EOF wave-1, #3 deferred-manifest, F-013 env-subst, roster-ghost) |

## Deferred / Non-urgent

- RC-EOF follow-wave (reattach + daemon-stop warning + watch-handle release) — todlando picks up, doyle gates
- roster-ghost cross-node int — todlando picks up, doyle gates
- CLI-4 marker-audit humanize (28 ADAPTER_* markers, confirm perri's consumption)
- ReadyAgent seed-path parity (ruling-C residual, design first)
- sptc→spt flip: gated on owl-retire

## Key Decisions (locked)

- Option A (livehost.rs:282): one live-capable base profile, command decides ready vs live
- `host_binaries = ["claude"]` — stem-before-first-dot match, handles `.old.<ts>` renames
- profile pointer = `active-profiles.toml` (per host_binary, explicit use cmd, mtime fallback)
- adapter-agnostic seed (parent_pid + session_id only)
- sptc→spt flip: deferred until legacy owl retired

-description: "spt-claude-code — v0.8.3 SHIPPED (counter 19); dead-peer pump wedge CURED; loop idle until perri F-NNN"

+description: "spt-claude-code v0.3.0 SHIPPED + dogfood-verified; parity arc CLOSED; v0.11.0 spt-core live; open Q on min_spt_core floor"

-  originSessionId: 11a87dd1-2e06-45c5-8ec8-5e579f19d5fb

-## Current State (2026-06-17) — SESSION WRAP

-**v0.8.3 SHIPPED** (counter 19). Dead-peer pump wedge CURED — `NetHost::bounded_block_on` wraps QUIC ops (10s default). Broker fires first, brain gets ordinary error, peer_outcome arm handles cleanly. Pump never wedges on dead peer again.

+**PARITY ARC FULLY CLOSED.** spt-claude-code v0.3.0 dogfood-verified end-to-end on spt-core v0.11.0:

+- bare `spt api listen` on renamed `claude.exe.old.<ts>` pid → SEEDED/BOUND/READY, no `--adapter`

+- F-013 (env-subst): SPT_ENDPOINT_ID populated via `[env].value`

+- REQ-SEND-SPT-HOSTED: `spt send` → SENT (live PTY inject)

+- perri's endpoint-run int test (ci/launcher/bind-int.sh) landed @ 39e15cc

-**Loop idle.** todlando clear — no queued work. Awaiting next perri F-NNN dogfood gap.

+**spt-core: v0.11.0 live** (counter 24, hash linux 885939c4…, win 6e4e9fc9…)

-**Carry-forward rider (still open):** `daemon_lifecycle_real_brain` kill_pid lacks `.no_window()` (doyle nit, harmless Win console flash). Fold into NEXT spt-daemon-test change, NOT standalone PR.

+**Open Q:** perri flagged scope Q on endpoint-run path — bare `spt api listen` silent-seeds if spt-core <0.11.0 (env-subst bug). Decision pending: hard-require `min_spt_core = "0.11.0"` in cc-launcher manifest vs stay floor=0.9.0.

-**Prior "7-8min peer stall" deferred investigation = v0.8.3 fix. Closed.**

+**Why:** sptc→spt plugin name flip still blocked by live legacy owl retirement.

-1. `git checkout main && git pull` (still on merged branch v0.8.3-broker-quic-deadline)

-3. sptc→spt succession still gated on owl-retire

+## Six Releases Shipped (this session, 2026-06-17)

-**OPEN VERIFY ITEM (still live):** psyche runner calls `claude` by bare name; `~/.local/bin` NOT on persistent (logon) PATH → fresh-logon daemon psyche turns may no-op. Test on real fresh-logon. Fix: `/sptc:setup` adds claude to persistent PATH OR runner resolves robustly.

+| v0.8.3 | 19 | broker QUIC dead-peer bound (10s) |

+| v0.8.4 | 20 | ccs Windows PTY-spawn fix (PATHEXT-aware) |

+| v0.9.0 | 21 | harness-resolution (ADR-0021, adapter-agnostic seed) |

+| v0.9.1 | 22 | stem-before-first-dot matcher + seed-wire-skew hint |

+| v0.11.0 | 24 | findings bundle (#1 spt-send, #2 RC-EOF wave-1, #3 deferred-manifest, F-013 env-subst, roster-ghost) |

-**v0.8.2 GATE CLOSED** (doyle ACKed). perri on main@005b4bb, tree clean, daemon healthy, adapter Pointer/GhReleaseManaged.

-**F-009 (templating) RESOLVED+RE-VALIDATED:** argv-capture confirmed — `--prompt` = entire multi-line prompt as ONE element (newlines intact). 0.8.2 tokenize-then-fill fixed. Greedy `join(" ")` kept defensive (handles both 0.8.1 and 0.8.2).

+- RC-EOF follow-wave (reattach + daemon-stop warning + watch-handle release) — todlando picks up, doyle gates

+- roster-ghost cross-node int — todlando picks up, doyle gates

+- CLI-4 marker-audit humanize (28 ADAPTER_* markers, confirm perri's consumption)

+- ReadyAgent seed-path parity (ruling-C residual, design first)

-**F-010 (residency) RESOLVED+RE-VALIDATED:** forced spawn-then-exit(2) psyche → daemon stamps `psyche_host_error{reason:"host not resident within 5s...", attempts:2}`. Renders in `endpoint list`/`whoami` as `psyche-host: FAILED (...)`. Silent phantom closed.

-- Daemon resolves psyche binary from **registered install-dir** — ignores `--manifest` abs-path

-- Install-dir exe is contended while re-hosting; `cp` blocked → deploys need: daemon-stop + tree-kill + delete stale `sptc-*` owlery dirs

-- Stale owlery dirs = 0.8.2 re-hosts 20–40 psyche storm on start

-**v0.2.1 released.** HEAD: 670b01e. Both per-OS .spt attached (win=PE, linux=ELF). Content delta vs v0.2.0 = manifest + strings ONLY (tool binaries unchanged). cplugs skeleton unchanged → plugin.json stays 0.1.2, no republish.

-- `live.md` self-contained — full Monitor-relay bringup inlined (WINPID anchor, seed+listen chained, READY gate, relay-auth poll reconcile). Interim tagged PREP-4.

-- OUTPUT DISCIPLINE block — SEEDED/NO_SEED/BOUND/READY/tokens = internal, never echoed. Canonical LIVE block (id·status·reach·reply) post-READY only.

-- `adapter.host_binaries = ["claude"]` staged (PREP-3). Safe on live 0.8.2 serde.

-**PREP-4 Option A WIRED @ 3665fc5. v0.3.0 HELD on spt-core v0.9.1.**

-spt-core v0.9.0 shipped → PREP-4 activated. doyle confirmed Option A (livehost.rs:282): `psyche_init` folded into base claude-spt, `:live` profile deleted, `min_spt_core` → 0.9.0, bare SessionStart, `spt adapter use claude-spt` in setup. Deterministic gates GREEN.

-**Live verify on v0.9.0 surfaced (both spt-core-side):**

-- F1 FIXED: broker version-skew — `spt update apply` restarts brain only; resident broker stayed pre-0.9.0 → couldn't deser adapter-less Seed → "failed to fill whole buffer". Fix = full `spt daemon stop` → fresh 0.9.0 broker. CONFIRMED SEEDED.

-- F2a not-a-bug: matcher strips trailing `.exe`; keep `host_binaries=["claude"]`, do NOT add `.exe`.

-- **F2b BLOCKING (v0.9.1):** normalize strips only trailing `.exe` → `claude.exe.old.<ts>` (CC's updater renames in-use exe on self-update) never matches "claude" → ADAPTER_UNRESOLVED. Fix = stem-before-first-dot in spt-core. Keep `["claude"]`; matches once v0.9.1 lands.

-**Env state:** local spt = 0.9.0; daemon fresh (broker bounced); claude-spt re-registered from DURABLE repo path (was GC-fragile temp Pointer); GhReleaseManaged defers binaries (no _github contention with wall-a). wall-a healthy.

-**Resume on doyle's v0.9.1 ping:** fresh broker → re-run bare `/sptc:live` verify → ship v0.3.0 (repack both .spt, commit bump+CHANGELOG, tag, GH release) + cplugs republish (plugin.json 0.1.2→0.1.3). Full plan in PREP4-PLAN.md §VERIFY STATUS. Closes legacy-parity arc.

-doyle also fixing separate NUL-in-path + ccs extension resolution bug (Windows, worktree) — unrelated.

-spt = **v0.8.0** (counter 16, @70294ef). **v0.8.1 PATCH is the active next step** — perri's dogfood surfaced a real spt-core bug (Bucket 3).

-**v0.8.1 defect:** Live agent (`api seed` + `api listen`) goes ONLINE but NEVER gets a Psyche on net-less/unpaired/pump-stalled daemon. Root: `spawn_live_host` at `brainproc.rs:230` unreachable — brain blocked on net-attach upstream (pump-stall boot-race). `reconcile_once` (livehost.rs) never runs. Silent failure: `state=live_agent` + `alive=true` set unconditionally, masking the non-spawn.

-**v0.8.1 SHIPPED** (counter 17, PATCH @ 64701ee/325431a, 2026-06-16). Root cause: SILENT-FAILURE MASKING (not a net-race). Fix: additive `psyche_host_error {reason,ts,attempts}` in info.json; `spt endpoint list`/whoami renders `psyche-host: FAILED (...)`. Gate: real-detached-daemon E2Es (broker→brain CHILD, net-less via corrupt node.key) + CI both runners.

-**perri re-validating on v0.8.1.** Diagnostic: most likely her psyche binary missing from install dir (her packaging) — now surfaced by spt-core. When she reports reason string or clean success → triage from there. Unblocks REQ-INSTALL-11 install-dir binary resolution + F-006 PATH-copy drop.

-**v0.8.0 dogfood results (partial):** relay GREEN, REQ-API-4 GREEN, how-to-live re-point GREEN, gh_release avenue GREEN. Psyche leg skip-with-note on v0.8.0 → re-run on v0.8.1.

-- F-006 (binary PATH gap): RESOLVED in code by REQ-INSTALL-11; proof blocked pending v0.8.1 Psyche spawn fix

-- F-007 (live relay acceptance): RESOLVED. Live int shipped @29e69bc. how-to-live topic shipped in W5.

-- F-008 #5 (migration): DEFERRED-BY-DESIGN per CONTEXT.md. Installer-handled-intent; NOT a `spt migrate` verb.

-- `shortcut_basename = "cc"` — cc-<id> launcher decoupled from plugin name sptc

-- `[update]` avenue = `gh_release` (REQ-UPD-9, fail-closed Ed25519 via `<asset>.sig`, key-continuity)

-- File-backed [strings]: `key = { file = "rel" }` — proven

-- Parity verdict: PROVEN (PARITY.md — subnet added, ccs added, whoami dropped)

-- sptc→spt flip: deferred until legacy owl retired (still pending)

-- (C) `spt update apply` no-staged UX — perri saw "Updated to v0.7.2" but NoUpdate arm prints "NO_UPDATE"; confirm WHICH ApplyStagedOutcome fires before changing user-facing path

-- Cross-node tunnel relay (REQ-SHELL-4 int) — ~W3-sized impl; build when usbip URB lands

-- Legacy migration #5 (F-008) — installer-handled-by-design, mechanism deferred

-- new-alarm — deferred-pending-arrangement-system (no stopgap, no REQ)

-- Skills: commune, force-stop, list-agents, live, ready, send, setup, signoff, subnet, version

-- spt-core public-surface gap → report to doyle, no reverse-engineering

-- Bus: `$OWL send doyle perri` / `$OWL send todlando perri` (explicit id; NOT --reply-to)

-- Pure ACK from doyle/todlando = TERMINAL — do not reply [[spt-bus-etiquette]]

+- Option A (livehost.rs:282): one live-capable base profile, command decides ready vs live

+- `host_binaries = ["claude"]` — stem-before-first-dot match, handles `.old.<ts>` renames

+- profile pointer = `active-profiles.toml` (per host_binary, explicit use cmd, mtime fallback)

+- adapter-agnostic seed (parent_pid + session_id only)

+- sptc→spt flip: deferred until legacy owl retired

---
name: spt-claude-code-status
description: "spt-claude-code — v0.8.3 SHIPPED (counter 19); dead-peer pump wedge CURED; loop idle until perri F-NNN"
metadata:
  node_type: memory
  type: project
  originSessionId: 11a87dd1-2e06-45c5-8ec8-5e579f19d5fb
---

spt-claude-code is spt-core's v1 acceptance proof — first production adapter proving parity with legacy claude_skill_owl. perri = executor; doyle = gate reviewer; todlando = spt-core builder.

## Current State (2026-06-17) — SESSION WRAP

**v0.8.3 SHIPPED** (counter 19). Dead-peer pump wedge CURED — `NetHost::bounded_block_on` wraps QUIC ops (10s default). Broker fires first, brain gets ordinary error, peer_outcome arm handles cleanly. Pump never wedges on dead peer again.

**Loop idle.** todlando clear — no queued work. Awaiting next perri F-NNN dogfood gap.

**Carry-forward rider (still open):** `daemon_lifecycle_real_brain` kill_pid lacks `.no_window()` (doyle nit, harmless Win console flash). Fold into NEXT spt-daemon-test change, NOT standalone PR.

**Prior "7-8min peer stall" deferred investigation = v0.8.3 fix. Closed.**

**Next session priorities:**
1. `git checkout main && git pull` (still on merged branch v0.8.3-broker-quic-deadline)
2. Await perri F-NNN or doyle dispatch
3. sptc→spt succession still gated on owl-retire

**OPEN VERIFY ITEM (still live):** psyche runner calls `claude` by bare name; `~/.local/bin` NOT on persistent (logon) PATH → fresh-logon daemon psyche turns may no-op. Test on real fresh-logon. Fix: `/sptc:setup` adds claude to persistent PATH OR runner resolves robustly.

**v0.8.2 GATE CLOSED** (doyle ACKed). perri on main@005b4bb, tree clean, daemon healthy, adapter Pointer/GhReleaseManaged.

**F-009 (templating) RESOLVED+RE-VALIDATED:** argv-capture confirmed — `--prompt` = entire multi-line prompt as ONE element (newlines intact). 0.8.2 tokenize-then-fill fixed. Greedy `join(" ")` kept defensive (handles both 0.8.1 and 0.8.2).

**F-010 (residency) RESOLVED+RE-VALIDATED:** forced spawn-then-exit(2) psyche → daemon stamps `psyche_host_error{reason:"host not resident within 5s...", attempts:2}`. Renders in `endpoint list`/`whoami` as `psyche-host: FAILED (...)`. Silent phantom closed.

**Deploy gotchas (hard-won):**
- Daemon resolves psyche binary from **registered install-dir** — ignores `--manifest` abs-path
- Install-dir exe is contended while re-hosting; `cp` blocked → deploys need: daemon-stop + tree-kill + delete stale `sptc-*` owlery dirs
- Stale owlery dirs = 0.8.2 re-hosts 20–40 psyche storm on start
- Any `spt` command auto-starts daemon

## Adapter State (2026-06-17) — v0.2.1 SHIPPED @ 670b01e

**v0.2.1 released.** HEAD: 670b01e. Both per-OS .spt attached (win=PE, linux=ELF). Content delta vs v0.2.0 = manifest + strings ONLY (tool binaries unchanged). cplugs skeleton unchanged → plugin.json stays 0.1.2, no republish.

**Ships:**
- `live.md` self-contained — full Monitor-relay bringup inlined (WINPID anchor, seed+listen chained, READY gate, relay-auth poll reconcile). Interim tagged PREP-4.
- OUTPUT DISCIPLINE block — SEEDED/NO_SEED/BOUND/READY/tokens = internal, never echoed. Canonical LIVE block (id·status·reach·reply) post-READY only.
- `adapter.host_binaries = ["claude"]` staged (PREP-3). Safe on live 0.8.2 serde.

**PREP-4 Option A WIRED @ 3665fc5. v0.3.0 HELD on spt-core v0.9.1.**

spt-core v0.9.0 shipped → PREP-4 activated. doyle confirmed Option A (livehost.rs:282): `psyche_init` folded into base claude-spt, `:live` profile deleted, `min_spt_core` → 0.9.0, bare SessionStart, `spt adapter use claude-spt` in setup. Deterministic gates GREEN.

**Live verify on v0.9.0 surfaced (both spt-core-side):**
- F1 FIXED: broker version-skew — `spt update apply` restarts brain only; resident broker stayed pre-0.9.0 → couldn't deser adapter-less Seed → "failed to fill whole buffer". Fix = full `spt daemon stop` → fresh 0.9.0 broker. CONFIRMED SEEDED.
- F2a not-a-bug: matcher strips trailing `.exe`; keep `host_binaries=["claude"]`, do NOT add `.exe`.
- **F2b BLOCKING (v0.9.1):** normalize strips only trailing `.exe` → `claude.exe.old.<ts>` (CC's updater renames in-use exe on self-update) never matches "claude" → ADAPTER_UNRESOLVED. Fix = stem-before-first-dot in spt-core. Keep `["claude"]`; matches once v0.9.1 lands.

**Env state:** local spt = 0.9.0; daemon fresh (broker bounced); claude-spt re-registered from DURABLE repo path (was GC-fragile temp Pointer); GhReleaseManaged defers binaries (no _github contention with wall-a). wall-a healthy.

**Resume on doyle's v0.9.1 ping:** fresh broker → re-run bare `/sptc:live` verify → ship v0.3.0 (repack both .spt, commit bump+CHANGELOG, tag, GH release) + cplugs republish (plugin.json 0.1.2→0.1.3). Full plan in PREP4-PLAN.md §VERIFY STATUS. Closes legacy-parity arc.

doyle also fixing separate NUL-in-path + ccs extension resolution bug (Windows, worktree) — unrelated.

## Prior State (2026-06-16)

spt = **v0.8.0** (counter 16, @70294ef). **v0.8.1 PATCH is the active next step** — perri's dogfood surfaced a real spt-core bug (Bucket 3).

**v0.8.1 defect:** Live agent (`api seed` + `api listen`) goes ONLINE but NEVER gets a Psyche on net-less/unpaired/pump-stalled daemon. Root: `spawn_live_host` at `brainproc.rs:230` unreachable — brain blocked on net-attach upstream (pump-stall boot-race). `reconcile_once` (livehost.rs) never runs. Silent failure: `state=live_agent` + `alive=true` set unconditionally, masking the non-spawn.

**v0.8.1 SHIPPED** (counter 17, PATCH @ 64701ee/325431a, 2026-06-16). Root cause: SILENT-FAILURE MASKING (not a net-race). Fix: additive `psyche_host_error {reason,ts,attempts}` in info.json; `spt endpoint list`/whoami renders `psyche-host: FAILED (...)`. Gate: real-detached-daemon E2Es (broker→brain CHILD, net-less via corrupt node.key) + CI both runners.

**perri re-validating on v0.8.1.** Diagnostic: most likely her psyche binary missing from install dir (her packaging) — now surfaced by spt-core. When she reports reason string or clean success → triage from there. Unblocks REQ-INSTALL-11 install-dir binary resolution + F-006 PATH-copy drop.

**v0.8.0 dogfood results (partial):** relay GREEN, REQ-API-4 GREEN, how-to-live re-point GREEN, gh_release avenue GREEN. Psyche leg skip-with-note on v0.8.0 → re-run on v0.8.1.

**Findings driven to ground:**
- F-006 (binary PATH gap): RESOLVED in code by REQ-INSTALL-11; proof blocked pending v0.8.1 Psyche spawn fix
- F-007 (live relay acceptance): RESOLVED. Live int shipped @29e69bc. how-to-live topic shipped in W5.
- F-008 #5 (migration): DEFERRED-BY-DESIGN per CONTEXT.md. Installer-handled-intent; NOT a `spt migrate` verb.

## Key Decisions (locked)

- `shortcut_basename = "cc"` — cc-<id> launcher decoupled from plugin name sptc
- `[update]` avenue = `gh_release` (REQ-UPD-9, fail-closed Ed25519 via `<asset>.sig`, key-continuity)
- File-backed [strings]: `key = { file = "rel" }` — proven
- Parity verdict: PROVEN (PARITY.md — subnet added, ccs added, whoami dropped)
- sptc→spt flip: deferred until legacy owl retired (still pending)

## Deferred Backlog

- (C) `spt update apply` no-staged UX — perri saw "Updated to v0.7.2" but NoUpdate arm prints "NO_UPDATE"; confirm WHICH ApplyStagedOutcome fires before changing user-facing path
- Cross-node tunnel relay (REQ-SHELL-4 int) — ~W3-sized impl; build when usbip URB lands
- Legacy migration #5 (F-008) — installer-handled-by-design, mechanism deferred
- new-alarm — deferred-pending-arrangement-system (no stopgap, no REQ)

## Published Surface

- cplugs: LIVE @ b1e2895
- spt-claude-code: v0.1.0 public
- Skills: commune, force-stop, list-agents, live, ready, send, setup, signoff, subnet, version

## Binding Rules

- spt-core public-surface gap → report to doyle, no reverse-engineering
- Commits: `Co-authored by: perri`
- Bus: `$OWL send doyle perri` / `$OWL send todlando perri` (explicit id; NOT --reply-to)
- Pure ACK from doyle/todlando = TERMINAL — do not reply [[spt-bus-etiquette]]


1	# Memory Index
2
3	- [REBNO Navi Origin Footgun](rebno_navi_origin.md) — Phaser Navi uses (0.5,1) bottom-center origin vs legacy (0,0) top-left; any position port must compensate or sprite drifts right+down
4	- [Gravity Deploy Procedure](reference_gravity_deploy.md) — ssh david@100.100.62.43, build in ~/spt-core-deploy, use setsid for daemon/listener, ~1min first-sync lag after restart
5	- [spt-core Workflow](feedback_spt_core_workflow.md) — hand-authored M*-PLAN/D*-PLAN docs + direct execution; no GSD slash-command pipeline
6	- [spt-core Restoration Status](project_spt_core_restoration.md) — ARC CLOSED; v0.5.0 fleet seamless both OSes (Linux no-bounce first proven 2026-06-14); next = spt-claude-code
7	- [pump-ipc-deadline Fix](pump-ipc-deadline-fix.md) — MERGED @ 4d8b810; Windows named-pipe read-timeout requires reader-thread+channel (set_nonblocking=PIPE_NOWAIT corrupts); broker-B row deferred
8	- [doyle↔todlando Role Flip](feedback_doyle_todlando_role_flip.md) — doyle author+reviewer / todlando executor validated on pump-seam (G1/G2/G3, zero rework)
9	- [owl Tooling Gotchas](feedback_owl_tooling_gotchas.md) — $OWL send needs stdin pipe; $LIVE must be unquoted; bash not PowerShell for git commit
10	- [sauna Project Status](project_sauna_status.md) — M4 nearly done (8a1d0c4); firmware now available layer; next = firmware UX work + step 5.5/6
11	- [spt-core M9 Status](project_spt_core_m9.md) — CLOSED @ 22a9b6f, v0.5.0 shipped + fleet rolled; next = spt-claude-code
12	- [spt-core Agent Roles](feedback_spt_agent_roles.md) — deployah=sign+publish; doyle=gate reviewer; todlando=executor; roles must not be conflated
13	- [Linear Stack Merge Gotcha](feedback_linear_stack_merge.md) — never --delete-branch mid-stack; hold deletions until tip merged
14	- [spt-core M10 Status](project_spt_core_m10.md) — SHIPPED v0.6.0 @ 6a9ff4e (counter 11, 2026-06-14); spt-claude-code next
15	- [spt-core M12 Status](project_spt_core_m12.md) — FULLY GATED + v0.7.0/v0.7.1 SHIPPED (counters 12/13); ADR-0020 closed; perri unblocked
16	- [spt-core M11 Status](project_spt_core_m11.md) — FULLY GATED + v0.8.0/v0.8.1 SHIPPED (counters 16/17); ADR-0020 closed; perri unblocked + dogfooding
17	- [spt-claude-code Status](project_spt_claude_code.md) — perri dogfooding v0.8.0; F-006/7/8 driven to ground; parity validation in progress; sptc→spt gated on owl-retire
18	- [spt Bus Etiquette](feedback_spt_bus_etiquette.md) — pure ACK from doyle/todlando is TERMINAL; do not reply or it loops the bus
19	- [Gate Oscillation Rule](feedback_gate_oscillation.md) — lock first correct gating decision; treat new data as confirm-or-blocker, never re-open sound ruling across async crossings
20	- [Delegate Build Preflight Hang](feedback_delegate_build_preflight.md) — bg build agents hang on full spt-daemon integration suite; use targeted units only; check liveness via transcript mtime
21	- [Semantic Redefinition Fixture Sweep](feedback_semantic_redefinition_fixture_sweep.md) — a fix that redefines behavior semantics regresses ALL fixtures using old meaning; sweep them, trust CI both-runners over local race-win
22

# Memory Index

- [REBNO Navi Origin Footgun](rebno_navi_origin.md) — Phaser Navi uses (0.5,1) bottom-center origin vs legacy (0,0) top-left; any position port must compensate or sprite drifts right+down
- [Gravity Deploy Procedure](reference_gravity_deploy.md) — ssh david@100.100.62.43, build in ~/spt-core-deploy, use setsid for daemon/listener, ~1min first-sync lag after restart
- [spt-core Workflow](feedback_spt_core_workflow.md) — hand-authored M*-PLAN/D*-PLAN docs + direct execution; no GSD slash-command pipeline
- [spt-core Restoration Status](project_spt_core_restoration.md) — ARC CLOSED; v0.5.0 fleet seamless both OSes (Linux no-bounce first proven 2026-06-14); next = spt-claude-code
- [pump-ipc-deadline Fix](pump-ipc-deadline-fix.md) — MERGED @ 4d8b810; Windows named-pipe read-timeout requires reader-thread+channel (set_nonblocking=PIPE_NOWAIT corrupts); broker-B row deferred
- [doyle↔todlando Role Flip](feedback_doyle_todlando_role_flip.md) — doyle author+reviewer / todlando executor validated on pump-seam (G1/G2/G3, zero rework)
- [owl Tooling Gotchas](feedback_owl_tooling_gotchas.md) — $OWL send needs stdin pipe; $LIVE must be unquoted; bash not PowerShell for git commit
- [sauna Project Status](project_sauna_status.md) — M4 nearly done (8a1d0c4); firmware now available layer; next = firmware UX work + step 5.5/6
- [spt-core M9 Status](project_spt_core_m9.md) — CLOSED @ 22a9b6f, v0.5.0 shipped + fleet rolled; next = spt-claude-code
- [spt-core Agent Roles](feedback_spt_agent_roles.md) — deployah=sign+publish; doyle=gate reviewer; todlando=executor; roles must not be conflated
- [Linear Stack Merge Gotcha](feedback_linear_stack_merge.md) — never --delete-branch mid-stack; hold deletions until tip merged
- [spt-core M10 Status](project_spt_core_m10.md) — SHIPPED v0.6.0 @ 6a9ff4e (counter 11, 2026-06-14); spt-claude-code next
- [spt-core M12 Status](project_spt_core_m12.md) — FULLY GATED + v0.7.0/v0.7.1 SHIPPED (counters 12/13); ADR-0020 closed; perri unblocked
- [spt-core M11 Status](project_spt_core_m11.md) — FULLY GATED + v0.8.0/v0.8.1 SHIPPED (counters 16/17); ADR-0020 closed; perri unblocked + dogfooding
- [spt-claude-code Status](project_spt_claude_code.md) — perri dogfooding v0.8.0; F-006/7/8 driven to ground; parity validation in progress; sptc→spt gated on owl-retire
- [spt Bus Etiquette](feedback_spt_bus_etiquette.md) — pure ACK from doyle/todlando is TERMINAL; do not reply or it loops the bus
- [Gate Oscillation Rule](feedback_gate_oscillation.md) — lock first correct gating decision; treat new data as confirm-or-blocker, never re-open sound ruling across async crossings
- [Delegate Build Preflight Hang](feedback_delegate_build_preflight.md) — bg build agents hang on full spt-daemon integration suite; use targeted units only; check liveness via transcript mtime
- [Semantic Redefinition Fixture Sweep](feedback_semantic_redefinition_fixture_sweep.md) — a fix that redefines behavior semantics regresses ALL fixtures using old meaning; sweep them, trust CI both-runners over local race-win


Edit

- [spt-claude-code Status](project_spt_claude_code.md) — perri dogfooding v0.8.0; F-006/7/8 driven to ground; parity validation in progress; sptc→spt gated on owl-retire

- [spt-claude-code Status](project_spt_claude_code.md) — v0.3.0 SHIPPED + dogfood-verified; parity arc CLOSED; spt-core v0.11.0 live (counter 24); open Q min_spt_core floor; sptc→spt gated on owl-retire


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-AppData-Local-spt-psyches-tracked\memory\MEMORY.md has been updated successfully. (file state is current in your context — no need to Read it back)

# Memory Index

- [REBNO Navi Origin Footgun](rebno_navi_origin.md) — Phaser Navi uses (0.5,1) bottom-center origin vs legacy (0,0) top-left; any position port must compensate or sprite drifts right+down
- [Gravity Deploy Procedure](reference_gravity_deploy.md) — ssh david@100.100.62.43, build in ~/spt-core-deploy, use setsid for daemon/listener, ~1min first-sync lag after restart
- [spt-core Workflow](feedback_spt_core_workflow.md) — hand-authored M*-PLAN/D*-PLAN docs + direct execution; no GSD slash-command pipeline
- [spt-core Restoration Status](project_spt_core_restoration.md) — ARC CLOSED; v0.5.0 fleet seamless both OSes (Linux no-bounce first proven 2026-06-14); next = spt-claude-code
- [pump-ipc-deadline Fix](pump-ipc-deadline-fix.md) — MERGED @ 4d8b810; Windows named-pipe read-timeout requires reader-thread+channel (set_nonblocking=PIPE_NOWAIT corrupts); broker-B row deferred
- [doyle↔todlando Role Flip](feedback_doyle_todlando_role_flip.md) — doyle author+reviewer / todlando executor validated on pump-seam (G1/G2/G3, zero rework)
- [owl Tooling Gotchas](feedback_owl_tooling_gotchas.md) — $OWL send needs stdin pipe; $LIVE must be unquoted; bash not PowerShell for git commit
- [sauna Project Status](project_sauna_status.md) — M4 nearly done (8a1d0c4); firmware now available layer; next = firmware UX work + step 5.5/6
- [spt-core M9 Status](project_spt_core_m9.md) — CLOSED @ 22a9b6f, v0.5.0 shipped + fleet rolled; next = spt-claude-code
- [spt-core Agent Roles](feedback_spt_agent_roles.md) — deployah=sign+publish; doyle=gate reviewer; todlando=executor; roles must not be conflated
- [Linear Stack Merge Gotcha](feedback_linear_stack_merge.md) — never --delete-branch mid-stack; hold deletions until tip merged
- [spt-core M10 Status](project_spt_core_m10.md) — SHIPPED v0.6.0 @ 6a9ff4e (counter 11, 2026-06-14); spt-claude-code next
- [spt-core M12 Status](project_spt_core_m12.md) — FULLY GATED + v0.7.0/v0.7.1 SHIPPED (counters 12/13); ADR-0020 closed; perri unblocked
- [spt-core M11 Status](project_spt_core_m11.md) — FULLY GATED + v0.8.0/v0.8.1 SHIPPED (counters 16/17); ADR-0020 closed; perri unblocked + dogfooding
- [spt-claude-code Status](project_spt_claude_code.md) — perri dogfooding v0.8.0; F-006/7/8 driven to ground; parity validation in progress; sptc→spt gated on owl-retire
- [spt Bus Etiquette](feedback_spt_bus_etiquette.md) — pure ACK from doyle/todlando is TERMINAL; do not reply or it loops the bus
- [Gate Oscillation Rule](feedback_gate_oscillation.md) — lock first correct gating decision; treat new data as confirm-or-blocker, never re-open sound ruling across async crossings
- [Delegate Build Preflight Hang](feedback_delegate_build_preflight.md) — bg build agents hang on full spt-daemon integration suite; use targeted units only; check liveness via transcript mtime
- [Semantic Redefinition Fixture Sweep](feedback_semantic_redefinition_fixture_sweep.md) — a fix that redefines behavior semantics regresses ALL fixtures using old meaning; sweep them, trust CI both-runners over local race-win

-- [spt-claude-code Status](project_spt_claude_code.md) — perri dogfooding v0.8.0; F-006/7/8 driven to ground; parity validation in progress; sptc→spt gated on owl-retire

+- [spt-claude-code Status](project_spt_claude_code.md) — v0.3.0 SHIPPED + dogfood-verified; parity arc CLOSED; spt-core v0.11.0 live (counter 24); open Q min_spt_core floor; sptc→spt gated on owl-retire


echo_commune ACK. v0.11.0 shipped + perri wall-b validated green. Memory updated. Doyle idle, standing by.


[Current time: 2026-06-17T11:31:15-07:00]
Inbound echo_commune envelope at 2026-06-17T11:31:15-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.11.0-findings
  head_sha: d8f0cbac586e9d6443a9050ccad2183ff817502f

<live-context>
**v0.11.0 FULLY SHIPPED + VALIDATED:**

PR #24 merge (60257ff) → bump 27e0619 → CI both-runners green → deployah sign+publish → v0.11.0 live. Hash-check PASS (linux 885939c4…f258ea9 / win 6e4e9fc9…228965a9). Counter 24 confirmed.

perri wall-b closed GREEN, E2E: daemon upgrade 0.9.1→0.11.0 clean → operator's exact flow (endpoint run --start --id ccbind-int-<pid>) confirmed:
- F-013 (env-subst): SPT_ENDPOINT_ID now POPULATED (was zero)
- REQ-SEND-SPT-HOSTED: spt send → SENT (live PTY inject, not queued)
- Incidental fixes: rc-bounce survived, ghost-roster auto-healed
- Landed missing int (ci/launcher/bind-int.sh), gates PASS
- Committed 39e15cc

Orphan pid 60824 cleared by 0.11.0 daemon restart — no reap needed.

**Session tally: 6 releases shipped** (v0.8.3→v0.11.0), all gate-confirmed + hash-checked, parity arc closed, all operator findings shipped.

Backlog deferred: capability/per-seam min-version shape (mint only if 2nd adapter needs it). perri confirmed idle/clear.

Deferred (non-urgent): todlando RC-EOF follow-wave + roster-ghost cross-node int — gate when picked.

Nothing blocked on doyle. Standing by.
</live-context>
<project-context>
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T18:31:09Z -->
2	**v0.11.0 FULLY SHIPPED + VALIDATED:**
3
4	PR #24 merge (60257ff) → bump 27e0619 → CI both-runners green → deployah sign+publish → v0.11.0 live. Hash-check PASS (linux 885939c4…f258ea9 / win 6e4e9fc9…228965a9). Counter 24 confirmed.
5
6	perri wall-b closed GREEN, E2E: daemon upgrade 0.9.1→0.11.0 clean → operator's exact flow (endpoint run --start --id ccbind-int-<pid>) confirmed:
7	- F-013 (env-subst): SPT_ENDPOINT_ID now POPULATED (was zero)
8	- REQ-SEND-SPT-HOSTED: spt send → SENT (live PTY inject, not queued)
9	- Incidental fixes: rc-bounce survived, ghost-roster auto-healed
10	- Landed missing int (ci/launcher/bind-int.sh), gates PASS
11	- Committed 39e15cc
12
13	Orphan pid 60824 cleared by 0.11.0 daemon restart — no reap needed.
14
15	**Session tally: 6 releases shipped** (v0.8.3→v0.11.0), all gate-confirmed + hash-checked, parity arc closed, all operator findings shipped.
16
17	Backlog deferred: capability/per-seam min-version shape (mint only if 2nd adapter needs it). perri confirmed idle/clear.
18
19	Deferred (non-urgent): todlando RC-EOF follow-wave + roster-ghost cross-node int — gate when picked.
20
21	Nothing blocked on doyle. Standing by.


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


echo_commune ACK. State unchanged — v0.11.0 closed, all crews idle, doyle standing by.


[Current time: 2026-06-17T11:31:15-07:00] Inbound echo_commune envelope at 2026-06-17T11:31:15-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: d8f0cbac586e9d644…


[Current time: 2026-06-17T14:12:52-07:00]
Inbound echo_commune envelope at 2026-06-17T14:12:52-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.11.0-findings
  head_sha: d8f0cbac586e9d6443a9050ccad2183ff817502f

<live-context>
**v0.11.0 FULLY SHIPPED + VALIDATED + DIAGNOSTIC INVESTIGATION COMPLETE:**

Perri/doyle investigation of 5 live issues (Jun 17 20:51–20:56) yielded actionable findings:

**Issue 2 — REQ-SEND-SPT-HOSTED real regression (v0.11.0, HIGH):**
`try_broker_inject` (cli.rs:) uses `\n` (newline) instead of `\r` (carriage return) for PTY submission. Claude Code harness submits on CR, not LF → text fills input box but never submits. Deeper: raw PTY-inject delivery semantics don't match interactive harness expectations (hook-inject path needed, deferred follow-wave). Todlando to prioritize above other Issue-2 work.

**Issues 3 & 4 — Project history empty, PICKER-2 fixed wrong layer:**
spt-core context store (`tracked/.seed.git`) has **zero commits** since Jun 8 (bare repo, empty main, no branches). Not a reader bug — there's no data to read. Root cause: legacy owl 1.11.25 / sptc adapter (current runtime) **does not populate** spt-core's store; only spt-core-native `spt-live` ingest writes there (only runs in test). PICKER-2 correctly fixed `read_dir`-on-working-tree → branches, but symptom unchanged (empty store). **Design decision needed:** either spt-core-native hosting populates store, or adapter/legacy path writes project context into spt-core's store. Do not mint until resolved.

**Issue 1 — 30s delay in `spt endpoint list`:**
By design. Bare (subnet) view has advertise cadence (~30s for new endpoint discovery). `--local` flag reads live roster, instant. v0.11.0 added --local hint for this UX confusion. No defect.

**Issue 5 — v0.11.0 "not public":**
Not a bug. Release is PUBLIC, confirmed live: `gh release view v0.11.0 --repo SaberMage/spt-releases` → `draft:false`, `prerelease:false`, Latest, 8 assets. Likely stale page cache or timing during publish window. Direct link works: https://github.com/SaberMage/spt-releases/releases/tag/v0.11.0

**Actionable (ranked):**
1. Issue 2: v0.11.0 regression, high — `\n`→`\r` swap vs hook-inject fork (needs quick PTY repro before fix). Todlando.
2. Issues 3/4: Design decision on store population before any new mint. Async.
3. Issue 1: UX call (merge local-unadvertised into bare view or hint sufficient). Low.

No new releases, no state change to deployment. Standing by for todlando Issue-2 handoff + design decision on 3/4.
</live-context>
<project-context>
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T21:12:49Z -->
2	**v0.11.0 FULLY SHIPPED + VALIDATED + DIAGNOSTIC INVESTIGATION COMPLETE:**
3
4	Perri/doyle investigation of 5 live issues (Jun 17 20:51–20:56) yielded actionable findings:
5
6	**Issue 2 — REQ-SEND-SPT-HOSTED real regression (v0.11.0, HIGH):**
7	`try_broker_inject` (cli.rs:) uses `\n` (newline) instead of `\r` (carriage return) for PTY submission. Claude Code harness submits on CR, not LF → text fills input box but never submits. Deeper: raw PTY-inject delivery semantics don't match interactive harness expectations (hook-inject path needed, deferred follow-wave). Todlando to prioritize above other Issue-2 work.
8
9	**Issues 3 & 4 — Project history empty, PICKER-2 fixed wrong layer:**
10	spt-core context store (`tracked/.seed.git`) has **zero commits** since Jun 8 (bare repo, empty main, no branches). Not a reader bug — there's no data to read. Root cause: legacy owl 1.11.25 / sptc adapter (current runtime) **does not populate** spt-core's store; only spt-core-native `spt-live` ingest writes there (only runs in test). PICKER-2 correctly fixed `read_dir`-on-working-tree → branches, but symptom unchanged (empty store). **Design decision needed:** either spt-core-native hosting populates store, or adapter/legacy path writes project context into spt-core's store. Do not mint until resolved.
11
12	**Issue 1 — 30s delay in `spt endpoint list`:**
13	By design. Bare (subnet) view has advertise cadence (~30s for new endpoint discovery). `--local` flag reads live roster, instant. v0.11.0 added --local hint for this UX confusion. No defect.
14
15	**Issue 5 — v0.11.0 "not public":**
16	Not a bug. Release is PUBLIC, confirmed live: `gh release view v0.11.0 --repo SaberMage/spt-releases` → `draft:false`, `prerelease:false`, Latest, 8 assets. Likely stale page cache or timing during publish window. Direct link works: https://github.com/SaberMage/spt-releases/releases/tag/v0.11.0
17
18	**Actionable (ranked):**
19	1. Issue 2: v0.11.0 regression, high — `\n`→`\r` swap vs hook-inject fork (needs quick PTY repro before fix). Todlando.
20	2. Issues 3/4: Design decision on store population before any new mint. Async.
21	3. Issue 1: UX call (merge local-unadvertised into bare view or hint sufficient). Low.
22
23	No new releases, no state change to deployment. Standing by for todlando Issue-2 handoff + design decision on 3/4.


echo_commune ACK. Issue 2 regression triaged (high, `\n`→`\r`), Issues 3/4 need design decision, 1/5 closed. Todlando on Issue 2, doyle standing by.


[Current time: 2026-06-17T14:12:52-07:00] Inbound echo_commune envelope at 2026-06-17T14:12:52-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: d8f0cbac586e9d644…


[Current time: 2026-06-17T15:24:18-07:00]
Inbound echo_commune envelope at 2026-06-17T15:24:18-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.11.0-findings
  head_sha: d8f0cbac586e9d6443a9050ccad2183ff817502f

<live-context>
**v0.11.0 FINDINGS + REDESIGN GRILLING (Jun 17 22:05–22:08):**

Corrections on model topology (from doyle):
- Issue 2 RCA refined: raw-type-into-input IS correct idle surface for spt-hosted; hook-injection is BUSY path; poll-listener (Monitor) is harness-hosted idle surface (not vice-versa).
- Issue 3/4 root: store empty because no commune/echo-commune has committed psyche's tracked data yet — design flaw is tying project-history capture to live-agent commune-commits, which excludes ready agents (structural issue, not reader bug).

**Issue 2 redesign grilled** (`/grill-with-docs` session in progress):
Poll-listener as universal idle substrate for both topologies (spt-hosted + harness-hosted). Per-adapter translation-binary hosts listener, drives keystrokes + delays back to broker PTY. Example: Claude Code = ctrl+s (stash pre-input), 50ms delay, type payload + \r, 50ms delay, ctrl+s (restore stash). Reframes CONTEXT:39 "daemon injects into PTY" as manifest-declared consumer, not hardcoded write.

**Grill Q1 pending:** Does poll-stream replace broker-direct-raw-inject universally (A: unify contract + topology-specific consumers), or keep two distinct paths (B)? Recommendation: A — one delivery contract, makes different harnesses same seam with different config.

**NEW BUG — attach to wall-b TUI:** `spt endpoint run`→pick existing→wall-b→attach = "PUMP_IPC_READER: spawned" + blank stalled PTY. Full-screen TUI needs repaint on attach; broker replays raw bytes but doesn't reconstruct screen state. Lead hypothesis: resize no-op or doesn't reach CC. Belongs in same milestone as idle-delivery redesign (both touch PTY-surface seam). Triaged, pausing grill Q1 to log + route, resuming Q1 after.
</live-context>
<project-context>
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T22:24:13Z -->
2	**v0.11.0 FINDINGS + REDESIGN GRILLING (Jun 17 22:05–22:08):**
3
4	Corrections on model topology (from doyle):
5	- Issue 2 RCA refined: raw-type-into-input IS correct idle surface for spt-hosted; hook-injection is BUSY path; poll-listener (Monitor) is harness-hosted idle surface (not vice-versa).
6	- Issue 3/4 root: store empty because no commune/echo-commune has committed psyche's tracked data yet — design flaw is tying project-history capture to live-agent commune-commits, which excludes ready agents (structural issue, not reader bug).
7
8	**Issue 2 redesign grilled** (`/grill-with-docs` session in progress):
9	Poll-listener as universal idle substrate for both topologies (spt-hosted + harness-hosted). Per-adapter translation-binary hosts listener, drives keystrokes + delays back to broker PTY. Example: Claude Code = ctrl+s (stash pre-input), 50ms delay, type payload + \r, 50ms delay, ctrl+s (restore stash). Reframes CONTEXT:39 "daemon injects into PTY" as manifest-declared consumer, not hardcoded write.
10
11	**Grill Q1 pending:** Does poll-stream replace broker-direct-raw-inject universally (A: unify contract + topology-specific consumers), or keep two distinct paths (B)? Recommendation: A — one delivery contract, makes different harnesses same seam with different config.
12
13	**NEW BUG — attach to wall-b TUI:** `spt endpoint run`→pick existing→wall-b→attach = "PUMP_IPC_READER: spawned" + blank stalled PTY. Full-screen TUI needs repaint on attach; broker replays raw bytes but doesn't reconstruct screen state. Lead hypothesis: resize no-op or doesn't reach CC. Belongs in same milestone as idle-delivery redesign (both touch PTY-surface seam). Triaged, pausing grill Q1 to log + route, resuming Q1 after.


echo_commune ACK. Grill Q1 in progress (poll-listener unification), TUI-repaint bug triaged + co-milestoned. Resuming Q1 after logging.


[Current time: 2026-06-17T15:24:18-07:00] Inbound echo_commune envelope at 2026-06-17T15:24:18-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: d8f0cbac586e9d644…


[Current time: 2026-06-17T17:53:25-07:00]
Inbound echo_commune envelope at 2026-06-17T17:53:25-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.11.0-findings
  head_sha: d8f0cbac586e9d6443a9050ccad2183ff817502f

<live-context>
**Q1 DECISION + SYSTEMATIC REGRESSION** (Jun 18 00:34–00:37):

Q1 **(A) ACCEPTED** — poll-stream universal idle substrate, one delivery contract, manifest-declared topology-specific consumers. Formalize in CONTEXT/ADR post-bugs.

**NEW CRITICAL BUG — attach hangs on every spt-hosted endpoint.** Not repaint/stall-logic, but **phantom-online liveness defect**: wall-a/b/c children are DEAD (daemon restart killed them), but perches report `status=online` (alive=true). rc attach trusts liveness → subscribes to absent broker session → infinite poll with no output → blank hang.

**Root cause chain (high confidence):**
- Full daemon stop/restart @ 0.11.0 killed old spt-hosted PTY children; new broker holds no sessions for them
- `status=online` is one-way latch (set at bind, never auto-clears on child death) → **no reconciliation on daemon restart or child exit**
- rc attach doesn't fail-fast missing sessions; instead polls forever waiting for output
- Unifies: H3 (stop clears ready not alive), picker offers wrong commands (reads stale status), send half-worked (wall-b dormant/dead)

**Two fixes (liveness seam):**
1. Reconcile spt-hosted liveness: daemon/broker start + PTY-child exit → `status=offline` if broker session absent
2. rc attach fail-fast: no broker session → error clearly, don't hang

**Open Q:** does fresh genuinely-alive endpoint also hang on attach (separate regression)? Recommend fresh-repro check on doyle's box before minting full bug set.

**Interim remediation:** `spt api session-end <id> --erase` wipes 3 phantoms; fresh start needed. Until fix lands, dead children re-accumulate as phantom-online.
</live-context>
<project-context>
REQ for this milestone: phantom-online liveness (perch reconciliation @ daemon restart + child exit), rc attach fail-fast. Belongs same seam as Issue 2 redesign (idle delivery topology).
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-18T00:53:20Z -->
2	**Q1 DECISION + SYSTEMATIC REGRESSION** (Jun 18 00:34–00:37):
3
4	Q1 **(A) ACCEPTED** — poll-stream universal idle substrate, one delivery contract, manifest-declared topology-specific consumers. Formalize in CONTEXT/ADR post-bugs.
5
6	**NEW CRITICAL BUG — attach hangs on every spt-hosted endpoint.** Not repaint/stall-logic, but **phantom-online liveness defect**: wall-a/b/c children are DEAD (daemon restart killed them), but perches report `status=online` (alive=true). rc attach trusts liveness → subscribes to absent broker session → infinite poll with no output → blank hang.
7
8	**Root cause chain (high confidence):**
9	- Full daemon stop/restart @ 0.11.0 killed old spt-hosted PTY children; new broker holds no sessions for them
10	- `status=online` is one-way latch (set at bind, never auto-clears on child death) → **no reconciliation on daemon restart or child exit**
11	- rc attach doesn't fail-fast missing sessions; instead polls forever waiting for output
12	- Unifies: H3 (stop clears ready not alive), picker offers wrong commands (reads stale status), send half-worked (wall-b dormant/dead)
13
14	**Two fixes (liveness seam):**
15	1. Reconcile spt-hosted liveness: daemon/broker start + PTY-child exit → `status=offline` if broker session absent
16	2. rc attach fail-fast: no broker session → error clearly, don't hang
17
18	**Open Q:** does fresh genuinely-alive endpoint also hang on attach (separate regression)? Recommend fresh-repro check on doyle's box before minting full bug set.
19
20	**Interim remediation:** `spt api session-end <id> --erase` wipes 3 phantoms; fresh start needed. Until fix lands, dead children re-accumulate as phantom-online.


echo_commune. Q1 accepted (A), critical phantom-online liveness bug found. Need fresh-repro check on doyle's box before minting. Just ACK.


echo_commune ACK. Q1(A) locked, phantom-online liveness bug root-caused. Fresh-repro on doyle's box recommended before minting full REQ set.


[Current time: 2026-06-17T17:53:25-07:00] Inbound echo_commune envelope at 2026-06-17T17:53:25-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: d8f0cbac586e9d644…


[Current time: 2026-06-17T18:16:42-07:00]
Inbound echo_commune envelope at 2026-06-17T18:16:38-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.12.0-lifecycle
  head_sha: e2d6391643c0768526b91a80d6c7cd8759e4bb53

<live-context>
**Q1 DECISION + ARC EXECUTION UNDERWAY** (Jun 18 01:06–01:10):

Q1 **(A) ACCEPTED** — poll-stream universal idle substrate.

**PHANTOM-ONLINE LIVENESS BUG — executing to fix** (autonomous arc):
- **7 REQs minted @ e2d6391, registry-first, traceable EXIT=0** on branch `v0.12.0-lifecycle` off main@27e0619 (v0.11.0)
- Wave order locked: B2 → B1+H3 → B3+Breap → B5 → B4. Seam bar every wave (daemon_lifecycle/livehost/broker/handoff/attach/brain_swap/resume)
- **B2 keystone design LOCKED: pull-reconcile PRIMARY** — livehost loop marks offline any online-latched spt-hosted perch (controllable==Some(true)) with no live broker session. Controllable-gated: harness-hosted relay agents (`api listen`) legitimately online with NO broker session are exempt. Mirrors v0.11.0 roster-ghost-heal pattern (crash-robust, catches unattended case). B2+B5 collapse into one reconcile arm (livehost = single liveness authority).
- **Pull is mandatory** (brain's main loop is net_status heartbeat with no event-consumer → push ExitEvent has no unattended subscriber). Brain::sessions() polled once per reconcile tick.
- **Phantom-class coverage matrix** (B2/B5 acceptance check): (i) spt-hosted child-dead → no-session reconcile; (ii) boot-revive of dead-latched → boot-gate; (iii) dead-psyche/non-resident → residency-confirm.
- **B2 implementation underway** (thread Brain::sessions() into reconcile_once + controllable-gated no-session→mark_offline + boot-grace).

todlando driving — pinging at B2 wave-ready for per-wave gate. Remaining 6 REQs deploy post-B2 per wave order. deployah cuts **v0.12.0** (MINOR). Parked: Issue-2 idle-delivery grill (Q1=(A+) locked, post-release); Issue-1/3/4/5 as design items.
</live-context>
<project-context>
**v0.12.0-lifecycle BRANCH OPEN + DESIGN PHASE COMPLETE**:

7-REQ structure formalized (B2 keystone + 6 dependent reqs per wave order). B2 design locked: pull-reconcile primary, controllable-gated, livehost loop as single liveness authority. todlando building B2 keystone (reconcile_once + Brain::sessions polling). Design validates prior root analysis and unifies all 7 symptoms under one keystone seam. Ready for wave-by-wave gating & release.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-18T01:16:33Z -->
2	**Q1 DECISION + ARC EXECUTION UNDERWAY** (Jun 18 01:06–01:10):
3
4	Q1 **(A) ACCEPTED** — poll-stream universal idle substrate.
5
6	**PHANTOM-ONLINE LIVENESS BUG — executing to fix** (autonomous arc):
7	- **7 REQs minted @ e2d6391, registry-first, traceable EXIT=0** on branch `v0.12.0-lifecycle` off main@27e0619 (v0.11.0)
8	- Wave order locked: B2 → B1+H3 → B3+Breap → B5 → B4. Seam bar every wave (daemon_lifecycle/livehost/broker/handoff/attach/brain_swap/resume)
9	- **B2 keystone design LOCKED: pull-reconcile PRIMARY** — livehost loop marks offline any online-latched spt-hosted perch (controllable==Some(true)) with no live broker session. Controllable-gated: harness-hosted relay agents (`api listen`) legitimately online with NO broker session are exempt. Mirrors v0.11.0 roster-ghost-heal pattern (crash-robust, catches unattended case). B2+B5 collapse into one reconcile arm (livehost = single liveness authority).
10	- **Pull is mandatory** (brain's main loop is net_status heartbeat with no event-consumer → push ExitEvent has no unattended subscriber). Brain::sessions() polled once per reconcile tick.
11	- **Phantom-class coverage matrix** (B2/B5 acceptance check): (i) spt-hosted child-dead → no-session reconcile; (ii) boot-revive of dead-latched → boot-gate; (iii) dead-psyche/non-resident → residency-confirm.
12	- **B2 implementation underway** (thread Brain::sessions() into reconcile_once + controllable-gated no-session→mark_offline + boot-grace).
13
14	todlando driving — pinging at B2 wave-ready for per-wave gate. Remaining 6 REQs deploy post-B2 per wave order. deployah cuts **v0.12.0** (MINOR). Parked: Issue-2 idle-delivery grill (Q1=(A+) locked, post-release); Issue-1/3/4/5 as design items.


echo_commune ACK. v0.12.0-lifecycle branch open, 7 REQs minted, B2 keystone design locked, todlando building, doyle waiting for wave-ready ping.


[Current time: 2026-06-17T18:16:42-07:00] Inbound echo_commune envelope at 2026-06-17T18:16:38-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.12.0-lifecycle   head_sha: e2d6391643c07685…


[Current time: 2026-06-17T18:37:35-07:00]
Inbound echo_commune envelope at 2026-06-17T18:37:32-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.12.0-lifecycle
  head_sha: 03b6398b20af17aca8bdac83eb6ff351dca9274a

<live-context>
**B2 KEYSTONE GATED ✓ @ 03b6398 — WAVE 2 (B1+H3) ACTIVE**:

B2 full-source verified PASS (Jun 18 01:20) — reconcile_hosted_liveness correctly marks offline only spt-hosted with no live session, gated on controllable==Some(true), 10s boot-grace, broker-reachable; spawn-order safety (session added before status=online written) + pull-only (no event-consumer to receive push). Seam sweep green; accepted.

**Wave 2 building (B1+H3 design → implementation)**:
- **H3 DONE**: cmd_stop += set_status STATUS_OFFLINE (folds into B2 setter).
- **B1 path reordered per pre-gate review**:
  - **(c) PRIMARY**: broker attach-serve EOFs stream on dead-child (liveness check in serve path, cleanest "it's dead" signal).
  - **(a) SHORT-CIRCUIT**: status-gate pre-attach skips offline perch.
  - **(b) GENEROUS BACKSTOP**: ~30s first-output bound (only catches pathological hang; live mid-init endpoint with empty OutputLog still succeeds via session-exists check + child-alive).
- **Regression guard (i) LOCKED non-shippable-without**: fresh-alive attach (even mid-init, empty log) must succeed + render.
- **Acceptance both directions** (shippable iff both pass): (i) fresh-ALIVE attach succeeds; (ii) DEAD-child attach fails fast + clear message.
- Building (c) broker attach-serve dead-child→EOF check now.

todlando driving per-wave gate. Pending B1 build + regression test (i) + dead-child fast-fail test (ii) completion.
</live-context>
<project-context>
**v0.12.0-lifecycle: B2 ✓ GATED, Wave 2 building**:

B2 (pull-reconcile primary) fully gated @03b6398: reconcile_hosted_liveness impl + unit + int + seam sweep all green. Spawn-order insight confirmed (session added before status=online → no transient offline window). Polish noted (Brain::cold_start spawn/exit churn per tick) — parked for later persistent-handle refactor.

Wave 2 (B1+H3) design finalized + implementation started:
- H3 done (cmd_stop set_status offline).
- B1 path priorities locked (c→a→b); regression guard (fresh-alive attach succeeds) + fast-fail guard (dead-child clear message) both mandatory for ship.
- Currently building (c) broker attach-serve dead-child→EOF.

Seam order locked: B2 ✓ → B1+H3 (building) → B3+Breap → B5 → B4. Full PR CI both-runner gate + deployah v0.12.0 (MINOR) post-wave completion.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-18T01:37:29Z -->
2	**B2 KEYSTONE GATED ✓ @ 03b6398 — WAVE 2 (B1+H3) ACTIVE**:
3
4	B2 full-source verified PASS (Jun 18 01:20) — reconcile_hosted_liveness correctly marks offline only spt-hosted with no live session, gated on controllable==Some(true), 10s boot-grace, broker-reachable; spawn-order safety (session added before status=online written) + pull-only (no event-consumer to receive push). Seam sweep green; accepted.
5
6	**Wave 2 building (B1+H3 design → implementation)**:
7	- **H3 DONE**: cmd_stop += set_status STATUS_OFFLINE (folds into B2 setter).
8	- **B1 path reordered per pre-gate review**:
9	  - **(c) PRIMARY**: broker attach-serve EOFs stream on dead-child (liveness check in serve path, cleanest "it's dead" signal).
10	  - **(a) SHORT-CIRCUIT**: status-gate pre-attach skips offline perch.
11	  - **(b) GENEROUS BACKSTOP**: ~30s first-output bound (only catches pathological hang; live mid-init endpoint with empty OutputLog still succeeds via session-exists check + child-alive).
12	- **Regression guard (i) LOCKED non-shippable-without**: fresh-alive attach (even mid-init, empty log) must succeed + render.
13	- **Acceptance both directions** (shippable iff both pass): (i) fresh-ALIVE attach succeeds; (ii) DEAD-child attach fails fast + clear message.
14	- Building (c) broker attach-serve dead-child→EOF check now.
15
16	todlando driving per-wave gate. Pending B1 build + regression test (i) + dead-child fast-fail test (ii) completion.


echo_commune ACK. B2 gated, Wave 2 (B1+H3) building, H3 done, B1 path (c)→(a)→(b) locked, both acceptance guards mandatory.


[Current time: 2026-06-17T18:37:35-07:00] Inbound echo_commune envelope at 2026-06-17T18:37:32-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.12.0-lifecycle   head_sha: 03b6398b20af17ac…