Repository navigation
release(v18): the version-pr lane refuses the major boundary at Validate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085
Description
Ruled: 6049734955 · letters Q1 B · Q2 A · Q3 B · 2026-10-08T00:41Z
This card carries the version-lane half of #22080's opening: the route by which 18.0.0-next.0 is actually cut once pre mode is in. #22080 keeps its own half, pre mode plus the one major marker, as PR #22084. Its After-it-lands line ("changesets/action refreshes #21988 into the prerelease version PR") is what this card makes true.
Filed by PM seat domain:devx#2 (session_01VF48aw8RPG6wzDnMgp6rtw) as an in-flight derivative of #22080. Per the execution duties, it inherits #22080's domain (domain:devx), priority (p1) and target:v18, and this seat dispatches it directly. ⛔ Not a claim; the claim follows.
Filing gate: ① a measured defect with a named producer. reach: named producer: release.yml's version-pr job (cron 0 */6 * * *), step Validate the post-version tree (:518 on main 3d9188502e). It exits 1 at :610–:613 on the first refresh after #22084 merges.
Reader: this seat's next dispatch, now.
Dedupe: the 435 most recently updated issues (state=all, REST page loop, PRs excluded), titles and bodies grepped for post-version tree|MAJOR_ONLY|major boundary|version-pr|18\.0\.0-next|release-index-currency|cut-rc. That gives 5 hits: #22080, #9139, #22050, #21993 and #21772. None wires the lane for the boundary. Dedupe words: version-pr major boundary; Validate the post-version tree; MAJOR_ONLY unvalidated; release index currency prerelease date.
What was measured (PR #22084's dev, report 6039596838. The seat re-read the release.yml and cut-rc.yml lines cited; the rest is the dev's throwaway reading)
- In a throwaway worktree at chore(release): enter Changesets pre mode (
next) with onemajormarker, so v18 opens at 18.0.0-next.0 #22084's head52f7a509c6, never committed, the full rootversionscript exits 0 and puts all 69fixedmembers at18.0.0-next.0. The script ischangeset version,sync-protocol-version,sync-template-versions,sync-docs-image-tagsandsync-release-index-currency. - Replaying the step's shape assertion on that tree finds 0 unexpected paths, but MAJOR_ONLY is non-empty:
packages/spec/src/kernel/protocol-version.ts,'17.0.0'→'18.0.0';packages/create-objectstack/src/templates/blank/objectstack.config.ts,objectstack.manifest.jsonandpackage.json.- The step prints
this version pass crossed a MAJOR boundary and wrote the surfaces above, which this lane has no gate for … Wire them in before letting this refresh through.and exits 1 (:610–:613). - The changesets/action step that would refresh chore: version packages (next) #21988 does not run.
cut-rc.ymlis no route either: it refuses any version not shapedX.Y.Z-rc.N(:156–:159) and anypre.jsontag butrc(:232–:237).- Same throwaway:
scripts/sync-release-index-currency.mjsrewrote the v17 entry incontent/docs/releases/index.mdxfromreleased 2026-10-06toreleased 2026-10-07, the cut's date. 17.7.0's version commit4e4e881427is dated 2026-10-06. In pre mode the newest GA does not move, so every prerelease cut would re-date the last GA.
The route (the seat's call, not re-rulable here)
#22050's ruling 6037890422, verbatim: "Once the opening lands, changesets/action turns it into the prerelease version PR." So the version PR is the ruled route, and this card wires it. ⛔ cut-rc.yml is not extended (that would be a second route the ruling did not name).
Done when
- A version pass that crosses the major boundary passes
Validate the post-version tree. The step now validates each MAJOR_ONLY surface instead of refusing it: the protocol-version lockstep and the blank template's render, using gates the lane or the repo already has. The refusal stays for any major-only path still unvalidated. sync-release-index-currencydoes not re-date the newest GA entry on a prerelease cut. This is pinned in its own battery.- Pin, in the PR body: the full root
versionscript plus the step's replayed assertion, on a throwaway tree carrying chore(release): enter Changesets pre mode (next) with onemajormarker, so v18 opens at 18.0.0-next.0 #22084'spre.jsonandmajorchangeset (or onmainonce chore(release): enter Changesets pre mode (next) with onemajormarker, so v18 opens at 18.0.0-next.0 #22084 merges). It exits 0 at18.0.0-next.0, and the release index's v17 date is unchanged. - Measured and reported, not edited: on the first prerelease,
sync-docs-image-tagsmoves the docs image pins (docker/README.md,content/docs/deployment/self-hosting.mdx,content/docs/upgrading.mdx) from17.7.0to18.0.0-next.0while npmlateststays 17.7.0. If keeping them on the GA during thenextline needs a choice, it goes in the report'sopen_questions. - ⛔ No publish, no tag, no
workflow_dispatchof any release workflow, ⛔ no merge of chore: version packages (next) #21988, ⛔ no edit tocut-rc.yml, ⛔ no hand edit ofcontent/docs/releases/**.
Activity