Repository navigation
docs(protocol): the backward-compatibility page states the 17.x launch-window rule and the v18 prerelease regime - #22988
Merged
objectstack-fleet[bot] merged 1 commit intoOct 12, 2026
Conversation
…h-window rule and the v18 prerelease regime The page said the launch-window rule (a breaking change ships as a MINOR) is in force today, that check-changeset-no-major.mjs fails any pull request declaring a major, and that the current release is 17.2.0. On main, Changesets is in pre mode with the tag `next`, the guard stands aside in pre mode, and every release cut from main is the next 18.0.0-next.N. The launch-window sentences now describe the 17.x minors in the past tense, the v18 line is stated beside them with a link to the v18 page's breaking-stage section, the hard-coded current-release number is dropped, and the section's override clause is scoped to the 17.x minors. The launch-window heading text, and so its anchor, is unchanged. Claude-Session: https://claude.ai/code/session_012yK1ddAdAqfzwigRHZq3r2 Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 12, 2026
This was referenced Oct 12, 2026
objectstack-fleet
Bot
deleted the
claude/issue-22964-backward-compat-regime
branch
October 12, 2026 08:36
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 #22964
Clause-②: no
A docs-only PR on a hand-written page,
content/docs/protocol/backward-compatibility.mdx, which is not release-owned. It changes one file by +18 / -16 lines (34 changed lines). It edits no gate script, takes no release action, and changes nothing undercontent/docs/releases/**. The new wording matches the releases index's "Versioning policy" section as PR #22963 left it onmain(246edf5b3).What was false
On
mainat19805d895(this PR's base), the page said four things that were not true:scripts/check-changeset-no-major.mjs"fails any pull request that declares amajorbump";The seat listed the line numbers on
da9c2bf2f. They are the same on19805d895: the last commit to touch the file is165587ee6.The
mainfacts each change rests on.changeset/pre.jsonreads{"mode": "pre", "tag": "next"}.scripts/check-changeset-no-major.mjs,judge()at:673readsif (pre?.mode === 'pre') return { verdict: 'exempt', ... }, and the RC EXEMPTION paragraph is at:105. Outside pre mode,:674returnsenforce. The header also documents anallow-majorlabel escape hatch outside pre mode, so the past-tense sentences say the guard failed "a" pull request, not "any".release.ymltriggers only on a push tomain(:177-:180). The v18 page (content/docs/releases/v18/index.mdx) says every release cut frommainis the next18.0.0-next.N, and thatlateststays on 17.x (:6-:8,:27-:29).npm view @objectstack/spec dist-tags, read 2026-10-12, showslatest: 17.7.0andrc: 17.0.0-rc.6, and nonexttag. No18.0.0-next.Nhas been published yet. The new sentences say what a cut frommainproduces. None of them says a cut has happened.packages/spec/package.jsonis17.7.0, and the CHANGELOG's newest heading is## 17.7.0, so "17.2.0" was not the current release. The v17 page's banner calls 17.1.0 through 17.7.0 "minors by version number, not by blast radius". It also says 17.0.0 was cut from an rc train afterchangeset pre exit..changeset/config.json'sfixed[0]has 70 members. Both sentences thatcheck:lockstep-package-countanchors on are kept word for word.Each changed sentence: before, after, and the fact it rests on
:18):18)maintoday. The tables now label their 17.x mapping (see 11), so there is nothing left to override.next, andscripts/check-changeset-no-major.mjsstands aside in pre mode, so a pull request may declare a major bump. Every release cut frommainis the next18.0.0-next.Non npm'snexttag, whilelateststays on 17.x. See how a breaking stage lands on the v18 line.":21):26):31):66)18.0.0-next.Non the v18 line)"git grep 'backward-compatibility#'finds exactly one inbound fragment link to this page,releases/index.mdx:79, and it targets the launch-window anchor. In../objectuithe same grep finds nothing.:80):84)18.0.0-next.N.":93)18.0.0-next.N, so on neither line does the bump size tell you whether you have work to do.":95):115)scripts/check-changeset-no-major.mjsfails any pull request that declares amajorbump, because under lockstep onemajorwould promote all 70 published packages."18.0.0-next.N: the guard stands aside in pre mode, so a pull request may declare a major bump." Then the v18 link.would promote all 70 published packages.is kept word for word.:174)18.0.0-next.N":188)mainis the next18.0.0-next.Non npm'snexttag, whilelateststays on 17.x." Then the v18 link.:193; tense only)all **70** packages published from this repositoryanchor are unchanged (F6).:195)scripts/check-changeset-no-major.mjsfails any pull request that introduces amajorbump ..."next, and the guard stands aside in pre mode, so a pull request on the v18 line may declare a major bump.":203):207). The override clause is rewritten, not removed (H3).18.0.0-next.Nprereleases, the operative rule is how a breaking stage lands on the v18 line.":33-:36,:179-:181). One example is "Enum values are append-only within a MAJOR version. Existing values are never removed or renamed in MINOR/PATCH releases". The 17.x minors did not keep those guarantees: the change-type table's own 17.x column marks "Removing an enum value | Yes | MINOR". The clause is what reconciled the two. Removing it would leave those guarantees unqualified against 17.x history, so it now speaks in the past tense for the 17.x minors and sends18.0.0-next.Nreaders to the v18 section.Where this departs from the card's direction, or stops short of it
#launch-window-minor-releases-can-contain-breaking-changesstill resolves, andreleases/index.mdx:79is not edited. The heading stays true: the 17.x minors are MINOR releases that contain breaking changes (F5).majorchangesets". The card rules it out. The v18 sentences say only what the guard admits and what a cut frommainpublishes.:75's shipped examples (17.2.0,15.1.0).18.0.0-next.N.Tests (all at
e8e1525ed, the HEAD of this branch)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 41 commands ate8e1525ed. That is the same set as the dispatch's lead list. I ran all 41 and captured each exit code before any pipe.--ranprinted: "41 derived famil(ies) accounted for — 41 run, 0 NOT-MEASURED (a DERIVED zero — all 41 recorded an exit code and none of them is 3)."check:doc-formula-expressions(3),check:doc-security-posture(3),check:docs(1, "Generate it first: gen:schema"),check:skill-examples(3) andcheck:docs-transcript-drift(3). These were refusals, not findings.@objectstack/lint...(4 tasks) and then@objectstack/client-react...(35 tasks) under the verify lock. Both printedVERDICT command-exit 0. Re-run after the builds, all five exit 0.check:doc-anchors: "489 internal #fragment link(s) across 419 source file(s) all resolve to a real heading".check:lockstep-package-count: "all 3 occurrence(s) agree with the true count (70)".check:docs: "226 generated files in sync with packages/spec".check:skill-examples: "262 prose examples type-check across 3 surface(s)".check:nul-bytes: "OK (scanned 10999 text file(s) ... no raw ASCII control bytes)".@mdx-js/mdx3.1.1. Negative control: an unclosedCalloutis refused ("Expected a closing tag forCallout").filesglob ineslint.config.mjsis a{ts,tsx,mts,cts,js,jsx,mjs,cjs}spelling or narrower. None of them matches.mdx.npx eslint --no-inline-config --format jsonon the page returned 1 file, 0 errors and 1 warning: "File ignored because no matching configuration was supplied."eslint.config.mjs:328), and the diff changes only a file no config object matches, so no linted file's verdict can move.testortypecheckis owed. Build Docs and Test Core belong to CI and were not measured here.skip-changeset. I read 70 non-private tracked manifests, and nofiles[]entry namescontent/docs. In@objectstack/spec's shipped paths (dist,llms.txt,prompts,README.md), "launch-window-minor-releases" and "This rule is in force today" match 0 files. Positive control: "defineStack" matches 87.Acceptance notes
:153-:157). It promises patches to the current and previous MAJOR.release.ymlpublishes only frommain(F3), which is in pre mode, and npm shows no 16.x after16.1.0(2026-07-22), although17.0.0shipped on 2026-08-14. No lane exists to publish a maintenance patch for a line other than the onemainis on. I did not file this; it is reported to the seat.:33-:36,:179-:181). The rewritten clause in 18 reconciles them with the 17.x history.Generated by Claude Code