---
name: v074-follow-ups
description: "spt v0.8.1 dogfood COMPLETE → adapter v0.2.0 SHIPPED. Psyche blocker fixed (ddf1965 greedy --prompt: spt-core whitespace-splits {psyche_prompt}). F-006 retired, per-OS release published (win+linux .spt), auto-update wiring proven (Pointer/GhReleaseManaged), cplugs sptc 0.1.2 pushed. doyle accepted F-009/F-010 → v0.8.2 (counter 18). TODO on v0.8.2 ping: revert greedy→strict + re-validate."
metadata:
  node_type: project
  type: project
  originSessionId: 6f3dfa64-ae2e-4144-85ce-993c366887f4
---

**spt v0.8.1 dogfooded 2026-06-16** (updated 0.8.0→0.8.1 via `spt update fetch && spt update apply`;
RESTARTED the daemon — old daemon was `peer pump: STALLED`, possibly stale-code/env).

## BLOCKER RESOLVED — daemon-hosted Psyche now hosts (commit ddf1965)
Root cause of v0.8.0/v0.8.1 "Psyche online + no process + no cause": **spt-core substitutes
`{psyche_prompt}` into the `[session.psyche_init]` command STRING then WHITESPACE-SPLITS** → the
multi-word prompt arrived as 7 stray argv tokens (`--prompt PSYCHE REVIVAL time: epoch-ms:… incoming
event: (none)`). The runner's non-greedy `--prompt` took "PSYCHE", rejected "REVIVAL" as unknown-arg,
**exited 2 instantly**. The daemon's detached spawn() returned Ok → phantom hosted perch (nested
info.json status=online, real-looking pid) with NO live process and NO psyche_host_error.
- **Diagnosed** via argv-capture instrumentation (temporarily dumped argv to a file from a deployed
  instrumented exe; reverted). doyle's v0.8.1 reconcile fix DID work (v0.8.0 never reached the spawn).
- **Fixed adapter-side**: `--prompt` is now TERMINAL + GREEDY (slurps trailing tokens; manifest keeps
  `--prompt` last). Verified: claude-spt-psyche stays RESIDENT full window (was 0 procs every prior run).
- **REQ-INSTALL-11 PROVEN**: the daemon resolved claude-spt-psyche by bare name FROM the install dir
  (`adapters/_github/SaberMage-spt-claude-code/`) — binaries DO registration-copy there (manifest +
  strings + BOTH .exe). No PATH interim needed for runner resolution.
- **live-relay-int.sh**: psyche-spawn leg flips skip→ASSERT GREEN; detection = resident
  claude-spt-psyche proc + nested `{id}-psyche` perch dir (endpoint list NEVER surfaces the nested
  perch); id/session now **per-run-unique** (`$$` suffix) — daemon hosts a Psyche once per session_id,
  so a fixed id can't re-host. `SPTC_ACCEPTANCE=1 sh ci/psyche/live-relay-int.sh` = LIVE-RELAY-INT OK.

## doyle report PENDING DELIVERY (he's offline — NO_PERCH, even --deferred local-only)
Full content in commit ddf1965 msg. Retry `spt send doyle --from perri` when reachable. Two spt-core
findings for him: (1) command-templating whitespace-splits substituted multi-word keys → ANY prompt-
like fill unusable as one arg (digest survives only b/c single-token fills); recommend split-then-fill.
(2) silent-exit still maskable — psyche_host_error stays clear when spawn() ok but child exits instantly;
treat non-resident host as failure. MINOR: peer pump STALLS ~7-8min after every daemon start (didn't
block hosting).

## DONE THIS SESSION (committed)
- TASK 1 ✓ psyche fix + proof green (ddf1965).
- TASK 2 ✓ F-006 RETIRED: digest + psyche BOTH proven from install-dir (interim moved aside, RELDIR off
  PATH); interim PATH-copy step dropped from both setup bodies; interim copies deleted; F-009/F-010
  findings logged in docs/SPT-CORE-FINDINGS.md (717efd2). docs-drift + traceable-reqs green.

## v0.2.0 RELEASE SHIPPED (operator chose 0.2.0 minor + full-send-incl-publish)
- TASK 3 ✓ per-OS re-release: rebuilt binaries, packed `adapter-windows-x86_64.spt` (PE) +
  `adapter-linux-x86_64.spt` (ELF, zigbuild cross). Bumped manifest 0.1.0→0.2.0, plugin 0.1.1→0.1.2,
  CHANGELOG [0.2.0]. Commit a11f545, pushed main. GitHub release **v0.2.0** w/ BOTH assets:
  https://github.com/SaberMage/spt-claude-code/releases/tag/v0.2.0 . All deterministic gates PASS.
