---
name: f030-psyche-ephemeral-progress
description: "F-030 PSYCHE-EPHEMERAL: ALL 6 WAVES DONE + gated @3ab635a; release cut v0.25.0/counter45 IN FLIGHT (deployah)"
metadata: 
  node_type: memory
  type: project
  originSessionId: 7b752f7d-f2f7-4bcd-a539-a73c8828373f
---

F-030 PSYCHE-EPHEMERAL wave. Design: docs/F-030-PSYCHE-EPHEMERAL-DESIGN.md @6f668c2. Branch f030-psyche-ephemeral. doyle=gater (build-then-gate, F-029 cadence, ping sha per chunk). todlando=exec. Headline: Psyche = per-event turn, not a process; liveness = turns succeed, never pid-resident.

**★ WAVE COMPLETE 2026-07-04 — ALL 6 WAVES DONE + DOYLE-GATED GREEN, HEAD @3ab635a (origin-synced). Release cut v0.25.0/counter 45 IN FLIGHT (deployah GO'd).** Wave shas: W0 @169ad61, W1 @ed1eb08, W2 @a08f675, W3 @4ae0b92, W4 @535489a, W5 @1e30491+fix @18f77fc, W6 @c571754/@cbac0ac+fix @55fd6dd+fix2 @5987265/@7a11687+fix3 @3ab635a. Final suite 1541/1541, clippy 0, traceable 399/399, xtask+schema green.

**★ CI-LINUX BLOCK + RECOVERY (2026-07-04):** PR #51's kitsubito Linux leg caught 2 DETERMINISTIC fails my 8 Windows-only gates ALL missed — psyche_context_file_e2e + psyche_residency_expectation_e2e conformance ints, `#[cfg(unix)]` mock-manifest branch. Root: `command='sh -c '...' _ {key}'` = sh-c single-quote wrapped in TOML single-quote literal → parse err → test's own manifest .unwrap() panics; deeper (todlando) even past TOML, fill_template_tokens single-quote-literal+dquote-toggle (REQ-HAZARD-TEMPLATE-ARGV-FILL) kills sh-c grouping → my triple-literal fix would've STILL-red. FIX @f91558e (test-only +25/-4): write .sh FILE + `sh <file> <args>` (mirrors Win .bat; file contents never tokenized). Doyle AUTHORITATIVE Linux gate on kitsubito (bundle rig: git bundle→scp→fetch refs/remotes/origin/…→worktree; cargo needs `export PATH=$HOME/.cargo/bin` non-login ssh; `git rev-parse <40hex>` ECHOES w/o verifying → use `cat-file -e`): clippy 0, 1529/1529 (Linux vs Win 1541 = cfg delta), both ints PASS. Topology: fix ABOVE bump on release branch → deployah reset --hard 3ab635a + cherry-pick f91558e f8d4455 (rebase-i unavailable) → tagged tip = chore(release) bump, tree-identical to f91558e (disjoint files). LESSON HARDENED [[gate-cross-platform-leg]]: cfg-split fixtures invisible to single-platform gate.

**★ CUT PROGRESS (deployah 2026-07-05):** PR #51 (release/v0.25.0) both platforms GREEN on c01fe6e (after Win-seedmap-starvation rerun-failed on doyle-swept box). MERGE = FAST-FORWARD main 188fe1a→c01fe6e (NOT merge-commit — runbook: tag lands on EXACT CI-validated tip; `git push origin c01fe6e:main`, PR auto-MERGED). TAG v0.25.0 → c01fe6e (=c01fe6ee29c...) pushed → release.yml (run 28724881614) + docs-publish.yml (28724881604) triggered → DRAFT building. RC-WINDOW-HOLD ACTIVE — HELD at draft, NO sign/flip. release.yml run 28724881614 = SUCCESS (no EPERM/assemble flake; only cosmetic Node20-deprecation annotation). DRAFT VERIFIED on SaberMage/spt-releases: draft=true, tag v0.25.0, ALL 5 assets (windows.exe 30836224b, linux 41889104b, SHA256SUMS 172b, manifest.schema.json 40443b, mock-adapter.zip 8617b). Pinged doyle draft-ready to stage for perri RC. NEXT: draft green → doyle stages for perri RC ((a)-(d) psyche-turn-contract) + live-agent leg this box → RC-GREEN + doyle final gate → deployah sign+publish counter 45 (`xtask release-publish --tag v0.25.0 --key-id rel-primary-2026 --version 45`, password-mgr seed) → surface published sha as perri v0.14.0 floor. Watch EPERM (displace-not-kill) + assemble flake. **DOYLE STAGED (RC IN FLIGHT):** SHA256-verified Windows core = 0202742115d5bb...8491 vs SHA256SUMS, staged scratchpad/rc-stage-v0250/spt-x86_64-windows.exe → perri. BYTE-ANCHOR for flip = that sha (perri tests the DRAFT asset; xtask release-publish SIGNS the same asset, no rebuild → tested==published by construction). Perri running 5 RC legs on @fd41985. Surfaces pinned code-exact: nested perch owlery/<p>/nested/<p>-psyche/ = custody psyche-custody.json(key session_id) + psyche-context.txt (fresh=non-empty, continue=0-byte); PSYCHE_RESEED = daemon-stderr `PSYCHE_RESEED:<parent-id>` (NOT -psyche, lifecycle.rs:1007); leg-(c) gone-session inject = pre-seed bogus UUID in custody → --resume fails → exit-95; trigger = `spt api echo-gate <probe> set` (delivery.rs:79; arms sentinel, next 60s tick fires 1 turn; msg-delivery also arms per delivery.rs:34). NEXT: perri RC-GREEN → doyle final gate (RC + byte-chain) → flip GO. ★ RC-GREEN + FLIP GO ISSUED (2026-07-05): perri all 5 legs BOUNDARY-CLEAN after doyle-caught boundary violation (operator flag). ADAPTER-BOUNDARY LESSON (banked [[adapter-glue-model-boundary]]): doyle drifted — fed perri spt-core SOURCE (lifecycle.rs lines, raw custody.json path, PSYCHE_RESEED brain-stderr grep = CONTEXT.md:243 anti-pattern "harness reads perch state NEVER brain stderr"). Docs were COMPLETE (MANIFEST.md:114-126 + docs-site manifest.md:45-52 full psyche-turn contract incl boundary-clean reseed observable) → verdict = orchestration error, NOT gap/missing-feature. CORRECTED RC (all my-shim-boundary + public verbs): (c) exit-95 ISOLATION (real claude --resume nonexistent → shim exit 95); (a)/(b)/(d) FAKE-claude-on-PATH logs shim argv (deterministic, no racing sub-second ephemeral, no billing) → non-empty file→--session-id / 0-byte→--resume; live JOINT = v0.25.0 daemon drives shim fresh+continue, `spt endpoint list` NO psyche-host:FAILED (MANIFEST.md:114 affirmation). PARTITION: core-writes-file (doyle e2e) × shim-discriminates (perri fake-claude) × compose (live perch-healthy). FINAL GATE PASS: byte-chain INTACT (draft SHA256SUMS windows.exe == staged re-hash == perri-RC == 0202742115...8491), tag v0.25.0→c01fe6e==main HEAD==kitsubito-gated tree. deployah flipping counter 45 (`xtask release-publish --tag v0.25.0 --key-id rel-primary-2026 --version 45`). NEXT: published sha → perri floor → perri v0.14.0 pack+publish+live-verify. POST-REL DOC-SEED: MANIFEST.md:126 clarify PSYCHE_RESEED = operator-log-only not adapter-signal.

**RELEASE SEQUENCE (post-wave, doyle drives):** deployah cuts v0.25.0 (bump-in-PR, RC-WINDOW-HOLD, CHANGELOG re-derived v0.24.0..3ab635a w/ {psyche_context}→{psyche_context_file} clause in manifest-keys item, Cargo.lock first-party name-anchored/darling hazard, NO [twohost], byte-identity chain) → RC window WITH one live-agent leg on this box exercising perri's psyche turn contract (exit-95 reseed + file-content discriminator, shim @fd41985 = unit under test) → doyle final gate → flip/publish → perri pins min_spt_core floor = published v0.25.0 sha, builds two-platform pack, publishes claude-spt v0.14.0, live-verify. GATE THE RC + FINAL FLIP.

**POST-RELEASE SEEDS (banked, none block):** (1) c1_miss_once_preserves_binary flake — pre-existing load-sensitivity under full-parallel suite, hit twice in W-gates, attribution-matrix-exonerated GC; flake-harden. (2) docs-site/book/ gitignored-tracked HTML hygiene — git rm --cached (rendered regenerates at publish). (3) LESSON schemars-doc-comment=SCHEMA-CHANGE: a rustdoc edit on a schemars struct changes manifest.schema.json → checked_in_schema_is_current reds; per-crate check misses it, FULL-WORKSPACE gate catches it (SPT_BLESS regen). (4) LESSON doc-contract waves = WHOLE-SURFACE audit: grep ENTIRE adapter-facing surface (docs-site ALL pages + MANIFEST + ADRs + rustdoc + cli help) for the retired premise in PROSE not just TOKENS, + audit FULL key catalog for ALL dead keys; enumerate-every-mention beats token-grep (W6 failed 3x on prose residuals a token-grep couldn't see). (5) LESSON gate subagents: FOREGROUND-only dispatch, final msg = verdict (they stall "awaiting notification" otherwise).

═══ WAVE HISTORY BELOW (reference; the summary above is authoritative) ═══

**DONE:**
- W0 @169ad61 — 5 REQ seeds in traceable-reqs.toml, required_stages=[] (per-wave activation): REQ-PSYCHE-EPHEMERAL-DRIVER, -SID-CUSTODY, -NESTED-RESOLUTION, -HAZARD-PSYCHE-RESIDENCY-EXPECTATION, -HAZARD-THRASH-GUARD-BLIND.
- W1 @ed1eb08 (GATED GREEN: clippy --workspace 0 warn, nextest 731 pass, xtask clean; pushed origin). host_one drops resident spawn_psyche_owned; run_psyche_event_turn (lifecycle.rs) drives psyche_turn_and_relay per pulse fire. stdin=<pulse/> standing prompt (composed mind rides W2 reseed, NOT stdin). timeout=pulse-period floor30s. C3(b) strike budget SPT_PSYCHE_TURN_STRIKE_BUDGET=3. Commune non-atomic+loud. NEW perch::psyche_ops_epoch_file() = distinct notif minter (kills pulse-vs-pump RMW; forward-compat v0.24.0 per-minter namespacing — shared epoch = WOKE_FAIL collision class). CONTRACT block on the turn method = perri adapter FREEZE point (keys in / stdin / stdout intent grammar; stdout MUST be non-empty or strike; reply fail-closed on pulse). Residency+thrash guards early-return on has_owned_psyche (W1 bridge; W3 deletes machinery).

**W3 GATE CHECKLIST (7 #[ignore]d in W1, reason=F-030 W3 retires <REQ>):** crashloop_ledger_rate (CRASHLOOP-BACKOFF/THRASH-GUARD-BLIND), brain_restart_psyche_dup, live_adapt_psyche_lock (STOP-PATH-ORPHAN-REAP +W5), livehost_bootrace + livehost_nonresident (LIVEHOST-NONRESIDENT), livehost_psyche_fail (BOOT-RACE), unhost_psyche_reap (UNHOST-PSYCHE-REAP). REWORKED-kept-running: daemon_lifecycle_real_brain + live_bind_firsthost (both keep REQ-DAEMON-1 evidence, no resident). daemon_e2e green (spawn_psyche method direct). REQ-ADAPTER-LIVE-UPDATE keeps running int via live_adapt_translation_swap.

**W2 @a08f675 BOTH GATES GREEN — DOYLE INDEPENDENT GATE: PASS** (isolated worktree + fresh target, 1546 run/1545 pass/1 fail/13 skip, clippy 0, traceable exit 0, W2 ints 4/4 + units 7/7, all 5 semantic checks ✓ incl. guard-revert boundary int + custody invisible to info.json scans). Delivery: core-mints UUID-v4 psyche sid turn-LOCAL (base_keys unmutated; echo/history/signoff keep parent sid), psyche-custody.json custody-ONLY type-enforced, {parent_session_id} never aliased, reseed marker-driven (→ code-95 in W3). SOLE FINDING → W3 (sent todlando): contract_e2e.rs:401-413 live_agent_lifecycle_e2e EMBEDDED resident assertion (waits 30s for {id}-psyche info.json state="psyche") = deterministic red SINCE W1 @ed1eb08 (repro'd at that sha); shutdown/echo tail :435+ dead coverage; W1 ignore-sweep only caught standalone tests. ESCAPE ROUTE: builder self-gates ran 731-test SUBSETS — W3+ gates (both sides) run FULL workspace nextest, seedmap-excluded only.

**W3 @4ae0b92 BOTH GATES GREEN — DOYLE GATE: PASS, W4 CLEARED (2026-07-04).** Doyle full-workspace gate: 1542/1542, clippy 0, doctests pass, traceable 397/397 exit 0; all 10 semantic checks ✓ (residency symbols zero production refs; A-2 seam intact; code-95 unit matrix 95/1/None/EmptyOutput; soft-key Some("") + <fresh-psyche/> red-first; consecutive-N=3 no rate guard; conformance heart complete w/ verbatim argv leg both platforms; contract_e2e tail revived — W2 finding CLOSED; no destructive failure arms; W5 pin in commit body; no surviving resident asserts). 4 NON-BLOCKING findings routed: livehost.rs:280 stale rustdoc→W6; ci.yml:127/129+nextest.toml:55 name 5 deleted e2e binaries (harmless, tidy W4/W6, keep A/B partition invariant); dummy_harness_e2e.rs:107-116 stale resident-premise comment→W6; conformance e2e in Phase-A light pool = defensible awareness. **W4 CONTRACT FROZEN (perri ACK'D, no counter):** single {subnet} via own_subnet ("local" unhomed; NO {home} key — glossary single concept + home: qualifier-position collision CONTEXT.md:652); {psyche_context_file} REPLACES {psyche_context} — path ALWAYS filled, FreshWithPreload writes mind NON-EMPTY, ContinueExisting writes TRULY 0-BYTE NO SENTINEL EVER (binding invariant + core unit len==0 guard; perri trim-emptiness = HER tolerance not our license; her read-fail = generic fail never 95, shim never writes/deletes). REQs register at chunk start: REQ-PSYCHE-CONTEXT-FILE-INDIRECTION + NESTED-RESOLUTION activation.

**W3 build history (todlando) —** (isolated worktree-of-sha + fresh target: clippy -D warnings → nextest --workspace seedmap-excl → xtask). TAKEOVER: the W3 build subagent (a51f681) appeared dead at first check (0-byte output) but its edits + LATE writes (int file, units, toml supersedes) ALL flushed to the shared checkout — its FINAL report LAGGED the tree flush. LESSON: ground-truth via git status + traceable, NEVER trust a subagent's self-report. Reviewed full diff = correct+in-scope (reconcile A-2 seam CLEAN, host_one no resident, note_turn_outcome psyche-fields-only, 4 fold-ins landed). The agent DOWN-SCOPED TEMPLATE-ARGV-FILL to [impl,unit] (collateral — its ONLY int lived on deleted livehost_nonresident_e2e:32); doyle RULED RE-HOME → I restored [impl,unit,int] + folded genuine case-(a) argv evidence into the conformance int: mock reads MULTI-WORD {parent_session_id}="alpha beta gamma" as SINGLE first positional (unix `sh -c '..$1..' _ {parent_session_id}` / win one-shot .bat `%~2` — single-positional so echo-rejoin canNOT fake-pass; `cmd /C echo` WOULD fake-pass = doyle-caught). RED-first PROVEN: guard-revert fill_template_tokens→old fill-then-tokenize → mock read ["alpha"×3] → argv assert RED, residency asserts stayed green. Int file = crates/spt-daemon/tests/psyche_residency_expectation_e2e.rs (exit-3 STRIKE non-95 + custody-KEPT assert; parent stays HOSTED+ONLINE+ready; RED-first = v0.13.2-teardown guard-revert). W5 transition-orphan pin rides commit body VERBATIM. NEXT: gate GREEN→push→ping doyle→W4 (doyle wants 2-subnet single-node rig scoped; release target now on wave end — deployah cuts counter 45 after W6, perri publishes on floor).

**W3 ORIGINAL SCOPE (agent a51f681, doyle-scoped):** delete residency machinery (confirm_residency_or_unhost/detect_psyche_thrash + dead cluster) + reap cluster (FORK-B, supersede UNHOST-REAP/BRAIN-DUP/STOP-PATH same commit); thrash guard = W1 consecutive-N=3 note_turn_outcome (FORK-A, NO rate belt); conformance int = hall-bf shape (multi-subnet, failing turns → parent ready PRESENT+deliverable, no churn, psyche_host_error only); keep reconcile set-diff seam CLEAN for REMOTE-TRUTH A-2. TWO DOYLE FOLD-INS mid-build: (i) reseed discriminator = RESERVED EXIT CODE 95 (is_psyche_session_not_found status_code==Some(95), stderr human-only, perri-accepted); (ii) {psyche_context} SOFT key — psyche_turn_keys None arm insert("") not remove (fill_template loud-fails absent referenced key), + first-turn None-download seeds <fresh-psyche/> so non-empty⟺fresh (else empty-download reseed-churn), red-first zero-context first-fire asserts NO PSYCHE_RESEED. W3 COMMIT MSG carries the W5 transition-orphan pin verbatim.

**W3 @4ae0b92 DOYLE INDEPENDENT GATE: PASS — GO W4** (1542/1542, clippy 0, doctests, traceable 397/397; all 10 semantic checks incl argv single-positional both platforms + my re-home; contract_e2e tail revived = W2 finding CLOSED; W5 pin in body). 4 NON-BLOCKING findings: #1 livehost.rs:280 stale rustdoc + #3 dummy_harness_e2e:107-116 stale resident premise → W6 docs sweep; #2 ci.yml:127/129 + .config/nextest.toml:55 filters name the 5 DELETED e2e → FOLD into W4; #4 psyche_residency_expectation_e2e in Phase-A light pool = defensible.

**W4 @535489a GATED GREEN + PUSHED** (clippy 0, nextest 1548/1548, xtask 0 — reap-fold preempted os-error-5); doyle independent W4 gate RUNNING (parallel). **W5 SPEC APPROVED AS SCOPED (doyle, spec=scratchpad/F030-W5-build-spec.md), build HELD for doyle-W4-verdict + perri-transition-orphan-answer.** W5 = PART A .live-bin dissolution (DEAD-CODE post-W3: psyche_spawn_runtime + BrainLifecycle::spawn_psyche/_owned + .live-bin have ZERO prod callers, only tests daemon_e2e:174 + lifecycle unit:2002 + own-copy units:2649-2790; run_psyche_event_turn uses runtime_snapshot) — DELETE machinery+tests, GC owlery/*/.live-bin at brain start (F-028 C1 displace if locked), live_adapt_psyche_lock_e2e #[ignore] resolves (delete). MANDATORY collateral REQ check (W3 lesson): deleted symbols carry [impl->REQ-ADAPTER-LIVE-UPDATE/INSTALL-11/DAEMON-HOSTED-LIVENESS] — grep each OTHER evidence + traceable dangling-stage BEFORE delete, repoint/supersede SAME commit (ADR-LIVE-UPDATE must exit int-covered by translation-swap). PART B transition-orphan = PENDING PERRI (re-verify stranded wrapper vs POST-W3 daemon, NOT 0.13.4 refusal): self-exit→option-i doc-only; loop→option-ii REQ-PSYCHE-LEGACY-RESIDENT-SWEEP. [twohost]=NO. ---
**W4 COMMITTED @535489a — GATE RUNNING** (worktree-of-sha + fresh target; reap-leaked-gate-target-spt.exe folded BEFORE xtask = W3 os-error-5 lesson baked into the gate script). Build agent a25b30489df72c59a delivered; I ground-truthed + reviewed full diff = correct+in-scope, both ints FAITHFUL (nested_resolution_e2e drives REAL `spt ready dunsen-w1` no --subnet→homes alpha + Self control refuses; psyche_context_file_e2e = 40KB mind, role copies its {psyche_context_file}, proof HEAD+TAIL+len>=40KB → mind rode the FILE not argv, RED=empty-file), perri PIN 1 unit asserts file len==0, Self-id refuse preserved, no scope-creep, traceable exit 0. CI tidy #2 folded. W6 COSMETIC SEED: first_turn_psyche_context_is_never_empty unit comment still says "{psyche_context} fill" (now file content) → W6 doc sweep w/ #1/#3. NEXT: gate GREEN→push→ping doyle→W5 (.live-bin dissolution, owns W5 transition-orphan pin) → W6 (docs+ADR+3-surface keylist sync+2 KNOWN-HAZARDS). --- ORIGINAL W4-IN-FLIGHT RULINGS (locked):

**W4 IN FLIGHT (todlando lead, build agent a25b30489df72c59a / perch todlando-w226, 2026-07-04).** RULINGS LOCKED: [twohost]=NO (single-node); Q1 = single {subnet} (own_subnet, NO {home} — home: is the subnet-qualifier position CONTEXT.md:652, home subnet is ONE concept :640); Q2 = FILE-ALWAYS {psyche_context_file} REPLACES {psyche_context} (perri ACK, no counter); Q3 = REQ-PSYCHE-CONTEXT-FILE-INDIRECTION. PERRI 2 PINS: (1) ContinueExisting writes file TRULY 0-BYTE, NO sentinel EVER (else non-empty=fresh misfires spurious --session-id adopt) — CORE unit asserts len==0; (2) trim-emptiness is HER tolerance, core writes EXACTLY 0 bytes. Spec = scratchpad/F030-W4-build-spec.md. 2 REQs REGISTERED+ACTIVATED [impl,unit,int] (NESTED-RESOLUTION retitled to single-{subnet}; CONTEXT-FILE-INDIRECTION new) — traceable RED on 6 stages = expected pre-build. SEAM: nested ROOT = home::assign_home Ambiguous (home.rs:71) on multi-subnet w/o --subnet; fix = home::nested_parent_home + effective_subnet wired at BOTH seams (start_homed cli.rs:5278 + bind_from_seed→stamp_creation_fields startup.rs:240), keep those PURE, Self-id STILL refuses. base_keys {subnet} lifecycle.rs:471. {psyche_context_file}: run_psyche_event_turn writes mind to nested {id}-psyche perch dir before spawn. KEYLIST = doc-catalog-only (no validation callers) → 3-surface sync is W6. CI tidy folded. NEXT: review agent diff → gate (worktree-of-sha, REAP leaked gate-target spt.exe by PATH before xtask — W3 hit os-error-5) → commit → push → ping doyle.

**W4 @535489a BOTH GATES GREEN — DOYLE GATE: PASS, W5 CLEARED (2026-07-04).** Full workspace 1548/1548, clippy 0, traceable 398/398; all 9 semantic checks ✓ (both seams + Self-refusal control, single {subnet} no {home}, file-always w/ BINDING 0-byte unit lifecycle.rs:1752-1756, 40KB file-ride e2e reads filled path, nested e2e real-binary + control, CI mirror byte-identical, contract keys-in updated, zero old-behavior asserts, diff = frozen scope no creep). FINDINGS all comment-only, ROUTED → W5: G-1 lifecycle.rs:1020 stale contract-block line ("mind rides {psyche_context}") — perri-facing, fix W5 not W6 (perri cautioned: her impl correct, ignore stale line); G-2 stale comments :1053-1055/:1141; resume_psyche DEAD-SEAM (spt-live/resume.rs:43,278 — inline-key survivor, zero prod callers) retires WITH W5 Part A + mandatory collateral-REQ check (REQ-SEAM-RESUME-class tags). W6 keeps: SUBSTITUTION_KEYS catalog sync. Rig phenomenon: empty cwd-held gate-dir residue recurs (gate-w2/w3/w4), harmless self-clears.

**W5 RULED (2026-07-04): OPTION (ii) SWEEP — doyle concurred w/ todlando rec; todlando ack'd all pins verbatim.** Post-W3 re-verify OVERTURNED the early exit-4 read: the v0.13.4 wrapper's only IPC = BLOCKING `spt ready <parent>-psyche --once` (no timeout; wrapper lifetime = the call), and post-W3+W4 that poll REGISTERS CLEANLY (W4 nested-resolution made it succeed subnet-less!) then blocks FOREVER — non-terminal hang, no exit/error/CPU, invisible (KH 2.6 class). Option (i) dead (no self-exit exists); refuse-guarding hot `spt ready` would gut the W4 path. FOUR SWEEP PINS: (1) one-shot brain-start ONLY, never per-reconcile/periodic; (2) fail-safe-DECLINE positive-match-only (id+cmdline BOTH match wrapper shape; ambiguity → decline+loud, never kill); (3) sweep the RESIDUE too — the hung wrapper registered a <parent>-psyche ready perch = phantom dead-pid ready-record (REMOTE-TRUTH presence-lie class) — clear it or prove existing stale-cleanup reaps it, assert in int; (4) red-first BOTH directions (matching mock swept+residue cleared; non-matching DECLINED control). REQ-PSYCHE-LEGACY-RESIDENT-SWEEP impl+unit+int, registers chunk start. W5 = Part A (.live-bin dead-code dissolution, zero prod callers verified, collateral-REQ check mandatory) + Part B(ii).

**W5 @1e30491 DOYLE GATE: FAIL (2026-07-04) — ONE FINDING, fix in flight.** All else green (1542/1542, clippy 0, traceable 399/399 no silent drops, Part A deletion complete, all 4 sweep pins faithful — immunity discriminator coded on read_pid-None/custody-only exactly as designed, daemon_e2e rework preserved DAEMON-4, scope exact). FINDING F: .live-bin GC NOT IMPLEMENTED (design :158-161 was approved Part A scope) — only creation machinery deleted; pre-W5 endpoints keep stranded multi-MB .live-bin copies forever. FIELD-CORROBORATED: hall-bf on THIS box runs owlery\hall-bf\.live-bin\claude-spt.exe psyche pid 208192 (installed infra — also the exact legacy-wrapper shape the sweep will kill on first post-upgrade brain start). FIX SHAPE sent: brain-start one-shot GC ORDERED AFTER the sweep (sweep kills image-running wrapper → dir unlocks; still-locked → F-028 C1 displace, never delete-fail-abort); red-first staged-dir + locked-variant; no silent coverage. 3 cosmetic nits → W6 ledger: lifecycle.rs:12 module-doc [spawn_psyche] mention; lifecycle.rs:1644 W3-era comment; recurring empty gate-dir residue.

**W5 FIX @18f77fc RE-GATE: PASS — W5 CLEARED, W6 GO (2026-07-04).** F1-F6 ✓ (livehost.rs-only diff +129/-1; boot order sweep→GC→reconcile; non-existing-target displace = crc-swap class avoided; injected-remove seam; red-first mechanically re-verified AT GATE via guard-revert). 1543/1543, clippy 0, traceable 399/399. todlando process tightening: gate-side grep of SPEC DELIVERABLES vs diff (the build agent omitted a spec item + review checked only headline behaviors). TWO BANKED: (1) FLAKE SEED post-release — inject_control_wedge::c1_miss_once (B6 C-1) = PRE-EXISTING load-sensitivity under full parallel suite (attribution matrix exonerated GC: baseline green, fix-minus-unit green, pair green, rerun green); (2) RIG MYSTERY SOLVED — recurring empty gate-dir residue = hung findstr.exe+conhost pairs leaked by e2e holding cwd handles in crates/spt-daemon; future gates sweep findstr pairs in the reap-fold. hall-bf .live-bin wrapper field-confirmed premise mid-gate (fresh spawn observed); displaces on first post-upgrade boot.

**W6 @c571754(code)+@cbac0ac(docs) DOYLE GATE: FAIL (2026-07-04) — 3 doc-contract defects, fix in flight.** Mechanical all green (1543/1543, clippy 0, cargo-doc clean on touched crates, traceable 399/399, 6 doc-stages on real surfaces, ADR-0025 Amd3 correct — todlando's grep-verified override of my wrong ADR-0023 steer). DEFECTS (all docs-only, v0.13.2-class — perri builds blind from these): (1) docs-site patterns.md teaches RETIRED resident model as current (:237-242 {psyche_prompt} resident wrapper; :263-267 prove-live via LIVEHOST_PSYCHE marker w/ ZERO emit sites + perch-online that custody never stamps = proof can never pass); (2) DEAD KEY PROMISES — {psyche_dir}/{psyche_prompt}/{agents_json} zero fill sites yet in all 3 catalogs + docs-site:164-167 claims turn fills them (doc-following adapter → MissingKey → every turn fails) + {id} documented as nested id, reality PARENT (lifecycle.rs:476); RULED: DELETE dead keys from all 3 catalogs (catalog = guaranteed-fillable, no annotation half-measure), fix {id}, add missing {adapter_dir} docs-site row; (3) psyche_init=GATE-ONLY documented nowhere (MANIFEST:105/:565 + ADR-0025:73 still say turns spawn via psyche_init template; reality PSYCHE_INIT_ROLE zero spawn callers, turn = psyche_resume only turn.rs:27) + cli.rs:7592 help phrasing. Minor ride-alongs: info.rs:37/:49 + cli.rs:5386 spawn_psyche rustdoc. PRE-EXISTING noted not W6: cargo-doc warns untouched crates, "M8 decision" x3 generated cli reference. Perri WARNED off the stale passages (her frozen contract + @fd41985 unaffected). RELEASE HOLDS until docs read true.

**W6 FIX @55fd6dd RE-GATE: FAIL #2 (2026-07-04) — named defects FIXED, 4 SIBLING pages missed.** D1/D2/D3 all correctly fixed (catalog coherent both directions, exactly 13 keys; prove-live grounded in note_turn_outcome clean-turn-clears lifecycle.rs:1087); mechanicals green. But R3 whole-surface clause caught 4 residual adapter-facing docs-site claims of retired model: manifest.md:186 "psyche_init runner" (SAME FILE the fix touched — twin sentence in docs/MANIFEST.md:91 fixed, sibling missed), install-on-demand.md:145 same sentence, lifecycle/overview.md:35-36 full companion-process-spawned model, integration-checklist.md:128-129 psyche_init among spawn templates. MISS PATTERN: audit grepped premise TOKENS; residuals say "psyche_init runner/spawn" in PROSE. RULED: fix 1-4 + sweep ALL minors same class (KNOWN-HAZARDS:567 {psyche_dir} example, CONTEXT-MEMORY:41, psyche.rs:3-9 rustdoc, live.rs:31, bootgate test comment, api.md:21 companion wording) + DELETE compose_psyche_prompt (zero prod callers, c571754 dead-pub class, tiny lead code commit) + AUDIT METHOD = enumerate EVERY docs-site psyche_init mention, classify each. My re-gate runs the same enumeration.

**PENDING:** W6 fix-2 commits → doyle re-gate (enumeration check + fresh mechanical) → F-030 DONE → deployah cuts counter 45/v0.25.0 (CHANGELOG scaffold ruled: {psyche_context} replacement = one clause in manifest-keys item since it WAS published catalog; manifest-keys item stays, harness-contract altitude) → RC window w/ live-agent leg → perri floor-pin + v0.14.0 publish + live-verify.

**W6 KEYLIST GATE CRITERIA (doyle recon 2026-07-04):** SUBSTITUTION_KEYS (runtime.rs:37-60) is DOC-CATALOG ONLY — zero validation callers (grep confirms sole definition site), so drift is silent. Already drifted: W2's {parent_session_id} filled but ABSENT from runtime.rs catalog + MANIFEST.md:129 + docs-site manifest.md. W6 must sync THREE surfaces (runtime.rs const, MANIFEST.md:129, docs-site/src/harness-contract/manifest.md#substitution-keys) with: {parent_session_id} (W2), {home}/{subnet} (W4), {psyche_context_file} if W4 lands it, AND the {psyche_context} SOFT-KEY exception ("unprovided placeholder fails one-line error" text now has one exception: {psyche_context} fills EMPTY on ContinueExisting).

**RELEASE DRIVE (operator-called 2026-07-04, deployah PREP-ACKED by doyle):** F-030 → release publish when W6 gates. deployah prepped, doyle verified all six: counter 45 CONFIRMED vs PUBLISHED SaberMage/spt-releases metadata (latest=v0.24.0 @188fe1a; releases repo owner=SaberMage), bump-in-PR, RC-WINDOW-HOLD, CHANGELOG by user-facing surface v0.24.0..HEAD (xtask excl), Cargo.lock first-party name-anchored (darling×3 @0.23.0 hazard), [twohost] RULED NO (doyle 2026-07-04, item 5 CLOSED — W4 cross-node-looking surface is entirely single-node: 2-subnet single-node rig, local resolution/local fills; PR title carries NO [twohost] tag). GO = doyle after W6 gate. RC-LEG ADDITION (doyle 2026-07-04): perri adapter this cycle = NEW shim psyche_resume single-role @fb94917, manifest floor PUBLISH-BLOCKER pinned to F-030 core sha; RC ints exercise psyche TURN CONTRACT (exit-95 reseed, soft-key discriminator) → RC window wants ONE live-agent leg on THIS box; doyle shapes with perri at RC. ADAPTER VERSION = claude-spt v0.14.0; FLOOR for perri = release-cut sha. CHANGELOG SCAFFOLD PRE-STAGED (scratchpad/CHANGELOG-v0.25.0-draft.md, sent doyle 2026-07-04) against doyle's COMPLETE surface inventory: 4 Changed (per-event psyche W1@ed1eb08+W3@4ae0b92; psyche-own sid survives /clear W2@a08f675; nested parent/nested resolve w/o --subnet W4@535489a + cures poll-refusal 0.13.4; manifest keys {parent_session_id}/{subnet}/{psyche_context_file}) + 2 Fixed (failing psyche never unhosts parent — exit-95 reseed/consecutive-strike→psyche_host_error, residency/thrash/reap RETIRED = hall-bf class; upgrade auto-sweeps stranded wrapper + .live-bin GC W5@18f77fc). EXCLUDED: {psyche_context}/{home} internal-only rename (never shipped public), W6 docs-only, xtask. DOYLE SCAFFOLD RULINGS APPLIED (2026-07-04): (a) {home} exclude CORRECT (never in any published surface); but {psyche_context} WAS published (v0.24.0 catalog MANIFEST.md+docs-site) → removal IS observable → folded ONE CLAUSE into manifest-keys item ("{psyche_context_file}…replaces the inline {psyche_context} key"), NOT own entry (CHANGELOG-scope lesson: observable surface decides, not commit intent — a removed published key is observable); (b) KEEP manifest-keys at harness-contract altitude (adapter authors = users of published contract, docs dual-audience per DOCS-STRATEGY, headline IS contract evolution) — do NOT pull. W6 docs+xtask exclusion confirmed. Headline+structure GOOD. RE-DERIVE from actual v0.24.0..HEAD diff at cut. Then perri floor-bump + publish + live-verify. GO = doyle post-W6 gate (W6 building NOW).

**CUT v0.25.0 IN FLIGHT (deployah, GO'd by doyle 2026-07-04, HEAD=3ab635a):** counter 45. main=v0.24.0 @188fe1a EXACTLY (merge-base w/ f030 same → clean). Branch release/v0.25.0 off 3ab635a, commit f8d4455 (bump+CHANGELOG+lock). **PR #51 OPEN** base main. Bump: root Cargo.toml 0.24.0→0.25.0 + 10 first-party lock lines (9 spt-* + xtask, line-numbered sed; ZERO third-party touched, no spt-prefix third-party this cut). CHANGELOG re-derived from actual v0.24.0..3ab635a diff (=F-030 W0-W6 + 3 docs commits e8654da/c248afc/130ca6c EXCLUDED docs-only); cli.rs = help/rustdoc reword to per-event only (no flag/cmd, no separate entry); SCRUBBED internal mechanics (exit-95→"gone-session condition", psyche_host_error→"endpoint error status", residency/thrash/reap→"older machinery") KEPT manifest keys+{psyche_context}→{psyche_context_file} clause per doyle. xtask gen = NO content drift (reference.md W6-current, restored LF/CRLF-only touch). NO [twohost] tag. NEXT: CI green on #51 (=tag gate per runbook) → doyle merge → tag v0.25.0 on merged main HEAD → DRAFT → RC-WINDOW-HOLD (doyle stages binary for perri RC + live-agent leg this box) → flip on RC-GREEN+doyle final gate → sign+publish local (password-mgr seed, `xtask release-publish --tag v0.25.0 --key-id rel-primary-2026 --version 45`) → surface published sha as perri floor (claude-spt v0.14.0). Watch leaked-runner EPERM (displace-not-kill). **CI HOLD (2026-07-04):** run 28721865513 — Linux/kitsubito `test` job FAILED in Phase-A light pool; traceability PASS; Windows test + both n1-gates still in_progress. doyle VERIFYING flake-vs-real (suspects banked c1_miss_once full-parallel flake) — TAG PARKED, NO MERGE until his ruling. gh blocks failed-job log read until WHOLE run completes (partial-run block) — can't second-read identity yet. **RULED REAL (doyle 2026-07-04, NOT flake):** 2 F-030 test-FIXTURE bugs — nested-single-quote TOML collision in unix mock manifests of BOTH conformance ints: panics at context_file_e2e:129 + residency_expectation_e2e:137 (unix mock branch ONLY). Production code CLEAN. NO rerun-failed (deterministic, re-fails). CUT PARKS. Routed todlando: fixture fix + MANDATORY Linux gate leg (doyle's Windows-only gating missed it — was the escape). Windows test + traceability already GREEN on #51; only Linux test blocks. **REBASE PLAN (deployah):** on doyle's fix-sha-gated-both-platforms ping → rebase release/v0.25.0 (f8d4455 bump+CHANGELOG+lock) onto new HEAD (fixture-only fix = zero conflict expected; re-verify 10 first-party lock lines + workspace-member set if fix touches Cargo.lock or base moved) → force-push → PR #51 CI re-runs BOTH legs → green → doyle merge → tag v0.25.0 on merged main → draft → RC window. PR #51 STAYS OPEN (rebase in place, no new PR), counter 45 HELD. LESSON: gate needs cross-platform leg (unix-only mock manifest branch = Win-gate-blind) — [[gate-cross-platform-leg]]. **FIX = f91558e (todlando), test-only +25/-4, 2 e2e files, lock/bump UNAFFECTED.** doyle TOPOLOGY RULING: tagged tip = chore(release) v0.25.0 bump (self-describing release HEAD); fixture-fix BELOW it. FINAL SHAPE: [waves…3ab635a][fix(f030) fixture f91558e][chore(release) v0.25.0 f8d4455]←tag v0.25.0. MECHANIC: rebase f8d4455 onto new f030 HEAD (=…f91558e) as tip → force-push → PR #51 both legs. **HOLD force-push/CI-rerun til doyle "Linux gate GREEN" ping** — he's running independent Linux gate on kitsubito NOW; CI rerun would COLLIDE on that runner (kitsubito=Linux CI box, gate-box contention class). NOT touching branch til GREEN. **ACTUAL STATE VERIFIED (read-only):** release/v0.25.0 local+origin = [3ab635a][f8d4455 bump][f91558e fix] — todlando pushed fix ABOVE bump; f030 still @3ab635a (fix ONLY on release branch). REORDER MECHANIC (git rebase -i UNAVAILABLE in this env = interactive blocked): `git checkout release/v0.25.0 && git reset --hard 3ab635a && git cherry-pick f91558e f8d4455` → [3ab635a][fix][bump]←tag → force-push. No conflict (fix=2 e2e files, bump=CHANGELOG/Cargo.*, zero overlap). CAVEAT: cherry-pick re-parents → tagged tip = NEW sha (f8d4455 content byte-identical, new parent). Re-verify lock 10-lines+CHANGELOG post-reorder (no-op expected).

**GOTCHAs:** CORRECTED — the CONTEXT.md "effective instance state" para was NOT agent scope-creep: it was doyle's operator-ruled grill edit (v0.24.0 bug-batch Q1), sitting uncommitted in the shared tree; todlando's revert ate it; restored+committed @130ca6c. TWO lessons stand: REVIEW every subagent diff + stage explicit paths only (correct instinct, keep); AND design/grill rulings land as immediate docs() commits, never uncommitted in the shared checkout. seedmap nextest EXCLUDE (env starvation on gate box). 4 spt.exe @ AppData\Local\spt-core\bin = installed live infra, NEVER kill (test daemons in target-dir only). base_keys+lifecycle.rs = W2 edit surface (custody bug at livehost.rs:518 = parent sid fill).
