-
v0.46.1
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-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 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 2scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 23srelease / decide + act (push) Successful in 7srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 2sgoreleaser / build + publish rt asset (push) Successful in 1m18sgoreleaser / publish the rt image + bake its digest (push) Failing after 34sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Has been skippedreleased this
2026-08-26 09:49:30 +02:00 | 815 commits to main since this releaseAdded
None.
Changed
None.
Fixed
-
dead-script documentation: freeze the 32-name namespace and classify every documented site by temporal provenance or citation shape (#852)
-
release: record the published v0.46.0 cut in the manifest
-
changelog: shorten manifest boundary fragment
Removed
None.
Deprecated
None.
Upgrade
None.
Internal
-
manifest replay boundary: post-cut skips only when remote state records the cut head, so a current-run local manifest write cannot masquerade as prior-run bookkeeping (#862)
-
docker-build contract: fail release image jobs before Node-backed actions when runner capabilities are absent (#876)
Publish and verify now log paths and versions for git, Docker CLI/daemon, jq, and Node, with a positive Docker control. No consumer action is required.
-
release recovery: expose pending cut version and prepare commit as a blocked decision, preventing rolling updates until an operator completes or reverts the cut (#882)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.46.0
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 5scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 5sfragment-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 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 2scheck-self-bootstrap / check (push) Successful in 4sgo-ci / lint + build + test (push) Successful in 24srelease / decide + act (push) Failing after 7srelease / release (push) Failing after 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 2sgoreleaser / build + publish rt asset (push) Successful in 1m19sgoreleaser / publish the rt image + bake its digest (push) Failing after 0sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Has been skippedreleased this
2026-08-25 21:29:56 +02:00 | 824 commits to main since this releaseAdded
None.
Changed
-
Release orchestration: move stateful cut bookkeeping behind a typed
rtboundary (#862)Manifest transactions, self-workflow bake/re-pin, and cut-time push handoff now run through tested Go code while workflow-native wiring and fail-closed post-conditions remain in YAML.
Fixed
- release: satisfy post-cut lint contracts
Removed
None.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.45.1
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-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 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 7sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 25srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m31sgoreleaser / publish the rt image + bake its digest (push) Failing after 6sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Has been skippedreleased this
2026-08-25 18:41:16 +02:00 | 830 commits to main since this releaseAdded
None.
Changed
None.
Fixed
None.
Removed
None.
Deprecated
None.
Upgrade
None.
Internal
-
CI gates now consume measured standard runner images — missing bats, shellcheck, jq, or Graphviz fails loud instead of triggering runtime package installation (#863)
-
Release cuts now publish the digest-pinned action from the measured Docker-capable runner and hand the tagged action artifact to verification (#872)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.45.0
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 25smanifest-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 / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 23srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m16sgoreleaser / publish the rt image + bake its digest (push) Failing after 3sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Failing after 3sreleased this
2026-08-25 17:37:38 +02:00 | 835 commits to main since this releaseAdded
None.
Changed
-
contracts: enforce C6 section-header grammar against shipped changelogs (#799)
The Go contract test now checks level-3 section headers with an accept/reject control and refuses to grade a missing or empty section corpus.
Fixed
None.
Removed
None.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.44.2
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-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 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 4stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 23srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m18sgoreleaser / publish the rt image + bake its digest (push) Failing after 3sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Failing after 3sreleased this
2026-08-25 17:12:44 +02:00 | 839 commits to main since this releaseAdded
None.
Changed
None.
Fixed
rt manifest-prskips assigning the manifest PR to a configured bot identity, retainingrelease-botas the default (#722)
Removed
None.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.44.1
StableSome checks failedchangelog-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 / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 24smanifest-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 / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 9stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 24srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m23sgoreleaser / publish the rt image + bake its digest (push) Failing after 4sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Failing after 4sreleased this
2026-08-25 16:58:42 +02:00 | 843 commits to main since this releaseAdded
None.
Changed
None.
Fixed
-
changelog-body-check: reject duplicate version sections across the full changelog (#791)
The gate reports the competing version lines; repeated kind headers remain scoped to the newest release section.
-
rt repinrecovers cleanly from a failed tag push by publishing the detached bake directly and naming remote verification before retry (#796)
Removed
None.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
-
v0.44.0
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 24smanifest-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 7sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 6sgo-ci / lint + build + test (push) Successful in 24srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 5stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m18sgoreleaser / publish the rt image + bake its digest (push) Failing after 3sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Failing after 3sreleased this
2026-08-25 12:02:46 +02:00 | 849 commits to main since this releaseAdded
None.
Changed
Duplicate-version refusal: the
## [vX.Y.Z] already presenterror now names what it did NOT check.It detects a duplicate heading and nothing more. The tag may exist. The release may have published. The section's body may be incomplete. None of that is verified.
Its "did not tag it" clause names a likely cause, not a measured one — a hand-edited CHANGELOG reaches the same state.
Applied at both emit sites together (#833, #659).
Fixed
Release prep: a second prep run for a version already in the changelog now merges into that section instead of refusing the cut.
The transition transforms
## [Unreleased]into a version heading. It never scanned for an existing one, so a second run emitted a duplicate.Refusing would strand real content. The second run's Unreleased holds everything accrued since the first. Merging keeps both sets, and
None.placeholders drop out.The existing heading keeps its date, so a tagged section is never restamped (release-toolkit#665).
Fixed: the four PR-CI gates now build
rtfrom the commit under test, not frommain.Each gate checks the toolkit out a second time. That checkout resolves to
mainunder the #456 floating-pin override. So a PR that changed a gate was graded bymain's copy of it — the gate under test was never the gate that ran.The build arm now sources from the consumer checkout when it carries
cmd/rt. That is the PR itself when the toolkit runs its own CI.The adopter path is unchanged. An adopter has no
cmd/rtin its workspace, so it still fetches a published asset and needs no Go toolchain.Code comments:
internal/fragments/fragments_test.gono longer namesfragments.shas the byte-authority for the changelog-kind order.That script went with the bash PR-CI gates (#607).
Kindsis the authority now; the port's origin stays in the past tense.Found by re-deriving
#734's scope during its AC sweep. It fixed five scripts.fragments.shwas not among them — the floor its own AC warned about.register-check now covers the complete built-in chamber vocabulary.
Docs: thirteen sites named a retired script as the present-tense actor for behaviour that still happens.
rt repinandrt check-self-bootstrapdo the work now, including the glossary's definition of "re-pin" and two table cells citing line numbers inside a file that no longer exists.The behaviour was never wrong; only the actor was. That is why a tense sweep misses them — a reader asking "is this still true?" gets yes.
Corrected five code comments that justified best-effort error handling by claiming the cut had already published.
The code they annotate never reads
publish_mode. The claim was false under the olddraftdefault and true again underimmediate, while the reasoning it supports never depended on either. The justification is now that the release object exists, which holds under both.Contracts + workflow comments: four contract documents named a deleted
scripts/lib/*.shfile as their byte-authority. The Go packages are the authority; the bash origin stays in the past tense.C4, C6 and C7 now point at
internal/fragments,internal/changelogandinternal/forgejo.fragment-format.mdalso claimed the contract validates "both substrates" — there is one.reusable-release.ymlhad two: a pointer to a deleted file, and a sentence asserting otherscripts/libsources still exist. None do.fetch-rt.sh's HTML guard now removes the page it rejected before exiting.Previously the page stayed on disk. That was harmless on the default path, where the work dir is a throwaway
mktemp -d. WithRT_INSTALL_DIRset it was not. That directory is the adopter's persistent#606cache, so the rejected page sat there under the release asset's own name.The artefact is removed, never the directory. A blanket cleanup would delete the cache
#606exists to keep.rt repinandrt consumer-wrappersnow discover.forgejo/workflows/*.yamladopter wrappers, not only*.yml.This forge executes both extensions. A
.yamladopter was invisible toDiscover, so the re-pin rewrite silently did nothing rather than failing.The
.yml-only filter was inherited from the bash oracle (scripts/lib/wrappers.sh) and faithfully ported at#705. The port was correct; the oracle was wrong.Docs:
docs/events-logging.mdhad a Go heading over a bash body. The call signature, thejqescaping, theevent_emitreturn contract and thedeclare -Fguard all described the retired shell layer.The deeper defect was the opening sentence. It said the toolkit emits events during the cut path. It does not:
rt check-self-bootstrapis the only command that emits anything, and the taxonomy table listed seven kinds as "currently emitted" when one is.That retirement was deliberate and reasoned, recorded in
internal/decide. The guide now says so instead of describing behaviour a reader will not observe.Updated live Forgejo integration and architecture documentation after the shell client retirement; historical provenance remains, and deleted-file line coordinates are no longer presented as current anchors.
- register: genericize newly matched reviewer credits
Removed
None.
Deprecated
None.
Upgrade
None.
Internal
Added positive and negative Go tests for register-check allow-list glob semantics, including wildcard and recursive directory behavior.
Removed the 55 changelog and config fixtures left orphaned when their equivalence suites were retired.
Strengthened the workflow bake-list regression guard to count each reusable on both runtime staging loops, preventing prose occurrences from masking a missing loop entry.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.43.0
StableSome checks failedchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-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 6smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 6sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 7stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 24srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 7stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m25sgoreleaser / publish the rt image + bake its digest (push) Failing after 3sgoreleaser / adopters can pull the published image (push) Has been skippedgoreleaser / adopters can fetch the published asset (push) Failing after 3sreleased this
2026-08-21 21:20:56 +02:00 | 876 commits to main since this releaseAdded
- release: publish the rt image and verify adopters can pull it
- rt: bake-digest — the cut-time rewrite #794's coupling depends on
- action: docker action, digest-pinned — the verified half of #794
- prep: mirror the density verdict into the rolling PR description
Changed
Docs:
branch-strategy.mdandtest-strategy.mdno longer describe the retired two-line model in the present tense.Both already carried supersession notes. Both still opened with prose asserting the
v2.x/v2/nextplan as current or targeted. A header saying "superseded" does not reach a reader who starts at the first paragraph.branch-strategy.mdnow says which part survives: the single-thread cut model in §1 is still how the toolkit cuts. The multi-thread target never shipped.scripts/repin.shandscripts/lib/forgejo-api.share retired.rt repinreplaces them.The re-pin is now a Go verb. It validates the rc tag, builds the detached bake, then mints and pushes it. It rewrites each wrapper's pin, commits in a throwaway worktree, and opens the PR.
Run
rt repin <vX.Y.Z-rc.N>.AGENTS.md§2.5 documents it.⚠️
--dry-rundiffers from the retiredREPIN_DRY_RUN=1. The bash built the detached bake so it could be inspected. The Go reports the plan only.-
contracts: fold
validate-grammars.shinto the Go test suite (#777)The C4 and C6 grammars are now validated by
go test, on every PR. The shell script was invoked by no workflow, so these grammars had never run under CI.TestC4AgainstHistoricalCorpuschecks every fragment filename in git history.TestC6AgainstShippedChangelogchecks every heading in the shipped changelog. Each carries accept/reject controls so a grammar that accepts everything cannot produce a clean scan.An empty corpus fails rather than skipping. A skip prints
okand exits 0, which a gate cannot distinguish from a pass.
The architecture docs now say how much bash remains, not how many
.shfiles.One
.shfile is left —fetch-rt.sh, 171 lines. A further 1315 lines live in workflowrun:blocks across 12 files.reusable-release.ymlalone carries 798.That bash is deliberately out of the retirement's scope. The port's subject was the script layer, not every shell command in CI. The judgement was never written down, so the docs read as if the bash were gone.
⚠️ "No bash files" and "no bash" are different claims. Only the first is true.
rt:
rt --versionnow carries build provenance. A source build reportsdev (<sha>), ordev (<sha>, dirty)on a modified tree, read from Go build info. A goreleaser build still reports its tag unchanged. Previously any untagged build printed the bare stringdev, so a stale binary and a broken gate were indistinguishable in CI output (closes part of #792).The
release-toolkitaction is now a docker action pinned by image digest.There are no inputs.
version:andtoken:are gone. The action ref alone determines the binary, so the two can no longer disagree.A workflow still passing them keeps working. Actions ignores an undeclared input, so nothing breaks — the binary comes from the action ref instead.
Run the action after
actions/checkout. It installs under$GITHUB_WORKSPACE, which a later checkout wipes.Release cuts publish automatically again.
publish_modenow defaults toimmediate, reverting the#332change that madedraftthe default.draftstill works and is unchanged. Set it viaRT_PUBLISH_MODE, thepublish_mode:field inrelease-toolkit.yml, or the workflow input. The cut then creates the release unpublished, for a manual Publish click.Fixed
Docs: four PR-CI gates carried a comment asserting that the
@mainbootstrap path builds the commit under test. It buildsmain.The gates check the toolkit out a second time, and that checkout resolves to
main. So a PR that changes a gate is graded bymain's copy of that gate (#728). Three of the four stated the opposite inside an otherwise-correct explanation of the cache decision; the fourth said it in different words.That explanation's real job — why version-tag refs are the only cacheable ones — was right and is unchanged. The false clause sat beside it as an aside, so a reader auditing the caching had no reason to check it.
Comments only. No gate behaviour changes. The mechanism itself is #728 half B.
The workflow parse check now covers every workflow file.
It globbed
reusable-*.yml, so it graded 5 of 16. A syntax error in any of the other 11 went unseen.That failure is silent by nature. A workflow which does not parse produces no run at all: no red, no status, nothing to investigate.
Docs:
secrets: inheritis required, not recommended. Omitting it is associated with a release PR that receives no CI at all.Measured across all four known adopters. The one repo that omits the line is the one whose rolling release PR has never received a single
pull_requestrun.The PR still opens and still reads mergeable. Nothing goes red, because nothing runs, and a PR with zero checks looks like one whose checks passed.
⚠️ The guide said "omitting
inheritdegrades benignly" and labelled the line# recommended. One adopter followed that. Why it happens is not yet settled.Docs:
arc42/07 §7.5andarc42/05no longer describe the Codeberg mirror as a live surface.#803deleted both mirror workflows and left the deployment view asserting them in the present tense.§7.5is kept as a dated what-was record rather than removed — the mirror was one of the two deployment-side concerns §7 exists to name. ItsSubstrate-verified (2026-07-08)anchor is untouched: that line is a true past-tense record and stays.arc42/05listedreusable-mirror-to-codeberg.ymlas a current adopter-visible building block. The live listing now matches the five reusables on disk, with the retired sixth named explicitly so a reader can tell retired from undocumented.Docs:
README.mdanddocs/integration.mdno longer open by calling release-toolkit "Codeberg-primary".#793retired the mirror; both documents went on asserting Codeberg as the project's source, release and tag surface.The replacement states what is measurable: release-toolkit is developed on a self-hosted, LAN-only Forgejo and has no public mirror. Codeberg does not accept code that is largely LLM-generated, and a public mirror waits until there is adoption to serve.
Codeberg as a platform for your repository is unaffected, and the docs now say so explicitly rather than leaving a reader to infer it. The 2026-07-05 companion demo is stated as a dated demonstration rather than a live guarantee — no CI arm here exercises a Codeberg target.
docs/integration.mdalso linkedreusable-mirror-to-codeberg.yml, a file deleted in#803.The workflow parse check now asserts its own coverage, not just its verdict. It previously looped a glob and printed OK. Grading 16 files and grading 5 produced byte-identical output, so narrowing the glob reddened nothing.
It now counts what it parsed and compares that against an independent enumeration. Both sides cover
*.yamlas well as*.yml, because this forge loads both — an unparseable.yamlworkflow was invisible to the check.- changelog: split two over-long sentences in the #728 fragment
- changelog: SectionContent distinguishes a MISSING section from an empty one
- tests: restore main's parse arm verbatim — my own fix reverted more of #812
Removed
The Codeberg mirror is retired.
mirror-on-cut.ymlandreusable-mirror-to-codeberg.ymlare deleted.Codeberg rejects code that is largely LLM-generated. No mirror replaces it. A public mirror waits until there is adoption to serve.
Adopters who forked either workflow keep working — nothing here reaches a fork.
⚠️ The shape those files used is still right for any future mirror: a separate
release: publishedworkflow, never an in-graphmirror:job. An in-graph job trips Forgejo Actions' schema validator.The mirror had fired on every cut since 2026-08-17. Ten runs, all reporting success, against a repository that does not exist.
Deprecated
None.
Upgrade
None.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.42.0
StableAll checks were successfulchangelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6scheck-self-bootstrap / check (pull_request) Has been skippedchangelog-body-check / check (pull_request) Successful in 0sfragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4sfragment-check / changelog fragment-kind (pull_request) Successful in 6sfragment-check / check (pull_request) Successful in 0sgo-ci / lint + build + test (pull_request) Successful in 24smanifest-check / manifest-vs-tag consistency (pull_request) Successful in 7smanifest-check / check (pull_request) Successful in 0sregister-check / register-drift check (pull_request) Successful in 7sregister-check / check (pull_request) Successful in 0stests / workflow-schema (pull_request) Successful in 3stests / bats (pull_request) Successful in 18stests / shellcheck (pull_request) Successful in 3scheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 26srelease / decide + act (push) Successful in 9srelease / release (push) Successful in 0stests / workflow-schema (push) Successful in 3stests / bats (push) Successful in 18stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m20smirror-on-cut / mirror-1 (release) Successful in 2smirror-on-cut / mirror (release) Successful in 0sgoreleaser / adopters can fetch the published asset (push) Successful in 3m5sreleased this
2026-08-20 10:42:01 +02:00 | 925 commits to main since this releaseAdded
rt repinre-pins consumer wrappers to a release-candidate tag.It refuses a dirty tree or an existing tag. It builds the detached bake commit at the requested base, then mints and pushes the rc tag on it. It rewrites each wrapper's
uses:@<ref>, commits in a throwaway worktree, pushes and opens the PR.The rewrite is ported verbatim from
repin.sh. A third-partyuses:line, or a fork under another owner, is left alone.--dry-runreports what would change and writes nothing.- ci: ask the Forgejo engine whether it can parse the workflows (#769)
Changed
Port
scripts/setup-bump-labels.shtort setup-bump-labels --owner <owner> --repo <repo>. Createsbump/{patch,minor,major}as an exclusive label group on a Forgejo repo; idempotent: already-correct labels are skipped, labels missingexclusive=trueare updated. AddsListLabels,CreateLabel, andUpdateLabelto the Forgejo client. Deletes the shell script.- Document the terminal bash-retirement state:
scripts/fetch-rt.shremains as the single bootstrap fetch-and-verify script because it obtainsrtitself. - ADR-0009 and the architecture docs now name the delivery-mechanism change that would retire the residual. The stale ADR-0007 VERSIONING link is also fixed.
Fixed
decide:
rt decide's#417orphan walk now discriminates release plumbing from adopter work by file scope, not commit type. A bump-worthy commit touching only the changelog, the manifest or a declaredversion_fileno longer breaks the walk. The buried-prepare skip stays reachable, so a legitimate cut is not refused.#650fixed this inrelease-decide.sh, which was retired before the fix reached Go — it had been shipping on no surface at all (closes #701).Arm 30 in
tests/workflows.batsnow parses the workflow instead of scanning its raw lines.It previously skipped every comment line. That let release-toolkit#757 land the
${{ }}form inside arun:block comment, where the expression engine reads it before bash sees the#, and every cut was blocked.Skipping nothing over-corrects: a
#at YAML level, or inline on a plain scalar, is stripped by the parser and is safe. The arm now walks the string scalars that surviveyaml.safe_load, which is the text the engine sees.-
Add an erratum to the v0.37.1 changelog entry whose file-scope orphan discriminator shipped only in
scripts/release-decide.sh, notrt decide. -
gates: exemptions carry an occurrence quota, not a boolean (#772)
-
changelog.d: 772 fragment described the rule the previous commit removed
-
gates: backticks cannot exempt a citation — narrow to a measured allowlist (#772)
-
setup-bump-labels: S1016 type conversions + ADR-0009 ancillary bucket
-
rt: repin never writes the operator's checkout, on any path
-
rt: repin mints the tag it demands be absent, and stops writing on --dry-run
-
tests: arm 30 parses the workflow rather than scanning raw lines
Removed
None.
Deprecated
None.
Upgrade
None.
Internal
The #690 membership fallback's bounded window now has a negative arm.
findPRContainingSHAasserts in its own comment that a prepare outside the window resolves to not-found and Layer 2 fails. Nothing exercised that: every membership arm placed the containing PR inside the window, so the bound could not fail where those arms ran.A widening window would turn a stale prepare into a spurious cut — worse than the false refusal #690 fixed, because a refusal gets investigated.
AGENTS.mdnow records thatrt repinis not yet the canonical re-pin path.scripts/repin.shstill implements the operation and the docs correctly name it canonical. The verb ships but nothing invokes it, and its forge path has never run against a real forge.The note is removed when #705 part B retires the script.
-
docs: repoint four Go comments at the real cli-surface contract path, and make the citation checkable (#772)
Four comments cited
contracts/cli-surface.md, which resolves from nowhere. The file is atdocs/architecture/contracts/cli-surface.md, and one comment already said so.TestCitedDocPathsResolvenow checks every repo-relative Markdown path cited in a Go comment. Two sites quote an unresolvable path as evidence; both are named in an explicit allowlist.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.41.0
StableAll checks were successfulcheck-self-bootstrap / check (push) Successful in 5sgo-ci / lint + build + test (push) Successful in 27srelease / decide + act (push) Successful in 8srelease / release (push) Successful in 0stests / bats (push) Successful in 18stests / shellcheck (push) Successful in 3sgoreleaser / build + publish rt asset (push) Successful in 1m17smirror-on-cut / mirror-1 (release) Successful in 2smirror-on-cut / mirror (release) Successful in 0sgoreleaser / adopters can fetch the published asset (push) Successful in 3m5sreleased this
2026-08-20 02:52:33 +02:00 | 950 commits to main since this releaseAdded
rt consumer-wrappersnow owns consumer-workflow discovery, and the release workflow uses it instead of sourcing the Bash helper.Changed
rt manifest-postconditionnow resolves the manifest-PR surface itself when--pr-stateis unset.reusable-release.ymlno longer sourcesscripts/lib/forgejo-api.sh; the flag is still honoured.Resolution fails closed. A lookup that cannot complete yields
ungraded(exit 2), neverabsent(exit 1).This also closes a pagination hole. The old query read only the first 50 open PRs, so a busy repo could report
absentwhile a manifest PR existed.rt binary-size-checkreplacesscripts/binary-size-check.sh(rt#720, bash retirement arc). Exit codes are tri-state: 0 pass, 1 step change exceeded, 2 could not grade. Flags--max-growth-pct,--baseline-bytes, and--attribute-refare identical to the shell script. On a red, the merge-base attribution block is included.go-ci.ymlcallsrt binary-size-checkdirectly; the shell script is deleted.rt check-self-bootstrapnow owns pin-drift detection. The Bash script and its two private libraries are retired, andforgejo-api.shno longer emitsapi_callevents.rt prepnow re-pins adopter-facing doc refs as a built-in step (rt#720, bash retirement arc).scripts/hooks/update-doc-version-refs.shis deleted; the same rewrite logic runs as§8d UpdateDocVersionRefsinsidert prep— no consumer config change required.release-toolkit.ymlno longer lists the hook inpost_bump_hooks. Thepost_bump_hooksmechanism itself is retained for adopters.Fixed
- release: an expression spelled out in a run-block comment made reusable-release.yml unusable (#762)
Removed
None.
Deprecated
None.
Upgrade
None.
Internal
-
build-bake: retire the bash marker-rewrite library.
No action required.
rt build-bakenow owns the post-cut marker reset and the re-pin detached bake path, preserving the existing tree semantics while removing the duplicated sed implementation. -
code comments: stop naming deleted bash scripts as the current authority (#734)
Fifteen Go files carried comments asserting that a removed script is the byte-authority or behaviour-of-record. Provenance statements are kept in the past tense; role assignments now name the Go package as the authority. No behaviour change.
-
forgejo-api.sh: correct the layer-2 comment — the documented fallback is the only path (#737)
config.shwas removed in #712, soconfig_get_default_branchis never defined and the inlineyqread is all that runs. The comment named the dead branch as the common case. Code unchanged. -
rt: derive the subcommand phase census instead of hand-writing it twice.
No action required. The comment above
var subcommandsnamed five Phase 6, six Phase 6b and three Phase 7 verbs. The slice holds 5 + 8 + 4 + 1, and Phase 8 was missing.TestAllSubcommandsPresentnow derives the breakdown, so its failure message names the phase that moved. The comment carries no counts. The total stays hand-written: it is the gate, and a new verb should cost a deliberate bump.
Prune the orphaned
internal/bake/testdatafixture corpus left behind when the differential bake oracle was retired.Delete
scripts/dev-tools/migrate-releases-to-codeberg.sh(0 callers, one-time historical mirror script) andscripts/lib/wrappers.sh(superseded byinternal/wrappers/discover.go;scripts/repin.shrepointed tort consumer-wrappers). Deletetests/wrappers.batsalongsidewrappers.sh; equivalent coverage lives ininternal/wrappers/discover_test.go.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads