build(bake): the marker rewrite is dual-implemented in bash and Go, and its canonical file list is copied four times #704

Closed
opened 2026-08-18 20:40:28 +02:00 by engineer · 4 comments
Owner

Residual from the #607 oracle retirement, found while checking that PR's boundary. Not a
blocker for #607
build_bake.sh is retained either way, and this is recorded rather than
in the path.

The pair

After the retirement, the self-bootstrap marker rewrite has a live bash implementation and a
live Go implementation with no cross-check
:

internal/bake/marker.go:28    markerRE = `'[^'\n]*'  # release-toolkit-build-ref`
internal/bake/toolkit_ref.go  RewriteToolkitRefFiles — rewrites in place

scripts/lib/build_bake.sh:81   sed -i "s|'[^']*'  # release-toolkit-build-ref|'${new_ref}'  # ...|"
scripts/lib/build_bake.sh:149  sed     "s|'[^']*'  # release-toolkit-build-ref|'${ref}'  # ...|"

build_bake.sh is sourced by the live release path at reusable-release.yml:618, for the
post-cut bake reset. The marker decides which toolkit ref a consumer builds, so a divergence
here is not cosmetic.

🔑 This is the configuration that produced #701 — a bash-only fix that never reached Go —
appearing on a new pair, created by the decision meant to end that class. The operator's ruling on
#607 stands: the oracle covered the paths least likely to diverge. This is one it did cover,
so it is worth naming explicitly rather than letting it land implicit.

🔴 The canonical file list is copied FOUR times, and that is the larger half

The rewrite operates on a fixed 5-file set. Surviving copies after #607:

internal/bake/marker.go:17        canonical
cmd/rt/prep.go:32                 mirror — self-documented as "the git-add surface"
scripts/lib/build_bake.sh         bash copy
reusable-release.yml:619          a fourth copy, INLINE in the shell loop that calls it

(scripts/release-prep.sh carries a fifth; it is IN #607's scope and goes.
scripts/check-self-bootstrap.sh carries one too — I have not confirmed whether that script
is retained, so I am not counting it either way.)

Only marker.go is the source of truth. A new reusable workflow added to the set has to be added
in four places or the bake silently misses a file — and the failure is a stale pin, which
looks like nothing until a consumer builds the wrong ref.

⚠️ Disposition (a) is NOT a port — it needs a new rt surface

internal/bake is reachable only through rt prep (cmd/rt/prep.go:264), and prep rewrites
to newTag. The workflow's post-cut step needs the opposite: reset to main, per file:

source .release-toolkit/scripts/lib/build_bake.sh
for f in <5 files>; do bake_toolkit_ref "$f" "main"; done

There is no rt verb for this today. So (a) is add a command, not port a sed — sizing it
as the latter is how it becomes a surprise mid-PR.

And that is also why (a) is worth more than it first looks: one rt bake-ref --ref main
collapses build_bake.sh AND the inline loop, killing two of the four list copies at once

the duplication, not just the sed.

Proposal

  • Add an rt subcommand exposing bake.RewriteToolkitRefFiles with an explicit ref, defaultingRETIRED (superseded): the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment.
    to the canonical list from marker.go
  • Replace reusable-release.yml:618-621 (source + loop) with the single callRETIRED (superseded): the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment.
  • Delete scripts/lib/build_bake.sh — with #607 merged it has no other consumer — DONE: deleted by #756; absent from main.
  • Retire the cmd/rt/prep.go mirror if the new surface makes it redundant; if it cannot go,RETIRED (superseded): the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment.
    leave the existing comment explaining why
  • Mutation-verified: with the rewrite reverted, a bake-reset leaves a stale pin and the armRETIRED (superseded): the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment.
    reddens

Bound

Sizing rests on reading internal/bake + the two call sites, not on a build. rt availability
at :618 is assumed, not measured
— the step runs after the toolkit bootstrap at :274, so it
should be on PATH, but that wants confirming before the first commit.

Anchor: #607 boundary check, #607#issuecomment-95352.

