---
name: v040-published-fleet-rolled
description: "v0.4.0 (restoration release) PUBLIC + fleet rolled 2026-06-10, counter 7; D7-4 bytes-match done, seamless no-bounce proof deferred to v0.4.1"
metadata: 
  node_type: memory
  type: project
  originSessionId: ac462203-5758-461e-800e-f3b05de7ebcd
---

v0.4.0 = the **restoration milestone release** (broker/brain two-process). PUBLIC 2026-06-10, release **counter 7** (deployah signed, key rel-primary-2026). Tag at b0fdc01; CI green both runners + twohost-a/b. Artifact hashes: linux `b4b7ea142d2ec3d7bb20e33cb66c8ff81464aeef258eca42842e55e04cf07b5e`, windows `81c24675e344bf7426a654df364ef2ba5606b3f0e758308942c987cd98747da9`.

**D7-4 field-verify (bytes-match half) DONE — both nodes v0.4.0 two-process resident, brain.ready exe_hash == released artifact:** kitsubito (broker 819830 + brain 819839, linux hash), hfenduleam (broker 17232 + brain 38324, windows hash). Evidence appendix = docs/TWO-HOST-RUNBOOK.md (commit 190ad10). exe_hash = lowercase-hex SHA-256 of the running `current_exe` (`brainproc.rs current_exe_hash`).

**GOTCHA confirmed live:** v0.3.2→v0.4.0 `update apply` swaps the on-disk binary (`spt --version`→0.4.0, friendly msg) but the RUNNING daemon pid is UNCHANGED — the in-process 0.3.2 broker can't self-relaunch (THE regression). Each node needed its **last manual bounce** (kitsubito: `systemctl --user restart spt-daemon.service`; hfenduleam: operator bounced). v0.4.0 = the last release needing a manual bounce, by design.

**STILL OPEN (deferred to v0.4.1, operator's plan):** (1) the seamless **no-bounce** assert (apply triggers brain respawn onto new bytes, no manual restart) — only provable v0.4.0→v0.4.1 (needs split-era resident first); owned by D7-1 E2E meanwhile. (2) **enlyzeam** still <0.3.2 = the project's FINAL manual bounce, pair with v0.4.1. (3) milestone CLOSE (ROADMAP restoration→✅, KNOWN-HAZARDS 6.7/6.8, DEFERRED rows) waits for the v0.4.1 seamless proof. See [[v032-platform-safe-update]], [[daemon-service-detection-gotcha]].
