• 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 | 1094 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 | 1167 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 | 1182 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 | 1193 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 | 1197 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 | 1202 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
  • v0.30.2 fea688f024

    Release v0.30.2
    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 1m55s
    tests / shellcheck (pull_request) Successful in 7s
    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 1m55s
    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 18:56:16 +02:00 | 1209 commits to main since this release

    Added

    None.

    Changed

    None.

    Fixed

    Cut workflow no longer fails on the not-yet-existent cut tag under the toolkit-self floating-pin discipline. Under #456, the toolkit's own wrapper pins uses:@main. The reusable then runs from main HEAD.

    After a rolling-PR merge, main transiently carries BUILD_BAKED_TOOLKIT_REF='vCUT_TAG'. release-prep.sh bakes it at compose so adopters pinning the cut tag get frozen substrate. But the tag itself does not exist yet at push:main time. The old resolve-ref step emitted that value unconditionally as the checkout target; actions/checkout@v4 then failed trying to fetch a not-yet-created tag.

    Each resolve-ref step now scope-detects the consumer wrapper's uses:@<ref> value. When it is main, REF is overridden to main regardless of the baked value. Adopters are unaffected. Their wrapper pins @vX.Y.Z, the override branch is skipped, and the baked value is trusted as before.

    Cut-tag artifacts still carry the baked vCUT_TAG value. @vX.Y.Z pins remain a frozen source-of-record per #336. Empirical anchor: v0.30.1 cut failed at 7a1e63cb. No action required for adopters. Closes #460.

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.30.1 7a1e63cbe7

    v0.30.1
    Some checks failed
    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 1m55s
    tests / shellcheck (pull_request) Successful in 7s
    check-self-bootstrap / check (push) Successful in 3s
    release / decide + act (push) Failing after 38s
    release / release (push) Failing after 0s
    tests / bats (push) Successful in 1m56s
    tests / shellcheck (push) Successful in 8s
    mirror-on-cut / mirror-1 (release) Successful in 1s
    mirror-on-cut / mirror (release) Successful in 0s
    Stable

    quartermaster released this 2026-07-07 16:34:07 +02:00 | 1212 commits to main since this release

    Added

    None.

    Changed

    None.

    Fixed

    Toolkit-self wrappers now float on @main, eliminating the between-cut manual-rc-tag intervention window. The toolkit's own .forgejo/workflows/*.yml pin uses:@main instead of a versioned tag. Every push to main runs against the current scripts substrate; no drift class can accumulate.

    Adopter behavior is unchanged. Adopters continue to pin uses:@vX.Y.Z to a released tag. The cut-tag artifact retains its baked BUILD_BAKED_TOOLKIT_REF value, so @vX.Y.Z remains a frozen source-of-record.

    Closes the shared substrate of the fix-cut-bootstrap-through-own-gate class. Class 1 (check-self-bootstrap firing red between cuts) closes via a PINNED_REF == 'main' early-exit in check-self-bootstrap.sh. Class 3 (compose-scaffold-carrying tooling unavailable from a stale pinned tag) closes via a symmetric skip in the auto-re-pin path (#283). Wrappers already at @main stay there.

    Adopter drift-detection stays intact via the tag-pin discipline. That discipline is orthogonal to check-self-bootstrap.yml, a toolkit-self-only workflow. No action required for adopters. Closes #456.

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.30.0 071e318888

    Release v0.30.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 1m55s
    tests / shellcheck (pull_request) Successful in 7s
    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 1m55s
    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 12:59:26 +02:00 | 1217 commits to main since this release

    Added

    Cut-time preflight verifies the composed CHANGELOG section is gate-clean before the release fires. A new scripts/compose-verify.sh runs at the top of the cut case in reusable-release.yml. It scans the target section with register-check --stdin and changelog-body-check.

    The preflight blocks the cut when either gate flags drift or density. Closes the gap surfaced by PR#438 (v0.28.0), where a manifest-only recovery skipped the auto push:main trigger and workflow_dispatch fired the cut against a CHANGELOG that never went through compose. No action required for adopters — the preflight is wired into the reusable workflow. Closes #439.

    Changed

    None.

    Fixed

    check-self-bootstrap no longer fires red on the rolling-PR-merge push:main event. The auto-re-pin substrate (#283) runs INSIDE the cut workflow that fires on that same push, so the pin-drift check saw pre-cut state and reported a false-positive RED. The check now detects a HEAD subject matching the release-prep merge shape and skips with an informative message.

    Discipline preserved for every OTHER push:main. A hand-edit to release.yml, an orphaned tag, or any content edit outside the rolling-PR flow still fires the check. Closes the "check-self-bootstrap RED on every substrate cut" class (empirical: PR#438 v0.28.0 arc + PR#443/#446 Bundle 1/2 sprint). No action required. Closes #445.

    release-prep.sh now scaffolds all 6 standard CHANGELOG sections in the composed body. When fragments produce only a subset (e.g., only Added + Fixed), the missing sections are filled with None. before the section transitions into CHANGELOG.md. Aligns compose to the documented changelog-body-check check-2 intent ("add each even if the body is 'None.'").

    Closes the compose-vs-check-2 divergence surfaced by the v0.30.0 rolling PR, which would otherwise block at cut-time via the compose-verify preflight. Idempotent: existing sections pass through verbatim; running twice produces identical output. Non-standard sections (e.g., a fragment producing ### Internal) are preserved after the standard set. No action required. Closes #453.

    • register-check: pivot to allowlist entry ([reviewer] 3682 catch)
    • tests: scrub chamber-names from compose-verify.bats fixture ([reviewer] 3680 Finding B)
    • compose-verify: fold review 3676 non-blockers (version-newest coupling + dry-run parity) [#446]

    Removed

    None.

    Deprecated

    None.

    Upgrade

    None.

    Downloads
  • v0.29.0 56bf27b44a

    Release v0.29.0
    Some checks failed
    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) Failing after 4s
    register-check / check (pull_request) Failing after 0s
    tests / bats (pull_request) Successful in 1m52s
    tests / shellcheck (pull_request) Successful in 7s
    check-self-bootstrap / check (push) Failing after 3s
    release / decide + act (push) Successful in 6s
    release / release (push) Successful in 0s
    tests / bats (push) Successful in 1m52s
    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 09:55:05 +02:00 | 1229 commits to main since this release

    Added

    Compose-time register-scrub on commit-subject → CHANGELOG bullets. Chamber-name attributions in commit subjects used to ride through cc_categorize_commits_since into CHANGELOG bullets past the register-check file-scan gate. The bullet is now scrubbed at emission — every REGISTER_PATTERNS match is replaced with [reviewer] — so the composed CHANGELOG is clean at source. The pre-existing register-check --stdin FATAL in release-prep.sh stays wired as a defense-in-depth layer for fragment-side drift the emission scrub doesn't cover. No action required. Closes #442.

    Fixed

    changelog-body-check now targets the newest versioned section instead of the empty [Unreleased] placeholder above it. On a composed CHANGELOG the transition step inserts the freshly-versioned [vX.Y.Z] section BELOW a still-empty [Unreleased] heading. The pre-fix check took the first ## [ and passed vacuously. The check now prefers the newest ## [vX.Y.Z] heading and falls back to [Unreleased] only when no versioned section exists. No action required. Closes #440.

    Fragment-vs-commit dedup now matches (closes #NNN) / (fixes #NNN) bullet formats. A CC bullet composed from a commit subject carrying (closes #NNN) / (fixes #NNN) / Closes #NNN. used to escape the trailer-only dedup and appear alongside its fragment prose.

    The dedup key is now a bare #NNN with a word-boundary guard. It catches every ref shape — trailer, bolded scope, inline close-verb, comma-separated multi-refs. #4380 still does not match fragment #438. No action required. Closes #441.

    • release-prep: Bundle 1 v0.28.1 must-fix — target section + dedup + register-scrub [#440 #441 #442]
    Downloads