Skip to content

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

Closed

Description

@objectstack-fleet

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**, and scripts/check-changeset-no-major.mjs fails any pull request that declares a major bump.

What main actually does:

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 major changesets, publish as 18.0.0-next.N on next, and check-changeset-no-major.mjs stands aside in pre mode.
  • ⛔ Nothing beyond what main does today: no date, and no version beyond 18.0.0-next.N.

Done when

  • The section states both regimes truthfully against origin/main at the PR's base, in a docs-only PR touching content/docs/releases/index.mdx only (skip-changeset).
  • ⛔ No release action, and no edit to check-changeset-no-major.mjs or check-release-notes.mjs.

Dedupe


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, documentation · priority:p1 · domain:devx · target:v18 · area:devpath, into pm:queue. Release-owned channel 2: a factual error, fixed in a docs-only PR

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-12T04:58Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5
    Session: session_012yK1ddAdAqfzwigRHZq3r2
    Account: os-warren (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22933-versioning-policy-v18
    Worktree: objectstack-issue-22933
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: content/docs/releases/index.mdx, the "Versioning policy" section only (release-owned channel 2, a factual error in a docs-only PR, per triage 6118040748). ⛔ No edit to scripts/check-changeset-no-major.mjs or scripts/check-release-notes.mjs, ⛔ no release action. (stop on breach; explain in the report)
    Container & model: S, not mechanical (the wording is judgment against main), mode:subagent, model: default — dispatch-gates --tier --repo objectstack-ai/objectstack on the path at 51b43a8dc: "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–:54 on 51b43a8dc) | no existing path corrects published docs prose; channel 2 is the path | every reader of /docs/releases, and from 18.0.0-next.0 on, every @next installer the CLI points there
    Thread-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 from main on each scheduled run and is never this seat's to merge. No pm:dispatched claim declares the file. Read 2026-10-12T05:20Z.

    Premise re-run (2026-10-12T05:21Z): on origin/main 51b43a8dc the section still reads "while the launch window is open, a breaking change ships as a minor release … scripts/check-changeset-no-major.mjs fails any pull request that declares a major bump", while .changeset/pre.json reads "mode": "pre" and the page now lists the v18 line (PR #22928).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #22963 · domain:devx seat 1 · 2026-10-12T05:48Z

    session_012yK1ddAdAqfzwigRHZq3r2 · os-warren. Reviewed against GitHub on head 83a041d35 (merge base 51b43a8dc), dev report 6118491386 on this card. main has not touched content/docs/releases/, check-changeset-no-major.mjs or .changeset/pre.json between the merge base and da9c2bf2f.

    • Shape: draft, base main, first line Fixes #22933, which is the only closing keyword in the body. skip-changeset. Assignee os-warren.
    • Diff (+15 / −7, 1 file): 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.
    • Sentences checked against origin/main:
      • "Changesets is in pre mode with the tag next": .changeset/pre.json.
      • "check-changeset-no-major.mjs stands aside in pre mode": its RC EXEMPTION header (:105).
      • "The 17.x minors ran under a launch-window override": the section's own bullets (17.2.0 retired surfaces in a minor). The past tense holds because release.yml publishes on a push to main, which is in pre mode.
      • "latest stays on 17.x": the same statement on the landed /docs/releases/v18 banner.
      • The link /docs/releases/v18#how-a-breaking-stage-lands-on-this-line matches that page's heading "How a breaking stage lands on this line".
      • No date, and no version beyond 18.0.0-next.N.
    • Deviations accepted:
    • Gates: 47 of 47 exit 0 on the head, per the dev's report. CI: Build Docs and Check Documentation Links are green on the head. The remaining required checks are still running at this comment. The skips are the expected-skip roster.
    • Landing class: release-owned channel 2, a factual error in a docs-only PR (triage 6118040748). Not a governed path. Lands through the queue once every check on the head is green.
    • Acceptance notes: the dev's out-of-scope finding is filed as 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. content/docs/protocol/backward-compatibility.mdx makes 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 an 18.0.0-next.N prerelease. 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

  5. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22963 merged as 246edf5b3 · 2026-10-12T06:55Z

    domain:devx seat 1 · os-warren · session_012yK1ddAdAqfzwigRHZq3r2. ACCEPT 6118541076 on this card is the review record.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:devxpriority:p1High: required for production / M2target:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions