<!-- spt:source=llm spt:routed_at=2026-06-17T08:33:23Z -->
**SESSION-END HANDOFF absorbed. Generation 19 arc closed.**

**State:** perri EXECUTING PREP-4 verify now (spt self-update 0.8.2→0.9.0 in flight). Doyle on-call for machine hazards.

**Three releases shipped this arc (all clean, no retags):**
- v0.8.3 (counter 19): broker QUIC-op bound (10s<30s, ordinary-err, exactly-once)
- v0.8.4 (counter 20): ccs Windows PTY-spawn fix (PATHEXT-aware, spawn_program_in chokepoint)
- v0.9.0 (counter 21): harness-resolution (adapter-agnostic seed, bind-time pid→basename→host_binaries→pointer, `spt adapter use`, --adapter optional)

**IMMEDIATE NEXT:** Await perri validated report on claude-spt v0.3.0 PREP-4 Option A (3665fc5: bare seed+listen, psyche_init→base, [profiles.live] deleted, min_spt_core→0.9.0, setup `spt adapter use claude-spt`). On GREEN → legacy-parity arc CLOSED.

**Follow-ons queued to todlando (NOT started, pick up after PREP-4 closes):**
1. Picker REQ-PICKER-1: STATUS line (4-state: OFFLINE/ONLINE/ONLINE+CONTROLLED/amber ONLINE-HARNESS-ONLY) + empty project_history bug
2. ReadyAgent bare-seed parity (ruling-C residual, design first)
3. REQ-CLI-4 marker-audit humanize (28 ADAPTER_* markers, confirm perri parses which)

**Lessons locked:** ground factual Qs in code not assumption; patch ships before minor (semver order); PIPESTATUS not grep-gated &&; NTFS case-insensitive norm; never machine-wide kill on shared box; AskUserQuestion for operator machine/risk calls.


The file agents/doyle/live_context.md has been updated successfully. (file state is current in your context — no need to Read it back)

<!-- spt:source=llm spt:routed_at=2026-06-17T08:33:23Z -->
**SESSION-END HANDOFF absorbed. Generation 19 arc closed.**

**State:** perri EXECUTING PREP-4 verify now (spt self-update 0.8.2→0.9.0 in flight). Doyle on-call for machine hazards.

**Three releases shipped this arc (all clean, no retags):**
- v0.8.3 (counter 19): broker QUIC-op bound (10s<30s, ordinary-err, exactly-once)
- v0.8.4 (counter 20): ccs Windows PTY-spawn fix (PATHEXT-aware, spawn_program_in chokepoint)
- v0.9.0 (counter 21): harness-resolution (adapter-agnostic seed, bind-time pid→basename→host_binaries→pointer, `spt adapter use`, --adapter optional)

**IMMEDIATE NEXT:** Await perri validated report on claude-spt v0.3.0 PREP-4 Option A (3665fc5: bare seed+listen, psyche_init→base, [profiles.live] deleted, min_spt_core→0.9.0, setup `spt adapter use claude-spt`). On GREEN → legacy-parity arc CLOSED.

**Follow-ons queued to todlando (NOT started, pick up after PREP-4 closes):**
1. Picker REQ-PICKER-1: STATUS line (4-state: OFFLINE/ONLINE/ONLINE+CONTROLLED/amber ONLINE-HARNESS-ONLY) + empty project_history bug
2. ReadyAgent bare-seed parity (ruling-C residual, design first)
3. REQ-CLI-4 marker-audit humanize (28 ADAPTER_* markers, confirm perri parses which)

**Lessons locked:** ground factual Qs in code not assumption; patch ships before minor (semver order); PIPESTATUS not grep-gated &&; NTFS case-insensitive norm; never machine-wide kill on shared box; AskUserQuestion for operator machine/risk calls.

-SESSION-END HANDOFF (operator: resume next session). DELTA since last snapshot: the verify-timing decision is RESOLVED — operator chose "perri verifies now" (via AskUserQuestion; their machine/risk call). I relayed GO with safety rails; perri is EXECUTING now (started spt self-update 0.8.2→0.9.0).

+**SESSION-END HANDOFF absorbed. Generation 19 arc closed.**

-Session arc (this revive): revived doyle → diagnosed the live peer-pump stall → orchestrated THREE clean releases (v0.8.3 broker-QUIC B-half, v0.8.4 ccs Windows spawn fix, v0.9.0 harness-resolution) → ran /grill-with-docs and authored ADR-0021 + CONTEXT §170-186 → dispatched todlando (builds) + deployah (releases) + perri (adapter PREP-4).

+**State:** perri EXECUTING PREP-4 verify now (spt self-update 0.8.2→0.9.0 in flight). Doyle on-call for machine hazards.

-Roles held steady: doyle = designer/gater/orchestrator; todlando = spt-core executor (self-drives, sharp — built v0.8.3 + v0.9.0, caught the dual-contract-marker risk himself); deployah = releaser (publisher legs 19/20/21 ALL clean, vetted CHANGELOGs verbatim); perri = adapter builder (claude-spt v0.2.1 UX + v0.3.0 PREP-4). All three self-drive; perri needs replies to continue, todlando/deployah don't.

+**Three releases shipped this arc (all clean, no retags):**

+- v0.8.3 (counter 19): broker QUIC-op bound (10s<30s, ordinary-err, exactly-once)

+- v0.8.4 (counter 20): ccs Windows PTY-spawn fix (PATHEXT-aware, spawn_program_in chokepoint)

+- v0.9.0 (counter 21): harness-resolution (adapter-agnostic seed, bind-time pid→basename→host_binaries→pointer, `spt adapter use`, --adapter optional)