- TASK 4 ✓ auto-update proven: `spt adapter add --release … --tag v0.2.0 --asset adapter-windows-x86_64.spt`
  → registration flipped Copy→**Pointer / GhReleaseManaged** (rides update engine). `spt adapter update`
  → `UPTODATE: installed 0.2.0, latest 0.2.0` (the [update] gh_release avenue is now recognized vs
  0.1.0's "no avenue"). Full pull-test (0.2.0→0.2.1) defers to next bump. Re-ran proof against the
  PUBLISHED artifact (re-acquired) → LIVE-RELAY-INT OK (shipped psyche binary hosts resident).
- TASK 5 ✓ cplugs sptc **0.1.2** pushed to SaberMage/cplugs (commit 8d9c222): per-OS setup floor +
  ccs (#7) + subnet (#3/#4) + dropped interim. Local `claude plugin install sptc@cplugs` SKIPPED on
  purpose — I'm live on the legacy `spt` plugin; succession not flipped (sptc/spt coexist until parity).

## v0.8.2 RE-VALIDATION DONE (counter 18, 2026-06-17) — BOTH PASS, reported to doyle (commits b6d599e, 005b4bb)
- F-009 ✓ argv-capture on daemon-spawned psyche: STRICT --prompt parser HOSTED; raw argv = exactly 7
  elements, --prompt value = the ENTIRE multi-line prompt as ONE element (newlines intact). tokenize-then-
  fill confirmed. Shipped adapter KEEPS greedy --prompt as defensive (one element passes join() unchanged;
  pre-0.8.2 split still reconstructed → works across 0.8.1/0.8.2). Restored published v0.2.0 greedy binary.
- F-010 ✓ forced fast-exit psyche → parent perch stamped `psyche_host_error{reason:"host not resident
  within 5s (psyche perch missing/dead pid)", attempts:2}`; `endpoint list`/`whoami` render `psyche-host:
  FAILED (...)`. status stays online (liveness authoritative). No more silent phantom.
- METHOD NOTES (for next time): daemon resolves the psyche binary from the REGISTERED adapter's install dir,
  IGNORING --manifest abs-path command → must deploy test binaries to the install dir. Install-dir exe is
  CONTENDED (daemon re-hosts online perches → psyche holds the .exe → cp "Device or resource busy"). To
  deploy: `spt daemon stop` + loop `taskkill //IM claude-spt-psyche.exe //T //F` to 0 + DELETE stale
  sptc-* owlery dirs (else 0.8.2 re-hosts a 20-40 psyche STORM on daemon start) + cp. NOTE: ANY spt command
  auto-starts the daemon. F-010 trigger = an unconditional-exit(2) binary in the install dir (env-gating
  fails: daemon already running ignores the env).

## v0.2.1 SHIPPED (2026-06-17, doyle live-bringup feedback) — DO-NOW 1+2 + PREP-3
doyle reconciled /sptc:live v0.2.0 w/ operator: bringup diverges from intended LEGACY PARITY, but
MOST root causes are spt-core gaps (todlando building, ~v0.9.0). Split NOW vs BLOCKED. Actioned the
adapter-independent NOW items + shipped:
- DO-NOW 1 ✓ adapter/strings/skills/live.md rewritten SELF-CONTAINED — DELETED the `spt how-to live`
  redirect; inlined full Monitor-relay recipe (WINPID anchor, seed+listen chained-one-process, READY
  gate, relay-authoritative poll reconcile). Interim chain tagged PREP-4.
- DO-NOW 2 ✓ OUTPUT DISCIPLINE block: SEEDED/NO_SEED/STALE_SEED/BOUND/READY + raw tokens = internal
  parse contract, NEVER echoed. Pinned canonical LIVE block (id·status·reach·reply), post-READY only.
- PREP-3 ✓ STAGED `adapter.host_binaries = ["claude"]` in [adapter]. Caveat cleared: verified against
  LIVE 0.8.2 parser via throwaway probe `spt adapter add` of a renamed copy — parsed clean, serde
  ignored unknown field (exit 0). No finding.
- Commits 87dcda6 (work) + 670b01e (release). **GitHub release v0.2.1** w/ both per-OS .spt:
  https://github.com/SaberMage/spt-claude-code/releases/tag/v0.2.1 . Content delta vs 0.2.0 = manifest
  + strings ONLY (binaries unchanged). cplugs skeleton UNCHANGED → plugin.json stays 0.1.2, NO
  republish. Gates PASS, traceable green.
- PREP-4 HELD for doyle v0.9.0 ship-ping: ADR-0021 + CONTEXT §170-186 = adapter-agnostic by-pid
  resolution (pid→exe basename→host_binaries→active-profile→registered_at_ms). On ship: SessionStart →
  bare `spt api seed --pid --session-id` (drop --adapter), drop seed/listen chain, add `spt adapter use
  claude-spt[:profile]` to /sptc:setup, strip the PREP-4 interim note from live.md. DO NOT pre-build.
- Separate (doyle's, unrelated): operator hit a spt-core ccs spawn bug (NUL-in-path + ccs extension
  resolution on Windows); doyle fixing in a worktree.

## CAVEAT to verify on a real fresh-logon live session: psyche runner calls `claude` by bare name;
`claude` @ ~/.local/bin is NOT on the persistent logon PATH → fresh-logon daemon's psyche seed/pulse
turns may no-op (runner stays resident, claude turns fail). Separate from F-006.

F-008 (#5 legacy migration) = deferred-by-design. See [[live-int-gated-m11-counter15]],
[[per-os-and-setup-waves]], [[succession-flip-gated]].
