---
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, 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.
