chore(release): v0.20.0 #264
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
5 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!264
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release-prep/rolling"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
v0.20.0 — 2026-07-02
First-cut reliability hardening. Every issue that surfaced on the first external toolkit-driven cut (tmux-tell) is now fixed at the substrate. Upgrade is a pin bump — fragment-check wiring is opt-in, everything else is transparent.
Added
Push-whitelist pre-flight on path-α cuts.
draft-release.shnow probes the consumer's default-branch protection before doing any work. Fails fast + names the missing identity ifrelease-botisn't onpush_whitelist_usernames, instead of the late mid-cutNot allowed to push to protected branchrejection that leaves the manifest desynced. Only fails on a definitive misconfig; warns-and-proceeds otherwise.docs/integration.mdnames it as a path-α precondition.reusable-changelog-fragment-check.yml+scripts/fragment-check.sh. Consumers wire it into theirpull_requestworkflow to fail-loud on unknown-kind fragments (e.g..documentation.md) before merge, instead of at the next cut. See docs/integration.md § fragment-check.yml for the consumer stanza. Closes #271.Changed
docs/operations.mdgained an annualrelease-botPAT rotation-cadence section. No action required on existing installs; consult before regenerating theRELEASE_TOOLKIT_TOKENActions secret. Closes #273.Fixed
External cuts no longer halt on the post-cut bake-reset step. The reusable's bake-reset blocks now guard
git commitwithgit diff --cached --quiet, so the empty-staging case (every external consumer — the bake-reset is toolkit-self-only by design) cleanly skips the commit + push instead of failing "nothing to commit" and cascading into the manifest never landing. This unblocks every external toolkit-driven cut. Toolkit-self behavior unchanged.forgejo_find_pr_by_headno longer mutates a random open PR. Forgejo'shead=query filter is empirically ignored, so.[0].numberwas picking whichever PR the API sorted first — releasing PATCHes onto a random open feature PR instead of the actual rolling PR. Now filters response client-side by exacthead.label/head.refmatch. No consumer-side change required. Closes #274.Rolling-PR prepare-commit push now authenticates with the path-α PAT. Previously it reused the
actions/checkoutsystem token, which Forgejo Actions' anti-recursion safeguard suppresses — so no CI ran on the rolling PR and its required checks could never satisfy. The push now injectsFORGEJO_TOKEN(theRELEASE_TOOLKIT_TOKENPAT) as an HTTPAuthorizationheader, mirroring the manifest push. Necessary but not sufficient — the consumer must still setRELEASE_TOOLKIT_TOKENto a real-user PAT (the documented path-α setup).release-decidedetects thechore(release): prepare vX.Y.Zcommit anywhere in the merged range, not only at HEAD. Previously, any commit landing on top of the prepare commit (a rebase nudge, a CHANGELOG dedupe) shifted HEAD off the prepare subject and the cut was silently skipped — the manifest stayed at the old version, no tag/release, stale rolling PR against the old baseline. The range scan is a full git-log walk. Existing Layer 2/3 safeguards still gate — a stale prepare commit in range falls through tomode=updateloudly. Squash-merge of the rolling PR is not yet covered; tracked as #259.Fragment vs conventional-commit duplicate suppressed at generation layer. When a fragment and a CC subject reference the same issue number,
release-prep.shnow suppresses the CC-subject bullet in favour of the fragment prose (richer wins). A[changelog-dedup]line is logged to stderr for auditability. Closes #258.release-prep.shPR body assembly now re-normalizes throughchangelog_merge_sectionsso any surviving duplicate### Kindheadings collapse to one section per kind. Belt-and-suspenders on top of the merge already done inchangelog_transition. Closes #272.Removed / Deprecated
None.
Upgrade
Pin your consumer wrapper's
uses:@<ref>tov0.20.0. Fragment-check wiring is opt-in (add.forgejo/workflows/fragment-check.ymlper docs/integration.md if you want the pre-merge gate). Everything else is transparent.9e317b2c76cf1c45c2a9chore(release): v0.19.1to chore(release): v0.20.0cf1c45c2a9to95a0efef9395a0efef93toe9e8349bc1e9e8349bc1to21aa688cb221aa688cb2to4b575d71964b575d7196to3c0547fa223c0547fa22tob98d01a61eb98d01a61eto3d15a7e311Cold-Read: release-toolkit v0.20.0 Changelog
Applied the Cold-Read prompt to the PR body verbatim. Perspective: contributor on v0.19.0, considering whether to upgrade, reading only this text.
1. 30-second skim
Confident on theme, not on headline. Six of nine entries are fixes, and most of them share a root cause: things that broke on the first toolkit-driven tmux-tell cut. The release is clearly "first-cut reliability hardening" — but that isn't stated anywhere; the reader has to infer it from cross-referencing entries. The highest-severity fix (bake-reset failing on every external cut) is the fifth of six Fixed entries with no prominence. The most user-alarming fix (wrong PR mutated by
forgejo_find_pr_by_head) is last.2. The six reader questions
RELEASE_TOOLKIT_TOKENis still a real-user PAT (unchanged requirement, re-stated); push_whitelist membership documented as path-α precondition indocs/integration.mdreusable-changelog-fragment-check.yml(fail-loud on bad fragment kinds before merge), push-whitelist pre-flightforgejo_find_pr_by_headmutating the wrong PR, bake-reset halting every external cut, release-decide silently skipping cuts when HEAD isn't the prepare commitdocs/integration.md; no "upgrade from v0.19.0" step3. Entry inventory
reusable-changelog-fragment-check.yml+fragment-check.sh(#271)docs/operations.mdPAT rotation cadence (#273)- Fragment-vs-...) in a section of prose paragraphs — formatting inconsistencyrelease-deciderange scan for prepare commit (#259 ref)release-prep.shduplicate### Kindheadings (#272)forgejo_find_pr_by_headclient-side head filtering (#274)4. Signal vs. noise
Rough split: ~50% actionable change-info, ~35% mechanism/root-cause narrative, ~15% cross-reference/context.
This is tighter than the tmux-tell v0.27.0 body — most entries are reasonable length. The noise concentration is in three Fixed entries:
5. Structure & scannability
- Fragment-vs-conventional-commit...— the only bullet in a section of undecorated paragraphs. Pick one form.6. Missing
7. Verdict
Top 5 highest-leverage edits:
## v0.20.0 — YYYY-MM-DDand one sentence on the release theme before the sections.Length verdict: About right for the content volume. Unlike v0.27.0, this doesn't read as bloated — entries are tighter on average. The noise is localised to two or three Fixed entries and could be trimmed ~20% without losing any user-actionable content.
New commits pushed, approval review dismissed automatically according to repository settings