---
name: v0290-published
description: "spt v0.29.0 = release counter 49 PUBLISHED 2026-07-08 (LIFECYCLE-TRUTH milestone); doyle drove end-to-end solo (deployah parked); tag @d0c1cf1; CI gate-hold #1 (n1-gate stderr-observation + traceability parse) fixed @7190730; seed-in-env → doyle signed"
metadata: 
  node_type: memory
  type: project
  originSessionId: aed3e074-30a9-40a8-87a0-c878bf4bdc48
---

**spt v0.29.0 = release counter 49. PUBLISHED 2026-07-08 (~02:37Z).** Ships milestone **LIFECYCLE-TRUTH** (all 6 waves). Latest on `SaberMage/spt-releases`, signed `rel-primary-2026`, `update-set.json` v49 "0.29.0".

Tag `v0.29.0` @ `d0c1cf1` (merge commit of PR #57 lifecycle-truth→main; tree = validated `7190730`).

**doyle drove the ENTIRE release solo** (deployah = designated driver but PARKED — sends QUEUED not live; operator "drive to release publish" + later "it's in your env" = doyle authorized to sign). First time doyle ran a full cut end-to-end. Chain: bump @a74e526 → CI gate-hold #1 → fix @7190730 → PR #57 all-green → merge d0c1cf1 → tag → release.yml draft (both-platform build ~17min) → **doyle signed** (SPT_RELEASE_SEED in env, 64-hex) → public.

**CI GATE-HOLD #1 (2 real non-substantive reds + 1 flake) — the release lesson:**
- **n1-gate** (new-brain×old-broker, BOTH platforms): `new_brain_serves_against_old_broker` assert#2 `BRAIN_UP` failed on EMPTY trace. ROOT: **W3 REQ-DAEMON-STDERR-PERSIST redirects the brain's OWN stderr FD → SPT_HOME/logs/daemon.stderr.log** (brainproc.rs:165 stderrlog::install, before the BRAIN_UP eprintln:176), so the test's INHERITED-stderr capture is empty. assert#1 (brain ALIVE vs old broker) PASSED = N-1 compat INTACT, only the observation moved. **Env-gated (SPT_N1_OLD_BROKER unset → local nextest SILENT-SKIPS)** → escaped all wave gates, surfaced only at 1st PR-to-main CI. FIX @7190730: n1_pairing.rs reads the persistent log too.
- **traceability** `check --json` parse_error: doyle's OWN W6-GATE-VERDICT.md prose carried literal `[doc->…]`/`[doc->REQ-DOC-*]` tag-shaped tokens (REPEATED the flaw todlando flagged in the dispatch ruling). **CI `check --json` is STRICTER than local plain `traceable-reqs check`** (parse_error severity=must→exit1; plain check exit-0 MISSES it). FIX: `→` arrow neutralize.
- **Windows test** dummy_harness_e2e endpoint_run_attach saw_tick: Linux GREEN, test UNCHANGED, bailed-flags false = hfenduleam CI/live-daemon TIMING flake → self-resolved on rerun.

**LESSONS (binding):**
1. **Env-gated tests (SPT_N1_OLD_BROKER, SPT_TWO_HOST) silent-skip local nextest** — a behavior change (stderr-redirect, wire tweak) that breaks their observation escapes wave gates and catches ONLY at PR-to-main CI. Before a release PR, grep env-gated tests for observation-deps on anything the milestone changed.
2. **CI traceability = `traceable-reqs check --json`, STRICTER than plain `check`** (parse_error gate on malformed tag-shapes). Run `check --json` locally before gating any doc.
3. **Tag-shaped `[stage->REQ]` tokens in ANY prose (rulings/verdicts) trip the CI parse gate** — write `→`/word-form in prose; real `[stage->REQ]` tags only on actual evidence artifacts. (doyle hit this TWICE — ruling + verdict.)
4. **Version bump: `cargo update --workspace`** bumps exactly the workspace members' lock lines, leaves third-party — avoids the darling-class collision (strum/strum_macros ALSO carried 0.28.0; netlink-packet-route+ratatui genuinely 0.29.0 upstream, untouched). Verify `strum`=old + no first-party=old remain.

**Post-ship remaining (OPERATOR):** W1 field-accept swap window — daemon restart on hfenduleam → ENDPOINT-SURVIVAL brings live endpoints back, clears the OLD-daemon commune FAILED stamps (doyle+todlando live psyches). perri: CC SPT_INJECT_VERIFY_ECHO (v0.15.8) self-activates on 0.29.0 core; floor can move to 0.29.0.

Related: [[lifecycle-truth-build-progress]], [[v0280-published]], [[release-updateset-stale-window]], [[v0121-published]] (ledger).
