Repository navigation
chore(release): enter Changesets pre mode (next) with one major marker, so v18 opens at 18.0.0-next.0 - #22084
Open
objectstack-fleet[bot] wants to merge 3 commits into
Open
objectstack-fleet[bot] wants to merge 3 commits into
objectstack-fleet[bot] wants to merge 3 commits into
Conversation
`pnpm changeset pre enter next` writes `.changeset/pre.json` as
`{"mode": "pre", "tag": "next"}`. From this commit, `changeset version`
computes prerelease versions and `changeset publish` publishes them under
the npm dist-tag `next`.
Claude-Session: https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw
Co-authored-by: Claude <noreply@anthropic.com>
…xt.0 Every publishable package is in the Changesets `fixed` group, which takes the highest pending bump. Every changeset pending on main is `minor` or `patch`, so pre mode alone would version 17.8.0-next.0. One `major` on `@objectstack/spec` takes the group to 18; `sync-protocol-version.mjs` reads PROTOCOL_VERSION from that package's major. The changeset states its ADR-0087 disposition (not-required, no-migration-prescription): the marker moves no authorable key, export, type or stored shape. Claude-Session: https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 7, 2026
…` constant `check-adr-0087-registration.mjs` filters `.changeset/pre/` (consumed prerelease changesets) out of its audit surfaces. The literal now sits in a top-level `CONSUMED_PRERELEASE_EXCLUDED` constant that `isConsumedPrerelease` reads; the literal and the predicate's match are unchanged. The constant's name meets dispatch-gates' exclusion-declaration predicate, so the watch-hint extractor reads the literal as the excluded surface it is. Without it, once `.changeset/pre.json` is tracked the extracted hint `.changeset/pre` resolves to `pre.json` under the PM self-test's loose rule and not under its strict rule, and `check:pm-dispatch-gates` fails its "extension narrowing costs no lead" case. Claude-Session: https://claude.ai/code/session_01VF48aw8RPG6wzDnMgp6rtw Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
This was referenced Oct 7, 2026
This branch has not been deployed
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 #22080
Clause-②: no
Opens the v18 line on
main, as ruled B on #22050 (record6037890422). Changesets enters pre mode with the tagnext, and onemajorchangeset takes thefixedgroup to 18, so the first version cut is18.0.0-next.0. File surface:.changeset/plus one line inscripts/check-adr-0087-registration.mjs(the seat's surface amendment6040954045on #22080; see the patch round below). ⛔ No edit to.changeset/config.json, to either changeset guard's logic, or to.github/workflows/release.yml. ⛔ Nochangeset versionoutput is committed, and nothing was published.The change
.changeset/pre.json, written bypnpm changeset pre enter next(@changesets/cli3.0.3) and committed as the tool wrote it (commitd3d35a1029):{ "mode": "pre", "tag": "next" }Under v3 the file holds
modeandtagonly. There is noinitialVersionsand nochangesetslist..changeset/22080-v18-line-opens.md, front matter"@objectstack/spec": major(commit52f7a509c6). Its body is the v18 line's opening note (ADR-0131; decision: open v18 now and ship it in stages — release the last 17.x from main first without waiting for #21908's deny (A), skip the last 17.x (B), or keep #22009's order (C)? #22050). It carriesClause-②: noand its ADR-0087 disposition (see Gates).3d9188502e, prints17 : minorand32 : patch, and nomajor. Nomajorwas pending, so without this marker pre mode would version17.8.0-next.0.@objectstack/spec. Anyfixed-group member moves all 69 to the same version, so the choice decides only where the note lands and what the major means.@objectstack/specis the protocol package.scripts/sync-protocol-version.mjs, which the rootversionscript runs, derivesPROTOCOL_VERSIONfrom this package's major, and ADR-0131 C8 calls the line "protocol 18". So the major sits on the package whose major is the protocol version, and the note lands where an upgrading reader looks first:packages/spec/CHANGELOG.md, under### Major Changes.The no-major guard reads
pre.jsonfrom the checkout it runs in (the head), so steps 1 and 2 ship togetherscripts/check-changeset-no-major.mjs:396setsREPO_ROOTto the checkout the script runs in.readPre(root)(:2018) readsjoin(root, '.changeset', 'pre.json')from that working tree,:2098hands the result tojudge, andjudgereturnsexemptwhenpre?.mode === 'pre'(:662).--basesets only where the diff starts. It is never wherepre.jsonis read.Check Changesetjob in.github/workflows/pr-automation.ymlchecks out the PR merge ref (the default for apull_requestevent) and runsnode scripts/check-changeset-no-major.mjs --base "$MERGE_BASE"(:1130). The merge ref carries this PR'spre.json.52f7a509c6:✓ Changesets is in pre-release mode (tag: next) — ... skipping the no-major guard., plus a notice naming@objectstack/spec..changeset/pre.jsondeleted from the working tree only, exit 1,⛔ This PR introduces changeset(s) that declare a major bump.The base3d9188502ehas nopre.jsonat all, so a guard that read the base could never have answeredexempt. Restored withgit checkout HEAD -- .changeset/pre.json:git diff HEADis empty, and the guard exits 0 again.Pins
changeset versionputs thefixedgroup at18.0.0-next.052f7a509c6:pnpm changeset versionexits 0. All 69fixed-group members read18.0.0-next.0, andpre.jsonis unchanged. The 37 consumed changesets (36 pending plus this one) moved to.changeset/pre/.packages/spec/CHANGELOG.mdopens## 18.0.0-next.0/### Major Changeswith this note. The worktree was then removed.check-changeset-no-majorandcheck-changeset-fixedpass on the PRnode scripts/check-changeset-no-major.mjs --base origin/mainexits 0 on the pre-release exemption above. Driven with apull_requestpayload carrying this body (--event), it also exits 0 with the level axis read.node scripts/check-changeset-fixed.mjsexits 0:✓ .changeset/config.json "fixed" group is in sync with 69 public workspace packages..changeset/pre.jsonis present at the merge, with"mode": "pre"and"tag": "next"d3d35a1029with the content above. No later commit touches it. It is in the merge ref CI checks out, which is the file the guard's exemption reads.release.yml: in pre mode,changeset publishpublishes undernext, andlateststays 17.7.0This is a reading of the file. Nothing was edited, and no publish was run.
.github/workflows/release.yml:1762is jobpublish, stepPublish to npm + push version tags. At:1772it runspnpm run release.package.jsonreleasescript ispnpm run build && bash scripts/build-console.sh && bash scripts/release-publish.sh.scripts/release-publish.sh:64runschangeset publishwith no--tag.@changesets/cli3.0.3,dist/getPublishPlan.mjs:599-603getReleaseTagworks like this: with no--tagand a pre state present, the tag ispreState.tag, which isnext. The one exception is a package whose every published version is already anextprerelease. Separately,dist/publish.mjs:61-63refuses a custom--tagin pre mode.npm viewread today: all 69fixed-group packages havelatest=17.7.0and nonexttag. So each publishes tonext, andlateststays17.7.0.Gates (run on
52f7a509c6, exit codes captured before any pipe)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 20 commands for this diff. All 20 exit 0, and--ranreconciles:20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN.Patch round, head
a630de657d(seat-appended from addendum6041313497). At52f7a509c6the requiredLint & Repo Gateswas red atPM dispatch-gates self-test, casethe extension narrowing costs no lead … (refused: .changeset/pre): withpre.jsontracked, the battery's loose and strict hint rules disagreed on the literal.changeset/pre/atscripts/check-adr-0087-registration.mjs:536. That line now names the existing exclusion asCONSUMED_PRERELEASE_EXCLUDED(the predicate's match is unchanged), which the extractor reads as an excluded surface. Ata630de657d: 41 derived commands, 41 run, all exit 0;pnpm check:pm-dispatch-gates→1976 cases pass(965.7 s), the case reads(refused: none);check-adr-0087-registration --self-test441 assertions and--base origin/mainexit 0.check-adr-0087-registration --base origin/mainexits 0. The gate requires a disposition for amajor: a probe commit without one was refused, exit 1, withdeclares a breaking change (major) but no adr-0087: disposition marker. The probe was never pushed. The changeset now carries thenot-required (no-migration-prescription)marker in the ADR-0087 HTML-comment form, because the marker moves no authorable key, export, type or stored shape.check-changeset-no-major --base origin/mainandcheck-empty-changeset --base origin/mainexit 0.check:changeset-gate-self-tests, exit 0.check-closing-keyword-parityand its self-test,check-comment-mask-corpus,release-rehearsal-clone --self-test,release-pending-publish --self-test,check:driver-memory-census,check:gitlink-declared,check:nul-bytes,check:objectui-changeset,check:pm-changeset-deadline-census,check:published-files,check:refd-timer-probeandcheck:watch-hint-literal.check-changeset-fixed(an artifact roster under.changeset/),check:future-spec-major,check:lockstep-package-countandcheck:docs-image-tag.Read before merging: after this lands, the version-PR refresh goes red until its major-boundary gates are wired
The card expects changesets/action to refresh #21988 into the
18.0.0-next.0version PR once this lands. On the files as they stand, it will not.version-prjob inrelease.yml(cron0 */6 * * *) runspnpm run versionin the stepRender the post-version tree(:450). The stepValidate the post-version tree(:518) then exits 1 at:610-613when the pass wrote any major-boundary path: "this version pass crossed a MAJOR boundary ... Wire them in before letting this refresh through." The stepCreate or update the "chore: version packages" PRhas noif:, so it does not run after that failure.changeset version, the other three rewriters of the rootversionscript exit 0. Replaying the step's shape assertion gives 0 unexpected paths and 4 major-only paths:packages/spec/src/kernel/protocol-version.ts(PROTOCOL_VERSION 17.0.0to18.0.0) and the blank template'sobjectstack.config.ts,objectstack.manifest.jsonandpackage.json.cut-rc.yml, refuses a pre tag other thanrc(:232-237) and a version not shapedX.Y.Z-rc.N(:156-159). The ruled tag isnext.18.0.0-next.0without a workflow change. That change is outside this card, which forbids anyrelease.ymledit. The red is the lane's own designed refusal. It publishes nothing and queues nothing. chore: version packages #21988 stays at its current 17.8.0 content and, as the card says, ⛔ is not merged.Acceptance notes
pnpm run versionshows two more things that the lane wiring has to account for.scripts/sync-release-index-currency.mjsre-dates the v17 entry incontent/docs/releases/index.mdxfrom17.7.0, released 2026-10-06toreleased 2026-10-07. That is the prerelease cut's date. 17.7.0's version commit4e4e881427is dated 2026-10-06. Reported to the seat as a finding.scripts/sync-docs-image-tags.mjsmoves the 9 pins indocker/README.md,content/docs/deployment/self-hosting.mdxandcontent/docs/upgrading.mdxfrom17.7.0to18.0.0-next.0. The self-hosting docs onmainwould then name a prerelease whilelatestis 17.7.0. Noted only.lateststays on 17.x until GA. The pre-mode publish path above is what makes that true.维护者速读(草稿)
改了什么:在
main上进入 Changesets 预发布模式(标签next),并加一条把@objectstack/spec标为major的 changeset。合并后,下一次切版本得到的是18.0.0-next.0,而不是17.8.0。改动是.changeset/下的两个文件,加上门禁脚本里的一行重命名:scripts/check-adr-0087-registration.mjs把已有的排除路径.changeset/pre/写成_EXCLUDED命名常量(匹配逻辑不变),这样pre.json存在后 PM 门禁自检能正确识别它。没有代码或工作流改动。为什么改:按 #22050 的裁决 B,v18 直接在
main上开发。v18 的破坏性改动要以18.0.0-next.N预发布版发到 npm 的next标签上;latest保持 17.7.0,普通安装的用户不受影响,直到 18.0 正式版。风险与代价(含回滚):合并后,版本 PR 的自动刷新(
release.yml的version-pr,每 6 小时一次)会在 "Validate the post-version tree" 一步变红。原因是这一版跨了大版本,会改写PROTOCOL_VERSION和模板文件,而这条通道对这些文件还没有门禁,按设计会拒绝。它不发布,也不排队任何东西,但在另开卡把这些门禁接上之前,#21988 不会变成18.0.0-next.0。cut-rc.yml只接受rc标签,也走不通。#21988 无论如何都不要合并。回滚办法:删除.changeset/pre.json和.changeset/22080-v18-line-opens.md两个文件(在切出任何预发布版之前,这一步没有副作用)。席位意见:
你要做的:确认后合并本 PR。合并后需要另开一张卡,让版本通道能切出
18.0.0-next.0;这张卡由席位提出。Generated by Claude Code