chore(v1.0.0): velocity discipline shift — SemVer stability contract commits to backward compat forward #338
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#338
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?
Finding
Velocity: 40 releases in 10 calendar days, 10 on June 26, 5 minor on July 2. Appropriate pre-1.0; not compatible with treating tool as boring/settled infrastructure.
External verdict: "promising pre-1.0 infrastructure, not adoptable release infrastructure."
Meta-observation
v1.0.0 SemVer signal: adopters pin @v1.0.0 trusting v1.x is backward-compatible. Commitment, not milestone marker.
Discipline shift
v1.0.0 relationship
META-DISCIPLINE, not code change. Commitment memorialization + checkpoint at v1.0.0 cut for velocity/stability calibration.
Closes at v1.0.0 cut with comment naming discipline shift as active.
Anchor
External correctness cold-read (anonymous ChatGPT session, uploaded to operator 2026-07-03). Full review surfaced 10 findings across 5 blocking-v1.0.0 + 2 should-fix pre-v1.0.0 + 3 post-v1.0.0 backlog. This tracker addresses one of them.
At the v1.0.0 cut — carried here from rt#1118 (closed)
#1118 decided that ADR-0001 stays as accepted history and that ADR-0009 supplies the status-flip boundary at v1.0.0. That disposition was recorded in a RETIRED acceptance criterion on a CLOSED tracker, so nothing would have fired at the cut. This section is where it fires. Verified 2026-09-04: no open tracker referenced ADR-0001 or a status flip.
docs/adr/0001-language-shell.md— flip**Status**: acceptedto superseded-by-ADR-0009. It readsacceptedonmainata1737c00; TC-4 has already been amended to the Go substrate (PR #1124), so the ADR is the last surface still asserting shell as the project language.git ls-files '*.sh'is the answer; §2.4 carries the criterion and deliberately carries no total.Why here: #338 already closes at the v1.0.0 cut with a comment naming the discipline shift as active, so it is the one open tracker guaranteed to be read at that moment.
Memorialization merged via PR #351 (commit
165bdba). Newdocs/VERSIONING.mdnames the v1.0.0 SemVer stability contract: v1.x preserves backward compat on workflow inputs / config schema / script CLI / documented behavior contracts; breaking changes require v2.0.0; deprecation cycle spans a minor before removal; tag immutability commitment; post-v1.0.0 cadence shifts to boring/settled infrastructure. Per this tracker's body: closes at v1.0.0 cut with the discipline-shift named as active.0007-manifest-commit-lifecycle.mddoes not exist (actual:0007-manifest-commit-direct-push.md) #657⏸️ DEFERRED by operator ruling, and expected to be among the LAST items on this board rather than a near-term decision.
Declaring v1.0.0 freezes workflow inputs, config schema and CLI args until v2.
⚠️ Today is evidence against declaring it yet: the manifest schema seed changed inside a patch release (
rt#1019). Under a v1 stability contract that is arguably a breaking change to a published artifact's shape — and it was the right fix, shipped the right way, on a v0.x.The useful work now is not the declaration; it is writing down what would make it safe. Suggested criteria, to be argued rather than adopted:
#1024) and fragment-gate (#1028) defects closed📌 A v1 you have to walk back is worse than a v0.x nobody adopts.
Fresh measurement for AC2, dated — NOT a discharge, because the AC's own instruction is not to trust a list.
git ls-tree -r --name-only origin/main | grep '\.sh$'ondfe9a85f+ (2026-09-05 05:50):Unchanged from the five named on 2026-09-04 — the count did not expire a fifth time, despite nine PRs merging and two releases cutting in between. That is worth knowing precisely because the tracker's premise is that it keeps moving: the last two
.shfiles to leave wererelease-assets.sh(#1112) andfork-pr-approval-notice.sh(#1113), both ported before this window.⚠️ This measurement expires the moment anyone adds or ports a script. AC2 says "re-read against the tree AT CUT TIME rather than trusting this list." This comment is a data point, not a substitute — re-run the one command at the v1.0.0 cut.
AC1 is correctly deferred, and the TREE says so rather than this tracker
docs/architecture/arc42/02-constraints.md, TC-4, on currentmain:So the flip is not pending work anyone forgot — it is scheduled machinery, recorded in the constraint it belongs to. This tracker fires AT the cut; it is not blocked on a decision and not waiting on an owner.
📌 Correcting @bosun's own earlier framing: this tracker was reported to the operator twice tonight as "needs a policy decision from you or @engineer." That was wrong — its body says "Closes at v1.0.0 cut" and TC-4 names the deferral independently. A tracker that fires on a future event is not the same as one blocked on a person, and reporting it as the latter asks someone to act who has nothing to do.
📌 Measurement only — no code, no ADR touched, tracker unassigned.
📌 BOTH OPEN ACs MEASURED AGAINST THE TREE, so the cut-time reader is not re-deriving them under pressure. Neither is ticked — both fire AT the cut, and that has not happened.
AC2 — the shell residual,
git ls-files '*.sh'onorigin/maintoday⚠️ The tracker says this count "has expired four times in one milestone", so this measurement is dated and will expire too. ✅ The AC is right that the command is the answer and no total belongs in prose — I am recording the list, not amending §2.4 to carry a number.
AC1 — ADR-0001 still reads
accepted, and it is the last surface asserting shellBoth read
accepted, which is the state the AC exists to end. 🔑 Not flipping it now, deliberately:#1118decided ADR-0009 supplies the status-flip boundary AT v1.0.0, so flipping early would assert a supersession that has not happened. The AC's placement here is the whole point — this is the one tracker guaranteed to be read at that moment.📌 On the tracker's own premise, re-measured
The extreme burst is historical — the top three days are all late June. ⚠️ 42 tags in 30 days is still ~1.4/day, which is not "boring, settled infrastructure" by the external reviewer's standard. ✅ The discipline shift this tracker memorialises is therefore still unfired rather than obsolete, and the cadence half of it ("consider slower release cadence post-v1.0.0 — batch minor changes") is the part the numbers still argue for.
What this tracker is actually waiting on
The v1.0.0 cut. ⚠️ And that is NOT a terminal state under this campaign's rules — blocked on another of our own issues relocates the question, it does not answer it.
#1068holds the cut, and its own last AC is the stranger test: a cold read by someone who did not build this, which no chamber can supply. The package is built and verified; the remaining step is a paste into a fresh outside-model session.(@bosun, 2026-09-06. Measurements taken so the cut-time reader inherits them rather than re-deriving them.)
📌 AC2's MEASUREMENT TAKEN NOW rather than deferred to the cut — the AC says "re-read against the tree rather than trusting this list", and the tree is readable today.
✅ Five, and the count matches what TC-4 named on 2026-09-04 — but the list is what matters and every member falls inside TC-4's four permitted categories (transitional, bootstrap, entrypoint, thin-check). No release-engine logic remains in shell.
⚠️ The AC's own warning is why this is a re-read and not a citation: the count has expired four times in one milestone. It must be re-run at the cut, against the tree as it is then — this measurement establishes the shape, not the final number. §2.4 deliberately carries no total for exactly that reason.
📌 AC1 IS GENUINELY CUT-GATED, AND BY A RATIFIED DECISION RATHER THAN BY NEGLECT. Recording it so nobody re-litigates it here:
Two surfaces say the same thing, and ADR-0009 carries operator ratification (2026-07-24) plus @surveyor's
4525at head04a69a3. ⚠️ FlippingADR-0001's status today would contradict a ratified ADR to fix a document that ADR-0009 already tells the reader is superseded-in-substance. The status line is stale-by-design, and the design is written down in two places.🔑 What that makes this tracker: the carrier for two actions that fire at one moment.
#1118put the same disposition in a RETIRED acceptance criterion on a CLOSED tracker, where nothing would have fired — that is the failure this section exists to prevent, and it is worth stating that a tracker held open as a trigger is doing a job, not waiting.The discipline half is already landed
docs/VERSIONING.mdcarries the SemVer commitment in full — the four preserved surfaces, thertCLI surface as contract C5, the breaking-change list, and the paths α/γ contract. ✅ The memorialization this tracker asked for exists onmainand is adopter-readable today.⚠️ One defect found in it while checking:
VERSIONING.md:3still says "latest: v0.56.1", four releases stale. Filed as#1283— the fix is deletion, not a bump.✅ CLOSED. The discipline half is landed and verified; the two cut-time actions now have a MECHANICAL carrier —
#1292— instead of this tracker.The discipline is memorialized and adopter-readable today
docs/VERSIONING.mdcarries the SemVer commitment in full: the four preserved surfaces (workflow input schemas, workflow output schemas, config schema, documented behaviour contracts), thertCLI surface as contract C5, the breaking-change list, the deprecation cycle, and the paths α/γ contract. That is what this tracker asked for and it is onmain.AC2's re-measurement, taken rather than deferred
Every member falls inside TC-4's four permitted categories — transitional, bootstrap, entrypoint, thin-check. No release-engine logic remains in shell.
🔴 WHY THIS CLOSES RATHER THAN WAITING FOR THE CUT, AND IT IS
#1118's OWN LESSON APPLIED ONE STEP FURTHER.#1118put this disposition in a retired acceptance criterion on a closed tracker, where nothing would have fired. It was rescued by copying it here. ⚠️ But this is a tracker too, and a tracker fires only if a human reads it at exactly the right moment. Being the one tracker "guaranteed to be read at the cut" is a hope with better odds, not a mechanism.✅
#1292makes it a REFUSAL: av1.0.0cut cannot proceed whiledocs/adr/0001-language-shell.mdreadsStatus: accepted, and the refusal prints the live*.shresidual so TC-4 is re-measured by construction rather than cited from a tracker.📌 The disposition itself is unchanged and remains correct: ADR-0009 supersedes ADR-0001 at the v1.0.0 cut, not before, ratified by the operator 2026-07-24 with @surveyor's
4525, and TC-4 says the same. ADR-0001 readingacceptedtoday is stale BY DESIGN, and the design is written down twice.⚠️ One defect found in
VERSIONING.mdwhile checking it: line 3 said "latest: v0.56.1", four releases stale. Filed as#1283, fixed by#1288— deletion, not a bump, because nothing owns that sentence.AC1 and AC2 tick as DEFERRED →
#1292, which owns them.