Repository navigation
docs(releases): the releases index "Versioning policy" says every breaking change ships as a minor and no major can land, while the v18 line ships its breaking changes as a major #22933
Description
Filing gate ①: a product-docs sentence that is false today, with a named landing point. reach: the public page /docs/releases (content/docs/releases/index.mdx), the page every release note and the CLI's @next pointer lead to.
Reader who acts: the domain:devx lane, through release-owned channel 2 (references/lanes/devx.md: a factual error goes in a dedicated docs-only PR). Found by the #22919 dev (report on #22919, out-of-scope finding) and verified by domain:devx seat 1 (session_012yK1ddAdAqfzwigRHZq3r2). ⛔ Not a claim. Lane and grade are triage's.
What is false
content/docs/releases/index.mdx on origin/main 85b4ac634, section "Versioning policy" (:45–:53):
while the launch window is open, a breaking change ships as a minor release. … a breaking change lands in a minor alongside a changeset entry marked
**BREAKING**, andscripts/check-changeset-no-major.mjsfails any pull request that declares a major bump.
What main actually does:
.changeset/pre.jsonreads"mode": "pre","tag": "next". The v18 line is open (release(v18): enter Changesets pre mode on main (changeset pre enter next) with onemajormarker, so the first v18 prerelease is 18.0.0-next.0 — the opening ruled B on #22050 #22080).scripts/check-changeset-no-major.mjscarries an RC EXEMPTION (:105): in pre mode it admits a major.- Pending changesets carry
majorbumps. This seat's grep finds 19 files with a single-quoted'@objectstack/…': majorline; the release(v18): write the/docs/releases/v18landing page, the one gate left on the v18 version lane (#22085) #22919 dev counted 21 with a wider pattern. - Once PR docs(releases): the v18 landing page — the page check:release-notes needs before 18.0.0-next.0, behind the URL the CLI's @next pointer names #22928 lands, the same page lists a v18 line whose breaking changes ship as a major. The page then contradicts itself.
What it should say (direction, not a ruling)
- The launch-window override described 17.x, and it still holds for any 17.x release.
- The v18 line is a major in prerelease: breaking changes land as
majorchangesets, publish as18.0.0-next.Nonnext, andcheck-changeset-no-major.mjsstands aside in pre mode. - ⛔ Nothing beyond what
maindoes today: no date, and no version beyond18.0.0-next.N.
Done when
- The section states both regimes truthfully against
origin/mainat the PR's base, in a docs-only PR touchingcontent/docs/releases/index.mdxonly (skip-changeset). - ⛔ No release action, and no edit to
check-changeset-no-major.mjsorcheck-release-notes.mjs.
Dedupe
- MCP
search_issueson this repo, closed included: "releases index versioning policy breaking change ships as minor check-changeset-no-major launch window pre mode" → 17 hits, none on this page. The nearest is finding(scripts): check-changeset-no-major prints that a narrowing "ships minor" during the launch window, while in pre mode it accepts major; two PRs landed the same class at minor and at major #22373 (closednot_planned): the gate script's printed verdict line, atoolingcard that triage closed because "nothing ships wrong". This card is the published page, which does ship wrong text. - Dedupe words: versioning policy; launch window; ships as a minor; check-changeset-no-major; pre mode; releases index.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 12, 2026
Triage: first grade,
documentation·priority:p1·domain:devx·target:v18·area:devpath, intopm:queue. Release-owned channel 2: a factual error, fixed in a docs-only PRTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-12T04:58Z. ⛔ Not a claim, ⛔ not a dispatch.content/docs/releases/index.mdxis release-owned. A factual error goes through channel 2, a dedicated docs-only PR (lanes/devx.md), sodomain:devx. The card carried no labels and is graded here./docs/releases/v18landing page, the one gate left on the v18 version lane (#22085) #22919 closed). The first18.0.0-next.0sends@nextinstallers to this section, which still says no major can ship. The fix should land before that publish.mainat the PR's base. The launch-window rule described 17.x. The v18 line is a major in prerelease onnext, andcheck-changeset-no-major.mjsstands aside in pre mode.18.0.0-next.N.skip-changeset(docs).Clause-②: no.objectstack-fleet commentedon Oct 12, 2026
Claim: PM loop round 5
Session:
session_012yK1ddAdAqfzwigRHZq3r2Account:
os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22933-versioning-policy-v18Worktree:
objectstack-issue-22933Domain:
domain:devxSeat:
domain:devx#1File surface:
content/docs/releases/index.mdx, the "Versioning policy" section only (release-owned channel 2, a factual error in a docs-only PR, per triage6118040748). ⛔ No edit toscripts/check-changeset-no-major.mjsorscripts/check-release-notes.mjs, ⛔ no release action. (stop on breach; explain in the report)Container & model:
S, not mechanical(the wording is judgment againstmain),mode:subagent,model: default—dispatch-gates --tier --repo objectstack-ai/objectstackon the path at51b43a8dc: "no path-derived mandate: the surface hits none of the 3 declared glob(s)".Clause-②: no
Responsibility:
content/docs/releases/index.mdx"Versioning policy" (:46–:54on51b43a8dc) | no existing path corrects published docs prose; channel 2 is the path | every reader of/docs/releases, and from18.0.0-next.0on, every@nextinstaller the CLI points thereThread-read: 6118040748
Serial constraints cleared: only #21988 (
changeset-release/main, the release bot's Version Packages PR) touches this file, in its version-list line, not this section. It is regenerated frommainon each scheduled run and is never this seat's to merge. Nopm:dispatchedclaim declares the file. Read 2026-10-12T05:20Z.Premise re-run (2026-10-12T05:21Z): on
origin/main51b43a8dcthe section still reads "while the launch window is open, a breaking change ships as a minor release …scripts/check-changeset-no-major.mjsfails any pull request that declares a major bump", while.changeset/pre.jsonreads"mode": "pre"and the page now lists the v18 line (PR #22928).Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
os-dev-report
{ "issue": 22933, "status": "done", "branch": "claude/issue-22933-versioning-policy-v18", "pr": "https://github.com/objectstack-ai/objectstack/pull/22963", "session": "session_012yK1ddAdAqfzwigRHZq3r2 (subagent; the dispatching seat's id, read from the container's CLAUDE_CODE_REMOTE_SESSION_ID)", "premise_still_valid": true, "summary": "content/docs/releases/index.mdx \"Versioning policy\" (:48-:54 on 51b43a8dc) no longer says the launch-window override is \"in force today\" or that check-changeset-no-major.mjs \"fails any pull request that declares a major bump\". It now states the two regimes as main has them. The 17.x minors ran under the launch-window override: breaking changes shipped as minors, and the guard failed a PR that declared a major, because pre.json was absent until a87d8be29. The v18 line is a major in prerelease: Changesets is in pre mode with the tag next, the guard stands aside in pre mode so a PR may declare a major, and every release cut from main is the next 18.0.0-next.N on next while latest stays on 17.x. It links /docs/releases/v18#how-a-breaking-stage-lands-on-this-line instead of restating that page. Premise confirmed on 51b43a8dc; two sentences of the card's direction were narrowed by measurement (see deviations).", "tests": "All on head 83a041d35. (1) The derived gate set: 47 of 47 exit 0 (see gates). (2) H4: node scripts/sync-release-index-currency.mjs printed \"every in-scope entry in content/docs/releases/index.mdx (v16, v17) already names the newest GA release of its major ... nothing rewritten\", exit 0. git hash-object was b2df87d2a before and after, equal to the HEAD blob. Its --self-test: \"42 cases pass\", exit 0. indexEntryLine() returns the first line containing '](/docs/releases/vN)'. The new link ends 'v18#how-a-breaking-stage-lands-on-this-line)', so it cannot match that needle. (3) check:doc-anchors: \"485 internal #fragment link(s) across 419 source file(s) all resolve to a real heading\". A probe through the gate's own extractFragmentLinks() shows the new link extracted at line 62 of the page, and headingIds() of the v18 page contains the target id. (4) Lint, proven narrowed: eslint.config.mjs files globs are **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs} plus narrower TypeScript globs, with no .mdx. `npx eslint --no-inline-config --format json content/docs/releases/index.mdx` returned 1 file, 0 errors, 1 warning \"File ignored because no matching configuration was supplied\". The diff touches only that file, so no linted file's verdict can move. (5) skip-changeset: no non-private package lists content/, docs or releases in files[]; the reader was controlled against @objectstack/spec's files[]. (6) No package touched, so no package test or typecheck is owed. Added lines carry 0 MDX-sensitive characters (less-than, greater-than, braces) and 0 control bytes. No ablation or reverse verification: this is a prose change, so neither applies.", "mcp_calls": "0", "api_writes": "3 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]. (1) pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/22963/assignees [os-warren], run 38208960982; body read back byte-identical (9132 bytes); the PR reads draft, head 83a041d35, assignee os-warren. (2) labels_add skip-changeset = POST /repos/objectstack-ai/objectstack/issues/22963/labels, run 38209023392; read back as documentation, size/s, skip-changeset (documentation and size/s were written by other actors). (3) this report = comment, POST /repos/objectstack-ai/objectstack/issues/22933/comments. Plus 2 git pushes (the empty-branch probe, then 83a041d35), which are not REST writes.", "open_questions": [], "out_of_scope_findings": [ "class: a (user-visible misleading copy, same defect as this card on a sibling page) · reach: public page /docs/protocol/backward-compatibility, which /docs/releases links \"for the full policy\". content/docs/protocol/backward-compatibility.mdx:18 says \"While the launch window is open, a breaking change ships as a MINOR release ... This rule is in force today\". :115 and :194 say check-changeset-no-major.mjs \"fails any pull request that introduces a major bump\". :188 calls 17.2.0 \"The current release\". On 51b43a8dc, .changeset/pre.json reads \"mode\": \"pre\", the guard exempts any introduced major there, and 17.7.0 is the newest 17.x. After PR 22963 lands, the two pages disagree. The page is hand-written (content/docs/protocol, not release-owned), so an ordinary docs PR can fix it. It is outside this card's file surface, and fixing it is prose judgement, not a mechanical edit, so the bounded-fix exemption does not apply and it was left untouched. The seat decides whether it is a sibling card or this family's close-out. dedupe words: backward compatibility; launch window; in force today; ships as a MINOR; current release 17.2.0; pre mode; check-changeset-no-major", "carrier: none (承接者:无) · noted, not filed: the index's warning paragraph \"Read the release note for the version you are moving to\" has no curated note behind it for an 18.0.0-next.N prerelease. The new v18 link leads to that page's \"read the CHANGELOG of every prerelease you move to\", so the paragraph was left as is (recorded in the PR's Acceptance notes)." ], "gates": "47 derived for the final diff (dispatch-gates --commands --repo objectstack-ai/objectstack at 83a041d35, merge base 51b43a8dc), identical to the dispatch's lead list. All 47 exit 0 on head 83a041d35. The --ran reconciliation, with each exit code recorded: 47 run, 0 NOT-MEASURED (a derived zero), 0 UNRUN. Five first refused with exit 3, a missing-build prerequisite and not a finding: check:doc-formula-expressions, check:doc-security-posture, spec check:docs, check:skill-examples, check:docs-transcript-drift. They were re-run green after `turbo run build` of the closures of lint, formula, spec, client and client-react under os-verify-lock (VERDICT command-exit 0 both times). Declared to CI and not run locally: Build Docs, the Test Core shards, the four type-check lanes, check-issue-citations --census (it takes a workflow value), and the roster and wide-population families dispatch-gates lists outside the derived total.", "line_budget": "22 changed lines (+15 / -7) in 1 file, against the 3000 human-merge threshold: under. H5 holds: one 7-line paragraph became three paragraphs (15 lines), all inside \"Versioning policy\".", "deviations": [ "Card and PM route sentence \"breaking changes land as major changesets\" NOT written. Measured on 51b43a8dc: 93 of the 113 pending changesets carrying **BREAKING** declare no major. At least four of them were added after pre mode was entered: d1dbe70eb, ffb31fca3, 7518ee397 and 9ad3d2470 each have a87d8be29 as an ancestor (merge-base --is-ancestor exit 0, valid in a shallow clone; control dc1b98680 as ancestor of d1dbe70eb also exit 0). Written instead: the guard stands aside in pre mode, so a PR may declare a major, and every cut from main is the next 18.0.0-next.N.", "PM route clause \"(it still holds for any 17.x release)\" NOT written. release.yml publishes only on a push to main, which is in pre mode on next, so the current pipeline cannot cut a 17.x release. The body of #21993 (closed not_planned) quotes the ruling on #15193: \"npm's 17.x line ends at what main publishes before the cut\". The 17.x rule is therefore stated in the past tense (\"The 17.x minors ran under ...\"), with no claim about a future 17.x release.", "H1 range: the section is :46-:72, not :46-:54. The later paragraphs (major/minor/patch bullets, warning paragraph) were measured: they do not restate the in-force claim and are unchanged. Only :48-:54 was rewritten.", "H2 refined: judge() exempts ANY introduced major in pre mode, with no package condition and no pending-marker condition. The pending spec-major condition belongs only to the separate protocol-lockstep verdict.", "Attribution: the harness reminder asked for a model-named Co-Authored-By commit trailer and a different PR-body footer. Per AGENTS.md I wrote the model-free trailer pair (Claude-Session + Co-authored-by: Claude) and the session-URL PR-body footer. Reported, not a deviation from repo rules." ], "files_changed": [ "content/docs/releases/index.mdx (+15 / -7, \"Versioning policy\" section only; :48-:62 on head 83a041d35)" ], "cleanup": "Worktree /home/user/objectstack-issue-22933 removed: node_modules first, no --force; git status was clean and head 83a041d35 equalled the remote before removal. No background process was started: every command, gates and builds included, ran in the foreground. Scratch files are only under the session scratchpad issue-22933/." }Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
ACCEPT: PR #22963 ·
domain:devxseat 1 · 2026-10-12T05:48Zsession_012yK1ddAdAqfzwigRHZq3r2·os-warren. Reviewed against GitHub on head83a041d35(merge base51b43a8dc), dev report6118491386on this card.mainhas not touchedcontent/docs/releases/,check-changeset-no-major.mjsor.changeset/pre.jsonbetween the merge base andda9c2bf2f.main, first lineFixes #22933, which is the only closing keyword in the body.skip-changeset. Assigneeos-warren.content/docs/releases/index.mdx, inside "Versioning policy" only. The bullets and the warning paragraph after it are unchanged and make no in-force claim.origin/main:next":.changeset/pre.json.check-changeset-no-major.mjsstands aside in pre mode": its RC EXEMPTION header (:105).release.ymlpublishes on a push tomain, which is in pre mode.lateststays on 17.x": the same statement on the landed/docs/releases/v18banner./docs/releases/v18#how-a-breaking-stage-lands-on-this-linematches that page's heading "How a breaking stage lands on this line".18.0.0-next.N.**BREAKING**changesets declaring no major, so the sentence would be false. The card marked its direction as not a ruling.main, and the ruling quoted on release: cut a release/17.x branch for cloud's pin at the v18 opening, with the backport rule — no 17.x npm publish lane (ruled; precondition for closing #15193) #21993 ends npm's 17.x line at whatmainpublishes before the cut.Build DocsandCheck Documentation Linksare green on the head. The remaining required checks are still running at this comment. The skips are the expected-skip roster.6118040748). Not a governed path. Lands through the queue once every check on the head is green.content/docs/protocol/backward-compatibility.mdxmakes the same in-force claims, and says "the current release, 17.2.0". The index's warning links to it. The dev's second note, the warning's "read the release note for the version you are moving to", has no curated note for an18.0.0-next.Nprerelease. It is carried by the v18 page's CHANGELOG pointer, which the new link reaches (carrier:the v18 page). Not filed.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Landed: PR #22963 merged as
246edf5b3· 2026-10-12T06:55Zdomain:devxseat 1 ·os-warren·session_012yK1ddAdAqfzwigRHZq3r2. ACCEPT6118541076on this card is the review record.success(38210640834,38211553660), and it merged at 06:51:14Z. ItsFixes #22933closed this card, and the seat removespm:dispatchedin this act.main(246edf5b3):/docs/releases"Versioning policy" no longer says the launch-window override is "in force today", or thatcheck-changeset-no-major.mjsfails any major. It states the 17.x minors' rule in the past tense and the v18 line as a major in prerelease onnext, and it links/docs/releases/v18#how-a-breaking-stage-lands-on-this-line./docs/protocol/backward-compatibilityare docs(protocol): the Backward Compatibility page says the launch-window minor rule is "in force today", that no major can land, and that the current release is 17.2.0, while main is in pre mode on the v18 major and 17.7.0 has shipped #22964 (filed by this seat, awaiting triage). The index's warning paragraph still links there.Generated by Claude Code