• v0.20.0 9fdc60db52

    Release v0.20.0
    Some checks failed
    check-self-bootstrap / check (pull_request) Failing after 3s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    check-self-bootstrap / check (push) Failing after 3s
    release / decide + act (push) Successful in 6s
    release / release (push) Successful in 0s
    Stable

    release-bot released this 2026-07-02 12:10:58 +02:00 | 1237 commits to main since this release

    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.sh now probes the consumer's default-branch protection before doing any work. Fails fast + names the missing identity if release-bot isn't on push_whitelist_usernames, instead of the late mid-cut Not allowed to push to protected branch rejection that leaves the manifest desynced. Only fails on a definitive misconfig; warns-and-proceeds otherwise. docs/integration.md names it as a path-α precondition.

    reusable-changelog-fragment-check.yml + scripts/fragment-check.sh. Consumers wire it into their pull_request workflow 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.md gained an annual release-bot PAT rotation-cadence section. No action required on existing installs; consult before regenerating the RELEASE_TOOLKIT_TOKEN Actions 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 commit with git 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_head no longer mutates a random open PR. Forgejo's head= query filter is empirically ignored, so .[0].number was 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 exact head.label / head.ref match. No consumer-side change required. Closes #274.

    Rolling-PR prepare-commit push now authenticates with the path-α PAT. Previously it reused the actions/checkout system 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 injects FORGEJO_TOKEN (the RELEASE_TOOLKIT_TOKEN PAT) as an HTTP Authorization header, mirroring the manifest push. Necessary but not sufficient — the consumer must still set RELEASE_TOOLKIT_TOKEN to a real-user PAT (the documented path-α setup).

    release-decide detects the chore(release): prepare vX.Y.Z commit 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 to mode=update loudly. 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.sh now 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.sh PR body assembly now re-normalizes through changelog_merge_sections so any surviving duplicate ### Kind headings collapse to one section per kind. Belt-and-suspenders on top of the merge already done in changelog_transition. Closes #272.

    Removed / Deprecated

    None.

    Upgrade

    Pin your consumer wrapper's uses:@<ref> to v0.20.0. Fragment-check wiring is opt-in (add .forgejo/workflows/fragment-check.yml per docs/integration.md if you want the pre-merge gate). Everything else is transparent.

    Downloads