Repository navigation
release(ui-merge): one release lane for both scopes — 39 @object-ui packages join the @objectstack fixed group, packages/console builds from ui/apps/console, both repos' pin scripts and sha files are deleted (parent #25677, 4a/6) #25711
Description
Filing gate ④: sub-issue 4a/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. ⛔ Not a claim. Item 4 of the parent is split in two at filing: 4a (this card) = release and publish; 4b = #25712, governance in-repo (liveness evidence, spec tests, sdui-parser, AGENTS.md, pm scripts, the 18 governance workflows of the #25697 roster).
Blocked-by: #25685 (merging now — the ui tree must carry uiRoot() and the workspace: tolerant floor scripts before any of this is testable) and, for the landing, the cutover window of sub-issue 5: nothing here is correct on main before ui/ exists, so the PR is drafted and verified on the DO NOT MERGE verification branch of #25697 and merges right after the subtree PR.
Who does it, where it lands: the epic PM dispatches it (os-dev, objectstack checkout). One PR to objectstack-ai/objectstack main, Tier H (release.yml, cut-rc.yml, .changeset/config.json): draft until green on the verification branch, the maintainer approves, the dispatch seat lands it in the cutover window.
维护者速读
今天 @object-ui 39 个包从 objectui 仓发,@objectstack 从本仓发,两边各有一套 changeset 车道、各自一个 Version PR,中间靠 .objectui-sha / .objectstack-sha 两个钉文件和约 1.8 万行脚本(build-console.sh 把 objectui 克隆到钉上再把 spec 注进去编 Console;bump-objectui.sh 搬钉并抄 changeset;objectui 那边 objectstack-pin.mjs 反向钉本仓)把两次发版对齐。你 10-24 裁了「同一个版本号组」:合并后这 39 个包进本仓 .changeset/config.json 的同一个 fixed 组,一次 Version PR 两个 scope 同号、一次 release.yml 从本仓发两个 scope;packages/console(@objectstack/console)改为直接从 workspace 里的 ui/apps/console 构建,不再克隆;两边所有钉脚本和两个钉文件删除。改的是 release.yml、cut-rc.yml、.changeset/config.json,都是受管面,按 Tier H 由你批准;只在切换窗口合,因为 ui/ 不在时这些改动没有一条是对的。
Scope
- One fixed group.
.changeset/config.json: the 39 publishable@object-ui/*packages (ui/packages/*andui/apps/*withprivateunset; 7 members stay private) join the existing@objectstack/*fixed group. The dev proves it withpnpm changeset versionon the verification branch: one bump, both scopes, the same version string in every manifest; the generated CHANGELOGs keep objectui's changelog entries (objectui's.changeset/*.mdfiles travel with the subtree). objectui's own.changeset/config.jsonunderui/is deleted — changesets reads one config per repo. @objectstack/consolebuilds in-workspace.packages/consolestops being the output ofscripts/build-console.sh(clone objectui at the pin, inject spec, build). It becomes a thin publish wrapper whosebuildcopiesui/apps/console/dist(built by turbo through the ordinary@object-ui/console#builddependency), keeping its publishedfilesandprepublishOnly. The spec version the Console carries is then the workspace version by construction, which is whatassert-console-spec-injection.mjs/check-console-injection.mjs/check-console-sha.mjs/console-spec-probes.mjsexist to prove today: they are deleted with the script, and the dev states for each which test or build step now proves the same thing (or that the thing can no longer be false).- Delete the objectstack-side pin.
.objectui-sha,scripts/bump-objectui.sh(+bump-objectui.selftest.sh),scripts/objectui-changeset-digest.mjs,scripts/objectui-range.mjs,scripts/check-prerelease-pin-watch.mjs; theconsolefilter entries and pin reads incut-rc.yml(the "THE objectui PIN IS AN INPUT HERE" block andRead the committed objectui pinstep),release.ymland any rootpackage.jsonscript that calls them; theRELEASE_GATE_WORKFLOWSentry PR B of tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697 leaves behind, if any.scripts/check-console-intercept-disarm.mjsis NOT pin plumbing and stays. - Delete the objectui-side pin, inside
ui/.ui/.objectstack-sha,ui/scripts/bump-objectstack.sh,ui/scripts/objectstack-pin.mjs,ui/scripts/objectstack-floor.mjs,ui/scripts/check-spec-range-floors.mjs,ui/scripts/check-installed-spec-pin-claims.mjs, the.objectstack-pinpreinstall gate inui/package.json/ui/.npmrc, and the dist-pin Vite probesvite-objectstack-spec-dist.ts/vite-objectstack-client-dist.ts(the workspace arm ofvite-objectstack-workspace.tsfrom tooling(objectui-readiness): make the objectui tree merge-ready in its own repo before cutover — one react line, one zod range, uiRoot() helper, tsc heap, workspace-aware Console chunk tests, typecheck alias (parent #25677, 2/6) #25685 is what remains). Every@objectstack/*dependency of aui/package isworkspace:^(the tooling(monorepo): 在试验分支上把 objectui 并入ui/workspace(subtree add、单 lockfile、turbo 构建图),交冲突清单、必改脚本清单与各类 PR 的 CI 时长读数 — 不落 main(父单 1/6) #25678 spike's rewrite); the dev provespnpm publish --dry-run(orpnpm pack) on one@object-ui/*package renders it as a caret range on the workspace version. - One release lane. objectui's
changeset-release.yml(Decide lane · Changeset Release) is retired;release.ymlpublishes both scopes from one run (pnpm -r publishalready walks the whole workspace — the dev confirms thefiles/publishConfigof the 39 packages publish fromui/unchanged, and that the npm token in use has publish rights on the@object-uiscope, which is the maintainer's to confirm, not the dev's). The GitHub Release / tag step (release-github-releases.mjson the objectui side, this repo's counterpart) produces one release per version naming both scopes. Docs-site deploy (docs-deploy.yml, objectui's site as a second Vercel project) is 4b's.
Verification (the dev's, before the PR leaves draft)
- On the
DO NOT MERGEverification branch of tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697 (PR A head + subtree import + this PR):pnpm install --frozen-lockfileclean;pnpm changeset versionin a scratch copy yields one version for both scopes and no package outside the group moves;turbo run build --filter=@objectstack/consoleproduces the samedist/entry set as today'sbuild-console.shoutput (compare file lists, not bytes);pnpm -r publish --dry-runlists exactly 39@object-ui/*+ today's@objectstack/*packages. cut-rc.ymlandrelease.ymlpass actionlint andcheck:required-contexts/check:workflow-*gates; no step reads a pin file.- Nothing green today goes red on
mainas it is: this PR is never pushed againstmainwithoutui/; it is verified on the verification branch only.
Done when
- The PR is green on the verification branch, approved by
GOVERNED_APPROVERS, and handed to sub-issue 5 withBlocked-by: sub-issue 5in its body; it merges in the cutover window right after the subtree PR and PR B of tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697. - After the merge: no
*-shapin file in the tree, none of the scripts in items 3–4 exists,.changeset/config.jsonhas one fixed group containing both scopes. - Sub-issue 6 proves the publish: one 18.x release from the merged repo ships both scopes at the same version.
Size: L. Clause-②: no. Metadata-protocol: none.
风险
- npm scope rights: the release token must publish
@object-ui/*; if it does not, the first merged-repo release fails at publish time. The maintainer confirms the token's scopes before cutover (sub-issue 5 checklist). - Version jump: joining the fixed group makes the next release bump all 39 @object-ui packages to the @objectstack version (both are 18.1.0 today, so the first joint release is 18.1.x or 18.2.0 for both). A changeset in either scope bumps both — the ruled behaviour.
@objectstack/consoleconsumers who pinned on the injected-spec build: the in-workspace build changes no runtime surface, but the dev diffsdist/entry lists and the Console perf-budget numbers against the last standalone build.
Dedupe
Open issues list 2026-10-24 23:05Z (REST, state=open 100 most recent) filtered on changeset / fixed group / release / objectui: #25581 (dist-tags after a stable publish, unrelated lane), #25638 (18.1.0 changelog attribution, unrelated), #25556 (lockstep rule card, superseded by this epic at sub-issue 6), the epic's own #25677 / #25678 / #25685 / #25697. No card merges the release lanes. New.
Activity
objectstack-fleet commentedon Oct 25, 2026
Claim: epic #25677 round 5 (card threads; Tesla 2026-10-25 「你应该使用 pm-dispatch 技能派发」「并发可以到6」)
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch:
claude/project-thread-a0vh3h(the card thread's designated branch in objectstack-ai/objectstack — the thread can push only this branch, a measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-25711Domain:
domain:devxSeat:
epic:#25677File surface:
.changeset/config.json,packages/console/**,scripts/build-console.sh,scripts/bump-objectui.sh(+selftest),scripts/objectui-changeset-digest.mjs,scripts/objectui-range.mjs,scripts/check-prerelease-pin-watch.mjs,.objectui-sha,.github/workflows/release.yml+cut-rc.yml(Tier H), rootpackage.jsonscripts, newscripts/ui-import/4a-ui-side.patch+ READMEContainer & model: L,
mode:thread(thread sessionsession_0149BHSXfCdQywGaLdpRAtWe; order:/mnt/project-files/d1-merge/dispatch/in the project, FRAME.md + the card's file),model: opus,effort: high(coordinator default)Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: #25712 PR 1 (branch
claude/project-thread-15baee) touchesscripts/pm/**only; PR A2 of #25697 (not yet opened) touchesscripts/partition-test-shards.mjs,scripts/pm/dispatch-gates.mjs,turbo.jsonbuild filter — no overlap; #25726 (5a) ownspnpm-lock.yaml/ overrides, this card must not move resolutionsGenerated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT (content) — dispatch seat; landing HELD for the cutover window. #25745 (head
a5f4c93a5c, branchclaude/project-thread-a0vh3h, 41 files, +2,263/−10,572) is accepted as the fix for this card on its content. It does not land now:check-governed-merges --pr objectstack-ai/objectstack#25745is exit 3, GOVERNED, tier H(人合) —.github/workflows/**×4 (cut-rc, lint, release, showcase-smoke) and 12,835 changed lines over the 3,000-line human-merge line — and, by the order, nothing in it is correct onmainbeforeui/exists (check-changeset-fixedred until the subtree lands; exit 0 on the merged tree with 112 packages). The PR stays draft, no review is requested, nothing is enqueued. In the cutover window the seat posts the final 维护者速读 + 席位核对 on the PR, labels it, and requests review from GOVERNED_APPROVERS; an authorized APPROVED then lets the seat land it with child 5.Checked against the order (
/mnt/project-files/d1-merge/dispatch/4a-25711-release-lane.md) and the report (/mnt/project-files/d1-merge/out/4a-25711-report.md):scripts/ui-import/4a-ui-side.patch(1,704 lines) with its README, applied by child 5's adaptation commit. Lockfile not hand-edited.--ran; 157 exit 0. The 9 non-zero all wait on another PR and are owned:check-changeset-fixed(needsui/, child 5), pin-watch ×2 / self-test-wired / pm-dispatch-gates 3 cases / console-sha + console-injection NOT-MEASURED (PR B of tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697), sdui-manifest + sdui-lockstep (4b PR 2). actionlint,check:required-contexts,check:workflow-*exit 0. Three findings fixed on the branch (lockstep-package-count 73→112, specvitest.repo-tests.json, console README link).@objectstack/console#build:dist(pnpm console:build), not a packagebuild— accepted, the reason (abuildwould drag the ui closure into every--filter @objectstack/cli...build) holds. (3) theui/.npmrc/ preinstall premise was stale atcd70b7818— accepted. (4) the patch is written against the merged tree (verify branch'sturbo.objectui.json,workspace:^manifests) — accepted;git apply --checkis re-run at cutover, after the last 2c round. (5) the four deleted Console checks are accounted for in the body table — accepted. (2) the private VS Code extensionobject-uimoving alone (18.1.0 → 18.1.1) while 112 public packages move 18.1.0 → 18.2.0 is a maintainer question — raised to Tesla, not ruled by the seat..changeset/config.jsonis NOT on the governed register (Tier H comes from the workflows and the size) — the card and the parent's territory note are corrected in the next parent edit. objectuimainhas moved tobba96cee5esince the patch was built atcd70b7818— the apply re-check at cutover covers it. Console eager closure 3,054 KB (merged) vs 3,522 KB (published 18.1.0), under the 3,496 KB ceiling; the membership-half red (1 of 89packages/coremodules in vendor-objectstack) predates this PR and stays unfiled (no user or fleet cost shown yet).packages/console/distonpnpm dev) accepted as a cost, turbo cache makespnpm console:buildcheap; 2 (check-single-claim-pathsguards only.objectui-sha) and 3 (findObjectuiPindrift guard inert) → PR B retires them; 4 (QUICK_REFERENCE release sync off the release path; needs post-version allowlist rows inrelease.yml/cut-rc.yml) → cutover bill; 5, 6, 7 (ui changeset gates scanningui/.changeset, unused-deps rows,sdui.manifest.jsonregenerated fromui/) → 4b PR 2.release.ymlpublishes with have publish rights on the@object-uiscope? Raised to Tesla; an answer is a cutover prerequisite.Pointer: ACCEPT (held) → PR #25745, seat note on the PR. Bill notes:
/mnt/project-files/d1-merge/out/5-cutover-bill-notes.md.Generated by Claude Code