Repository navigation
docs(protocol): Support Windows states latest-only support, and the releases index closes the v17 line - #25146
Merged
objectstack-fleet[bot] merged 3 commits intoOct 22, 2026
Conversation
The backward-compatibility page promised the previous MAJOR "critical bug fixes and security patches only". No version line of @objectstack/spec has ever published again after a newer line shipped, and the board rulings never set up a maintenance line. The table is replaced by a latest-only statement: only the current MAJOR receives fixes, the previous one receives none and no backport or maintenance release is promised, an older app upgrades through ADR-0087's conversion layer (D2) and `os migrate meta` (D3), and a MAJOR goes through npm's `next` tag before `latest` (D6). Two sentences that the new statement would contradict are corrected: the Migration Support callout no longer names doctor, diff and the CHANGELOG as the way to upgrade across majors, and the releases index labels the closed v17 line "final release: 17.7.0" instead of a second "current series". Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
`os migrate meta` rewrites metadata, not the TypeScript patterns `os doctor --scan-deprecations` finds, so the callout now says it is the upgrade for your metadata across majors and leaves doctor, diff and the CHANGELOG notes for what it does not rewrite. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 22, 2026
…t ADR-0087 D6 ADR-0087's as-built addendum lists D6's RC discipline as deferred, and npm shows majors 8-15 with no prerelease and 16-17 on an `rc` tag, so the page must not state D6 as live policy. The "Testing a MAJOR" bullet now rests on what holds today: `scripts/check-changeset-no-major.mjs` fails a pull request that declares a `major` bump outside Changesets pre mode and stands aside inside it, and a MAJOR declared in pre mode publishes only prereleases on the pre-mode dist-tag until pre mode exits; the v18 line used `next`. The current-MAJOR bullet names the pre-mode dist-tag, with `next` as the v18 instance, instead of `next` alone. Nothing enforces which tag a future pre mode uses, so the page names none. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
Seat reviewACCEPT ·
This seat readies the PR and queues it with auto-merge. Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-25102-support-windows-latest-only
branch
October 22, 2026 01:04
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 #25102
Clause-②: no
A docs-only PR. It executes the maintainer's ruling
6328214336on #25102, letter A, latest-only (「25134 25092 25102 同意」). It changes two hand-written pages by +9 / -7 lines:content/docs/protocol/backward-compatibility.mdx;content/docs/releases/index.mdx. This is the releases index, not a per-release page. No file undercontent/docs/releases/v17/**orv18/**is touched.It edits no code, workflow, gate, changeset or ADR, and it takes no release action.
What the ruling binds, and what this PR does not do
os migrate meta. The page links both.Support Windows: before and after
Before (
:153-:159atabc25a3536):After: the heading text "Support Windows" is unchanged, so
#support-windowsstill resolves (see Inbound anchors below). Then a lead sentence and five bullets, in the bold-lead bullet shape of the page's "SemVer Guarantees" and "Migration Guides" sections. Each clause and its source:main. While the next MAJOR is in prerelease, every release cut frommainis one of its prereleases on the pre-mode dist-tag (nexton the v18 line), so a fix reacheslatestonly when that MAJOR goes GA..github/workflows/release.yml's header:npm publishlives in one job, reachable only from apushtomainand from the repair dispatch, and the repair "cannot mint a version". The card's fact 4 measured the consequence: between 17.7.0 and 18.0.0,latestreceived no fix. The page's own top callout already states the pre-mode half. The tag is written "the pre-mode dist-tag" because nothing fixes it:changeset pre entertakes the tag as an argument, v16 and v17 ran onrcand v18 onnext, and.github/workflows/cut-rc.yml:235requirestag: rcfor its own lane only.os migrate metacarries everything else.os migrate meta(ADR-0087 D3):--from Nreplays the chain from the major your metadata was authored against (protocol 16 or later, the chain's floor) to the current one in a single pass, and lists the edits your source needs. With--writeit writes the mechanical ones it can trace to one literal into your source files. It reads no database.--storedreplays the same chain over one deployment'ssys_metadatarows and, with--apply, rewrites the ones still carrying an older shape. Links: the CLI reference (/docs/deployment/cli#os-migrate-meta---stored) and Upgrading, "The metadata app".content/docs/deployment/cli.mdx: theos migrate meta --storedrow of the Data migrations table (:1252) and the section's "division of labour" paragraph (:1819), which states what--from Nand--storedeach do.--writeand--apply: the flag descriptions inpackages/cli/src/commands/migrate/meta.ts. The floor:MIGRATION_SUPPORT_FLOOR = 16(packages/spec/src/migrations/registry.ts.template:79) andcontent/docs/upgrading.mdx:233.latest:scripts/check-changeset-no-major.mjsfails a pull request that declares amajorbump outside Changesets pre mode and stands aside inside it, and a MAJOR declared in pre mode publishes only prereleases, on the pre-mode dist-tag, until pre mode exits. The v18 line usednext(18.0.0-next.0…18.0.0-next.5) before 18.0.0. Install from that tag to run your app against a MAJOR before it becomeslatest.scripts/check-changeset-no-major.mjsatorigin/main459afea1f6:judge()(:678-:683) returnsexemptwhen.changeset/pre.jsonhasmode: 'pre'(:681) andenforceotherwise (:682). Theexemptcase exits 0 (:818-:826), and theenforcecase prints the refusal (:828). The RC EXEMPTION header (:113-:120) states the Changesets semantics: in pre mode "amajorbump only ever produces a … PRE-RELEASE version — nothing final publishes untilchangeset pre exit". npm:18.0.0-next.0(2026-10-13) to18.0.0-next.5(2026-10-19), then18.0.0(2026-10-20). The page says the guard fails "a" pull request, not "any", and it does not say a MAJOR can be declared only in pre mode, because the guard'sallow-majorlabel escape hatch skips it outside pre mode (header:122-:124; the label is read live at.github/workflows/pr-automation.yml:1063).The CLI binary is spelled
os, as everywhere else on this page.packages/cli/package.jsonbinmaps bothosandobjectstackto the same./bin/run.js, so this is the ruling'sobjectstack migrate meta.Premise re-checks (ruling item 1), verbatim, at
origin/mainabc25a3536Both hold as the card states. Neither of ours prints a re-published line, and the
better-authpositive control prints1.4 1.5 1.6 1.7.The card's grep has no "maintenance" term, so a wider grep was run to catch another page that states a maintenance line. The pattern covered
maintenance (line|release|branch|mode|window|period),previous major,N-1,LTS,long-term support,backport,older (major|versions),end-of-lifeandEOL, overcontent skills README.md. It found 13 lines; none states a support window or a maintenance line:backoffMultiplier^(n-1));upgrading.mdx:23,:199,cli.mdx:1742,api/declarative-endpoints.mdx:266,protocol/kernel/http-protocol.mdx:1173), plus the matching skill lineskills/objectstack-api/SKILL.md:201;forms.mdxhit.So no other page joins the surface.
Every other sentence changed (ruling items 3 and 4)
backward-compatibility.mdx:142, the Migration Support callout's second sentence. This PR's new upgrade clause would have contradicted it on the same page.codemodcommand is referenced in the migration guides but is not yet available; until then, combineos doctor --scan-deprecations,os diff, and the CHANGELOG migration notes (below) to upgrade across MAJOR versions."codemodcommand either: to upgrade your metadata across MAJOR versions, runos migrate meta(see Support Windows), and useos doctor --scan-deprecations,os diff, and the CHANGELOG migration notes (below) for what it does not rewrite."os migrate meta.os migrate metarewrites metadata. It does not rewrite the TypeScript patternsos doctor --scan-deprecationsreports, and the comment atpackages/cli/src/commands/doctor.ts:2683explains why doctor's own hint must not point at it. So the sentence scopes the command to metadata and keeps doctor, diff and the CHANGELOG for the rest.git grep -i codemod -- content/docs skillsoutsidereleases/finds only this sentence. The CLI has nocodemodcommand:doctor-deprecation-hint-commands.test.ts:160-:162asserts thatobjectstack codemod v2-to-v3andos codemodresolve to no command.releases/index.mdx:22, the v17 entry's trailing status.a1ef2c9d63, the day after 17.0.0 shipped).check-release-section-coverage.mjsindexCurrencyFindingspasses any trailing status that names the newest 17.x GA (17.7.0).check-release-page-status.mjsnames both wordings as valid.sync-release-index-currency.mjsrewrites only a stalecurrent series:field and never afinal release:one, so the version step leaves this entry alone.No other sentence changed. The rest of
backward-compatibility.mdxwas read in full atBASE, including the PR #22988 sentences: the 17.x launch-window rule, the v18 prerelease regime and the "When it stops applying" section. Each of them describes versioning history or the breaking-change regime, and none promises a fix to an earlier line, so all stay.Releases index (ruling item 4). No sentence in
content/docs/releases/promises a previous-major fix. The grep, atabc25a3536:It found 14 lines (exit 0):
:21-:25, the status labels;v16.mdx:20,:21and:863, which state that v16 is closed;v17/17-0.mdx:91, Node.js end-of-life;v17/17-4.mdx:355, a storemaintenancekey;v17/17-7.mdx:60,:192,:563and:915, which concern long-term agent memory.The only contrary statement is the v17 "current series" label (item 2).
meta.jsonholds page order only, andimplementation-status.mdxmatched nothing.Inbound anchors.
git grep -n -i "#support-windows"exits 1 in this repo and exits 1 in../objectuiatb014f5eea; the control leg in../objectuiexits 0.git grep "backward-compatibility#"finds one inbound fragment link,releases/index.mdx:82, which targets the launch-window anchor and is unchanged. The heading text is kept anyway, because links from outside both repositories cannot be enumerated.Gates
All readings below are at this branch's head
f453405903, againstorigin/mainmerge baseabc25a3536.Derivation.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 49 commands: 33 pnpm and 16 direct node; 41 matched by path and 8 declared whole-tree. The change set is 2 paths and 16 changed lines. The list is identical at2b3b50b4da,062bfaf1ddandf453405903(diffexit 0).Ran all 49. Each exit code was captured before any pipe. All 49 exited 0.
Reconciliation.
--ranprinted: "✓ dispatch-gates --ran: 49 derived famil(ies) accounted for — 49 run, 0 NOT-MEASURED (a DERIVED zero — all 49 recorded an exit code and none of them is 3)."Prerequisite build.
pnpm exec turbo run build --filter='@objectstack/lint...' --filter='@objectstack/client-react...' --concurrency=2ran underscripts/pm/os-verify-lock.sh:VERDICT command-exit 0, 37 of 37 tasks. In this round all 37 were cache hits on the same inputs.Docs-link and docs-audit verdict lines:
check:doc-anchors: "566 internal #fragment link(s) across 424 source file(s) all resolve to a real heading". That covers the new#support-windows,/docs/deployment/cli#os-migrate-meta---storedand/docs/upgrading#the-metadata-applinks.check:docs-redirects: "OK (apps/docs/redirects.mjs: 98 entries -- 95 page destination(s) resolved against content/docs …)".check:docs-audit-scope: "docs-accuracy-audit scope is in sync with content/docs/: 206 hand-written doc(s)". Nohandwritten-docs.jsonwrite was asked for or made.check:docs-transcript-drift: "4 declared transcript value(s) across 418 page(s) … equal what the registry derives today".Release-index verdict lines:
check-release-section-coverage.mjs, plain and--strict: "OK — 11 published minor(s) across 3 GA major(s) in scope (v16, v17, v18); … every index entry names the newest release of its major". This covers the v17 entry's new(final release: 17.7.0).check:release-page-status: "OK — 3 GA major(s) in scope (v16, v17, v18); each page's release-status blockquote and index entry describe a shipped release".check:release-notes: "OK".Other verdict lines:
check:lockstep-package-count: "all 3 occurrence(s) agree with the true count (73)". The page's lockstep sentences are untouched.check:nul-bytes: "OK (scanned 11726 text file(s) … no raw ASCII control bytes)".@objectstack/spec check:docs: "227 generated files in sync".check:skill-examples: "262 prose examples type-check across 3 surface(s)".MDX syntax. Both edited pages compile with the workspace's
@mdx-js/mdx3.1.1. Negative control: an unclosedCalloutis refused ("Expected a closing tag").Docs site build. Run locally at
062bfaf1ddas the production build that CI'sBuild Docsruns (apps/docs/vercel.jsonbuildCommand), with one declared difference. CI forces turbo (TURBO_FORCE) so the docs task cannot be a replayed cache hit; locally the docs package's ownbuildscript ran directly, outside turbo's cache, after its dependencies built:pnpm exec turbo run build --filter='@objectstack/docs^...' --concurrency=2 && pnpm --filter @objectstack/docs run build, under the verify lock. Results:VERDICT command-exit 0;apps/docs/.next/BUILD_IDpresent.It was not re-run locally at
f453405903. The derivation names it only as CI'sBuild Docsjob, as before, and the fix changed text inside two bullets without changing the MDX shape: both pages compile, and the unclosed-Calloutcontrol is refused. CI'sBuild Docscheck-run onf453405903concludedsuccess.Merge probe.
git merge-tree --write-treeagainstorigin/main459afea1f6exits 0 (treee475552dea).mainhas moved two commits since the base, and neither touches either path.skip-changeset, re-measured.files[]entry namingcontentordocs.packages/(withdist/, excludingnode_modules), the removed phrase "Critical bug fixes and security patches only", the added "Only the current MAJOR receives fixes", "current series: 17.7.0" and "Support Windows" each match 0 files.Not run locally, CI-owned:
testortypecheckis owed;test:repoand theTest Coreshards;check-issue-citations.mjs --census, shard attestation, test completeness);pnpm lint.The PR's check-runs answer them:
Lint & Repo Gates,TypeScript Type Check,Test Core,Build Core,Build Docs.Acceptance notes
ADR-0087 D6 is not cited. D6 reads "Every major is published to the
nextdist-tag at least one RC cycle beforelatest", but the ADR's 2026-07-15 as-built addendum lists "P3 — MCP tools + RC discipline (D6): deferred, evidence-gated", and npm@objectstack/specdoes not follow it:-rc.Nprereleases (16.0.0-rc.0andrc.1;17.0.0-rc.0torc.6), and thercdist-tag still points at17.0.0-rc.6.next.So both prerelease clauses rest on
scripts/check-changeset-no-major.mjs, which holds today, and namenextonly as the v18 instance. Nothing found fixes which tag a future pre mode uses, so the page names none. Not filed: it is history, with no reach. Carrier: none.Out of this PR's surface, reported to the seat and filed by it as docs(releases): after the 18.0.0 GA the index dates 18.0.0 "released 2026-10-19" (npm says 2026-10-20), and the v17 page still says "A plain install now resolves 17.7.0" #25148 (one card for both):
content/docs/releases/index.mdx:21reads "(current series: 18.0.0, released 2026-10-19)". The 18.0.0 Version Packages commit06cab4849ais dated 2026-10-20T11:47Z, npm'stime["18.0.0"]is 2026-10-20T12:51Z, andreleases/v18/18-0.mdx:3says "published 2026-10-20".content/docs/releases/v17/index.mdx's status blockquote still says "A plain install now resolves 17.7.0" whilelatestis 18.0.0. That is a per-release page, which this PR does not edit.Prose that quotes the old callout wording. Three places paraphrase the
:142sentence this PR rewrites: the comments atpackages/cli/src/commands/doctor.ts:2680andpackages/cli/src/commands/doctor-deprecation-hint-commands.test.ts:18, and the source note atdocs/qa/platform-checklist/areas/cli.json:1189. Each quotes "not yet available"; the page now says there is nocodemodcommand. None of them reads the page, and no gate compares them. The samedoctor.tscomment still says both ofos migrate meta's writes are--outJSON snapshots, which predates--write. They are code and QA data, outside this PR's surface. Not filed. Carrier: none.Generated by Claude Code