From d3d35a1029489bdea81182b03c52c376470be400 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 7 Oct 2026 13:44:31 +0000 Subject: [PATCH 1/3] chore(release): enter Changesets pre mode with the tag `next` `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 --- .changeset/pre.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000000..d20efa9e7db --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,4 @@ +{ + "mode": "pre", + "tag": "next" +} From 52f7a509c6ce5b7e46d6a05275d7957eacebe631 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 7 Oct 2026 13:45:21 +0000 Subject: [PATCH 2/3] chore(release): one `major` marker so the v18 line opens at 18.0.0-next.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 --- .changeset/22080-v18-line-opens.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .changeset/22080-v18-line-opens.md diff --git a/.changeset/22080-v18-line-opens.md b/.changeset/22080-v18-line-opens.md new file mode 100644 index 00000000000..91b1263e9b6 --- /dev/null +++ b/.changeset/22080-v18-line-opens.md @@ -0,0 +1,14 @@ +--- +"@objectstack/spec": major +--- + +The v18 line opens (ADR-0131; #22050). Every release from here is an `18.0.0-next.N` prerelease on the npm dist-tag `next`, until 18.0 GA. + +Clause-②: no + +- **What this marks.** Changesets is in pre mode with the tag `next`. Every `@objectstack/*` package versions together, so this one `major` takes all of them to 18, and the first version cut is `18.0.0-next.0`. `PROTOCOL_VERSION` follows `@objectstack/spec`'s major at version time, so it reads `18.0.0` from that prerelease on. The marker itself changes no code, key, export or stored shape. +- **What the line carries.** ADR-0131 (organization ownership is total: no NULL `organization_id`) lands on this line in stages. Each stage that breaks something says so in its own changeset, with its own migration. +- **Who receives it.** A plain install still resolves the dist-tag `latest`, which stays on 17.x until 18.0 GA. A prerelease is installed only on request: `@objectstack/spec@next`, or an exact `18.0.0-next.N`. +- **What ends it.** 18.0 GA exits pre mode and publishes to `latest`. + + From a630de657d8cc818b56e40ed7ec8e6b888b14fd3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 7 Oct 2026 15:21:38 +0000 Subject: [PATCH 3/3] fix(scripts): name the consumed-prerelease exclusion as an `_EXCLUDED` 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 --- scripts/check-adr-0087-registration.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/check-adr-0087-registration.mjs b/scripts/check-adr-0087-registration.mjs index 7362b91033f..c961391c805 100644 --- a/scripts/check-adr-0087-registration.mjs +++ b/scripts/check-adr-0087-registration.mjs @@ -533,7 +533,8 @@ const isChangesetFile = (p) => p.startsWith('.changeset/') && p.endsWith('.md') * audit surfaces is a readability fix; filtering the verdict would be a bypass, * and `PRE2` in the self-test pins the difference. */ -const isConsumedPrerelease = (p) => p.startsWith('.changeset/pre/'); +const CONSUMED_PRERELEASE_EXCLUDED = '.changeset/pre/'; +const isConsumedPrerelease = (p) => p.startsWith(CONSUMED_PRERELEASE_EXCLUDED); /** * Split a changeset into its frontmatter bump entries and its body.