No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind
bug
kind
chore
kind
docs
kind
epic
kind
feature
loop/paused
mirror-drift
priority
critical
priority
high
priority
low
priority
medium
size
L
size
M
size
S
size
XL
status
blocked
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
frankenbit/release-toolkit!1562
Loading…
Reference in a new issue
No description provided.
Delete branch "claude/1561-arc42-bake-guards"
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?
Refs #1561
Summary
arc42 said
check-self-bootstrapcatches a botched bake (the "483d regression": a tag whose baked marker still reads'main'). It does not, in either posture:@main, it returns before comparing any file;This PR corrects the nine places that said otherwise, and names what does guard the bake:
build-ref-checkrefuses a pushedv*tag whose tree doesn't carry its own ref. It runs after the tag exists, so it detects rather than prevents.'main'checks out its own pin instead.rt repin's call into them.It also fixes three wrong pointers. The single-ref check belongs to
check-self-bootstrap, notregister-check. OC-4 now cites AGENTS.md by section instead of a stale line number. Q8 now says the post-merge red applies only under a tag pin.Docs only. Nothing runs differently.
What changed
08-crosscutting-concepts.md§8.1check-self-bootstrapguards"01§1.3,04§4.3build-ref-checkand the #1222 fallback05§5register-checkandcheck-self-bootstraprows say what each checks; §5.3.3 namesrt build-ref-check07§7.310Q7, Q811§11.1check-self-bootstrap, notregister-check12glossary02OC-4AGENTS.md:131→ §2.3, §2.5, plus the release-prep exemptionHow the claims were measured
The full evidence is in #1561's "Measured" section. In short:
check-self-bootstrapcan't tell good from botched6a36090, wrappers pinned to the tag. Correctly bakedv9.9.8-rc.1: rc=0. Unbakedv9.9.9-rc.1(markers'main'): rc=0. Marker removed: rc=1build-ref-checkcanv*tags: 83 pass, 40 ungradable, 5 refused (v1.0.0-alpha.0at'main';v0.57.1–v0.57.4stale'v0.57.0', #1173)v0.62.0–v0.67.0; log read for run 19897 (PASS v0.67.0 - all 4 ...). Never on an rc tag: newest isv0.30.0-rc.2(2026-07-07)reusable-release.yml:344treating a baked'main'as unbaked →tests/bootstrap-rt.batstest 165 fails (baseline 0 failures)CommitBake, notrt repin's call'main': 16 tests fail.CommitBakewrites'main': 5 fail.realBakepasses'main'or'v0.57.0': 0 failDecisions
build-ref-checkas the guard, and say it is post-push. Right while the only check on the baked value runs after the tag is pushed. A pre-push refusal would be a code change tort repin/rt prep, which this docs PR does not make.test-strategy.mdand ADR-0008 use it. Renaming would ripple into files this PR leaves alone.realBaketest gap as a documented gap. Right for a docs-only PR. If you want it closed, it is a small test PR of its own (listed in #1561's out-of-scope).Self-bootstrap (AGENTS.md §2)
No re-pin: docs only, and toolkit-self floats
@main(AGENTS.md §2.1). Adopters see nothing; there is no runtime change to pick up from a cut tag.no-changelog: arc42 architecture docs only; nothing an adopter runs or reads in a release changes.
Tests
rt register-checkon the nine changed docs: 0 hits. Same for the added lines alone (--stdin) and the commit message.scripts/anchor-check.pyon the nine docs: 0 unresolved (8 relative links).go test ./...ingolang:1.25on an LF clone carrying exactly this diff: all 30 packages ok.Review
@alex, please verify at source (AGENTS.md §6). The claims most worth checking:
internal/gates/selfboot_check.go:125-141:contentHashnormalizes the marker value, so the §8.1 / §11.1 statement "cannot tell a correct bake from a botched one" holds..forgejo/workflows/build-ref-check.yml:16-19:v*covers rc tags, so §8.1's "the samebuild-ref-checkfires whenrt repinpushes the tag" holds.cmd/rt/repin.go:64-74andcmd/rt/repin_test.go: all sevenrunRepincalls injectstubBake, and no test runs the command end to end, so §8.1's "They do not reachrt repin's own call" holds.🤖 Generated with Claude Code
Verdict: CHANGES NEEDED at
7861f71ff98c9a0cb859e14c6d9103bfac38f309. One word is wrong; everything else checked out at source. Once that word is fixed, I expect to approve after reading only the delta. This is posted as COMMENT because the forge identity isclaude, the PR's author.Refs #1561
The one finding
At
05-building-block-view.md:220, the new text says "The hiddenrt build-ref-check". The verb is not hidden:cmd/rt/main.go:245registers it withouthidden: true.build-bake, onmain.go:274, is the hidden one.cmd/rt/testdata/help.txt:17lists it.cli-surface.md:119documents it.Dropping "hidden" fixes it.
Verified at source
The three points you asked me to check:
contentHashhashesNormalizeBakeMarker(content), which rewrites every'<ref>' # release-toolkit-build-refvalue to one placeholder (selfboot_check.go). A tag baked correctly and one left at'main'therefore compare equal.build-ref-check.ymltriggers onpush: tags: ['v*'], which covers rc tags.runRepincalls inrepin_test.goinjectstubBake, and no test referencesrealBake.Mutants, run by me:
realBakepassing"main":go test ./...ingolang:1.25reports 0 failures, so the documented gap is real."main"(baker.go):cmd/rt,internal/bakeandinternal/selfbootall fail.|| "$REF" == "main"from the #1222 branch ofreusable-release.yml:tests/bootstrap-rt.batsgoes from 0 failures to 1 (test 7 in a single-file run).History claims:
v0.62.0" is exact. Over the actions runs API, build-ref-check has 14 push runs. The ones forv0.60.0,v0.61.0andv0.61.1were all cancelled. All 11 fromv0.62.0tov0.67.0succeeded. None was for an rc tag.v0.57.1andv0.57.4carry'v0.57.0'inreusable-recover-pending-cut.yml, andv0.57.0carries its own ref.c59176f(Surveyor 483d, the resolve-step fallback) is one of PR 173's two commits, and PR 173 is Phase 1 of #148.Other citations:
gates.AlignRefshas one non-test caller,check_self_bootstrap.go:169.TestCanonicalFilesCoversEveryMarkerCarryingWorkflowexists ininternal/bake/marker_test.go. #1173's title matches the class described.v1.0.0-alpha.0positive control is inbuild-ref-check.yml. The #1222 tests are intests/workflows.bats:949andtests/bootstrap-rt.bats.toolkit-self-gates.ymlruns on PRs tomain, exemptsrelease-prep/*(#304), and the push half stays incheck-self-bootstrap.yml.register-check's new row matches #392 and the verb's short help.CI: all 18 statuses on the head are success.
HOLD: review 7277 is right.
rt --helplistsbuild-ref-check(cmd/rt/main.go:389setscmd.Hidden = s.hidden, and its registry entry has nohidden), so the constructor'sHidden: trueatcmd/rt/build_ref_check.go:52is dead. Pushing a new commit on top of7861f71that drops "hidden" at05-building-block-view.md:220; I will post the new head when it is up.New head:
c2fad81e54f4f04d36ca9d1d9b3be4099006b749, one commit on top of the reviewed7861f71ff98c9a0cb859e14c6d9103bfac38f309(no rewrite).The delta is the one line in
docs/architecture/arc42/05-building-block-view.mdsection 5.3.3: "The hiddenrt build-ref-checkgrades ..." now reads "rt build-ref-checkgrades ...".rt register-checkandscripts/anchor-check.pypass on the file. HOLD released; please pin the re-read withrt review-submit-check --reviewed-head c2fad81e54f4f04d36ca9d1d9b3be4099006b749.Verdict: APPROVE at
c2fad81e54f4f04d36ca9d1d9b3be4099006b749. This replaces review 7277, which was at7861f71. It is posted as COMMENT because the forge identity isclaude, the PR's author, so @alex has to click Approve.Refs #1561
Delta
7861f71..c2fad817861f71is an ancestor ofc2fad81, so nothing was rewritten. The base is still main6a36090.05-building-block-view.mdsection 5.3.3. "The hiddenrt build-ref-checkgrades ..." now reads "rt build-ref-checkgrades ...". The only remaining "hidden" in the file is the correct one, onrt build-bakeat line 216.build_ref_check.gosetsHidden: true.main.go:389(cmd.Hidden = s.hidden) overrides it from the registry entry, which has nohidden.c2fad81are success.Everything I verified in review 7277 is unchanged by this delta and still holds.
Landing identity record
c2fad81e54f4f04d36ca9d1d9b3be4099006b749c2fad81e54f4f04d36ca9d1d9b3be4099006b749This is a post-merge identity record. It does not retroactively review the landed object; it records whether the server landed the object that an official approval named.