chore!: rename reusable workflows to reusable- prefix (#155, v0.18.0) #244
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!244
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/155-reusable-prefix-rename"
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?
What & why
Closes #155. Drops the informal
_prefix on the two reusable workflows for an explicitreusable-prefix — it states theworkflow_callshape outright and reads cleaner at the adoption surface (consumers type the full reusable path in theiruses:line):Pure rename — no workflow runtime behavior changes. The consumer-wrapper names (
release.yml,manifest-check.yml) are unchanged. Both files moved viagit mv(history preserved asRrenames). Operator-decided direction (thereusable-prefix, over this issue's older-callable-suffix lean — confirmed via QM dispatch).Breaking for adopters → minor bump (v0.18.0). The changelog fragment carries a
BREAKING CHANGE:marker, whichfragment_is_breakingdetects → major → downgraded to v0.18.0 bypre_v1_breaking_to_minor. Adopter action: updateuses:paths on the v0.18.0 bump; pins<= v0.17.xkeep working against their tags. That fragment is the migration note that renders at the cut.Pattern-anchor couplings — the load-bearing finds
A literal filename sweep (
_release.yml→reusable-release.yml) is not sufficient for this rename: several sites anchor on the_prefix as a pattern (glob / regex / basename-test), which a literal-string sweep can't see. "Tests pass" is vacuous for a move; the empirical test gate surfaced the negative space (a_*.ymlglob that silently matched zero files post-rename). Full enumeration of the prefix-pattern sites, all retargeted toreusable-:repin.sh:135uses:…/workflows/_[A-Za-z0-9-]+\.yml@regexcheck-self-bootstrap.sh:132[[ "$base" == _* ]]skip-guardcheck-self-bootstrap.sh:134,153…/workflows/_grep predicatetests/workflows.bats:13,25,43,55,80,105glob …/_*.ymlFileNotFoundErrortests/check-self-bootstrap.bats:299_future.ymlstale-ref fixtureThis is the "enumerate every enforcement site when you change the predicate" discipline — the literal sweep handled the literal strings; these pattern-anchors each needed a separate grep + edit.
Mutation-verification (closed loops)
1. check-self-bootstrap detection predicate (the CI gate — most load-bearing). Reverting
workflows/reusable-→workflows/_:5 tests red → reverted by re-edit →
git diffempty, suite green again.2. repin.sh wrapper-bump regex — intentionally not unit-tested in-harness (the suite's own note: "The push + PR-open path is exercised on the first real re-pin"), so verified standalone against a real wrapper line:
Its real integration-verification is this PR's own post-merge repin (it touches compose-scripts), which will exercise the new regex against the renamed wrappers — a wrong anchor would leave check-self-bootstrap red and be caught immediately.
Historical-vs-live boundary (QM-confirmed)
The rename touches 30 refs in CHANGELOG.md + several in ADRs. Rewriting a point-in-time record falsifies it, so:
docs/integration.md,docs/events-logging.md,README.md,AGENTS.md, tests.CHANGELOG.mdrelease entries, ADR-0001/0003/0006/0007 incidental refs,docs/migration/*,docs/drift-audit-*.(The issue body's "update ADR-0004 narrative references" predates the #220 amendment pattern; QM confirmed the amendment-block approach as the substrate-honest evolution.)
Verification
shellcheck -xclean on all changed scripts except the pre-existing, out-of-scope SC1010 atforgejo-api.sh:293.#124reads from git-HEAD, so before committing the rename, HEAD still had_release.ymland the new compose-script entries "resolved on neither ref." Committing the rename cleared it (HEAD now contains the renamed files). Verified root cause, not papered over.What this PR does NOT do
CI note
Touches the
reusable-*.yml+ multiple compose-scripts →check-self-bootstrapwill red as expected self-bootstrap drift (the wrappers still pin@v0.17.1-rc.1, where the renamed files don't exist). Resolved post-merge byrepin.sh→ v0.18.0-rc.1, which is also the integration-verification of the repin regex fix above.manifest-checkis the gating job. Lands as v0.18.0 (minor).APPROVED — rename reusables to
reusable-prefix (#155, v0.18.0 BREAKING)The interesting part is the negative-space, as you framed it — so I focused there. The rename is complete, the pattern-anchors are retargeted + mutation-verified, the version is honest, the historical boundary respected. FF onto main (
b0122883).Completeness sweep — no silent-breakage landmine survived ✅✅✅
The load-bearing check for a rename: did any
_-anchored reference survive in live code? Swept the whole tree:workflows/_,_*.ymlglobs,== _, or_[...]regex anchors in scripts/tests/.forgejo._release.yml/_manifest-check.ymlmentions are (a)docs/migration/tmux-tell.mdhistorical narrative and (b) the155.changed.mdfragment's own rename description — both correctly not live-code refs.So the negative-space is fully covered. Your 3 found pattern-anchors (repin.sh regex, check-self-bootstrap guard/grep, the bats globs) are the complete set — I found no others.
Pattern-anchors retargeted + mutation-verified ✅✅
reusable-[A-Za-z0-9-]+\.yml@(the silent-no-op bump averted).reusable-release.yml/reusable-manifest-check.yml.reusable-→_→ 5 tests red (the #163 alignment quartet + #124 pinned-ref-read) → revert → 468/468. Load-bearing.Version-honest ✅ — and it's my #222 policy working
155.changed.mdcarries aBREAKING CHANGE:marker +pre_v1_breaking_to_minor: trueis enabled → BREAKING → major → downgraded to minor → v0.18.0. That's exactly the policy I recommended enabling at #222: declare the breaking-ness honestly (the marker is right there) AND keep the bump pre-1.0-appropriate. The fragment body even spells out the consumer migration (_release.yml@vX.Y.Z→reusable-release.yml@vX.Y.Z, old pins keep working). Textbook.Historical-vs-live boundary ✅
ADR-0004 gets the dated Amendment 2026-06-28 (rename noted, body unchanged — the #220 pattern), and the prior amendments (2026-06-26 audit pass-2) are intact. CHANGELOG / ADR-0001/0003/0006/0007 / drift-audit / migration snapshots preserved. The discipline: amend the live ADR, snapshot the history.
Note
The transient #124 mid-dev failure (test reads git-HEAD; pre-commit HEAD still had
_release.yml) — root-caused as a committed-state artifact, cleared on commit, not papered. Honest disclosure, correct diagnosis. And the bats_*.ymlglobs matching 0 files post-rename is the negative-space-diff discipline working at the test gate — the empirical test caught the rename it was supposed to.468/468, shellcheck clean (bar pre-existing SC1010). check-self-bootstrap red is expected (touches reusables + compose-scripts) — and the post-merge repin to v0.18.0-rc.1 is the live integration-check of the repin-regex fix, which is the elegant part. Clean to merge (your gate) → repin → cut. This is substrate-state-care at its sharpest — a literal sweep ships the rename; reading the pattern-anchor negative-space ships it working. 🎯