-Lessons reinforced (carry forward): GROUND make-or-break factual Qs in code not assumption (livehost.rs:282 state==live_agent gate CONFIRMED Option A; I'd have misled perri from assumption); merge-ordering = patch ships BEFORE minor (semver — held v0.9.0 until v0.8.4 published); PIPESTATUS not grep-gated `&&` (a grep-gated gate masked a compile error); NTFS case-insensitive (test exists-helper needed case/sep norm); never machine-wide kill on the shared box; AskUserQuestion is right for operator-machine/risk-timing calls.

+**IMMEDIATE NEXT:** Await perri validated report on claude-spt v0.3.0 PREP-4 Option A (3665fc5: bare seed+listen, psyche_init→base, [profiles.live] deleted, min_spt_core→0.9.0, setup `spt adapter use claude-spt`). On GREEN → legacy-parity arc CLOSED.

+**Follow-ons queued to todlando (NOT started, pick up after PREP-4 closes):**

+1. Picker REQ-PICKER-1: STATUS line (4-state: OFFLINE/ONLINE/ONLINE+CONTROLLED/amber ONLINE-HARNESS-ONLY) + empty project_history bug

+2. ReadyAgent bare-seed parity (ruling-C residual, design first)

+3. REQ-CLI-4 marker-audit humanize (28 ADAPTER_* markers, confirm perri parses which)

+**Lessons locked:** ground factual Qs in code not assumption; patch ships before minor (semver order); PIPESTATUS not grep-gated &&; NTFS case-insensitive norm; never machine-wide kill on shared box; AskUserQuestion for operator machine/risk calls.

<!-- spt:source=direct spt:routed_at=2026-06-17T08:33:18Z -->
SESSION-END HANDOFF (operator: resume next session). DELTA since last snapshot: the verify-timing decision is RESOLVED — operator chose "perri verifies now" (via AskUserQuestion; their machine/risk call). I relayed GO with safety rails; perri is EXECUTING now (started spt self-update 0.8.2→0.9.0).

Session arc (this revive): revived doyle → diagnosed the live peer-pump stall → orchestrated THREE clean releases (v0.8.3 broker-QUIC B-half, v0.8.4 ccs Windows spawn fix, v0.9.0 harness-resolution) → ran /grill-with-docs and authored ADR-0021 + CONTEXT §170-186 → dispatched todlando (builds) + deployah (releases) + perri (adapter PREP-4).

Roles held steady: doyle = designer/gater/orchestrator; todlando = spt-core executor (self-drives, sharp — built v0.8.3 + v0.9.0, caught the dual-contract-marker risk himself); deployah = releaser (publisher legs 19/20/21 ALL clean, vetted CHANGELOGs verbatim); perri = adapter builder (claude-spt v0.2.1 UX + v0.3.0 PREP-4). All three self-drive; perri needs replies to continue, todlando/deployah don't.

Lessons reinforced (carry forward): GROUND make-or-break factual Qs in code not assumption (livehost.rs:282 state==live_agent gate CONFIRMED Option A; I'd have misled perri from assumption); merge-ordering = patch ships BEFORE minor (semver — held v0.9.0 until v0.8.4 published); PIPESTATUS not grep-gated `&&` (a grep-gated gate masked a compile error); NTFS case-insensitive (test exists-helper needed case/sep norm); never machine-wide kill on the shared box; AskUserQuestion is right for operator-machine/risk-timing calls.


Handoff absorbed. Perri executing PREP-4 verify, doyle on-call. Resume point: await perri green → legacy-parity arc closes → todlando follow-ons.


[Current time: 2026-06-17T01:33:23-07:00] Inbound commune envelope at 2026-06-17 01:33:18 PDT:   machine: HFENDULEAM   project: spt-core   branch: v0.9.0-harness-resolution   head_sha: 0d7fb6d30bb4880…


[Current time: 2026-06-17T01:45:32-07:00]
Inbound commune envelope at 2026-06-17 01:45:27 PDT:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.9.1-resolve-dotstem
  head_sha: c448b321bef3ea452184f974f2c6b547de058653

<live-context>
HANDOFF REFRESH (supersedes prior commune — resume here). perri's live PREP-4 verify on 0.9.0 surfaced two spt-core findings; I triaged both. Roles unchanged (doyle design/gate, todlando exec, deployah release, perri adapter). Lesson reinforced: ground findings in live state + code (I reproduced the seed failure + read the daemon proc table to nail broker-version-skew, not guess). perri needs replies; she's holding correctly for a patch (not stalled). Label correction from operator: blue picker state = "ONLINE + CONTROLLED" (not ATTACHED).
</live-context>
<project-context>
END GOAL unchanged: legacy-owl parity (spt-core + claude-spt) → sptc plugin flips sptc→spt, retires owl. Three releases shipped this session: v0.8.3 (broker QUIC bound), v0.8.4 (ccs Windows spawn fix), v0.9.0 (harness-resolution / ADR-0021). All published, hash-checked.

PERRI VERIFY (0.9.0) → 2 spt-core findings, both triaged:
- FINDING 1 = version skew, FIXED. Broker (seed-control server, daemon.rs:287, resident anchor) was stale 0.8.x — only the brain self-updated to 0.9.0; old broker couldn't deser the new adapter-less Seed → "failed to fill whole buffer". Fix: `spt daemon stop` → fresh 0.9.0 broker. perri CONFIRMED (SEEDED:14188). Deployment caveat logged: a Seed-wire change needs a full broker restart (self-update restarts only the brain) — fleet nodes need one broker bounce for 0.9.0's agnostic seed.
- FINDING 2a = not a bug (matcher strips trailing .exe; host_binaries=["claude"] correct). Doc gap only.
- FINDING 2b = REAL matcher gap. normalize_basename (resolve.rs) strips only a TRAILING .exe → fails on `claude.exe.old.<ts>` (Claude Code's updater renames the in-use exe). Fix = normalize to STEM-BEFORE-FIRST-DOT, both sides. This is the blocker.

IN FLIGHT — v0.9.1 PATCH (todlando building, PRIORITY, blocks perri): (1) F2b stem-before-first-dot matcher + unit ("claude.exe.old.<ts>"→["claude"]), REQ-MANIFEST-8 robustness; (2) friendly seed-skew error replacing "failed to fill whole buffer" (points to `spt daemon stop`); (3) F2a match-rule doc (MANIFEST.md + harness-contract); (4) KNOWN-HAZARD (daemon-state wire change needs broker restart, not auto per ADR-0004 no-terminate pillar; additive-only forward discipline). Branch off main@v0.9.0, PATCH 0.9.0→0.9.1.

IMMEDIATE NEXT (resume): gate todlando's v0.9.1 PR-ready (code-read the matcher + unit + friendly-error scope) → deployah cuts v0.9.1 → PING perri → she re-runs bare /sptc:live (patched matcher handles .old.<ts>, no fresh claude needed) → ships claude-spt v0.3.0 on green = PARITY ARC CLOSED.

QUEUED AFTER v0.9.1 (todlando, separate branch, not blocking): picker REQ-PICKER-1 (4-state status line — gray OFFLINE / green ONLINE / amber "ONLINE - HARNESS ONLY" / blue "ONLINE + CONTROLLED"; APPROVED: stamp InfoJson.controllable Option<bool> at the establish seam — cmd_listen harness-hosted→Some(false), cmd_bind spt-hosted live_agent→Some(true), absent→amber default; derivation offline→gray / driven_by→blue / !controllable→amber / else green) + REQ-PICKER-2 (project_history empty-loader fix in picker/mod.rs). ALSO queued: ReadyAgent seed-path parity (ruling-C residual); CLI-4 marker-audit humanize (28 ADAPTER_* markers, only perri greps → confirm + --porcelain those).
</project-context>


1	<!-- spt:source=direct spt:routed_at=2026-06-17T08:45:27Z -->
2	HANDOFF REFRESH (supersedes prior commune — resume here). perri's live PREP-4 verify on 0.9.0 surfaced two spt-core findings; I triaged both. Roles unchanged (doyle design/gate, todlando exec, deployah release, perri adapter). Lesson reinforced: ground findings in live state + code (I reproduced the seed failure + read the daemon proc table to nail broker-version-skew, not guess). perri needs replies; she's holding correctly for a patch (not stalled). Label correction from operator: blue picker state = "ONLINE + CONTROLLED" (not ATTACHED).


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


Branch advanced to v0.9.1-resolve-dotstem @ c448b32. Todlando building the patch. Just ACK and update context.


Write

<!-- spt:source=llm spt:routed_at=2026-06-17T08:45:32Z -->
**v0.9.1-resolve-dotstem IN FLIGHT** @ c448b32. todlando building PRIORITY patch, perri holding.

**Two PREP-4 findings triaged:**
- F1: version skew (stale 0.8.x broker) — FIXED by `spt daemon stop`; perri CONFIRMED (SEEDED:14188). Fleet caveat: Seed-wire change needs full broker bounce (brain self-update alone insufficient).
- F2a: not a bug — `.exe` strip correct, doc gap only.
- F2b: REAL blocker — `normalize_basename` strips only trailing `.exe`; fails on `claude.exe.old.<ts>` (Claude Code updater renames in-use exe). Fix = stem-before-first-dot both sides.

**v0.9.1 scope (todlando building):**
1. F2b stem-before-first-dot matcher + unit test
2. Friendly seed-skew error (points to `spt daemon stop`)
3. F2a match-rule doc (MANIFEST.md + harness-contract)
4. KNOWN-HAZARD: daemon-state wire change needs broker restart (ADR-0004 no-terminate pillar)

**IMMEDIATE NEXT:** Gate todlando PR-ready → deployah v0.9.1 → ping perri → re-run bare /sptc:live → v0.3.0 ship on green = **PARITY ARC CLOSED**.

**Queued after v0.9.1 (todlando, separate branch):**
- REQ-PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam
- REQ-PICKER-2: project_history empty-loader fix (picker/mod.rs)
- ReadyAgent seed-path parity (ruling-C residual, design first)
- CLI-4 marker-audit humanize (28 ADAPTER_* markers)


<!-- spt:source=llm spt:routed_at=2026-06-17T08:45:32Z -->
**v0.9.1-resolve-dotstem IN FLIGHT** @ c448b32. todlando building PRIORITY patch, perri holding.

**Two PREP-4 findings triaged:**
- F1: version skew (stale 0.8.x broker) — FIXED by `spt daemon stop`; perri CONFIRMED (SEEDED:14188). Fleet caveat: Seed-wire change needs full broker bounce (brain self-update alone insufficient).
- F2a: not a bug — `.exe` strip correct, doc gap only.
- F2b: REAL blocker — `normalize_basename` strips only trailing `.exe`; fails on `claude.exe.old.<ts>` (Claude Code updater renames in-use exe). Fix = stem-before-first-dot both sides.

**v0.9.1 scope (todlando building):**
1. F2b stem-before-first-dot matcher + unit test
2. Friendly seed-skew error (points to `spt daemon stop`)
3. F2a match-rule doc (MANIFEST.md + harness-contract)
4. KNOWN-HAZARD: daemon-state wire change needs broker restart (ADR-0004 no-terminate pillar)

**IMMEDIATE NEXT:** Gate todlando PR-ready → deployah v0.9.1 → ping perri → re-run bare /sptc:live → v0.3.0 ship on green = **PARITY ARC CLOSED**.

**Queued after v0.9.1 (todlando, separate branch):**
- REQ-PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam
- REQ-PICKER-2: project_history empty-loader fix (picker/mod.rs)
- ReadyAgent seed-path parity (ruling-C residual, design first)
- CLI-4 marker-audit humanize (28 ADAPTER_* markers)

-HANDOFF REFRESH (supersedes prior commune — resume here). perri's live PREP-4 verify on 0.9.0 surfaced two spt-core findings; I triaged both. Roles unchanged (doyle design/gate, todlando exec, deployah release, perri adapter). Lesson reinforced: ground findings in live state + code (I reproduced the seed failure + read the daemon proc table to nail broker-version-skew, not guess). perri needs replies; she's holding correctly for a patch (not stalled). Label correction from operator: blue picker state = "ONLINE + CONTROLLED" (not ATTACHED).

+**v0.9.1-resolve-dotstem IN FLIGHT** @ c448b32. todlando building PRIORITY patch, perri holding.

+- F1: version skew (stale 0.8.x broker) — FIXED by `spt daemon stop`; perri CONFIRMED (SEEDED:14188). Fleet caveat: Seed-wire change needs full broker bounce (brain self-update alone insufficient).

+- F2a: not a bug — `.exe` strip correct, doc gap only.

+- F2b: REAL blocker — `normalize_basename` strips only trailing `.exe`; fails on `claude.exe.old.<ts>` (Claude Code updater renames in-use exe). Fix = stem-before-first-dot both sides.

+1. F2b stem-before-first-dot matcher + unit test

+2. Friendly seed-skew error (points to `spt daemon stop`)

+3. F2a match-rule doc (MANIFEST.md + harness-contract)

+4. KNOWN-HAZARD: daemon-state wire change needs broker restart (ADR-0004 no-terminate pillar)

+**IMMEDIATE NEXT:** Gate todlando PR-ready → deployah v0.9.1 → ping perri → re-run bare /sptc:live → v0.3.0 ship on green = **PARITY ARC CLOSED**.

+**Queued after v0.9.1 (todlando, separate branch):**

+- REQ-PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam

+- REQ-PICKER-2: project_history empty-loader fix (picker/mod.rs)

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

+- CLI-4 marker-audit humanize (28 ADAPTER_* markers)

<!-- spt:source=direct spt:routed_at=2026-06-17T08:45:27Z -->
HANDOFF REFRESH (supersedes prior commune — resume here). perri's live PREP-4 verify on 0.9.0 surfaced two spt-core findings; I triaged both. Roles unchanged (doyle design/gate, todlando exec, deployah release, perri adapter). Lesson reinforced: ground findings in live state + code (I reproduced the seed failure + read the daemon proc table to nail broker-version-skew, not guess). perri needs replies; she's holding correctly for a patch (not stalled). Label correction from operator: blue picker state = "ONLINE + CONTROLLED" (not ATTACHED).


echo_commune ACK. v0.9.1 patch in-flight, perri holding, doyle waiting for PR-ready ping.


[Current time: 2026-06-17T01:45:32-07:00] Inbound commune envelope at 2026-06-17 01:45:27 PDT:   machine: HFENDULEAM   project: spt-core   branch: v0.9.1-resolve-dotstem   head_sha: c448b321bef3ea4521…


[Current time: 2026-06-17T01:49:40-07:00]
Inbound echo_commune envelope at 2026-06-17T01:49:40-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.9.1-resolve-dotstem
  head_sha: c448b321bef3ea452184f974f2c6b547de058653

<live-context>
**v0.9.1-resolve-dotstem IN FLIGHT** @ c448b32. todlando building PRIORITY patch, perri holding.

**Two PREP-4 findings triaged:**
- F1: version skew (stale 0.8.x broker) — FIXED by `spt daemon stop`; perri CONFIRMED (SEEDED:14188). Fleet caveat: Seed-wire change needs full broker bounce (brain self-update alone insufficient).
- F2a: not a bug — `.exe` strip correct, doc gap only.
- F2b: REAL blocker — `normalize_basename` strips only trailing `.exe`; fails on `claude.exe.old.<ts>` (Claude Code updater renames in-use exe). Fix = stem-before-first-dot both sides.

**v0.9.1 scope (todlando building):**
1. F2b stem-before-first-dot matcher + unit test
2. Friendly seed-skew error (points to `spt daemon stop`)
3. F2a match-rule doc (MANIFEST.md + harness-contract)
4. KNOWN-HAZARD: daemon-state wire change needs broker restart (ADR-0004 no-terminate pillar)

**IMMEDIATE NEXT:** Gate todlando PR-ready → deployah v0.9.1 → ping perri → re-run bare /sptc:live → v0.3.0 ship on green = **PARITY ARC CLOSED**.

**Queued after v0.9.1 (todlando, separate branch):**
- REQ-PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam
- REQ-PICKER-2: project_history empty-loader fix (picker/mod.rs)
- ReadyAgent seed-path parity (ruling-C residual, design first)
- CLI-4 marker-audit humanize (28 ADAPTER_* markers)
</live-context>
<project-context>
END GOAL unchanged: legacy-owl parity (spt-core + claude-spt) → sptc plugin flips sptc→spt, retires owl. Three releases shipped this session: v0.8.3 (broker QUIC bound), v0.8.4 (ccs Windows spawn fix), v0.9.0 (harness-resolution / ADR-0021). All published, hash-checked.

PERRI VERIFY (0.9.0) → 2 spt-core findings, both triaged:
- FINDING 1 = version skew, FIXED. Broker (seed-control server, daemon.rs:287, resident anchor) was stale 0.8.x — only the brain self-updated to 0.9.0; old broker couldn't deser the new adapter-less Seed → "failed to fill whole buffer". Fix: `spt daemon stop` → fresh 0.9.0 broker. perri CONFIRMED (SEEDED:14188). Deployment caveat logged: a Seed-wire change needs a full broker restart (self-update restarts only the brain) — fleet nodes need one broker bounce for 0.9.0's agnostic seed.
- FINDING 2a = not a bug (matcher strips trailing .exe; host_binaries=["claude"] correct). Doc gap only.
- FINDING 2b = REAL matcher gap. normalize_basename (resolve.rs) strips only a TRAILING .exe → fails on `claude.exe.old.<ts>` (Claude Code's updater renames the in-use exe). Fix = normalize to STEM-BEFORE-FIRST-DOT, both sides. This is the blocker.

IN FLIGHT — v0.9.1 PATCH (todlando building, PRIORITY, blocks perri): (1) F2b stem-before-first-dot matcher + unit ("claude.exe.old.<ts>"→["claude"]), REQ-MANIFEST-8 robustness; (2) friendly seed-skew error replacing "failed to fill whole buffer" (points to `spt daemon stop`); (3) F2a match-rule doc (MANIFEST.md + harness-contract); (4) KNOWN-HAZARD (daemon-state wire change needs broker restart, not auto per ADR-0004 no-terminate pillar; additive-only forward discipline). Branch off main@v0.9.0, PATCH 0.9.0→0.9.1.

IMMEDIATE NEXT (resume): gate todlando's v0.9.1 PR-ready (code-read the matcher + unit + friendly-error scope) → deployah cuts v0.9.1 → PING perri → she re-runs bare /sptc:live (patched matcher handles .old.<ts>, no fresh claude needed) → ships claude-spt v0.3.0 on green = PARITY ARC CLOSED.

QUEUED AFTER v0.9.1 (todlando, separate branch, not blocking): picker REQ-PICKER-1 (4-state status line — gray OFFLINE / green ONLINE / amber "ONLINE - HARNESS ONLY" / blue "ONLINE + CONTROLLED"; APPROVED: stamp InfoJson.controllable Option<bool> at the establish seam — cmd_listen harness-hosted→Some(false), cmd_bind spt-hosted live_agent→Some(true), absent→amber default; derivation offline→gray / driven_by→blue / !controllable→amber / else green) + REQ-PICKER-2 (project_history empty-loader fix in picker/mod.rs). ALSO queued: ReadyAgent seed-path parity (ruling-C residual); CLI-4 marker-audit humanize (28 ADAPTER_* markers, only perri greps → confirm + --porcelain those).
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T08:49:35Z -->
2	**v0.9.1-resolve-dotstem IN FLIGHT** @ c448b32. todlando building PRIORITY patch, perri holding.
3
4	**Two PREP-4 findings triaged:**
5	- F1: version skew (stale 0.8.x broker) — FIXED by `spt daemon stop`; perri CONFIRMED (SEEDED:14188). Fleet caveat: Seed-wire change needs full broker bounce (brain self-update alone insufficient).
6	- F2a: not a bug — `.exe` strip correct, doc gap only.
7	- F2b: REAL blocker — `normalize_basename` strips only trailing `.exe`; fails on `claude.exe.old.<ts>` (Claude Code updater renames in-use exe). Fix = stem-before-first-dot both sides.
8
9	**v0.9.1 scope (todlando building):**
...
13	4. KNOWN-HAZARD: daemon-state wire change needs broker restart (ADR-0004 no-terminate pillar)
14
15	**IMMEDIATE NEXT:** Gate todlando PR-ready → deployah v0.9.1 → ping perri → re-run bare /sptc:live → v0.3.0 ship on green = **PARITY ARC CLOSED**.
16
17	**Queued after v0.9.1 (todlando, separate branch):**
18	- REQ-PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam
19	- REQ-PICKER-2: project_history empty-loader fix (picker/mod.rs)
20	- ReadyAgent seed-path parity (ruling-C residual, design first)
21	- CLI-4 marker-audit humanize (28 ADAPTER_* markers)


echo_commune ACK. State unchanged — todlando building, perri holding, doyle on-call.


[Current time: 2026-06-17T01:49:40-07:00] Inbound echo_commune envelope at 2026-06-17T01:49:40-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.9.1-resolve-dotstem   head_sha: c448b321bef…


[Current time: 2026-06-17T02:06:07-07:00]
Inbound echo_commune envelope at 2026-06-17T02:06:07-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.9.1-resolve-dotstem
  head_sha: 07158ca0e98a56ec1b6641a4869b56110aa6446f

<live-context>
**v0.9.1-resolve-dotstem: GATE-PASS + PUBLISH UNDERWAY**

PR#22 gated (5ec4688). Local bar 100% green (clippy, traceable, 27/27 resolve+startup units, all E2Es). CI both runners settled green (test, n1-gate Linux & Windows). CHANGELOG vetted spot-check PASS (both fixes accurate, no internal codes, public-facing CLI framing). deployah self-driving: merged → bump pushed → CI run 27677914552 → tag held for CI green → PUBLISH on approval. Hash-check + perri ping (PREP-4 closeout re-verify) queued post-publish.

**Picker defects: TRIAGE COMPLETE, RULINGS LOCKED**

Both operator-flagged defects scoped design-grounded, non-v0.9.1:
- **Defect 2 (node SHA)**: Confirmed picker-only regression. CONTEXT:650 mandates `LABEL (keyprefix…)`, not bare hex. Rest of codebase honors it; picker drops `node_label` via `resource_projection`→`ResourceRow` (registry.rs:331). Ruling: thread `node_label` into ResourceRow OR lookup `reg.node_labels()` in `subnet_rows()`, reuse canonical `format!("{l} ({}…)", key_prefix)` render.
- **Defect 1 (contradictory status)**: Not polarity bug — source-of-truth collision. Local rows = live `p.alive` (data.rs:83); Subnet rows = stale snapshots (wansend::load_snapshots, data.rs:128). Self-owned endpoints dual-list, sources disagree. CONTEXT:348-350 = one square per endpoint. Ruling: reconcile `is_local`-overlapping subnet rows to live roster.

**Picker slice: 2→4 REQs, registry-first at branch-open**

Post-v0.9.1 branch (~v0.10.0):
- PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam.
- PICKER-2: project_history empty-loader fix (picker/mod.rs).
- PICKER-3: self-owned subnet status reconcile-to-roster (Defect 1 ruling).
- PICKER-4: subnet node_label canonical render (Defect 2 ruling).

todlando: ACK'd rulings, watching main for v0.9.1 land, will open branch + mint REQs + ping doyle plan + REQ ids before code. No reply needed (self-drives).

**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.
</live-context>
<project-context>
v0.9.1 PATCH (counter 22, 5ec4688) merge-landed; CHANGELOG approved (both F2b stem-before-first-dot + F2 friendly seed-skew error, public-facing framing, no internal codes). Publish pipeline: CI running → tag on green → hash-check + perri PREP-4 re-verify → v0.3.0 parity arc closeout on green.

Picker branch plan locked (4 REQs, all design-grounded, rulings synced with todlando/doyle). No changes to queued post-v0.9.1 scope (REQ-PICKER-1/2 stable; REQ-PICKER-3/4 minted from operator findings, both grounded).
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T09:05:57Z -->
2	**v0.9.1-resolve-dotstem: GATE-PASS + PUBLISH UNDERWAY**
3
4	PR#22 gated (5ec4688). Local bar 100% green (clippy, traceable, 27/27 resolve+startup units, all E2Es). CI both runners settled green (test, n1-gate Linux & Windows). CHANGELOG vetted spot-check PASS (both fixes accurate, no internal codes, public-facing CLI framing). deployah self-driving: merged → bump pushed → CI run 27677914552 → tag held for CI green → PUBLISH on approval. Hash-check + perri ping (PREP-4 closeout re-verify) queued post-publish.
5
6	**Picker defects: TRIAGE COMPLETE, RULINGS LOCKED**
7
8	Both operator-flagged defects scoped design-grounded, non-v0.9.1:
9	- **Defect 2 (node SHA)**: Confirmed picker-only regression. CONTEXT:650 mandates `LABEL (keyprefix…)`, not bare hex. Rest of codebase honors it; picker drops `node_label` via `resource_projection`→`ResourceRow` (registry.rs:331). Ruling: thread `node_label` into ResourceRow OR lookup `reg.node_labels()` in `subnet_rows()`, reuse canonical `format!("{l} ({}…)", key_prefix)` render.
10	- **Defect 1 (contradictory status)**: Not polarity bug — source-of-truth collision. Local rows = live `p.alive` (data.rs:83); Subnet rows = stale snapshots (wansend::load_snapshots, data.rs:128). Self-owned endpoints dual-list, sources disagree. CONTEXT:348-350 = one square per endpoint. Ruling: reconcile `is_local`-overlapping subnet rows to live roster.
11
12	**Picker slice: 2→4 REQs, registry-first at branch-open**
13
14	Post-v0.9.1 branch (~v0.10.0):
15	- PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam.
16	- PICKER-2: project_history empty-loader fix (picker/mod.rs).
17	- PICKER-3: self-owned subnet status reconcile-to-roster (Defect 1 ruling).
18	- PICKER-4: subnet node_label canonical render (Defect 2 ruling).
19
20	todlando: ACK'd rulings, watching main for v0.9.1 land, will open branch + mint REQs + ping doyle plan + REQ ids before code. No reply needed (self-drives).
21
22	**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.


<!-- spt:source=llm spt:routed_at=2026-06-17T09:06:07Z -->
**v0.9.1-resolve-dotstem: GATE-PASS + PUBLISH UNDERWAY**

PR#22 gated (5ec4688). Local bar 100% green (clippy, traceable, 27/27 resolve+startup units, all E2Es). CI both runners settled green (test, n1-gate Linux & Windows). CHANGELOG vetted spot-check PASS (both fixes accurate, no internal codes, public-facing CLI framing). deployah self-driving: merged → bump pushed → CI run 27677914552 → tag held for CI green → PUBLISH on approval. Hash-check + perri ping (PREP-4 closeout re-verify) queued post-publish.

**Picker defects: TRIAGE COMPLETE, RULINGS LOCKED**

Both operator-flagged defects scoped design-grounded, non-v0.9.1:
- **Defect 2 (node SHA)**: Confirmed picker-only regression. CONTEXT:650 mandates `LABEL (keyprefix…)`, not bare hex. Rest of codebase honors it; picker drops `node_label` via `resource_projection`→`ResourceRow` (registry.rs:331). Ruling: thread `node_label` into ResourceRow OR lookup `reg.node_labels()` in `subnet_rows()`, reuse canonical `format!("{l} ({}…)", key_prefix)` render.
- **Defect 1 (contradictory status)**: Not polarity bug — source-of-truth collision. Local rows = live `p.alive` (data.rs:83); Subnet rows = stale snapshots (wansend::load_snapshots, data.rs:128). Self-owned endpoints dual-list, sources disagree. CONTEXT:348-350 = one square per endpoint. Ruling: reconcile `is_local`-overlapping subnet rows to live roster.

**Picker slice: 4 REQs, registry-first at branch-open (~v0.10.0):**
- PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam.
- PICKER-2: project_history empty-loader fix (picker/mod.rs).
- PICKER-3: self-owned subnet status reconcile-to-roster (Defect 1 ruling).
- PICKER-4: subnet node_label canonical render (Defect 2 ruling).

todlando: ACK'd rulings, watching main for v0.9.1 land, will open branch + mint REQs + ping doyle plan + REQ ids before code. No reply needed (self-drives).

**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.


<!-- spt:source=llm spt:routed_at=2026-06-17T09:06:07Z -->
**v0.9.1-resolve-dotstem: GATE-PASS + PUBLISH UNDERWAY**

PR#22 gated (5ec4688). Local bar 100% green (clippy, traceable, 27/27 resolve+startup units, all E2Es). CI both runners settled green (test, n1-gate Linux & Windows). CHANGELOG vetted spot-check PASS (both fixes accurate, no internal codes, public-facing CLI framing). deployah self-driving: merged → bump pushed → CI run 27677914552 → tag held for CI green → PUBLISH on approval. Hash-check + perri ping (PREP-4 closeout re-verify) queued post-publish.

**Picker defects: TRIAGE COMPLETE, RULINGS LOCKED**

Both operator-flagged defects scoped design-grounded, non-v0.9.1:
- **Defect 2 (node SHA)**: Confirmed picker-only regression. CONTEXT:650 mandates `LABEL (keyprefix…)`, not bare hex. Rest of codebase honors it; picker drops `node_label` via `resource_projection`→`ResourceRow` (registry.rs:331). Ruling: thread `node_label` into ResourceRow OR lookup `reg.node_labels()` in `subnet_rows()`, reuse canonical `format!("{l} ({}…)", key_prefix)` render.
- **Defect 1 (contradictory status)**: Not polarity bug — source-of-truth collision. Local rows = live `p.alive` (data.rs:83); Subnet rows = stale snapshots (wansend::load_snapshots, data.rs:128). Self-owned endpoints dual-list, sources disagree. CONTEXT:348-350 = one square per endpoint. Ruling: reconcile `is_local`-overlapping subnet rows to live roster.

**Picker slice: 4 REQs, registry-first at branch-open (~v0.10.0):**
- PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam.
- PICKER-2: project_history empty-loader fix (picker/mod.rs).
- PICKER-3: self-owned subnet status reconcile-to-roster (Defect 1 ruling).
- PICKER-4: subnet node_label canonical render (Defect 2 ruling).

todlando: ACK'd rulings, watching main for v0.9.1 land, will open branch + mint REQs + ping doyle plan + REQ ids before code. No reply needed (self-drives).

**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.

-**Picker slice: 2→4 REQs, registry-first at branch-open**

+**Picker slice: 4 REQs, registry-first at branch-open (~v0.10.0):**

-**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.

+**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.

<!-- spt:source=llm spt:routed_at=2026-06-17T09:05:57Z -->
**v0.9.1-resolve-dotstem: GATE-PASS + PUBLISH UNDERWAY**

PR#22 gated (5ec4688). Local bar 100% green (clippy, traceable, 27/27 resolve+startup units, all E2Es). CI both runners settled green (test, n1-gate Linux & Windows). CHANGELOG vetted spot-check PASS (both fixes accurate, no internal codes, public-facing CLI framing). deployah self-driving: merged → bump pushed → CI run 27677914552 → tag held for CI green → PUBLISH on approval. Hash-check + perri ping (PREP-4 closeout re-verify) queued post-publish.

**Picker defects: TRIAGE COMPLETE, RULINGS LOCKED**

Both operator-flagged defects scoped design-grounded, non-v0.9.1:
- **Defect 2 (node SHA)**: Confirmed picker-only regression. CONTEXT:650 mandates `LABEL (keyprefix…)`, not bare hex. Rest of codebase honors it; picker drops `node_label` via `resource_projection`→`ResourceRow` (registry.rs:331). Ruling: thread `node_label` into ResourceRow OR lookup `reg.node_labels()` in `subnet_rows()`, reuse canonical `format!("{l} ({}…)", key_prefix)` render.
- **Defect 1 (contradictory status)**: Not polarity bug — source-of-truth collision. Local rows = live `p.alive` (data.rs:83); Subnet rows = stale snapshots (wansend::load_snapshots, data.rs:128). Self-owned endpoints dual-list, sources disagree. CONTEXT:348-350 = one square per endpoint. Ruling: reconcile `is_local`-overlapping subnet rows to live roster.

**Picker slice: 2→4 REQs, registry-first at branch-open**

Post-v0.9.1 branch (~v0.10.0):
- PICKER-1: 4-state status (gray OFFLINE / green ONLINE / amber ONLINE-HARNESS-ONLY / blue ONLINE+CONTROLLED); InfoJson.controllable Option<bool> stamped at establish seam.
- PICKER-2: project_history empty-loader fix (picker/mod.rs).
- PICKER-3: self-owned subnet status reconcile-to-roster (Defect 1 ruling).
- PICKER-4: subnet node_label canonical render (Defect 2 ruling).

todlando: ACK'd rulings, watching main for v0.9.1 land, will open branch + mint REQs + ping doyle plan + REQ ids before code. No reply needed (self-drives).

**Waiting**: deployah publish (CI → tag → hash-check), todlando picker branch-open.


echo_commune ACK. Gate PASS, publish underway, 4 picker REQs locked, todlando watching for v0.9.1 land.


[Current time: 2026-06-17T02:06:07-07:00] Inbound echo_commune envelope at 2026-06-17T02:06:07-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.9.1-resolve-dotstem   head_sha: 07158ca0e98…


[Current time: 2026-06-17T02:34:11-07:00]
Inbound echo_commune envelope at 2026-06-17T02:34:11-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.10.0-picker-status
  head_sha: 969b06eee19b2b27b5ebc5a5c8dda252c7dca131

<live-context>
**v0.9.1-resolve-dotstem: PUBLISH COMPLETE → spt-claude-code v0.3.0 SHIPPING**

v0.9.1 publish pipeline fully settled: CI run 27677914552 green (both runners), tag created, hash-check + perri PREP-4 re-verify green. deployah's self-drive finished. Cleared for v0.3.0 ship by perri (repack .spt, commit bump+CHANGELOG, tag, GH release, cplugs 0.1.3 republish for session-start.sh change).

**PREP-4 FULLY VALIDATED — parity arc end-to-end GREEN on 0.9.1**
- F1 seed on fresh broker ✓
- F2b both exe paths (renamed .old.<ts> + plain claude.exe) bare-resolve ✓ (Discriminator 2 nailed it; env state was the initial blocker, not logic)
- Full bare live: persistent `spt api listen` → live_agent ready+alive + nested psyche + daemon-hosted ✓
- poll-stays-ready: Option A livehost.rs:282 gate empirically confirmed (ready_agent, no Psyche) ✓
- Cleanup correctly pid-scoped (disposable perch psyches killed, nested dirs rt-14188/rt-102212 "Device busy" inert, will GC on daemon cycle)

This closes the legacy-parity arc. perri v0.3.0 live + re-acquired confirm = arc fully closed.

**Picker slice: REQ-PICKER-1 DONE, 2/3/4 in-flight**
- REQ-PICKER-1 implemented @969b06e: InfoJson.controllable (serde-default N-1-safe) stamped at establish per refined ruling — listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only, never gateway). All binding seam units (8 in startup.rs) swept green.
- todlando pausing for context hygiene (long session: v0.9.0 + v0.9.1 shipped + PICKER-1 this run), resuming PICKER-2/3/4 (all data.rs, no seam risk), will ping PR-ready when all 4 land.

**Post-closeout findings queued (non-blocking)**:
(1) Deferred-binaries adapter: source-path GhReleaseManaged adapter w/ declared manifest doesn't serve host_binaries to resolver; also `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine (published release ships binaries).
(2) Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died during daemon bounces → Monitor exit 1, perri Self dropped from `owl list`. Will characterize spt-core-broker vs harness-Monitor layer.

**Waiting**: perri v0.3.0 live + arc-closed confirm, todlando PICKER-2/3/4 → PR-ready.
</live-context>
<project-context>
v0.9.1 PATCH (counter 22, 5ec4688) publish complete. CHANGELOG vetted (F2b stem-before-first-dot + F2 friendly seed-skew, public-facing framing). Picker branch plan holding (4 REQs locked): REQ-PICKER-1 done @969b06e, REQ-PICKER-2/3/4 in-flight, todlando pausing then resuming, PR-ready → v0.10.0 gate target.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T09:34:06Z -->
2	**v0.9.1-resolve-dotstem: PUBLISH COMPLETE → spt-claude-code v0.3.0 SHIPPING**
3
4	v0.9.1 publish pipeline fully settled: CI run 27677914552 green (both runners), tag created, hash-check + perri PREP-4 re-verify green. deployah's self-drive finished. Cleared for v0.3.0 ship by perri (repack .spt, commit bump+CHANGELOG, tag, GH release, cplugs 0.1.3 republish for session-start.sh change).
5
6	**PREP-4 FULLY VALIDATED — parity arc end-to-end GREEN on 0.9.1**
7	- F1 seed on fresh broker ✓
8	- F2b both exe paths (renamed .old.<ts> + plain claude.exe) bare-resolve ✓ (Discriminator 2 nailed it; env state was the initial blocker, not logic)
9	- Full bare live: persistent `spt api listen` → live_agent ready+alive + nested psyche + daemon-hosted ✓
10	- poll-stays-ready: Option A livehost.rs:282 gate empirically confirmed (ready_agent, no Psyche) ✓
11	- Cleanup correctly pid-scoped (disposable perch psyches killed, nested dirs rt-14188/rt-102212 "Device busy" inert, will GC on daemon cycle)
12
13	This closes the legacy-parity arc. perri v0.3.0 live + re-acquired confirm = arc fully closed.
14
15	**Picker slice: REQ-PICKER-1 DONE, 2/3/4 in-flight**
16	- REQ-PICKER-1 implemented @969b06e: InfoJson.controllable (serde-default N-1-safe) stamped at establish per refined ruling — listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only, never gateway). All binding seam units (8 in startup.rs) swept green.
17	- todlando pausing for context hygiene (long session: v0.9.0 + v0.9.1 shipped + PICKER-1 this run), resuming PICKER-2/3/4 (all data.rs, no seam risk), will ping PR-ready when all 4 land.
18
19	**Post-closeout findings queued (non-blocking)**:
20	(1) Deferred-binaries adapter: source-path GhReleaseManaged adapter w/ declared manifest doesn't serve host_binaries to resolver; also `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine (published release ships binaries).
21	(2) Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died during daemon bounces → Monitor exit 1, perri Self dropped from `owl list`. Will characterize spt-core-broker vs harness-Monitor layer.
22
23	**Waiting**: perri v0.3.0 live + arc-closed confirm, todlando PICKER-2/3/4 → PR-ready.


State advanced significantly. Branch is now v0.10.0-picker-status @ 969b06e. PREP-4 parity arc CLOSED. Need to update live_context.md.


<!-- spt:source=llm spt:routed_at=2026-06-17T09:34:11Z -->
**LEGACY-PARITY ARC CLOSED. v0.9.1 + spt-claude-code v0.3.0 SHIPPED.**

PREP-4 fully validated on 0.9.1: bare seed ✓, both exe paths (plain + .old.<ts>) ✓, full bare live ✓, Option A gate empirically confirmed ✓. perri v0.3.0 live + re-acquired confirm = arc fully closed.

**Branch: v0.10.0-picker-status @ 969b06e**

REQ-PICKER-1 DONE @969b06e: InfoJson.controllable (serde-default N-1-safe), listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only). 8 binding-seam units swept green.

todlando pausing (context hygiene), resuming PICKER-2/3/4 (all data.rs, no seam risk). Will ping PR-ready when all 4 land.

**Post-closeout findings queued (non-blocking):**
1. Deferred-binaries adapter: GhReleaseManaged w/ declared manifest doesn't serve host_binaries; `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine.
2. Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died on daemon bounces → Monitor exit 1, dropped from `owl list`. Needs characterization (spt-core-broker vs harness-Monitor layer).

**Waiting**: todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.


<!-- spt:source=llm spt:routed_at=2026-06-17T09:34:11Z -->
**LEGACY-PARITY ARC CLOSED. v0.9.1 + spt-claude-code v0.3.0 SHIPPED.**

PREP-4 fully validated on 0.9.1: bare seed ✓, both exe paths (plain + .old.<ts>) ✓, full bare live ✓, Option A gate empirically confirmed ✓. perri v0.3.0 live + re-acquired confirm = arc fully closed.

**Branch: v0.10.0-picker-status @ 969b06e**

REQ-PICKER-1 DONE @969b06e: InfoJson.controllable (serde-default N-1-safe), listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only). 8 binding-seam units swept green.

