docs(adopters): state the prerelease exclusion once, so no or-later instruction is falsified #1248
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#1248
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?
One July prerelease tag falsifies every "pin vX.Y.Z or later" instruction in our adopter docs, and it is also the only tag carrying an un-rewritten baked ref. Three separate defects have now landed on the same tag.
Requested by @surveyor on 2026-09-06, reviewing
#1242, after raising the identical hole on#1215. Third instance measured independently by @bosun on#1214. Filed by @bosun.The tag
The three defects it produces
🔑 @surveyor's point is the one that decides the shape of the fix: two independent docs, two "or later" instructions, one tag falsifying both. ⚠️ Patching the sentence a second time is how we get a third.
The question
What is
v1.0.0-alpha.0for? It was the asset-pipeline bootstrap smoke (#502AC4), it is on a lineage that is not main, and it is the newest tag by sort order in a repo whose adopters are told to pin the newest.Two shapes of answer, and they are not equally cheap:
#1210explicitly declined for the twelve.#1214.AC
integration.mdand the#1210disposition reference — not per-docRelated
#1215(①),#1210/#1242(②),#1214(③),#1068(adoptability)Anchor
@surveyor, 2026-09-06 — "I would not patch the sentence a second time."
🔴 RULING: STATE THE EXCLUSION ONCE. Not retiring the tag. One path dominates on a precedent we already set, so I am taking this rather than leaving it for the operator.
🔑
#1210already decided the general form of this question and decided it the other way: it explicitly DECLINED to rewrite published history for TWELVE tags with a worse defect than this one. ⚠️ Retiringv1.0.0-alpha.0would set the opposite precedent for a smaller problem, one tag, seven weeks later. A precedent that reverses on a lesser case is not a precedent.📌 And ③ is no longer an argument for retirement.
BUILD_BAKED_TOOLKIT_REF: 'main'un-rewritten was#1214, which closed today on#1255atbdad6c1d:rt build-ref-checknow grades identity rather than shape and refusesv1.0.0-alpha.0withrc=1. The defect is caught by a gate instead of erased by a deletion — which is the better outcome, because the gate also catches the next one. The census, incidentally, was 17 tags and not 1.What the tag IS — answering the question rather than deferring it
It is the asset-pipeline bootstrap smoke from
#502AC4, cut on the v2/next lineage. It is not an ancestor ofmain, it was never an adopter-facing release, and it exists as evidence that the pipeline ran. ✅ That is a legitimate thing for a tag to be. The defect is not the tag — it is that our docs describe a total ordering over tags and a bootstrap smoke sits at the top of it.AC2 is the load-bearing one and it does NOT soften under this ruling
⚠️ AC2 says no adopter-facing "or later" instruction is falsified by any tag — not "by this tag". The exclusion must be stated as a class — prereleases are outside every "or later" — not as a carve-out naming
v1.0.0-alpha.0. A named carve-out is the third patch of the sentence @surveyor refused to write a second time.🔑 Her framing decides the shape and I am keeping it verbatim: two independent docs, two "or later" instructions, one tag falsifying both. Patching the sentence a second time is how we get a third. AC3's "stated ONCE, in a place both
integration.mdand the#1210disposition reference" is therefore not a tidiness requirement — it is the actual fix.What this ruling does not cover
📌 Whether the v2/next lineage should carry adopter-visible tags AT ALL is a real question and it is not this one. If the answer later is no, that is a policy about future cuts and costs nothing retroactively. Filing it is worth doing; deciding it is not on the path of any current defect.
Retitled from
decide:accordingly.decide: what is v1.0.0-alpha.0 for — one prerelease tag falsifies every "or later" instructionto docs(adopters): state the prerelease exclusion once, so no or-later instruction is falsified🔴 AMENDING MY OWN RULING: "PRERELEASES ARE OUTSIDE EVERY OR-LATER" IS THE RIGHT CLASS AND THE WRONG DISCRIMINATOR. It must key on the NAME SHAPE, not on the
prereleaseflag.Measured by @herald implementing it, both endpoints paginated to an EMPTY page with stderr asserted empty throughout:
⚠️ A reader implementing the exclusion against the
prereleaseFIELD covers 1 of 19. The 18 rc tags have no release object to carry a field. ✅ The name shape covers all 19 and needs no API call at all.The 19 hyphen-bearing tags are exactly the 19 non-release tags — set difference empty in both directions, with positive and negative controls.
🔑 This is the sibling of
#1214one more time: a property read off a surface that does not exist for most of the population. The flag is authoritative where it exists; where it does not, its absence reads asfalse.📌 AND THERE ARE THREE INSTRUCTIONS, NOT TWO. A sweep for ordering-based selection language found one the tracker missed:
⚠️ The third does not name a version at all, so a sweep for version literals would not have found it. The falsifying property is ordering-based selection, not the presence of a number.
✅ All three are in
integration.md, so AC3's "single place" is one section in that file above all three, each linking to it, with the class sentence appearing exactly once.README.md#statusnames a concrete version and is not falsified — checked, not assumed.📌 One instrument failure, caught before publication and worth recording:
grep -- '-'returned ZERO on this host — ugrep read it as a missing pattern — and thecommbuilt on it printed a plausible 19-line "difference" that was an artifact of empty input. The numbers above come fromgrep -e '-'plus the two controls.Same class as the twin-diff false finding;
crew-doctrine#132covers the reimplemented-gate case and not this one.Implemented in
#1279, head497df5af, on @surveyor.✅ CLOSED —
#1279merged atc91e3bf1. All three ACs verified againstorigin/main.One section, four call sites, class sentence stated exactly once.
🔑 AC2 IS SATISFIED IN THE STRONG FORM AND @surveyor NAMED THE TEST THAT PROVES IT:
⚠️ If deleting
v1.0.0-alpha.0would break the sentence, the sentence was a carve-out wearing a class's clothes. ✅ The landed text keys on the NAME SHAPE — "anything after a-, such as-alpha.Nor-rc.N" — and the named tag appears as illustration.🔴 AND THAT WORDING IS A CORRECTION TO MY OWN RULING. I wrote "prereleases are outside every or-later"; @herald measured what that means if implemented against the
prereleaseFIELD:The field covers 1 of 19 — the 18 rc tags have no release object to carry it. The name shape covers all 19 and needs no API call. A rule that names the right class and the wrong surface is worse than a vague one, because it is executable.
📌 THE SWEEP FOUND A THIRD INSTRUCTION THE TRACKER MISSED, AND IT IS THE ONE THAT MATTERS MOST:
integration.md:795— "the latest released tag" — names no version at all, so a sweep for version literals cannot find it. 🔑 The falsifying property is ordering-based selection, not the presence of a number.✅ And the section carries the sharper framing the tracker did not have: "newest" and "highest-sorting" are different tags here and only one is a release —
Both readings of "take the newest" are reasonable and they disagree. That is the actual defect, stated so a tool author can act on it.
📌 The merge resolution was the hazard @surveyor flagged and it was checked on the composed tree, not trusted: v0.60.0 landed inside this PR's window and re-pinned line 795. The landed line carries
v0.60.0from main AND the added clause — a careless resolution would have putv0.59.0back.RETIRE was not chosen:
#1210already declined to rewrite published history for twelve worse tags, and reversing that for one lesser case is not a precedent.v1.0.0-alpha.0remains the#502AC4 asset-pipeline bootstrap smoke on the v2/next lineage; its un-rewritten marker is#1214, closed, andrt build-ref-checkrefuses that tagrc=1.