---
name: v0132-build-drive
description: "v0.13.2 adapter-packaging BUILD phase — wave status, dispatch mechanics, and the W3 psyche-lock design hole"
metadata: 
  node_type: memory
  type: project
  originSessionId: 09dbfcc7-8716-4b1a-84fd-5da14fa3859e
---

Driving v0.13.2 (adapter packaging + live update) build→release this session (operator 2026-06-22: "run the build, todlando executes, you gate, deployah publishes, see it through"). doyle = orchestrator/gater.

**Branch:** `v0.13.2-adapter-packaging`, reconciled with main @ `69c975f` (merged main in — ADR-0023 + REQ-EP-8/9 preserved, v0.13.2 REQs intact), pushed. traceable EXIT=0.

**Dispatch mechanics (corrected):** todlando/deployah/perri are LIVE agents on the LEGACY owl network — dispatch via `"$OWL" send <target> doyle` (message on stdin), NOT subagents and NOT spt-core endpoints (spt roster here = only wall-* test perches). `$OWL` = owl.exe in the cplugs cache. `"$OWL" list` shows them ACTIVE.

**Build order:** W1 multi-platform .spt (ADR-0024) → W2 gh transport → W3 live-update KEYSTONE (ADR-0025, gate vs REAL daemon+dummy-harness, NO mocks) → W4 update-message → W5 proof --dir. W2 sequential after W1 (shared cli.rs fetch/extract hotspot). Release counter = verify vs spt-releases metadata at cut (expect 29; v0.13.1 lesson).

**File-lock gotcha:** a stale DEV daemon (target/debug/spt.exe, `daemon run --detached`) can lock the build artifact (os error 5). Installed live daemon (AppData\Local\spt-core\bin) hosts wall-* + psyche — NEVER touch. Scoped PID-tree kill of the DEV daemon only is safe ([[no-machinewide-killon-shared-runner]]).

**W3c ARCHITECTURAL correction (todlando STOP-AND-FLAG, gated 2026-06-22):** the BRAIN is a SEPARATE OS PROCESS, not a thread (PID `daemon brain` ≠ PID `daemon run`/broker; brainproc re-execs `spt daemon brain` connecting over the broker socket). So ADR-0025's "broker registers the brain's Arc<RwLock> manifest handle" is IMPOSSIBLE — an Arc can't span processes (my W3 verdict caution-ii error; I'd even SEEN the distinct PIDs clearing the build lock and missed it). CORRECTION = reload-on-dirty IN the brain: the pulse loop (5s) sha256_hex's install_dir/manifest.toml, reloads on change via cell.refresh. Disk IS the cross-process signal; W3b atomic rename makes the poll torn-read-safe. ManifestCell core (Arc<RwLock> manifest/runtime, read→clone→drop, refresh(&self)) STANDS — only the trigger changed. ADR-0025 needs a THIRD correction-axis for this. Lesson: verify thread-vs-process boundary before any "shared handle" design.

**W3 design HOLE (perri F-010×F-015 live repro, 2026-06-22):** the adapter PSYCHE binary (claude-spt-psyche.exe) runs DETACHED from the SHARED install-dir; orphaned (parent dead) it locks the dir → bricks `adapter update`/`add --release` (tar exit 1). ADR-0025 assumed psyche=daemon-hosted in-process (ADR-0004) and EXCLUDED it from resident cycling — but it's a separate install-dir binary W3's resident-only stop/restart won't release. W3 must absorb: (a) orphan-psyche reap on stop/agent-death [F-010, candidate REQ], (c) psyche-from-own-copy not shared dir [structural], (b) extract-to-temp+atomic-swap [F-015]. perri's repro = the W3 NO-mocks int fixture + her ship acceptance test. Tracked task #7 blocks W3.

**PUBLISHED ✓ 2026-06-22 (counter 29, v0.13.1=28):** deployah cut @2bb9c8f — CI green both runners (incl new W6 token-scan), tag v0.13.2, signed rel-primary-2026, public non-draft. Hashes linux e270734f… / win 44c9090… / update-set v29. CHANGELOG shipped verbatim as doyle-vetted, NO retag. perri pinged. Build→release drive CLOSED end-to-end.

**BUILD COMPLETE — all waves GATE PASS (2026-06-22):** W1-W3 closed; W4 (REQ-ADAPTER-UPDATE-MESSAGE @311b2dc, post-apply `[update].message`, not-on-no-op structural via call-site), W5 (REQ-ADAPTER-PROOF-DIR-OVERRIDE @ce179a1, `*-proof --dir/--manifest` for unregistered bare-file F-011; HELD first on a public-help leak, scrubbed), W6 (TWO REQs @7c377f0: REQ-ADAPTER-VERSION-CMD `spt adapter version` prints existing `[adapter].version`; + REQ-DOCS-NO-INTERNAL-CODES). Each gated by re-running gates MYSELF (green-units≠green-real held all session). GO sent to deployah to cut v0.13.2 (counter ~29). F-011 closes; perri drops F-014 stopgap on W1 publish.

**NEW GATE — public-help no-internal-codes (W6, lesson extends [[cli-command-docs-drift]]):** clap `///` IS public `--help` → regenerated into docs-site/src/cli/reference.md → ships GH-Pages. REQ-*/F-###/M#-W#/ADR-#### are forbidden there (operator: ban ALL incl ADR). KEY: `xtask check` drift-gate only proves generated==source — a faithfully-regenerated leak passes (exactly how W5's `(F-011)`/`(REQ-INSTALL-11)` slipped). W6 added `forbidden_codes_in()` scan over the GENERATED reference.md (left-word-boundary so UTF-8/hyphens don't false-positive; rustdoc `///` on fns/structs NOT scanned — keeps its REQ/ADR refs). TEETH VERIFIED by me: planted ADR-9999 in a clap `///`, `xtask gen` (drift stays 0), `xtask check` → exit 1 naming the lines; reverted clean. Swept 14 pre-existing sites (cli.rs + api/mod.rs).

**Release-author checklist (relayed to deployah):** build-only PR does NOT self-bump — deployah AUTHORS the bump: workspace.package.version→0.13.2 + CHANGELOG section (=release-body) + Cargo.lock FIRST-PARTY crate lines ONLY (third-party collisions bit prior cuts). ci.yml order: push bump → CI green BOTH runners → THEN tag (never tag-early). doyle vets CHANGELOG pre-publish (surface-coverage + overstatement, per v0.8.0/v0.12.0). Pending: operator pre-existing-leak ruling was "ban all incl ADR" — folded into W6, DONE.