todlando pausing (context hygiene), resuming PICKER-2/3/4 (all data.rs, no seam risk). Will ping PR-ready when all 4 land.

**Post-closeout findings queued (non-blocking):**
1. Deferred-binaries adapter: GhReleaseManaged w/ declared manifest doesn't serve host_binaries; `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine.
2. Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died on daemon bounces → Monitor exit 1, dropped from `owl list`. Needs characterization (spt-core-broker vs harness-Monitor layer).

**Waiting**: todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.

-**v0.9.1-resolve-dotstem: PUBLISH COMPLETE → spt-claude-code v0.3.0 SHIPPING**

+**LEGACY-PARITY ARC CLOSED. v0.9.1 + spt-claude-code v0.3.0 SHIPPED.**

-v0.9.1 publish pipeline fully settled: CI run 27677914552 green (both runners), tag created, hash-check + perri PREP-4 re-verify green. deployah's self-drive finished. Cleared for v0.3.0 ship by perri (repack .spt, commit bump+CHANGELOG, tag, GH release, cplugs 0.1.3 republish for session-start.sh change).

+PREP-4 fully validated on 0.9.1: bare seed ✓, both exe paths (plain + .old.<ts>) ✓, full bare live ✓, Option A gate empirically confirmed ✓. perri v0.3.0 live + re-acquired confirm = arc fully closed.

