Repository navigation
chore(release): exit Changesets pre mode (next), so the next chore: release packages PR renders objectui's 18.0.0 GA #13108
Description
Filing gate ③: a task the maintainer directed. The order came in objectui domain:devx seat 1's chat (session_01FM29ZqLTrnPNXxijioZwMp), 2026-10-20, verbatim: 「objectui 退出预发布模式」. It answers the seat's open question, asked after objectstack exited pre mode for its 18.0.0 GA (objectstack-ai/objectstack#24528, PR objectstack-ai/objectstack#24555). Filed and claimed by that seat (os-warren). The lane is domain:devx, which owns objectui's build and release pipeline (pm-dispatch references/lanes/devx.md).
Measured (objectui origin/main df943a2a1a)
.changeset/pre.jsonreads{ "mode": "pre", "tag": "next" }. Its last change is6f3299fe, objectui#12334 (PR release(v18): objectui's first 18.x release — the sync major, Changesets pre mode on next, and the two gate edits (objectui#12334) #12401): "objectui's first 18.x release — the sync major, Changesets pre mode on next, and the two gate edits".- Every publishable package sits in one
fixedgroup (.changeset/config.json) at17.7.0..changeset/12334-objectstack-18-sync-major.mdis the sync major thatscripts/check-changeset-no-major.mjsadmits, because it carries the group onto@objectstack/spec's major. - The open release PR chore: release packages #11600 ("chore: release packages (next)", head
f3b458d3, refreshed 2026-10-20T00:32:49Z) renders the group at18.0.0-next.0. objectui has published no 18.x version yet. - objectstack's 18.0.0 GA Version Packages PR (chore: version packages objectstack#24524) renders
18.0.0and is waiting on the maintainer's release.
Wanted
- One PR that leaves objectui out of pre mode:
.changeset/pre.jsonwritten bypnpm changeset pre exit, in the shape this repo keeps. - A dry-run of the release workflow's version step (
pnpm changeset:version, includingsync-quick-reference-release.mjs), in a scratch clone with that change. It shows that the fixed group renders18.0.0, not a prerelease, and that every gate the version step and its validation run stays green. Name each one. - PR release(v18): objectui's first 18.x release — the sync major, Changesets pre mode on next, and the two gate edits (objectui#12334) #12401's "two gate edits" are read and judged one by one. An edit that exists only for pre mode is reversed in the same PR. An edit that holds for GA stays, and the PR body says why. ⛔ No gate is weakened, and ⛔ no new gate is added.
- Release text, if objectui has any that states a prerelease or "no GA" status (the quick-reference sync or a release page), follows in the same PR so the render goes green. This mirrors docs(releases): the v18 GA prose — the release index and the v18 page state 18.0.0 released, so the GA Version Packages PR renders objectstack#24569.
- The PR stays draft, and the maintainer merges it, because the merge is the GA timing call (as with chore(release): exit Changesets pre mode (
next), so the next version pass cuts the 18.0.0 GA objectstack#24555). ⛔ No release act by any seat: no merge or queueing of PR chore: release packages #11600, no publish.
Order note (for the maintainer, not a gate)
objectui's packages depend on @objectstack/* at ^18.0.0-next.N ranges, which 18.0.0 satisfies. changeset:publish runs scripts/objectstack-floor.mjs and check-spec-range-floors.mjs first. The dev measures what those require of the @objectstack versions on npm when objectui 18.0.0 publishes, and says whether objectstack 18.0.0 must be on latest first.
Dedupe
Searched objectui issues for "exit pre mode", "pre.json exit" and "18.0.0 GA release packages": none open on this. objectui#12334, closed, entered pre mode.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 14 (objectui seat) · on the maintainer's 「objectui 退出预发布模式」 (this session's chat, 2026-10-20). Dispatched as soon as a 「并发2」 slot frees (both slots hold #24579 rounds 7 and 8, which touch no objectui file)
Session:
session_01FM29ZqLTrnPNXxijioZwMpAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13108-changesets-pre-exitWorktree:
objectui-issue-13108Domain:
domain:devxSeat:
domain:devx#1(objectui, seat post #5748)File surface:
.changeset/pre.json(pnpm changeset pre exit). Also any of PR #12401's two pre-mode gate edits that exist only for pre mode, with their pins, and any objectui release text that states a prerelease status, so that the version render is green. Stop if the fix needs more, and explain why in the report. ⛔.github/workflows/**is Tier H governed and not in this claim. ⛔ No release act: no merge or queueing of PR #11600, no publish. The PR stays draft for the maintainer's merge.Container & model:
S (pre-mode exit plus a version-step dry-run),mode:subagent,model: TIER_DEFAULTClause-②: no
Responsibility:
objectui's changesets stay in pre mode on next, so its release PR renders 18.0.0-next.0, not the GA|none: no objectui 18.x version is published yet; the GA waits on this|every objectui consumer of the 18.0 line, at objectui's GA releaseThread-read: none
Serial constraints cleared: no open objectui PR touches
.changeset/pre.json,.changeset/config.jsonor the changeset / floor scripts (read at 2026-10-20T01:43Z). Release PR #11600 is the subject, not a sibling.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 13108,
"status": "done",
"branch": "claude/issue-13108-changesets-pre-exit",
"pr": "#13111",
"session": "session_01FM29ZqLTrnPNXxijioZwMp — subagent run; the parent seat's harness-stamped id (claim 6281363328, the newest Claim: on the card, names branch claude/issue-13108-changesets-pre-exit; verified before any edit)",
"premise_still_valid": true,
"summary": "Draft PR #13111 (head 9e3c1a1 = BASE df943a2 + 2 commits; origin/main still df943a2 at open; assignee os-warren; label
testsset by labeler.yml, not by me) exits Changesets pre mode. Commit fda18fc: .changeset/pre.json written bypnpm changeset pre exit(@changesets/cli 3.0.1), before {"mode":"pre","tag":"next"}, after {"mode":"exit","tag":"next"}, the same 2-space JSON with a trailing newline (objectui's shape is CLI 3's two keys, as objectstack's). Commit 9e3c1a1: the first verbatim dry-run of the release lane on the exited tree went red on exactly ONE test, scripts/tests/sync-quick-reference-release.test.ts 'rewrites the Version row when the fixed group moves'. Itsnot.toContain(anchors.version)is a raw-substring check, and with the group at 18.0.0 that string is a prefix of the QUICK_REFERENCE Spec/Client rows'^18.0.0-next.1. It now compares whole literals with the script's own exported VERSION_LITERAL + normalize, the rule the 4143 gate's header states ('Equality on extracted tokens, nevertoContainover the raw row'). An in-process probe shows it is still RED on an un-rewritten Version row at 17.7.0, 18.0.0 and 18.0.0-next.0, while the old assertion false-REDs only at 18.0.0. objectui has no release text stating a prerelease or no-GA status (no release pages; grep finds none), so the one red was a test, not prose. Neither of PR #12401's two gate edits is keyed on pre mode; both are kept, nothing reversed, no gate weakened or added. Files changed: 2, +8/-2 (.changeset/pre.json 1/1; scripts/tests/sync-quick-reference-release.test.ts 7/1, file 227 -> 233 lines). No changeset (check-changeset-presence: none owed). Deviations: (1) the test file is outside the claim's declared file surface. The claim said stop if more is needed; the dispatch said fix at the real producer and name it. I followed the dispatch, named it in the PR body's Acceptance notes, and the seat should extend the claim's surface. (2) The workflow'sBuild packagesstep was not replayed before Validate. (3) The livecheck:spec-floorswas not run. (4) Commit trailers use AGENTS.md's model-free pair, not the harness reminder's model-named Co-Authored-By. (5) Agit fetchin the scratch clone auto-started a backgroundgit gc; it had exited (no gc.pid) before the clone was deleted. Cleanup: scratch clone deleted; worktree node_modules removed andgit worktree removeexited 0 without --force; no process of mine is left running.","tests": "DRY-RUN (scratch blobless full-history clone from GitHub, not shallow, 12164 commits; push URL /nonexistent;
pnpm run setup= pin copied from the machine store + frozen install, real node_modules). The three steps 'Render the post-version tree' / 'Validate the post-version tree' / 'Restore the pre-version tree' were extracted VERBATIM from .github/workflows/changeset-release.yml with the clone'syamlparser. The workflow blob is 533cf01fe5 on both clone and main, and the extracted bodies are byte-identical (cmp) across all legs. They ran underbash --noprofile --norc -eo pipefailwith GITHUB_OUTPUT/GITHUB_STEP_SUMMARY/GITHUB_SHA set to scratch files, and Render/Validate under os-verify-lock.sh. LEG head 9e3c1a1: Render EXIT 0 ('Version: 17.7.0 → 18.0.0', pending_before=857, 'paths the version step moved: 939', 'Rewrote QUICK_REFERENCE.md's "Current Release" block'; lock VERDICT command-exit 0). Validate EXIT 0: quick-reference:check '✅ ... already states every anchor', check:control-bytes '✅ OK',pnpm test scripts/__tests__'Test Files 190 passed | 2 skipped (192) / Tests 5708 passed | 2 skipped (5710)'; lock VERDICT command-exit 0. Restore EXIT 0: 'Pre-version tree restored: 857 pending changeset(s), working tree clean.', then porcelain 0 andgit diff HEAD0 bytes. Rendered tree: fixed group 40/40 members at 18.0.0 (1 private: object-ui, so 39 publishable; read from the manifests, publish-plan not run); 857 changesets consumed (every .changeset/*.md but README.md); .changeset/pre.json DELETED by the pass; .changeset/ left holding README.md + config.json; 939 paths = 858 deleted (857 + pre.json) + 40 package.json (only the "version" line, 40-/40+) + 40 CHANGELOG.md (+22,251 lines in all) + QUICK_REFERENCE.md (Version row 17.7.0 -> 18.0.0); 0 @objectstack lines move in the package.json diff. On that tree check-changeset-no-major EXIT 0 ('No changeset declares amajorbump.'), check-changeset-fixed EXIT 0, and a probe\"@object-ui/core\": majorgives EXIT 1 ('carries the group from 18 to 19, but its @objectstack/spec range names 18'); the probe was removed before Restore. LEG first commit fda18fc (exit only): Render EXIT 0 (17.7.0 → 18.0.0, 857, 939); Validate EXIT 1 ('Test Files 1 failed | 189 passed | 2 skipped (192)'; the one failure is sync-quick-reference-release.test.ts 'rewrites the Version row when the fixed group moves': "expected '# Quick Reference…' not to contain '18.0.0'"; quick-reference:check and control-bytes both ✅); Restore EXIT 0 (857, clean). CONTROL LEG BASE df943a2 (mode pre): Render EXIT 0 'Version: 17.7.0 → 18.0.0-next.0', 40/40 at 18.0.0-next.0, pre.json PRESENT (mode pre), 857 moved to .changeset/pre/, pending_before=857, 939 paths; Validate EXIT 0 ('190 passed | 2 skipped (192)'); Restore EXIT 0 (857, clean). UNIT, worktree at 9e3c1a1 under the lock:pnpm exec vitest runon sync-quick-reference-release, quick-reference-current-release-4143, check-changeset-no-major, check-spec-range-floors, check-changeset-presence and doc-version-claims gave EXIT 0, 'Test Files 6 passed (6) / Tests 169 passed (169)'. Assertion teeth: an in-process probe of the script's exports over QUICK_REFERENCE.md. Correct rewrite: new/old assertion green/green at 17.7.0, green/RED at 18.0.0, green/green at 18.0.0-next.0. Version row left un-rewritten: RED/RED at all three. No permanent test was added; no ablation file mutation, since the diff changes an assertion, not a tested behaviour.","gates": "Local, at 9e3c1a1 (
git rev-parse --short HEAD), each exit captured before any pipe:pnpm changeset:check0 (check-changeset-fixed ✅ + no-major '✅ Everymajoris the synchronized one');pnpm check:changeset-claims0;pnpm check:pending-changeset-literals0;node scripts/check-changeset-presence.mjs0 ('no changeset is owed');node scripts/check-changeset-overwrite.mjs0;pnpm check:new-line-citations0 ('VERDICT ... 0 new citation(s)');pnpm check:control-bytes0;pnpm check:test-path-roots0;pnpm check:pre-install-import-graph0;pnpm quick-reference:check0;node scripts/check-governed-queue-guard.mjs --teston both paths 0 ('NOT GOVERNED');pnpm run type-check:scripts0 (lock VERDICT command-exit 0;tsc --listFilesOnlylists the changed test, count 1); eslint on the changed test file 0. dispatch-gates.mjs not used (objectstack-only, per dispatch). PR #12401's TWO GATE EDITS: (1) check-changeset-no-major.mjs computed sync-major admission: NOT keyed on pre mode. The script reads no pre.json and no mode; its only pre clause, not reading .changeset/pre/, was its behaviour before #12401 too. KEPT: it is the maintainer's GA version-alignment rule (objectui#12030 ruling) and is needed again at the next major; it admits the sync major on the exited tree (changeset:check 0) and re-arms on the 18.0.0 tree (probe major EXIT 1, 18 to 19). (2) check-spec-range-floors.mjs prerelease-floor reader: NOT keyed on pre mode; it reads no changeset state, pre.json or mode, and its input is the^18.0.0-next.N@objectstack ranges, which objectstack's prerelease line sets (its header says so), unchanged by the exit and by the GA render (0 range lines move). KEPT: also needed at publish whenever objectstack-floor computes a prerelease floor. Its pins pass on the exited tree and inside the post-version scripts/tests run. The live gate was NOT MEASURED: it needs a build of the floored packages, and its input is byte-identical across exit and render. HYPOTHESES: H1 holds with the count corrected: 857 consumed (the card's 860 = every entry under .changeset/ incl. README.md, config.json, pre.json); pre.json deleted. H2 falsified for both edits. H3 holds: Version row -> 18.0.0; the Spec/Client rows keep ^18.0.0-next.1 because they are the manifest-derived @objectstack ranges (correct); no objectui doc states objectui's own prerelease status. ORDER NOTE:node scripts/objectstack-floor.mjs --dry-runat pin f4755a68a7 EXIT 2: 'No published @objectstack/spec release contains the pin … the newest published release is 18.0.0-next.5' (npm dist-tags: latest 17.7.0, next 18.0.0-next.5). Git two legs in the full-history /home/user/objectstack (is-shallow false):merge-base --is-ancestor pin 820fd5aef0(the next.5 tag commit) EXIT 1; control--is-ancestor 2c9bf9430a 820fd5aef0(the next.3 tag commit, older than the pin) EXIT 0; next.5 commit is an ancestor of the pin, EXIT 0. So objectui 18.0.0 CANNOT publish before objectstack publishes a spec release whose tag contains the pin (in practice objectstack 18.0.0, objectstack#24524). The steps read npm versions + tags, not thelatestdist-tag, solatestitself is not required. The floor is the EARLIEST such version by semver precedence: if 18.0.0 is the first, objectui ships ^18.0.0; if a containing 18.0.0-next.6 were published first, it would ship ^18.0.0-next.6 even after GA. Merging this PR publishes nothing (@object-ui/core@17.7.0 is on npm, the lane guard's predicate). CI on PR #13111 head 9e3c1a1 at report time: 34 check-runs, 10 success (Build Docs, Changeset Bump Policy, Changeset Claim Re-read, Changeset Declaration, Changeset Fixed Group Check, Changeset Overwrite Report, Governed Surface Queue Guard, Line Citation Gate, Test (dist pins), label), 3 skipped (Test (coverage), Test (coverage shard N/8), dependabot), 21 in_progress (Build & E2E, Lint, Live E2E (informational), Repo Gates, Type Check, Test (shard 1..16/16)). No CI wait, per contract. NOT MEASURED: the fullpnpm test(CI's), changesets/action itself (a GitHub Action), the workflow's Build packages step before Validate, live check:spec-floors.","mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, request fw-20261020T023059Z-308481, run 39359341760 conclusion success, sending POST /repos/objectstack-ai/objectui/pulls (draft #13111) and POST /repos//issues/13111/assignees [os-warren]; body read back 16341 bytes sent = 16341 stored, identical; assignees listed os-warren. (2) this os-dev-report comment via scripts/pm/post-stamped.mjs --repo=objectstack-ai/objectui, i.e. POST /repos//issues/13108/comments. Plus 3 git pushes (not REST): the empty-branch probe, fda18fc and 9e3c1a1. No label write, no card assignee write, no review request, no ready flip.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — objectstack-floor.mjs floors at the EARLIEST published @objectstack/spec version whose tag contains the pin, by semver precedence, prereleases counted (by design, per its header 'Prereleases count'). A published 18.0.0-next.6 that contains the pin would floor objectui 18.0.0's published ranges at ^18.0.0-next.6 even after objectstack 18.0.0 GA. Recorded in PR #13111's order note as the maintainer's release-time call; not a defect.",
"carrier: PR #13111 Acceptance notes · noted, not filed — release PR #11600 still renders 18.0.0-next.0 from a pre-mode tree. It must be refreshed (refresh_version_pr dispatch or the 6-hourly run) after #13111 merges, not merged as it stands. Merged stale after the exit, it would publish next.0 to
next(getReleaseTag returns preState.tag while pre.json mode exit exists; reading of @changesets/cli 3.0.1 getPublishPlan.mjs, not measured), and the floor step would refuse that publish today anyway."]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
File-surface addendum to claim
6281363328· objectuidomain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-20T02:39ZThe dev's dry-run found that the one producer of the exited tree's red is a test:
scripts/__tests__/sync-quick-reference-release.test.ts('rewrites the Version row when the fixed group moves'). Its raw-substringnot.toContain(anchors.version)false-reds once the group is at18.0.0, because18.0.0is a prefix of the QUICK_REFERENCE Spec/Client rows'^18.0.0-next.1. The dispatch said to fix the real producer and name it, and the dev did.This seat adds that test file to the claim's file surface:
VERSION_LITERAL+normalize. That is the rule the 4143 gate's header states.17.7.0,18.0.0and18.0.0-next.0.Nothing else widens.
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed · objectui
domain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-20T14:02Zcbc312d78b(not governed), on this seat's ACCEPT6292366569, under the maintainer's ruling6292098274main, by content.changeset/pre.json(421211bc43,"mode": "exit") andscripts/__tests__/sync-quick-reference-release.test.ts(419277b54c) are byte-identical to the PR head9e3c1a1408mainchecks atcbc312d78bChangeset Releaseon push is success, and it neither publishes nor refreshes the version PRState change: PR #13111 closed this card through
Fixes #13108(completed).pm:dispatchedcomes off in this act.What is next, and whose it is. Release PR #11600 still reads "chore: release packages (next)" from its last render (2026-10-20T12:24Z).
changeset-release.ymlrefreshes it on its 6-hourly schedule, or at once on a dispatch withrefresh_version_pr. After the refresh it should render the fixed group at18.0.0, not18.0.0-next.0. The dispatch, the merge of #11600 and the npm publish are the maintainer's acts; this seat takes none of them. The pin move to06cab4849ais #13261.Generated by Claude Code