---
name: prep4-v030-parity-closed
description: "PREP-4 / legacy-parity arc CLOSED. spt-claude-code v0.3.0 SHIPPED (Option A: psyche_init in BASE manifest, NO :live profile, bare flow, zero --adapter, min_spt_core 0.9.0). cplugs sptc 0.1.3. Verified end-to-end + dogfooded on spt 0.9.1. F-011 (deferred-Pointer manifest silent-drop) = real spt-core gap doyle minting."
metadata: 
  node_type: memory
  type: project
  originSessionId: 3426cdf8-fb8b-40c7-b988-111599595cd7
---

**v0.3.0 SHIPPED 2026-06-17** — https://github.com/SaberMage/spt-claude-code/releases/tag/v0.3.0
(both per-OS .spt). cplugs sptc **0.1.3** (43aa021). Closes the legacy-owl bare-bringup PARITY arc.

## Design = OPTION A (doyle-ruled + code-confirmed, livehost.rs:282)
spt-core v0.9.0 shipped adapter-agnostic harness-resolution (ADR-0021). Our `:live` profile differed
from base ONLY by `[session.psyche_init]` → **folded psyche_init into BASE claude-spt, DELETED the
:live profile**. ready-vs-live = the COMMAND: bare `spt api listen <id>` = live (perch state=live_agent
→ daemon hosts Psyche) / bare poll/`spt ready` = ready (livehost.rs:282 gates psyche on live_agent
state → ready perch skipped regardless of base psyche_init). **Zero --adapter on the default path**
(`host_binaries=["claude"]` resolves the adapter by the seed's parent pid). `:ccs`/`:deep` stay as
override profiles. `min_spt_core_version` hard-bumped 0.7.0→**0.9.0** (compat gate (a)). bind/boundary
hooks KEEP explicit `--adapter` (only seed + live-listen go bare). Commits 3665fc5 (wiring) + e8e90d8
(release). Full record: PREP4-PLAN.md.

## VERIFY (live spt 0.9.1, doyle-coordinated) — all GREEN
- **F1 broker version-skew**: `spt update apply` restarts only the BRAIN; the resident BROKER
  (seed-control, survives brain restarts) stayed pre-0.9.0 → couldn't deser the adapter-less Seed →
  `SEED_FAIL: failed to fill whole buffer` (IPC, pid-independent). FIX = full `spt daemon stop` →
  fresh broker. (Deployment hazard: a Seed-wire change rides self-update = brain-only restart; the
  broker needs a full daemon stop. Fleet nodes need one broker restart for 0.9.0.)
- **F2a not-a-bug**: matcher strips trailing `.exe`; keep `host_binaries=["claude"]`, do NOT add .exe.
- **F2b** (spt-core v0.9.1 stem-before-first-dot matcher): bare resolve on BOTH the CC-updater-renamed
  `claude.exe.old.<ts>` exe AND plain claude.exe → BOUND/READY, no --adapter. (CC's updater renames
  the IN-USE exe on self-update — common production state.)
- Full bare live: persistent bare `spt api listen` → perch live_agent + nested psyche perch + Psyche
  hosted. poll-stays-ready: `spt ready` → ready_agent, psyche count UNCHANGED.
- **Dogfood**: re-acquired PUBLISHED v0.3.0 via `spt adapter add --release ... --tag v0.3.0` →
  GhReleaseManaged Pointer, binaries extracted, `adapter use` works, bare resolve GREEN end-to-end.

## Findings (docs/SPT-CORE-FINDINGS.md)
- **F-011** CONFIRMED spt-core gap (doyle root-caused registry.rs): a **Pointer/GhReleaseManaged**
  adapter whose DEFERRED install dir lacks the extracted manifest → `registered()` `filter_map(ok())`
  SILENTLY DROPS it → bare resolution `ADAPTER_UNRESOLVED` (host_binaries never consulted) + `spt
  adapter use` cryptic `os error 2`. Real `--release`/extracted-dir installs work. doyle minting
  REQ-HAZARD→todlando (clear diagnostic + maybe eager manifest extract). NON-blocking.
- **F-012** legacy-owl 1.11.25 poll-loop exit-1 / orphaned psyche across daemon churn (`/spt:revive`
  gen-7 wrapper+psyche launched but foreground poll died; non-fatal `sessions log seal failed: git
  failed`). doyle: NOT spt-core (legacy owl, separate daemon); re-open only if repro'd clean-room.

## METHOD NOTES (verify infra hazards)
- Verify needs a binaries-PRESENT install (extracted .spt dir or `--release`), NOT a source-path
  manifest registration (that's the F-011 deferred-drop state).
- Disposable verify perches anchored on live `claude` pids become live_agent + re-host → psyche storm;
  cleanup = daemon-stop + kill claude-spt-psyche (sptc-scoped, NOT machine-wide) + DELETE the
  disposable owlery dirs (rt-*/sptc-*); "Device busy" on a just-killed psyche's nested dir → retry.
- My legacy-owl poll listener died 3x on daemon bounces this session — re-arm via Monitor
  (`owl poll perri listen --live`, persistent, "« spt event »") when perri Self goes MISSING from
  `owl list`. /spt:revive (live) is the operator's proper fix.

Succession (sptc→spt flip) still GATED — see [[succession-flip-gated]]. Prior arc: [[v074-follow-ups]].
