-
v0.37.1
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6schangelog-body-check / check (pull_request) Successful in 0scheck-self-bootstrap / check (pull_request) Has been skippedfragment-check / changelog fragment-kind (pull_request) Successful in 7sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 36smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 2m20stests / shellcheck (pull_request) Successful in 9scheck-self-bootstrap / check (push) Successful in 3sgo-ci / lint + build + test (push) Successful in 37srelease / decide + act (push) Successful in 24srelease / release (push) Successful in 0stests / bats (push) Successful in 2m21stests / shellcheck (push) Successful in 9sgoreleaser / build + publish rt asset (push) Successful in 1m24smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-08-18 12:27:36 +02:00 | 879 commits to main since this releaseAdded
None.
Changed
None.
Fixed
release-decide.sh's#417orphan 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#259buried-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
#417FATAL 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:*.mdallow-lists every.mdin 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.37.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6schangelog-body-check / check (pull_request) Successful in 0scheck-self-bootstrap / check (pull_request) Has been skippedfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 37smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 2m20stests / shellcheck (pull_request) Successful in 9scheck-self-bootstrap / check (push) Successful in 3sgo-ci / lint + build + test (push) Successful in 36srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / bats (push) Successful in 2m19stests / shellcheck (push) Successful in 9sgoreleaser / build + publish rt asset (push) Successful in 1m29smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-08-17 22:39:25 +02:00 | 891 commits to main since this releaseAdded
None.
Changed
-
changelog-body-check gate: now runs
rt changelog-body-checkinstead 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.36.0
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4schangelog-body-check / check (pull_request) Successful in 0scheck-self-bootstrap / check (pull_request) Has been skippedfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 35smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 2m19stests / shellcheck (pull_request) Successful in 9scheck-self-bootstrap / check (push) Successful in 3sgo-ci / lint + build + test (push) Successful in 36srelease / decide + act (push) Failing after 8srelease / release (push) Failing after 0stests / bats (push) Successful in 2m19stests / shellcheck (push) Successful in 9sgoreleaser / build + publish rt asset (push) Successful in 1m56smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-08-17 14:43:59 +02:00 | 899 commits to main since this releaseAdded
-
composite action: caches the
rtbinary, 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.Zget this on their next run.
Changed
-
fragment-check gate: now runs
rt fragment-checkinstead of the bash script (#607)The workflow's inputs are unchanged —
valid_kindsandfragment_length_warn_charsreachrtthrough the same env vars the script read, verified by differential run. Adopters pinned to a release tag get a cachedrt(~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_tagnow fails when the tag format cannot be resolved (#625)With no
release-toolkit.ymlit returned success and an empty string. Callers'|| printf 'v%s'fallbacks therefore never fired, andrt decideemitted an emptynext_tag. The bash path now matches the Go path, which already fell back tov. -
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 releasenow 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 bareechoin 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/decideandcmd/rtfully green. The byte-oracle cannot cover it either: it runs--dry-run, where Layer 2/3 areSKIP. 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.35.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / changelog fragment-kind (pull_request) Successful in 4sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 31smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 5smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 4sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 2m9stests / shellcheck (pull_request) Successful in 8scheck-self-bootstrap / check (push) Successful in 3sgo-ci / lint + build + test (push) Successful in 31srelease / decide + act (push) Successful in 7srelease / release (push) Successful in 0stests / bats (push) Successful in 2m8stests / shellcheck (push) Successful in 8sgoreleaser / build + publish rt asset (push) Successful in 1m19smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-31 16:03:19 +02:00 | 923 commits to main since this releaseAdded
-
decide: cut prereleases via
--prerelease alpha|beta|rc(#476)Emits
1.0.0-alpha.1, thenalpha.2, thenbeta.1. The core bump comes from--bump-overridewhen given, and is omitted while a series continues. -
semver:
semver_bump_prerelease+semver.BumpPrereleasefor 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.1→alpha.2), or promote (alpha.3→beta.1). Any derivation that would sort below its input is refused rather than emitted. -
ci: fail when the release-shape
rtbinary 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.1was compared against the last stable tag, reported "ahead", and passed even when it was behindv1.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.Nsection 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.0compared as higher than1.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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.34.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 23smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 4smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 4sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 1m58stests / shellcheck (pull_request) Successful in 8scheck-self-bootstrap / check (push) Successful in 3sgo-ci / lint + build + test (push) Successful in 23srelease / decide + act (push) Successful in 6srelease / release (push) Successful in 0stests / bats (push) Successful in 1m59stests / shellcheck (push) Successful in 8sgoreleaser / build + publish rt asset (push) Successful in 1m18smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-29 23:46:55 +02:00 | 946 commits to main since this releaseAdded
- 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
released this
2026-07-25 00:13:54 +02:00 | 1019 commits to main since this releaseThis 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) scheduledv1.0.0-alpha.Nfor dogfood and iteration, with phase 0a's exit criterion written as "asset publish works tov1.0.0-alpha.0tag". 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.0is 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, uninterruptedThe two-line model was then dropped: Go development moved to trunk and v0.x numbering resumed. No
v1.0.0-alpha.1was 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 — andcmd/rt/build_ref_check_test.gopoints at it deliberately:"not a fixture:
v1.0.0-alpha.0is published history"build-ref-checkhas 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, andmirror-release.yml'ssince_tagdefault 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Release v0.33.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / changelog fragment-kind (pull_request) Successful in 4sfragment-check / check (pull_request) Successful in 0smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 5smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 5sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 1m58stests / shellcheck (pull_request) Successful in 8scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Successful in 7srelease / release (push) Successful in 0stests / bats (push) Successful in 1m58stests / shellcheck (push) Successful in 8smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-24 01:28:56 +02:00 | 1034 commits to main since this releaseAdded
-
build-c4workflow: LikeC4 static-site build fordocs/architecture/c4/**/*.likec4, deployed toarch.saratow.netLAN-only (alcatraz-infra#128 substrate). Consumes tmux-tell#617 forgejo-runner/outputbind-mount; served RO via ingress nginx. Refs release-toolkit#367. -
fragment style guide + length-warn CI signal — new
docs/fragment-style.mdcodifies 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.ymlgains afragment_length_warn_charsinput (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_REnow accepts the Forgejo squash-merge subject suffix(#NN). A prep-PR squash-merged on Forgejo produces the commit subjectchore(release): vX.Y.Z (#NN)(PR-number appended to the title); the$anchor previously rejected it, silently skip-gating the cut. #331 madeprepareoptional 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, soBASH_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
internalconvention (#489). -
release-prepno longer emits conventional-commit summary bullets that duplicate an authored changelog fragment.cc_categorize_commits_sincenow 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#NNNprose reference. This catches the ref-absent and ref-mismatched duplicates thatchangelog_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-prepno longer drops the### Upgradesection or concatenates a strayNone.placeholder onto real content when composing a release over pre-existing## [Unreleased]content.changelog_merge_sectionsnow sources its section order from the single-source-of-truthCHANGELOG_STANDARD_SECTIONS(so no hand-maintained order list can drift and drop a section) and treats the scaffoldNone.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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
Release v0.32.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / changelog fragment-kind (pull_request) Successful in 3sfragment-check / check (pull_request) Successful in 0smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 5smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 4sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 1m58stests / shellcheck (pull_request) Successful in 8scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Successful in 6srelease / release (push) Successful in 0stests / bats (push) Successful in 1m58stests / shellcheck (push) Successful in 8smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 21:05:20 +02:00 | 1045 commits to main since this releaseAdded
Adopter-overridable
REGISTER_PATTERNSvocabulary inreusable-register-check.yml. A newregister_patterns_overrideinput 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 inconventional-commits.shrespect 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Release v0.31.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 4scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / changelog fragment-kind (pull_request) Successful in 3sfragment-check / check (pull_request) Successful in 0smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 5smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 4sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 1m57stests / shellcheck (pull_request) Successful in 8scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Successful in 7srelease / release (push) Successful in 0stests / bats (push) Successful in 1m57stests / shellcheck (push) Successful in 13smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 20:49:20 +02:00 | 1049 commits to main since this releaseAdded
None.
Changed
Cold-read capture output now routes to the internal wiki (BookStack
release-toolkitbook, id 209) instead of dropping{date}-{model}-{surface}.mdand{date}-triangulation.mdfiles intodocs/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#392gate durably enforces cleanliness without relying on the allowlist as the only guard against future name-drift.Verified with the allowlist entry removed:
register-check.shstill exits 0 across the tree, and the three remaining files underdocs/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_REis now a single-source-of-truth inscripts/lib/prep-subject.sh. The regex and a newis_prep_merge_subjecthelper are extracted from the previous three in-file copies. Two lived inrelease-decide.shfor cut-detection; one lived incheck-self-bootstrap.shfor 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) plusBASH_REMATCHextraction guards. Existing regressions intests/check-self-bootstrap.batsandtests/release-decide.batscontinue to pass unchanged. No action required for adopters. Closes #450.Removed
None.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Release v0.30.3
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 3scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / changelog fragment-kind (pull_request) Successful in 3sfragment-check / check (pull_request) Successful in 0smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 5smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 4sregister-check / check (pull_request) Successful in 0stests / bats (pull_request) Successful in 1m56stests / shellcheck (pull_request) Successful in 7scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / bats (push) Successful in 1m56stests / shellcheck (push) Successful in 7smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 19:57:37 +02:00 | 1054 commits to main since this releaseAdded
None.
Changed
None.
Fixed
semver_comparenow 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, so1.0.0+build.1and1.0.0+build.2remain 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads