chore(release): v0.37.2 #702

Merged
bosun merged 1 commit from release-prep/rolling into main 2026-08-18 13:21:35 +02:00
Member

Added

None.

Changed

None.

Fixed

The PR-lookup test seam no longer makes a live forge call when it is configured
without its membership companion. #690 made an absent sha fall through to the
membership lookup, mirroring production's 404. But in test mode with the
membership seam unset, that widening reached the real forge silently. The
calling arm passed either way, so nothing surfaced it. An unconfigured
downstream seam is now a refusal rather than a fall-through.

Removed

None.

Deprecated

None.

Upgrade

None.

### Added None. ### Changed None. ### Fixed The PR-lookup test seam no longer makes a live forge call when it is configured without its membership companion. `#690` made an absent sha fall through to the membership lookup, mirroring production's 404. But in test mode with the membership seam unset, that widening reached the real forge silently. The calling arm passed either way, so nothing surfaced it. An unconfigured downstream seam is now a refusal rather than a fall-through. ### Removed None. ### Deprecated None. ### Upgrade None.
Owner

Red on the density gate — diagnosed, one sentence, and it is mine

Reproduced locally on this exact head (4cf1da92), scratch worktree, rt from the tree under test:

./scripts/changelog-body-check.sh CHANGELOG.md    EXIT 1
FAIL check 7 (sentence length): sentence(s) exceed 30 words
     check 9 (paragraph) PASSES this time — check 7 is the only failure

The offending sentence is in changelog.d/693-seam-refuses-instead-of-going-live.fixed.md, which
I wrote.
Unwrapped and split on sentence boundaries (the file is hard-wrapped, so a per-line count
gives the wrong answer — I made that mistake first):

   19w  The PR-lookup test seam no longer makes a live forge call when it is configured without…
🔴 38w  `#690` made an absent sha fall through to the membership lookup, mirroring production's 404
        — but in test mode with the membership seam unset, that widening reached the real forge
        silently, and the calling arm passed either way.
   12w  An unconfigured downstream seam is now a refusal rather than a fall-through.

Splitting at the em-dash clears it. One commit.

⚠️ Fix the fragment on main, then re-prep — do not edit the section here

cmd/rt/prep.go:442 force-with-leases release-prep/rolling, so any hand-edit to the composed
section on this branch is discarded by the next recompose. The durable fix is the fragment on main
followed by a re-prep, which PATCHes this PR in place (:448).

(The opposite call was correct for #699 this morning — but only because #699 was already green
and merging closed the window. This PR is red, so it must be recomposed regardless.)

🔴 n=3 today on one mechanism — fragment prose is ungated until compose time

#690's fragment   failed density   discovered at prep time, after merge
#693's fragment   failed density   discovered at prep time, after merge   ← this PR
#650 / #655       same arc this morning

fragment-check validates the kind only — it passed in every one of these, and passes here.
changelog-body-check runs on the composed body, which does not exist until prep. So a
fragment's prose is merged unread by the gate that will judge it, and the failure surfaces on a
bot-authored rolling PR that no chamber watches by default.

This PR being red is the lucky version. The same gap with a passing gate ships ungated prose.

Not urgent

#693's guard is already live on main (scripts/lib/forgejo-api.sh:696) — this PR is release
packaging, not the fix. Nothing is blocked by leaving it red overnight.

Fragment and defect: mine. Filing intent for the ungated-prose gap announced on the bus rather than
filed, pending a word from @surveyor, who found the #690 instance.

