---
name: v0220-validation-wave
description: "spt-core v0.22.0 validated 2026-07-03 — endpoint-info+SI-1 GREEN, v0.12.0 verify mostly closed, 8 findings to doyle incl. F-026 root cause (forward-slash trust key) + psyche crashloop"
metadata: 
  node_type: memory
  type: project
  originSessionId: 6381498d-5efd-4af4-835f-b4ef61197264
---

**2026-07-03 (perri): doyle's v0.22.0 ping (counter 42) VALIDATED + REPORTED.** Node HFENDULEAM: spt 0.21.0→0.22.0 (was already 0.21.0 despite HOLD memory — stale), daemon+broker current, adapter 0.12.0 registered (pointer, `_github/SaberMage-claude-spt`). Probe rig: `spt endpoint run --adapter claude-spt --id si1-probe --start` from scratchpad cwd; purged after.

**GREEN:** (1) `spt api endpoint-info` — binary=docs verbatim, honest NO_SELF/NO_ENDPOINT(exit 1), full JSON incl. cwd/project/controlled. (2) **SI-1 E2E ×3** — relative `commune_dir=".claude"` resolves against ENDPOINT cwd (≠ daemon cwd), commune consumed ~5s → our commune-slice authoring unblocked. (3) endpoint list project column ✓; CONTROLLED clears on rc detach ✓ (healthy daemon); --view never sets it ✓. Remote-row adapter/history/controlled = env-blocked (no live remotes).

**v0.12.0 on-node verify (was THE deferred item): mostly CLOSED.** Project-named sessions VERIFIED LIVE (argv `-n "si1-probe @ HFENDULEAM (si1-probe/)"` + RC `si1-probe--HFENDULEAM--si1-probe` + PTY prompt box renders it). Checkpoint RACE-FIX half VERIFIED (ARM → clear-only, boundary rotated, psyche-download into fresh session, NO wake into old session). **Wake-delivery half OPEN** — blocked core-side: dormant-gate refuses the SessionStart FIRE self-send on headless probes (v1 residual live-confirmed), then intermittent `FORCE_NATIVE_UNDELIVERED: no live translation binary` with translate ALIVE + endpoint active/idle (checkpoint chain is force-native-dependent — if this decays across clear/dormancy cycles, macro dies silent). Close on operator-attended run or when doyle moves F-e/F-f.

**Findings sent (F-a..F-h):** pump STALL once during rc attach/detach churn (RC_FAIL brain IPC deadline; restart recovered; endpoints auto-revive after); stale CONTROLLED on dead endpoints (hall-b, survives restarts); SI-1 resolution rule = docs gap; daemon status JSON managed_by/pump drift; force-native liveness (F-e); dormant-gated fire (F-f); **F-026 ROOT CAUSE: ~/.claude.json projects keys are FORWARD-SLASH — backslash-keyed hasTrustDialogAccepted silently ignored; forward-slash pre-seed → headless bind in 5s** (+ `endpoint run` silent about trust-wedge); **psyche wrapper crashloop** ~3 boots/sec ×30min (ordinal 5358) when psyche CC dies at trust gate, `endpoint shutdown` does NOT kill the looping wrapper (manual kill needed) — asked for backoff + shutdown coverage.

**Adapter-court residue (mine, next pass):** (a) commune SKILL hardening — probe agent wrote `<id>-commune.md` to an ABSOLUTE foreign project path (`~/Documents/projects/spt-claude-code/.claude/`) instead of cwd-relative; PostToolUse write-detect never matched → no ARM → checkpoint dead. Skill text should pin "write to $CLAUDE_PROJECT_DIR/.claude/ (your OWN cwd)". (b) Fresh/post-clear session with QUEUED spool gets NO delivery until first manual turn opens an idle window (probe needed a typed nudge twice) — F-023-adjacent, local flavor. (c) `spt api listen` CHANGED on 0.22.0: no --manifest; flow = `api seed --pid <winpid> --session-id <uuid>` → `api listen <id> --subnet <s> --parent-pid <winpid>`; by-pid host resolution (bash.exe unresolvable; error suggests `--adapter` flag that exists on NEITHER seed nor listen — CLI msg bug candidate). Old live-bringup recipe memory is STALE.

**F-028 C2 → v0.12.1 SHIPPED** (tag v0.12.1, Latest, adapter.spt @3b564a7): `[session.psyche_init]` env_remove = ["OWL_SESSION_ID","SPT_AGENT_ID"] (psyche must not inherit parent identity env → cross-perch rebind; hall-a field evidence). KH §2.5 + REQ-HAZARD-PSYCHE-IDENTITY-ENV (doc+unit; int deferred) + manifest-shortcut assertion @31fac52. Manifest-only cut: binary = 0.12.0 repack, floor stays 0.20.0 (vendored schema already has SessionRole.env_remove = registration floor-safe; old runtimes no-op scrub). **B2 resolved core-side** ({session_id} in [session.resume] now = harness-reported UUID, not spawn-time 16-hex; template unchanged, zero adapter edits). Deferred live-verify int pair: (1) psyche child env lacks identity vars, (2) resume receives UUID-shaped value — run when doyle's B2 sha ships. **B7 remote-CONTROLLED repro:** first attempt NOT-GO — ENLYZEAM broker stale at 0.21.0 (broker_stale=true, caught by our F-025 surface); attach refusal "no live session" + stale-Active gossip row = version skew, not defect; re-run post-operator-bounce of ENLYZEAM (attended, B2 resume-hang risk). endpoint-info = local-perch-only (remote id → NO_ENDPOINT; docs gap doyle's).

**C3 ADAPTER-HALF BUILT (@50af830, pushed, UNCUT — binary, rides next cut):** psyche host ThrashGuard — instant cycle = <2s (INSTANT_CYCLE_MS), backoff 500ms×2 cap 5s, GIVE_UP_AFTER=8 → PSYCHE_HOST_GIVE_UP stderr + exit 3 (wrapper death → core psyche_host_error). Coupling doyle-ruled: core C3(b) trip = ≥10 boundaries/60s @b2351a0, mine fires FIRST (≤8 boundaries, ~38.5s worst case); pinned by KH §2.6 + unit give_up_stays_inside_the_core_backstop_window (derived from live constants). REQ-HAZARD-PSYCHE-HOST-THRASH (doc+unit; red-first live int deferred). **B2 sha 259aec2 gated green core-side but UNRELEASED — counter 43 (v0.23.0, deployah) is the carrying cut; my 2 ints (psyche env scrub via psutil environ(), resume `-r <36-char-UUID>` argv + RESUME_NO_HARNESS_SESSION negative leg with WHOLESALE sessions.log/perch-dir purge, never row-edits) = RC verification at doyle's upload-before-flip ping; red blocks the flip.** Pending cut contents: F-028 C2 env_remove is SHIPPED (v0.12.1); C3 thrash guard = next cut.

Related: [[f023-f024-crossnode-delivery]], [[v0120-checkpoint-race-project-names]].
