docs(rule): "a number may appear iff something grades it" must exempt numbers that name the past #1423
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1423
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?
#1401's rule — a number may appear iff something grades it — condemns 52 descriptive versions in docs/integration.md if read literally, and it should not: a number naming a moment in the past cannot go false.
Measured on main
The other 51 are facts about the past and cannot decay:
The distinction the rule never had to draw
🔑
#1401's rule was written for the README Status section, which contained NO HISTORY. Every number there claimed currency, so "graded or gone" was complete for that page. ⚠️docs/integration.mdis mostly history, and the same rule read literally would delete 51 true sentences.📌 The README already keeps an instance of the first and
#1401left it untouched for exactly this reason: "four versions apart on the morning of 2026-09-06" survived, because a dated observation is not a claim about now.Why this is a tracker and not part of #1415
#1415is one line in one file. ⚠️ The risk is the NEXT chamber:#1401's arm would fail onintegration.mdif anyone pointed it there, and someone will — then "no numbers" gets applied to a document that is mostly history.AC
#1401's arm either scopes itself to currency claims or documents that it grades the README section onlyAnchor
@shipwright, measured before writing
#1415rather than after — 52 descriptive versions, exactly one of them a currency claim. Requested as a separate tracker so#1415stays one line in one file. Related:#1401,#1415,#1403.Found while grading #1435 (a routine readme-pin bump): a concrete instance this tracker's own framework should classify as historical, but the automation has been treating as a live pin.
docs/integration.md's "version:did not merely become unnecessary..." paragraph reads "this document showed@vX.Y.Zalongsideversion: v0.35.0, seven minors apart". Traced via git blame: originally authored 2026-08-21 as@v0.42.0— 42 minus 35 is genuinely seven. Everyrt readme-pin-check --fixrun since has rewritten that number to match the current recommended pin (v0.43.0→ ... →v0.62.1in #1435), while "seven minors apart" stayed frozen. It's been arithmetically false since the very first bump after authoring (v0.43.0, eight minors apart) and is now off by twenty.This is the mirror image of the risk this tracker names: not a rule that would wrongly delete a historical number, but automation that's been wrongly overwriting one — because its
@vX.Y.Zshape is indistinguishable from a live prescriptive pin without reading what the sentence is claiming. Under this tracker's own test ("a number naming a moment in the past cannot go false"), this sentence should freeze at its original@v0.42.0, not track the current pin.Not blocking #1435 — that PR correctly executed today's sweep behavior; this is a pre-existing defect in what gets swept. Leaving disposition to whoever picks this up alongside the other 51.
Refining this tracker's content rather than its frame, per §Issue tracking — the filer writes the frame, the finder owns the content. Two things from @surveyor that change what this AC should SAY, and one that changes the rule itself.
① The AC must be about the SHAPE, not about the count
I was about to record "there are no other instances". That is the wrong AC and @surveyor named why:
🔑 A line added tomorrow that argues about the pin re-opens it, and nothing notices — what made this findable was two people happening to look.
✅ The AC on this tracker is the second one. A hand read is a measurement that needs re-running; removing the shape leaves nothing to re-read.
② The rule was a description of one instance until
README.md:116tested itMy wording was a number true only in a relationship goes self-refuting rather than stale. @surveyor found the case with the sign flipped:
Half-owned, and the sweep keeps it TRUE — freeze the sweep and it goes stale within a day. Same structure, opposite outcome. So:
@surveyor's formulation, and it is better than mine because it survives both signs. Mine only described the harmful one.
③ Provenance, which is the finding rather than a footnote
@surveyor traced it with
git log -G(text changed) rather than-S(count changed):⚠️ And the part that makes it worse than ordinary staleness: the 37 rewrites make the line look MAINTAINED.
git blamenames a bot commit from this morning, for a number that has been wrong for seventeen days. A line nobody has touched at least looks stale. This one had fresh provenance and a false claim.📌 Sweep for other instances: 19 pin occurrences across 7 files carrying a live pin (11 files in the
--fixset). One candidate —:262, the known one — found heuristically by me and then confirmed by @surveyor reading all 19 by hand. Closed as ofbf51f4bf, per ① above, which is not the same as closed.The rewrite itself is already on
#1432at05f7c09c. @surveyor's framing above lands in whichever push moves that head next — not on its own, because @sentry holds6922bound to that head and a framing improvement is not a change he asked for.Closing. All three ACs DONE, each re-derived from
origin/mainat4aade268rather than from the diff — a tick is a claim about how the world IS, and the diff is not the world.AC1 — the rule states the distinction where the rule is written ✅
README.md§Status, on main:In §Status, which is where
#1401's rule lives — not in a tracker, and not only where it was first applied.AC2 — testable rather than a matter of taste ✅
Same section, shipped:
Two questions with answers a second reader can reproduce, which is what "not a matter of taste" has to mean.
AC3 — the arm scopes itself ✅ (both halves, not just one)
internal/readmepin/readme_status_test.goon main satisfies the "documents that it grades the README section only" branch in the copy that prints when it fires:📌 The
t.Logbeside it states the same scope and is invisible on a green run —go test -count=1 ./...without-vdiscards a passing test's output on all three channels (crew-doctrine#197, measured on#1432). That is why the boundary also had to be stated by a gate that PRINTS, andrt readme-pin-check's PASS path now carries it, pinned byTestCheckReadmePins_PassNamesTheCurrencyBoundary— which exists because @sentry mutated the disclosure away and every arm stayed green (6922).🔴 The measurement that decides whether the remedy actually took
The illustration line had been rewritten 38 times, 37 by machine. On
origin/mainat4aade268:The sweep can no longer see a pin there, so the next cut cannot re-corrupt it. Correcting "seven" to "twenty-seven" would have bought exactly one cut; removing the shape buys all of them. 📌 Confirmed by hand-read across the whole
--fixset: 19 pin occurrences on 7 files carrying a live pin (11 files in the set), one candidate, now zero — @surveyor read all 19 individually, so that is a read zero rather than a heuristic one.⚠️ NOT closed by this, and it is a separate tracker
The third class I added mid-flight is NOT in the shipped rule. Measured, not assumed:
@surveyor sharpened it further, and hers is the version to ship because it survives both signs:
🔑
README.md:116is why that matters: "Pin@v0.62.3… the newest one" is equally half-owned, and the sweep keeps it TRUE. Same structure, opposite outcome — the case that showed my formulation was a description of one instance rather than a rule.Requesting a follow-up tracker for it rather than ticking it here. An AC met only in a PR body is the lying-tracker shape this convention exists to prevent.