-
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 | 1094 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 | 1167 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 | 1182 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 | 1193 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 | 1197 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 | 1202 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
-
Release v0.30.2
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 1m55stests / shellcheck (pull_request) Successful in 7scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Successful in 6srelease / release (push) Successful in 0stests / bats (push) Successful in 1m55stests / shellcheck (push) Successful in 7smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 18:56:16 +02:00 | 1209 commits to main since this releaseAdded
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.shbakes 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 oldresolve-refstep emitted that value unconditionally as the checkout target;actions/checkout@v4then failed trying to fetch a not-yet-created tag.Each
resolve-refstep now scope-detects the consumer wrapper'suses:@<ref>value. When it ismain,REFis overridden tomainregardless 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_TAGvalue.@vX.Y.Zpins remain a frozen source-of-record per #336. Empirical anchor: v0.30.1 cut failed at7a1e63cb. No action required for adopters. Closes #460.Removed
None.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.30.1
StableSome checks failedchangelog-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 1m55stests / shellcheck (pull_request) Successful in 7scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Failing after 38srelease / release (push) Failing after 0stests / bats (push) Successful in 1m56stests / shellcheck (push) Successful in 8smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 16:34:07 +02:00 | 1212 commits to main since this releaseAdded
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/*.ymlpinuses:@maininstead of a versioned tag. Every push tomainruns against the current scripts substrate; no drift class can accumulate.Adopter behavior is unchanged. Adopters continue to pin
uses:@vX.Y.Zto a released tag. The cut-tag artifact retains its bakedBUILD_BAKED_TOOLKIT_REFvalue, so@vX.Y.Zremains a frozen source-of-record.Closes the shared substrate of the
fix-cut-bootstrap-through-own-gateclass. Class 1 (check-self-bootstrap firing red between cuts) closes via aPINNED_REF == 'main'early-exit incheck-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@mainstay 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Release v0.30.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 1m55stests / shellcheck (pull_request) Successful in 7scheck-self-bootstrap / check (push) Successful in 3srelease / decide + act (push) Successful in 6srelease / release (push) Successful in 0stests / bats (push) Successful in 1m55stests / shellcheck (push) Successful in 8smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 12:59:26 +02:00 | 1217 commits to main since this releaseAdded
Cut-time preflight verifies the composed CHANGELOG section is gate-clean before the release fires. A new
scripts/compose-verify.shruns at the top of thecutcase inreusable-release.yml. It scans the target section withregister-check --stdinandchangelog-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-bootstrapno 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.shnow scaffolds all 6 standard CHANGELOG sections in the composed body. When fragments produce only a subset (e.g., onlyAdded+Fixed), the missing sections are filled withNone.before the section transitions intoCHANGELOG.md. Aligns compose to the documentedchangelog-body-checkcheck-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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Release v0.29.0
StableSome checks failedchangelog-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) Failing after 4sregister-check / check (pull_request) Failing after 0stests / bats (pull_request) Successful in 1m52stests / shellcheck (pull_request) Successful in 7scheck-self-bootstrap / check (push) Failing after 3srelease / decide + act (push) Successful in 6srelease / release (push) Successful in 0stests / bats (push) Successful in 1m52stests / shellcheck (push) Successful in 8smirror-on-cut / mirror-1 (release) Successful in 1smirror-on-cut / mirror (release) Successful in 0sreleased this
2026-07-07 09:55:05 +02:00 | 1229 commits to main since this releaseAdded
Compose-time register-scrub on commit-subject → CHANGELOG bullets. Chamber-name attributions in commit subjects used to ride through
cc_categorize_commits_sinceinto 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-existingregister-check --stdinFATAL inrelease-prep.shstays 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-checknow 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
#NNNwith a word-boundary guard. It catches every ref shape — trailer, bolded scope, inline close-verb, comma-separated multi-refs.#4380still does not match fragment#438. No action required. Closes #441.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)