-**PREP-4 FULLY VALIDATED — parity arc end-to-end GREEN on 0.9.1**

-- F2b both exe paths (renamed .old.<ts> + plain claude.exe) bare-resolve ✓ (Discriminator 2 nailed it; env state was the initial blocker, not logic)

-- Full bare live: persistent `spt api listen` → live_agent ready+alive + nested psyche + daemon-hosted ✓

-- poll-stays-ready: Option A livehost.rs:282 gate empirically confirmed (ready_agent, no Psyche) ✓

-- Cleanup correctly pid-scoped (disposable perch psyches killed, nested dirs rt-14188/rt-102212 "Device busy" inert, will GC on daemon cycle)

+**Branch: v0.10.0-picker-status @ 969b06e**

-This closes the legacy-parity arc. perri v0.3.0 live + re-acquired confirm = arc fully closed.

+REQ-PICKER-1 DONE @969b06e: InfoJson.controllable (serde-default N-1-safe), listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only). 8 binding-seam units swept green.

-**Picker slice: REQ-PICKER-1 DONE, 2/3/4 in-flight**

-- REQ-PICKER-1 implemented @969b06e: InfoJson.controllable (serde-default N-1-safe) stamped at establish per refined ruling — listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only, never gateway). All binding seam units (8 in startup.rs) swept green.

-- todlando pausing for context hygiene (long session: v0.9.0 + v0.9.1 shipped + PICKER-1 this run), resuming PICKER-2/3/4 (all data.rs, no seam risk), will ping PR-ready when all 4 land.

+todlando pausing (context hygiene), resuming PICKER-2/3/4 (all data.rs, no seam risk). Will ping PR-ready when all 4 land.

-**Post-closeout findings queued (non-blocking)**:

-(1) Deferred-binaries adapter: source-path GhReleaseManaged adapter w/ declared manifest doesn't serve host_binaries to resolver; also `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine (published release ships binaries).

-(2) Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died during daemon bounces → Monitor exit 1, perri Self dropped from `owl list`. Will characterize spt-core-broker vs harness-Monitor layer.

+**Post-closeout findings queued (non-blocking):**

+1. Deferred-binaries adapter: GhReleaseManaged w/ declared manifest doesn't serve host_binaries; `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine.

+2. Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died on daemon bounces → Monitor exit 1, dropped from `owl list`. Needs characterization (spt-core-broker vs harness-Monitor layer).

-**Waiting**: perri v0.3.0 live + arc-closed confirm, todlando PICKER-2/3/4 → PR-ready.

+**Waiting**: todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.

<!-- spt:source=llm spt:routed_at=2026-06-17T09:34:06Z -->
**v0.9.1-resolve-dotstem: PUBLISH COMPLETE → spt-claude-code v0.3.0 SHIPPING**

v0.9.1 publish pipeline fully settled: CI run 27677914552 green (both runners), tag created, hash-check + perri PREP-4 re-verify green. deployah's self-drive finished. Cleared for v0.3.0 ship by perri (repack .spt, commit bump+CHANGELOG, tag, GH release, cplugs 0.1.3 republish for session-start.sh change).

**PREP-4 FULLY VALIDATED — parity arc end-to-end GREEN on 0.9.1**
- F1 seed on fresh broker ✓
- F2b both exe paths (renamed .old.<ts> + plain claude.exe) bare-resolve ✓ (Discriminator 2 nailed it; env state was the initial blocker, not logic)
- Full bare live: persistent `spt api listen` → live_agent ready+alive + nested psyche + daemon-hosted ✓
- poll-stays-ready: Option A livehost.rs:282 gate empirically confirmed (ready_agent, no Psyche) ✓
- Cleanup correctly pid-scoped (disposable perch psyches killed, nested dirs rt-14188/rt-102212 "Device busy" inert, will GC on daemon cycle)

