---
name: v0200-stub-delivery-shipped
description: "v0.20.0 SHIPPED 2026-07-10 — ADR-0007 stub idle delivery (Slices A+B+C) + REQ-STUB-PARK-NO-STALL busy-race fix, both slices field-verified live, node applied"
metadata: 
  node_type: memory
  type: project
  originSessionId: ecd15339-2c75-4e4c-ba1a-2c25bd437233
---

2026-07-10 **v0.20.0 SHIPPED + node applied** (GH release live, tag v0.20.0, fat adapter.spt 3 triples, manifest 0.19.0→0.20.0, floor unchanged 0.27.0; skeleton untouched → no cplugs push). Bundles ADR-0007 Slices A (digest parity+noise filter, 19b8bc2) + B (wake stub, 2e1fb67) + C (msg stubs, d4bfcfa) + **the busy-race no-stall fix (237c591, REQ-STUB-PARK-NO-STALL)**.

**Field verify (plan gate, both slices live on scratch-c spt-hosted endpoint, new binary):**
- Slice C: idle `spt send` → transcript prompt = whole-prompt-exact `<msg from="cli@HFENDULEAM"/>`, body parked ~/.spt-claude/msgpark/<eid>/ (park drained <1s), attachment carried body, agent acted + replied. NOTE: CLI sends stamp `from="cli@<node>"`, not the agent id.
- Slice B: checkpoint cycle → custom `!!checkpoint!!` directive parked at state/wake/scratch-c.park, post-clear transcript first prompt = `<wake/>`, directive drained, agent resumed + replied WAKE-B-OK.

**Busy-race found DURING verify** (new hazard class the stub redesign introduced): translate idle-misclassifies in the Stop→next-turn window → stub lands as CC queued message folded into the RUNNING turn → its UPS never fires → park stalls (pre-stub world delivered body as queued text = regression). FIX: UPS drains msg park on EVERY prompt (stub-turn coalesced-note semantics kept; normal prompt + empty park = silent) + PreToolUse drains park ahead of poll frames. Live-proven on my own stalled park (body delivered mid-turn next tool call after binary swap). Racing drains may double-deliver — documented duplicates-beat-loss stance. 300 tests.

**Perch-wedge trap hit during verify** (self-inflicted): running `ccs`/`claude` as a CHILD OF MY OWN SHELL leaks SPT_ENDPOINT_ID=perri (CLAUDE_ENV_FILE exports) → the child's SessionStart plain-bind REBINDS my perch to the child sid; child dies → perch stranded, my hooks dead (whoami self:null), deliveries stall. RECOVERY: `spt api --adapter claude-spt bind perri --session-id <stranded-sid> --set-session-id <my-real-sid>` (departed-sid proof). RULE: never launch claude/ccs from a live agent's shell without scrubbing SPT_ENDPOINT_ID/OWL_SESSION_ID. Related: [[headless-spawn-external-imports-gate]] (the bringup-stall RCA that preceded this).

Open (non-gating): (1) ~~translate double-typed stub~~ CLOSED not-a-bug (2026-07-10 diagnose): the two transcript `queue-operation` entries were `"operation":"enqueue"` + `"operation":"remove"` — CC's queue ledger logs every queued item twice (queued, then flushed into the turn); one park file + one enqueue = translate typed ONCE. TRAP for future transcript forensics: never count queue-operation entries as typing events — filter by `operation` field. (Digest extractor unaffected — it reads only type=user/role=user entries; queue-operation is skipped by design.) (2) Slice D (core short-ids) awaits core wave; (3) spt-core v0.30.6 update notice pending on node (defer-applied during release; operator to `spt update apply`).

**v0.20.1 SHIPPED + node applied (2026-07-10):** `680158d` [update] transport="gh" (repo went PRIVATE — gh CLI = officially provisioned Transport contract, REQ-ADAPTER-GH-TRANSPORT, in schema since ≤0.26.0 no floor bump; vendored schema refreshed to v0.30.6) + `7ab12a8` env-file export-prefix (CC expects bash exports; bare KEY=value = shell-local, children blind — doyle W4 rider). Tag v0.20.1, commit 86bd822. The node-apply update itself fetched from the private repo = live transport proof.

**F-033 field-verify CLOSED (doyle ACCEPTED, 2026-07-10, core v0.31.0 + adapter 0.20.1):** (1) doyle↔perri both-direction send-stamps PASS (inbound stamped from=doyle; my reply stamped from=perri, routed clean — my leg needed manual `export OWL_SESSION_ID` promotion only because my session pre-dated 0.20.1); (2) fresh 0.20.1 session's env-file carries export-prefixed lines on disk; (3) CLEAN-PATH behavioral: scratch-c ran `env -u SPT_ENDPOINT_ID sh -c "printf … | spt send perri"` — no promotion, endpoint-id scrubbed, arrived stamped from=scratch-c (isolates the OWL_SESSION_ID export leg + core detect leg (a)). doyle: my v0.31.0 lane DONE; milestone waits on todlando (W6 + F-038) + flynn (autostart); nothing further owed — file oddities from normal use. NOTE: stamp test also showed my sends stamp from=perri even WITHOUT the env leg (process-ancestry detect covers operator-terminal topology); the env leg matters where ancestry fails.
