The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\MEMORY.md has been updated successfully. (file state is current in your context — no need to Read it back)

- [M9 status](m9-wave1-progress.md) — M9 COMPLETE, ALL 4 gates closed: G1(PR#7) · G2(PR#8) · Gateway-WAN(PR#9,REQ-MSG-6) · G3(PR#10). Merge-to-main = release-only (operator); PRs HELD; no tag rides M9. Don't re-plan, don't merge
- [M9 Wave3/G3 digest](m9-wave3-digest-progress.md) — session-digest re-founded on session logs (REQ-TERM-4, ADR-0008 amendment); G3 STAMPED PASS by doyle 2026-06-13, PR#10 held. On-demand projection (topology-independent, no PTY); PTY-parse retired; published digest-record contract; autonomous-freshness+Option-C deferred to consuming-frontend milestone (DEFERRED.md:44)
- [hfenduleam target bloat → CI RED](hfenduleam-target-bloat-ci-red.md) — Win-runner LNK1318/os-error-112 can be disk-full from cargo target bloat (396GB seen), NOT a code regression; cargo clean + re-run; check disk before treating a Windows RED as a code defect
- [v0.4.1 Linux respawn blocker](v041-linux-respawn-blocker.md) — v0.4.1 PUBLIC (counter 8); fleet roll found Linux brain-respawn bug (current_exe follows apply-rename → brain runs OLD bytes, records applied:8). hfenduleam(Win) GREEN, kitsubito(Linux) RED. RESOLVED by v0.4.2 — see [[v042-published]]
- [v0.4.2 published](v042-published.md) — PUBLIC 2026-06-11 (counter 9); FIXES v0.4.1 Linux respawn blocker (respawn via canonical install path not current_exe + bytes-assert→auto-rollback; REQ-HAZARD-BRAIN-RESPAWN-PATH + real-rename E2E). deployah drove full merge→tag→sign→publish solo. hashes linux 500a9e7b… win b9ec8ddd…. ASYMMETRY: v0.4.2 apply still rides buggy v0.4.0 broker → 1 final manual Linux bounce loads fix; seamless proof on NEXT update via debug-channel. todlando driving fleet roll + restoration close
- [pump-IPC-deadline fix](pump-ipc-deadline-fix.md) — DONE: MERGED to main @ 4d8b810 (PR #3), doyle-approved, CI green both runners; reader-thread+channel carrier (nonblock dead on Win named pipes), both amendments folded, no tag (rides v0.4.1). Don't re-plan
- [CI self-host migration](ci-selfhost-migration.md) — DONE: runners live on kitsubito + hfenduleam (gravity retired 2026-06-07); twohost jobs gated by [twohost] commit tag; don't re-plan
- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener, hands off; target\debug\spt.exe daemon = dev/test artifact, killable
- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear instead
- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6
- [Gravity deploy procedure](gravity-deploy-procedure.md) — ssh david@100.100.62.43; build in ~/spt-core-deploy NOT runner workspace; setsid daemon; ~1 min first-sync after restart
- [Linux SPT_HOME no-bug](linux-spt-home-no-bug.md) — unix spawn_detached inherits env (no env_clear), forwards SPT_HOME; only Win CreateEnvironmentBlock rebuilds/drops it (f99dc25). Default-home daemon = launched w/o the var, not a propagation bug; don't reopen
- [kitsubito Linux rig](kitsubito-linux-rig.md) — ssh reavus@kitsubito (key auth); cargo at ~/.cargo/bin; deploy checkout origin=local runner (NOT GitHub) so unpushed commits transfer via git bundle; live spt-daemon user unit, --user ops need no sudo; build-in-scratch leaves ~/.local/bin/spt untouched
- [Use $OWL send for messaging](owl-send-not-legacy-spt-send.md) — `$OWL send` works (legacy = where live perches run); `spt send` is the NEW spt-core binary but no perches on it yet → bounces NO_PERCH; don't read `$?` after piping send through tail (use PIPESTATUS)
- [daemon service-detection gotcha](daemon-service-detection-gotcha.md) — service detection reading GLOBAL OS state is blind on a single-home non-elevated dev box; gate Linux service routing on SPT_HOME-unset, Windows run-refuse on would-vanish (not is_elevated); push→CI BEFORE tagging a release (v0.3.0 tagged early, CI caught 2 regressions, retagged)
- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8 PUBLISHED + rig-verified 2026-06-09 (counter 6): fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS single. Fleet kitsubito+hfenduleam=0.3.2 (ENLYZEAM TODO). GOTCHA: fetch/pump floor=staged_version → can't re-stage same version single→set; clear `$SPT_HOME/releases` first (Linux ~/.spt-core, Win %LOCALAPPDATA%\spt-core). CORRECTION: release-publish never built a SignedUpdateSet pre-v0.3.2 (was debug_rollout)
- [boot-race self-heal](boot-race-self-heal.md) — v0.3.1: daemon self-heals a net-less boot start (NetHost retry+attach to OnceLock broker); systemd-USER network-online ordering does NOT reliably prevent the race under linger (field-proven kitsubito) — the self-heal is the real guarantee, unit ordering is belt
- [v0.4.0 published + fleet rolled](v040-published-fleet-rolled.md) — restoration release PUBLIC 2026-06-10 (counter 7); D7-4 bytes-match done both nodes (brain.ready exe_hash == artifact); v0.3.2→v0.4.0 apply needed last manual bounce (in-process can't self-relaunch); seamless no-bounce proof + enlyzeam catch-up + milestone close all deferred to v0.4.1
- [v0.4.1 published](v041-published.md) — PUBLIC 2026-06-11 (counter 8); deployah drove full merge→tag→sign→publish solo; D7 SEAMLESS no-bounce fleet-verify payload (apply must roll bytes live w/ pid change, no manual bounce); acceptance hashes linux 35c9544c… win 728a1bfc…; hfenduleam(Win) GREEN no-bounce, kitsubito(Linux) RED → CLOSE BLOCKED: v0.4.0 broker respawns via current_exe() which follows apply-rename to .old-8=OLD bytes (Linux only); artifacts SOUND don't yank; v0.4.2 fix = respawn by canonical path + bytes-assert, needs manual Linux broker bounce; deployah takes counter 9 publish
- [hfenduleam disk-full CI](hfenduleam-disk-full-ci.md) — Win CI LNK1318/os-error-112 = disk full not code; cargo clean dev target (was 396GB), rerun job
- [M9 gateway-wan progress](m9-gateway-wan-progress.md) — REQ-MSG-6 cross-node Gateway WAN user-msg; PR #9 open (base m9-user-surfaces), impl complete + local sweep green, HOLDING on CI; PR #8 G2 now green post disk-fix

-- [M9 status](m9-wave1-progress.md) — M9 COMPLETE, ALL 4 gates closed: G1(PR#7) · G2(PR#8) · Gateway-WAN(PR#9,REQ-MSG-6) · G3(PR#10). Merge-to-main = release-only (operator); PRs HELD; no tag rides M9. Don't re-plan, don't merge

+- [M9 status](m9-wave1-progress.md) — M9 COMPLETE + SHIPPED: all 4 gates passed (G1/G2/Gateway-WAN/G3), all PRs merged to main (operator GO 2026-06-13), **v0.5.0 tagged** (counter 10, deployah signing). Don't re-plan. See [[v050-release]] for release state


deployah ACK (high-priority): v0.5.0 + counter 10 confirmed, seed resident in ENV, **armed own independent draft-watch** on spt-releases (fires on linux+win+SHA256SUMS) — runs `release-publish` directly, pings me artifact hashes on publish. Acknowledging:


Bash

cd C:/Users/decid/Documents/projects/spt-core && $OWL send deployah todlando <<'EOF'
[ACK] Confirmed all — v0.5.0/counter 10 locked, your independent draft-watch is the primary trigger, my ping is belt-and-suspenders. I'm watching release.yml build now; if it RED-fails (e.g. a runner flake) before the draft lands I'll flag you so you don't wait on a draft that won't come. Otherwise next from me is just confirming your published hashes. Go when the draft's ready.
EOF

Ack deployah release-publish plan


➜ SENT:deployah


proceed to merge all outstanding PRs and publish the next release. ensure the changelog is up to date. when you need it signed, reach out to doyle as the signer encumbent


Merge PRs, update changelog, and publish release


Create the release-state memory I referenced:


Write

---
name: v050-release
description: v0.5.0 (M9) release — merged to main + tagged 2026-06-13; deployah signing counter 10, draft building
metadata:
  type: project
---

**v0.5.0 — M9 "Adapter customization & session surfaces"** release. Operator GO 2026-06-13; todlando drove merge+tag, deployah signs+publishes (signer incumbent, seed resident in ENV `SPT_RELEASE_SEED`).

**Merge to main (clean linear-stack collapse):** PR#7 (W1 profiles/strings/hints) → #9 (W2 user-msg/Gateway/live-role + gateway-wan; carried #8's W2 commits since gateway-wan was stacked on user-surfaces) → #10 (W3 digest). **#8 auto-CLOSED** when `--delete-branch` on #7 removed its base branch mid-stack — its content rode in via #9 (annotated on the PR). main @ **22a9b6f**, CI GREEN both runners (test + n1-gate + traceability). LESSON: don't `--delete-branch` mid-stack — it closes (not retargets) the dependent PR; merge bottom-up without deleting until the tip.

**Version:** 0.4.2 → **0.5.0** (feature milestone + breaking `[pty_digest]` manifest-section removal → minor bump, pre-1.0 rule). **Counter 10** (monotonic, v0.4.2 was 9). CHANGELOG `## [0.5.0] - 2026-06-13` user-facing = the GitHub Release body verbatim.

**Tagged v0.5.0** @ 22a9b6f, pushed → release.yml (draft build, both runners → spt-releases: linux/windows binaries + SHA256SUMS + manifest.schema.json + mock-adapter.zip) + docs-publish.yml triggered.

**deployah publish step** (release keys NEVER in CI — local sign): `cargo run -p xtask -- release-publish --tag v0.5.0 --key-id rel-primary-2026 --version 10` → verify vs SHA256SUMS → sign per-platform `*.release.json` → upload metadata/update-set → flip draft public → ping todlando artifact hashes. deployah armed own draft-watch (primary trigger); todlando watching release.yml (flags a RED build so deployah doesn't wait on a draft that won't come).

**STATUS:** awaiting release.yml draft + deployah publish. After publish: M9 fully SHIPPED. (Fleet roll / update-apply across nodes = separate follow if needed — v0.5.0 apply rides whatever broker the fleet runs; check seamless vs manual-bounce per the restoration history.)


File created successfully at: C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\v050-release.md (file state is current in your context — no need to Read it back)

---
name: v050-release
description: "v0.5.0 (M9) release — merged to main + tagged 2026-06-13; deployah signing counter 10, draft building"
metadata:
  node_type: memory
  type: project
  originSessionId: 86f6382c-e3ce-4405-a345-5f5ce8b948e7
---

**v0.5.0 — M9 "Adapter customization & session surfaces"** release. Operator GO 2026-06-13; todlando drove merge+tag, deployah signs+publishes (signer incumbent, seed resident in ENV `SPT_RELEASE_SEED`).

**Merge to main (clean linear-stack collapse):** PR#7 (W1 profiles/strings/hints) → #9 (W2 user-msg/Gateway/live-role + gateway-wan; carried #8's W2 commits since gateway-wan was stacked on user-surfaces) → #10 (W3 digest). **#8 auto-CLOSED** when `--delete-branch` on #7 removed its base branch mid-stack — its content rode in via #9 (annotated on the PR). main @ **22a9b6f**, CI GREEN both runners (test + n1-gate + traceability). LESSON: don't `--delete-branch` mid-stack — it closes (not retargets) the dependent PR; merge bottom-up without deleting until the tip.

**Version:** 0.4.2 → **0.5.0** (feature milestone + breaking `[pty_digest]` manifest-section removal → minor bump, pre-1.0 rule). **Counter 10** (monotonic, v0.4.2 was 9). CHANGELOG `## [0.5.0] - 2026-06-13` user-facing = the GitHub Release body verbatim.

**Tagged v0.5.0** @ 22a9b6f, pushed → release.yml (draft build, both runners → spt-releases: linux/windows binaries + SHA256SUMS + manifest.schema.json + mock-adapter.zip) + docs-publish.yml triggered.

**deployah publish step** (release keys NEVER in CI — local sign): `cargo run -p xtask -- release-publish --tag v0.5.0 --key-id rel-primary-2026 --version 10` → verify vs SHA256SUMS → sign per-platform `*.release.json` → upload metadata/update-set → flip draft public → ping todlando artifact hashes. deployah armed own draft-watch (primary trigger); todlando watching release.yml (flags a RED build so deployah doesn't wait on a draft that won't come).

**STATUS:** awaiting release.yml draft + deployah publish. After publish: M9 fully SHIPPED. (Fleet roll / update-apply across nodes = separate follow if needed — v0.5.0 apply rides whatever broker the fleet runs; check seamless vs manual-bounce per the restoration history.)


Add the index pointer + report:


Edit

- [M9 Wave3/G3 digest](m9-wave3-digest-progress.md) — session-digest re-founded on session logs

- [v0.5.0 release](v050-release.md) — M9 SHIPPED: merged to main (22a9b6f, clean stack collapse; #8 auto-closed by mid-stack --delete-branch, content rode via #9), v0.5.0 tagged (0.4.2→0.5.0 minor: feature milestone + breaking [pty_digest] removal), counter 10, deployah signing. LESSON: don't --delete-branch mid-stack
- [M9 Wave3/G3 digest](m9-wave3-digest-progress.md) — session-digest re-founded on session logs


- [v0.5.0 release](v050-release.md) — M9 SHIPPED: merged to main (22a9b6f, clean stack collapse; #8 auto-closed by mid-stack --delete-branch, content rode via #9), v0.5.0 tagged (0.4.2→0.5.0 minor: feature milestone + breaking [pty_digest] removal), counter 10, deployah signing. LESSON: don't --delete-branch mid-stack
- [M9 Wave3/G3 digest](m9-wave3-digest-progress.md) — session-digest re-founded on session logs

- [M9 status](m9-wave1-progress.md) — M9 COMPLETE + SHIPPED: all 4 gates passed (G1/G2/Gateway-WAN/G3), all PRs merged to main (operator GO 2026-06-13), **v0.5.0 tagged** (counter 10, deployah signing). Don't re-plan. See [[v050-release]] for release state
- [M9 Wave3/G3 digest](m9-wave3-digest-progress.md) — session-digest re-founded on session logs (REQ-TERM-4, ADR-0008 amendment); G3 STAMPED PASS by doyle 2026-06-13, PR#10 held. On-demand projection (topology-independent, no PTY); PTY-parse retired; published digest-record contract; autonomous-freshness+Option-C deferred to consuming-frontend milestone (DEFERRED.md:44)
- [hfenduleam target bloat → CI RED](hfenduleam-target-bloat-ci-red.md) — Win-runner LNK1318/os-error-112 can be disk-full from cargo target bloat (396GB seen), NOT a code regression; cargo clean + re-run; check disk before treating a Windows RED as a code defect
- [v0.4.1 Linux respawn blocker](v041-linux-respawn-blocker.md) — v0.4.1 PUBLIC (counter 8); fleet roll found Linux brain-respawn bug (current_exe follows apply-rename → brain runs OLD bytes, records applied:8). hfenduleam(Win) GREEN, kitsubito(Linux) RED. RESOLVED by v0.4.2 — see [[v042-published]]
- [v0.4.2 published](v042-published.md) — PUBLIC 2026-06-11 (counter 9); FIXES v0.4.1 Linux respawn blocker (respawn via canonical install path not current_exe + bytes-assert→auto-rollback; REQ-HAZARD-BRAIN-RESPAWN-PATH + real-rename E2E). deployah drove full merge→tag→sign→publish solo. hashes linux 500a9e7b… win b9ec8ddd…. ASYMMETRY: v0.4.2 apply still rides buggy v0.4.0 broker → 1 final manual Linux bounce loads fix; seamless proof on NEXT update via debug-channel. todlando driving fleet roll + restoration close
- [pump-IPC-deadline fix](pump-ipc-deadline-fix.md) — DONE: MERGED to main @ 4d8b810 (PR #3), doyle-approved, CI green both runners; reader-thread+channel carrier (nonblock dead on Win named pipes), both amendments folded, no tag (rides v0.4.1). Don't re-plan
- [CI self-host migration](ci-selfhost-migration.md) — DONE: runners live on kitsubito + hfenduleam (gravity retired 2026-06-07); twohost jobs gated by [twohost] commit tag; don't re-plan
- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener, hands off; target\debug\spt.exe daemon = dev/test artifact, killable
- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear instead
- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6
- [Gravity deploy procedure](gravity-deploy-procedure.md) — ssh david@100.100.62.43; build in ~/spt-core-deploy NOT runner workspace; setsid daemon; ~1 min first-sync after restart
- [Linux SPT_HOME no-bug](linux-spt-home-no-bug.md) — unix spawn_detached inherits env (no env_clear), forwards SPT_HOME; only Win CreateEnvironmentBlock rebuilds/drops it (f99dc25). Default-home daemon = launched w/o the var, not a propagation bug; don't reopen
- [kitsubito Linux rig](kitsubito-linux-rig.md) — ssh reavus@kitsubito (key auth); cargo at ~/.cargo/bin; deploy checkout origin=local runner (NOT GitHub) so unpushed commits transfer via git bundle; live spt-daemon user unit, --user ops need no sudo; build-in-scratch leaves ~/.local/bin/spt untouched
- [Use $OWL send for messaging](owl-send-not-legacy-spt-send.md) — `$OWL send` works (legacy = where live perches run); `spt send` is the NEW spt-core binary but no perches on it yet → bounces NO_PERCH; don't read `$?` after piping send through tail (use PIPESTATUS)
- [daemon service-detection gotcha](daemon-service-detection-gotcha.md) — service detection reading GLOBAL OS state is blind on a single-home non-elevated dev box; gate Linux service routing on SPT_HOME-unset, Windows run-refuse on would-vanish (not is_elevated); push→CI BEFORE tagging a release (v0.3.0 tagged early, CI caught 2 regressions, retagged)
- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8 PUBLISHED + rig-verified 2026-06-09 (counter 6): fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS single. Fleet kitsubito+hfenduleam=0.3.2 (ENLYZEAM TODO). GOTCHA: fetch/pump floor=staged_version → can't re-stage same version single→set; clear `$SPT_HOME/releases` first (Linux ~/.spt-core, Win %LOCALAPPDATA%\spt-core). CORRECTION: release-publish never built a SignedUpdateSet pre-v0.3.2 (was debug_rollout)
- [boot-race self-heal](boot-race-self-heal.md) — v0.3.1: daemon self-heals a net-less boot start (NetHost retry+attach to OnceLock broker); systemd-USER network-online ordering does NOT reliably prevent the race under linger (field-proven kitsubito) — the self-heal is the real guarantee, unit ordering is belt
- [v0.4.0 published + fleet rolled](v040-published-fleet-rolled.md) — restoration release PUBLIC 2026-06-10 (counter 7); D7-4 bytes-match done both nodes (brain.ready exe_hash == artifact); v0.3.2→v0.4.0 apply needed last manual bounce (in-process can't self-relaunch); seamless no-bounce proof + enlyzeam catch-up + milestone close all deferred to v0.4.1
- [v0.4.1 published](v041-published.md) — PUBLIC 2026-06-11 (counter 8); deployah drove full merge→tag→sign→publish solo; D7 SEAMLESS no-bounce fleet-verify payload (apply must roll bytes live w/ pid change, no manual bounce); acceptance hashes linux 35c9544c… win 728a1bfc…; hfenduleam(Win) GREEN no-bounce, kitsubito(Linux) RED → CLOSE BLOCKED: v0.4.0 broker respawns via current_exe() which follows apply-rename to .old-8=OLD bytes (Linux only); artifacts SOUND don't yank; v0.4.2 fix = respawn by canonical path + bytes-assert, needs manual Linux broker bounce; deployah takes counter 9 publish
- [hfenduleam disk-full CI](hfenduleam-disk-full-ci.md) — Win CI LNK1318/os-error-112 = disk full not code; cargo clean dev target (was 396GB), rerun job
- [M9 gateway-wan progress](m9-gateway-wan-progress.md) — REQ-MSG-6 cross-node Gateway WAN user-msg; PR #9 open (base m9-user-surfaces), impl complete + local sweep green, HOLDING on CI; PR #8 G2 now green post disk-fix

+- [v0.5.0 release](v050-release.md) — M9 SHIPPED: merged to main (22a9b6f, clean stack collapse; #8 auto-closed by mid-stack --delete-branch, content rode via #9), v0.5.0 tagged (0.4.2→0.5.0 minor: feature milestone + breaking [pty_digest] removal), counter 10, deployah signing. LESSON: don't --delete-branch mid-stack


Release in flight. Status:

**Merged + tagged + handed off:**
- All M9 in main @ `22a9b6f`, CI green both runners
- **v0.5.0** tagged + pushed → `release.yml` building the draft (linux/win binaries + SHA256SUMS + schema + mock-adapter) on spt-releases; `docs-publish.yml` syncing docs

**deployah** (signer incumbent) confirmed v0.5.0 + counter 10, seed resident in ENV, **armed its own draft-watch** as the primary publish trigger — will `release-publish --tag v0.5.0 --version 10`, verify vs SHA256SUMS → sign per-platform → flip public → ping me hashes.

**My watch:** release.yml build (background) — I'll flag deployah if it RED-fails so it doesn't wait on a draft that won't come.

Memory updated (incl. the lesson: don't `--delete-branch` mid-stack — it closes the dependent PR rather than retargeting).

Standing by for the draft build → deployah's publish → final hashes. Nothing else to drive until then.


<task-notification>
<task-id>bg5moaort</task-id>
<tool-use-id>toolu_01C2hWJ5FxDKyo8Gctgxasra</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\c570fe63-c413-4a17-bb14-ee75e02a53bd\tasks\bg5moaort.output</output-file>
<status>completed</status>
<summary>Background command "Watch release build to completion" completed (exit code 0)</summary>
</task-notification>


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


Release build watch exited 0 (success). Confirm the draft + its assets landed (so deployah's watch fires on a complete draft):


Bash

cd C:/Users/decid/Documents/projects/spt-core && gh run view 27482062975 --json status,conclusion 2>&1 | head -2; echo "=== draft release on spt-releases ==="; gh release view v0.5.0 --repo SaberMage/spt-releases --json isDraft,name,assets 2>&1 | python -c "import sys,json; d=json.load(sys.stdin); print('draft:',d.get('isDraft'),'name:',d.get('name')); [print(' -',a['name'],a.get('size')) for a in d.get('assets',[])]" 2>&1 | head -15 || gh release view v0.5.0 --repo SaberMage/spt-releases 2>&1 | head -20

Confirm release build success + draft assets


{"conclusion":"success","status":"completed"}
=== draft release on spt-releases ===
draft: False name: spt v0.5.0
 - manifest.schema.json 21806
 - mock-adapter.zip 7072
 - SHA256SUMS 172
 - spt-x86_64-linux 38768920
 - spt-x86_64-linux.release.json 448
 - spt-x86_64-windows.exe 27638272
 - spt-x86_64-windows.exe.release.json 448
 - update-set.json 741


Release is **PUBLIC** (`isDraft: False`) with all assets **including signed `.release.json` + update-set.json** — deployah's armed watch already fired, signed, and flipped it public. Confirm the hashes + URL:


cd C:/Users/decid/Documents/projects/spt-core && echo "=== release URL + state ===" && gh release view v0.5.0 --repo SaberMage/spt-releases --json url,isDraft,publishedAt 2>&1 | head -3; echo "=== SHA256SUMS ==="; gh release download v0.5.0 --repo SaberMage/spt-releases --pattern SHA256SUMS --output - 2>&1 | head -10

Get release URL + artifact hashes


=== release URL + state ===
{"isDraft":false,"publishedAt":"2026-06-13T23:23:01Z","url":"https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0"}
=== SHA256SUMS ===
4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae  spt-x86_64-linux
984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7  spt-x86_64-windows.exe


**Release LIVE** — v0.5.0 public on spt-releases (published 23:23:01Z), signed by deployah (counter 10). Hashes: linux `4c079100…`, windows `984298ba…`. Confirm to deployah + update memory:


cd C:/Users/decid/Documents/projects/spt-core && $OWL send deployah todlando <<'EOF'
[v0.5.0 PUBLISHED — confirmed live] I see it public on spt-releases (isDraft=false, publishedAt 23:23:01Z), all 8 assets present incl. both *.release.json signed metadata + update-set.json. Hashes: linux 4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae · windows 984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7. counter 10. release.yml + docs-publish both green. M9 SHIPPED. Clean solo sign — thanks. Confirm hashes match what you signed, and flag if a fleet update-apply roll is wanted (or if that rides the next natural update).
EOF

Confirm v0.5.0 published to deployah


<owl_messages>
<owl_message from="deployah" priority="high">[v0.5.0 PUBLIC — sign+publish DONE, counter 10]

release-publish exit 0:
  • verified vs SHA256SUMS:
      spt-x86_64-linux        4c079100…84217ae
      spt-x86_64-windows.exe  984298ba…264f2ff7
  • signed 54188f12…05e3ec9 (key_id rel-primary-2026)
  • per-platform *.release.json + update-set.json (v10 "0.5.0", win-msvc + linux-gnu) uploaded
  • draft → draft:false (PUBLIC)

https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0

ACCEPTANCE HASHES (brain.ready exe_hash must MATCH post-apply):
  linux  4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae
  win    984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7

KEY MILESTONE this roll: fleet is on the FIXED v0.4.2 brokers (canonical-path respawn) → v0.4.2→v0.5.0 apply on kitsubito should be the FIRST genuine Linux SEAMLESS no-bounce — brain pid changes, exe_hash flips to 4c079100, NO manual bounce. That's the field-proof deferred since v0.4.1. Plus the bytes-assert→auto-rollback is now live: if any node respawns wrong bytes, apply FAILS + rolls back instead of false-success.

Roll the fleet — kitsubito (linux 4c079100) is the one to watch. I'm idle on-call for hash/re-sign.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


➜ SENT:deployah


Edit

**STATUS:** awaiting release.yml draft + deployah publish. After publish: M9 fully SHIPPED. (Fleet roll / update-apply across nodes = separate follow if needed — v0.5.0 apply rides whatever broker the fleet runs; check seamless vs manual-bounce per the restoration history.)

**STATUS: PUBLISHED 2026-06-13T23:23:01Z — M9 SHIPPED.** deployah signed + flipped public (counter 10); all 8 assets live incl. both signed *.release.json + update-set.json. Hashes: linux `4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae` · windows `984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7`. release.yml + docs-publish green. URL https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0
(Fleet update-apply roll across nodes = separate follow if wanted — v0.5.0 apply rides whatever broker the fleet runs; seamless vs manual-bounce per restoration history. Pinged deployah whether to roll or let it ride the next natural update.)


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\v050-release.md has been updated successfully. (file state is current in your context — no need to Read it back)

**STATUS: PUBLISHED 2026-06-13T23:23:01Z — M9 SHIPPED.** deployah signed + flipped public (counter 10); all 8 assets live incl. both signed *.release.json + update-set.json. Hashes: linux `4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae` · windows `984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7`. release.yml + docs-publish green. URL https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0
(Fleet update-apply roll across nodes = separate follow if wanted — v0.5.0 apply rides whatever broker the fleet runs; seamless vs manual-bounce per restoration history. Pinged deployah whether to roll or let it ride the next natural update.)

---
name: v050-release
description: "v0.5.0 (M9) release — merged to main + tagged 2026-06-13; deployah signing counter 10, draft building"
metadata:
  node_type: memory
  type: project
  originSessionId: 86f6382c-e3ce-4405-a345-5f5ce8b948e7
---

**v0.5.0 — M9 "Adapter customization & session surfaces"** release. Operator GO 2026-06-13; todlando drove merge+tag, deployah signs+publishes (signer incumbent, seed resident in ENV `SPT_RELEASE_SEED`).

**Merge to main (clean linear-stack collapse):** PR#7 (W1 profiles/strings/hints) → #9 (W2 user-msg/Gateway/live-role + gateway-wan; carried #8's W2 commits since gateway-wan was stacked on user-surfaces) → #10 (W3 digest). **#8 auto-CLOSED** when `--delete-branch` on #7 removed its base branch mid-stack — its content rode in via #9 (annotated on the PR). main @ **22a9b6f**, CI GREEN both runners (test + n1-gate + traceability). LESSON: don't `--delete-branch` mid-stack — it closes (not retargets) the dependent PR; merge bottom-up without deleting until the tip.

**Version:** 0.4.2 → **0.5.0** (feature milestone + breaking `[pty_digest]` manifest-section removal → minor bump, pre-1.0 rule). **Counter 10** (monotonic, v0.4.2 was 9). CHANGELOG `## [0.5.0] - 2026-06-13` user-facing = the GitHub Release body verbatim.

**Tagged v0.5.0** @ 22a9b6f, pushed → release.yml (draft build, both runners → spt-releases: linux/windows binaries + SHA256SUMS + manifest.schema.json + mock-adapter.zip) + docs-publish.yml triggered.

**deployah publish step** (release keys NEVER in CI — local sign): `cargo run -p xtask -- release-publish --tag v0.5.0 --key-id rel-primary-2026 --version 10` → verify vs SHA256SUMS → sign per-platform `*.release.json` → upload metadata/update-set → flip draft public → ping todlando artifact hashes. deployah armed own draft-watch (primary trigger); todlando watching release.yml (flags a RED build so deployah doesn't wait on a draft that won't come).

**STATUS:** awaiting release.yml draft + deployah publish. After publish: M9 fully SHIPPED. (Fleet roll / update-apply across nodes = separate follow if needed — v0.5.0 apply rides whatever broker the fleet runs; check seamless vs manual-bounce per the restoration history.)

-**STATUS:** awaiting release.yml draft + deployah publish. After publish: M9 fully SHIPPED. (Fleet roll / update-apply across nodes = separate follow if needed — v0.5.0 apply rides whatever broker the fleet runs; check seamless vs manual-bounce per the restoration history.)

+**STATUS: PUBLISHED 2026-06-13T23:23:01Z — M9 SHIPPED.** deployah signed + flipped public (counter 10); all 8 assets live incl. both signed *.release.json + update-set.json. Hashes: linux `4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae` · windows `984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7`. release.yml + docs-publish green. URL https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0

+(Fleet update-apply roll across nodes = separate follow if wanted — v0.5.0 apply rides whatever broker the fleet runs; seamless vs manual-bounce per restoration history. Pinged deployah whether to roll or let it ride the next natural update.)


deployah ACK (high-priority): **v0.5.0 PUBLIC, sign+publish DONE counter 10.** Acceptance hashes confirmed match (linux `4c079100…`, win `984298ba…`), signed `54188f12…`. deployah requests the **fleet roll** — key milestone: fleet now on fixed v0.4.2 brokers, so v0.4.2→v0.5.0 apply on **kitsubito (Linux)** should be the **first genuine Linux seamless no-bounce** (the field-proof deferred since v0.4.1; bytes-assert→auto-rollback now live). Acknowledging + surfacing the decision:


Bash

cd C:/Users/decid/Documents/projects/spt-core && $OWL send deployah todlando <<'EOF'
[ACK — publish confirmed, fleet roll noted] Hashes match what I see live (linux 4c079100…, win 984298ba…), counter 10, signed 54188f12…. Understood the milestone: v0.4.2→v0.5.0 is the FIRST real Linux seamless no-bounce test on kitsubito (fixed canonical-path broker), exe_hash must flip to 4c079100 with brain pid change + NO manual bounce; auto-rollback live if wrong bytes. Confirming the go with the operator before I touch prod nodes (their explicit ask was merge+publish, which is DONE — the roll is the next phase). Back to you the moment they greenlight; you're on-call for hash/re-sign.
EOF

Ack deployah, note confirming roll with operator


<owl_messages>
<owl_message from="deployah" priority="high">Hashes CONFIRMED — match exactly what release-publish signed:
  linux   4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae ✓
  windows 984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7 ✓
counter 10, signing key 54188f12…05e3ec9. M9 SHIPPED clean.

FLEET ROLL — recommend a DELIBERATE kitsubito apply now, don't wait for a natural update. Reason: v0.4.2→v0.5.0 is the FIRST roll where the resident broker is the FIXED v0.4.2 (canonical-path respawn). This is the genuine Linux SEAMLESS no-bounce field-proof deferred since v0.4.1 — worth capturing on purpose with before/after (brain pid change, exe_hash→4c079100, NO manual bounce, pump stays live). If it rides a silent natural update we lose the clean observation.
  - kitsubito: deliberate apply, capture the seamless proof = 4c079100
  - hfenduleam + enlyzeam: can ride natural OR roll now (both on fixed brokers, expect seamless); your call
Plus the bytes-assert→auto-rollback is now armed — if any node respawns wrong bytes, apply FAILS+rolls back, no false-success. I'm idle on-call for the hash check.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


deployah confirmed hashes match exactly + recommends a **deliberate kitsubito apply now** (don't wait for a natural update) to capture the Linux seamless no-bounce field-proof on purpose — before/after brain pid + `exe_hash→4c079100`, no manual bounce. hfenduleam/enlyzeam can roll now or ride natural (all on fixed brokers). Auto-rollback armed.

Your explicit ask (merge + publish) is **done** — v0.5.0 is live. The fleet roll is the next phase and touches prod nodes, so confirming before I SSH in:


AskUserQuestion

Question: v0.5.0 is published. deployah recommends rolling the fleet now (esp. a deliberate kitsubito apply to capture the first genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1). Proceed?

Choices:
Deliberate kitsubito apply (capture seamless Linux proof: brain pid change, exe_hash→4c079100, no manual bounce) + roll hfenduleam + enlyzeam. deployah's recommendation; auto-rollback armed if any node respawns wrong bytes.
Roll just kitsubito (the Linux seamless field-proof); let hfenduleam + enlyzeam pick up v0.5.0 on their next natural update.
Release stays published; all nodes update naturally on their own cadence. No deliberate roll, lose the clean seamless-apply observation.


<owl_messages>
<owl_message from="deployah" priority="high">Right call gating the roll on operator greenlight — merge+publish was their explicit ask and it's DONE; prod roll is the next phase, their say. I'm on-call: ping me when they greenlight and I'll stand ready for the kitsubito hash check (must flip to 4c079100, brain pid change, no bounce; auto-rollback catches wrong bytes). Idle till then.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


Your questions have been answered: "v0.5.0 is published. deployah recommends rolling the fleet now (esp. a deliberate kitsubito apply to capture the first genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1). Proceed?"="Roll all now (Recommended)". You can now continue with these answers in mind.

Question: v0.5.0 is published. deployah recommends rolling the fleet now (esp. a deliberate kitsubito apply to capture the first genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1). Proceed?

Choices:
Deliberate kitsubito apply (capture seamless Linux proof: brain pid change, exe_hash→4c079100, no manual bounce) + roll hfenduleam + enlyzeam. deployah's recommendation; auto-rollback armed if any node respawns wrong bytes.
Roll just kitsubito (the Linux seamless field-proof); let hfenduleam + enlyzeam pick up v0.5.0 on their next natural update.
Release stays published; all nodes update naturally on their own cadence. No deliberate roll, lose the clean seamless-apply observation.


1	- [M9 status](m9-wave1-progress.md) — M9 COMPLETE + SHIPPED: all 4 gates passed (G1/G2/Gateway-WAN/G3), all PRs merged to main (operator GO 2026-06-13), **v0.5.0 tagged** (counter 10, deployah signing). Don't re-plan. See [[v050-published]] for release state
2	- [v0.5.0 published](v050-published.md) — M9 PUBLIC 2026-06-13 (counter 10); todlando drove merge+tag, deployah signed+published (handoff split vs v0.4.x full-solo); minor bump (breaking [pty_digest] removal pre-1.0); hashes linux 4c079100… win 984298ba…. FLEET ROLL = next phase, operator-gated (their ask was merge+publish, DONE). v0.4.2→v0.5.0 kitsubito apply = FIRST genuine Linux seamless no-bounce proof on fixed broker; bytes-assert→auto-rollback armed. deployah on-call for hash check
3	- [v0.5.0 release](v050-release.md) — M9 SHIPPED: merged to main (22a9b6f, clean stack collapse; #8 auto-closed by mid-stack --delete-branch, content rode via #9), v0.5.0 tagged (0.4.2→0.5.0 minor: feature milestone + breaking [pty_digest] removal), counter 10, deployah signing. LESSON: don't --delete-branch mid-stack
4	- [M9 Wave3/G3 digest](m9-wave3-digest-progress.md) — session-digest re-founded on session logs (REQ-TERM-4, ADR-0008 amendment); G3 STAMPED PASS by doyle 2026-06-13, PR#10 held. On-demand projection (topology-independent, no PTY); PTY-parse retired; published digest-record contract; autonomous-freshness+Option-C deferred to consuming-frontend milestone (DEFERRED.md:44)
5	- [hfenduleam target bloat → CI RED](hfenduleam-target-bloat-ci-red.md) — Win-runner LNK1318/os-error-112 can be disk-full from cargo target bloat (396GB seen), NOT a code regression; cargo clean + re-run; check disk before treating a Windows RED as a code defect
6	- [v0.4.1 Linux respawn blocker](v041-linux-respawn-blocker.md) — v0.4.1 PUBLIC (counter 8); fleet roll found Linux brain-respawn bug (current_exe follows apply-rename → brain runs OLD bytes, records applied:8). hfenduleam(Win) GREEN, kitsubito(Linux) RED. RESOLVED by v0.4.2 — see [[v042-published]]
7	- [v0.4.2 published](v042-published.md) — PUBLIC 2026-06-11 (counter 9); FIXES v0.4.1 Linux respawn blocker (respawn via canonical install path not current_exe + bytes-assert→auto-rollback; REQ-HAZARD-BRAIN-RESPAWN-PATH + real-rename E2E). deployah drove full merge→tag→sign→publish solo. hashes linux 500a9e7b… win b9ec8ddd…. ASYMMETRY: v0.4.2 apply still rides buggy v0.4.0 broker → 1 final manual Linux bounce loads fix; seamless proof on NEXT update via debug-channel. todlando driving fleet roll + restoration close
8	- [pump-IPC-deadline fix](pump-ipc-deadline-fix.md) — DONE: MERGED to main @ 4d8b810 (PR #3), doyle-approved, CI green both runners; reader-thread+channel carrier (nonblock dead on Win named pipes), both amendments folded, no tag (rides v0.4.1). Don't re-plan
9	- [CI self-host migration](ci-selfhost-migration.md) — DONE: runners live on kitsubito + hfenduleam (gravity retired 2026-06-07); twohost jobs gated by [twohost] commit tag; don't re-plan
10	- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener, hands off; target\debug\spt.exe daemon = dev/test artifact, killable
11	- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear instead
12	- [Adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core
13	- [M6 shipped v0.1.0](m6-shipped-v010.md) — v0.1.0 public 2026-06-05; release procedure = RELEASE-RUNBOOK.md; releases-repo/ is repo-face truth; don't re-plan M6
14	- [Gravity deploy procedure](gravity-deploy-procedure.md) — ssh david@100.100.62.43; build in ~/spt-core-deploy NOT runner workspace; setsid daemon; ~1 min first-sync after restart
15	- [Linux SPT_HOME no-bug](linux-spt-home-no-bug.md) — unix spawn_detached inherits env (no env_clear), forwards SPT_HOME; only Win CreateEnvironmentBlock rebuilds/drops it (f99dc25). Default-home daemon = launched w/o the var, not a propagation bug; don't reopen
16	- [kitsubito Linux rig](kitsubito-linux-rig.md) — ssh reavus@kitsubito (key auth); cargo at ~/.cargo/bin; deploy checkout origin=local runner (NOT GitHub) so unpushed commits transfer via git bundle; live spt-daemon user unit, --user ops need no sudo; build-in-scratch leaves ~/.local/bin/spt untouched
17	- [Use $OWL send for messaging](owl-send-not-legacy-spt-send.md) — `$OWL send` works (legacy = where live perches run); `spt send` is the NEW spt-core binary but no perches on it yet → bounces NO_PERCH; don't read `$?` after piping send through tail (use PIPESTATUS)
18	- [daemon service-detection gotcha](daemon-service-detection-gotcha.md) — service detection reading GLOBAL OS state is blind on a single-home non-elevated dev box; gate Linux service routing on SPT_HOME-unset, Windows run-refuse on would-vanish (not is_elevated); push→CI BEFORE tagging a release (v0.3.0 tagged early, CI caught 2 regressions, retagged)
19	- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8 PUBLISHED + rig-verified 2026-06-09 (counter 6): fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS single. Fleet kitsubito+hfenduleam=0.3.2 (ENLYZEAM TODO). GOTCHA: fetch/pump floor=staged_version → can't re-stage same version single→set; clear `$SPT_HOME/releases` first (Linux ~/.spt-core, Win %LOCALAPPDATA%\spt-core). CORRECTION: release-publish never built a SignedUpdateSet pre-v0.3.2 (was debug_rollout)
20	- [boot-race self-heal](boot-race-self-heal.md) — v0.3.1: daemon self-heals a net-less boot start (NetHost retry+attach to OnceLock broker); systemd-USER network-online ordering does NOT reliably prevent the race under linger (field-proven kitsubito) — the self-heal is the real guarantee, unit ordering is belt
21	- [v0.4.0 published + fleet rolled](v040-published-fleet-rolled.md) — restoration release PUBLIC 2026-06-10 (counter 7); D7-4 bytes-match done both nodes (brain.ready exe_hash == artifact); v0.3.2→v0.4.0 apply needed last manual bounce (in-process can't self-relaunch); seamless no-bounce proof + enlyzeam catch-up + milestone close all deferred to v0.4.1
22	- [v0.4.1 published](v041-published.md) — PUBLIC 2026-06-11 (counter 8); deployah drove full merge→tag→sign→publish solo; D7 SEAMLESS no-bounce fleet-verify payload (apply must roll bytes live w/ pid change, no manual bounce); acceptance hashes linux 35c9544c… win 728a1bfc…; hfenduleam(Win) GREEN no-bounce, kitsubito(Linux) RED → CLOSE BLOCKED: v0.4.0 broker respawns via current_exe() which follows apply-rename to .old-8=OLD bytes (Linux only); artifacts SOUND don't yank; v0.4.2 fix = respawn by canonical path + bytes-assert, needs manual Linux broker bounce; deployah takes counter 9 publish
23	- [hfenduleam disk-full CI](hfenduleam-disk-full-ci.md) — Win CI LNK1318/os-error-112 = disk full not code; cargo clean dev target (was 396GB), rerun job
24	- [M9 gateway-wan progress](m9-gateway-wan-progress.md) — REQ-MSG-6 cross-node Gateway WAN user-msg; PR #9 open (base m9-user-surfaces), impl complete + local sweep green, HOLDING on CI; PR #8 G2 now green post disk-fix


User greenlit **Roll all now.** deployah on-call for the hash check. Ping deployah the go + capture kitsubito's before-state (the key seamless proof):


Bash

cd C:/Users/decid/Documents/projects/spt-core && $OWL send deployah todlando <<'EOF'
[GREENLIT — rolling fleet now] Operator said roll all. Starting kitsubito (the Linux seamless proof) deliberate apply, capturing before/after (brain pid, exe_hash→4c079100, no-bounce, pump live), then hfenduleam + enlyzeam. Will ping you the kitsubito exe_hash for your check. Auto-rollback armed as the safety. Here we go.
EOF

Ping deployah: greenlit, rolling


ssh -o BatchMode=yes -o ConnectTimeout=12 reavus@kitsubito '~/.local/bin/spt --version 2>&1; echo "=== daemon status ==="; ~/.local/bin/spt daemon status 2>&1 | head -25' 2>&1 | head -40

Capture kitsubito before-state (version + daemon status)


spt 0.4.2
=== daemon status ===
daemon: running (pid 1357210)
peer pump: live (last tick 1s ago)
managed-by: systemd --user (active)
subnets:
  SPT_DEV  nodes=3 endpoints=0
local endpoints: (none)


kitsubito before: **spt 0.4.2**, daemon (broker) pid **1357210**, pump live, systemd --user active. Need the brain pid + exe_hash for the seamless proof (broker pid held, brain pid flips, exe_hash→4c079100). Locate the brain.ready marker:


ssh -o BatchMode=yes -o ConnectTimeout=12 reavus@kitsubito 'echo "SPT_HOME guess ~/.spt-core:"; ls -la ~/.spt-core/ 2>&1 | head -20; echo "=== brain.ready / *.ready ==="; for f in ~/.spt-core/brain.ready ~/.spt-core/*.ready ~/.spt-core/brain/*.ready; do [ -f "$f" ] && echo "--- $f ---" && cat "$f"; done 2>&1 | head -30; echo "=== installed binary hash ==="; sha256sum ~/.local/bin/spt 2>&1' 2>&1 | head -40

Capture kitsubito brain.ready + installed binary hash


SPT_HOME guess ~/.spt-core:
total 52
drwxr-xr-x  7 reavus reavus  4096 Jun 13 19:37 .
drwxr-x--- 28 reavus reavus  4096 Jun 10 15:49 ..
-rw-rw-r--  1 reavus reavus   108 Jun 13 19:37 brain.ready
drwxrwxr-x  3 reavus reavus  4096 Jun  8 21:38 context
-rw-rw-r--  1 reavus reavus 16036 Jun 13 19:34 daemon-effects.log
-rw-rw-r--  1 reavus reavus     7 Jun 11 03:47 daemon.pid
drwxrwxr-x  3 reavus reavus  4096 Jun 13 19:37 identity
drwxrwxr-x  3 reavus reavus  4096 Jun 11 03:46 releases
drwxrwxr-x  4 reavus reavus  4096 Jun  8 22:22 scratch
drwxrwxr-x  3 reavus reavus  4096 Jun  8 21:44 tracked
=== brain.ready / *.ready ===
--- /home/reavus/.spt-core/brain.ready ---
{"pid":1357219,"generation":0,"exe_hash":"500a9e7b7b887db261105b0fc1c0a051e36efaa8be8da5f69e6f5a796967732c"}--- /home/reavus/.spt-core/brain.ready ---
{"pid":1357219,"generation":0,"exe_hash":"500a9e7b7b887db261105b0fc1c0a051e36efaa8be8da5f69e6f5a796967732c"}=== installed binary hash ===
500a9e7b7b887db261105b0fc1c0a051e36efaa8be8da5f69e6f5a796967732c  /home/reavus/.local/bin/spt


kitsubito BEFORE captured: **broker pid 1357210, brain pid 1357219, exe_hash `500a9e7b…` (v0.4.2)**. Seamless expectation: broker pid HELD, brain pid flips, exe_hash→`4c079100…`, gen 0→1, no bounce. Run the origin fetch (pulls the signed v0.5.0 set):


ssh -o BatchMode=yes -o ConnectTimeout=20 reavus@kitsubito '~/.local/bin/spt update fetch 2>&1 | tail -25' 2>&1 | head -40

kitsubito: spt update fetch (origin pull v0.5.0)


Fetching update set from SaberMage/spt-releases…
  fetching spt-x86_64-windows.exe (x86_64-pc-windows-msvc)…
  fetching spt-x86_64-linux (x86_64-unknown-linux-gnu)…
UPDATE_STAGED:10 (set, 2 platforms, from SaberMage/spt-releases) — run `spt update apply` to apply


Fetch staged counter 10 (verified, 2 platforms). Now the critical step — **apply** + immediately capture the seamless proof:


ssh -o BatchMode=yes -o ConnectTimeout=25 reavus@kitsubito '~/.local/bin/spt update apply 2>&1 | tail -20; echo "=== sleep 4, then AFTER-state ==="; sleep 4; echo "--- version ---"; ~/.local/bin/spt --version; echo "--- binary hash ---"; sha256sum ~/.local/bin/spt; echo "--- brain.ready ---"; cat ~/.spt-core/brain.ready; echo; echo "--- daemon status ---"; ~/.local/bin/spt daemon status 2>&1 | head -6' 2>&1 | head -50

kitsubito: spt update apply + capture after-state


Applying spt-core v0.5.0 — trial started.
The new code is on trial; it auto-rolls-back if it fails to come up. Watch for a rollback notif (verdict also via `spt daemon status`).
Changelog: https://www.github.com/SaberMage/spt-releases/releases
=== sleep 4, then AFTER-state ===
--- version ---
spt 0.5.0
--- binary hash ---
4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae  /home/reavus/.local/bin/spt
--- brain.ready ---
{"pid":2135176,"generation":1}
--- daemon status ---
daemon: running (pid 1357210)
peer pump: live (last tick 4s ago)
managed-by: systemd --user (active)
subnets:
  SPT_DEV  nodes=3 endpoints=1
local endpoints: (none)


**kitsubito SEAMLESS — broker pid 1357210 HELD, brain pid 1357219→2135176 (rolled live), binary→`4c079100…` (v0.5.0), gen 0→1, pump live, NO bounce.** This is the first genuine Linux seamless no-bounce. It's mid-trial (auto-rollback armed). Confirm it **promotes** (stays 0.5.0, not rolled back) + the bytes-assert records:


ssh -o BatchMode=yes -o ConnectTimeout=20 reavus@kitsubito 'sleep 6; echo "--- version (must stay 0.5.0) ---"; ~/.local/bin/spt --version; echo "--- brain.ready ---"; cat ~/.spt-core/brain.ready; echo; echo "--- applied/rollback records ---"; ls -t ~/.spt-core/releases/ 2>&1 | head; cat ~/.spt-core/releases/applied* 2>/dev/null | head -5; echo "--- daemon status verdict ---"; ~/.local/bin/spt daemon status 2>&1 | head -4; echo "--- effects log tail (apply/promote/rollback) ---"; grep -iE "apply|promot|rollback|trial|brain" ~/.spt-core/daemon-effects.log 2>/dev/null | tail -8' 2>&1 | head -45

kitsubito: confirm promotion (no rollback)


--- version (must stay 0.5.0) ---
spt 0.5.0
--- brain.ready ---
{"pid":2135176,"generation":1,"exe_hash":"4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae"}
--- applied/rollback records ---
applied.json
applied-state.json
last-outcome.json
release.json
artifacts
{"version":10}{"phase":"applied","version":10}--- daemon status verdict ---
daemon: running (pid 1357210)
peer pump: live (last tick 1s ago)
managed-by: systemd --user (active)
subnets:
--- effects log tail (apply/promote/rollback) ---


**kitsubito PROMOTED — Linux seamless no-bounce PROVEN.** version stays 0.5.0, brain.ready exe_hash=`4c079100…` (bytes-assert verified), applied-state phase=applied/version 10, broker pid 1357210 held throughout, pump live. The field-proof deferred since v0.4.1 is captured. Report to deployah + roll hfenduleam (local Windows):


cd C:/Users/decid/Documents/projects/spt-core && $OWL send deployah todlando <<'EOF'
[kitsubito SEAMLESS — Linux no-bounce PROVEN ✓✓] v0.4.2→v0.5.0 apply on kitsubito, the field-proof deferred since v0.4.1:
- BEFORE: broker pid 1357210, brain pid 1357219, exe_hash 500a9e7b (v0.4.2)
- AFTER:  broker pid 1357210 HELD (no broker restart), brain pid → 2135176 (rolled LIVE), generation 0→1
- brain.ready exe_hash = 4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae ✓ MATCHES your signed linux hash
- applied-state.json {"phase":"applied","version":10} — PROMOTED, not rolled back; bytes-assert recorded the correct v0.5.0 bytes
- NO manual bounce, pump live throughout, daemon never dropped
The fixed v0.4.2 canonical-path-respawn broker delivered genuine Linux seamless. Your hash-check please. Rolling hfenduleam (Windows, expect 984298ba) next, then enlyzeam.
EOF

Report kitsubito seamless proof to deployah


➜ SENT:deployah


PowerShell

$spt = (Get-Command spt -ErrorAction SilentlyContinue).Source; if (-not $spt) { $spt = "$env:LOCALAPPDATA\spt-core\bin\spt.exe" }; Write-Output "spt path: $spt"; & $spt --version 2>&1; Write-Output "=== SPT_HOME ==="; Write-Output "$env:LOCALAPPDATA\spt-core"; Write-Output "=== daemon status ==="; & $spt daemon status 2>&1 | Select-Object -First 8; Write-Output "=== brain.ready ==="; Get-Content "$env:LOCALAPPDATA\spt-core\brain.ready" -ErrorAction SilentlyContinue

Capture hfenduleam (local Win) before-state


spt path: C:\Users\decid\AppData\Local\spt-core\bin\spt.exe
spt 0.4.2
=== SPT_HOME ===
C:\Users\decid\AppData\Local\spt-core
=== daemon status ===
daemon: running (pid 17232)
peer pump: live (last tick 3s ago)
managed-by: manual — at-logon task 'spt-core daemon' registered (auto-starts at logon)
subnets:
  SPT_DEV  nodes=3 endpoints=0
local endpoints: (none)
=== brain.ready ===
{"pid":39820,"generation":2,"exe_hash":"b9ec8dddc7b2ebe590cc549e9cdf31ad9484649b1a451163ac15a52daca92eaf"}


hfenduleam before: **spt 0.4.2, broker pid 17232, brain pid 39820 gen 2, exe_hash `b9ec8ddd…` (v0.4.2 win)**, pump live. Fetch the v0.5.0 set:


$spt = "C:\Users\decid\AppData\Local\spt-core\bin\spt.exe"; & $spt update fetch 2>&1 | Select-Object -Last 12

hfenduleam: spt update fetch


Error: Exit code 1
Fetching update set from SaberMage/spt-releases…
UPDATE_FETCH_REJECTED:Rollback { current: 10, candidate: 10 }


hfenduleam fetch rejected `Rollback { current: 10, candidate: 10 }` — counter 10 is **already staged** (the pump auto-pulled v0.5.0 from kitsubito/origin after publish). So fetch is a no-op; just **apply** the staged set. Verify staged state + apply:


$h = "$env:LOCALAPPDATA\spt-core"; Write-Output "=== releases dir ==="; Get-ChildItem "$h\releases" -ErrorAction SilentlyContinue | Select-Object Name,Length | Format-Table -AutoSize; Write-Output "=== staged / applied-state ==="; Get-Content "$h\releases\staged*.json","$h\releases\applied-state.json","$h\releases\last-outcome.json" -ErrorAction SilentlyContinue; Write-Output "=== update status ==="; $spt = "$h\bin\spt.exe"; & $spt update status 2>&1 | Select-Object -First 15

hfenduleam: inspect staged update state


<owl_messages>
<owl_message from="deployah" priority="high">HASH VERIFIED ✓ — kitsubito brain.ready exe_hash
  4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae
== my signed v0.5.0 linux artifact, char-for-char. CONFIRMED.

This is the proof. Every assertion green:
  • broker pid 1357210 HELD — no broker restart
  • brain pid 1357219 → 2135176 — rolled LIVE
  • gen 0→1
  • exe_hash = signed v0.5.0 bytes (4c079100), NOT the old 500a9e7b
  • applied-state phase:applied version:10 — PROMOTED (bytes-assert passed → no rollback, correct path)
  • zero manual bounce, pump live throughout, daemon never dropped

The current_exe()-follows-rename bug that killed v0.4.1 on Linux is DEAD — the v0.4.2 canonical-path-respawn broker delivered genuine seamless. The field-proof deferred since v0.4.1 is now REAL on prod hardware. That closes the whole respawn-path arc.

Roll hfenduleam (expect win 984298ba…264f2ff7) — ping the hash, I'll check. Then enlyzeam.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


Error: Exit code 2
=== releases dir ===

Name               Length
----               ------
artifacts
applied-state.json 31
applied.json       13
last-outcome.json  20
release.json       741

=== staged / applied-state ===
{"phase":"applied","version":9}
{"outcome":"staged"}
=== update status ===
error: unrecognized subcommand 'status'

Usage: spt.exe update <COMMAND>

For more information, try '--help'.


deployah **VERIFIED** kitsubito hash = his signed v0.5.0 linux artifact char-for-char — the respawn-path arc that killed v0.4.1 is closed, field-proof real on prod. Acknowledged.

hfenduleam: counter 10 is **staged** (`last-outcome: staged`, applied still 9) — the pump pre-staged v0.5.0. Just apply it + capture the seamless proof:


$h = "$env:LOCALAPPDATA\spt-core"; $spt = "$h\bin\spt.exe"; & $spt update apply 2>&1 | Select-Object -Last 12; Write-Output "=== sleep, then AFTER ==="; Start-Sleep -Seconds 6; Write-Output "--- version ---"; & $spt --version 2>&1; Write-Output "--- binary hash ---"; (Get-FileHash $spt -Algorithm SHA256).Hash.ToLower(); Write-Output "--- brain.ready ---"; Get-Content "$h\brain.ready"; Write-Output "--- applied-state ---"; Get-Content "$h\releases\applied-state.json"; Write-Output "--- daemon status ---"; & $spt daemon status 2>&1 | Select-Object -First 5

hfenduleam: apply v0.5.0 + capture after-state


Applying spt-core v0.5.0 — trial started.
The new code is on trial; it auto-rolls-back if it fails to come up. Watch for a rollback notif (verdict also via `spt daemon status`).
Changelog: https://www.github.com/SaberMage/spt-releases/releases
=== sleep, then AFTER ===
--- version ---
spt 0.5.0
--- binary hash ---
984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7
--- brain.ready ---
{"pid":56744,"generation":3,"exe_hash":"984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7"}
--- applied-state ---
{"phase":"applied","version":10}
--- daemon status ---
daemon: running (pid 17232)
peer pump: live (last tick 8s ago)
managed-by: manual — at-logon task 'spt-core daemon' registered (auto-starts at logon)
subnets:
  SPT_DEV  nodes=3 endpoints=1


**hfenduleam SEAMLESS too** — broker pid 17232 HELD, brain pid 39820→56744 (rolled live), gen 2→3, exe_hash→`984298ba…`, applied-state phase:applied/version 10, no bounce, pump live. Both runner nodes on v0.5.0 counter 10 seamless. Report to deployah + assess enlyzeam:


Bash

cd C:/Users/decid/Documents/projects/spt-core && $OWL send deployah todlando <<'EOF'
[hfenduleam SEAMLESS ✓ — both runner nodes on v0.5.0] ACK your kitsubito hash-verified (char-for-char = signed linux artifact; respawn-path arc CLOSED). hfenduleam (Windows) now done:
- BEFORE: broker pid 17232, brain pid 39820 gen 2, exe_hash b9ec8ddd (v0.4.2)
- AFTER:  broker pid 17232 HELD, brain pid → 56744 (rolled LIVE), gen 2→3
- brain.ready exe_hash = 984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7 — MATCHES your signed win hash; please verify
- applied-state {"phase":"applied","version":10} PROMOTED, no rollback, no manual bounce, pump live
NOTE: hfenduleam fetch returned Rollback{current:10,candidate:10} — the pump had ALREADY staged counter 10 (peer-propagated from kitsubito/origin), so I applied the staged set directly. Clean.

ENLYZEAM (3rd SPT_DEV node): I don't have direct access details in hand. Two options: (a) you/operator have a way to drive a deliberate apply, or (b) it rides natural pump propagation (counter 10 will stage from peers, applies on cadence — seamless expected, it's on a fixed broker too). Which? If (b), I'll consider the roll complete for the two nodes I can reach.
EOF

Report hfenduleam seamless + ask re enlyzeam


Both reachable nodes done. Update memory with the fleet-roll outcome + the closed respawn-path arc:


Edit

(Fleet update-apply roll across nodes = separate follow if wanted — v0.5.0 apply rides whatever broker the fleet runs; seamless vs manual-bounce per restoration history. Pinged deployah whether to roll or let it ride the next natural update.)

**FLEET ROLLED 2026-06-13 (operator GO "roll all"):**
- **kitsubito (Linux) SEAMLESS ✓** — broker pid 1357210 HELD, brain 1357219→2135176 rolled live, gen 0→1, exe_hash 500a9e7b→4c079100 (bytes-assert verified = signed artifact, deployah char-for-char confirmed), applied-state phase:applied/v10, NO manual bounce. **FIRST genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1.** Closes the whole respawn-path arc: the current_exe()-follows-rename bug (v0.4.1 Linux RED) is DEAD; the v0.4.2 canonical-path-respawn broker delivered.
- **hfenduleam (Windows) SEAMLESS ✓** — broker pid 17232 HELD, brain 39820→56744, gen 2→3, exe_hash b9ec8ddd→984298ba, applied-state v10, no bounce. GOTCHA: fetch returned Rollback{current:10,candidate:10} — pump had ALREADY peer-staged counter 10, so applied the staged set directly (no fetch needed).
- **enlyzeam (3rd SPT_DEV node):** no direct access in hand — rides natural pump propagation (counter 10 stages from peers, applies on cadence, seamless expected on its fixed broker) OR deployah/operator drives it. Asked deployah.

Both reachable nodes on **v0.5.0 counter 10, seamless, promoted**. M9 SHIPPED + fleet-rolled.


<owl_messages>
<owl_message from="deployah" priority="high">HASH VERIFIED ✓ — hfenduleam brain.ready exe_hash
  984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7
== my signed v0.5.0 win artifact, char-for-char. CONFIRMED. broker pid 17232 HELD, brain 39820→56744 live, gen 2→3, promoted v10 no rollback no bounce. Both runner nodes seamless on fixed brokers.

Nice catch on the Rollback{current:10,candidate:10} — pump had already peer-propagated + staged counter 10 from kitsubito/origin, so applying the staged set directly is correct (not a single-binary re-stage; that's the v0.3.2 floor trap, doesn't apply here). Clean.

ENLYZEAM → go with (b), ride natural pump propagation. Rationale:
  - the FIRST-seamless-proof value is already banked on kitsubito; enlyzeam doesn't need a deliberate capture.
  - it's a fixed v0.4.2 broker too → counter 10 stages from peers, applies on cadence, seamless expected.
  - bonus: letting it ride NATURAL propagation actually validates the steady-state auto-cadence path end-to-end (vs the deliberate applies we drove) — that's the real-world mode, worth proving on its own.
  - I don't have enlyzeam direct-access details either (you drove it last time via its at-logon scheduled task); operator has it if a push is ever needed.
enlyzeam is Windows (took b9ec8ddd in restoration) → its v0.5.0 target = 984298ba…264f2ff7. Consider the roll COMPLETE for the two reachable nodes; I'll treat enlyzeam as async-confirm — if you or operator can grab its exe_hash next cadence, I'll verify it == 984298ba to fully close. M9 fleet effectively shipped.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.


**FLEET ROLLED 2026-06-13 (operator GO "roll all"):**
- **kitsubito (Linux) SEAMLESS ✓** — broker pid 1357210 HELD, brain 1357219→2135176 rolled live, gen 0→1, exe_hash 500a9e7b→4c079100 (bytes-assert verified = signed artifact, deployah char-for-char confirmed), applied-state phase:applied/v10, NO manual bounce. **FIRST genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1.** Closes the whole respawn-path arc: the current_exe()-follows-rename bug (v0.4.1 Linux RED) is DEAD; the v0.4.2 canonical-path-respawn broker delivered.
- **hfenduleam (Windows) SEAMLESS ✓** — broker pid 17232 HELD, brain 39820→56744, gen 2→3, exe_hash b9ec8ddd→984298ba, applied-state v10, no bounce. GOTCHA: fetch returned Rollback{current:10,candidate:10} — pump had ALREADY peer-staged counter 10, so applied the staged set directly (no fetch needed).
- **enlyzeam (3rd SPT_DEV node):** no direct access in hand — rides natural pump propagation (counter 10 stages from peers, applies on cadence, seamless expected on its fixed broker) OR deployah/operator drives it. Asked deployah.

Both reachable nodes on **v0.5.0 counter 10, seamless, promoted**. M9 SHIPPED + fleet-rolled.

---
name: v050-release
description: "v0.5.0 (M9) release — merged to main + tagged 2026-06-13; deployah signing counter 10, draft building"
metadata:
  node_type: memory
  type: project
  originSessionId: 86f6382c-e3ce-4405-a345-5f5ce8b948e7
---

**v0.5.0 — M9 "Adapter customization & session surfaces"** release. Operator GO 2026-06-13; todlando drove merge+tag, deployah signs+publishes (signer incumbent, seed resident in ENV `SPT_RELEASE_SEED`).

**Merge to main (clean linear-stack collapse):** PR#7 (W1 profiles/strings/hints) → #9 (W2 user-msg/Gateway/live-role + gateway-wan; carried #8's W2 commits since gateway-wan was stacked on user-surfaces) → #10 (W3 digest). **#8 auto-CLOSED** when `--delete-branch` on #7 removed its base branch mid-stack — its content rode in via #9 (annotated on the PR). main @ **22a9b6f**, CI GREEN both runners (test + n1-gate + traceability). LESSON: don't `--delete-branch` mid-stack — it closes (not retargets) the dependent PR; merge bottom-up without deleting until the tip.

**Version:** 0.4.2 → **0.5.0** (feature milestone + breaking `[pty_digest]` manifest-section removal → minor bump, pre-1.0 rule). **Counter 10** (monotonic, v0.4.2 was 9). CHANGELOG `## [0.5.0] - 2026-06-13` user-facing = the GitHub Release body verbatim.

**Tagged v0.5.0** @ 22a9b6f, pushed → release.yml (draft build, both runners → spt-releases: linux/windows binaries + SHA256SUMS + manifest.schema.json + mock-adapter.zip) + docs-publish.yml triggered.

**deployah publish step** (release keys NEVER in CI — local sign): `cargo run -p xtask -- release-publish --tag v0.5.0 --key-id rel-primary-2026 --version 10` → verify vs SHA256SUMS → sign per-platform `*.release.json` → upload metadata/update-set → flip draft public → ping todlando artifact hashes. deployah armed own draft-watch (primary trigger); todlando watching release.yml (flags a RED build so deployah doesn't wait on a draft that won't come).

**STATUS: PUBLISHED 2026-06-13T23:23:01Z — M9 SHIPPED.** deployah signed + flipped public (counter 10); all 8 assets live incl. both signed *.release.json + update-set.json. Hashes: linux `4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae` · windows `984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7`. release.yml + docs-publish green. URL https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0
(Fleet update-apply roll across nodes = separate follow if wanted — v0.5.0 apply rides whatever broker the fleet runs; seamless vs manual-bounce per restoration history. Pinged deployah whether to roll or let it ride the next natural update.)

-(Fleet update-apply roll across nodes = separate follow if wanted — v0.5.0 apply rides whatever broker the fleet runs; seamless vs manual-bounce per restoration history. Pinged deployah whether to roll or let it ride the next natural update.)

+**FLEET ROLLED 2026-06-13 (operator GO "roll all"):**

+- **kitsubito (Linux) SEAMLESS ✓** — broker pid 1357210 HELD, brain 1357219→2135176 rolled live, gen 0→1, exe_hash 500a9e7b→4c079100 (bytes-assert verified = signed artifact, deployah char-for-char confirmed), applied-state phase:applied/v10, NO manual bounce. **FIRST genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1.** Closes the whole respawn-path arc: the current_exe()-follows-rename bug (v0.4.1 Linux RED) is DEAD; the v0.4.2 canonical-path-respawn broker delivered.

+- **hfenduleam (Windows) SEAMLESS ✓** — broker pid 17232 HELD, brain 39820→56744, gen 2→3, exe_hash b9ec8ddd→984298ba, applied-state v10, no bounce. GOTCHA: fetch returned Rollback{current:10,candidate:10} — pump had ALREADY peer-staged counter 10, so applied the staged set directly (no fetch needed).

+- **enlyzeam (3rd SPT_DEV node):** no direct access in hand — rides natural pump propagation (counter 10 stages from peers, applies on cadence, seamless expected on its fixed broker) OR deployah/operator drives it. Asked deployah.

+Both reachable nodes on **v0.5.0 counter 10, seamless, promoted**. M9 SHIPPED + fleet-rolled.


deployah **VERIFIED hfenduleam hash** char-for-char too, and ruled **enlyzeam → ride natural pump propagation** (banks the steady-state auto-cadence proof; async-confirm its exe_hash==`984298ba` next cadence). Roll **complete** for both reachable nodes. Acknowledged. Finalize the enlyzeam note in memory:


- **enlyzeam (3rd SPT_DEV node):** no direct access in hand — rides natural pump propagation (counter 10 stages from peers, applies on cadence, seamless expected on its fixed broker) OR deployah/operator drives it. Asked deployah.

Both reachable nodes on **v0.5.0 counter 10, seamless, promoted**. M9 SHIPPED + fleet-rolled.

- **enlyzeam (3rd SPT_DEV node, Windows):** deployah ruled **ride NATURAL pump propagation** (decision b) — banks the steady-state auto-cadence path proof (vs the deliberate applies on the runners), no direct access needed (last time driven via its at-logon scheduled task; operator has it). ASYNC-CONFIRM: grab enlyzeam exe_hash next cadence, verify == 984298ba…264f2ff7 (its v0.5.0 win target) to fully close.

Both reachable nodes (kitsubito Linux + hfenduleam Windows) on **v0.5.0 counter 10, seamless, promoted — deployah hash-verified BOTH char-for-char**. M9 SHIPPED + fleet-rolled. enlyzeam async-confirm pending. The whole respawn-path arc (v0.4.0→v0.4.2 restoration) is CLOSED by the first genuine Linux seamless no-bounce on kitsubito.


- **enlyzeam (3rd SPT_DEV node, Windows):** deployah ruled **ride NATURAL pump propagation** (decision b) — banks the steady-state auto-cadence path proof (vs the deliberate applies on the runners), no direct access needed (last time driven via its at-logon scheduled task; operator has it). ASYNC-CONFIRM: grab enlyzeam exe_hash next cadence, verify == 984298ba…264f2ff7 (its v0.5.0 win target) to fully close.

Both reachable nodes (kitsubito Linux + hfenduleam Windows) on **v0.5.0 counter 10, seamless, promoted — deployah hash-verified BOTH char-for-char**. M9 SHIPPED + fleet-rolled. enlyzeam async-confirm pending. The whole respawn-path arc (v0.4.0→v0.4.2 restoration) is CLOSED by the first genuine Linux seamless no-bounce on kitsubito.

---
name: v050-release
description: "v0.5.0 (M9) release — merged to main + tagged 2026-06-13; deployah signing counter 10, draft building"
metadata:
  node_type: memory
  type: project
  originSessionId: 86f6382c-e3ce-4405-a345-5f5ce8b948e7
---

**v0.5.0 — M9 "Adapter customization & session surfaces"** release. Operator GO 2026-06-13; todlando drove merge+tag, deployah signs+publishes (signer incumbent, seed resident in ENV `SPT_RELEASE_SEED`).

**Merge to main (clean linear-stack collapse):** PR#7 (W1 profiles/strings/hints) → #9 (W2 user-msg/Gateway/live-role + gateway-wan; carried #8's W2 commits since gateway-wan was stacked on user-surfaces) → #10 (W3 digest). **#8 auto-CLOSED** when `--delete-branch` on #7 removed its base branch mid-stack — its content rode in via #9 (annotated on the PR). main @ **22a9b6f**, CI GREEN both runners (test + n1-gate + traceability). LESSON: don't `--delete-branch` mid-stack — it closes (not retargets) the dependent PR; merge bottom-up without deleting until the tip.

**Version:** 0.4.2 → **0.5.0** (feature milestone + breaking `[pty_digest]` manifest-section removal → minor bump, pre-1.0 rule). **Counter 10** (monotonic, v0.4.2 was 9). CHANGELOG `## [0.5.0] - 2026-06-13` user-facing = the GitHub Release body verbatim.

**Tagged v0.5.0** @ 22a9b6f, pushed → release.yml (draft build, both runners → spt-releases: linux/windows binaries + SHA256SUMS + manifest.schema.json + mock-adapter.zip) + docs-publish.yml triggered.

**deployah publish step** (release keys NEVER in CI — local sign): `cargo run -p xtask -- release-publish --tag v0.5.0 --key-id rel-primary-2026 --version 10` → verify vs SHA256SUMS → sign per-platform `*.release.json` → upload metadata/update-set → flip draft public → ping todlando artifact hashes. deployah armed own draft-watch (primary trigger); todlando watching release.yml (flags a RED build so deployah doesn't wait on a draft that won't come).

**STATUS: PUBLISHED 2026-06-13T23:23:01Z — M9 SHIPPED.** deployah signed + flipped public (counter 10); all 8 assets live incl. both signed *.release.json + update-set.json. Hashes: linux `4c079100afe80da5efcdf54d934e16de150d014605634e87fe07038a584217ae` · windows `984298bad6fb691883044c962985ced2d41b32a86d115442663dc2ff264f2ff7`. release.yml + docs-publish green. URL https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0
**FLEET ROLLED 2026-06-13 (operator GO "roll all"):**
- **kitsubito (Linux) SEAMLESS ✓** — broker pid 1357210 HELD, brain 1357219→2135176 rolled live, gen 0→1, exe_hash 500a9e7b→4c079100 (bytes-assert verified = signed artifact, deployah char-for-char confirmed), applied-state phase:applied/v10, NO manual bounce. **FIRST genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1.** Closes the whole respawn-path arc: the current_exe()-follows-rename bug (v0.4.1 Linux RED) is DEAD; the v0.4.2 canonical-path-respawn broker delivered.
- **hfenduleam (Windows) SEAMLESS ✓** — broker pid 17232 HELD, brain 39820→56744, gen 2→3, exe_hash b9ec8ddd→984298ba, applied-state v10, no bounce. GOTCHA: fetch returned Rollback{current:10,candidate:10} — pump had ALREADY peer-staged counter 10, so applied the staged set directly (no fetch needed).
- **enlyzeam (3rd SPT_DEV node):** no direct access in hand — rides natural pump propagation (counter 10 stages from peers, applies on cadence, seamless expected on its fixed broker) OR deployah/operator drives it. Asked deployah.

Both reachable nodes on **v0.5.0 counter 10, seamless, promoted**. M9 SHIPPED + fleet-rolled.

-- **enlyzeam (3rd SPT_DEV node):** no direct access in hand — rides natural pump propagation (counter 10 stages from peers, applies on cadence, seamless expected on its fixed broker) OR deployah/operator drives it. Asked deployah.

+- **enlyzeam (3rd SPT_DEV node, Windows):** deployah ruled **ride NATURAL pump propagation** (decision b) — banks the steady-state auto-cadence path proof (vs the deliberate applies on the runners), no direct access needed (last time driven via its at-logon scheduled task; operator has it). ASYNC-CONFIRM: grab enlyzeam exe_hash next cadence, verify == 984298ba…264f2ff7 (its v0.5.0 win target) to fully close.

-Both reachable nodes on **v0.5.0 counter 10, seamless, promoted**. M9 SHIPPED + fleet-rolled.

+Both reachable nodes (kitsubito Linux + hfenduleam Windows) on **v0.5.0 counter 10, seamless, promoted — deployah hash-verified BOTH char-for-char**. M9 SHIPPED + fleet-rolled. enlyzeam async-confirm pending. The whole respawn-path arc (v0.4.0→v0.4.2 restoration) is CLOSED by the first genuine Linux seamless no-bounce on kitsubito.


**Done — M9 shipped end-to-end, fleet rolled.**

## Merge + publish (your ask)
- **All M9 PRs merged to main** (#7 W1, #9 W2+gateway-wan, #10 W3; #8 auto-closed mid-stack, content rode via #9). main @ `22a9b6f`, CI green.
- **CHANGELOG current** — user-facing `## [0.5.0] - 2026-06-13` (profiles, strings, hints, `endpoint role`, `api digest-entry`; log-sourced digest + breaking `[pty_digest]` removal; who-sent-it + Gateway).
- **v0.5.0 PUBLISHED** (counter 10) — deployah signed + flipped public; both hashes deployah-verified char-for-char: linux `4c079100…`, win `984298ba…`. https://github.com/SaberMage/spt-releases/releases/tag/v0.5.0

## Fleet roll (deployah requested, you greenlit "roll all")
| Node | Result |
|------|--------|
| **kitsubito** (Linux) | **SEAMLESS ✓** broker pid HELD, brain rolled live 1357219→2135176, exe_hash→`4c079100`, promoted v10, **no bounce** |
| **hfenduleam** (Win) | **SEAMLESS ✓** broker pid HELD, brain 39820→56744, exe_hash→`984298ba`, promoted v10, no bounce |
| **enlyzeam** | rides natural pump propagation (deployah's call — banks the steady-state auto-cadence proof); async-confirm exe_hash next cadence |

## Bonus milestone
kitsubito's apply is the **first genuine Linux seamless no-bounce** — the field-proof deferred since v0.4.1. The `current_exe()`-follows-rename bug that killed v0.4.1 on Linux is **dead**; the fixed v0.4.2 canonical-path-respawn broker delivered. **Closes the whole restoration respawn-path arc** (v0.4.0→v0.4.2).

Memory updated. Nothing outstanding except enlyzeam's async hash-confirm (deployah on-call to verify). M9 complete and live.


<command-message>spt:commune</command-message>
<command-name>/spt:commune</command-name>
<command-args>with potential next steps and broad summary of the project's status + end goal. we'll resume in the next session</command-args>


Base directory for this skill: C:\Users\decid\.ccs\instances\bigscreen\plugins\cache\cplugs\spt\1.11.25\skills\commune

# /spt:commune

All commands use `$LIVE` env var, auto-injected by the plugin's SessionStart hook. If commands fail with "command not found", restart the Claude Code session so the SessionStart hook re-runs.

> **Identity auto-detection:** Your identity is auto-detected from your session. Pass your ID explicitly only if auto-detection fails.

## Flow

1. **Download Psyche's *current* context** — it shifts during the session as background echo communes fire. Re-download right before composing; the gen-N snapshot you read at session start is already stale:
   ```bash
   $LIVE psyche-download <your-id>
   ```

   > **Output truncation.** If the Bash tool reports `Output too large (N KB)` and saves the full result to a `tool-results/<id>.txt` file, use the `Read` tool on that saved path to access the full content. Do NOT re-run `psyche-download` to grep/awk out sections — repeated invocations re-download the same context, waste tokens, and may duplicate `## Pending Commune` sections in `live_context.md`.

2. **Diff your knowledge against this fresh download** — only what's missing from *it* is the real delta (new work, decisions, intentions). Anything already absorbed is not. If the download includes a `<memformat>` section, use it as a guide for what topics to cover. A `## Pending Commune (uncommitted)` section means a previous commune is still queued — do NOT re-send it.

3. **Commune only the delta** -- use the **Write tool** to create
   `.claude/{your-id}-commune.md` with the two-slice body as its contents
   (see `## Two-slice body shape (Phase 25 D-10/D-11)` below for the required
   envelope wrapping). Do not use Bash/heredoc -- Write is the canonical path:
   no shell escaping, no `EOF` collision risk, and Write auto-creates the
   `.claude/` parent directory.

   Your Self listener detects the file on its next poll iteration, notifies
   your Psyche wrapper, and the wrapper ingests the content via the existing
   Psyche session. On success (subprocess exit code 0) the wrapper deletes the
   file. On error (token rate limit, etc) the file is retained and retried on
   the next consume cycle. If you write again before the wrapper consumes, the
   latest write wins (last-write-wins overwrite semantics).

If Psyche's context is already current, no commune is needed. Say so and move on.

Read `commune.md` (in this skill directory) for the full commune protocol -- when to send, what to include, and diligence triggers.

**Agent-type guard:** Only works on live agents. If target is not live, refuses with: "Communes require a live agent with Psyche."

## Two-slice body shape (Phase 25 D-10/D-11)

The body you write in `.claude/{your-id}-commune.md` MUST itself be wrapped in two-slice envelopes per Phase 25 D-10/D-11. The taxonomy — what belongs in `<live-context>` vs `<project-context>` — is defined canonically in `psyche.md` §`<output_envelope>` (lines 282–323). Read that section as the source of truth; this skill doc teaches only when and how to apply it.

**In-project detection rule (D-25.1-04).** Before composing your commune body, run `$LIVE psyche-download <your-id>` (Step 1 of `## Flow` above) and inspect the `<current ... />` tag at the top of the output. The `<current/>` tag carries a `project="..."` attribute whenever any payload is produced — its presence means you are inside a tracked project (inside a git repo, `project` is the repo name; outside a git repo per D-11, `project` is the cwd-basename fallback, which still counts as a project context for routing purposes). A `psyche-download` invocation that returns no payload at all (NO-CONTEXT exit) means no project resolved. So: `project="..."` populated on `<current/>` → emit BOTH envelopes (apply rule 1 or 2 below); no payload at all → emit ONLY `<live-context>` (rule 3). Secondary signal: the `<project-context-resolved name="..."/>` sentinel further down the output indicates the project file already has prior content — useful for spotting first-time-in-project pairings, but NOT the routing rule.

**Three rules (D-25.1-01..03):**

- **In-project, both slices populated** (marker present, you have project-specific content this cycle): emit `<live-context>...</live-context>` AND `<project-context>...</project-context>`, both with non-empty bodies.
- **In-project, no project-specific update this cycle** (marker present, but nothing project-bound to report): emit `<live-context>...</live-context>` AND `<project-context></project-context>` (empty body — the deliberate "in-project but quiet" signal per D-25.1-02). Distinguishable from "no project resolved".
- **Outside any tracked project** (marker absent): emit ONLY `<live-context>...</live-context>`. Do NOT emit an empty `<project-context>` envelope (missing tag means "no project resolved" per D-25.1-03).

**Nested envelopes.** The Phase 23 `<EVENT type="commune">` envelope (see `## Envelope shape (Phase 23 v1.8)` below) is composed by `$LIVE commune` automatically — you NEVER write `<EVENT>` tags. You write ONLY the inner two-slice body. The two envelope layers nest: outer EVENT wraps inner two-slice body.

(See `psyche.md` §`<output_envelope>` for the canonical taxonomy and per-slice content rules.)

## Envelope shape (Phase 23 v1.8)

As of v1.8 Phase 23, commune deliveries are wrapped in a typed EVENT envelope carrying a 5-field stamp (`machine`, `project`, `branch`, `head_sha`, `head_subject`); the prose `COMMUNE (timestamp): body` form is gone.

```xml
<EVENT type="commune" timestamp="2026-05-20T06:00:00-07:00" machine="hostname" project="claude_skill_owl" branch="main" head_sha="abc123..." head_subject="subject line capped at 72 chars">body</EVENT>
```

Outside a git repo (D-11), `branch`, `head_sha`, and `head_subject` are omitted entirely (not empty-string-set):

```xml
<EVENT type="commune" timestamp="2026-05-20T06:00:00-07:00" machine="hostname" project="cwd-basename">body</EVENT>
```

`$LIVE commune` composes this envelope automatically — Self does NOT manually construct EVENT XML. The `body` placeholder in the example above is the two-slice body (see `## Two-slice body shape (Phase 25 D-10/D-11)` above); the two envelope layers nest. The wrapper-side parser ignores unknown attrs, so the stamp fields are forward-compatible with older receivers. For drift detection on resume, see the `live` skill.

ARGUMENTS: with potential next steps and broad summary of the project's status + end goal. we'll resume in the next session


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


Communing before session end. First download Psyche's current context to diff the delta:


Bash

$LIVE psyche-download todlando 2>&1 | head -60

Download Psyche current context


<memformat>
<?xml version="1.0"?>
<memformat version="1">
<!-- Changelog: v1 - initial seed -->
<topics>
  <topic name="events">Notable or unusual events and requests</topic>
  <topic name="interactions">Agent interactions -- who, roles, contributions</topic>
  <topic name="reflections">Thoughts on recent work -- what went well, what was tricky</topic>
  <topic name="ideas">Ideas to raise with the user</topic>
  <topic name="improvements">Further improvement ideas for recent problem spaces</topic>
  <topic name="timeline">What happened when, timing, sequencing</topic>
  <topic name="blockers">Current blockers or concerns</topic>
  <topic name="focus">Current focus and immediate next steps</topic>
</topics>
</memformat>
</memformat>

<current machine="HFENDULEAM" project="spt-core" branch="main" head_sha="22a9b6fcbf2b11afc527d3847ee59c2045baee52" head_subject="Merge pull request #10 from SaberMage/m9-digest-logs" commits_since="0" commits_unpulled="0"/>
# Psyche Context for todlando
## Status
Generation 43 active. Echo commune received 2026-06-13T23:20Z from HFENDULEAM, main @ 22a9b6f.
## Current Focus
v0.5.0 release rolling. release.yml (linux/win binaries + SHA256SUMS + schema + mock-adapter) + docs-publish.yml active. deployah armed with draft-watch, standing by for artifact land → publish.
## Tracked Intentions
- release.yml build live (CI + docs sync)
- deployah draft-watch fires on linux+win+SHA256SUMS artifact land → release-publish --tag v0.5.0 --version 10, verify SHA256SUMS, per-platform sign, flip public, ping hashes
- Author monitoring release.yml; will alert deployah if RED
## Completed Items
- M9 all waves merged: PR#7 ✓ PR#9 ✓ PR#10 ✓ PR#8 closed (content via #9)
- main @ 22a9b6f, PtyDigest gone, CHANGELOG consolidated
- Tag v0.5.0 pushed, CI green, draft staging on spt-releases
- deployah handoff confirmed (seed ENV resident, counter=10)
## User Interactions
None this generation.
## Agent-to-Agent Interactions
Echo commune from HFENDULEAM confirms main state. deployah independent and armed.<project-context-resolved name="spt-core"/>
M9 → v0.5.0 complete. release.yml + docs-publish.yml in flight. deployah will publish on artifact land. Awaiting draft completion.


Psyche is at gen 43 — its focus is "release.yml in flight, deployah will publish on artifact land, awaiting draft." Everything after that is the delta: published + verified + fleet-rolled seamless + respawn-arc closed. Plus the user wants a status/next-steps summary for next session. Writing the two-slice commune:


Write

<live-context>
**Delta since gen-43 (you had "release.yml in flight, deployah will publish on land"). It all landed — and then some.**

- **v0.5.0 PUBLISHED + VERIFIED.** release.yml + docs-publish.yml went green; draft built; deployah's armed draft-watch fired, ran `release-publish --tag v0.5.0 --version 10` (verify→sign→upload→flip public). PUBLIC 2026-06-13T23:23:01Z. deployah hash-verified BOTH artifacts char-for-char vs his signed metadata: linux `4c079100afe80da5…84217ae`, win `984298bad6fb6918…264f2ff7`. counter 10, key rel-primary-2026.

- **FLEET ROLLED (operator GO'd "roll all" via AskUserQuestion).** I drove deliberate applies:
  - **kitsubito (Linux) SEAMLESS** — broker pid 1357210 HELD, brain 1357219→2135176 rolled LIVE, gen 0→1, exe_hash 500a9e7b→4c079100, applied-state phase:applied/v10, NO manual bounce, pump live throughout. **This is the FIRST genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1.** deployah confirmed it CLOSES the whole respawn-path arc: the `current_exe()`-follows-rename bug that RED'd v0.4.1 on Linux is DEAD; the fixed v0.4.2 canonical-path-respawn broker delivered.
  - **hfenduleam (Windows) SEAMLESS** — broker pid 17232 HELD, brain 39820→56744, gen 2→3, exe_hash b9ec8ddd→984298ba, promoted v10, no bounce. GOTCHA handled: its `update fetch` returned `Rollback{current:10,candidate:10}` because the pump had ALREADY peer-staged counter 10 — so I applied the staged set directly (correct; not the v0.3.2 single→set floor trap).
  - **enlyzeam** — deployah ruled ride NATURAL pump propagation (banks the steady-state auto-cadence proof). No direct access in hand. ASYNC-CONFIRM pending: its exe_hash next cadence should == 984298ba (Windows v0.5.0 target). deployah on-call to verify.

- **Reflections/lessons this session (worth carrying):**
  - **Don't `--delete-branch` mid-stack.** Merging PR#7 with `--delete-branch` CLOSED the dependent PR#8 (deleting its base branch) instead of retargeting. Recovery: #8's W2 content rode into main via #9 (gateway-wan was stacked on user-surfaces). Merge a linear stack bottom-up WITHOUT deleting until the tip.
  - **User correction:** **deployah** is the signer incumbent (I'd said "doyle" — doyle is the GATE reviewer, deployah is sign+publish).
  - doyle ran the full G3 gate this session: engineering PASS + one honesty HOLD (REQ-TERM-4 title overclaimed "opt-in Path-B log" = deferred Option-C with no evidence) → fixed by dropping the clause. Good catch; the title-honesty rail held.

- **Agent interactions:** deployah (signer) — tight, independent, armed own draft-watch + verified both hashes solo. doyle (gate reviewer) — G3 PASS. todlando-psyche echo communes FYI.

- **Hand-off intent:** session ending; resume next session. The user's full ask (merge all PRs + publish + changelog current) is DONE, plus the fleet roll. Only loose thread = enlyzeam async hash-confirm.
</live-context>
<project-context>
**spt-core = harness-independent core for an agent ecosystem** (messaging, live-agent lifecycle, terminal hosting, P2P networking, runtime-manifest harness contract). Rust workspace + one `spt` binary. Clean-room rebuild of `claude_skill_owl`. **End goal:** a manifest-driven, harness-independent platform whose first real proof is `spt-claude-code` (the v1 acceptance adapter, its own repo), then GUI/remote surfaces.

**MILESTONE STATE — M9 COMPLETE + SHIPPED as v0.5.0 (2026-06-13), fleet-rolled seamless.**
- M9 = "Adapter customization & session surfaces." All four gates passed (G1 profiles/strings/hints, G2 user-msg/Gateway/live-role, Gateway-WAN cross-node user-msg, G3 session-digest log-source re-foundation).
- Merged to main @ `22a9b6f` (clean linear-stack collapse: PR#7→#9→#10; #8 closed, content via #9). Version 0.4.2→**0.5.0** (minor: feature milestone + breaking `[pty_digest]` manifest-section removal, pre-1.0 rule). **counter 10.** CHANGELOG `## [0.5.0]` is user-facing.
- **Fleet (SPT_DEV, 3 nodes):** kitsubito (Linux) + hfenduleam (Windows) on v0.5.0 seamless, deployah-verified. enlyzeam rides natural propagation (async-confirm exe_hash==984298ba pending).
- **Restoration arc CLOSED:** the broker/brain two-process respawn saga (v0.4.0→v0.4.2) is fully field-proven — first genuine Linux seamless no-bounce achieved on kitsubito this release.

**G3/digest specifics (newest subsystem):** the session digest is now an ON-DEMAND projection of normalized session logs (`spt-term::projection` + `spt-daemon::digest::project_endpoint_digest`), NOT a PTY byte-parse. Topology-independent (works for harness-hosted endpoints with no broker PTY). Published **digest-record contract** (`{role,text,tool}`) rides `[history]`; `api digest-entry` is the log-less push door. PTY-parse engine + `[pty_digest]` retired. REQ-TERM-4 re-pointed honestly.

**POTENTIAL NEXT STEPS (for resume, roughly ordered):**
1. **enlyzeam async hash-confirm** — grab its exe_hash next cadence, verify ==`984298ba…264f2ff7`; fully closes the v0.5.0 fleet roll. (deployah on-call.)
2. **`spt-claude-code` scoping** — THE big next milestone: the first real adapter + v1 acceptance proof, its own repo. M9's profiles/hints/digest are its enablers. This is the strategic next beat.
3. **T5 twohost honored-path int** — REQUIRED-BEFORE-LECTURN (tracked on REQ-MSG-6 + ROADMAP:81): the cross-node Gateway HONORED-path wire test (Gateway advert A → user-msg honored at B). Must land before `spt-lecturn` (sibling repo) ships a real cross-node Gateway. Activate REQ-MSG-6 `int` when adding it.
4. **Queued milestones:** M10 Shell-substrate extensions (drive channel, shell tunnel, per-capability approval gates, Gateway-as-owner audit); M11 Remote attach (`spt rc`) over the R-TERM substrate.
5. **Deferred backlog** (`docs/DEFERRED.md`): autonomous digest file-watch freshness + Option-C persistence re-home (ride the consuming-frontend milestone); subnet full-mesh (ADR-0017, REQ-MESH-1..6 inactive, `SUBNET-MESH-PLAN.md`); origin-fetch already shipped (REQ-UPD-7/8); pairing-time hostname capture; alarm scheduler port; broker-side QUIC-op bound (pump-IPC B-half). Also a flagged ROADMAP reconciliation pass (the milestone list lags reality).

**Conventions that bit/helped this session:** traceability is binding (`traceable-reqs check` EXIT=0 every commit; tag evidence in-commit, never file-tops). Release = `docs/RELEASE-RUNBOOK.md` (CI builds draft, maintainer signs LOCAL, keys never in CI). Merge-to-main = release-gated operator decision. Don't `--delete-branch` mid-stack. deployah signs; doyle gates.
</project-context>


/spt:commune with potential next steps and broad summary of the project's status + end goal. we'll resume in the next session


File created successfully at: C:\Users\decid\Documents\projects\spt-core\.claude\todlando-commune.md (file state is current in your context — no need to Read it back)

<live-context>
**Delta since gen-43 (you had "release.yml in flight, deployah will publish on land"). It all landed — and then some.**

- **v0.5.0 PUBLISHED + VERIFIED.** release.yml + docs-publish.yml went green; draft built; deployah's armed draft-watch fired, ran `release-publish --tag v0.5.0 --version 10` (verify→sign→upload→flip public). PUBLIC 2026-06-13T23:23:01Z. deployah hash-verified BOTH artifacts char-for-char vs his signed metadata: linux `4c079100afe80da5…84217ae`, win `984298bad6fb6918…264f2ff7`. counter 10, key rel-primary-2026.

- **FLEET ROLLED (operator GO'd "roll all" via AskUserQuestion).** I drove deliberate applies:
  - **kitsubito (Linux) SEAMLESS** — broker pid 1357210 HELD, brain 1357219→2135176 rolled LIVE, gen 0→1, exe_hash 500a9e7b→4c079100, applied-state phase:applied/v10, NO manual bounce, pump live throughout. **This is the FIRST genuine Linux seamless no-bounce — the field-proof deferred since v0.4.1.** deployah confirmed it CLOSES the whole respawn-path arc: the `current_exe()`-follows-rename bug that RED'd v0.4.1 on Linux is DEAD; the fixed v0.4.2 canonical-path-respawn broker delivered.
  - **hfenduleam (Windows) SEAMLESS** — broker pid 17232 HELD, brain 39820→56744, gen 2→3, exe_hash b9ec8ddd→984298ba, promoted v10, no bounce. GOTCHA handled: its `update fetch` returned `Rollback{current:10,candidate:10}` because the pump had ALREADY peer-staged counter 10 — so I applied the staged set directly (correct; not the v0.3.2 single→set floor trap).
  - **enlyzeam** — deployah ruled ride NATURAL pump propagation (banks the steady-state auto-cadence proof). No direct access in hand. ASYNC-CONFIRM pending: its exe_hash next cadence should == 984298ba (Windows v0.5.0 target). deployah on-call to verify.

- **Reflections/lessons this session (worth carrying):**
  - **Don't `--delete-branch` mid-stack.** Merging PR#7 with `--delete-branch` CLOSED the dependent PR#8 (deleting its base branch) instead of retargeting. Recovery: #8's W2 content rode into main via #9 (gateway-wan was stacked on user-surfaces). Merge a linear stack bottom-up WITHOUT deleting until the tip.
  - **User correction:** **deployah** is the signer incumbent (I'd said "doyle" — doyle is the GATE reviewer, deployah is sign+publish).
  - doyle ran the full G3 gate this session: engineering PASS + one honesty HOLD (REQ-TERM-4 title overclaimed "opt-in Path-B log" = deferred Option-C with no evidence) → fixed by dropping the clause. Good catch; the title-honesty rail held.

- **Agent interactions:** deployah (signer) — tight, independent, armed own draft-watch + verified both hashes solo. doyle (gate reviewer) — G3 PASS. todlando-psyche echo communes FYI.

- **Hand-off intent:** session ending; resume next session. The user's full ask (merge all PRs + publish + changelog current) is DONE, plus the fleet roll. Only loose thread = enlyzeam async hash-confirm.
</live-context>
<project-context>
**spt-core = harness-independent core for an agent ecosystem** (messaging, live-agent lifecycle, terminal hosting, P2P networking, runtime-manifest harness contract). Rust workspace + one `spt` binary. Clean-room rebuild of `claude_skill_owl`. **End goal:** a manifest-driven, harness-independent platform whose first real proof is `spt-claude-code` (the v1 acceptance adapter, its own repo), then GUI/remote surfaces.

**MILESTONE STATE — M9 COMPLETE + SHIPPED as v0.5.0 (2026-06-13), fleet-rolled seamless.**
- M9 = "Adapter customization & session surfaces." All four gates passed (G1 profiles/strings/hints, G2 user-msg/Gateway/live-role, Gateway-WAN cross-node user-msg, G3 session-digest log-source re-foundation).
- Merged to main @ `22a9b6f` (clean linear-stack collapse: PR#7→#9→#10; #8 closed, content via #9). Version 0.4.2→**0.5.0** (minor: feature milestone + breaking `[pty_digest]` manifest-section removal, pre-1.0 rule). **counter 10.** CHANGELOG `## [0.5.0]` is user-facing.
- **Fleet (SPT_DEV, 3 nodes):** kitsubito (Linux) + hfenduleam (Windows) on v0.5.0 seamless, deployah-verified. enlyzeam rides natural propagation (async-confirm exe_hash==984298ba pending).
- **Restoration arc CLOSED:** the broker/brain two-process respawn saga (v0.4.0→v0.4.2) is fully field-proven — first genuine Linux seamless no-bounce achieved on kitsubito this release.

**G3/digest specifics (newest subsystem):** the session digest is now an ON-DEMAND projection of normalized session logs (`spt-term::projection` + `spt-daemon::digest::project_endpoint_digest`), NOT a PTY byte-parse. Topology-independent (works for harness-hosted endpoints with no broker PTY). Published **digest-record contract** (`{role,text,tool}`) rides `[history]`; `api digest-entry` is the log-less push door. PTY-parse engine + `[pty_digest]` retired. REQ-TERM-4 re-pointed honestly.

**POTENTIAL NEXT STEPS (for resume, roughly ordered):**
1. **enlyzeam async hash-confirm** — grab its exe_hash next cadence, verify ==`984298ba…264f2ff7`; fully closes the v0.5.0 fleet roll. (deployah on-call.)
2. **`spt-claude-code` scoping** — THE big next milestone: the first real adapter + v1 acceptance proof, its own repo. M9's profiles/hints/digest are its enablers. This is the strategic next beat.
3. **T5 twohost honored-path int** — REQUIRED-BEFORE-LECTURN (tracked on REQ-MSG-6 + ROADMAP:81): the cross-node Gateway HONORED-path wire test (Gateway advert A → user-msg honored at B). Must land before `spt-lecturn` (sibling repo) ships a real cross-node Gateway. Activate REQ-MSG-6 `int` when adding it.
4. **Queued milestones:** M10 Shell-substrate extensions (drive channel, shell tunnel, per-capability approval gates, Gateway-as-owner audit); M11 Remote attach (`spt rc`) over the R-TERM substrate.
5. **Deferred backlog** (`docs/DEFERRED.md`): autonomous digest file-watch freshness + Option-C persistence re-home (ride the consuming-frontend milestone); subnet full-mesh (ADR-0017, REQ-MESH-1..6 inactive, `SUBNET-MESH-PLAN.md`); origin-fetch already shipped (REQ-UPD-7/8); pairing-time hostname capture; alarm scheduler port; broker-side QUIC-op bound (pump-IPC B-half). Also a flagged ROADMAP reconciliation pass (the milestone list lags reality).

**Conventions that bit/helped this session:** traceability is binding (`traceable-reqs check` EXIT=0 every commit; tag evidence in-commit, never file-tops). Release = `docs/RELEASE-RUNBOOK.md` (CI builds draft, maintainer signs LOCAL, keys never in CI). Merge-to-main = release-gated operator decision. Don't `--delete-branch` mid-stack. deployah signs; doyle gates.
</project-context>