This closes the legacy-parity arc. perri v0.3.0 live + re-acquired confirm = arc fully closed.

**Picker slice: REQ-PICKER-1 DONE, 2/3/4 in-flight**
- REQ-PICKER-1 implemented @969b06e: InfoJson.controllable (serde-default N-1-safe) stamped at establish per refined ruling — listen→Some(false), bind live_agent→Some(true), bind gateway→None. 4-state TYPE-GATED (amber LiveAgent-only, never gateway). All binding seam units (8 in startup.rs) swept green.
- todlando pausing for context hygiene (long session: v0.9.0 + v0.9.1 shipped + PICKER-1 this run), resuming PICKER-2/3/4 (all data.rs, no seam risk), will ping PR-ready when all 4 land.

**Post-closeout findings queued (non-blocking)**:
(1) Deferred-binaries adapter: source-path GhReleaseManaged adapter w/ declared manifest doesn't serve host_binaries to resolver; also `spt adapter use` os-error-2 in that state. Real install via .spt/extracted-dir works fine (published release ships binaries).
(2) Poll-listener-died-on-daemon-bounce: perri's legacy-owl poll listener died during daemon bounces → Monitor exit 1, perri Self dropped from `owl list`. Will characterize spt-core-broker vs harness-Monitor layer.

**Waiting**: perri v0.3.0 live + arc-closed confirm, todlando PICKER-2/3/4 → PR-ready.


echo_commune ACK. Parity arc closed, v0.10.0-picker-status in-flight, PICKER-1 done, todlando resuming 2/3/4.


[Current time: 2026-06-17T02:34:11-07:00] Inbound echo_commune envelope at 2026-06-17T02:34:11-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.10.0-picker-status   head_sha: 969b06eee19b…


[Current time: 2026-06-17T02:44:03-07:00]
Inbound commune envelope at 2026-06-17 02:43:57 PDT:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.10.0-picker-status
  head_sha: 969b06eee19b2b27b5ebc5a5c8dda252c7dca131

<live-context>
**PARITY ARC FULLY CLOSED** (snapshot delta: was "waiting perri v0.3.0 confirm" → now DONE). spt-claude-code v0.3.0 LIVE + dogfood-verified end-to-end: perri re-acquired the PUBLISHED .spt via `adapter add --release --tag v0.3.0` → binaries extracted → `adapter use claude-spt` works → bare `spt api listen` on the renamed claude.exe.old.<ts> pid → SEEDED/BOUND/READY, no --adapter. cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 (legacy-owl parity) DONE; next = sptc→spt flip (blocked by live legacy owl).

**Both post-closeout findings TRIAGED (delta: were "queued/will characterize" → now dispositioned):**
- FINDING A = REAL spt-core robustness gap, root-caused. registry.rs `manifest_dir` (146): Pointer-mode (delegated/GhReleaseManaged) reads the manifest LIVE from source_dir (149); a deferred/un-extracted install → load_manifest fails → registered() (410, filter_map ok()) SILENTLY DROPS the adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. NON-blocking. QUEUED: mint REQ-HAZARD registry-first → todlando after picker → I gate.
- FINDING B = NOT spt-core. Legacy-owl 1.11.25 listener (separate daemon); the "sessions log seal failed: git failed (continuing)" line is non-fatal by its own text = red herring for the poll exit-1. DORMANT — re-open only if repro'd on a clean spt-core-only setup.

Operator asked to resend the triage to perri (listener was flaky / re-armed several times) — resending.
</live-context>
<project-context>
spt-core: parity-contribution releases DONE (v0.8.3→v0.8.4→v0.9.0→v0.9.1, publisher leg 16x clean, counter 7-22). v0.9.1 = stem-before-first-dot host-binary matcher + seed wire-skew hint (KH 7.9 / REQ-HAZARD-BROKER-SEED-WIRE-SKEW), validated live by perri's renamed-exe dogfood.

NEXT spt-core work:
1. PICKER v0.10.0 (branch v0.10.0-picker-status @969b06e): PICKER-1 done (type-gated 4-state, binding seam swept). todlando building PICKER-4→3→2 (all data.rs, no seam risk) → PR-ready → I GATE (clippy workspace + traceable + picker/endpoint-list units + docs-drift).
2. FINDING A REQ-HAZARD mint (Pointer-mode deferred-manifest silent-drop → clear diagnostic at resolver + `adapter use`, maybe eager manifest copy at register). registry.rs:146/149/410. Detail in memory parity-arc-closed.md.

MEMORY.md index OVER size limit — trim pass owed (move detail from long published-entry lines into topic files).
</project-context>


1	<!-- spt:source=direct spt:routed_at=2026-06-17T09:43:57Z -->
2	**PARITY ARC FULLY CLOSED** (snapshot delta: was "waiting perri v0.3.0 confirm" → now DONE). spt-claude-code v0.3.0 LIVE + dogfood-verified end-to-end: perri re-acquired the PUBLISHED .spt via `adapter add --release --tag v0.3.0` → binaries extracted → `adapter use claude-spt` works → bare `spt api listen` on the renamed claude.exe.old.<ts> pid → SEEDED/BOUND/READY, no --adapter. cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 (legacy-owl parity) DONE; next = sptc→spt flip (blocked by live legacy owl).
3
4	**Both post-closeout findings TRIAGED (delta: were "queued/will characterize" → now dispositioned):**
5	- FINDING A = REAL spt-core robustness gap, root-caused. registry.rs `manifest_dir` (146): Pointer-mode (delegated/GhReleaseManaged) reads the manifest LIVE from source_dir (149); a deferred/un-extracted install → load_manifest fails → registered() (410, filter_map ok()) SILENTLY DROPS the adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. NON-blocking. QUEUED: mint REQ-HAZARD registry-first → todlando after picker → I gate.
6	- FINDING B = NOT spt-core. Legacy-owl 1.11.25 listener (separate daemon); the "sessions log seal failed: git failed (continuing)" line is non-fatal by its own text = red herring for the poll exit-1. DORMANT — re-open only if repro'd on a clean spt-core-only setup.
7
8	Operator asked to resend the triage to perri (listener was flaky / re-armed several times) — resending.


State updated - parity arc fully closed, findings triaged. Branch still v0.10.0-picker-status @ 969b06e. Just update context.


<!-- spt:source=llm spt:routed_at=2026-06-17T09:44:03Z -->
**PARITY ARC FULLY CLOSED.** spt-claude-code v0.3.0 dogfood-verified end-to-end (re-acquired published .spt, binaries extracted, bare listen on renamed .old.<ts> pid → SEEDED/BOUND/READY, no --adapter). cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 DONE; next = sptc→spt flip (blocked by live legacy owl).

**Branch: v0.10.0-picker-status @ 969b06e**

PICKER-1 DONE. todlando building PICKER-4→3→2 (all data.rs, no seam risk) → PR-ready → doyle gates.

**Post-closeout findings TRIAGED:**
- FINDING A (REAL gap): registry.rs:146/149/410 — Pointer-mode reads manifest LIVE from source_dir; un-extracted install → load_manifest fails → registered() filter_map silently drops adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. QUEUED: mint REQ-HAZARD registry-first → todlando after picker.
- FINDING B (NOT spt-core): legacy-owl 1.11.25 listener; "sessions log seal failed: git failed (continuing)" = non-fatal red herring. DORMANT.

**Waiting**: todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.


<!-- spt:source=llm spt:routed_at=2026-06-17T09:44:03Z -->
**PARITY ARC FULLY CLOSED.** spt-claude-code v0.3.0 dogfood-verified end-to-end (re-acquired published .spt, binaries extracted, bare listen on renamed .old.<ts> pid → SEEDED/BOUND/READY, no --adapter). cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 DONE; next = sptc→spt flip (blocked by live legacy owl).

**Branch: v0.10.0-picker-status @ 969b06e**

PICKER-1 DONE. todlando building PICKER-4→3→2 (all data.rs, no seam risk) → PR-ready → doyle gates.

**Post-closeout findings TRIAGED:**
- FINDING A (REAL gap): registry.rs:146/149/410 — Pointer-mode reads manifest LIVE from source_dir; un-extracted install → load_manifest fails → registered() filter_map silently drops adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. QUEUED: mint REQ-HAZARD registry-first → todlando after picker.
- FINDING B (NOT spt-core): legacy-owl 1.11.25 listener; "sessions log seal failed: git failed (continuing)" = non-fatal red herring. DORMANT.

**Waiting**: todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.

-**PARITY ARC FULLY CLOSED** (snapshot delta: was "waiting perri v0.3.0 confirm" → now DONE). spt-claude-code v0.3.0 LIVE + dogfood-verified end-to-end: perri re-acquired the PUBLISHED .spt via `adapter add --release --tag v0.3.0` → binaries extracted → `adapter use claude-spt` works → bare `spt api listen` on the renamed claude.exe.old.<ts> pid → SEEDED/BOUND/READY, no --adapter. cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 (legacy-owl parity) DONE; next = sptc→spt flip (blocked by live legacy owl).

+**PARITY ARC FULLY CLOSED.** spt-claude-code v0.3.0 dogfood-verified end-to-end (re-acquired published .spt, binaries extracted, bare listen on renamed .old.<ts> pid → SEEDED/BOUND/READY, no --adapter). cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 DONE; next = sptc→spt flip (blocked by live legacy owl).

-**Both post-closeout findings TRIAGED (delta: were "queued/will characterize" → now dispositioned):**

-- FINDING A = REAL spt-core robustness gap, root-caused. registry.rs `manifest_dir` (146): Pointer-mode (delegated/GhReleaseManaged) reads the manifest LIVE from source_dir (149); a deferred/un-extracted install → load_manifest fails → registered() (410, filter_map ok()) SILENTLY DROPS the adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. NON-blocking. QUEUED: mint REQ-HAZARD registry-first → todlando after picker → I gate.

-- FINDING B = NOT spt-core. Legacy-owl 1.11.25 listener (separate daemon); the "sessions log seal failed: git failed (continuing)" line is non-fatal by its own text = red herring for the poll exit-1. DORMANT — re-open only if repro'd on a clean spt-core-only setup.

+**Branch: v0.10.0-picker-status @ 969b06e**

-Operator asked to resend the triage to perri (listener was flaky / re-armed several times) — resending.

+PICKER-1 DONE. todlando building PICKER-4→3→2 (all data.rs, no seam risk) → PR-ready → doyle gates.

+- FINDING A (REAL gap): registry.rs:146/149/410 — Pointer-mode reads manifest LIVE from source_dir; un-extracted install → load_manifest fails → registered() filter_map silently drops adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. QUEUED: mint REQ-HAZARD registry-first → todlando after picker.

+- FINDING B (NOT spt-core): legacy-owl 1.11.25 listener; "sessions log seal failed: git failed (continuing)" = non-fatal red herring. DORMANT.

<!-- spt:source=direct spt:routed_at=2026-06-17T09:43:57Z -->
**PARITY ARC FULLY CLOSED** (snapshot delta: was "waiting perri v0.3.0 confirm" → now DONE). spt-claude-code v0.3.0 LIVE + dogfood-verified end-to-end: perri re-acquired the PUBLISHED .spt via `adapter add --release --tag v0.3.0` → binaries extracted → `adapter use claude-spt` works → bare `spt api listen` on the renamed claude.exe.old.<ts> pid → SEEDED/BOUND/READY, no --adapter. cplugs sptc 0.1.3 pushed (43aa021). End-goal phase 1 (legacy-owl parity) DONE; next = sptc→spt flip (blocked by live legacy owl).

**Both post-closeout findings TRIAGED (delta: were "queued/will characterize" → now dispositioned):**
- FINDING A = REAL spt-core robustness gap, root-caused. registry.rs `manifest_dir` (146): Pointer-mode (delegated/GhReleaseManaged) reads the manifest LIVE from source_dir (149); a deferred/un-extracted install → load_manifest fails → registered() (410, filter_map ok()) SILENTLY DROPS the adapter → ADAPTER_UNRESOLVED + cryptic os-error-2 on `adapter use`. NON-blocking. QUEUED: mint REQ-HAZARD registry-first → todlando after picker → I gate.
- FINDING B = NOT spt-core. Legacy-owl 1.11.25 listener (separate daemon); the "sessions log seal failed: git failed (continuing)" line is non-fatal by its own text = red herring for the poll exit-1. DORMANT — re-open only if repro'd on a clean spt-core-only setup.

