• v0.43.0 e6b57ce057

    v0.43.0
    Some checks failed
    changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
    check-self-bootstrap / check (pull_request) Has been skipped
    changelog-body-check / check (pull_request) Successful in 0s
    fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
    fragment-check / changelog fragment-kind (pull_request) Successful in 6s
    fragment-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 6s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 6s
    register-check / check (pull_request) Successful in 0s
    tests / workflow-schema (pull_request) Successful in 3s
    tests / bats (pull_request) Successful in 7s
    tests / shellcheck (pull_request) Successful in 3s
    check-self-bootstrap / check (push) Successful in 5s
    go-ci / lint + build + test (push) Successful in 24s
    release / decide + act (push) Successful in 8s
    release / release (push) Successful in 0s
    tests / workflow-schema (push) Successful in 3s
    tests / bats (push) Successful in 7s
    tests / shellcheck (push) Successful in 3s
    goreleaser / build + publish rt asset (push) Successful in 1m25s
    goreleaser / publish the rt image + bake its digest (push) Failing after 3s
    goreleaser / adopters can pull the published image (push) Has been skipped
    goreleaser / adopters can fetch the published asset (push) Failing after 3s
    Stable

    release-bot released this 2026-08-21 21:20:56 +02:00 | 728 commits to main since this release

    Added

    • 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.md and test-strategy.md no 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/next plan as current or targeted. A header saying "superseded" does not reach a reader who starts at the first paragraph.

    branch-strategy.md now 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.sh and scripts/lib/forgejo-api.sh are retired. rt repin replaces 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-run differs from the retired REPIN_DRY_RUN=1. The bash built the detached bake so it could be inspected. The Go reports the plan only.

    • contracts: fold validate-grammars.sh into 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.

      TestC4AgainstHistoricalCorpus checks every fragment filename in git history. TestC6AgainstShippedChangelog checks 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 ok and exits 0, which a gate cannot distinguish from a pass.

    The architecture docs now say how much bash remains, not how many .sh files.

    One .sh file is left — fetch-rt.sh, 171 lines. A further 1315 lines live in workflow run: blocks across 12 files. reusable-release.yml alone 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 --version now carries build provenance. A source build reports dev (<sha>), or dev (<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 string dev, so a stale binary and a broken gate were indistinguishable in CI output (closes part of #792).

    The release-toolkit action is now a docker action pinned by image digest.

    There are no inputs. version: and token: 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_mode now defaults to immediate, reverting the #332 change that made draft the default.

    draft still works and is unchanged. Set it via RT_PUBLISH_MODE, the publish_mode: field in release-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 @main bootstrap path builds the commit under test. It builds main.

    The gates check the toolkit out a second time, and that checkout resolves to main. So a PR that changes a gate is graded by main'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: inherit is 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_request run.

    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 inherit degrades benignly" and labelled the line # recommended. One adopter followed that. Why it happens is not yet settled.

    Docs: arc42/07 §7.5 and arc42/05 no longer describe the Codeberg mirror as a live surface. #803 deleted both mirror workflows and left the deployment view asserting them in the present tense.

    §7.5 is kept as a dated what-was record rather than removed — the mirror was one of the two deployment-side concerns §7 exists to name. Its Substrate-verified (2026-07-08) anchor is untouched: that line is a true past-tense record and stays.

    arc42/05 listed reusable-mirror-to-codeberg.yml as 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.md and docs/integration.md no longer open by calling release-toolkit "Codeberg-primary". #793 retired 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.md also linked reusable-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 *.yaml as well as *.yml, because this forge loads both — an unparseable .yaml workflow 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.yml and reusable-mirror-to-codeberg.yml are 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: published workflow, never an in-graph mirror: 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