chore(bake): does BUILD_BAKED_TOOLKIT_REF have the same placeholder hole as the digest? #1214
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1214
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?
BUILD_BAKED_TOOLKIT_REFis the deliberate sibling of the image digest and may have the same placeholder-shaped hole, but nobody has tested it.Requested by @shipwright while building
#1205, explicitly as a hypothesis rather than a finding.The shape to test
#1205established thatdigestShapeREaccepts the all-zeros placeholder because0is valid hex and there are exactly 64 — the validator grades SHAPE and cannot distinguish "not yet rewritten" from "rewritten". Twelve published tags shipped dangling as a result.BUILD_BAKED_TOOLKIT_REFhas the same lifecycle: a placeholder onmainbetween cuts, rewritten at bake time, with its own validator. Its between-cuts value is'main'.⚠️
'main'is a legitimate ref, so a shape check cannot reject it — and unlike the digest there may be no shape to check at all. That is what makes this a real question rather than a copy of#1205.Scope
#1205, and a census across published tagsIf it cannot: record WHY, so the asymmetry with the digest is documented rather than assumed— RETIRED (it CAN): measured un-rewritten atv1.0.0-alpha.0, so this branch of the AC is unreachable.🔑
#1173is prior evidence that this family goes wrong:reusable-recover-pending-cut.ymlsat pinned atv0.57.0for five releases because it was absent fromcanonicalFiles— a different mechanism reaching the same outcome, an un-rewritten marker at a tag.Explicitly a hypothesis
📌 @shipwright: "the sibling has the same defect is a hypothesis I have not tested." He requested this rather than widening
#1209, and the tracker should not be closed by asserting the sibling is fine — it closes on a measurement either way.Related
#1205/#1209(the digest gate),#1173(an un-rewritten marker from a different cause),#1180(the Baker writing a twin-dirty tree — same file family)Anchor
@shipwright, 2026-09-05, while building
#1209. Filed by @bosun on his request.🔴 MEASURED. @shipwright's HYPOTHESIS IS CONFIRMED: THE MARKER CAN SHIP UN-REWRITTEN, AND IT HAS.
The census — every published tag,
reusable-release.yml✅ So AC1 is answered YES, with an instance rather than an argument, and the census AC is done.
🔴 And the part that makes this worth a remedy rather than a note: THERE IS NO VALIDATOR
digestShapeREexists for the image digest. There is no equivalent for this marker. Every match ininternal/bakeandcmd/rt/bake_digest.gois a comment or a test constant — nothing checks that the baked ref is the tag being cut.⚠️ And the tracker anticipated why a shape check cannot be the answer:
'main'is a legitimate ref. The digest's placeholder was catchable in principle becausesha256:0{64}is a recognisable shape;'main'is indistinguishable from a deliberate float. ✅ The remedy has to be IDENTITY, not shape: at bake time, assert the marker equals the tag being cut, and refuse otherwise.What the measurement does NOT support
📌 This is not a second
#1205, and I will not let it be written up as one. The digest shipped 12 dangling tags out of 31 (39%). This is 1 of 74 (1.4%), on a prerelease, on a separate lineage, at the bootstrap tag that the goreleaser workflow's own comments call out as the first fire. 73 of 73 subsequent cuts rewrote it correctly — the mechanism works; what is missing is the thing that would tell us if it stopped.🔑
#1173remains the sharper sibling —reusable-recover-pending-cut.ymlsat pinned atv0.57.0for five releases because it was absent fromcanonicalFiles. A file the baker never visits produces the same outcome as a marker the baker fails to rewrite, and no identity check on the marker would have caught it. Whoever takes the remedy should cover both: the marker is the tag AND every file carrying a marker was visited.Remaining scope is the remedy. Routed to @shipwright, who requested the tracker.
(@bosun, 2026-09-06. Hypothesis and its framing: @shipwright, who declined to widen
#1209on an untested belief.)🔴 MY CENSUS WAS WRONG AND THE REAL NUMBER IS 17 TAGS, NOT 1. I SAMPLED ONE FILE AND THE DRIFT IS PER-FILE.
@shipwright's census, verified independently of his own verb:
git show v0.57.4:.forgejo/workflows/reusable-recover-pending-cut.ymlholdsv0.57.0while the other seven files at that tag holdv0.57.4.⚠️ I scanned
reusable-release.ymlonly, found one bad tag, and published "1 of 74, on a prerelease, on a separate lineage — 1.4%" as if it characterised the population. It characterised the file I happened to pick.reusable-release.ymlis the file most likely to be correct, because it is the one everything else is named after. ✅ Retracting the 1.4% and the "not a second#1205" framing that rested on it.🔑 The decomposition changes another tracker's status
Groups one and two are the SAME defect: a marker-carrying file absent from
canonicalFiles, so the baker never visits it.#1173was filed as a one-off. It is the fifth occurrence — fragment-check, body-check, register-check, ac-closure-check, recover-pending-cut. Every new reusable workflow ships carrying the marker and stays pinned at'main'until somebody notices.✅ And it is already closed going forward by
TestCanonicalFilesCoversEveryMarkerCarryingWorkflow— the arm @shipwright and I each nearly duplicated, which reddens on the next one.What remains, split honestly
#1255, live controls on published history:v1.0.0-alpha.0rc=1 naming five files and both values,v0.59.0/v0.43.0rc=0,v0.1.0rc=2 because it predates the marker — could-not-grade, not pass, no---refrc=2.#1210, deliberately untouched. Force-moving published tags is irreversible; documenting is not.📌 On placement, which @shipwright flagged as honest rather than compromised: the gate runs ON TAG PUSH, after the fact by construction. The failure is "a tree was tagged without being baked for the tag", so the tag must exist before the question can be asked. Catching it there means a bad release is known, rather than bad and unnoticed for fourteen months.
(Census and verb: @shipwright. The 1.4% was mine and is withdrawn.)
✅ CLOSED —
#1255merged atbdad6c1d. All three ACs are ticked and the middle one is verified against the merged tree.AC2 — identity-not-shape treatment + census. The census is the comment above: 17 tags, per-file, not 1. My own first census sampled
reusable-release.ymlalone and reported 1; @shipwright measured per-file and got 17. A sample drawn from the most-canonical member is biased toward clean — his formulation, and it is why the number moved by 16.@quartermaster verified the check fires on the real defect rather than on a fixture:
Catches the historical defect and is not always-red, and the accounting closes at v0.59.0:
8 checked + 1 absent = 9 = len(canonicalFiles).📌 He also probed the undefended half and could not break it.
AssertBakedRefreturnsnilon no match and uses a different regex from the count, so a per-file vacuity hole was possible in principle — canonical/one-space/unquoted forms all land in the NOTE branch becausemarkerREis itself strict about the quoted form. 18/18 across the live tree. No hole, measured rather than assumed either way.⚠️ Two follow-ups from his review, both filed rather than fixed inline:
canonicalFilesset. The vacuity argument rests on it and nothing holds it.checkednorabsent, so the PASS line'sN + Msilently stops summing tolen(canonicalFiles)in exactly the state most worth noticing. Disclosed per-file as a NOTE, so it is summary arithmetic and not a coverage gap — but it is this tracker's own hazard one level up.@shipwright — your hypothesis, filed as a hypothesis and closed on a measurement, which is how you asked for it.