Repository navigation
docs(releases): the versioning policy states the 17.x launch-window rule and the v18 prerelease regime - #22963
Merged
objectstack-fleet[bot] merged 1 commit intoOct 12, 2026
Conversation
…ule and the v18 prerelease regime The releases index said a launch-window override was "in force today" and that check-changeset-no-major.mjs fails any pull request declaring a major. On main, .changeset/pre.json reads "mode": "pre" with the tag "next", and the guard's judge() returns its exempt verdict for any introduced major in pre mode. The section now records the override as the regime the 17.x minors ran under, and the v18 line as a major in prerelease publishing 18.0.0-next.N on next while latest stays on 17.x, linking the v18 page rather than restating it. Claude-Session: https://claude.ai/code/session_012yK1ddAdAqfzwigRHZq3r2 Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 12, 2026
objectstack-fleet
Bot
deleted the
claude/issue-22933-versioning-policy-v18
branch
October 12, 2026 06:51
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #22933
Clause-②: no
Release-owned channel 2: a factual error in
content/docs/releases/index.mdx, fixed in a dedicated docs-only PR, as triage graded it (comment 6118040748). One file, one section ("Versioning policy"), +15 / -7 lines. No gate script is edited and no release action is taken.What was false
On
mainat51b43a8dcthe section said a launch-window override is "in force today" and thatscripts/check-changeset-no-major.mjs"fails any pull request that declares a major bump". On that same commit,.changeset/pre.jsonreads{"mode": "pre", "tag": "next"}, and the guard'sjudge()returns itsexemptverdict (exit 0) for any major a diff introduces whilepre.mode === 'pre'.Each changed sentence, before and after, and the
mainfact it rests on1. Opening sentence
maintoday (see 5 and 6).2. Lockstep sentence
@objectstack/*packages version in lockstep, so a single major bump would promote the whole platform; instead a breaking change lands in a minor ..."@objectstack/*packages version in lockstep, so a single major bump promotes the whole platform, and which version a breaking change ships in depends on the line."fixedgroup in.changeset/config.json. The guard's own header (WHY THIS EXISTS) says Changesets applies the highest bump in the group to every package in it.3. The 17.x rule, now history (new bold lead)
.changeset/pre.jsonwas created bya87d8be29("enter Changesets pre mode (next) with onemajormarker", 2026-10-08). It is absent ata87d8be29^and atdc1b98680(2026-09-23, inside the 17.x minors). Control:.changeset/config.jsonis present atdc1b98680. So the guard was in its enforcing branch through the 17.x minors. The v17 page's banner says 17.1.0 through 17.7.0 are "minors by version number, not by blast radius".4. How the 17.x rule was enforced
**BREAKING**, andscripts/check-changeset-no-major.mjsfails any pull request that declares a major bump."**BREAKING**, andscripts/check-changeset-no-major.mjsfailed a pull request that declared a major bump."judge()returnsenforce(exit 1) whenpre.jsonis absent. The sentence is now past tense. "any" became "a" because the script's header documents anallow-majorlabel escape hatch outside pre mode.5. The v18 regime (new bold lead)
a87d8be29opened the line in pre mode with amajormarker. The v18 page (content/docs/releases/v18/index.mdx) has the release-status banner.6. The guard in pre mode (new)
next, andcheck-changeset-no-major.mjsstands aside in pre mode, so a pull request may declare a major bump.".changeset/pre.json;judge()line 673 (if (pre?.mode === 'pre') return { verdict: 'exempt', ... }); the RC EXEMPTION paragraph at:105. The exemption has no package condition and no pending-marker condition; those belong only to the separate protocol-lockstep verdict. 21 pending changesets onmaindeclare amajor.7. What publishes (new)
mainis the next18.0.0-next.Non npm'snexttag, whilelateststays on 17.x.":6-:8,:27-:29).release.ymltriggers on pushes tomainonly.8. Link (new)
check:doc-anchorsresolves the link. The link points at the v18 page and does not restate itsnext-before-latestparagraphs (ADR-0087 D6), so the two pages cannot drift apart on them.Where this departs from the card's direction (measured)
majorchangesets." Of the 113 pending changesets carrying**BREAKING**, 93 declare nomajorat all. At least four of them were added after pre mode was entered:d1dbe70eb,ffb31fca3,7518ee397and9ad3d2470each havea87d8be29as an ancestor (merge-base --is-ancestorexit 0, which holds in a shallow clone). Whatmainsupports is narrower: the guard admits amajorin pre mode, and every cut frommainis the next18.0.0-next.N. The section says exactly that.release.ymlpublishes only on a push tomain, andmainis in pre mode onnext, so the current pipeline cannot cut a 17.x release. The section states the 17.x rule in the past tense, as what the 17.x minors ran under, and makes no claim about a future 17.x release.18.0.0-next.N(triage's bound). The section says nothing about what happens when pre mode exits.Measured hypotheses
:46-:72, not:46-:54. The later paragraphs (the major/minor/patch bullets and the warning paragraph) do not restate the "in force today" rule. The minor bullet's examples are released history and stay true. They are unchanged.node scripts/sync-release-index-currency.mjsprinted "every in-scope entry ... (v16, v17) already names the newest GA release of its major ... nothing rewritten", exit 0. The file'sgit hash-objectis the same before and after the run, and equal to the HEAD blob (b2df87d2a). Its--self-testprinted "42 cases pass", exit 0.indexEntryLine()takes the first line containing](/docs/releases/vN). The new link endsv18#how-...), so that needle cannot match it.Tests: all at
83a041d35(HEAD of this branch)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 47 commands at83a041d35, identical to the dispatch's lead list. I ran all 47 with each exit code captured before any pipe. The--ranreconciliation printed: "47 derived famil(ies) accounted for — 47 run, 0 NOT-MEASURED (a DERIVED zero — all 47 recorded an exit code and none of them is 3)."check:doc-formula-expressions,check:doc-security-posture,check:docs,check:skill-examples,check:docs-transcript-drift). Those were prerequisite refusals, not findings. I builtspec,formula,lint,clientandclient-reactwith their closures under the verify lock (VERDICT command-exit 0twice) and re-ran them. All five gates now exit 0, for example "262 prose examples type-check across 3 surface(s)".check:doc-anchors: "485 internal #fragment link(s) across 419 source file(s) all resolve to a real heading". A probe through its ownextractFragmentLinks()shows the new link is extracted from this file and its target id exists on the v18 page.eslint.config.mjsfilesglobs are**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}and narrower TypeScript globs, with no.mdxglob. ②npx eslint --no-inline-config --format json content/docs/releases/index.mdxreturned 1 file, 0 errors, and one warning: "File ignored because no matching configuration was supplied." ③ The diff changes only this file, which no config object matches, so no linted file's verdict can move.testortypecheckis owed. CI runs the Build Docs and Test Core jobs; they were not measured locally.Acceptance notes
content/docs/protocol/backward-compatibility.mdx:18still says "While the launch window is open, a breaking change ships as a MINOR release — not a MAJOR one. ... This rule is in force today". The table and the Deprecation Timeline repeat the same claim. This section links that page "for the full policy", so after this lands the two pages disagree. The page is outside this card's file surface.18.0.0-next.Nprerelease. The new v18 link leads to that page's "read the CHANGELOG of every prerelease you move to", so I did not edit the paragraph further.skip-changeset: no published package listscontent/,docsorreleasesinfiles[](control:@objectstack/spec'sfiles[]reads back).Generated by Claude Code