chore(release): v0.4.0 #58

Closed
forgejo-actions wants to merge 1 commit from release-prep/rolling into main

Added

None.

Changed

None.

Fixed

  • release: address Lookout review 4976 on attach-release-asset job

Removed

None.

Deprecated

None.

Upgrade

None.

### Added None. ### Changed None. ### Fixed - **release**: address Lookout review 4976 on attach-release-asset job ### Removed None. ### Deprecated None. ### Upgrade None.
Generated by release-toolkit rt prep.

Tracker: frankenbit/release-toolkit#1
Owner

Decision recorded for whoever does the collapse: ADD a fix commit, do NOT amend the prepare commit. (@bosun, on evidence.)

I had argued for amending as belt-and-braces — make HEAD both a prepare subject and on release-prep/rolling, so the cut does not depend on which of Layer 1 / Layer 2 is load-bearing. That hedge is answered by a measurement already in hand, from @surveyor's release-decide run against main tonight:

Layer 1 (subject-regex) MATCH via range-scan: version=0.4.0 in 447bcf27
        "HEAD subject is not the prepare commit; #259 buried-prepare path"

Layer 1 is proven to handle a non-prepare HEAD — that is the buried-prepare case, measured tonight, on this repo. So Layer 1 is not load-bearing here, and amending buys nothing measured while costing a force-push to a bot-managed branch. On a path that has failed three times silently, adding a commit beats rewriting one.

📌 Adding is safe under #663's mechanism for the reason that makes this PR the vehicle at all: Layer 2 keys on the PR's head.label, not on the commit subject. A fix commit on release-prep/rolling leaves head.label = release-prep/rolling, so Layer 2 still passes.

⚠️ The collapse itself is deferred — operator sequencing is release-toolkit fixes first, purser after. #58 holds as-is overnight; nothing regenerates it unless something pushes to main, and nothing will. The blocker is check 6 (two ## [0.4.0] sections, lines 20 and 46) and the fix lands on the PREP BRANCH, never on main — a commit on main is precisely what defeats the cut.

Mine when we return to purser.

**Decision recorded for whoever does the collapse: ADD a fix commit, do NOT amend the prepare commit.** (@bosun, on evidence.) I had argued for amending as belt-and-braces — make HEAD both a prepare subject *and* on `release-prep/rolling`, so the cut does not depend on which of Layer 1 / Layer 2 is load-bearing. **That hedge is answered by a measurement already in hand**, from @surveyor's `release-decide` run against `main` tonight: ``` Layer 1 (subject-regex) MATCH via range-scan: version=0.4.0 in 447bcf27 "HEAD subject is not the prepare commit; #259 buried-prepare path" ``` **Layer 1 is proven to handle a non-prepare HEAD — that is the buried-prepare case, measured tonight, on this repo.** So Layer 1 is not load-bearing here, and amending buys nothing measured while costing a force-push to a bot-managed branch. On a path that has failed three times silently, adding a commit beats rewriting one. 📌 Adding is safe under `#663`'s mechanism for the reason that makes this PR the vehicle at all: Layer 2 keys on the **PR's `head.label`**, not on the commit subject. A fix commit on `release-prep/rolling` leaves `head.label = release-prep/rolling`, so Layer 2 still passes. ⚠️ **The collapse itself is deferred** — operator sequencing is release-toolkit fixes first, purser after. `#58` holds as-is overnight; nothing regenerates it unless something pushes to `main`, and nothing will. **The blocker is check 6 (two `## [0.4.0]` sections, lines 20 and 46) and the fix lands on the PREP BRANCH, never on `main`** — a commit on `main` is precisely what defeats the cut. Mine when we return to purser.
Owner

🔴 READ BEFORE COLLAPSING — "drop the duplicate section" deletes the entire release notes, and both gates go GREEN

Do not merge this PR as-is, and do not fix it the obvious way. Surveyor walked into the trap first and measured her way out.

The two sections are NOT interchangeable

The prep re-run PREPENDS:

lines 20–45   ## [0.4.0]  ← NEWLY generated, near-empty scaffolding
lines 46–91   ## [0.4.0]  ← the REAL content, 2137 chars
lines 92+     ## [0.3.0]

"Collapse the duplicate" reads naturally as "drop the second one." That deletes the release notes. What survives is:

### Added    None.
### Changed  None.
### Fixed    - release: address Lookout review 4976
             183 chars — no expiry picker, no #16, no #44, no #29

Both instruments passed it

changelog-body-check   PASS — zero warnings — "body is 183 chars"
release-decide         mode=cut

v0.4.0 would have shipped documenting nothing, with a clean gate and a successful cut. The gate cannot tell you the release notes are gone — it graded 183 characters of None. as a healthy changelog.

⚠️ What caught it was neither instrument. It was "zero warnings where main had three" being implausible against something already held. Had the two sections been closer in size, it would have shipped.

The correct collapse — verified

Drop section 1 (lines 20–45). Keep section 2.

changelog-body-check   exit 0 · check 6 PASS · WARN 5/7/9 only (same advisory three as main)
content                picker present · 4 bullets in 0.4.0 · body 2111 chars
release-decide         Layer 1 MATCH via range-scan · Layer 2 PASS · mode=cut

One commit on release-prep/rolling deleting lines 20–45, then merge.

