---
name: spt-claude-code-status
description: "claude-spt v0.9.0 + cplugs sptc 0.1.8 SHIPPED (2026-06-28); D1 hook→binary arc closed; D4 sptc→spt flip deferred"
metadata: 
  node_type: memory
  type: project
  originSessionId: gen11-2026-06-28
---

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

## Current State (2026-06-28)

**v0.9.0 SHIPPED** — D1 hook→binary arc fully closed. adapter v0.9.0 + cplugs sptc 0.1.8 published. Consuming spt-core v0.16.0 (counter 35). HEAD 9a10b23 on main (SaberMage/claude-spt).

**D1 delivered:**
- New `claude-spt hook <event>` subcommand (tools/claude-spt/src/hook.rs)
- Faithful port of all 8 hook wrappers + _common.sh → Rust, `HookEnv` side-effect trait (unit-testable)
- Plugin ships STATIC-FOREVER hooks.json + thin dispatch.sh; `[strings].hook_cmd = "{adapter_dir}/claude-spt hook"` (RESOLVE-NOT-EXECUTE, ADR-0006 ask #1)
- Deleted 8 .sh wrappers + _common.sh + tests/hooks-parse.sh
- Hook behavior now rides `spt adapter update`, NOT cplugs republish
- New REQ-DIST-HOOK-BINARY (doc/impl/unit). 89 crate tests green.
- min_spt_core stays 0.16.0

**v0.8.0 SHIPPED (2026-06-26)** — UNIFY-CONSOLIDATE arc fully closed. adapter v0.8.0 + cplugs sptc 0.1.7 published. Commits cfe27fd→5a1c3f2 on main.

**Version model (locked, ADR-0029):** v0.8.0 = claude-spt adapter. NO "spt-core v0.8.0". min_spt_core_version = 0.16.0.

**Delivered this milestone:**
- U1: [update].message
- U2: consolidated tools/claude-spt crate (digest/psyche/post-update, hand-rolled dispatch)
- U3: repo renamed SaberMage/claude-spt + ref-flip
- U4: thinned commune/send/signoff → live-ops brief
- U5: README install UX
- U6: -n {id} + --remote-control {id} both bringup paths
- F-021 reachability: PreToolUse mid-turn poll + honest busy/idle (busy@UPS + busy@PreToolUse fallback for Monitor-triggered turns + idle@Stop, --include-deferred)
- D2: [update.post]={command,self_verifies} → additive stdin JSON, emits `!!update-message!!` sentinel → [update].message
- D3: translate folded → ONE binary ([message-idle-translation-binary].command)
- Re-vendored manifest.schema.json (v0.16.0)

**Gates all green:** 61 crate tests + traceable green. Dogfooded: digest-proof 5/0 + translate-proof commit:yes.

**Peer-messaging convention:** doyle + fleet peers on LEGACY SPT → reach via `"$OWL" send <target>` (heredoc stdin). NOT `spt send` (new plane → NO_PERCH for peers).

**spt-core v0.16.0 live** (counter 35, linux e13d7c2d/win f6cd39ec, 2026-06-25).

## Prior State (2026-06-17)

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

**spt-core: v0.12.0 live** (counter 25, hash linux 0458b5ae…, win 6699be3d…; lifecycle milestone, cross-platform reap-guard fix)

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

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

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

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

## Deferred / Non-urgent

- **On-node update** — `spt adapter update claude-spt` ×2 on non-live node to verify [update.post] firing; skipped mid-session to avoid mutating live node.
- **poll-int live binary-drain e2e** — blocked: node holds 2 subnets, needs --subnet flag; covered by hook.rs unit tests + dogfood.
- **D4** sptc→spt plugin succession: gated on owl-retirement
- **Harness-glue E2Es**: PostToolUse write-detect + SessionStart injection on node with sptc 0.1.8 + v0.9.0
- RC-EOF follow-wave (reattach + daemon-stop warning + watch-handle release) — todlando picks up, doyle gates
- roster-ghost cross-node int — todlando picks up, doyle gates

## Key Decisions (locked)

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