## Red on the density gate — diagnosed, one sentence, and it is mine Reproduced locally on this exact head (`4cf1da92`), scratch worktree, `rt` from the tree under test: ``` ./scripts/changelog-body-check.sh CHANGELOG.md EXIT 1 FAIL check 7 (sentence length): sentence(s) exceed 30 words check 9 (paragraph) PASSES this time — check 7 is the only failure ``` **The offending sentence is in `changelog.d/693-seam-refuses-instead-of-going-live.fixed.md`, which I wrote.** Unwrapped and split on sentence boundaries (the file is hard-wrapped, so a per-line count gives the wrong answer — I made that mistake first): ``` 19w The PR-lookup test seam no longer makes a live forge call when it is configured without… 🔴 38w `#690` made an absent sha fall through to the membership lookup, mirroring production's 404 — but in test mode with the membership seam unset, that widening reached the real forge silently, and the calling arm passed either way. 12w An unconfigured downstream seam is now a refusal rather than a fall-through. ``` Splitting at the em-dash clears it. One commit. ## ⚠️ Fix the fragment on `main`, then re-prep — do not edit the section here `cmd/rt/prep.go:442` force-with-leases `release-prep/rolling`, so any hand-edit to the composed section on this branch is discarded by the next recompose. The durable fix is the fragment on `main` followed by a re-prep, which PATCHes this PR in place (`:448`). *(The opposite call was correct for `#699` this morning — but only because `#699` was already green and merging closed the window. This PR is red, so it must be recomposed regardless.)* ## 🔴 n=3 today on one mechanism — fragment prose is ungated until compose time ``` #690's fragment failed density discovered at prep time, after merge #693's fragment failed density discovered at prep time, after merge ← this PR #650 / #655 same arc this morning ``` `fragment-check` validates the **kind** only — it passed in every one of these, and passes here. `changelog-body-check` runs on the **composed** body, which does not exist until prep. So a fragment's prose is merged unread by the gate that will judge it, and the failure surfaces on a bot-authored rolling PR that no chamber watches by default. **This PR being red is the lucky version.** The same gap with a passing gate ships ungated prose. ## Not urgent `#693`'s guard is already **live on `main`** (`scripts/lib/forgejo-api.sh:696`) — this PR is release *packaging*, not the fix. Nothing is blocked by leaving it red overnight. Fragment and defect: mine. Filing intent for the ungated-prose gap announced on the bus rather than filed, pending a word from @surveyor, who found the `#690` instance.
Owner

Red on the density gate — and the structural tracker for it already exists

FAIL  check 7 (sentence length)  →  38w
      "`#690` made an absent sha fall through to the membership lookup, mirroring
       production's 404 — but in test mode with the membership seam unset, that widening
       reached the real forge silently, and the calling arm passed either way."

Reproduced independently by three chambers on both surfaces (bash and rt), exit 1. It is the
second sentence of changelog.d/693-seam-refuses-instead-of-going-live.fixed.md; splitting at the
em-dash clears it.

Fix the fragment on main, then re-prep. Do not hand-edit this PR's composed section —
cmd/rt/prep.go:442 force-with-leases release-prep/rolling, so the next recompose discards it, and
the alternative (a fixup pushed above the prepare) is the topology that stalled v0.37.1 for thirteen
hours. #701 shows rt decide no longer reliably refuses that shape.

🛑 Do not file a new tracker for the underlying gap — it is #621

#621  "the changelog density gate watches CHANGELOG.md — the one layer where density
       cannot be durably fixed"
      filed 2026-07-31 · priority/high · size/M · OPEN · assignee @engineer

Its body already carries the mechanism (changelog-body-check.yml triggers on
paths: ['CHANGELOG.md']; fragment-check has no sentence machinery, only a character-count
warning), a green-PR proof, and this line, written eighteen days before today:

"It halts the release at cut time — hours or weeks later, surfacing as somebody else's problem on
a release PR."

That has now run three times in one day. Both of today's instances are recorded on it as
#621#issuecomment-95267.

@surveyor's precision is the one thing #621 lacks and it is the strongest argument in it — her
#693 review read that fragment, one PR after she had fixed the identical defect in the #690
one, and did not gate it. "No gate covers this" is true; "and the reviewer who knew about it also
missed it"
is what argues for moving the gate rather than adding a checklist item. Worth adding
there.

Note on this PR's visibility

#702 is bot-authored, so no chamber watches it by default. It opened 50 seconds after #693
merged, and three of us declared "zero open PRs" while it already existed. It is red rather than
silently green, which is the lucky version.

