• v0.37.1 a57b70ce69

    v0.37.1
    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 7s
    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 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 37s
    release / decide + act (push) Successful in 24s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 2m21s
    tests / shellcheck (push) Successful in 9s
    goreleaser / build + publish rt asset (push) Successful in 1m24s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-08-18 12:27:36 +02:00 | 879 commits to main since this release

    Added

    None.

    Changed

    None.

    Fixed

    release-decide.sh's #417 orphan check no longer refuses a legitimate cut when a release-plumbing fixup lands above the prepare commit.

    The walk broke on the first bump-worthy subject. A fix(changelog): commit one row above the prepare commit therefore made that prepare commit unreachable, and with it the #259 buried-prepare skip.

    The discriminator is now file scope rather than commit type. A bump-worthy commit touching only release-managed files — changelog, manifest, version_files — is reconciliation rather than adopter work. Anything that cannot be proven to be plumbing still fires.

    The #417 FATAL now names the commit that triggered it. That subject was captured and discarded before.

    • register-check.sh: the allow-list wildcard semantics were misdescribed (#655)

      Both comment blocks called * pathname expansion; one added that it stops at a path segment. The implementation is bash [[ == ]], where * crosses /. The error is silent in the dangerous direction: *.md allow-lists every .md in the tree, and a check that skips too much reads as a clean scan.

    release-decide's cut-safeguard now grades a prepare commit that is not its own PR's tip.

    Layer 2/3 asked the forge which PR was merged AS a given commit. That question is answerable only for a PR's tip. Under fast-forward-only, a fixup merged above the prepare makes the prepare non-tip. The lookup then found nothing, and the safeguard declined a legitimate cut.

    The lookup now also asks which merged PR CONTAINS the commit. It reads each PR's own commit list over a bounded window. This resolves a buried prepare under every merge style. Being a forge call, it does not depend on clone depth.

    The sha-translation helper that existed only to feed the tip-keyed lookup is deleted.

    • forgejo: bound the membership walk in ONE ordered request, matching bash

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.37.0 8bfbbc3030

    v0.37.0
    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 37s
    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 1m29s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-08-17 22:39:25 +02:00 | 891 commits to main since this release

    Added

    None.

    Changed

    • changelog-body-check gate: now runs rt changelog-body-check instead of the bash script (#607)

      Gate 3 of 4, and the last PR-CI validator on bash. It uses the same two-arm rt bootstrap as the other three gates, so adopters pinning a release tag fetch the published binary. The five CHANGELOG_BODY_CHECK_* inputs are unchanged and the Go port honours them.

    Fixed

    • release: the cut log now says whether the manifest was updated or created (#673)

      The manifest write forks on whether the file is present in the checkout. Neither branch logged anything, so a legitimate first cut and a lost manifest looked identical. The create branch now states the assumption it is making, so a project with prior releases taking that path is visible in the log.

    • release: the post-cut manifest check can run again — it had no credentials (#673)

      The check added in #637 fetches the default branch to confirm the bookkeeping commit landed. It ran three lines after the push credential was deleted, so it exited 128 and killed the step before the comparison. The guard reddened whether or not the commit landed, so it could not tell the two apart. It now scopes a credential to its own fetch.

    • reusable-release: the create echo names the ASSUMPTION, not the key count (#673)

    • pr-ci: gate 3 was missing the version-tag cache restore (@lookout #676)

    • pr-ci: make the changelog-body-check gate re-run when the gate itself changes

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.36.0 f2c85841c5

    v0.36.0
    Some checks failed
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
    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 2m19s
    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) Failing after 8s
    release / release (push) Failing after 0s
    tests / bats (push) Successful in 2m19s
    tests / shellcheck (push) Successful in 9s
    goreleaser / build + publish rt asset (push) Successful in 1m56s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-08-17 14:43:59 +02:00 | 899 commits to main since this release

    Added

    • composite action: caches the rt binary, cutting warm installs from ~10s to under a second (#606)

      The checksum verify still runs on cache hits — a restored binary is re-verified against the release manifest before anything executes it. No action needed: adopters already on uses: frankenbit/release-toolkit@vX.Y.Z get this on their next run.

    Changed

    • fragment-check gate: now runs rt fragment-check instead of the bash script (#607)

      The workflow's inputs are unchanged — valid_kinds and fragment_length_warn_chars reach rt through the same env vars the script read, verified by differential run. Adopters pinned to a release tag get a cached rt (~48ms warm, #606); no action needed.

    Fixed

    • fetch-rt: the "not listed in checksums.txt" error can now actually print (#606)

      The branch was unreachable under set -euo pipefail, so a release published with incomplete assets failed with a bare non-zero exit and no diagnostic. Anyone who hit that case saw no reason for it.

    • config: config_render_tag now fails when the tag format cannot be resolved (#625)

      With no release-toolkit.yml it returned success and an empty string. Callers' || printf 'v%s' fallbacks therefore never fired, and rt decide emitted an empty next_tag. The bash path now matches the Go path, which already fell back to v.

    • changelog-body-check: density checks now read lists, quotes and tables (#632)

      Checks 7 and 9 scanned plain paragraphs only, so the same over-long sentence failed as a paragraph and passed as a bullet. Markers are now stripped and the remainder scanned. A blockquote over the ceiling names itself in the failure, and the message names the variable that raises the ceiling.

    • release: post-cut manifest bookkeeping is written again, and verified on the branch (#637)

      The idempotency pre-check read the workspace copy, which rt release now writes itself. It saw its own run's work, assumed a prior run had landed the commit, and skipped the push. It now reads the remote branch tip, and a post-condition refuses when the commit did not land.

    • changelog-body-check: honour CHANGELOG_BODY_CHECK_{SENTENCE_MAX,SENTENCE_WARN,PAREN_DEPTH_MAX,PARAGRAPH_MAX,PARAGRAPH_WARN} env vars in the Go port — previously hardcoded, making the failure message's advice to set these vars incorrect (#652). Invalid (non-integer) values now exit 2 rather than silently falling back to the default.

    • release: the cut safeguard grades the prepare commit, and a decline now fails the run (#663)

      Layers 2 and 3 were keyed on HEAD_SHA, which asks whether the last merge came from the rolling branch, not whether the prepare commit did. Those diverge on the buried-prepare path, so a follow-up commit on top declined a valid cut. The gate now keys on the prepare commit's own sha. A decline is now an ::error:: and a non-zero exit, not a bare echo in a step that exits 0.

    • release: the Go decide port's prepare-sha resolution is now pinned by tests (#663)

      The #663 fix landed in both implementations, but only the Bash half had arms. Reverting the Go keying, or neutering the resolver, left internal/decide and cmd/rt fully green. The byte-oracle cannot cover it either: it runs --dry-run, where Layer 2/3 are SKIP. Adds a merge-commit fixture with a live Layer-2 lookup, a stray-prepare pin, and a direct resolver test over all three shapes.

    • changelog: split 37-word density failure in 652 fragment

    • release-decide: resolve the prepare's OWNING MERGE, and make the seam as strict as production

    • register-check: the allow-list wildcard bullet was WRONG, not just loose

    • fragment-check: drop || true — the runnability check could not fail

    • changelog-body-check: #632 blockquotes REFUSE with a named override

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.35.0 ff2f352bdb

    v0.35.0
    All checks were successful
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    fragment-check / changelog fragment-kind (pull_request) Successful in 4s
    fragment-check / check (pull_request) Successful in 0s
    go-ci / lint + build + test (pull_request) Successful in 31s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 4s
    register-check / check (pull_request) Successful in 0s
    tests / bats (pull_request) Successful in 2m9s
    tests / shellcheck (pull_request) Successful in 8s
    check-self-bootstrap / check (push) Successful in 3s
    go-ci / lint + build + test (push) Successful in 31s
    release / decide + act (push) Successful in 7s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 2m8s
    tests / shellcheck (push) Successful in 8s
    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
    Stable

    release-bot released this 2026-07-31 16:03:19 +02:00 | 923 commits to main since this release

    Added

    • decide: cut prereleases via --prerelease alpha|beta|rc (#476)

      Emits 1.0.0-alpha.1, then alpha.2, then beta.1. The core bump comes from --bump-override when given, and is omitted while a series continues.

    • semver: semver_bump_prerelease + semver.BumpPrerelease for the alpha→beta→rc cadence (#476)

      Level and label select the move: start a series (0.34.0 + major/alpha → 1.0.0-alpha.1), increment (alpha.1alpha.2), or promote (alpha.3beta.1). Any derivation that would sort below its input is refused rather than emitted.

    • ci: fail when the release-shape rt binary grows >20% over the last release's asset (#605)

      A step-change guard, not an absolute ceiling. With no reachable baseline it still passes, but loudly: a green there means the check could not run, not that the size is fine.

    • decide: refuse a prerelease cut whose computed tag already exists

    Changed

    None.

    Fixed

    • manifest-check: check prerelease manifests against prerelease tags (#476)

      A manifest at 1.0.0-alpha.1 was compared against the last stable tag, reported "ahead", and passed even when it was behind v1.0.0-alpha.2. The mode follows the manifest's own version, so there is no flag to set; stable manifests are unchanged.

    • prep: walk a prerelease section from the preceding prerelease tag, not the last stable (#476)

      Each -alpha.N / -beta.N / -rc.N section lists only what is new in it rather than repeating the whole series. Stable cuts are unchanged.

    • semver: compare large numeric prerelease identifiers by digit count, then lexically (#612)

      Previously 1.0.0-alpha.0 compared as higher than 1.0.0-alpha.18446744073709551615. Exact at any length, with shell and Go agreeing.

    • ci: attribute a size red to the change that caused it

    • semver: bound the prerelease counter so the two sides cannot diverge

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.34.0 eff2d9d1b1

    v0.34.0
    All checks were successful
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    go-ci / lint + build + test (pull_request) Successful in 23s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 4s
    register-check / check (pull_request) Successful in 0s
    tests / bats (pull_request) Successful in 1m58s
    tests / shellcheck (pull_request) Successful in 8s
    check-self-bootstrap / check (push) Successful in 3s
    go-ci / lint + build + test (push) Successful in 23s
    release / decide + act (push) Successful in 6s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 1m59s
    tests / shellcheck (push) Successful in 8s
    goreleaser / build + publish rt asset (push) Successful in 1m18s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-07-29 23:46:55 +02:00 | 946 commits to main since this release

    Added

    • reusable-release: migrate 7 callsites bash→rt + 2c-hybrid rt bootstrap
    • rt-register-check: honor REGISTER_CHECK_PATTERNS adopter override (#435)
    • contracts: C3 workflow-API drift gate (schema exists Phase 0b/#504; gate keeps it honest)
    • rt-register-check: port register-check.sh → rt register-check
    • rt-compose-verify: port compose-verify.sh → rt compose-verify
    • rt-changelog-body-check: port changelog-body-check.sh → rt changelog-body-check
    • rt-fragment-check: port fragment-check.sh → rt fragment-check
    • rt-preflight-push-whitelist: port preflight-push-whitelist.sh → rt preflight-push-whitelist
    • rt-manifest-precheck: port manifest-precheck.sh → rt manifest-precheck
    • rt-decide: port release-decide.sh → rt decide (#555)
    • rt-manifest-check: port manifest-check.sh to rt manifest-check
    • rt-prune-rc-tags: port prune-rc-tags.sh to rt prune-rc-tags
    • release: rt release orchestrator (Go port of draft-release.sh)
    • prep: rt prep orchestrator (Go port of release-prep.sh)
    • prep: compose orchestration + version determination (rt prep)
    • release: Request.Composed + nil-Manifest prefix-only Cutter path
    • release: Cutter transactional cut engine (ADR-0009 §6)
    • selfboot: #547 wire rt self-bootstrap caller-seam over bake.Baker
    • bake: #547 enforce the clean-staged precondition in Baker.Bake
    • bake: #546 pure Baker for the self-bootstrap tree (Phase 5 1/2)
    • forgejo: #541 typed Forgejo API client (Phase 4 2/2)
    • manifest: implement Store — Read/Write/CheckDesync + round-trip (#542)
    • gates: compose-verify preflight — Go port (#534 PR 3/3)
    • gates: changelog-body-check gate — Go port (#534 PR 2/3)
    • gates: register-check --stdin gate — Go port (#534 PR 1/3)
    • changelog: implement Composer + Parser + register-scrub against C6 grammar + bash oracle
    • fragments: implement Reader + Fragment against C4 grammar + bash oracle
    • events: implement Emitter + event types against #505 interface (#528)
    • config: implement Loader + Config against #505 interface + C1 schema (#527)
    • conventionalcommits: implement Parser + Commit against #505 interface (#524)
    • semver: implement Parser + Version against #505 interface (#523)
    • cli: rt subcommand skeleton + trivalent exit-code wiring (#506)
    • interfaces: Go interfaces for all internal/* packages (#505)
    • contracts: write C1–C7 contract shapes + property invariants (#504)
    • harness: byte-equivalence differential harness framework (#503)
    • scaffold: Go module + cmd/rt cobra skeleton + internal package stubs (#501)

    Changed

    None.

    Fixed

    • selfboot: normalize staged reusables to 'main' markers (#599)
    • reusable-release: fail-loud Go preflight on the BUILD bootstrap path
    • rt: Phase 6b micro-cleanup — 4 bash-faithfulness fixes + 2 breadcrumbs
    • rt-decide: #417 orphan fires on cmp>0 regardless of relevant-commit + port #86 Layer-2 retry (review 4621)
    • rt-manifest-check: section-5 5c mismatch line + version-file comment (review 4615)
    • release: Fire compares the replay target unconditionally (review 4612)
    • release: canonicalize cut-lock path through symlinks
    • release: restore fragments on the (c)-branch partial-delete rollback
    • build-c4: declare /output volume mount so main-push deploy step succeeds
    • bake: give the equivalence oracle a git identity (CI commit-tree)
    • contracts: fold PR#518 review should-considers S1–S4 (#504)
    • action: authenticated asset fetch + fail-loud HTML guard (#502)
    • harness: discard os.RemoveAll errors in cleanup defers (errcheck) (#516)
    • goreleaser: unset ambient GITHUB_TOKEN so goreleaser sees one token (#502)

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v1.0.0-alpha.0 271cc0150c

    v1.0.0-alpha.0 — the abandoned Go version line, retained for build-ref-check
    Some checks failed
    go-ci / lint + build + test (push) Failing after 5s
    goreleaser / build + publish rt asset (push) Successful in 1m20s
    Pre-release

    shipwright released this 2026-07-25 00:13:54 +02:00 | 1019 commits to main since this release

    This is a real cut from an abandoned version line, not a test artefact — and it is retained on purpose.

    What it was

    The toolkit's release logic was originally bash. The port to Go was planned as a parallel version line: ADR-0009 (go-substrate-for-v1) scheduled v1.0.0-alpha.N for dogfood and iteration, with phase 0a's exit criterion written as "asset publish works to v1.0.0-alpha.0 tag". ADR-0008 records the earlier v2.0.0 framing and its retarget — "retargets the port to v1.0.0 and collapses the two-line branch model".

    So v1.0.0-alpha.0 is the Go line's first cut, made while the bash trunk continued to release v0.x underneath it. The tags show the two lines running side by side and never crossing:

    v0.33.0          2026-07-23      bash trunk
    v1.0.0-alpha.0   2026-07-25      the Go line's only cut
    v0.34.0          2026-07-29      bash trunk, uninterrupted
    

    The two-line model was then dropped: Go development moved to trunk and v0.x numbering resumed. No v1.0.0-alpha.1 was ever cut. This tag is the whole of that line.

    Why it stays

    🔴 Deleting it would remove a shipped gate's only real-world failing case. It was published with BUILD_BAKED_TOOLKIT_REF: 'main' — a tree tagged without being baked for its own tag — and cmd/rt/build_ref_check_test.go points at it deliberately:

    "not a fixture: v1.0.0-alpha.0 is published history"

    build-ref-check has no other instance of that defect and one cannot be manufactured: the tree, the tag and the mis-baked ref have to be real. Four test files and two workflows reference it, and mirror-release.yml's since_tag default is this tag.

    What it is not

    Not a current version, not a version line anyone should pin, and not evidence of a 1.0 release. The project is pre-1.0 and its live line is v0.x. A reader browsing releases should treat this as history with a purpose, not as a version ahead of the others.

    Downloads
  • v0.33.0 f38267ec8f

    Release v0.33.0
    All checks were successful
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    fragment-check / changelog fragment-kind (pull_request) Successful in 4s
    fragment-check / check (pull_request) Successful in 0s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 5s
    register-check / check (pull_request) Successful in 0s
    tests / bats (pull_request) Successful in 1m58s
    tests / shellcheck (pull_request) Successful in 8s
    check-self-bootstrap / check (push) Successful in 3s
    release / decide + act (push) Successful in 7s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 1m58s
    tests / shellcheck (push) Successful in 8s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-07-24 01:28:56 +02:00 | 1034 commits to main since this release

    Added

    • build-c4 workflow: LikeC4 static-site build for docs/architecture/c4/**/*.likec4, deployed to arch.saratow.net LAN-only (alcatraz-infra#128 substrate). Consumes tmux-tell#617 forgejo-runner /output bind-mount; served RO via ingress nginx. Refs release-toolkit#367.

    • fragment style guide + length-warn CI signal — new docs/fragment-style.md codifies the skim-scan shape a good changelog fragment takes (six rules + before/after examples grounded on the ember v0.3.0/v0.5.0/v0.6.0 recoveries); reusable-changelog-fragment-check.yml gains a fragment_length_warn_chars input (default 500) that emits a non-blocking ::warning:: for fragments exceeding the threshold and points contributors at the guide (#488)

    Changed

    None.

    Fixed

    • PREP_SUBJECT_RE now accepts the Forgejo squash-merge subject suffix (#NN). A prep-PR squash-merged on Forgejo produces the commit subject chore(release): vX.Y.Z (#NN) (PR-number appended to the title); the $ anchor previously rejected it, silently skip-gating the cut. #331 made prepare optional for squash-merge but missed the suffix half — measured on ember v0.1.0 (chore(release): v0.1.0 (#37)). The trailing group is added at the end, so BASH_REMATCH[2] version extraction is unaffected. Closes #487.

    • Let the changelog fragment PR gate accept a consumer-provided valid-kind list so it can match the repository's release-time assembler instead of hardcoding release-toolkit's own internal convention (#489).

    • release-prep no longer emits conventional-commit summary bullets that duplicate an authored changelog fragment. cc_categorize_commits_since now takes an optional fragments-directory argument and suppresses the CC subject bullet of any commit that itself added a fragment in the same range (git log --diff-filter=A), keyed on git commit identity rather than on a shared #NNN prose reference. This catches the ref-absent and ref-mismatched duplicates that changelog_dedup_cc_by_fragment_refs (which keys on the fragment filename id) structurally cannot, and it cannot silently drop genuinely-new content: a change with no fragment sits on a commit the suppression set never contains. The ref-based dedup is retained for the complementary separate-commit-same-ref case. Refs release-toolkit#493 (Bug 2).

    • release-prep no longer drops the ### Upgrade section or concatenates a stray None. placeholder onto real content when composing a release over pre-existing ## [Unreleased] content. changelog_merge_sections now sources its section order from the single-source-of-truth CHANGELOG_STANDARD_SECTIONS (so no hand-maintained order list can drift and drop a section) and treats the scaffold None. as a soft-empty sentinel that yields to real content but persists when a kind is empty in every input. Refs release-toolkit#493 (Bug 1).

    • fragment-style: scrub '[reviewer]' invented-jargon per register-check gate

    • fragment-style: scrub 3 chamber-name attributions per register-check gate

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.32.0 78d80446bb

    Release v0.32.0
    All checks were successful
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    fragment-check / changelog fragment-kind (pull_request) Successful in 3s
    fragment-check / check (pull_request) Successful in 0s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 4s
    register-check / check (pull_request) Successful in 0s
    tests / bats (pull_request) Successful in 1m58s
    tests / shellcheck (pull_request) Successful in 8s
    check-self-bootstrap / check (push) Successful in 3s
    release / decide + act (push) Successful in 6s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 1m58s
    tests / shellcheck (push) Successful in 8s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-07-07 21:05:20 +02:00 | 1045 commits to main since this release

    Added

    Adopter-overridable REGISTER_PATTERNS vocabulary in reusable-register-check.yml. A new register_patterns_override input on the reusable accepts a newline-separated pattern list that replaces the release-toolkit-maintainer default vocabulary. When empty, the built-in defaults still apply, so release-toolkit-self and adopters who have not opted in are backwards-compatible.

    Motivation: several built-in patterns are common English role words in adopter contexts. They trip the file scan on unrelated adopter prose the moment an adopter uses those words normally. The override lets adopters swap in their own project-specific vocabulary. The scope is a full replacement; an additive mode is not part of this iteration.

    The override lands at library level in scripts/lib/register-patterns.sh, so both the PR-time gate and the compose-time bullet scrub in conventional-commits.sh respect the same list. All three scan modes (--file-scan, --git-log, --stdin) apply the override symmetrically. Format: one pattern per line; empty lines ignored; regex metacharacters must be pre-escaped. Closes #435.

    Changed

    None.

    Fixed

    None.

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.31.0 42639690fa

    Release v0.31.0
    All checks were successful
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    fragment-check / changelog fragment-kind (pull_request) Successful in 3s
    fragment-check / check (pull_request) Successful in 0s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 4s
    register-check / check (pull_request) Successful in 0s
    tests / bats (pull_request) Successful in 1m57s
    tests / shellcheck (pull_request) Successful in 8s
    check-self-bootstrap / check (push) Successful in 3s
    release / decide + act (push) Successful in 7s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 1m57s
    tests / shellcheck (push) Successful in 13s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-07-07 20:49:20 +02:00 | 1049 commits to main since this release

    Added

    None.

    Changed

    Cold-read capture output now routes to the internal wiki (BookStack release-toolkit book, id 209) instead of dropping {date}-{model}-{surface}.md and {date}-triangulation.md files into docs/internal/cold-read/. Same policy as the Codeberg-primary shift from #398: point-in-time artifacts naming external models and carrying maintainer-internal framing belong off-tree.

    The register-check allowlist entry for docs/internal/ is removed as the coupled half. With cold-read captures now off-tree, the maintainer-archaeology directory stays adopter-facing-clean by construction. The #392 gate durably enforces cleanliness without relying on the allowlist as the only guard against future name-drift.

    Verified with the allowlist entry removed: register-check.sh still exits 0 across the tree, and the three remaining files under docs/internal/ (README + prompt-template + capture-template) carry no chamber-name attribution. Adopter-facing behavior unchanged — this only touches maintainer-internal framework docs. Closes #402.

    Fixed

    PREP_SUBJECT_RE is now a single-source-of-truth in scripts/lib/prep-subject.sh. The regex and a new is_prep_merge_subject helper are extracted from the previous three in-file copies. Two lived in release-decide.sh for cut-detection; one lived in check-self-bootstrap.sh for skip-detection.

    Consumers now source the shared library. Any future refinement of the shape matcher lands in one place. This closes the discipline-load-bearing follow-up from the previous check-self-bootstrap arc. Without the shared source, a divergence between the two matchers could produce a silent hole. A non-cut push would then be incorrectly skipped by the pin-drift check.

    Test coverage lives in tests/prep-subject.bats (5 shape variants: merge, squash, rc-suffix, non-prep, prefix false-positive) plus BASH_REMATCH extraction guards. Existing regressions in tests/check-self-bootstrap.bats and tests/release-decide.bats continue to pass unchanged. No action required for adopters. Closes #450.

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.30.3 ff7a7f7b27

    Release v0.30.3
    All checks were successful
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 3s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    fragment-check / changelog fragment-kind (pull_request) Successful in 3s
    fragment-check / check (pull_request) Successful in 0s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 4s
    register-check / check (pull_request) Successful in 0s
    tests / bats (pull_request) Successful in 1m56s
    tests / shellcheck (pull_request) Successful in 7s
    check-self-bootstrap / check (push) Successful in 3s
    release / decide + act (push) Successful in 8s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 1m56s
    tests / shellcheck (push) Successful in 7s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    release-bot released this 2026-07-07 19:57:37 +02:00 | 1054 commits to main since this release

    Added

    None.

    Changed

    None.

    Fixed

    semver_compare now implements SemVer 2.0.0 §11 prerelease precedence in full. The previous implementation compared only major/minor/patch and ignored prerelease + build metadata.

    Under the new rules: a version WITHOUT prerelease is HIGHER than one WITH. When both carry prerelease, dot-separated identifiers are compared left-to-right per §11.4. Numeric identifiers are lower than alphanumeric. Numeric identifiers are compared numerically; alphanumeric identifiers are compared lexically ASCII. When all common identifiers are equal, the shorter set is lower.

    Build metadata (+...) is still IGNORED per §10, so 1.0.0+build.1 and 1.0.0+build.2 remain equal. Adopter behavior is unchanged for release-vs-release comparisons (no prerelease in the manifest state during normal cuts). Tooling that touches rc-tags or prerelease pins now sees correct ordering. Closes #347.

    • semver: pin LC_ALL=C in semver_compare for §11.4.2 ASCII collation
    • semver: genericize reviewer attribution in semver_compare header

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads