• v0.42.0 baa31abad3

    v0.42.0
    All checks were successful
    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 24s
    manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
    manifest-check / check (pull_request) Successful in 0s
    register-check / register-drift check (pull_request) Successful in 7s
    register-check / check (pull_request) Successful in 0s
    tests / workflow-schema (pull_request) Successful in 3s
    tests / bats (pull_request) Successful in 18s
    tests / shellcheck (pull_request) Successful in 3s
    check-self-bootstrap / check (push) Successful in 5s
    go-ci / lint + build + test (push) Successful in 26s
    release / decide + act (push) Successful in 9s
    release / release (push) Successful in 0s
    tests / workflow-schema (push) Successful in 3s
    tests / bats (push) Successful in 18s
    tests / shellcheck (push) Successful in 3s
    goreleaser / build + publish rt asset (push) Successful in 1m20s
    mirror-on-cut / mirror-1 (release) Successful in 2s
    mirror-on-cut / mirror (release) Successful in 0s
    goreleaser / adopters can fetch the published asset (push) Successful in 3m5s
    Stable

    release-bot released this 2026-08-20 10:42:01 +02:00 | 777 commits to main since this release

    Added

    rt repin re-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-party uses: line, or a fork under another owner, is left alone.

    --dry-run reports what would change and writes nothing.

    • ci: ask the Forgejo engine whether it can parse the workflows (#769)

    Changed

    Port scripts/setup-bump-labels.sh to rt setup-bump-labels --owner <owner> --repo <repo>. Creates bump/{patch,minor,major} as an exclusive label group on a Forgejo repo; idempotent: already-correct labels are skipped, labels missing exclusive=true are updated. Adds ListLabels, CreateLabel, and UpdateLabel to the Forgejo client. Deletes the shell script.

    • Document the terminal bash-retirement state: scripts/fetch-rt.sh remains as the single bootstrap fetch-and-verify script because it obtains rt itself.
    • 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 #417 orphan 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 declared version_file no longer breaks the walk. The buried-prepare skip stays reachable, so a legitimate cut is not refused. #650 fixed this in release-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.bats now parses the workflow instead of scanning its raw lines.

    It previously skipped every comment line. That let release-toolkit#757 land the ${{ }} form inside a run: 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 survive yaml.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, not rt 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.

    findPRContainingSHA asserts 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.md now records that rt repin is not yet the canonical re-pin path.

    scripts/repin.sh still 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 at docs/architecture/contracts/cli-surface.md, and one comment already said so.

      TestCitedDocPathsResolve now 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