Repository navigation
chore(release): exit Changesets pre mode (next), so the next version pass cuts the 18.0.0 GA - #24555
Conversation
…ass cuts the 18.0.0 GA Written by `pnpm changeset pre exit` (@changesets/cli 3.0.3), committed as the tool wrote it: `.changeset/pre.json` mode "pre" -> "exit", tag unchanged. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…ease in the past tense once pre mode exits
`changeset pre exit` makes eleven present-tense sentences on this page false:
Changesets is no longer in pre mode, check-changeset-no-major.mjs refuses a
`major` again (measured: exit 1 on the exited tree, exit 0 with mode "pre"),
and the next version pass computes 18.0.0. Each sentence now scopes the
`18.0.0-next.N` behaviour to the prerelease, and the page's existing rule
("the window closes at GA, and strict SemVer resumes") is left as written.
Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
…angesets-pre-exit
维护者速读改了什么: 为什么改:你说的「发 GA 要先退出预发布模式」。合入之后,下一个 Version Packages PR 会把 fixed group 的 73 个包从 风险与代价(含回滚):
席位意见:建议在你选定的 GA 日按这个顺序合:本 PR → #24569 → 刷新 Version Packages PR。合并的时机你来定。 你要做的:在你选定 GA 的那天合入本 PR,紧接着合 #24569;然后让 Version Packages PR 刷新一次,确认渲染出 席位核对ACCEPT ·
⛔ Not readied or queued by this seat: the merge is the maintainer's GA timing call. Generated by Claude Code |
Fixes #24528
Clause-②: no
Exits Changesets pre mode on
main, on the maintainer's order 「发 GA 要先退出预发布模式。立卡派发」. After this lands, the next version pass computes the GA: the 73-member lockstep (fixed) group goes from18.0.0-next.5to18.0.0and publishes to npm'slatesttag. Draft, for the maintainer to merge. Its merge sets when the next Version Packages PR versions 18.0.0, and the dry-run below shows that refresh is still blocked by two release-owned doc sentences, so read "GA blockers" before merging.⛔ No
changeset versionoutput is committed. Nothing was published or tagged, no release workflow was dispatched, and neither the Version Packages PR norchangeset-release/mainwas touched.Head
abec338235=5b14b7f3ad(base at worktree creation) + this change +origin/main04669a467e, merged in before opening.The change
.changeset/pre.json, written bypnpm changeset pre exit(@changesets/cli3.0.3) and committed exactly as the tool wrote it (4fe7eb6abe):{ "mode": "pre", "tag": "next" }{ "mode": "exit", "tag": "next" }(2-space JSON plus a trailing newline, as before)@changesets/pre3.0.0exitPrespreads the state it read and setsmode: "exit". ItsmigratePreStateonly rewrites a file that still carries v2'sinitialVersionsorchangesetskeys. This file has neither, so it is a no-op here.pre exitneither writes nor expectsinitialVersionsorchangesets. The.changeset/pre/layout does not change what it writes. What the layout changes is what the GA pass reads: the CLI's reader (@changesets/read1.0.1) always lists.changeset/pre/, and inexitmode those changesets are consumed again (measured below).content/docs/protocol/backward-compatibility.mdx, 11 sentences (1b8d66ed1c). This page is hand-written and not release-owned. Merging the mode switch makes these present-tense sentences false: "Changesets is in pre mode", "the guard stands aside", "on the v18 line it ships in the next18.0.0-next.N".18.0.0-next.Nbehaviour in the prerelease, in the past tense. Two of them also state the exit facts: the line's GA version is18.0.0, and the guard fails amajorbump again.would promote all 73 published packages.andall **73** packages published from this repository) are byte-unchanged, andcheck:lockstep-package-countis green.content/docs/releases/is never edited in this PR.Dry-run of the version pass (scratch clone, never pushed)
Setup: a clone of this branch at
abec338235in the scratchpad, outside the worktree.--is-shallow-repositoryfalse, root commit present) and localmainat04669a467e.release-rehearsal-clone.mjsreported "✓ FIT".pnpm install --frozen-lockfile --ignore-scripts, with the migration registry generated by hand, because the scratchpad path is too long for tsx's IPC socket duringprepare.version-prjob's stepsRender the post-version tree,Validate the post-version treeandRestore the pre-version treewere extracted verbatim fromrelease.ymland run withRUNNER_TEMPandGITHUB_OUTPUTpointed at scratch files. The workflow itself was not run.What the pass consumes, and what happens to
pre.jsonpending_before(Render step,exitmode counts.changeset/*.mdplus.changeset/pre/*.md).changeset/pre/(deleted by the pass).changeset/.changeset/pre.jsonafter the pass.mdfiles under.changeset/after the passREADME.mdonly (.changeset/pre/is left empty, so git tracks nothing there)@changesets/read1.0.1 on the post-version treeannotate-shipped(first step ofpnpm run version)18.0.0-next.5version commit820fd5aef0annotated "Shipped in 18.0.0-next.5"latest.getReleaseTag(@changesets/cli3.0.3getPublishPlan.mjs:599-603) returnslatestwhen there is no pre state, and the GA version commit has none. This is a reading of the code; nothing was published.Every package, before and after
Lockstep group: all 73 members
18.0.0-next.5→18.0.0. The GA is18.0.0, not18.0.0-next.6and not19.0.0. The group:@objectstack/hono,@objectstack/cli,create-objectstack,@objectstack/specand the other 69 public packages listed in.changeset/config.json.check-changeset-fixed.mjsreports "in sync with 73 public workspace packages", and the dry-run read 73 of 73 members at18.0.0.The 13 private workspace packages outside the group:
@objectstack/example-crm4.0.100-next.54.0.100@objectstack/example-todo4.0.100-next.54.0.100@objectstack/example-multi-package0.0.7-next.50.0.7@objectstack/example-showcase0.3.22-next.50.3.22@objectstack/example-embed-objectql0.0.40-next.50.0.40@objectstack/dogfood0.0.48-next.50.0.48@objectstack/downstream-contract0.0.46-next.50.0.46@objectstack/http-conformance0.1.8-next.50.1.8@objectstack/docs4.2.3@objectstack/spec-monorepo(root)4.0.1objectstack-blank(template)0.1.0@objectstack/refd-timer-testkit0.1.0@objectstack/vitest-filter-preflight0.1.0GA blockers: the refresh cannot produce the 18.0.0 Version Packages PR yet
Leg A, the tree as this PR leaves it.
changeset version,sync-protocol-version,sync-template-versionsandsync-docs-image-tagsall succeed. Thensync-release-index-currencyrefuses, by design: "the v18 entry's status reads "prerelease:18.0.0-next.Non npm'snexttag, no GA date", but the newest released 18.x version is 18.0.0 … These are the shapes this rewriter deliberately refuses, because each needs a SENTENCE and not a token". Underset -ethe job stops there, so neither Validate nor the PR step runs.check-skill-compatibility-version --fix) and running Validate anyway shows the second refusal. 14 of 15 content gates are green, andcheck:release-page-statusis red:content/docs/releases/v18/index.mdx: "the release-status blockquote never states that a 18.x version is released";content/docs/releases/index.mdx: the v18 entry is flagged forprerelease-wordand forprerelease-version.Leg B, the same tree with stand-in GA prose (rehearsal clone only, committed there and never pushed).
(current series: 18.0.0, released 2026-10-19), and a blockquote lead added that reads18.0.0 was released on 2026-10-19.What is needed, for the seat to card. A docs-only PR, because
content/docs/releases/is release-owned and never edited in a code PR:content/docs/releases/index.mdx: the v18 entry's status becomes(current series: 18.0.0, released DATE). Also rewrite the paragraph "The v18 line is a major in prerelease. Changesets is in pre mode…" (lines 58-62), which this PR makes false at merge.content/docs/releases/v18/index.mdx: a release-status blockquote stating that 18.0.0 is released. Also rewrite the pre-mode sentences at lines 6-11, 27 and 62. Thedescriptionfront matter carries the same claim.check-release-section-coveragenotes that no heading on the v18 page names the 18.0 series.Timing:
sync-release-index-currencyrefuses to re-date a field that already names the newest GA. So DATE is never corrected by the pass, and no gate checks it. Write the UTC day of the refresh whose Version Packages PR is merged. The docs PR has to land after this one and before that refresh. Until both have landed, every six-hourly refresh is red. That red is loud and publishes nothing, and the standing Version Packages PR keeps its last validated content (18.0.0-next.6).The other route was considered and not taken: teaching
sync-release-index-currencya prerelease-to-first-GA transition. That would still leave the v18 page's blockquote (blocker 2) needing a sentence, so the docs PR is needed either way. It would also reverse that rewriter's documented boundary ("An entry whose parenthetical is prose. Same reason.").Mode-keyed gates, read on the exited tree (
abec338235)scripts/check-changeset-no-major.mjs--base origin/mainexits 0: "This diff introduces nomajorbump".--listexits 0: "18 pending changeset(s), 0 declaring a major. .changeset/pre.json mode: exit". The 29 files in.changeset/pre/that declare a major (47 major entries) are not refused: the gate judges diffs, and no PR's diff carries them. Re-arm probe (rehearsal clone only): a new"@objectstack/spec": majorchangeset on the exited tree gives exit 1 ("This PR introduces changeset(s) that declare amajorbump"). The control, the same tree withmode: "pre", gives exit 0 (exempt). Consequence: from the merge on, an open PR that adds amajorchangeset goes red atCheck Changesetunless it carriesallow-major.release.ymlpending count (Render:511ff, Restore:861ff)exitmode it counts.changeset/*.mdplus.changeset/pre/*.md= 1029, equal to whatchangeset versiondeleted. Restore reads the mode from the restored tree, because the pass deletedpre.json. Replayed verbatim, it restored 1029.release.yml:373ff)PROTOCOL_VERSIONalready reads'18.0.0'("✓ PROTOCOL_VERSION already 18.0.0"). The blank template already stamps^18.0.0and'^18'("template stamps moved: 0"). Validate reports "major-boundary surfaces left unvalidated: 0", so theprotocol-version.tsrefusal branch is not reached.release.yml:1941ff)pre.json.BLOCKING: '0'keeps it advisory in every mode (the card's "advisory while in pre mode" is out of date).cut-rc.ymlallowlist (:232-237)mode: prewithtag: rc, so it refused before (tagnext) and still refuses (modeexit). The GA lane isrelease.yml.scripts/release-pending-publish.mjs--self-testexits 0 (112 cases), andannotate-shippedran in the dry-run as described above.scripts/check-docs-image-tag.mjs17.7.0, becauseexitstill means the prerelease line. On the post-version tree it is green inside Validate, with the docs at18.0.0.scripts/sync-docs-image-tags.mjs17.7.0to18.0.0, andcheck:docs-image-tag-syncis green on both trees.scripts/check-published-files.mjsscripts/check-adr-0087-registration.mjs--base origin/mainexits 0 and--self-testexits 0.pr-automation.ymlCheck Changesetchangeset pre exitre-arms it", as measured in the probe above.scripts/objectui-changeset-digest.mjsinPreModemajorwould now be digested asminor, which mirrors the no-major guard.check:objectui-changesetis green.Changeset and label
This PR adds no changeset, and the mode switch is not a package change. The
Check Changesetjob's route 0 does not apply, because no.changeset/*.mdrow changes (pre.jsonis not a.md). Route 2 applies, because the PR releases nothing: neither.changeset/pre.jsonnorcontent/docs/**is in any public package'sfiles[](measured over every non-privatepackage.json). Soskip-changesetis applied at creation.Gates (local, exit codes captured before any pipe)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackatabec338235derives 54 commands for this two-file diff.--ranreconciliation reads "54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN", and all 54 exit 0.check:docs-transcript-driftneeds the lint dist, andcheck:skill-examplesneeds the client and client-react dists. I built@objectstack/lint...(4 packages, 121 s) and@objectstack/client-react...(39 packages, 340 s) underos-verify-lock.sh, then re-ran both, exit 0.check-changeset-no-major --list,check-changeset-fixed,check:docs-image-tag-sync,check:release-page-status,check-release-section-coverage --strict,check:release-index-currency-sync,check:future-spec-major,check:template-version-sync,check:skill-compatibilityandcheck:release-notes. These are the exited, pre-version tree, which stays green until the version pass runs.changesets/actionread rehearsal, because it is a GitHub Action, so the CLI's own reader was read instead;check:dev-prereqs, because the diff does not touch thepackages/specbuild.Acceptance notes
18.0.0-next.6. Do not merge it after this PR expecting the GA. Until the docs blockers land, every refresh is red and it keeps next.6.18.0.0-next.6tonext. The version commit's tree still carriespre.jsonwithmode: "exit", sogetReleaseTagreturnspreState.tag. The GA cut then follows on the next green refresh. This is a reading of the code, not a measurement.4fe7eb6abe(1028 changesets):packages/spec/CHANGELOG.mdgains a 6,006-line## 18.0.0section of 983,037 bytes, added on top of the six18.0.0-next.Nsections;release-github-releases.mjs.--listundercounts inexitmode.check-changeset-no-major --listand thecheck-adr-0087-registrationaudit surfaces count root stock only (18) and exclude.changeset/pre/as consumed, while the GA pass consumes 1029. This is informational only, because both gates judge diffs. Noted, not carded.pre exit"expectsinitialVersions/changesets" does not hold under v3 (see The change, item 1).Card checklist
pnpm changeset pre exit, committed as written.pre.json. Done: the tables above (73 members to18.0.0; 1011 consumed frompre/plus 18 from the root;pre.jsondeleted).18.0.0for@objectstack/spec. Not reachable until the docs-only PR above lands. Leg B shows that once it does, the refresh validates with@objectstack/specat18.0.0.维护者速读(草稿)
改了什么:退出 Changesets 预发布模式。
.changeset/pre.json由pnpm changeset pre exit写出,模式从pre改为exit。另外把content/docs/protocol/backward-compatibility.mdx里 11 处"v18 正在预发布"的现在时句子改成过去时,因为合并后这些句子就不再成立。没有代码、工作流或 changeset 改动。为什么改:执行维护者的指令「发 GA 要先退出预发布模式。立卡派发」。在临时克隆里演练了版本步骤。合并后,下一次版本 PR 会把 73 个锁步包从
18.0.0-next.5定为18.0.0(不是 next.6,也不是 19.0.0)。这一步会消费全部 1029 条 changeset,删除pre.json,发布时打 npm 的latest标签。风险与代价(含回滚):
content/docs/releases/下 v18 的发布页和发布索引仍写着"预发布、没有 GA 日期",需要人写一句 GA 文案。这两处属于发布文档,本 PR 不能改,要另开一个 docs-only PR。加上替代文案后,整条流程演练全绿。18.0.0-next.6,不要把它当成 GA 合并。allow-major。latest仍是 17.7.0。mode: "pre")。GA 发布到 npm 之后无法回滚。席位意见:
你要做的:
@objectstack/spec是18.0.0之后,再合并版本 PR。Generated by Claude Code