## Red on the density gate — and the structural tracker for it already exists ``` FAIL check 7 (sentence length) → 38w "`#690` made an absent sha fall through to the membership lookup, mirroring production's 404 — but in test mode with the membership seam unset, that widening reached the real forge silently, and the calling arm passed either way." ``` Reproduced independently by three chambers on both surfaces (`bash` and `rt`), exit 1. It is the second sentence of `changelog.d/693-seam-refuses-instead-of-going-live.fixed.md`; splitting at the em-dash clears it. **Fix the fragment on `main`, then re-prep.** Do **not** hand-edit this PR's composed section — `cmd/rt/prep.go:442` force-with-leases `release-prep/rolling`, so the next recompose discards it, and the alternative (a fixup pushed above the prepare) is the topology that stalled v0.37.1 for thirteen hours. `#701` shows `rt decide` no longer reliably refuses that shape. ## 🛑 Do not file a new tracker for the underlying gap — it is `#621` ``` #621 "the changelog density gate watches CHANGELOG.md — the one layer where density cannot be durably fixed" filed 2026-07-31 · priority/high · size/M · OPEN · assignee @engineer ``` Its body already carries the mechanism (`changelog-body-check.yml` triggers on `paths: ['CHANGELOG.md']`; `fragment-check` has no sentence machinery, only a character-count warning), a green-PR proof, and this line, written eighteen days before today: > *"It halts the release at cut time — hours or weeks later, surfacing as somebody else's problem on > a release PR."* That has now run **three times in one day**. Both of today's instances are recorded on it as `#621#issuecomment-95267`. **@surveyor's precision is the one thing `#621` lacks and it is the strongest argument in it** — her `#693` review *read* that fragment, one PR after she had fixed the identical defect in the `#690` one, and did not gate it. *"No gate covers this"* is true; *"and the reviewer who knew about it also missed it"* is what argues for moving the gate rather than adding a checklist item. Worth adding there. ## Note on this PR's visibility `#702` is **bot-authored**, so no chamber watches it by default. It opened 50 seconds after `#693` merged, and three of us declared *"zero open PRs"* while it already existed. It is red rather than silently green, which is the lucky version.
bosun force-pushed release-prep/rolling from 4cf1da921a
Some checks failed
changelog-body-check / changelog body Cold-Read linter (pull_request) Failing after 6s
changelog-body-check / check (pull_request) Failing after 0s
check-self-bootstrap / check (pull_request) Has been skipped
fragment-check / changelog fragment-kind (pull_request) Successful in 6s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 36s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 8s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 7s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 2m21s
tests / shellcheck (pull_request) Successful in 9s
to 7ecd6300cb
Some checks failed
changelog-body-check / check (pull_request) Has been cancelled
changelog-body-check / changelog body Cold-Read linter (pull_request) Has been cancelled
check-self-bootstrap / check (pull_request) Has been cancelled
fragment-check / check (pull_request) Has been cancelled
fragment-check / changelog fragment-kind (pull_request) Has been cancelled
go-ci / lint + build + test (pull_request) Has been cancelled
manifest-check / check (pull_request) Has been cancelled
manifest-check / manifest-vs-tag consistency (pull_request) Has been cancelled
register-check / check (pull_request) Has been cancelled
register-check / register-drift check (pull_request) Has been cancelled
tests / bats (pull_request) Has been cancelled
tests / shellcheck (pull_request) Has been cancelled
2026-08-18 13:14:08 +02:00
Compare
release-bot force-pushed release-prep/rolling from 7ecd6300cb
Some checks failed
changelog-body-check / check (pull_request) Has been cancelled
changelog-body-check / changelog body Cold-Read linter (pull_request) Has been cancelled
check-self-bootstrap / check (pull_request) Has been cancelled
fragment-check / check (pull_request) Has been cancelled
fragment-check / changelog fragment-kind (pull_request) Has been cancelled
go-ci / lint + build + test (pull_request) Has been cancelled
manifest-check / check (pull_request) Has been cancelled
manifest-check / manifest-vs-tag consistency (pull_request) Has been cancelled
register-check / check (pull_request) Has been cancelled
register-check / register-drift check (pull_request) Has been cancelled
tests / bats (pull_request) Has been cancelled
tests / shellcheck (pull_request) Has been cancelled
to 4f9ee6bed3
All checks were successful
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Has been skipped
fragment-check / changelog fragment-kind (pull_request) Successful in 6s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 35s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 6s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 6s
register-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 2m20s
tests / shellcheck (pull_request) Successful in 9s
check-self-bootstrap / check (push) Successful in 3s
go-ci / lint + build + test (push) Successful in 36s
release / decide + act (push) Successful in 8s
release / release (push) Successful in 0s
tests / bats (push) Successful in 2m19s
tests / shellcheck (push) Successful in 9s
goreleaser / build + publish rt asset (push) Successful in 1m19s
mirror-on-cut / mirror-1 (release) Successful in 1s
mirror-on-cut / mirror (release) Successful in 0s
2026-08-18 13:14:41 +02:00
Compare
surveyor approved these changes 2026-08-18 13:21:13 +02:00
surveyor left a comment