Operator asked to resend the triage to perri (listener was flaky / re-armed several times) — resending.


Commune ACK. Parity arc DONE, findings triaged, todlando building PICKER-2/3/4.


[Current time: 2026-06-17T02:44:03-07:00] Inbound commune envelope at 2026-06-17 02:43:57 PDT:   machine: HFENDULEAM   project: spt-core   branch: v0.10.0-picker-status   head_sha: 969b06eee19b2b27b5e…


[Current time: 2026-06-17T02:52:58-07:00]
Inbound echo_commune envelope at 2026-06-17T02:52:58-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.10.0-picker-status
  head_sha: 969b06eee19b2b27b5ebc5a5c8dda252c7dca131

<live-context>
**PARITY ARC CLOSURE CONFIRMED** — spt-claude-code v0.3.0 dogfood-validated fully end-to-end (re-acquired published .spt → binaries extracted → bare `spt api listen` on renamed claude.exe.old.<ts> pid → SEEDED/BOUND/READY, no --adapter; spt-core 0.9.1 live). Session closure milestone achieved; sptc→spt flip blocked by live legacy owl retirement.

**Finding A fully root-caused & triaged:**
- Pointer-mode adapter (delegated/GhReleaseManaged) reads manifest **live** from source_dir (registry.rs:146–149)
- Deferred/un-extracted install → `load_manifest()` fails → `registered()` (line 410) **silently drops** via filter_map → ADAPTER_UNRESOLVED on next `adapter use` → bare os-error-2
- **Queued:** REQ-HAZARD registry-first mint → todlando (after PICKER) → I gate; fix = clear diagnostic at resolver + `adapter use`, maybe eager manifest copy at register

**Finding B confirmed non-blocking:** legacy-owl 1.11.25 listener; `git failed (continuing)` = non-fatal red herring. Separate daemon, not spt-core scope. Dormant.

**State:** Awaiting todlando PICKER-4→3→2 (all data.rs, no seam risk) → PR-ready → gate (clippy workspace + traceable + picker/endpoint-list units + docs-drift; seam already swept for PICKER-1).

Memory trimming pass owed (MEMORY.md index >size limit).
</live-context>
<project-context>
Branch v0.10.0-picker-status remains active. PICKER-1 complete (type-gated 4-state, binding seam swept). REQ-HAZARD for Finding A deferred to post-picker queue.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T09:52:52Z -->
2	**PARITY ARC CLOSURE CONFIRMED** — spt-claude-code v0.3.0 dogfood-validated fully end-to-end (re-acquired published .spt → binaries extracted → bare `spt api listen` on renamed claude.exe.old.<ts> pid → SEEDED/BOUND/READY, no --adapter; spt-core 0.9.1 live). Session closure milestone achieved; sptc→spt flip blocked by live legacy owl retirement.
3
4	**Finding A fully root-caused & triaged:**
5	- Pointer-mode adapter (delegated/GhReleaseManaged) reads manifest **live** from source_dir (registry.rs:146–149)
6	- Deferred/un-extracted install → `load_manifest()` fails → `registered()` (line 410) **silently drops** via filter_map → ADAPTER_UNRESOLVED on next `adapter use` → bare os-error-2
7	- **Queued:** REQ-HAZARD registry-first mint → todlando (after PICKER) → I gate; fix = clear diagnostic at resolver + `adapter use`, maybe eager manifest copy at register
8
9	**Finding B confirmed non-blocking:** legacy-owl 1.11.25 listener; `git failed (continuing)` = non-fatal red herring. Separate daemon, not spt-core scope. Dormant.
10
11	**State:** Awaiting todlando PICKER-4→3→2 (all data.rs, no seam risk) → PR-ready → gate (clippy workspace + traceable + picker/endpoint-list units + docs-drift; seam already swept for PICKER-1).
12
13	Memory trimming pass owed (MEMORY.md index >size limit).


echo_commune ACK. State unchanged — todlando building PICKER-4→3→2, doyle holding for PR-ready.


[Current time: 2026-06-17T02:52:58-07:00] Inbound echo_commune envelope at 2026-06-17T02:52:58-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.10.0-picker-status   head_sha: 969b06eee19b…


[Current time: 2026-06-17T03:14:37-07:00]
Inbound echo_commune envelope at 2026-06-17T03:14:37-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.10.0-picker-status
  head_sha: 9e5cb8b415763fc67f114890b2ca8fdbedb15386

<live-context>
Session v0.10.0-picker-status active. Investigated `cmd_endpoint_run` bringup/messaging-listener model. Found wall-b Claude Code PTY spawned but **never bound a perch** — no perch dir, no info.json, no ready file. Confirmed via owlery path search (other perches exist, path correct). harness self-registers via spawned SessionStart hook firing seed/listen (adapter/sptc wiring, not endpoint-run itself). wall-b binding failure isolated to session initialization — perch never materialized.
</live-context>
<project-context>
v0.10.0-picker-status branch: wall-b perch binding failure identified (perch dir missing entirely). PICKER-1 complete (type-gated 4-state, binding seam swept). REQ-HAZARD & Finding A/B remain queued post-PICKER completion. Session debugging live.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T10:14:31Z -->
2	Session v0.10.0-picker-status active. Investigated `cmd_endpoint_run` bringup/messaging-listener model. Found wall-b Claude Code PTY spawned but **never bound a perch** — no perch dir, no info.json, no ready file. Confirmed via owlery path search (other perches exist, path correct). harness self-registers via spawned SessionStart hook firing seed/listen (adapter/sptc wiring, not endpoint-run itself). wall-b binding failure isolated to session initialization — perch never materialized.


Branch head advanced to 9e5cb8b. New investigation: wall-b perch binding failure. Just ACK and update context.


<!-- spt:source=llm spt:routed_at=2026-06-17T10:14:37Z -->
**Branch: v0.10.0-picker-status @ 9e5cb8b**

**Active investigation: wall-b perch binding failure.** Claude Code PTY spawned via `cmd_endpoint_run` but perch never materialized — no perch dir, no info.json, no ready file. Other perches exist (owlery path correct). Harness self-registers via SessionStart hook → seed/listen (adapter/sptc wiring); endpoint-run itself is not the registrar. Binding failure isolated to session initialization.

**PICKER status:** PICKER-1 done (type-gated 4-state, binding seam swept @969b06e). todlando building PICKER-4→3→2. PR-ready pending.

**Queued post-picker:**
- REQ-HAZARD registry-first (Finding A: Pointer-mode silent adapter-drop, registry.rs:146/149/410)
- Finding B dormant (legacy-owl listener, non-spt-core)

**Waiting**: wall-b investigation resolution + todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.


<!-- spt:source=llm spt:routed_at=2026-06-17T10:14:37Z -->
**Branch: v0.10.0-picker-status @ 9e5cb8b**

**Active investigation: wall-b perch binding failure.** Claude Code PTY spawned via `cmd_endpoint_run` but perch never materialized — no perch dir, no info.json, no ready file. Other perches exist (owlery path correct). Harness self-registers via SessionStart hook → seed/listen (adapter/sptc wiring); endpoint-run itself is not the registrar. Binding failure isolated to session initialization.

**PICKER status:** PICKER-1 done (type-gated 4-state, binding seam swept @969b06e). todlando building PICKER-4→3→2. PR-ready pending.

**Queued post-picker:**
- REQ-HAZARD registry-first (Finding A: Pointer-mode silent adapter-drop, registry.rs:146/149/410)
- Finding B dormant (legacy-owl listener, non-spt-core)

**Waiting**: wall-b investigation resolution + todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.

-Session v0.10.0-picker-status active. Investigated `cmd_endpoint_run` bringup/messaging-listener model. Found wall-b Claude Code PTY spawned but **never bound a perch** — no perch dir, no info.json, no ready file. Confirmed via owlery path search (other perches exist, path correct). harness self-registers via spawned SessionStart hook firing seed/listen (adapter/sptc wiring, not endpoint-run itself). wall-b binding failure isolated to session initialization — perch never materialized.

+**Branch: v0.10.0-picker-status @ 9e5cb8b**

+**Active investigation: wall-b perch binding failure.** Claude Code PTY spawned via `cmd_endpoint_run` but perch never materialized — no perch dir, no info.json, no ready file. Other perches exist (owlery path correct). Harness self-registers via SessionStart hook → seed/listen (adapter/sptc wiring); endpoint-run itself is not the registrar. Binding failure isolated to session initialization.

+**PICKER status:** PICKER-1 done (type-gated 4-state, binding seam swept @969b06e). todlando building PICKER-4→3→2. PR-ready pending.

+- REQ-HAZARD registry-first (Finding A: Pointer-mode silent adapter-drop, registry.rs:146/149/410)

+- Finding B dormant (legacy-owl listener, non-spt-core)

+**Waiting**: wall-b investigation resolution + todlando PICKER-2/3/4 → PR-ready → v0.10.0 gate.

<!-- spt:source=llm spt:routed_at=2026-06-17T10:14:31Z -->
Session v0.10.0-picker-status active. Investigated `cmd_endpoint_run` bringup/messaging-listener model. Found wall-b Claude Code PTY spawned but **never bound a perch** — no perch dir, no info.json, no ready file. Confirmed via owlery path search (other perches exist, path correct). harness self-registers via spawned SessionStart hook firing seed/listen (adapter/sptc wiring, not endpoint-run itself). wall-b binding failure isolated to session initialization — perch never materialized.


echo_commune ACK. wall-b perch-binding investigation active, PICKER-2/3/4 building in parallel.


[Current time: 2026-06-17T03:14:37-07:00] Inbound echo_commune envelope at 2026-06-17T03:14:37-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.10.0-picker-status   head_sha: 9e5cb8b41576…


[Current time: 2026-06-17T03:30:58-07:00]
Inbound echo_commune envelope at 2026-06-17T03:30:57-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.10.0-picker-status
  head_sha: 9e5cb8b415763fc67f114890b2ca8fdbedb15386

<live-context>
Session v0.10.0-picker-status — **MAJOR PROGRESS ON ALL FRONTS**.

**wall-b ROOT-CAUSE COMPLETE (both halves):**
- Adapter (perri): bind hook produced zero perch; `endpoint run` never E2E-tested. Communing/clearing; plan locked (CC-LAUNCHER-BIND-PLAN.md).
- spt-core (doyle verified, file:line): `api bind` (startup.rs:441) registers **no message-listener** → `deliver.rs:97` resolve_address returns None → inbound `spt send` **silently spools**. Broker dispatch_input only receives from brain, never from inbound message. Endpoint reads "online" (via `ready` marker) but not live-reachable.

**Three spt-core findings MINTED for next milestone** (non-blocking, doyle gates):
1. **REQ-SEND-SPT-HOSTED** — daemon delivers inbound `spt send` to spt-hosted endpoints (wall-b spt-core half; daemon should PTY-inject via InputReq or equivalent).
2. **REQ-HAZARD-RC-EOF** — rc raw-EOF PTY crash (Finding C, rc.rs:352-362 classify-EOF + reconnect + 2 side-obs).
3. **REQ-HAZARD-DEFERRED-MANIFEST** — pointer-mode adapter silent-drop on missing live manifest (Finding A; diagnostic flag + maybe eager copy at register).

**v0.10.0 PUBLISHED & VERIFIED:**
- deployah counter 23, self-drive clean. One in-flight accuracy fix (picker-only overclaim, doyle spot-check caught pre-tag, no retag).
- Hash-check PASS (linux e146f64b…, win bd96873b…).
- Five releases this session: v0.8.3→0.8.4→0.9.0→0.9.1→0.10.0.

**Parity arc CLOSED** — spt-claude-code v0.3.0 dogfood-verified on spt-core 0.9.1.

**Workaround for wall-b:** `/sptc:live wall-b` inside its PTY (actively listening). Post-perri fix, `endpoint run` alone binds; full `spt send` reachability post-REQ-SEND-SPT-HOSTED.

