---
name: v0250-published
description: "v0.25.0 PUBLISHED (counter 45 @c01fe6e) — F-030 PSYCHE-EPHEMERAL; RC boundary-clean; CI cross-platform + seedmap-starvation recoveries"
metadata:
  node_type: memory
  type: project
  originSessionId: 1167a957-d044-46fd-92a7-99e2eed76e9f
---

**v0.25.0 PUBLISHED 2026-07-05T02:33:10Z — counter 45, tag c01fe6ee29c2a19c4a6ebc72f11c471cab7d13d0, Latest on SaberMage/spt-releases.** Signed 54188f127f9c...3ec9 / rel-primary-2026, update-set v45. Windows asset sha256 = 0202742115d5bb9109b6abfa336b4d7ec54bb6a99fc1d7561bb83c17016a8491 (byte-anchor held perri-RC→staged→draft→published, all identical). Milestone: F-030 PSYCHE-EPHEMERAL (all 6 waves, [[f030-psyche-ephemeral-progress]]). Adapter floor for claude-spt v0.14.0 = c01fe6e.

**RELEASE-DRIVE GOTCHAs (banked):**
- MERGE = FAST-FORWARD not merge-commit (runbook: tag the EXACT CI-validated tip; `git push origin <sha>:main`, PR auto-merges). Tag lands on the self-describing chore(release) commit.
- CROSS-PLATFORM CI CATCH: 8 Windows-only gates PASSED but PR CI kitsubito Linux leg RED — 2 conformance ints' `#[cfg(unix)]` mock-manifest had a nested-single-quote-in-TOML-literal bug (`command='sh -c '...''`), invisible to Windows (.bat branch). Fix = .sh-file + `sh <file> <args>`. Doyle independent Linux re-gate via kitsubito BUNDLE RIG (git bundle→scp→`git fetch <bundle> refs/remotes/origin/…`→worktree; NON-login ssh needs `export PATH=$HOME/.cargo/bin`; `git rev-parse <40hex>` ECHOES unverified→use `cat-file -e`). Detail [[gate-cross-platform-leg]].
- SEEDMAP STARVATION on CI Windows rerun: `seedmap::stop_op_acks_then_serve_returns` TIMED OUT (240s, not assert) — root = 8 leaked `spt-w6gate3-target` daemons from doyle's OWN gate accumulated on hfenduleam. Swept scoped-by-path → rerun-failed green. Detail [[e2e-leaked-daemons-shared-box]]. SEED: CI `test` job should exclude seedmap like the gates do.
- SEED_CMD signing snag: powershell-wrapper double-hex-decode panic → use `SPT_RELEASE_SEED` hex-env mode (clean).
- ADAPTER-BOUNDARY (doyle drift, operator-corrected): don't feed the adapter builder spt-core SOURCE/internal paths/stderr markers; RC observes at the SHIM boundary + public verbs + perch state (CONTEXT.md:243). Detail [[adapter-glue-model-boundary]].

**POST-RELEASE SEEDS:** c1_miss_once flake-harden; docs-site/book/ gitignore-tracked hygiene; CI seedmap-exclude; MANIFEST.md:126 clarify PSYCHE_RESEED = operator-log-only.

**Index-detail preserved on 2026-07-06 compaction:** counter 45 @c01fe6e; F-030 PSYCHE-EPHEMERAL; win sha 0202742115...; GOTCHAs: cross-platform CI catch (cfg(unix) fixture invisible to Win gate → kitsubito bundle-rig re-gate), seedmap-starvation from doyle's own leaked gate daemons, SEED_CMD double-hex → SPT_RELEASE_SEED hex-env, adapter-boundary drift (fed source→RC internals, corrected to shim-boundary+public verbs per CONTEXT.md:243).

---

## ⬇ Merged 2026-08-03 from the other memory root (store A) — [[two-memory-roots-diverged]]

Both stores held a note under this name, written by different sessions. Neither is wrong;
they record different facets of the same cut. Everything below is store A's version
**verbatim**, appended rather than reconciled, so nothing is lost to a summarizing pass.

⚠ **Apparent date conflicts between the two halves are the local-vs-UTC artifact, not a
disagreement:** this box is PDT (UTC-7), so a cut published after 17:00 local carries the
NEXT day's UTC date. v0.25.0 `2026-07-04` local == `2026-07-05T02:33:10Z`; v0.31.0
`2026-07-10` local == `2026-07-11T04:21Z`. Same class as the `ls -l` LOCAL vs traded-UTC
trap in [[commune-drops-orphaned-box-wide]]. Prefer the UTC stamp when quoting.

---

v0.25.0 = counter 45 (monotonic, NOT semver). Published to SaberMage/spt-releases 2026-07-04. The F-030 PSYCHE-EPHEMERAL cut. Tag on c01fe6e (CI-certified main tip). PR #51 merged.

**Published asset hashes (min_spt_core floor for perri):**
- linux  `spt-x86_64-linux`      sha256 `d11c21914467ea9bb4b9a7b4e599c4f4d919bc8d9080bae5fbc7aaa6fa6bc3e7`
- windows `spt-x86_64-windows.exe` sha256 `0202742115d5bb9109b6abfa336b4d7ec54bb6a99fc1d7561bb83c17016a8491` (== 4-way RC byte-anchor: draft SHA256SUMS == doyle re-hash == perri-RC-tested == published)
- signing pubkey `54188f127f9c361090c90f85ac072e623d7001b311d25eca0dd5f57ad05e3ec9` (key_id rel-primary-2026)
- update-set.json v45 "0.25.0", platforms x86_64-pc-windows-msvc + x86_64-unknown-linux-gnu
- URL https://github.com/SaberMage/spt-releases/releases/tag/v0.25.0

**Publish gotcha (cost one failed run this cut):** xtask `signing_identity()` (crates/xtask/src/main.rs:511) takes seed via EITHER `SPT_RELEASE_SEED_CMD` (a command whose stdout is the seed **hex string**, then hex-decoded) OR `SPT_RELEASE_SEED` (the seed **hex** directly). Two traps with the CMD path: (1) on Windows the CMD runs under **powershell**, not sh — a `printf %s "$VAR"` wrapper is invalid there; (2) the CMD output is itself hex-decoded, so piping raw hex through it double-decodes. When the seed is already a 64-char hex env var, just run WITHOUT `SPT_RELEASE_SEED_CMD` — xtask falls back to `SPT_RELEASE_SEED` hex-env mode and decodes to 32 bytes. Panic signature of the wrong path: `seed is 32 bytes: TryFromSliceError` at main.rs:536, AFTER the verify lines print (verify happens before seed-load, so a re-run is side-effect-free).

Publish is safe to re-run on seed-load panic: it aborts in `signing_identity()` before any sign/upload/flip.

**Adapter follow-on:** claude-spt v0.14.0 published + live-verified 2026-07-04 (fat adapter.spt win+linux, floor 0.25.0): https://github.com/SaberMage/claude-spt/releases/tag/v0.14.0 — installed binary byte-identical to RC build, tag-pinned fetches throughout (no stale-serve hit).

**Fleet-update ordering finding (perri, routed to doyle):** 0.24.0 core SILENTLY ACCEPTS a floor-0.25.0 adapter — `min_spt_core` is NOT enforced on acquisition. Until/unless enforcement lands, rollout order is **CORE FIRST, then adapter**. Bake this into release rollout comms for every cut.

See [[deployah-release-driver-flow]] for the RC-window sequence.
