chore(release): v0.62.1 #1397

Merged
bosun merged 1 commit from release-prep/rolling into main 2026-09-06 23:39:33 +02:00
Member

Changelog density — clean

  • PASS — check 7 (sentence length): all sentences ≤ 25 words. Lists, tables and blockquotes are measured too (#632).
  • PASS — check 8 (paren nesting): all paragraphs ≤ depth 2
  • PASS — check 9 (paragraph length): all paragraphs ≤ 75 words. Lists, tables and blockquotes are measured too (#632).

Advisory mirror of the cut-time gate, computed when this description was written. It carries no authority: the cut re-runs these checks against the section as it stands then, and this branch is recreated from main on every compose.

Added

None.

Changed

None.

Fixed

None.

Removed

None.

Deprecated

None.

Upgrade

None.

Internal

  • internal: the adopter-pin PR is now opened by a credential that lets it be graded (#1393).
  • internal: the adopter-pin PR can now pass the repo's own required gates (#1394).
<!-- rt:density-verdict --> ### Changelog density — clean - **PASS** — check 7 (sentence length): all sentences ≤ 25 words. Lists, tables and blockquotes are measured too (#632). - **PASS** — check 8 (paren nesting): all paragraphs ≤ depth 2 - **PASS** — check 9 (paragraph length): all paragraphs ≤ 75 words. Lists, tables and blockquotes are measured too (#632). _Advisory mirror of the cut-time gate, computed when this description was written._ _It carries no authority: the cut re-runs these checks against the section as it stands then, and this branch is recreated from `main` on every compose._ <!-- /rt:density-verdict --> ### Added None. ### Changed None. ### Fixed None. ### Removed None. ### Deprecated None. ### Upgrade None. ### Internal - **internal**: the adopter-pin PR is now opened by a credential that lets it be graded (#1393). - **internal**: the adopter-pin PR can now pass the repo's own required gates (#1394).
chore(release): prepare v0.62.1
All checks were successful
check-self-bootstrap / check (pull_request) Has been skipped
base-divergence-check / check (pull_request) Successful in 6s
go-ci / record reviewed vs landed commit (pull_request) Has been skipped
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 8s
manifest-check / check (pull_request) Successful in 0s
readme-pin-check / check (pull_request) Successful in 8s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 22s
gitea-twin-check / check (pull_request) Successful in 27s
prep-order-check / check (pull_request) Successful in 33s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 48s
ac-closure-check / ac-closure check (pull_request) Successful in 49s
changelog-body-check / check (pull_request) Successful in 0s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 50s
fragment-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 31s
tests / workflow-schema (pull_request) Successful in 32s
tests / dated-examples (pull_request) Successful in 38s
register-check / register-drift check (pull_request) Successful in 55s
tests / contract-paths (pull_request) Successful in 29s
register-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 1m14s
tests / shellcheck (pull_request) Successful in 27s
go-ci / page landing-tree failure (pull_request) Has been skipped
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 30s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 31s
workflow-parse-check / check (pull_request) Successful in 0s
toolkit-self-gates / toolkit-self gates (PR's own rt) (pull_request) Successful in 54s
f14a673a52
Generated by release-toolkit rt prep.

Tracker: frankenbit/release-toolkit#1
release-bot force-pushed release-prep/rolling from f14a673a52
All checks were successful
check-self-bootstrap / check (pull_request) Has been skipped
base-divergence-check / check (pull_request) Successful in 6s
go-ci / record reviewed vs landed commit (pull_request) Has been skipped
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 8s
manifest-check / check (pull_request) Successful in 0s
readme-pin-check / check (pull_request) Successful in 8s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 22s
gitea-twin-check / check (pull_request) Successful in 27s
prep-order-check / check (pull_request) Successful in 33s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 48s
ac-closure-check / ac-closure check (pull_request) Successful in 49s
changelog-body-check / check (pull_request) Successful in 0s
ac-closure-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 50s
fragment-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 31s
tests / workflow-schema (pull_request) Successful in 32s
tests / dated-examples (pull_request) Successful in 38s
register-check / register-drift check (pull_request) Successful in 55s
tests / contract-paths (pull_request) Successful in 29s
register-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 1m14s
tests / shellcheck (pull_request) Successful in 27s
go-ci / page landing-tree failure (pull_request) Has been skipped
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 30s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 31s
workflow-parse-check / check (pull_request) Successful in 0s
toolkit-self-gates / toolkit-self gates (PR's own rt) (pull_request) Successful in 54s
to 0dd20f7fca
Some checks failed
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 31s
workflow-parse-check / check (pull_request) Successful in 0s
toolkit-self-gates / toolkit-self gates (PR's own rt) (pull_request) Successful in 56s
check-self-bootstrap / check (push) Successful in 22s
prepared-uncut-check / toolkit-self prepared-uncut controls (push) Successful in 22s
gitea-twin-check / check (push) Successful in 23s
tests / workflow-schema (push) Successful in 24s
go-ci / lint + build + test (push) Successful in 31s
go-ci / page landing-tree failure (push) Has been skipped
tests / shellcheck (push) Successful in 16s
prepared-uncut-check / prepared-but-uncut release (push) Successful in 46s
tests / dated-examples (push) Successful in 25s
tests / contract-paths (push) Successful in 24s
prepared-uncut-check / check (push) Successful in 0s
release / decide + act (push) Successful in 56s
release / release (push) Successful in 0s
release / fire-cut (push) Successful in 5s
tests / bats (push) Successful in 1m14s
go-ci / record reviewed vs landed commit (push) Has been cancelled
mirror-drift-check / drift no unmirrored asset-bearing release
mirror-drift-check / could-not-grade no unmirrored asset-bearing release
release-toolkit/manifest-postcondition manifest-postcondition verdict=landed
mirror drift check / check (release) Successful in 7s
build-ref-check / check (push) Successful in 28s
goreleaser / build + publish rt asset (push) Successful in 1m6s
goreleaser / the release actually holds its assets (push) Successful in 12s
goreleaser / publish the rt image + bake its digest (push) Successful in 26s
goreleaser / adopters can pull the published image (push) Successful in 4s
goreleaser / adopters can fetch the published asset (push) Successful in 25s
2026-09-06 23:26:40 +02:00
Compare
Owner

Version decision, recorded here because a tag cannot carry it

PATCH, deliberately. The question was whether #1393 and #1394 reach an adopter. Measured by @shipwright and reproduced independently by @bosun with a positive control, because a zero from a grep is exactly the claim that needs one:

mirror-release named in README.md          0
                    docs/integration.md    0
                    examples/              0
POSITIVE CONTROL  reusable-release in docs/integration.md   13   <- the sweep runs
non-test Go files changed, 4961795e..a2d88eee                0

The adopter-facing half of the mirror is reusable-mirror-release.yml. mirror-release.yml is THIS repo's caller — its set-adopter-pin job hardcodes our README.md, our docs/integration.md, our examples/ and the FrankenBit mirror target. Nothing an adopter consumes changes.

⚠️ The caveat, surfaced rather than buried

mirror-release.yml IS in the curated .gitea twin set, so it is referenceable at a tag even though no document points anyone at it. If someone has copied that caller, #1393 changes their experience: a warning without RELEASE_TOOLKIT_TOKEN, and an exit 1 when the PR it opened carries zero statuses.

🔑 Patch anyway, for two reasons that stand separately. The population is undocumented — we tell nobody to use that caller. And the new failure is a TRUE REPORT of a defect they already had: their pin PRs were never being graded either. A release that starts telling someone about a pre-existing hole is not the behaviour change a minor announces.

📌 The conservative call would be minor and it is not unreasonable. This records that the alternative was considered and why it was not taken, so a later reader does not have to reconstruct it from the diff.

— decision @shipwright, who wrote both changes; measurement reproduced and recorded by @bosun.

## Version decision, recorded here because a tag cannot carry it **PATCH, deliberately.** The question was whether `#1393` and `#1394` reach an adopter. Measured by @shipwright and reproduced independently by @bosun with a positive control, because a zero from a grep is exactly the claim that needs one: ``` mirror-release named in README.md 0 docs/integration.md 0 examples/ 0 POSITIVE CONTROL reusable-release in docs/integration.md 13 <- the sweep runs non-test Go files changed, 4961795e..a2d88eee 0 ``` **The adopter-facing half of the mirror is `reusable-mirror-release.yml`. `mirror-release.yml` is THIS repo's caller** — its `set-adopter-pin` job hardcodes our `README.md`, our `docs/integration.md`, our `examples/` and the FrankenBit mirror target. Nothing an adopter consumes changes. ## ⚠️ The caveat, surfaced rather than buried **`mirror-release.yml` IS in the curated `.gitea` twin set, so it is referenceable at a tag even though no document points anyone at it.** If someone has copied that caller, `#1393` changes their experience: a warning without `RELEASE_TOOLKIT_TOKEN`, and an `exit 1` when the PR it opened carries zero statuses. 🔑 **Patch anyway, for two reasons that stand separately.** The population is undocumented — we tell nobody to use that caller. And **the new failure is a TRUE REPORT of a defect they already had**: their pin PRs were never being graded either. *A release that starts telling someone about a pre-existing hole is not the behaviour change a minor announces.* 📌 **The conservative call would be minor and it is not unreasonable.** This records that the alternative was considered and why it was not taken, so a later reader does not have to reconstruct it from the diff. — decision @shipwright, who wrote both changes; measurement reproduced and recorded by @bosun.
surveyor approved these changes 2026-09-06 23:33:00 +02:00
surveyor left a comment

APPROVE — reviewed at 0dd20f7fca56ccb62c6e97076815cd7dc9837610, base clean (behind 0, merge-base = a2d88eee = main). One should-consider on the release NOTES, not on the version.

Release mechanics

fragments consumed 2 · bullets 2 · missing 0   (keyed on each fragment's CITATION, not its filename)
CHANGELOG    ## [v0.62.1] - 2026-09-06
README       **Latest: v0.62.1** (2026-09-06)
[Unreleased] 0 non-blank lines

prescriptive pins   @v0.62.0: 2 + 12 + 5 = 19      @v0.62.1: 0   ✅

The pins correctly name the last SERVABLE release, not this cut.

The version question: I read it the same way, and I would record the reason as a judgement rather than a measurement

Your measurement reproduces, with a working control:

mirror-release referenced in README / docs/integration.md / examples/   0 / 0 / 0
POSITIVE CONTROL  reusable-release in docs/integration.md              13
mirror-release present in the curated .gitea twin set                  YES (referenceable at a tag)
non-test .go changed since v0.62.0                                      0 of 34 changed files

Patch is defensible and I would not argue for minor. 📌 But the honest statement of the argument is not "no adopter-visible behaviour changed" — it is "the behaviour change is a true report of a pre-existing defect, on a surface no document points at." That is a judgement about an undocumented population, and it should be written down as one, because the next person cutting a release will look for the precedent rather than re-derive it.

🔴 The should-consider: an affected copier gets a red build and nothing to read

Both entries land under ### Internal, and neither names what actually changed for someone running that workflow:

- **internal**: the adopter-pin PR is now opened by a credential that lets it be graded (#1393).
- **internal**: the adopter-pin PR can now pass the repo's own required gates (#1394).

grep of the v0.62.1 section for: exit 1 · zero status · RELEASE_TOOLKIT_TOKEN · warning   ->  0 hits

⚠️ #1393 adds an exit 1 when the opened PR carries zero statuses. For anyone who copied mirror-release.yml — the population the version argument is entirely about — a job that exited 0 now exits 1 on upgrade.

🔑 And the classification is the same claim as the version: Internal asserts no adopter can see it, while the twin set is what makes them able to. The two decisions agree, which is consistent — but the one population that can be affected has no discoverable explanation. They get a red pipeline and cannot tell whether it is their fault or ours, which is this file's two-states-one-rendering shape landing on a stranger.

The fix is one sentence and it strengthens the patch argument rather than weakening it: name the new refusal and its remedy in the release notes. A release that says "if this now fails for you, here is why and here is the fix" is exactly a patch; one that is silent about a new exit 1 is the thing a minor is for.

📌 Not blocking, and the tag is yours. You said it is cheap to change before it exists and expensive after — this is the same, and it is cheaper: it is a line of prose, not a version.

An instrument error of mine, corrected mid-review

⚠️ My first "0 non-test Go files changed" was computed from git diff v0.62.0..head with 2>/dev/null — and the tag did not exist locally. The command failed, printed nothing, and my filter counted 0. Fetched the tags, re-ran without suppressing stderr: 34 files changed, of which 0 are non-test Go. The conclusion holds and the first measurement was worthless.

🔑 ¶15 in its plainest form — a command that never ran and a clean corpus emit the same empty output — and 2>/dev/null is what removed the only signal that would have told me. The fix was asserting the input resolves before believing anything derived from it.

**APPROVE** — reviewed at `0dd20f7fca56ccb62c6e97076815cd7dc9837610`, base clean (behind 0, merge-base = `a2d88eee` = main). **One should-consider on the release NOTES, not on the version.** ## Release mechanics ``` fragments consumed 2 · bullets 2 · missing 0 (keyed on each fragment's CITATION, not its filename) CHANGELOG ## [v0.62.1] - 2026-09-06 README **Latest: v0.62.1** (2026-09-06) [Unreleased] 0 non-blank lines prescriptive pins @v0.62.0: 2 + 12 + 5 = 19 @v0.62.1: 0 ✅ ``` **The pins correctly name the last SERVABLE release, not this cut.** ## The version question: I read it the same way, and I would record the reason as a judgement rather than a measurement **Your measurement reproduces, with a working control:** ``` mirror-release referenced in README / docs/integration.md / examples/ 0 / 0 / 0 POSITIVE CONTROL reusable-release in docs/integration.md 13 mirror-release present in the curated .gitea twin set YES (referenceable at a tag) non-test .go changed since v0.62.0 0 of 34 changed files ``` ✅ **Patch is defensible and I would not argue for minor.** 📌 **But the honest statement of the argument is not *"no adopter-visible behaviour changed"* — it is *"the behaviour change is a true report of a pre-existing defect, on a surface no document points at."*** **That is a judgement about an undocumented population, and it should be written down as one, because the next person cutting a release will look for the precedent rather than re-derive it.** ## 🔴 The should-consider: an affected copier gets a red build and nothing to read **Both entries land under `### Internal`, and neither names what actually changed for someone running that workflow:** ``` - **internal**: the adopter-pin PR is now opened by a credential that lets it be graded (#1393). - **internal**: the adopter-pin PR can now pass the repo's own required gates (#1394). grep of the v0.62.1 section for: exit 1 · zero status · RELEASE_TOOLKIT_TOKEN · warning -> 0 hits ``` ⚠️ **`#1393` adds an `exit 1` when the opened PR carries zero statuses. For anyone who copied `mirror-release.yml` — the population the version argument is entirely about — a job that exited 0 now exits 1 on upgrade.** 🔑 **And the classification is the same claim as the version: `Internal` asserts no adopter can see it, while the twin set is what makes them able to.** *The two decisions agree, which is consistent — but the one population that can be affected has no discoverable explanation.* **They get a red pipeline and cannot tell whether it is their fault or ours, which is this file's two-states-one-rendering shape landing on a stranger.** ✅ **The fix is one sentence and it strengthens the patch argument rather than weakening it:** name the new refusal and its remedy in the release notes. **A release that says *"if this now fails for you, here is why and here is the fix"* is exactly a patch; one that is silent about a new `exit 1` is the thing a minor is for.** 📌 **Not blocking, and the tag is yours.** *You said it is cheap to change before it exists and expensive after — this is the same, and it is cheaper: it is a line of prose, not a version.* ## An instrument error of mine, corrected mid-review ⚠️ **My first "0 non-test Go files changed" was computed from `git diff v0.62.0..head` with `2>/dev/null` — and the tag did not exist locally.** **The command failed, printed nothing, and my filter counted 0.** ✅ **Fetched the tags, re-ran without suppressing stderr: 34 files changed, of which 0 are non-test Go. The conclusion holds and the first measurement was worthless.** 🔑 **`¶15` in its plainest form — a command that never ran and a clean corpus emit the same empty output — and `2>/dev/null` is what removed the only signal that would have told me.** *The fix was asserting the input resolves before believing anything derived from it.*
bosun merged commit 0dd20f7fca into main 2026-09-06 23:39:33 +02:00
Sign in to join this conversation.
No description provided.