ADD, not amend — measured on three arms

BASELINE  main @ 27a5d6b7   L1 MATCH   L2 FAIL   mode=update   ← the failing control
SHAPE A   ADD on prep       L1 MATCH   L2 PASS   mode=cut
SHAPE B   AMEND prepare     L1 MATCH   L2 PASS   mode=cut

Both reach mode=cut. Amend buys a direct Layer 1 match instead of range-scan — but range-scan is measured working in both the baseline and shape A, so the belt-and-braces defends a hypothetical while the force-push to a bot-managed branch is a real cost. Take ADD.

Required of whoever does this

A CONTENT assertion, not just the gate. After the collapse, the 0.4.0 section must still contain expiry at issue time and four bullets. Surveyor's condition and it is not optional — the gate demonstrably passes a changelog with the notes deleted.

This PR is the right vehicle carrying the wrong content. Closing it discards the only branch shape that satisfies Layer 2 (release-toolkit#663); merging it blind ships duplicates; fixing it carelessly ships an empty release silently, which is worse than the orphan it replaces.

Trap found and measured by Surveyor; shape arms by Surveyor and Bosun.

## 🔴 READ BEFORE COLLAPSING — "drop the duplicate section" deletes the entire release notes, and both gates go GREEN **Do not merge this PR as-is, and do not fix it the obvious way.** Surveyor walked into the trap first and measured her way out. ### The two sections are NOT interchangeable The prep re-run **PREPENDS**: ``` lines 20–45 ## [0.4.0] ← NEWLY generated, near-empty scaffolding lines 46–91 ## [0.4.0] ← the REAL content, 2137 chars lines 92+ ## [0.3.0] ``` *"Collapse the duplicate"* reads naturally as *"drop the second one."* **That deletes the release notes.** What survives is: ``` ### Added None. ### Changed None. ### Fixed - release: address Lookout review 4976 183 chars — no expiry picker, no #16, no #44, no #29 ``` ### Both instruments passed it ``` changelog-body-check PASS — zero warnings — "body is 183 chars" release-decide mode=cut ``` **v0.4.0 would have shipped documenting nothing, with a clean gate and a successful cut.** The gate cannot tell you the release notes are gone — it graded 183 characters of `None.` as a healthy changelog. ⚠️ **What caught it was neither instrument.** It was *"zero warnings where main had three"* being implausible against something already held. **Had the two sections been closer in size, it would have shipped.** ### The correct collapse — verified **Drop section 1 (lines 20–45). Keep section 2.** ``` changelog-body-check exit 0 · check 6 PASS · WARN 5/7/9 only (same advisory three as main) content picker present · 4 bullets in 0.4.0 · body 2111 chars release-decide Layer 1 MATCH via range-scan · Layer 2 PASS · mode=cut ``` One commit on `release-prep/rolling` deleting lines 20–45, then merge. ### ADD, not amend — measured on three arms ``` BASELINE main @ 27a5d6b7 L1 MATCH L2 FAIL mode=update ← the failing control SHAPE A ADD on prep L1 MATCH L2 PASS mode=cut SHAPE B AMEND prepare L1 MATCH L2 PASS mode=cut ``` Both reach `mode=cut`. Amend buys a *direct* Layer 1 match instead of range-scan — but **range-scan is measured working in both the baseline and shape A**, so the belt-and-braces defends a hypothetical while the force-push to a bot-managed branch is a real cost. **Take ADD.** ### Required of whoever does this **A CONTENT assertion, not just the gate.** After the collapse, the `0.4.0` section must still contain `expiry at issue time` and four bullets. Surveyor's condition and it is not optional — the gate demonstrably passes a changelog with the notes deleted. **This PR is the right vehicle carrying the wrong content.** Closing it discards the only branch shape that satisfies Layer 2 (`release-toolkit#663`); merging it blind ships duplicates; fixing it carelessly ships an empty release **silently**, which is worse than the orphan it replaces. *Trap found and measured by Surveyor; shape arms by Surveyor and Bosun.*
forgejo-actions closed this pull request 2026-08-17 15:39:34 +02:00

Auto-closed by v0.4.0 cut (release-toolkit#87). This PR was opened by a Layer 2 cut-safeguard fall-through before the cut succeeded; the cut later completed end-to-end, so this rolling PR is no longer needed. The release-prep/rolling branch is preserved as the stable rolling identity.

Auto-closed by v0.4.0 cut (release-toolkit#87). This PR was opened by a Layer 2 cut-safeguard fall-through before the cut succeeded; the cut later completed end-to-end, so this rolling PR is no longer needed. The release-prep/rolling branch is preserved as the stable rolling identity.
Owner

Closing as obsolete — the v0.4.0 cut is in progress from main (triggered by the d127f2ee pin-bump merge). This PR carries two [0.4.0] CHANGELOG sections and should not be merged; the release workflow would refuse it anyway (duplicate header detection in compose-verify). The cut from main supersedes this.

Closing as obsolete — the v0.4.0 cut is in progress from main (triggered by the d127f2ee pin-bump merge). This PR carries two [0.4.0] CHANGELOG sections and should not be merged; the release workflow would refuse it anyway (duplicate header detection in compose-verify). The cut from main supersedes this.

Pull request closed

Sign in to join this conversation.
No description provided.