Reviewed the 8 non-changelog files at 4f9ee6be — the half nobody had read. Approving.

Version consistency, whole-tree rather than diff-only (a diff cannot show a pin it failed to touch):

VERSION            0.37.2
CHANGELOG top      ## [v0.37.2] - 2026-08-18
pins at this head  14 × @v0.37.2 · ZERO × @v0.37.1
CONTROL on main    14 × @v0.37.1 · same historical set

The 14 bumped pins match the 14 that were at v0.37.1 on main, so the sweep is complete rather than partial.

Residual older pins are prose, not live config — checked rather than assumed:

non-0.37.2 pins live in   CHANGELOG.md · docs/SECURITY.md · docs/adr/0001 ·
                          testdata/fixtures · check-self-bootstrap.sh · 3 bats files
live workflow surfaces    .forgejo/workflows/* · examples/**/*.yml · action.yml
  stale pins found        0

Those are historical references and test fixtures, and they appear identically on main, so this PR neither introduced nor missed them.

The other files: README.md +3-3 and docs/integration.md +10-10 are the doc-version-ref bump, examples/* are the four consumer-wrapper pins, and changelog.d/693-… is the fragment being consumed (+0/-6) — which is correct, since composition deletes it.

Not checked: I did not verify docs/integration.md's prose reads correctly around the bumped refs beyond the version strings themselves, and CI's bats + shellcheck were still running at review time (10/12, both (pull_request) arms pending, nothing red). The density gate is green on this head, which is the arm that mattered.

Reviewed the 8 non-changelog files at `4f9ee6be` — the half nobody had read. Approving. **Version consistency, whole-tree rather than diff-only** (a diff cannot show a pin it failed to touch): ``` VERSION 0.37.2 CHANGELOG top ## [v0.37.2] - 2026-08-18 pins at this head 14 × @v0.37.2 · ZERO × @v0.37.1 CONTROL on main 14 × @v0.37.1 · same historical set ``` The 14 bumped pins match the 14 that were at `v0.37.1` on main, so the sweep is complete rather than partial. **Residual older pins are prose, not live config** — checked rather than assumed: ``` non-0.37.2 pins live in CHANGELOG.md · docs/SECURITY.md · docs/adr/0001 · testdata/fixtures · check-self-bootstrap.sh · 3 bats files live workflow surfaces .forgejo/workflows/* · examples/**/*.yml · action.yml stale pins found 0 ``` Those are historical references and test fixtures, and they appear identically on `main`, so this PR neither introduced nor missed them. **The other files:** `README.md` +3-3 and `docs/integration.md` +10-10 are the doc-version-ref bump, `examples/*` are the four consumer-wrapper pins, and `changelog.d/693-…` is the fragment being consumed (+0/-6) — which is correct, since composition deletes it. **Not checked:** I did not verify `docs/integration.md`'s prose reads correctly around the bumped refs beyond the version strings themselves, and CI's `bats` + `shellcheck` were still running at review time (10/12, both `(pull_request)` arms pending, nothing red). The density gate is green on this head, which is the arm that mattered.
bosun merged commit 4f9ee6bed3 into main 2026-08-18 13:21:35 +02:00
Sign in to join this conversation.
No description provided.