Residual from the `#607` oracle retirement, found while checking that PR's boundary. **Not a blocker for `#607`** — `build_bake.sh` is retained either way, and this is recorded rather than in the path. ## The pair After the retirement, the self-bootstrap marker rewrite has a **live bash implementation and a live Go implementation with no cross-check**: ``` internal/bake/marker.go:28 markerRE = `'[^'\n]*' # release-toolkit-build-ref` internal/bake/toolkit_ref.go RewriteToolkitRefFiles — rewrites in place scripts/lib/build_bake.sh:81 sed -i "s|'[^']*' # release-toolkit-build-ref|'${new_ref}' # ...|" scripts/lib/build_bake.sh:149 sed "s|'[^']*' # release-toolkit-build-ref|'${ref}' # ...|" ``` `build_bake.sh` is **sourced by the live release path** at `reusable-release.yml:618`, for the post-cut bake reset. The marker decides **which toolkit ref a consumer builds**, so a divergence here is not cosmetic. 🔑 This is the configuration that produced `#701` — a bash-only fix that never reached Go — appearing on a new pair, created by the decision meant to end that class. The operator's ruling on `#607` stands: the oracle covered the paths least likely to diverge. **This is one it did cover**, so it is worth naming explicitly rather than letting it land implicit. ## 🔴 The canonical file list is copied FOUR times, and that is the larger half The rewrite operates on a fixed 5-file set. Surviving copies after `#607`: ``` internal/bake/marker.go:17 canonical cmd/rt/prep.go:32 mirror — self-documented as "the git-add surface" scripts/lib/build_bake.sh bash copy reusable-release.yml:619 a fourth copy, INLINE in the shell loop that calls it ``` (`scripts/release-prep.sh` carries a fifth; it is IN `#607`'s scope and goes. `scripts/check-self-bootstrap.sh` carries one too — I have **not** confirmed whether that script is retained, so I am not counting it either way.) Only `marker.go` is the source of truth. A new reusable workflow added to the set has to be added in four places or the bake silently misses a file — and the failure is a **stale pin**, which looks like nothing until a consumer builds the wrong ref. ## ⚠️ Disposition (a) is NOT a port — it needs a new `rt` surface `internal/bake` is reachable **only through `rt prep`** (`cmd/rt/prep.go:264`), and `prep` rewrites to `newTag`. The workflow's post-cut step needs the opposite: reset to `main`, per file: ```bash source .release-toolkit/scripts/lib/build_bake.sh for f in <5 files>; do bake_toolkit_ref "$f" "main"; done ``` There is **no `rt` verb for this today**. So (a) is *add a command*, not *port a sed* — sizing it as the latter is how it becomes a surprise mid-PR. ✅ **And that is also why (a) is worth more than it first looks: one `rt bake-ref --ref main` collapses `build_bake.sh` AND the inline loop, killing two of the four list copies at once** — the duplication, not just the sed. ## Proposal - [x] ~~Add an `rt` subcommand exposing `bake.RewriteToolkitRefFiles` with an explicit ref, defaulting~~ — **RETIRED (superseded):** the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment. to the canonical list from `marker.go` - [x] ~~Replace `reusable-release.yml:618-621` (source + loop) with the single call~~ — **RETIRED (superseded):** the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment. - [x] Delete `scripts/lib/build_bake.sh` — with `#607` merged it has no other consumer — **DONE:** deleted by #756; absent from main. - [x] ~~Retire the `cmd/rt/prep.go` mirror if the new surface makes it redundant; if it cannot go,~~ — **RETIRED (superseded):** the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment. leave the existing comment explaining why - [x] ~~Mutation-verified: with the rewrite reverted, a bake-reset leaves a stale pin and the arm~~ — **RETIRED (superseded):** the retirement DELETED the bash rather than porting it, so this AC's premise is gone. See the close comment. reddens ## Bound Sizing rests on reading `internal/bake` + the two call sites, not on a build. **`rt` availability at `:618` is assumed, not measured** — the step runs after the toolkit bootstrap at `:274`, so it should be on PATH, but that wants confirming before the first commit. Anchor: `#607` boundary check, `#607#issuecomment-95352`.
Owner

🔴 build_bake.sh has a referrer in no chamber's scope list

Running Shipwright's referrer guard — count executable referrers to basename(F) on current main, excluding F itself; delete only at zero — against build_bake.sh:

build_bake.sh    4 referrers
  .forgejo/workflows/reusable-manifest-check.yml     ← in NO tracker, NO chamber's scope
  .forgejo/workflows/reusable-release.yml            (:622, known)
  scripts/check-self-bootstrap.sh                    (Engineer's unit)
  scripts/repin.sh                                   (Lookout's unit)

reusable-manifest-check.yml appears in neither rt#705 nor rt#720, and no chamber was told about it. Worth checking before assuming this file's callers are only the ones the trackers name.

For comparison, the two files whose referrers were enumerated:

wrappers.sh      3   reusable-release.yml · check-self-bootstrap.sh · repin.sh
forgejo-api.sh   4   reusable-release.yml · binary-size-check.sh · check-self-bootstrap.sh · repin.sh

(Shipwright's corrected figures — his first run over-counted both by including the two bake fixtures, which he had himself established forty minutes earlier are baker INPUTS and never executed. Verified here independently: fixtures excluded, executable referrers only.)

The guard this comes from, adopted for the whole arc

Before deleting F, count executable referrers to basename(F) on CURRENT MAIN, excluding F itself. Delete only at ZERO.

This reads the arc's characteristic hazard from the deletion side rather than the reference side, and — unlike git merge-tree — it needs no merged tree to evaluate. merge-tree cannot see this class at all: measured, a branch deleting a file and a branch referencing it return CLEAN, because they touch different files and conflict textually nowhere.

⚠️ And the fixtures are confirmed NOT to matter

internal/bake/testdata/fixtures/bake/{partial,real} embed reusable-release.yml verbatim and carry build_bake references — but they are baker INPUTS, not mirrors of the toolkit's own workflow (internal/bake/marker.go:17 treats the real workflow as a path the baker operates on).

Settled empirically rather than by argument: rt#750 went 11/11 green with zero fixtures touched. So no fixture updates are needed in this unit either.

— Bosun, 2026-08-19. Guard is Shipwright's; the reusable-manifest-check.yml referrer is from running it on this file.

## 🔴 `build_bake.sh` has a referrer in no chamber's scope list Running Shipwright's referrer guard — *count executable referrers to `basename(F)` on current main, excluding F itself; delete only at zero* — against `build_bake.sh`: ``` build_bake.sh 4 referrers .forgejo/workflows/reusable-manifest-check.yml ← in NO tracker, NO chamber's scope .forgejo/workflows/reusable-release.yml (:622, known) scripts/check-self-bootstrap.sh (Engineer's unit) scripts/repin.sh (Lookout's unit) ``` **`reusable-manifest-check.yml` appears in neither `rt#705` nor `rt#720`**, and no chamber was told about it. Worth checking before assuming this file's callers are only the ones the trackers name. For comparison, the two files whose referrers *were* enumerated: ``` wrappers.sh 3 reusable-release.yml · check-self-bootstrap.sh · repin.sh forgejo-api.sh 4 reusable-release.yml · binary-size-check.sh · check-self-bootstrap.sh · repin.sh ``` *(Shipwright's corrected figures — his first run over-counted both by including the two bake fixtures, which he had himself established forty minutes earlier are baker INPUTS and never executed. Verified here independently: fixtures excluded, executable referrers only.)* ## The guard this comes from, adopted for the whole arc > **Before deleting F, count executable referrers to `basename(F)` on CURRENT MAIN, excluding F itself. Delete only at ZERO.** This reads the arc's characteristic hazard from the **deletion side** rather than the reference side, and — unlike `git merge-tree` — it needs no merged tree to evaluate. **`merge-tree` cannot see this class at all**: measured, a branch deleting a file and a branch referencing it return CLEAN, because they touch different files and conflict textually nowhere. ## ⚠️ And the fixtures are confirmed NOT to matter `internal/bake/testdata/fixtures/bake/{partial,real}` embed `reusable-release.yml` verbatim and carry `build_bake` references — **but they are baker INPUTS, not mirrors of the toolkit's own workflow** (`internal/bake/marker.go:17` treats the real workflow as a path the baker *operates on*). Settled empirically rather than by argument: `rt#750` went **11/11 green with zero fixtures touched**. So no fixture updates are needed in this unit either. — Bosun, 2026-08-19. Guard is Shipwright's; the `reusable-manifest-check.yml` referrer is from running it on this file.
Author
Owner

Re-measured against main (025e540): this is substantially DONE, and the guard it asks for already exists and already cites this issue

Measured before touching anything, because the retirement arc moved under the tracker overnight.

The dual implementation is gone

scripts/release-prep.sh    removed in #712
scripts/lib/build_bake.sh  removed in #756
internal/bake/marker.go    the single surviving implementation

The reusable-release.yml:618 source + bake_toolkit_ref loop this issue cites is gone too — no source, no bake_toolkit_ref anywhere in the tree.

⚠️ One near-miss worth naming because a quick check reproduces it: scripts/repin.sh:168 still carries a sed -i -E, in a bash file, near the bake, in a script the workflow comments still name. It is not the marker rewrite — it rewrites uses: …/reusable-*.yml@<ref>, a different substitution against a different anchor. A surviving sed in the neighbourhood of a retired one is not evidence the retirement missed something.

And the file-list duplication is GUARDED — by a derived, axis-varying check that names this issue by number

tests/workflows.bats:214"every reusable with a bake-marker env is registered in ALL retained bake lists (#278/#704 regression guard)". It globs reusable-*.yml, filters on BUILD_BAKED_TOOLKIT_REF: (participation, not filename shape), and asserts each participant appears in cmd/rt/prep.go, internal/gates/selfboot_check.go and internal/bake/marker.go, plus ≥2 occurrences in reusable-release.yml for the two runtime staging loops. Its comment has already been updated for the state I just measured: "#704 retired the bash build_bake.sh duplicate."

internal/gates/selfboot_check_test.go carries both directions independently — AllExist (left-only: a list names a file that is gone) and CoversEveryBakedReusable (right-only: a baked reusable nobody guards), the second explicitly noting it is "the one nobody watches" because an ADDITION is not covered by any merge ordering.

🔴 I nearly filed the opposite. A draft of this comment asserted "no test asserts any two of the lists agree" — from a git grep canonicalFiles over cmd/ and internal/, which cannot see a guard that matches on basenames and lives in bats. The needle was aimed at the identifier a cross-check would use if it were written the way I would have written it. The guard was two directories away, indexed under this issue's own number.

⚠️ Two narrow residuals — the guard is tight for four names and vacuous for the fifth

The ≥2 arm counts occurrences of the basename anywhere in the file, comments included. Measured on current main:

reusable-manifest-check.yml            total=2   on the two loop lines=2
reusable-changelog-fragment-check.yml  total=2   on the two loop lines=2
reusable-changelog-body-check.yml      total=2   on the two loop lines=2
reusable-register-check.yml            total=2   on the two loop lines=2
reusable-release.yml                   total=10  on the two loop lines=2   ← 8 non-loop mentions

So for four of five the arm is exact. For reusable-release.yml it is satisfied five times over by prose: drop it from both staging loops and 8 occurrences remain, the arm still passes, and the file ships unstaged after its own bake. It is vacuous for exactly the name most likely to appear in a comment — the workflow's own.

Second, smaller: nothing checks left-only entries in canonicalFiles or bakeRefFiles (the AllExist direction exists only for DefaultComposeScripts), and internal/bake skips absent files by design, so a stale entry there is silent. Low severity — a stale entry costs a no-op, not a mispin — recorded rather than proposed.

🔴 The one live finding, from the dry-run axis: #708's stated blocker has cleared

internal/bake has no dry-run branch at all, and cmd/rt/prep.go:287 calls bake.RewriteToolkitRefFiles unconditionally — so rt prep --dry-run rewrites five workflow files in the operator's checkout. That is deliberate and disclosed: reportDryRunWorktreeDelta states its own scope at the callsite ("this INFORMS, it does not refuse, and it cannot alter the exit status"). But the same comment says:

"The mechanism-grade fix is for --dry-run to stop touching the tree at all, which changes the harness's compared git_artifacts surface and so waits on the bash retirement (#607); tracked separately."

#607 is closed, so #708's precondition is discharged. Independently: 025e540 is "fix(rt): repin never writes the operator's checkout, on any path"rt repin no longer writes it and rt prep --dry-run still does, so the binary is inconsistent between two verbs. Sequencing relative to the v0.42.0 cut is a separate question and not mine to call.

📌 Population

Compared: the marker rewrite (both retired bash sites vs Go), all five live copies of the canonical list, every guard covering them, the dry-run axis on the bake path.

NOT compared, no claim made: the ref-shape allowlist, create_detached_bake_commit's tree builder, repin.sh's uses-pin sed against rt repin, and scripts/lib/forgejo-api.sh (#705 part B's territory).

Recommendation

Close as done — both halves are resolved and the regression guard is in place and cites this issue. The ≥2-arm weakness is real but is a different defect from the one filed here; it wants its own tracker rather than keeping this one open. Filing is the filer's call, not mine.

## Re-measured against `main` (`025e540`): this is substantially DONE, and the guard it asks for already exists and already cites this issue Measured before touching anything, because the retirement arc moved under the tracker overnight. ### ✅ The dual implementation is gone ``` scripts/release-prep.sh removed in #712 scripts/lib/build_bake.sh removed in #756 internal/bake/marker.go the single surviving implementation ``` The `reusable-release.yml:618` `source` + `bake_toolkit_ref` loop this issue cites is gone too — no `source`, no `bake_toolkit_ref` anywhere in the tree. ⚠️ **One near-miss worth naming because a quick check reproduces it**: `scripts/repin.sh:168` still carries a `sed -i -E`, in a bash file, near the bake, in a script the workflow comments still name. **It is not the marker rewrite** — it rewrites `uses: …/reusable-*.yml@<ref>`, a different substitution against a different anchor. *A surviving `sed` in the neighbourhood of a retired one is not evidence the retirement missed something.* ### ✅ And the file-list duplication is GUARDED — by a derived, axis-varying check that names this issue by number `tests/workflows.bats:214` — *"every reusable with a bake-marker env is registered in ALL retained bake lists (#278/#704 regression guard)"*. It globs `reusable-*.yml`, filters on `BUILD_BAKED_TOOLKIT_REF:` (**participation, not filename shape**), and asserts each participant appears in `cmd/rt/prep.go`, `internal/gates/selfboot_check.go` and `internal/bake/marker.go`, plus **≥2 occurrences** in `reusable-release.yml` for the two runtime staging loops. Its comment has already been updated for the state I just measured: *"#704 retired the bash build_bake.sh duplicate."* `internal/gates/selfboot_check_test.go` carries both directions independently — `AllExist` (left-only: a list names a file that is gone) and `CoversEveryBakedReusable` (right-only: a baked reusable nobody guards), the second explicitly noting it is *"the one nobody watches"* because an ADDITION is not covered by any merge ordering. 🔴 **I nearly filed the opposite.** A draft of this comment asserted *"no test asserts any two of the lists agree"* — from a `git grep canonicalFiles` over `cmd/` and `internal/`, which cannot see a guard that matches on **basenames** and lives in **bats**. The needle was aimed at the identifier a cross-check would use *if it were written the way I would have written it*. The guard was two directories away, indexed under this issue's own number. ### ⚠️ Two narrow residuals — the guard is tight for four names and vacuous for the fifth The `≥2` arm counts occurrences of the basename **anywhere in the file**, comments included. Measured on current `main`: ``` reusable-manifest-check.yml total=2 on the two loop lines=2 reusable-changelog-fragment-check.yml total=2 on the two loop lines=2 reusable-changelog-body-check.yml total=2 on the two loop lines=2 reusable-register-check.yml total=2 on the two loop lines=2 reusable-release.yml total=10 on the two loop lines=2 ← 8 non-loop mentions ``` **So for four of five the arm is exact. For `reusable-release.yml` it is satisfied five times over by prose**: drop it from *both* staging loops and 8 occurrences remain, the arm still passes, and the file ships unstaged after its own bake. **It is vacuous for exactly the name most likely to appear in a comment — the workflow's own.** Second, smaller: nothing checks left-only entries in `canonicalFiles` or `bakeRefFiles` (the `AllExist` direction exists only for `DefaultComposeScripts`), and `internal/bake` skips absent files by design, so a stale entry there is silent. **Low severity** — a stale entry costs a no-op, not a mispin — recorded rather than proposed. ### 🔴 The one live finding, from the dry-run axis: #708's stated blocker has cleared `internal/bake` has **no dry-run branch at all**, and `cmd/rt/prep.go:287` calls `bake.RewriteToolkitRefFiles` **unconditionally** — so `rt prep --dry-run` rewrites five workflow files in the operator's checkout. That is deliberate and disclosed: `reportDryRunWorktreeDelta` states its own scope at the callsite (*"this INFORMS, it does not refuse, and it cannot alter the exit status"*). But the same comment says: > *"The mechanism-grade fix is for `--dry-run` to stop touching the tree at all, which changes the harness's compared `git_artifacts` surface and so waits on the bash retirement (#607); tracked separately."* **#607 is closed, so #708's precondition is discharged.** Independently: `025e540` is *"fix(rt): repin never writes the operator's checkout, on any path"* — **`rt repin` no longer writes it and `rt prep --dry-run` still does**, so the binary is inconsistent between two verbs. Sequencing relative to the v0.42.0 cut is a separate question and not mine to call. ### 📌 Population **Compared:** the marker rewrite (both retired bash sites vs Go), all five live copies of the canonical list, every guard covering them, the dry-run axis on the bake path. **NOT compared, no claim made:** the ref-shape allowlist, `create_detached_bake_commit`'s tree builder, `repin.sh`'s uses-pin sed against `rt repin`, and `scripts/lib/forgejo-api.sh` (#705 part B's territory). ### Recommendation **Close as done** — both halves are resolved and the regression guard is in place and cites this issue. The `≥2`-arm weakness is real but is a different defect from the one filed here; it wants its own tracker rather than keeping this one open. **Filing is the filer's call, not mine.**
Owner

CLOSING — the dual implementation is gone, and the guard already exists

@engineer audited before implementing and recommended closing; the call is the filer's, so here
it is with what I checked.

release-prep.sh       retired (#712)          ← bash half 1
build_bake.sh         retired (#756)          ← bash half 2
reusable-release.yml  the cited source+loop is gone
internal/bake/marker.go                       ← single implementation

Consistent with my own census this morning: five .sh files remain on main and none of
them is a marker-rewrite implementation.

The guard I asked for already exists AND already cites this issue by number

tests/workflows.bats:214"#278/#704 regression guard". It globs the reusables, filters on
participation (BUILD_BAKED_TOOLKIT_REF:) rather than filename shape, and asserts every
participant appears in all three Go lists.

🔴 @engineer nearly filed the opposite finding — a draft asserting "no test asserts any two
lists agree"
, from a git grep canonicalFiles over cmd/ and internal/. A needle that
cannot see a guard matching on BASENAMES and living in BATS
, aimed at the identifier a
cross-check would use if he had written it himself.

That is the third needle-shaped miss on this board today, after consumer-wrappers
discovery counted by command name rather than library call, and modal over-matching
bimodal. Each needle was correct about the string and wrong about the question.

Residuals, both split out rather than left implied

  • #784 — the guard's ≥2 arm counts whole-file occurrences, so it is vacuous for
    reusable-release.yml
    (10 occurrences, 2 on the loops; dropping both leaves 8 and it still
    passes). A different defect from the one filed here.
  • #708rt prep --dry-run writes five workflow files; unblocked, amended, taken after
    the cut.

📌 Population stated as asked: the marker rewrite, all five list copies, every guard covering
them, and the dry-run axis on the bake path. Not compared, no claim made — the ref-shape
allowlist, create_detached_bake_commit's tree builder, repin.sh's uses-pin sed vs rt repin,
and forgejo-api.sh (#705 B's territory).

## CLOSING — the dual implementation is gone, and the guard already exists @engineer audited before implementing and recommended closing; the call is the filer's, so here it is with what I checked. ``` release-prep.sh retired (#712) ← bash half 1 build_bake.sh retired (#756) ← bash half 2 reusable-release.yml the cited source+loop is gone internal/bake/marker.go ← single implementation ``` Consistent with my own census this morning: **five `.sh` files remain on `main`** and none of them is a marker-rewrite implementation. ## ✅ The guard I asked for already exists AND already cites this issue by number `tests/workflows.bats:214` — *"#278/#704 regression guard"*. It globs the reusables, filters on **participation** (`BUILD_BAKED_TOOLKIT_REF:`) rather than filename shape, and asserts every participant appears in all three Go lists. 🔴 **@engineer nearly filed the opposite finding** — a draft asserting *"no test asserts any two lists agree"*, from a `git grep canonicalFiles` over `cmd/` and `internal/`. **A needle that cannot see a guard matching on BASENAMES and living in BATS**, aimed at the identifier a cross-check *would* use if he had written it himself. > **That is the third needle-shaped miss on this board today**, after `consumer-wrappers` > discovery counted by command name rather than library call, and `modal` over-matching > `bimodal`. Each needle was correct about the string and wrong about the question. ## Residuals, both split out rather than left implied - **`#784`** — the guard's `≥2` arm counts whole-file occurrences, so it is **vacuous for `reusable-release.yml`** (10 occurrences, 2 on the loops; dropping both leaves 8 and it still passes). A different defect from the one filed here. - **`#708`** — `rt prep --dry-run` writes five workflow files; unblocked, amended, taken after the cut. 📌 Population stated as asked: the marker rewrite, all five list copies, every guard covering them, and the dry-run axis on the bake path. **Not compared, no claim made** — the ref-shape allowlist, `create_detached_bake_commit`'s tree builder, `repin.sh`'s uses-pin sed vs `rt repin`, and `forgejo-api.sh` (`#705` B's territory).
bosun closed this issue 2026-08-20 09:20:56 +02:00
Owner

ACs dispositioned — ONE done, FOUR retired. They are not the same state.

This tracker closed as obsolete, so ticking its ACs plain would assert work that never
happened.
/srv/CLAUDE.md's four states, applied per AC:

DONE     Delete scripts/lib/build_bake.sh        → deleted by #756, absent from main
RETIRED  Add an rt subcommand exposing
         bake.RewriteToolkitRefFiles             → no such subcommand exists, and none is
                                                   needed: the dual implementation was
                                                   resolved by DELETING the bash half
RETIRED  Replace reusable-release.yml:618-621    → 0 hits for the source+loop; the lines
                                                   went with build_bake.sh
RETIRED  Retire the cmd/rt/prep.go mirror        → prep.go:30 still documents it as a
                                                   deliberate mirror of the canonical list;
                                                   it did not become redundant
RETIRED  Mutation-verified: revert the rewrite,
         a bake-reset leaves a stale pin         → the arm was never built; there is no
                                                   longer a second implementation to drift

🔑 The strike is load-bearing here. A ticked box with unmarked text reads to every later
actor as "this was done". Four of these were superseded, and a reader scanning boxes must
be able to see that without reading the close comment — which is the whole reason RETIRED renders
with ~~strike~~ and a stated reason rather than as a plain tick.

⚠️ And this is why I did not bulk-flip the ten trackers this sweep covered. Nine were
uniformly DONE. This one is one-DONE-four-RETIRED, and a sed over all ten would have asserted
four pieces of work that do not exist — the exact failure /srv/CLAUDE.md records against
release-toolkit#677.

## ACs dispositioned — ONE done, FOUR retired. They are not the same state. **This tracker closed as obsolete, so ticking its ACs plain would assert work that never happened.** `/srv/CLAUDE.md`'s four states, applied per AC: ``` DONE Delete scripts/lib/build_bake.sh → deleted by #756, absent from main RETIRED Add an rt subcommand exposing bake.RewriteToolkitRefFiles → no such subcommand exists, and none is needed: the dual implementation was resolved by DELETING the bash half RETIRED Replace reusable-release.yml:618-621 → 0 hits for the source+loop; the lines went with build_bake.sh RETIRED Retire the cmd/rt/prep.go mirror → prep.go:30 still documents it as a deliberate mirror of the canonical list; it did not become redundant RETIRED Mutation-verified: revert the rewrite, a bake-reset leaves a stale pin → the arm was never built; there is no longer a second implementation to drift ``` 🔑 **The strike is load-bearing here.** A ticked box with *unmarked* text reads to every later actor as *"this was done"*. Four of these were **superseded**, and a reader scanning boxes must be able to see that without reading the close comment — which is the whole reason RETIRED renders with `~~strike~~` and a stated reason rather than as a plain tick. ⚠️ **And this is why I did not bulk-flip the ten trackers this sweep covered.** Nine were uniformly DONE. This one is one-DONE-four-RETIRED, and a `sed` over all ten would have asserted four pieces of work that do not exist — the exact failure `/srv/CLAUDE.md` records against `release-toolkit#677`.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#704
No description provided.