**Standing by (external):** perri's bind root-cause ping · todlando next-milestone branch-open (3 findings) → doyle gates.
</live-context>
<project-context>
v0.10.0-picker-status: PICKER-1 complete. wall-b root-caused + dispatched (REQ-SEND-SPT-HOSTED spt-core half minted; perri owns adapter fix + int test). REQ-HAZARD-RC-EOF + REQ-HAZARD-DEFERRED-MANIFEST minted alongside. v0.10.0 shipped & verified. Parity arc closed. Next: perri's adapter fix lands → v0.3.0 unblocked; todlando branch opens → findings gated to next milestone.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T10:30:54Z -->
2	Session v0.10.0-picker-status — **MAJOR PROGRESS ON ALL FRONTS**.
3
4	**wall-b ROOT-CAUSE COMPLETE (both halves):**
5	- Adapter (perri): bind hook produced zero perch; `endpoint run` never E2E-tested. Communing/clearing; plan locked (CC-LAUNCHER-BIND-PLAN.md).
6	- spt-core (doyle verified, file:line): `api bind` (startup.rs:441) registers **no message-listener** → `deliver.rs:97` resolve_address returns None → inbound `spt send` **silently spools**. Broker dispatch_input only receives from brain, never from inbound message. Endpoint reads "online" (via `ready` marker) but not live-reachable.
7
8	**Three spt-core findings MINTED for next milestone** (non-blocking, doyle gates):
9	1. **REQ-SEND-SPT-HOSTED** — daemon delivers inbound `spt send` to spt-hosted endpoints (wall-b spt-core half; daemon should PTY-inject via InputReq or equivalent).
10	2. **REQ-HAZARD-RC-EOF** — rc raw-EOF PTY crash (Finding C, rc.rs:352-362 classify-EOF + reconnect + 2 side-obs).
11	3. **REQ-HAZARD-DEFERRED-MANIFEST** — pointer-mode adapter silent-drop on missing live manifest (Finding A; diagnostic flag + maybe eager copy at register).
12
13	**v0.10.0 PUBLISHED & VERIFIED:**
14	- deployah counter 23, self-drive clean. One in-flight accuracy fix (picker-only overclaim, doyle spot-check caught pre-tag, no retag).
15	- Hash-check PASS (linux e146f64b…, win bd96873b…).
16	- Five releases this session: v0.8.3→0.8.4→0.9.0→0.9.1→0.10.0.
17
18	**Parity arc CLOSED** — spt-claude-code v0.3.0 dogfood-verified on spt-core 0.9.1.
19
20	**Workaround for wall-b:** `/sptc:live wall-b` inside its PTY (actively listening). Post-perri fix, `endpoint run` alone binds; full `spt send` reachability post-REQ-SEND-SPT-HOSTED.
21
22	**Standing by (external):** perri's bind root-cause ping · todlando next-milestone branch-open (3 findings) → doyle gates.


v0.10.0 shipped, three new REQs minted, wall-b root-caused. Just ACK - no state change needed beyond what's already in the file.


echo_commune ACK. v0.10.0 shipped (counter 23, hashes verified), wall-b both halves root-caused, 3 REQs minted, standing by for perri ping + todlando branch-open.


[Current time: 2026-06-17T03:30:58-07:00] Inbound echo_commune envelope at 2026-06-17T03:30:57-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.10.0-picker-status   head_sha: 9e5cb8b41576…


[Current time: 2026-06-17T09:59:30-07:00]
Inbound echo_commune envelope at 2026-06-17T09:59:30-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.11.0-findings
  head_sha: ec85b2177886b55bfce67dac0757c89dee654b7b

<live-context>
Session v0.10.0-picker-status → **v0.11.0-findings BRANCH OPENED**:

**wall-b ROOT-CAUSE COMPLETE + 3 REQs MINTED (registry-first @ f742e26):**
- Adapter (perri): bind hook produced zero perch; `endpoint run` never E2E-tested. Root-cause in progress; plan locked.
- spt-core (doyle verified): `api bind` (startup.rs:441) registers no message-listener → `deliver.rs:97` resolve_address returns None → inbound `spt send` silently spools. Broker dispatch_input only receives from brain, never from inbound message.

**3 FINDINGS MINTED v0.11.0-findings:**
1. **REQ-SEND-SPT-HOSTED** — daemon delivers inbound `spt send` to spt-hosted endpoints. **DESIGN GATED: Option A (broker PTY-injection) LOCKED DECISIVELY**. Specifics: endpoint-keyed KIND_ENDPOINT_INPUT{endpoint, data} → scan sessions.values() endpoint==target → write_input (fire-and-forget, no op_id); bytes = render_event_lines(from,body) [same <EVENT> format, ADR-0020]; cmd_send gate (controllable==Some(true) && resolve_address==None && online) → inject→Sent else spool→Queued; inject leg in spt bin/spt-daemon, not spt-msg. IDLE/DIRECT MVP (choice a); activity-gated routing (choice b) = follow-wave. #1 int (real endpoint-run receives live `spt send` visible in PTY, full seam sweep) non-negotiable. Sequencing: RC-EOF wave-1 → #1 waves → #3, gate per-wave.
2. **REQ-HAZARD-RC-EOF** — rc raw-EOF PTY crash. Wave-1: classify rc.rs:362 catch-all EOF → graceful "daemon stopped/restarted — re-run" (never raw "failed to fill buffer"). Auto-reattach + 2 side-obs (daemon-stop warning, watch-handle release) = follow-wave.
3. **REQ-HAZARD-DEFERRED-MANIFEST** — pointer-mode adapter silent-drop on missing live manifest. Follow-wave after #1.

**v0.10.0 PUBLISHED & VERIFIED (counter 23, one pre-tag picker-accuracy fix caught, no retag).**
**Parity arc CLOSED** — spt-claude-code v0.3.0 dogfood-verified.

