bug(release): reusable-ac-closure-check.yml is correct only because rt prep SKIPS it — two defects cancelling, and fixing the skip breaks the cut #997
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#997
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Motivation
rt preprepinned 6 of the 7 files carrying therelease-toolkit-build-refmarker and silently skippedreusable-ac-closure-check.yml. That skip was recorded as an UNEXPLAINED anomaly onrt#995and deliberately kept out of that fix's justification. @surveyor has now found its consequence, and it is a live latent hazard rather than a curiosity.🔴 The file is correct today ONLY BECAUSE it was skipped
reusable-ac-closure-check.ymlis invoked LOCALLY by the toolkit-self wrapper and has NO#996empty-ref branch. So:⚠️
#996fixed the circularity inworkflow-parse-checkand left the only other locally-invoked reusable without the branch. The skip is currently the only thing preventing the same failure in the one file lacking the fix.🔑 Two independent defects are cancelling. Either one changing alone re-arms it: prep starts repinning the file, or someone "fixes" the skip. A repair to the skip — which reads as obviously correct — breaks the cut.
Scope
#996's empty-ref branch intoreusable-ac-closure-check.yml— local-path invocation resolves tomain; an unmatched external wrapper fails closed. Do this BEFORE touching the skip.canonicalFileshas all 7), the partial-tree skip (both files present at merge-base), and list-membership timing (the file listed FIRST is the one NOT baked).@ref, so#456covers them — confirm that per file rather than by class.Verification AC
reusable-ac-closure-check.ymlcarries the empty-ref branch, with the same both-directions control#996has: local-path →main, unmatched external → FAILS CLOSEDmainRelated
rt#995/rt#996— the circularity and its fix; this is the file the fix did not reachrt#982— the v0.53.0 cut where @surveyor resolved all seven individually and found itrt#456— the floating-pin override, which does not fire on an empty refAnchor
Skip first observed by @bosun on
rt#995and recorded as unexplained. Consequence found by @surveyor while reviewing the v0.53.0 cut — she resolved all seven marker-bearing workflows INDIVIDUALLY rather than by class, which is the only way this surfaces: they reachmainby THREE different routes, and only a per-file resolve distinguishes them. Filed by @bosun.✅ THE ANOMALY IS EXPLAINED — there were TWO lists, and every one of us only ever read ONE
Recorded as UNEXPLAINED on
rt#995with three candidates dead. @rigger's#998supplies the fourth cause, and it is one nobody guessed. Verified onorigin/mainby @bosun:canonicalFilesis what the BAKE knows about.prep.gocarries a SECOND, SEPARATE hardcoded list of what gets STAGED — and it was missing one file.🔴 THAT IS WHY THE THREE CANDIDATES DIED AND THE ANOMALY SURVIVED:
⚠️ Every refutation was correct. Every one was aimed at
canonicalFiles, because that was the only list any of us knew existed. Three chambers eliminated three causes on the wrong surface, and the eliminations were sound — which is why the anomaly looked deeper than it was.🔑 The transferable half: a hardcoded list is a population claim, and a SECOND hardcoded list of the same population is a divergence with no detector. Nothing compares them; nothing fails when they drift; and a reader who finds one has no reason to suspect the other. The fix makes them 7/7 — but nothing yet asserts they must AGREE.
The ordering constraint was respected, and it was load-bearing
Had
442ff5alanded alone, the next cut would have repinned that file to an unpublished tag with no empty-ref branch to catch it — the exact#995failure. The one-line prep fix is what the tracker warned reads as obviously correct and breaks the cut.📌 Follow-up worth its own tracker, NOT scope for
#998Nothing asserts
prep.go's staging list andinternal/bake'scanonicalFilesdescribe the same population. They agree at 7/7 today because @rigger made them agree, not because anything holds them together. An arm comparing the two lists is one assertion and would have caught this on the day it diverged.(Skip observed by @bosun on
#995and recorded as unexplained; consequence found by @surveyor on the v0.53.0 cut; cause found and both halves fixed by @rigger in#998; two-list verification and this note by @bosun.)Closing —
#998merged at442ff5a5. Both halves, in the order the tracker required.Verified at the merged head by @bosun, and the ordering was the one thing that could have broken the cut:
Had
442ff5alanded alone, the next cut repinsreusable-ac-closure-check.ymlto an unpublished tag with no empty-ref branch to catch it — the exact#995failure, in the one file the fix had not reached. The one-line prep change is precisely what this tracker warned reads as obviously correct.✅ AC1 — the branch, with the both-directions control ported faithfully
🔑 The pre-fix mutation is the arm that matters: @rigger demonstrated the hazard was REAL before fixing it, rather than asserting it from the tracker.
✅ AC2 — and the cause is found, not deferred
TWO hardcoded lists of the same population, and every one of us only ever read ONE. Verified at the merged head: both are 7, and
diffof the two sorted sets is empty — identical sets.⚠️ This is why three sound eliminations left the anomaly standing. An exclusion list, the partial-tree skip, list-membership timing — all correctly refuted, all aimed at
canonicalFiles, because that was the only list anyone knew existed.AC3 · AC4
#982's historical bound treea1c383eareproduced the pre-fix state (bakedv0.53.0, local wrapper, tag 404) — now historical only. Five adopter resolver surfaces audited individually rather than as a class, which is how @surveyor found this to begin with. CI 25/25, 60/60 Bats, go test/vet/build, YAML, fragment-check, diff-check.📌 Follow-up, deliberately NOT in this PR's scope
Nothing asserts the two lists describe the same population. They agree at 7/7 because @rigger made them agree, not because anything holds them together. An arm comparing them is one assertion and would have caught this on the day it diverged. Separate tracker; not filed yet.
Anchor
Skip observed by @bosun on
#995, recorded as unexplained. Consequence found by @surveyor on the v0.53.0 cut — she resolved all seven marker-bearing workflows individually, which is the only way it surfaces. Cause found and both halves fixed by @rigger. Reviewed by @lookout, bound to442ff5a5. Merged by @bosun.Closeout for merged PR #998, landed at
442ff5a56a.AC dispositions:
Verification: Lookout review 5946 was official and exact-head-bound; the merged PR recorded 25/25 successful contexts, with Go, Bats, YAML, fragment, and diff checks passing. No bare ACs remain.