feat(gates): refuse a v1.0.0 cut while ADR-0001 still reads accepted #1292
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#1292
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?
Two things must happen at the v1.0.0 cut and nothing enforces them — they live in a tracker someone has to remember to read at exactly the right moment.
Filed by @bosun, 2026-09-06, while working
#338.What has to fire, and why it is not neglect that it has not
Two surfaces say the same thing, and ADR-0009 carries operator ratification (2026-07-24) plus @surveyor's
4525. ⚠️ Sodocs/adr/0001-language-shell.mdcorrectly readsStatus: acceptedtoday while asserting shell is the project language — stale by design, and the design is written down twice.The second is a re-measurement, not a flip: TC-4's shell residual list must be re-read against the tree AT CUT TIME. Measured 2026-09-06 on
b954df1b: five files, all inside TC-4's four permitted categories.⚠️ §2.4 deliberately carries no total, because the count has expired four times in one milestone. The measurement above establishes the shape, not the final number.
Why a gate rather than a tracker
🔴
#1118put this exact disposition in a RETIRED acceptance criterion on a CLOSED tracker, where nothing would have fired. It was rescued by being copied into#338. That is the same failure one step later:#338is a tracker, and a tracker fires only if a human reads it at the right moment.🔑 The cut is a mechanical event that already runs checks. A refusal is the one carrier that cannot be forgotten.
Shape
A check that refuses a
v1.0.0cut whiledocs/adr/0001-language-shell.mdstill readsStatus: accepted, and that prints the current*.shresidual against TC-4's categories so the re-measurement happens by construction rather than by memory.⚠️ It must be inert for every other version. A gate that fires on v0.x cuts is a gate someone will disable.
AC
v1.0.0cut refuses while ADR-0001 readsStatus: accepted, naming ADR-0009 as the supersessiongit ls-files '*.sh'set, so TC-4's residual is re-read at cut time and not cited from this tracker#338's two cut-time ACs point here, and#338closes on its discipline halfRelated
#338(the carrier today),#1118(where the disposition was nearly lost), ADR-0009, ADR-0001,02-constraints.mdTC-4Anchor
@bosun, 2026-09-06. The disposition is correct and ratified; only its delivery mechanism is a hope.
Closed by
#1316, landed at6ca8d889(fast-forward —merge_commit_sha== the stamped head, andorigin/mainnow reads6ca8d889). @surveyor's APPROVED carriedcommit_id=6ca8d889, bound to the head at the moment of the merge.Each AC read off the landed tree, not off the PR description:
The gate went further than the shape asked for:
TestADRSupersession_CouldNotGradeIsItsOwnStateseparates a status this gate has no verdict for, no status line at all, an unreadable header and a tree without ADR-0001 — the first three could-not-grade, the fourth inert. That distinction is the one this tracker's own §Why a gate rather than a tracker argument depends on: a gate that rounds "I cannot read this ADR" into "nothing to do" is a tracker again, wearing a check's exit code.📌 What this does NOT cover, at the point of use: it refuses on ADR-0001's
Status:line and prints the residual. It does not grade the residual — TC-4's four permitted categories are re-read by a human against the printed set. The gate makes the re-measurement happen; it does not make the judgement.⚠️ And one thing measured on the way in, from @herald: the rebase tripwire showed six deletions, and they were
gofmtrealigningc5ExcludedVerbs— a longer key moves the:column and rewrites its neighbours. 6 removed, 7 added, nothing lost. A zero-deletions expectation would have refused a clean rebase, and a glance would have passed either state. The tripwire's arithmetic is entry COUNT, not deletion count.