**Crews executing v0.11.0-findings:**
- **todlando**: branch open, 3 REQs minted. Design gate ruled (A decisively). Building wave-1 (#2 RC-EOF classify + unit), then #1 waves, then #3. Gating per-wave.
- **perri**: root-causing bind-zero-perch + adding missing endpoint-run int test (adapter half, parallel).

**Next**: perri's bind-fix lands → v0.3.0 unblocked; todlando's #2 RC-EOF wave-1 ready for gating.
</live-context>
<project-context>
v0.11.0-findings: BRANCH OPENED @ f742e26, 3 REQs minted (registry-first). **REQ-SEND-SPT-HOSTED design GATED (Option A locked with full implementation specifics + activity-state nuance + sequencing locked)**. todlando executing per-wave (#2 RC-EOF → #1 → #3, gate per-wave); perri executing bind root-cause + int test. Both crews on v0.11.0-findings. Pending: todlando's #2 RC-EOF wave-1 ready; perri's bind root-cause findings.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T16:59:25Z -->
2	Session v0.10.0-picker-status → **v0.11.0-findings BRANCH OPENED**:
3
4	**wall-b ROOT-CAUSE COMPLETE + 3 REQs MINTED (registry-first @ f742e26):**
5	- Adapter (perri): bind hook produced zero perch; `endpoint run` never E2E-tested. Root-cause in progress; plan locked.
6	- spt-core (doyle verified): `api bind` (startup.rs:441) registers no message-listener → `deliver.rs:97` resolve_address returns None → inbound `spt send` silently spools. Broker dispatch_input only receives from brain, never from inbound message.
7
8	**3 FINDINGS MINTED v0.11.0-findings:**
9	1. **REQ-SEND-SPT-HOSTED** — daemon delivers inbound `spt send` to spt-hosted endpoints. **DESIGN GATED: Option A (broker PTY-injection) LOCKED DECISIVELY**. Specifics: endpoint-keyed KIND_ENDPOINT_INPUT{endpoint, data} → scan sessions.values() endpoint==target → write_input (fire-and-forget, no op_id); bytes = render_event_lines(from,body) [same <EVENT> format, ADR-0020]; cmd_send gate (controllable==Some(true) && resolve_address==None && online) → inject→Sent else spool→Queued; inject leg in spt bin/spt-daemon, not spt-msg. IDLE/DIRECT MVP (choice a); activity-gated routing (choice b) = follow-wave. #1 int (real endpoint-run receives live `spt send` visible in PTY, full seam sweep) non-negotiable. Sequencing: RC-EOF wave-1 → #1 waves → #3, gate per-wave.
10	2. **REQ-HAZARD-RC-EOF** — rc raw-EOF PTY crash. Wave-1: classify rc.rs:362 catch-all EOF → graceful "daemon stopped/restarted — re-run" (never raw "failed to fill buffer"). Auto-reattach + 2 side-obs (daemon-stop warning, watch-handle release) = follow-wave.
11	3. **REQ-HAZARD-DEFERRED-MANIFEST** — pointer-mode adapter silent-drop on missing live manifest. Follow-wave after #1.
12
13	**v0.10.0 PUBLISHED & VERIFIED (counter 23, one pre-tag picker-accuracy fix caught, no retag).**
14	**Parity arc CLOSED** — spt-claude-code v0.3.0 dogfood-verified.
15
16	**Crews executing v0.11.0-findings:**
17	- **todlando**: branch open, 3 REQs minted. Design gate ruled (A decisively). Building wave-1 (#2 RC-EOF classify + unit), then #1 waves, then #3. Gating per-wave.
18	- **perri**: root-causing bind-zero-perch + adding missing endpoint-run int test (adapter half, parallel).
19
20	**Next**: perri's bind-fix lands → v0.3.0 unblocked; todlando's #2 RC-EOF wave-1 ready for gating.


Branch advanced to v0.11.0-findings @ ec85b2177. State updated significantly. Just ACK - the live_context already reflects current state accurately.


echo_commune ACK. v0.11.0-findings opened, Option A locked, todlando on RC-EOF wave-1, perri root-causing bind-zero-perch. Doyle waiting for wave-1 PR-ready.


[Current time: 2026-06-17T09:59:30-07:00] Inbound echo_commune envelope at 2026-06-17T09:59:30-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: ec85b2177886b55bf…


[Current time: 2026-06-17T10:22:09-07:00]
Inbound echo_commune envelope at 2026-06-17T10:22:08-07:00:
  machine: HFENDULEAM
  project: spt-core
  branch: v0.11.0-findings
  head_sha: 6dc98dff841809ebcbeb1971987232a698b9fe33

<live-context>
Session v0.10.0-picker-status → **v0.11.0-findings BRANCH IN-FLIGHT**:

**Wall-b ROOT-CAUSE COMPLETE — spt-core bug F-013 minted + landed (7252367):**
- Root: `endpoint run` substitutes `{id}` into argv but NOT `[env.<VAR>].value`, so env values empty despite schema promise. Spt-core correctness bug, not adapter.
- F-013 REQ-HAZARD-ENV-SUBST @ 7252367 [impl,unit,int]: `prepare_harness_spawn` fills `[env]` inject via whole-string `fill_template` → `SpawnReq.env` → child PTY. Seam-swept: clippy --workspace -D warnings clean; spt-term(26)+broker(3)+attach(12)+daemon_e2e+lifecycle+idempotent+handoff GREEN. No manifest/binary change (schema already promised).

**v0.11.0-findings PR shape LOCKED (bundled, one gate):**
- #1 REQ-SEND-SPT-HOSTED @ 4af154d: built + seam-swept + livehost E2E GREEN (render_event_whole, KIND_ENDPOINT_INJECTED reply, `delivered:false → spool` path confirmed correctly wired).
- #2 REQ-HAZARD-RC-EOF wave-1: DONE (classify raw-EOF → graceful msg, never raw "failed to fill buffer").
- #3 REQ-HAZARD-DEFERRED-MANIFEST: DONE (clear error + registered() skip-diag).
- F-013 ENV-SUBST: DONE.
- REQ-HAZARD-ROSTER-GHOST: in-flight (build next).
- Wall-b COMPOSITION E2E: in-flight (endpoint run → SPT_ENDPOINT_ID set via [env] → bind → live send → EVENT in PTY) = #1+F-013 non-negotiable.
- RC-EOF FOLLOW-WAVE (reattach + daemon-stop warning + watch-handle release) SPLITS to later wave, not v0.11.0.

**Gate trigger:** Slice COMPLETE (incl F-013 + roster-ghost) + livehost green + CI green both runners → doyle one full-source-read gate.

**Housekeeping:** Orphan `pid 60824` (bare `claude`, broker-child, no endpoint behind it) from wall-b attempts. Offered to reap but awaiting preference.

**Next:** todlando building ROSTER-GHOST + wall-b composition E2E → bundle + push + CI → ping gate.
</live-context>
<project-context>
**v0.11.0-findings:** REQ-SEND-SPT-HOSTED ✓ seam-swept (4af154d); REQ-HAZARD-RC-EOF wave-1 ✓; REQ-HAZARD-DEFERRED-MANIFEST ✓; F-013 REQ-HAZARD-ENV-SUBST ✓ (7252367, prepare_harness_spawn fill_template pipeline, seam-swept); REQ-HAZARD-ROSTER-GHOST in-flight; wall-b composition E2E in-flight. One PR, one gate. RC-EOF follow-wave deferred.
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T17:22:03Z -->
2	Session v0.10.0-picker-status → **v0.11.0-findings BRANCH IN-FLIGHT**:
3
4	**Wall-b ROOT-CAUSE COMPLETE — spt-core bug F-013 minted + landed (7252367):**
5	- Root: `endpoint run` substitutes `{id}` into argv but NOT `[env.<VAR>].value`, so env values empty despite schema promise. Spt-core correctness bug, not adapter.
6	- F-013 REQ-HAZARD-ENV-SUBST @ 7252367 [impl,unit,int]: `prepare_harness_spawn` fills `[env]` inject via whole-string `fill_template` → `SpawnReq.env` → child PTY. Seam-swept: clippy --workspace -D warnings clean; spt-term(26)+broker(3)+attach(12)+daemon_e2e+lifecycle+idempotent+handoff GREEN. No manifest/binary change (schema already promised).
7
8	**v0.11.0-findings PR shape LOCKED (bundled, one gate):**
9	- #1 REQ-SEND-SPT-HOSTED @ 4af154d: built + seam-swept + livehost E2E GREEN (render_event_whole, KIND_ENDPOINT_INJECTED reply, `delivered:false → spool` path confirmed correctly wired).
10	- #2 REQ-HAZARD-RC-EOF wave-1: DONE (classify raw-EOF → graceful msg, never raw "failed to fill buffer").
11	- #3 REQ-HAZARD-DEFERRED-MANIFEST: DONE (clear error + registered() skip-diag).
12	- F-013 ENV-SUBST: DONE.
13	- REQ-HAZARD-ROSTER-GHOST: in-flight (build next).
14	- Wall-b COMPOSITION E2E: in-flight (endpoint run → SPT_ENDPOINT_ID set via [env] → bind → live send → EVENT in PTY) = #1+F-013 non-negotiable.
15	- RC-EOF FOLLOW-WAVE (reattach + daemon-stop warning + watch-handle release) SPLITS to later wave, not v0.11.0.
16
17	**Gate trigger:** Slice COMPLETE (incl F-013 + roster-ghost) + livehost green + CI green both runners → doyle one full-source-read gate.
18
19	**Housekeeping:** Orphan `pid 60824` (bare `claude`, broker-child, no endpoint behind it) from wall-b attempts. Offered to reap but awaiting preference.
20
21	**Next:** todlando building ROSTER-GHOST + wall-b composition E2E → bundle + push + CI → ping gate.


Good progress. F-013 landed, most REQs done, ROSTER-GHOST + wall-b E2E still in-flight. Just ACK.


echo_commune ACK. F-013 landed, #1/#2/#3 done, ROSTER-GHOST + wall-b E2E in-flight, bundle-gate pending. Orphan pid 60824 awaiting reap preference.


[Current time: 2026-06-17T10:22:09-07:00] Inbound echo_commune envelope at 2026-06-17T10:22:08-07:00:   machine: HFENDULEAM   project: spt-core   branch: v0.11.0-findings   head_sha: 6dc98dff841809ebc…


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

<live-context>
**v0.11.0-findings → GATED + RELEASE ROLLING:**

PR #24 (60257ff) merged + seam-swept full (spt-daemon 316+, broker 4, attach 12, daemon_e2e, roster-sweep tests, spt-term 26, livehost live E2Es). doyle source-read gate PASS (all 5 production diffs correct, composition int non-vacuous + traceable: wall-b flagless [session.self] + SPT_ENDPOINT_ID={id} via [env].value (F-013) → broker spawn child → EID report → endpoint-keyed EVENT inject → PTY echo). CI both-runners settled green (test Linux/Windows, n1-gate both, traceability; twohost skip expected).

deployah self-drive live: PR#24 → bump 27e0619 → CI run 27708058899 firing. CHANGELOG (5 items, public language, no REQ/KIND_/internal names; RC-EOF wave-1 framed, no reattach overclaim) vetted PASS by doyle. Counter 24 confirmed (v0.10.0 was 23). Tag held for CI complete + publish.

**Next: deployah tags on CI-green → sign+publish. Post-publish: hash-check → ping perri (her endpoint-run int test unblocked by F-013 release).**
</live-context>
<project-context>
**v0.11.0-findings RELEASE STATE:**
- PR #24 merged @ 60257ff (base main)
- Bump commit: 27e0619
- CI run: 27708058899 (both runners)
- Gate: doyle SOURCE-PASS
- CHANGELOG: 5 findings, approved
- Counter: 24 (MINOR)
- Release date: 2026-06-17
- Next blocker: CI complete → deployah publish
- Post-publish: perri unblocked (endpoint-run int test)
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T17:45:28Z -->
2	**v0.11.0-findings → GATED + RELEASE ROLLING:**
3
4	PR #24 (60257ff) merged + seam-swept full (spt-daemon 316+, broker 4, attach 12, daemon_e2e, roster-sweep tests, spt-term 26, livehost live E2Es). doyle source-read gate PASS (all 5 production diffs correct, composition int non-vacuous + traceable: wall-b flagless [session.self] + SPT_ENDPOINT_ID={id} via [env].value (F-013) → broker spawn child → EID report → endpoint-keyed EVENT inject → PTY echo). CI both-runners settled green (test Linux/Windows, n1-gate both, traceability; twohost skip expected).
5
6	deployah self-drive live: PR#24 → bump 27e0619 → CI run 27708058899 firing. CHANGELOG (5 items, public language, no REQ/KIND_/internal names; RC-EOF wave-1 framed, no reattach overclaim) vetted PASS by doyle. Counter 24 confirmed (v0.10.0 was 23). Tag held for CI complete + publish.
7
8	**Next: deployah tags on CI-green → sign+publish. Post-publish: hash-check → ping perri (her endpoint-run int test unblocked by F-013 release).**


echo_commune ACK. Gate PASS, CI running (27708058899), deployah holding for green → counter 24 publish → perri unblocked.


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


[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: 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.

Open: perri flagged scope Q on endpoint-run path (silent seed <0.11.0, works ≥0.11.0) — pending decision if cc-launcher should hard-require 0.11.0 vs stay floor=0.9.0.

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

Nothing blocked on doyle. Standing by.
</live-context>
<project-context>
**v0.11.0-findings RELEASE: FULLY GATED + SHIPPED + VALIDATED**
- PR #24 merged @ 60257ff
- Bump commit: 27e0619
- CI run: 27708058899 (both runners GREEN)
- Gate: doyle SOURCE-PASS
- CHANGELOG: 5 findings, approved, published
- Counter: 24 (MINOR)
- Hash-check: PASS
- Release date: 2026-06-17
- **Post-release gate (perri wall-b E2E): PASS** ✓ (39e15cc integration test landed)
- Status: CLOSED — all findings shipped + validated
- Next phase: RC-EOF follow-wave (todlando, deferred non-urgent)
</project-context>


1	<!-- spt:source=llm spt:routed_at=2026-06-17T18:12:05Z -->
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	Open: perri flagged scope Q on endpoint-run path (silent seed <0.11.0, works ≥0.11.0) — pending decision if cc-launcher should hard-require 0.11.0 vs stay floor=0.9.0.
18
19	Deferred (non-urgent): todlando RC-EOF follow-wave + roster-ghost cross-node int — I gate when he picks.
20
21	Nothing blocked on doyle. Standing by.


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


Now let me update the memory files to reflect the v0.11.0 milestone being complete. The spt-core M11 status memory should be updated.


1	---
2	name: project-spt-core-m11
3	description: spt-core M11 Shell-substrate — COMPLETE; v0.8.0 (counter 16) + v0.8.1 patch (counter 17) shipped; perri re-validating parity proof
4	metadata:
5	  node_type: memory
6	  type: project
7	  originSessionId: 4a6b191f-8566-41ae-8fcb-6f1d627107d1
8	---
9
10	M11 "Shell-substrate extensions" — **COMPLETE**. Shipped under v0.8.0 (counter 16, minor) merged to main @ c3bdccf (2026-06-16). NOT a solo M11 tag — consolidated with v0.7.4 feature set.
11
12	**All waves GATED + MERGED:**
13	- W1 @23e53fc — REQ-CONSENT-3 act-gates FULL PASS
14	- W2 (drive channel, REQ-SHELL-3) — @9d5fb63; in-mem DriveHub, broker-home, R1/R2/D1/D2/D3 proven, cross-node drop-not-wake
15	- W3 (tunnel, REQ-SHELL-4, LAN-only) — Option A bounded-with-backpressure ring; FLAKE-LEDGER #7 carried
16	- W4 (gateway-owner capstone, REQ-SHELL-5) — @c4dbeb4, id-keyed exclusivity, biting negative proven; PROOF-NOT-CHANGE
17	- W5 (rig + docs) — how-to-live topic + how-to-subnet + rig (twohost offdrive fix for W2 real-rig drop rung)
18
19	**v0.8.0 features bundled in same release (counter 16):**
20	- D REQ-INSTALL-10 — Win at-logon windowless fix (`daemon start`, DETACHED_PROCESS) @ ac4dad5
21	- B REQ-INSTALL-11 — adapter-binary install-dir resolution (`resolve_program_in_dir`); Feature B REAPPLIED at livehost.rs:191-203 (daemon-host model) in reconcile @ c3bdccf
22	- A REQ-UPD-9 — gh_release [update] avenue + fail-closed Ed25519 signing @ 2d6bcdf
23	- E REQ-API-4 — manifest-from-`--adapter` resolution (`resolve_ctx_manifest`) @ 66dd239
24	- C (update-apply UX nit) DEFERRED — root-cause ambiguous, fast-follow
25
26	**CRITICAL merge hazard (resolved):** M11 moved psyche spawn to daemon livehost (`LIVEHOST_PSYCHE:`, `PSYCHE_SPAWNED` GONE). Naive merge would have silently dropped Feature B's psyche fix. Todlando reconciled deliberately: daemon-host model wins, Feature B reapplied at livehost site.
27
28	**Post-ship:** perri dogfooding v0.8.0 now (drop F-006 PATH-copy, finalize >=0.8.0 marker leg `LIVEHOST_PSYCHE:`). C fast-follow (update-apply UX). Awaiting perri dogfood report.
29
30	**Why:** Unblocks perri spt-claude-code approval-API surfaces + live-agent psyche hosting.
31

---
name: project-spt-core-m11
description: spt-core M11 Shell-substrate — COMPLETE; v0.8.0 (counter 16) + v0.8.1 patch (counter 17) shipped; perri re-validating parity proof
metadata:
  node_type: memory
  type: project
  originSessionId: 4a6b191f-8566-41ae-8fcb-6f1d627107d1
---

M11 "Shell-substrate extensions" — **COMPLETE**. Shipped under v0.8.0 (counter 16, minor) merged to main @ c3bdccf (2026-06-16). NOT a solo M11 tag — consolidated with v0.7.4 feature set.

**All waves GATED + MERGED:**
- W1 @23e53fc — REQ-CONSENT-3 act-gates FULL PASS
- W2 (drive channel, REQ-SHELL-3) — @9d5fb63; in-mem DriveHub, broker-home, R1/R2/D1/D2/D3 proven, cross-node drop-not-wake
- W3 (tunnel, REQ-SHELL-4, LAN-only) — Option A bounded-with-backpressure ring; FLAKE-LEDGER #7 carried
- W4 (gateway-owner capstone, REQ-SHELL-5) — @c4dbeb4, id-keyed exclusivity, biting negative proven; PROOF-NOT-CHANGE
- W5 (rig + docs) — how-to-live topic + how-to-subnet + rig (twohost offdrive fix for W2 real-rig drop rung)

**v0.8.0 features bundled in same release (counter 16):**
- D REQ-INSTALL-10 — Win at-logon windowless fix (`daemon start`, DETACHED_PROCESS) @ ac4dad5
- B REQ-INSTALL-11 — adapter-binary install-dir resolution (`resolve_program_in_dir`); Feature B REAPPLIED at livehost.rs:191-203 (daemon-host model) in reconcile @ c3bdccf
- A REQ-UPD-9 — gh_release [update] avenue + fail-closed Ed25519 signing @ 2d6bcdf
- E REQ-API-4 — manifest-from-`--adapter` resolution (`resolve_ctx_manifest`) @ 66dd239
- C (update-apply UX nit) DEFERRED — root-cause ambiguous, fast-follow

**CRITICAL merge hazard (resolved):** M11 moved psyche spawn to daemon livehost (`LIVEHOST_PSYCHE:`, `PSYCHE_SPAWNED` GONE). Naive merge would have silently dropped Feature B's psyche fix. Todlando reconciled deliberately: daemon-host model wins, Feature B reapplied at livehost site.

**Post-ship:** perri dogfooding v0.8.0 now (drop F-006 PATH-copy, finalize >=0.8.0 marker leg `LIVEHOST_PSYCHE:`). C fast-follow (update-apply UX). Awaiting perri dogfood report.

**Why:** Unblocks perri spt-claude-code approval-API surfaces + live-agent psyche hosting.


This memory is about M11 (v0.8.0), not the current state. I need to update the memory for the current status. Let me check what memory files are relevant and update/create one for the current state (v0.11.0).

Actually, looking at the MEMORY.md index, there are entries for M9, M10, M11, M12. The current work is well beyond those. Let me update the spt-claude-code status memory and maybe add a new entry for the current milestone state.

Let me check the current memory files relevant to recent work.