chore(release): v0.42.0 #775
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!775
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "release-prep/rolling"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Added
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 afork under another owner, is left alone.
--dry-runreports what would change and writes nothing.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.scripts/fetch-rt.shremains as the single bootstrap fetch-and-verify script because it obtainsrtitself.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 scanningits raw lines.
It previously skipped every comment line. That let release-toolkit#757 land the
${{ }}form inside arun:block comment, where the expression engine readsit before bash sees the
#, and every cut was blocked.Skipping nothing over-corrects: a
#at YAML level, or inline on a plainscalar, 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, 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 thewindow 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 itcanonical. 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.484bee0f2b5071a8c6df5071a8c6dfa7cff31e4ca7cff31e4c2f99a4c7222f99a4c7226a2dd991a56a2dd991a5b21fc6aae6b21fc6aae616b1902d9516b1902d95c9d77179f5c9d77179f57183b055627183b05562baa31abad3APPROVED — the cut artifact is sound. Two findings, neither blocking, and one of them corrects the stated reason for cutting now.
🔴 #788 is NOT exercised by this cut
@bosun's rationale was "merging #775 fires mode=cut, so THIS CUT IS THE FIRST REAL EXERCISE OF #788 on the cut path." It isn't, and the reason is structural rather than incidental.
checkOrphanChangelogwalks(last_sha, HEAD]newest-first (decide.go:340;logHashSubjectis documented as newest-first and is not--first-parent). Row 1 of that walk is HEAD itself:Row 1 matches at
:341,v == topVersion(0.42.0 is the CHANGELOG's top section), and it returnsnilat:344.touchesOnlyReleaseFiles— #788's restored file-scope discriminator — lives at:354, inside thereleaseRelevantbranch the walk never reaches.Confirmed in the run:
orphan-check skipped: prep-PR merge for v0.42.0 in walk since manifest (cut-about-to-fire).⚠️ The absence of a
touchesOnlyReleaseFileslog line is NOT my evidence — that function contains zerologfcalls, so absence proves nothing there. The argument is the early return, which is decisive on its own.When would it be exercised? Only when a release-relevant commit sits above the prepare commit in the walk — a buried prepare, the #259 shape. On a clean cut where the prep merge is HEAD, the walk short-circuits on the first row. So this cut is the case that cannot test it. That does not argue against cutting; it argues against the discharge claim.
⛔ COULD NOT GRADE: mode=cut vs mode=update
I ran
rt decide --dry-runagainst a detached worktree atbaa31aba— a faithful post-merge simulation, sincedefault_merge_style=fast-forward-onlyand the PR isbehind=0/ahead=1, so main becomes exactly this SHA.It reported
mode=update. I am not reporting that as a finding, because the instrument cannot produce the other answer:--dry-run's own help says "cut-safeguard layers skip". Both known-successful cuts produce the identicalLayer 2=fail → falling through to mode=updatesignature, so--dry-runcan never reportcutand my run says nothing about the real mode. A could-not-grade, not a red.✅ What it DOES establish, and it is the half you asked about:
Layer 1 (subject-regex) MATCH: version=0.42.0.rt decideidentifies HEAD as the rolling-PR merge correctly, with a signature byte-identical to two known-good cuts. The mode itself is decided by Layers 2/3, which need forge calls and are only gradeable in CI.① The composed section
Largest of the recent three, proportionate to 9 fragments. Nothing near a ceiling.
Nit, and it is the seam your note predicted: two consecutive-blank-line runs sit exactly where fragment-derived prose meets commit-derived bullets (
### Addedbefore- **ci**:,### Fixedbefore- **gates**:). Cosmetic, and it is the join no fragment can show you because the bullets do not exist until compose time.② The erratum reads correctly
One occurrence, correctly placed as a blockquote inside v0.37.1's
### Fixed, directly beneath the file-scope-discriminator paragraph it corrects. Not moved, not duplicated. The v0.42.0 bullet announcing it is a separate line in this section's### Fixed, which is the right split: the announcement lives in the new section, the correction lives in the past one.Pre-existing, named so it does not read as new
## [v0.17.0] - 2026-06-28appears TWICE (lines 1376 and 1388). Present onorigin/mainand on this head — 0 diff lines mention v0.17.0, so this cut neither introduced nor touched it. Worth a follow-up: the duplicate-header check is green with a duplicate in the file, so it is scoped to the new section rather than file-wide. Requesting a tracker rather than filing one.NOT checked: whether the release actually publishes; whether Layers 2/3 resolve the rolling PR in CI (unreachable locally); and the prose accuracy of the nine fragments' claims, which were reviewed on their own PRs.