-
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 | 728 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