Repository navigation
chore(release): exit Changesets pre mode (next), so the next Version Packages PR versions 18.0.0 GA #24528
Copy link
Copy link
Closed
Labels
area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxpriority:p1High: required for production / M2High: required for production / M2target:v18tooling
Description
Filing gate ③: a task the maintainer directed. In domain:devx seat 1's chat (session_01FM29ZqLTrnPNXxijioZwMp), on 2026-10-19, the maintainer wrote 「发 GA 要先退出预发布模式。立卡派发」. Filed by that seat, which dispatches it at once.
Measured at filing (origin/main a5a781bc7)
.changeset/pre.jsonreads{ "mode": "pre", "tag": "next" }. It has noinitialVersionsand nochangesetskeys. It was written by PR chore(release): enter Changesets pre mode (next) with onemajormarker, so v18 opens at 18.0.0-next.0 #22084 (a87d8be29, 2026-10-08, "enter Changesets pre mode (next) with onemajormarker, so v18 opens at 18.0.0-next.0").packages/specis at18.0.0-next.5..changeset/pre/holds 1011 consumed changesets, and.changeset/holds 18 entries.release.ymlreads the mode in two places (:511,:861). Inexitmode, its pending count includes.changeset/pre/*.md, because "onpre exitthe GA version consumes them all again" (:500ff). Apre exitversion pass deletes.changeset/pre.json(:858).- Gates that key on the mode:
scripts/check-changeset-no-major.mjs: amajoris admitted only in pre mode;release.yml's hotcrm block (:1945ff): advisory while in pre mode;- the major-boundary classes
release.ymlnames (:373ff):packages/spec/src/kernel/protocol-version.tsand the bundled templates'^N.0.0ranges.
- At filing, 7 open
target:v18cards: objectql: a runAs:'user' hook fired from a hand-built system context (plugin-approvals' writes) runs without org_user_ids, so sys_user's org-members scope drops out and the hook sees only the acting user's own row #24497, plugin-sharing: refuse a new or renamed sys_sharing_rule row that takes a declared rule's name, and reconcile the shadowed declaration's grants on a same-name write (ruling B′ on #24378) #24421, platform-objects: the identity objects declare their default row scope (the literals the shipped sets copy today), and the registry refuses anextendcontributor that loosens a platform object's default (#24164 ruling E′) #24341, A resumed flow run writes as its trigger user (the submitter), not the approver who resumed it, so post-decision writes in an approval flow name the submitter as Last Modified By and in the audit log #24321 (needs-user-decision), and the epics feat(spec,drivers,objectql,plugin-security):organization_idNOT NULL per cleared table; one predicate for Layer 0 and every driver; bothorWhereNullarms, the__global__sentinel and the #13491 ledger retire (ADR-0131 D1/D8/D9) — protocol 18 #15212, [epic] ADR-0131 — total organization ownership: no NULL organization_id (v18 line) #15194,sys_business_unit_memberis unadjudicated inPLATFORM_OBJECT_TENANCY, so seed-replayed and system-written membership rows land organization-less #14570.
Wanted
- One PR that exits pre mode, written with the CLI (
pnpm changeset pre exit), never by hand. - The PR body carries a dry-run of the version pass on a scratch copy, so the maintainer sees what the next Version Packages PR will publish:
- every package's version before and after (
18.0.0-next.5→18.0.0for the fixed group, and whatever the others become); - how many changesets it consumes from
.changeset/pre/and.changeset/; - whether
.changeset/pre.jsonis deleted.
- every package's version before and after (
- Every gate that keys on the mode is read on the exited tree and given a conclusion: still green, or what it needs. That covers
check-changeset-no-major.mjs(pending majors in.changeset/pre/after exit),release.yml's pending count, and the major-boundary classes. A gate that would break the GA Version Packages PR is fixed in this PR when the fix is small. Otherwise it is named, with its fix, for the seat to card. - ⛔ No publish, no tag, no Version Packages PR touched, and no release workflow dispatched.
- The PR stays draft for the maintainer to merge. Landing it is the GA timing call: the first Version Packages PR after it versions 18.0.0, while the
target:v18cards above are still open.
Done when
- The pre-exit PR is open as a draft, with the dry-run plan and each mode-keyed gate's conclusion in its body.
- The maintainer merges it, and the next Version Packages PR's head carries
18.0.0for@objectstack/spec. That is the seat's post-landing reading.
Dedupe
Read by enumeration, because the search endpoint is blocked. No open or closed card since 2026-09-01 names a pre exit or a GA cut. The target:v18 cards are product work, not the mode switch. objectstack-ai/objectui is also in pre mode (tag: next) and is not in scope here. Whether it exits too is the maintainer's call.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxpriority:p1High: required for production / M2High: required for production / M2target:v18tooling
Activity
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 4 · on the maintainer's 「发 GA 要先退出预发布模式。立卡派发」 in this session's chat
Session:
session_01FM29ZqLTrnPNXxijioZwMpAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-24528-changesets-pre-exitWorktree:
objectstack-issue-24528Domain:
domain:devxSeat:
domain:devx#1File surface:
.changeset/pre.json(written bypnpm changeset pre exit), plus a small fix to a gate that keys on the mode only if the exited tree breaks it (stop on breach; explain in the report)..github/workflows/**is Tier H if touched. ⛔ No publish, tag, Version Packages PR or release dispatch.Container & model:
M (a one-line mode switch whose release plan and mode-keyed gates must be measured),mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: "no path-derived mandate")Clause-②: no
Responsibility:
n/a — not a defect card(the GA cut's mode switch, on the maintainer's order)Thread-read: none
Serial constraints cleared: none — no open PR touches
.changeset/pre.jsonorscripts/check-changeset-no-major.mjs(read at 2026-10-19T12:37Z). Landing is the maintainer's: the PR stays draft, because its merge decides when the next Version Packages PR versions 18.0.0.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 24528,
"status": "done",
"branch": "claude/issue-24528-changesets-pre-exit",
"pr": "#24555",
"session": "session_01FM29ZqLTrnPNXxijioZwMp — subagent run; the parent seat's harness-stamped id (claim 6267382000 names this branch, verified before any edit)",
"premise_still_valid": true,
"summary": "Draft PR #24555 (head abec338 = BASE 5b14b7f + 2 commits + origin/main 04669a4 merged before opening; draft, label skip-changeset, assignee os-warren) exits Changesets pre mode: .changeset/pre.json BEFORE {"mode": "pre", "tag": "next"} AFTER {"mode": "exit", "tag": "next"}, written by
pnpm changeset pre exit(@changesets/cli 3.0.3; @changesets/pre 3.0.0 exitPre spreads the state and sets mode exit, migratePreState is a no-op with no initialVersions/changesets keys, so hypothesis 1's "expects initialVersions/changesets" is falsified for v3). A verbatim replay of release.yml version-pr Render/Validate/Restore in a scratch clone gives the fixed group (73) 18.0.0-next.5 → 18.0.0 (hypothesis 4 holds), 1029 consumed (1011 from .changeset/pre/, 18 from .changeset/), pre.json deleted — but the GA Version Packages PR cannot be produced yet: Render exits 1 at sync-release-index-currency (content/docs/releases/index.mdx v18 status still "prerelease ... no GA date") and Validate reds check:release-page-status (content/docs/releases/v18/index.mdx blockquote states no 18.x release); with stand-in GA prose in the scratch clone only, Render 0 / Validate 0 (15/15) / Restore 0, so those two release-owned sentences are the only blockers found and are named for the seat as a docs-only PR (content/docs/releases is never edited here). Files changed: .changeset/pre.json and content/docs/protocol/backward-compatibility.mdx (11 present-tense v18-prerelease sentences moved to past tense plus the exit facts, lockstep-count anchors byte-unchanged). Deviations: (1) the docs file is outside the claim's declared surface — added under the role file's must-fix rule for a published statement this change falsifies; the release-owned mirrors of the same sentences (releases/index.mdx:58-62, releases/v18/index.mdx:6-11,27,62 and its description) cannot be edited here and are folded into the named docs-only PR; (2) the scratch clone was installed with --ignore-scripts and the migration registry generated by hand, because the scratchpad path exceeds tsx's IPC socket length in spec prepare (EADDRINUSE on a 160-char pipe path); (3) a merge of origin/main 04669a4 (one new changeset) went in before opening, and the dry-run was re-taken on the merged head.","tests": "Dry-run on abec338 in a full-history scratch clone (not shallow; local main 04669a4; push URL disabled; release-rehearsal-clone.mjs "✓ FIT"): Render step extracted verbatim from release.yml → pending_before=1029,
pnpm run versionEXIT 1 at sync-release-index-currency ("✗ sync-release-index-currency: 1 finding(s) this rewrite cannot fix"); after finishing the chain by hand (check-skill-compatibility-version --fix, 10 SKILL.md 18.0.0-next.5 → 18.0.0) Validate step verbatim under os-verify-lock: VERDICT command-exit 1, 14/15 content gates green, red = pnpm check:release-page-status; shape "1205 path(s), all inside the reviewed shape", "major-boundary surfaces left unvalidated: 0", template stamps moved 0, PROTOCOL_VERSION "already 18.0.0". Version table (before → after): 73 fixed-group members all 18.0.0-next.5 → 18.0.0 (73/73 read); private: example-crm 4.0.100-next.5 → 4.0.100, example-todo 4.0.100-next.5 → 4.0.100, example-multi-package 0.0.7-next.5 → 0.0.7, example-showcase 0.3.22-next.5 → 0.3.22, example-embed-objectql 0.0.40-next.5 → 0.0.40, dogfood 0.0.48-next.5 → 0.0.48, downstream-contract 0.0.46-next.5 → 0.0.46, http-conformance 0.1.8-next.5 → 0.1.8; unchanged: docs 4.2.3, spec-monorepo 4.0.1, objectstack-blank 0.1.0, refd-timer-testkit 0.1.0, vitest-filter-preflight 0.1.0. Consumed: 1011 deleted from .changeset/pre/, 18 from .changeset/ (= pending_before 1029); .changeset/pre.json DELETED; only README.md left as .md under .changeset; @changesets/read 1.0.1 reads 0 on the post-version tree; annotate-shipped annotated 6 changesets left unconsumed by 820fd5a. Leg B (stand-in GA prose committed in the scratch clone only): Render EXIT 0, Validate VERDICT command-exit 0 "Post-version tree validated." (15 green), Restore EXIT 0 "Pre-version tree restored: 1029 pending changeset(s), working tree clean.". Re-arm probe (scratch clone only, never pushed): a new "@objectstack/spec": major changeset on the exited tree → check-changeset-no-major --base main EXIT 1 ("This PR introduces changeset(s) that declare amajorbump"); control, same tree with mode "pre" → EXIT 0 (exempt); restored with git checkout HEAD, git diff HEAD empty. First dry-run at 4fe7eb6 (pre-merge, 1028 pending) gave the same verdicts; spec CHANGELOG ## 18.0.0 section 6,006 lines / 983,037 bytes; version diff +58,729/-21,347. No package source or TypeScript touched, so no package tests/typecheck owed (NOT MEASURED by design); no ablation (no tested behaviour changed).","gates": "Local at abec338:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack→ 54 commands for the 2-path diff; all 54 EXIT 0 (exit captured before any pipe);--ran→ "54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN" (RAN_EXIT=0). Two first attempts returned EXIT 3 PREREQUISITE NOT MET and were re-run after building under os-verify-lock (@objectstack/lint...4 pkgs VERDICT command-exit 0 121s;@objectstack/client-react...39 pkgs VERDICT command-exit 0 340s): pnpm check:docs-transcript-drift → 0, pnpm --filter @objectstack/spec run check:skill-examples → 0. Earlier 21-command derivation on the pre-docs head 4fe7eb6: 21/21 EXIT 0. Beyond derivation, all EXIT 0 on abec338: check-changeset-no-major --list ("18 pending changeset(s), 0 declaring a major. .changeset/pre.json mode: exit"), check-changeset-fixed ("in sync with 73"), check:docs-image-tag-sync, check:release-page-status, check-release-section-coverage --strict, check:release-index-currency-sync, check:future-spec-major, check:lockstep-package-count, check:template-version-sync, check:skill-compatibility, check:release-notes. Mode-keyed verdicts on the exited tree: check-changeset-no-major GREEN (PR-scoped clean; the 29 major-declaring files in .changeset/pre/ are not refused because the gate judges diffs; guard re-arms per the probe); release.yml pending count GREEN (exit mode counts 1029 = consumed; Restore re-reads the mode from the restored tree, replayed EXIT 0); major-boundary classes GREEN (nothing moves: PROTOCOL_VERSION already 18.0.0, templates already ^18, unvalidated 0); hotcrm block UNAFFECTED (no longer keyed on pre.json, BLOCKING 0 in every mode — card premise stale); cut-rc.yml UNCHANGED (requires mode pre + tag rc; refused before and after); release-pending-publish GREEN (--self-test 112 cases; annotate-shipped ran in the dry-run); check-docs-image-tag GREEN (exit mode expects newest GA 17.7.0; post-version green at 18.0.0); sync-docs-image-tags GREEN (9 pins 17.7.0 → 18.0.0 in the dry-run); check-published-files GREEN; check-adr-0087-registration GREEN (--base and --self-test); objectui-changeset-digest inPreMode now false (objectui majors digested as minor, mirrors the guard). CI on abec338, read once at report time (not re-run locally): completed success — The card this PR closes must claim this branch, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, Governed Surface Queue Guard, Spec property liveness, Type Check · debt ledger, Check Documentation Links, Check PR Size, Dogfood Regression Gate, Auto Label, filter; skipped — Check Changeset (skip-changeset), Build Core, Console Pin Gate, Temporal Conformance, Dogfood Verify CLI, Packed-tarball smoke; in_progress — Test Core (1/6..6/6), Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · scoped (3), Type Check · workspace, Type Check · source gates, Type Check · consumer gates, Build Docs. NOT MEASURED: check:dev-prereqs / check:skill-frame-freshness (diff touches neither the spec build nor the frame files); the changesets/action read rehearsal (a GitHub Action — the CLI reader @changesets/read 1.0.1 was read instead).","mcp_calls": "0 — no MCP GitHub tool was called (reads went through gh api REST reads; writes through the fleet relay)",
"api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create run 39262188905 → POST /repos/objectstack-ai/objectstack/pulls (draft #24555), POST /repos//issues/24555/assignees (os-warren), POST /repos//issues/24555/labels (skip-changeset); body read back 19645 bytes identical; (2) this os-dev-report comment via scripts/pm/post-stamped.mjs → POST /repos//issues/24528/comments. Plus 4 git pushes (not REST): the empty-branch probe, 4fe7eb6, 1b8d66e, abec338.",
"open_questions": [
{
"question": "How should the release-owned GA prose that unblocks the 18.0.0 Version Packages PR land (content/docs/releases/index.mdx v18 status + paragraph at :58-62; content/docs/releases/v18/index.mdx release-status blockquote, :27, :62 and description)?",
"options": [
"A — a docs-only PR by the seat: index status "(current series: 18.0.0, released DATE)" plus a blockquote stating 18.0.0 is released, the pre-mode paragraphs rewritten; merged by the maintainer right after #24555, then one version-PR refresh. DATE = the UTC day of the refresh whose PR is merged (the rewriter never re-dates a same-version field and no gate checks the date). Cost: one small docs PR; a red refresh between the two merges, loud and publishing nothing.",
"B — teach sync-release-index-currency a prerelease → first-GA transition. Cost: reverses the rewriter's documented boundary ("An entry whose parenthetical is prose") and still leaves the v18 page blockquote needing a sentence, so the docs PR is needed anyway."
],
"recommendation": "A, because both blockers are release-time prose by this repo's own rule (content/docs/releases is compiled at release time), A adds no gate or rewriter behaviour, and B does not remove the need for A."
}
],
"out_of_scope_findings": [
"carrier: domain:devx seat (the card asks for it to be named for the seat to card) · GA blocker, measured: on abec338
pnpm run versionexits 1 at sync-release-index-currency (v18 index status "prerelease: 18.0.0-next.N ... no GA date") and Validate reds check:release-page-status (v18 page blockquote "v18 has no GA release yet"); stand-in prose turns both green; remedy = docs-only PR (open_questions A) · dedupe words: v18 GA release docs, release-page-status v18, release index currency 18.0.0, version-pr refresh red","carrier: none — noted in PR Acceptance notes only · in exit mode check-changeset-no-major --list and the check-adr-0087-registration audit surfaces count root stock (18) and treat .changeset/pre/ as consumed while the GA pass consumes 1029; informational, both gates judge diffs",
"carrier: none — noted only · standing Version Packages PR #24524 reads 18.0.0-next.6; after #24555 merges and until the docs PR lands, every refresh is red and #24524 keeps next.6; merged after the exit it would publish next.6 to
next(getReleaseTag returns preState.tag while pre.json mode exit is present) — reading of the code, not measured"]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landed ·
domain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-19T14:44Zgh-readonly-queue/main/pr-24555-*heads)os-zhuangat 2026-10-19T14:44:15Z, on an approval at 2026-10-19T14:27Zorigin/mainatc46b5f14cf, by content.changeset/pre.jsonreads{ "mode": "exit", "tag": "next" }State change: PR #24555 closed this card through
Fixes #24528(completed);pm:dispatchedcomes off in this act.Carried onward (owed by this seat): Done-when 2. The next Version Packages PR should carry
18.0.0for@objectstack/spec. That render needs #24569's PR #24584 onmaintoo: until it lands, every version-PR refresh is red atsync-release-index-currencyand publishes nothing, which is the measured order. The seat reads the first refresh after both are onmainand records it here.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Done-when 2 met: the next Version Packages PR renders 18.0.0 ·
domain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-19T18:28ZRelease run 39300473949 is a
schedulerun onmain973917c579, which carries this card'spre.jsonexit (PR #24555) and the GA prose (PR #24584, #24569). Its Version PR maintenance job succeeded. PR #24524's head3fdde03e00has@objectstack/spec,@objectstack/cliandcreate-objectstackat18.0.0, with.changeset/pre.jsonconsumed. The full reading is on #24569 (record above it in time). ⛔ No release act by this seat.Generated by Claude Code