Skip to content

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

Closed

Description

@objectstack-fleet

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 one major marker, so v18 opens at 18.0.0-next.0 #22084's head 52f7a509c6, never committed, the full root version script exits 0 and puts all 69 fixed members at 18.0.0-next.0. The script is changeset version, sync-protocol-version, sync-template-versions, sync-docs-image-tags and sync-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.json and package.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.yml is no route either: it refuses any version not shaped X.Y.Z-rc.N (:156–:159) and any pre.json tag but rc (:232–:237).
  • Same throwaway: scripts/sync-release-index-currency.mjs rewrote the v17 entry in content/docs/releases/index.mdx from released 2026-10-06 to released 2026-10-07, the cut's date. 17.7.0's version commit 4e4e881427 is 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

  1. 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.
  2. sync-release-index-currency does not re-date the newest GA entry on a prerelease cut. This is pinned in its own battery.
  3. Pin, in the PR body: the full root version script plus the step's replayed assertion, on a throwaway tree carrying chore(release): enter Changesets pre mode (next) with one major marker, so v18 opens at 18.0.0-next.0 #22084's pre.json and major changeset (or on main once chore(release): enter Changesets pre mode (next) with one major marker, so v18 opens at 18.0.0-next.0 #22084 merges). It exits 0 at 18.0.0-next.0, and the release index's v17 date is unchanged.
  4. Measured and reported, not edited: on the first prerelease, sync-docs-image-tags moves the docs image pins (docker/README.md, content/docs/deployment/self-hosting.mdx, content/docs/upgrading.mdx) from 17.7.0 to 18.0.0-next.0 while npm latest stays 17.7.0. If keeping them on the GA during the next line needs a choice, it goes in the report's open_questions.
  5. ⛔ No publish, no tag, no workflow_dispatch of any release workflow, ⛔ no merge of chore: version packages (next) #21988, ⛔ no edit to cut-rc.yml, ⛔ no hand edit of content/docs/releases/**.

Related: #22080 · PR #22084 · #22050 · #21988 · #15194.

Activity

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, iteratedomain:devxpriority:p1High: required for production / M2target:v18tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions