You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec(v18): move PROTOCOL_VERSION 17 → 18 in an ordinary pull request with full CI: regenerate spec-changes.json and the 17 → 18 upgrade-guide section, rewrite the in-repo ^17 handshakes, and give the lockstep test one pre-mode exception (#22085 Q1) #22130
This card carries #22085's Q1 half: the ruling 6049734955 (Q1 → B). #22085 keeps Q2, the v18 release page (a release-side action), and Q3, filed as the domain:devx sub-issue filed in the same act (both numbers are recorded on #22085).
Filing gate: ③ a direct task from a maintainer ruling. The ruling 6049734955 records the maintainer's 「22082 22085 同意」 (2026-10-08T00:37Z) taking Q1 → B: "the protocol major moves in an ordinary pull request that runs the full CI, not in the version pass … The constant lives in packages/spec, so the work is the domain:spec lane's card, filed by the domain:devx seat in execution."
Reader: the domain:spec seat claims and dispatches it from its queue. Lane and priority come from the ruling and the parent (#22085, priority:p1, target:v18); p1 carries down the chain. Filed by PM seat domain:devx#2 (session_01VF48aw8RPG6wzDnMgp6rtw). ⛔ Not a claim.
Order: this lands after PR #22084 (#22080, pre mode plus the major marker). The lockstep exception below keys on the pre mode that PR opens. Development can start now. Until this lands, release.yml's version-pr refresh stays red at Validate the post-version tree, and that red publishes nothing. ⛔ #21988 is not merged.
scripts/sync-protocol-version.mjs derives the constant from @objectstack/spec's major at version time, inside the root version script. In pre mode that would rewrite the constant inside the bot's Version Packages PR, which runs no CI. The script's own note on fix(spec): PROTOCOL_VERSION 13.0.0 → 14.0.0 — re-lockstep with the released major #2769 warns against that shape.
Files declaring a ^17 protocol handshake: 56, from git grep -l -E "protocol['\"]?\s*:\s*['\"]\^17".
Path
Files
packages/cli
21
packages/metadata
6
content/docs
6
packages/qa
4
packages/runtime
3
packages/metadata-core
2
packages/lint
2
examples/app-multi-package
2
packages/spec
1
packages/mcp
1
packages/create-objectstack
1
examples/app-todo
1
Some may pin an old protocol on purpose (a refusal test). Each is judged, not swept.
The generated documents: packages/spec/spec-changes.json and docs/protocol-upgrade-guide.md, which needs its 17 → 18 section. Their gates are check:spec-changes and check:upgrade-guide.
The lockstep test: packages/spec/src/kernel/protocol-version.test.ts.
Done when
PROTOCOL_VERSION reads '18.0.0'. Once both pre.json and the major marker are on main, the next version pass leaves protocol-version.ts untouched and Validate the post-version tree passes that check. This is confirmed by a replay of the root version script on a throwaway tree, quoted in the PR body.
spec-changes.json and the upgrade guide's 17 → 18 section are regenerated by their own tooling, ⛔ not by hand, and check:spec-changes and check:upgrade-guide exit 0.
Every in-repo ^17 handshake that means "the current protocol" reads ^18. Each one left at ^17 is named in the PR body with its reason.
The lockstep test gains exactly one narrow exception: in pre mode with a pending major changeset, the protocol major may equal the major about to be published. Outside that condition it is unchanged, and the exception carries its own failing case.
First measurements, answered in the PR body before the edit:
which packages/cli fixtures declare ^17 on purpose;
Ruled: 6056808625 · letter E · 2026-10-08T09:29Z
This card carries #22085's Q1 half: the ruling
6049734955(Q1 → B). #22085 keeps Q2, the v18 release page (a release-side action), and Q3, filed as thedomain:devxsub-issue filed in the same act (both numbers are recorded on #22085).Filing gate: ③ a direct task from a maintainer ruling. The ruling
6049734955records the maintainer's 「22082 22085 同意」 (2026-10-08T00:37Z) taking Q1 → B: "the protocol major moves in an ordinary pull request that runs the full CI, not in the version pass … The constant lives inpackages/spec, so the work is thedomain:speclane's card, filed by thedomain:devxseat in execution."Reader: the
domain:specseat claims and dispatches it from its queue. Lane and priority come from the ruling and the parent (#22085,priority:p1,target:v18);p1carries down the chain. Filed by PM seatdomain:devx#2(session_01VF48aw8RPG6wzDnMgp6rtw). ⛔ Not a claim.Order: this lands after PR #22084 (#22080, pre mode plus the
majormarker). The lockstep exception below keys on the pre mode that PR opens. Development can start now. Until this lands,release.yml'sversion-prrefresh stays red atValidate the post-version tree, and that red publishes nothing. ⛔ #21988 is not merged.What is measured (on
origin/main8fc50b7647)packages/spec/src/kernel/protocol-version.ts:18:export const PROTOCOL_VERSION = '17.0.0';.scripts/sync-protocol-version.mjsderives the constant from@objectstack/spec's major at version time, inside the rootversionscript. In pre mode that would rewrite the constant inside the bot's Version Packages PR, which runs no CI. The script's own note on fix(spec): PROTOCOL_VERSION 13.0.0 → 14.0.0 — re-lockstep with the released major #2769 warns against that shape.PR fix(release): judge the major-boundary template stamps on the version-pr lane, and stop prerelease cuts re-dating the last GA #22095 (
8a925b3b47) maderelease.yml'sValidate the post-version treerefuse a version pass that changesprotocol-version.ts. Its refusal text names the reason: the handshake would refuse everyengines.protocol: '^17'manifest, and no gate on that lane boots them.Files declaring a
^17protocol handshake: 56, fromgit grep -l -E "protocol['\"]?\s*:\s*['\"]\^17".packages/clipackages/metadatacontent/docspackages/qapackages/runtimepackages/metadata-corepackages/lintexamples/app-multi-packagepackages/specpackages/mcppackages/create-objectstackexamples/app-todoSome may pin an old protocol on purpose (a refusal test). Each is judged, not swept.
The generated documents:
packages/spec/spec-changes.jsonanddocs/protocol-upgrade-guide.md, which needs its 17 → 18 section. Their gates arecheck:spec-changesandcheck:upgrade-guide.The lockstep test:
packages/spec/src/kernel/protocol-version.test.ts.Done when
PROTOCOL_VERSIONreads'18.0.0'. Once bothpre.jsonand themajormarker are onmain, the next version pass leavesprotocol-version.tsuntouched andValidate the post-version treepasses that check. This is confirmed by a replay of the rootversionscript on a throwaway tree, quoted in the PR body.spec-changes.jsonand the upgrade guide's 17 → 18 section are regenerated by their own tooling, ⛔ not by hand, andcheck:spec-changesandcheck:upgrade-guideexit 0.^17handshake that means "the current protocol" reads^18. Each one left at^17is named in the PR body with its reason.majorchangeset, the protocol major may equal the major about to be published. Outside that condition it is unchanged, and the exception carries its own failing case.packages/clifixtures declare^17on purpose;sync-protocol-version.mjs's version-time behaviour,release.ymlorcut-rc.yml. ⛔ No publish, tag or release workflow run.Dedupe
REST page loop (since 2026-09-01,
state=all, 1,940 issues: 45 open, 1,895 closed) grepped forPROTOCOL_VERSION|protocol-version\.ts|\^18|protocol major|protocol 18|17 → 18→ 18 hits.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 and this seat's post [PM seat] domain:devx · seat 2 — ⏳ vacant #20163.retiredKey()tombstone findings spec: 14retiredKey()tombstones again prescribe@objectstack/spec 18, a version that will not contain the change — #4350 recurring with no gate behind its fix #18040, 14 ADR-0049 tombstones tell authors a key was removed in@objectstack/spec 18— an npm version that does not exist and, under the 2026-09-13 level ruling, will not be the carrier #18048, [finding] SixretiredKey()tombstones tell authors a key "was removed in @objectstack/spec 18" — a version that does not exist; the package is 17.4.0 and every retirement now shipsminor#18059 (closed).migrations/registry.tsmixes generated regions with hand-authored ones, so the documented merge remedy silently dropsstep18.conversionIds— 115 gates stayed green; only a chain-replay test caught it #18062, [finding]@objectstack/spechas four grammars for a packageversion, andManifestSchemarefuses the2.0.0-beta.1thatPackageVersionSchema's own docstring advertises #18697, chore(spec): raise MIGRATION_SUPPORT_FLOOR from 10 to 16 — upgrades are supported from protocol 16 onward #19056, The spec-property-retirement playbook still instructs amajorchangeset, which ADR-0087's 2026-09-13 amendment superseded and check-changeset-no-major refuses #19366, [finding] Two major-18 D3 entries printCurrencyConfigSchema.precision … unchangedthroughos migrate meta, which PR #20251 makes false in the same major #20379, [finding] spec(migrations): the ui-html-page-div-refused entry's why text says dev and start run compile first; they do only when the artifact is missing or --compile is passed #20649, [finding] spec build: thepure-schema-constructionplugin rewritesstrictObject(inside a string literal, so the published migration text differs from its source #20686 (closed).GET /data/:object/export?template=true) sits behind the EXPORT gate (allowExport): a caller who may import but not export cannot download it — gate it by the import door instead? (from #18386 acceptance-6 verification) #20896, docs: positioning follow-up: stale home title, cover image and alt; README restructured on the four promises; an ontology concept page; glossary and north-star bridges #21586 and four red-main reports (closed), matched on unrelated text.None moves the constant.