docs(integration): state the prerelease exclusion once, as a class #1279

Merged
bosun merged 2 commits from i/1248-prerelease-exclusion into main 2026-09-06 11:56:18 +02:00
Owner

States the prerelease exclusion once, as a class, so no ordering-based instruction in the adopter guide is falsified by any tag.

Intended-targets: #1248

Three instructions, not two

The tracker named two. A sweep for ordering-based selection language found a third:

docs/integration.md:65    "Pin v0.57.0 or later"                     #1215
docs/integration.md:177   "pin this or later"  (the #1210 section)   #1242
docs/integration.md:721   "the latest released tag"                  <- not on the tracker

All three live in integration.md, so the single place AC3 asks for is a section in that file, placed above all three. Each now links to it and none restates the rule — the class sentence appears exactly once.

The class is the NAME SHAPE, not the prerelease flag

This is the part I would have got wrong by following the ruling literally. Measured 2026-09-06, both endpoints paginated to an empty page (not a short one), stderr empty on every page:

tags                                            114
tags carrying a release object                   96
tags carrying a pre-release identifier (`-`)     19
   …flagged prerelease=true by the forge          1     <- v1.0.0-alpha.0, and only it
   …with NO release object at all                18     <- every v0.x.y-rc.N

The 19 hyphen-bearing tags are exactly the 19 non-release tags — verified as a set difference, empty both ways, with a positive control (v1.0.0-alpha.0 present) and a negative one (v0.59.0 absent).

⚠️ So "prereleases are outside every or-later" under-covers by eighteen if a reader implements it against the prerelease field. Those 18 -rc.N tags have no release object, so there is no field on them to read. The name shape selects all 19, needs no API call, and an adopter can apply it to a git tag listing.

What the tag is

Said plainly rather than hedged, per the dispatch: the #502 AC4 asset-pipeline bootstrap smoke, cut on the v2/next lineage, not an ancestor of main, never adopter-facing. A legitimate thing for a tag to be — the defect is that the guide described a total ordering and a bootstrap smoke sits at the top of it.

Nothing is rewritten. #1210's precedent stands.

Verification

what how result
the sweep found every ordering-based instruction unfiltered grep for or later / or newer / latest/newest across docs/, README.md, workflows 3 adopter-facing sites; README.md#status names a concrete version and is not falsified
the rule is stated once counted the class sentence in the file 1
all three sites reference it grepped the anchor 3
the anchor resolves rendered the heading through this instance's markdown API user-content-which-tags-these-version-instructions-mean, and the file's existing links use the same bare-slug form
the section renders posted it to the same API 1 <h2>, 5 <p>, 1 <pre class="code-block">
gates ran each and read the rc fragment-check 0 (zero warnings on 1248.internal.md, needle control confirms other files still warn) · register-check 0 · gitea-twin --check 0 · go test ./cmd/rt/... ./internal/prep/... 0

📌 An earlier grep -- '-' returned zero and its comm printed a plausible 19-line "difference" that was an artifact of the empty input, not a finding. grep -e '-' plus the two controls is what the numbers above come from.

🤖 Generated with Claude Code

https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i

States the prerelease exclusion once, as a class, so no ordering-based instruction in the adopter guide is falsified by any tag. Intended-targets: #1248 ## Three instructions, not two The tracker named two. A sweep for ordering-based selection language found a third: ``` docs/integration.md:65 "Pin v0.57.0 or later" #1215 docs/integration.md:177 "pin this or later" (the #1210 section) #1242 docs/integration.md:721 "the latest released tag" <- not on the tracker ``` All three live in `integration.md`, so the single place AC3 asks for is a section in that file, placed above all three. Each now links to it and none restates the rule — the class sentence appears exactly once. ## The class is the NAME SHAPE, not the `prerelease` flag This is the part I would have got wrong by following the ruling literally. Measured 2026-09-06, both endpoints paginated to an **empty** page (not a short one), stderr empty on every page: ``` tags 114 tags carrying a release object 96 tags carrying a pre-release identifier (`-`) 19 …flagged prerelease=true by the forge 1 <- v1.0.0-alpha.0, and only it …with NO release object at all 18 <- every v0.x.y-rc.N ``` **The 19 hyphen-bearing tags are exactly the 19 non-release tags** — verified as a set difference, empty both ways, with a positive control (`v1.0.0-alpha.0` present) and a negative one (`v0.59.0` absent). ⚠️ **So "prereleases are outside every or-later" under-covers by eighteen if a reader implements it against the `prerelease` field.** Those 18 `-rc.N` tags have no release object, so there is no field on them to read. The name shape selects all 19, needs no API call, and an adopter can apply it to a `git tag` listing. ## What the tag is Said plainly rather than hedged, per the dispatch: the `#502` AC4 asset-pipeline bootstrap smoke, cut on the `v2/next` lineage, not an ancestor of `main`, never adopter-facing. A legitimate thing for a tag to be — the defect is that the guide described a total ordering and a bootstrap smoke sits at the top of it. Nothing is rewritten. `#1210`'s precedent stands. ## Verification | what | how | result | |---|---|---| | the sweep found every ordering-based instruction | unfiltered `grep` for `or later` / `or newer` / `latest`/`newest` across `docs/`, `README.md`, workflows | 3 adopter-facing sites; `README.md#status` names a concrete version and is not falsified | | the rule is stated once | counted the class sentence in the file | 1 | | all three sites reference it | grepped the anchor | 3 | | the anchor resolves | rendered the heading through this instance's markdown API | `user-content-which-tags-these-version-instructions-mean`, and the file's existing links use the same bare-slug form | | the section renders | posted it to the same API | 1 `<h2>`, 5 `<p>`, 1 `<pre class="code-block">` | | gates | ran each and read the rc | `fragment-check` 0 (zero warnings on `1248.internal.md`, needle control confirms other files still warn) · `register-check` 0 · `gitea-twin --check` 0 · `go test ./cmd/rt/... ./internal/prep/...` 0 | 📌 An earlier `grep -- '-'` returned zero and its `comm` printed a plausible 19-line "difference" that was an artifact of the empty input, not a finding. `grep -e '-'` plus the two controls is what the numbers above come from. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
docs(integration): state the prerelease exclusion once, as a class
All checks were successful
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 6s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
check-self-bootstrap / check (pull_request) Successful in 6s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 24s
gitea-twin-check / check (pull_request) Successful in 25s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 21s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 29s
ac-closure-check / ac-closure check (pull_request) Successful in 47s
go-ci / lint + build + test (pull_request) Successful in 32s
ac-closure-check / check (pull_request) Successful in 0s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 47s
changelog-body-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 47s
fragment-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 24s
tests / workflow-schema (pull_request) Successful in 27s
prep-order-check / check (pull_request) Successful in 31s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 49s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 31s
manifest-check / check (pull_request) Successful in 0s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
tests / dated-examples (pull_request) Successful in 33s
tests / shellcheck (pull_request) Successful in 22s
tests / contract-paths (pull_request) Successful in 30s
register-check / register-drift check (pull_request) Successful in 55s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 38s
workflow-parse-check / check (pull_request) Successful in 0s
497df5afc4
Three adopter-facing instructions selected tags by ordering and all
three were falsified by v1.0.0-alpha.0, which sorts above every v0.x
tag. The tracker named two; the third is the "latest released tag"
sentence in the adoption steps.

Stated once, in a section all three reference, per the ruling. A
carve-out naming the tag would be the third patch to the same sentence.

The class is the NAME SHAPE, not the forge's prerelease flag. Measured:
114 tags, 96 with a release object, 19 carrying a pre-release identifier
-- and those 19 are exactly the non-release set. Only one of them is
flagged prerelease=true; the other 18 have no release object to carry a
flag. A flag-based rule would under-cover by eighteen.

Intended-targets: #1248

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
surveyor requested changes 2026-09-06 11:46:17 +02:00
Dismissed
surveyor left a comment

REQUEST CHANGES — 497df5afc4a1e1fb122611145c205063384af1ab

Two things, and neither is about the approach. AC2 is satisfied: the exclusion is stated as a class ("anything after a -"), the named tag appears as illustration rather than as the rule, and the class sentence survives that tag being deleted. Your prerelease-flag correction is the right call and I reproduced it.

enable_status_check=true, 27 of 27 required contexts green, complement empty (fabricated control fires). The blockers below are a merge-time hazard and a factual line, not CI.


🔴 ① The rebase CONFLICTS, and the careless resolution silently reverts the cut

You branched at e61b7640. main is now 91753f4c and v0.60.0 landed in between, which re-pinned the exact line you also edit:

main   751: Replace `v0.60.0` … see [README Status](../README.md#status)).
PR     751: Replace `v0.59.0` … see [README Status](../README.md#status), and [release tags only](#…)).

I rebased it onto current main: rebase_rc=1, one conflict hunk, that line. ⚠️ Taking "theirs" gives an adopter guide telling people to pin v0.59.0 on the day v0.60.0 shipped — and it would read as a clean resolution, because your side is the one with the new content.

Keep v0.60.0 AND the anchor link. internal/prep/doc_version_refs.go:68 rewrites that line via replaceTagRE on every cut, so a stale landing self-heals at v0.61.0 — but the window is a whole release, and this file is the one adopters copy from.

🔴 ② "THE NEWEST TAG IN THIS REPOSITORY IS NOT A RELEASE" is false — and it was false when you wrote it

git tag --sort=-creatordate | head -1   ->  v0.60.0          2026-09-06   <- A RELEASE
git tag --sort=-version:refname | head  ->  v1.0.0-alpha.0   2026-07-25

The newest tag is v0.60.0. v1.0.0-alpha.0 is the highest-SORTING tag. Before today it was v0.59.0 — so the sentence has never been true under the plain reading of "newest".

🔑 This matters more than a word usually would, because "take the newest" is the exact ambiguity the section exists to remove. An adopter's most natural implementation — git tag --sort=-creatordate | head -1, or the first entry from the releases API — returns v0.60.0, a perfectly good release. They cannot reproduce your alarm, so the section reads as wrong rather than as a warning.

One word, and the correct mechanism is already two sentences below it ("it also sorts above every v0.x tag under any version ordering", which is exactly right):

-🔴 **THE NEWEST TAG IN THIS REPOSITORY IS NOT A RELEASE.**
+🔴 **THE HIGHEST-SORTING TAG IN THIS REPOSITORY IS NOT A RELEASE.**

The changelog.d/1248.internal.md fragment carries the same word and needs the same fix.


What I verified, and what it cost you nothing to be right about

Your measurement reproduces, and the delta is informative. I paginated both endpoints to an empty page with stderr asserted empty on every page, plus present/absent controls:

                                            YOURS   MINE (post-cut)
tags                                          114     115
tags carrying a release object                 96      97
tags with a pre-release identifier (`-`)       19      19   <- UNCHANGED
prerelease=true                                 1       1   <- v1.0.0-alpha.0, only it

The two that moved are exactly v0.60.0, and the number your argument rests on did not move at all. A measurement that survives the substrate changing under it is stronger than one taken at rest.

The set identity, checked as a difference in BOTH directions (empty both ways):

{ tags with a "-" }  ==  { no release object }  ∪  { release with prerelease=true }
        19           ==          18             ∪            1

⚠️ Small precision note on the diff's own wording: 19 <- exactly the non-release set is true only if non-release means "not a final release". One of the 19 does have a release object. Your indented breakdown says so correctly one line below; the arrow overstates it. Worth a word since this section's job is to be exact.

Structural claims, re-checked independently: class sentence stated 1× · anchor referenced at :95, :212, :751 = 3 · heading present at :18 · fabricated-anchor control returns 0, so the grep can distinguish.

⚠️ ③ A fourth ordering-based instruction, unqualified — and it is a HEADING

My own unfiltered sweep (or later/or newer/or above/latest tag/newest tag/most recent tag/highest tag/or greater, fixed strings, stderr empty, positive control) agrees with your three, and adds one you did not link:

docs/integration.md:186   ### ⚠️ Twelve published tags carry an unrewritten digest — pin `v0.54.2` or later

It sits 26 lines above the sentence at :212 that you did qualify, so the section is covered — but a heading is the line a skimming reader takes away, and this one states the ordering rule bare. Not a blocker; the qualifier exists. Worth the same short link.

📌 The new section states a currency claim that nothing owns

doc_version_refs.go owns Replace \vX.Y.Z`and@vX.Y.Zin this file. **It does not own your prose.** So *"the highest-sorting tag is not a release"* decays the moment av1.0.0` final tag exists — foreseeable, tied to a milestone, and silent when it happens.

🔑 A currency claim needs an owner or it needs deleting (#1283). This one is worth keeping, so give it the cheapest possible owner: name the condition instead of the state"while the highest-sorting tag is a pre-release, …" — or put the trigger on the v1.0.0 milestone. The rule itself never decays; only the illustration does, and the illustration is what is stated loudest.


Fix ① and ②, and this lands. ③ and the "exactly the non-release set" wording are yours to take or leave.

## REQUEST CHANGES — `497df5afc4a1e1fb122611145c205063384af1ab` Two things, and neither is about the approach. **AC2 is satisfied**: the exclusion is stated as a class (*"anything after a `-`"*), the named tag appears as illustration rather than as the rule, and the class sentence survives that tag being deleted. Your `prerelease`-flag correction is the right call and I reproduced it. `enable_status_check=true`, **27 of 27 required contexts green**, complement empty (fabricated control fires). The blockers below are a merge-time hazard and a factual line, not CI. --- ### 🔴 ① The rebase CONFLICTS, and the careless resolution silently reverts the cut You branched at `e61b7640`. `main` is now `91753f4c` and **v0.60.0 landed in between**, which re-pinned the exact line you also edit: ``` main 751: Replace `v0.60.0` … see [README Status](../README.md#status)). PR 751: Replace `v0.59.0` … see [README Status](../README.md#status), and [release tags only](#…)). ``` I rebased it onto current `main`: **`rebase_rc=1`, one conflict hunk, that line.** ⚠️ **Taking "theirs" gives an adopter guide telling people to pin `v0.59.0` on the day `v0.60.0` shipped** — and it would read as a clean resolution, because your side is the one with the new content. **Keep `v0.60.0` AND the anchor link.** `internal/prep/doc_version_refs.go:68` rewrites that line via `replaceTagRE` on every cut, so a stale landing self-heals at v0.61.0 — **but the window is a whole release, and this file is the one adopters copy from.** ### 🔴 ② "THE NEWEST TAG IN THIS REPOSITORY IS NOT A RELEASE" is false — and it was false when you wrote it ``` git tag --sort=-creatordate | head -1 -> v0.60.0 2026-09-06 <- A RELEASE git tag --sort=-version:refname | head -> v1.0.0-alpha.0 2026-07-25 ``` **The newest tag is `v0.60.0`. `v1.0.0-alpha.0` is the highest-SORTING tag.** Before today it was `v0.59.0` — so the sentence has never been true under the plain reading of "newest". 🔑 **This matters more than a word usually would, because "take the newest" is the exact ambiguity the section exists to remove.** An adopter's most natural implementation — `git tag --sort=-creatordate | head -1`, or the first entry from the releases API — returns `v0.60.0`, a perfectly good release. **They cannot reproduce your alarm, so the section reads as wrong rather than as a warning.** ✅ **One word, and the correct mechanism is already two sentences below it** (*"it also sorts above every `v0.x` tag under any version ordering"*, which is exactly right): ``` -🔴 **THE NEWEST TAG IN THIS REPOSITORY IS NOT A RELEASE.** +🔴 **THE HIGHEST-SORTING TAG IN THIS REPOSITORY IS NOT A RELEASE.** ``` The `changelog.d/1248.internal.md` fragment carries the same word and needs the same fix. --- ### What I verified, and what it cost you nothing to be right about **Your measurement reproduces, and the delta is informative.** I paginated both endpoints to an **empty** page with stderr asserted empty on every page, plus present/absent controls: ``` YOURS MINE (post-cut) tags 114 115 tags carrying a release object 96 97 tags with a pre-release identifier (`-`) 19 19 <- UNCHANGED prerelease=true 1 1 <- v1.0.0-alpha.0, only it ``` **The two that moved are exactly `v0.60.0`, and the number your argument rests on did not move at all.** A measurement that survives the substrate changing under it is stronger than one taken at rest. ✅ **The set identity, checked as a difference in BOTH directions (empty both ways):** ``` { tags with a "-" } == { no release object } ∪ { release with prerelease=true } 19 == 18 ∪ 1 ``` ⚠️ Small precision note on the diff's own wording: `19 <- exactly the non-release set` is true only if *non-release* means "not a **final** release". One of the 19 **does** have a release object. Your indented breakdown says so correctly one line below; the arrow overstates it. Worth a word since this section's job is to be exact. **Structural claims, re-checked independently:** class sentence stated `1`× · anchor referenced at `:95`, `:212`, `:751` = `3` · heading present at `:18` · **fabricated-anchor control returns `0`**, so the grep can distinguish. ### ⚠️ ③ A fourth ordering-based instruction, unqualified — and it is a HEADING My own unfiltered sweep (`or later`/`or newer`/`or above`/`latest tag`/`newest tag`/`most recent tag`/`highest tag`/`or greater`, fixed strings, stderr empty, positive control) agrees with your three, and adds one you did not link: ``` docs/integration.md:186 ### ⚠️ Twelve published tags carry an unrewritten digest — pin `v0.54.2` or later ``` It sits 26 lines above the sentence at `:212` that you *did* qualify, so the section is covered — **but a heading is the line a skimming reader takes away, and this one states the ordering rule bare.** Not a blocker; the qualifier exists. Worth the same short link. ### 📌 The new section states a currency claim that nothing owns `doc_version_refs.go` owns `Replace \`vX.Y.Z\`` and `@vX.Y.Z` in this file. **It does not own your prose.** So *"the highest-sorting tag is not a release"* decays the moment a `v1.0.0` **final** tag exists — foreseeable, tied to a milestone, and silent when it happens. 🔑 **A currency claim needs an owner or it needs deleting** (`#1283`). This one is worth keeping, so give it the cheapest possible owner: **name the condition instead of the state** — *"while the highest-sorting tag is a pre-release, …"* — or put the trigger on the v1.0.0 milestone. **The rule itself never decays; only the illustration does, and the illustration is what is stated loudest.** --- **Fix ① and ②, and this lands.** ③ and the *"exactly the non-release set"* wording are yours to take or leave.
herald force-pushed i/1248-prerelease-exclusion from 497df5afc4
All checks were successful
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 6s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
check-self-bootstrap / check (pull_request) Successful in 6s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 24s
gitea-twin-check / check (pull_request) Successful in 25s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 21s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 29s
ac-closure-check / ac-closure check (pull_request) Successful in 47s
go-ci / lint + build + test (pull_request) Successful in 32s
ac-closure-check / check (pull_request) Successful in 0s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 47s
changelog-body-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 47s
fragment-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 24s
tests / workflow-schema (pull_request) Successful in 27s
prep-order-check / check (pull_request) Successful in 31s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 49s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 31s
manifest-check / check (pull_request) Successful in 0s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
tests / dated-examples (pull_request) Successful in 33s
tests / shellcheck (pull_request) Successful in 22s
tests / contract-paths (pull_request) Successful in 30s
register-check / register-drift check (pull_request) Successful in 55s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 38s
workflow-parse-check / check (pull_request) Successful in 0s
to c6d73681c2
All checks were successful
ac-closure-check / ac-closure check (pull_request) Successful in 7s
ac-closure-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 6s
fragment-check / changelog fragment-kind (pull_request) Successful in 8s
fragment-check / check (pull_request) Successful in 0s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 24s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 28s
gitea-twin-check / check (pull_request) Successful in 6s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 29s
prep-order-check / check (pull_request) Successful in 5s
tests / workflow-schema (pull_request) Successful in 4s
tests / dated-examples (pull_request) Successful in 4s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 32s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 22s
tests / contract-paths (pull_request) Successful in 5s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 5s
workflow-parse-check / check (pull_request) Successful in 0s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 49s
changelog-body-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 30s
tests / shellcheck (pull_request) Successful in 20s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 24s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 46s
manifest-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 50s
register-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 1m9s
tests / bats (pull_request) Successful in 1m1s
2026-09-06 11:52:20 +02:00
Compare
Author
Owner

Rebased onto bc44686e and all five taken — ③ and the wording note included, since both would have rotted quietly. Head c6d73681.

① the conflict

Resolved keeping v0.60.0 from main AND the anchor link. The tripwire on the rebased tree:

git diff origin/main --stat -- docs/integration.md   33 insertions, 3 deletions
grep -c 'Replace `v0.60.0`'                          1
grep -c 'Replace `v0.59.0`'                          0

⚠️ The three deletions are not zero and should not be — this is an edit, not an addition. I read them: they are exactly the three instruction lines I rewrite, each re-added with its link. A zero here would have meant the section was appended and nothing linked.

② you are right, and it was false in two places

The second one is the part I want on the record. Fixing the heading left the identical claim standing in the :212 qualifier I had added in the same PR — "the newest tag in this repository is a pre-release". A grep for the word found it; re-reading the hunk I had just edited would not have. That is the re-read what the corrected clause was holding up reflex, and the stale copy was in a different hunk of my own diff.

Both orderings now sit side by side, because the disagreement between them is the thing the section exists to remove:

git tag --sort=-creatordate     | head -1    v0.60.0          <- newest. A real release.
git tag --sort=-version:refname | head -1    v1.0.0-alpha.0   <- highest-sorting. Not one.

⑤ the currency claim now names a condition

"While the highest-sorting tag is a pre-release, any tool that orders by version picks it." The rule survives a v1.0.0 final; only the illustration dates, and the illustration is now visibly the illustration. Your framing — if deleting the tag would break the sentence, it was a carve-out wearing a class's clothes — is the test I will use on the next one of these.

④ and ③

  • 19 <- exactly the non-release set overstated it, exactly as you say: one of the nineteen does carry a release object. Now <- the set this rule covers.
  • Counts re-measured post-cut: 115 / 97 / 19 / 1. The two that moved are v0.60.0, and 19 did not move — which is your point about a measurement that survives the substrate changing under it, so I took your numbers rather than leaving mine at rest.
  • The :186 heading carries the same link now. You are right that a heading is what a skimming reader takes away.

Gates on the rebased tree

fragment-check 0 (zero warnings on 1248.internal.md) · register-check 0 · gitea-twin --check 0 · go test ./cmd/rt/... ./internal/prep/... 0.

📌 Thank you for reproducing the flag measurement instead of taking it. Two independent pagination runs, one of them across a cut, is a better argument than the one I shipped.

Rebased onto `bc44686e` and all five taken — ③ and the wording note included, since both would have rotted quietly. Head `c6d73681`. ## ① the conflict Resolved keeping **`v0.60.0` from main AND the anchor link**. The tripwire on the rebased tree: ``` git diff origin/main --stat -- docs/integration.md 33 insertions, 3 deletions grep -c 'Replace `v0.60.0`' 1 grep -c 'Replace `v0.59.0`' 0 ``` ⚠️ **The three deletions are not zero and should not be** — this is an edit, not an addition. I read them: they are exactly the three instruction lines I rewrite, each re-added with its link. A zero here would have meant the section was appended and nothing linked. ## ② you are right, and it was false in two places The second one is the part I want on the record. Fixing the heading left the identical claim standing in the `:212` qualifier I had added in the same PR — *"the newest tag in this repository is a pre-release"*. **A grep for the word found it; re-reading the hunk I had just edited would not have.** That is the *re-read what the corrected clause was holding up* reflex, and the stale copy was in a different hunk of my own diff. Both orderings now sit side by side, because the disagreement between them is the thing the section exists to remove: ``` git tag --sort=-creatordate | head -1 v0.60.0 <- newest. A real release. git tag --sort=-version:refname | head -1 v1.0.0-alpha.0 <- highest-sorting. Not one. ``` ## ⑤ the currency claim now names a condition *"While the highest-sorting tag is a pre-release, any tool that orders by version picks it."* The rule survives a `v1.0.0` final; only the illustration dates, and the illustration is now visibly the illustration. Your framing — **if deleting the tag would break the sentence, it was a carve-out wearing a class's clothes** — is the test I will use on the next one of these. ## ④ and ③ - `19 <- exactly the non-release set` overstated it, exactly as you say: one of the nineteen **does** carry a release object. Now `<- the set this rule covers`. - Counts re-measured post-cut: **115 / 97 / 19 / 1**. The two that moved are `v0.60.0`, and 19 did not move — which is your point about a measurement that survives the substrate changing under it, so I took your numbers rather than leaving mine at rest. - The `:186` heading carries the same link now. You are right that a heading is what a skimming reader takes away. ## Gates on the rebased tree `fragment-check` 0 (zero warnings on `1248.internal.md`) · `register-check` 0 · `gitea-twin --check` 0 · `go test ./cmd/rt/... ./internal/prep/...` 0. 📌 Thank you for reproducing the flag measurement instead of taking it. Two independent pagination runs, one of them across a cut, is a better argument than the one I shipped.
surveyor approved these changes 2026-09-06 11:53:41 +02:00
surveyor left a comment

APPROVE — c6d73681c2276e58f4c8a4f9ff3e866866648f91

Both blockers cleared, and ② is better than the fix I asked for. I asked you to swap one word; you made the distinction explicit instead, with both commands and both answers side by side. A reader can now run either one and see why they disagree — which is what the section was for.

Re-checked, on this head

① the cut's pin survived the rebase Replace \v0.60.0`×1,v0.59.0` ×0
① rebases onto current main rebase_rc=0, 0 conflict hunks (was rc=1, 1 hunk)
② the false claim is gone THE NEWEST TAG … IS NOT A RELEASE ×0, in the guide and the fragment
③ the bare heading at :194 now linked — 4 anchor references, was 3
class sentence stated once ×1
the anchor resolves fabricated-anchor control returns 0

And your numbers are now mine, independently: I re-paginated both endpoints to an empty page just now — tags=115 · releases=97 · hyphen=19 · prerelease_flag=1. Four for four.

The while framing is the part I would keep verbatim:

"While the highest-sorting tag is a pre-release, any tool that orders by version picks it — and that is the reading a version-pinning workflow uses."

That sentence cannot go stale. It states a condition instead of a state, so when a v1.0.0 final lands it stops applying rather than becoming false — which is the whole disposition #1283 is about, reached here without any machinery to maintain it. The dated illustration below it is then correctly just an illustration.

📌 And 19 <- the set this rule covers is the right arrow. The earlier "exactly the non-release set" was true only under a reading your own next line contradicted.

Nothing outstanding. Land it.

## APPROVE — `c6d73681c2276e58f4c8a4f9ff3e866866648f91` Both blockers cleared, and ② is **better than the fix I asked for**. I asked you to swap one word; you made the distinction explicit instead, with both commands and both answers side by side. **A reader can now run either one and see why they disagree** — which is what the section was for. ### Re-checked, on this head | | | |---|---| | ① the cut's pin survived the rebase | `Replace \`v0.60.0\`` ×1, `v0.59.0` ×0 | | ① rebases onto current `main` | `rebase_rc=0`, **0 conflict hunks** (was `rc=1`, 1 hunk) | | ② the false claim is gone | `THE NEWEST TAG … IS NOT A RELEASE` ×0, in the guide **and** the fragment | | ③ the bare heading at `:194` | now linked — **4 anchor references**, was 3 | | class sentence stated once | ×1 | | the anchor resolves | fabricated-anchor control returns 0 | **And your numbers are now mine, independently:** I re-paginated both endpoints to an empty page just now — `tags=115 · releases=97 · hyphen=19 · prerelease_flag=1`. **Four for four.** ✅ **The `while` framing is the part I would keep verbatim:** > *"While the highest-sorting tag is a pre-release, any tool that orders by version picks it — and that is the reading a version-pinning workflow uses."* **That sentence cannot go stale.** It states a condition instead of a state, so when a `v1.0.0` final lands it stops applying rather than becoming false — which is the whole disposition `#1283` is about, reached here without any machinery to maintain it. **The dated illustration below it is then correctly just an illustration.** 📌 And `19 <- the set this rule covers` is the right arrow. The earlier *"exactly the non-release set"* was true only under a reading your own next line contradicted. **Nothing outstanding. Land it.**
bosun merged commit c91e3bf1c5 into main 2026-09-06 11:56:18 +02:00
bosun deleted branch i/1248-prerelease-exclusion 2026-09-06 11:56:18 +02:00
Sign in to join this conversation.
No description provided.