---
name: v0420-published
description: "v0.42.0 c76 PUBLISHED 2026-07-25 @8492c75 (deployah-authored, doyle-gated) — IDLE-EDGE W1: activity observation + digest seal/cross-node; the cut where a generated-docs blind spot was caught AT the release gate."
metadata: 
  node_type: memory
  type: project
  originSessionId: 77e42b09-4184-43f8-a344-c2020caad55e
  modified: 2026-07-25T11:14:17.426Z
---

**v0.42.0, counter 76, PUBLISHED 2026-07-25T11:13:13Z** to BigscreenVR/spt-bs-releases —
tag v0.42.0 → `8492c75` (merge of PR #73 `release/v0.42.0` @`89ba735`, parent main `3980583`),
draft=false, 11 assets, update-set v76 all three platforms, key `rel-primary-2026`, channel stable.
Deployah-authored end-to-end (changelog → bump → PR → tag → sign+publish), doyle-gated.

Hashes: linux `5c480064952d9c4b…` · linux-musl `42b69df07611e0e3…` · windows `34396b1194bc47de…`.

**Content — IDLE-EDGE W1 (ADR-0048), the wave that made the idle transition observable:**
- Added: activity frame pushed to owned shells on the existing link (carries the instant the
  state took effect); `busy`/`idle` on `endpoint list --json` + `api endpoint-info` (local rows,
  omitted rather than guessed); cross-node `endpoint digest <id@node>` with `--last`/`--after`.
- Fixed: seal-on-idle — a finished turn is readable without prompting the endpoint again
  (the mint-then-idle deadlock; liam's drive-one-more-command workaround retired).
- Known: the ready-listener notice gap, repeating per cut until
  REQ-NOTIF-GATE-ALL-DRAIN-SURFACES ships.

**MINOR not patch, and the reasoning is the reusable part:** three of the four surfaces were
additive/opt-in (patch-class alone), but leg A's activity frame lands on the **existing** shell
drain **unconditionally** — a `drive-poll` that always printed one line can now print two. One
unconditional change to an existing surface outranks any amount of additive opt-in under the
CHANGELOG intro's own bump rule. doyle: "exactly right, and the kind of call I want flagged not
buried."

**⭐ Lessons banked this cut:**
1. **The docs-drift gate has a structural blind spot, and a release cut is where it surfaces.**
   `spt endpoint digest`'s clap help still said "Local endpoints only." after `d8de4f9` shipped
   the cross-node pull. `reference.md` is GENERATED from those strings, so the gate — which
   compares generated against committed — passes a stale help string *perfectly consistently*.
   It can only catch a doc disagreeing with the code, never code whose own words are wrong.
   Found by READING the surface docs while wording the changelog, not by any check.
   → full rule in [[cli-command-docs-drift]] §3.
2. **Flag across the role line, don't fix across it.** The defect was wave content (todlando's
   lane), found by the release driver. Filing it with evidence + three ranked options, rather
   than patching it into the release PR, got doyle's ruling in one round (option 1: fix on main
   first) and kept the release PR at zero `.rs` delta so its CI still validated the exact tagged
   commit. Fixed as #74 `5404199` → main `3980583`; #73 rebased onto it.
3. **Regen AFTER a rebase, and the empty diff is the proof.** todlando's fix touched the same
   generated file my PR carries. Re-running `xtask gen` post-rebase produced zero delta — and
   that is load-bearing evidence *because the failure direction is asymmetric*: a stale
   pre-rebase `spt` binary would have written the OLD help text and diffed against the new.
   Empty can only mean the binary carried the fix. Paired probes anyway (stale strings absent
   at grep exit 1 / new strings present at exit 0) per [[absence-needs-sibling-probe]].
4. **Cancel a queued CI run that gates nothing** — doyle ratified twice. Killed #73's pre-rebase
   run (validating a parent the rebase discards) and #74's `pull_request` run still in flight
   *after* its own merge. On a serialized single-box runner, a doomed queued run is a stolen
   cycle in front of the critical path. Left the `push:main` backstop alone — that one honestly
   covers merged content.
5. **A stale "execute at the next cut" instruction is a double-ship hazard.** [[v0410-published]]
   carries a "V0.42.0 CHANGELOG SHAPE" block written when the next cut was *expected* to be
   0.42.0 — but the W2 rider shipped as v0.41.1 and already executed that exact shape. Following
   the note literally would have re-published a correction users already have. Verify a banked
   instruction against what actually shipped, not against the version number it names.
6. **The seed tripwire is cleared by RULING, not by habit.** Value-free probe (`:+` only, the
   banned `:-` idiom is what printed the seed at v0.41.0) showed `_CMD` unset and raw
   `SPT_RELEASE_SEED` set — the runbook's FORBIDDEN-on-a-CI-runner form. Stopped and re-read the
   operator ruling banner before publishing: risk ACCEPTED, rotation WITHDRAWN, removal
   downgraded to hygiene-at-convenience and explicitly not to be driven. Published on that
   ruling and drove nothing. See [[secret-env-probe-no-value-expansion]].
7. **Release-body scope checked at the ARTIFACT.** The published notes were re-read off the draft
   for embedded `## [` headings (zero) — the v0.34.0 heading-consumption failure mode is verified
   on what actually ships, not on the source file.

**Zero reruns in the entire cut** — PR gate (30153637562), tag build (30155025578), and publish
each green first roll. twohost-a/b SKIPPED on the release run is CORRECT (opt-in `[twohost]` tag,
zero `.rs` delta; the cross-node rung proved on the wave run 30152020027).

Counter table: 0.42.0=76 @8492c75; prior [[v0411-published]] 75, [[v0410-published]] 74.
Owed after publish (doyle's window, not my lane): update-apply on HFENDULEAM + field-verify with
three consumers — perri live E2E, liam scanner re-verify + workaround retirement, flynn
shell-bounce after liam's shell is stopped. Kin: [[idle-edge-w1-progress]].
