Repository navigation
cutover(ui-merge): the switch itself — freeze both repos, git subtree add objectui as ui/ with its adaptation commit, land 4a / PR B / 4b PR 2 in order, migrate open objectui branches and cards, archive the objectui repo (parent #25677, 5/6) #25752
Description
Filing gate ③ + ④: sub-issue 5/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. ⛔ Not a claim and ⛔ not dispatched to a dev seat: the epic PM runs this card step by step, and every step marked maintainer is Tesla's (repository settings, the human merges of the Tier H PRs, the archive click).
Blocked-by: #25697 (PR B, lands inside this window), #25711 (4a, lands inside this window), #25712 (4b PR 2, lands inside this window), #25727 (2c, its pre-freeze round is step 2 below). The parent's item 5 named 3 and 4 as the blockers; this card is where their last PRs land, so they block the merge step, not the card's start.
谁付代价(业务筛): every day the two repos stay separate costs the fleet the pin PRs (~40/month), the three-serial-PR shape of every cross-repo feature and 24 × 13 min of Spec Shape Gate; users get Console/spec version consistency by injection only (11.5.0 shipped an old client that way). The parent's 维护者速读 carries the readings; this card is the day the cost stops.
维护者速读
这张卡就是切换日的流程表。前面的子单把两边都准备好了(objectui 侧 2–2e 五轮就绪、objectstack 侧惰性接线 A/A2、发布合一 4a 草稿、治理 4b 第 1 刀),验证分支 #25718 已经跑了 7 轮,剩下的红全部归类并有归属(下面「切换 PR 自带的适配」逐条列)。切换那天:提前 24 小时通知、两仓冻结 1–2 天、一个约 259 万行的 subtree PR 由你人工合并、紧接着按顺序合 4a → PR B → 4b PR 2(都是 Tier H,都要你批)、ruleset / required checks / npm token 由你改、objectui 仓 README 改迁移说明后归档。你的四个动作都在「maintainer」标记处;其余由席位做并逐步在本卡留审计评论。七项决定(A–G)你已于 10-25 09:06Z 裁定,见最后一节;冻结前先落三张预备卡(2c 第二轮、E、F)。
Procedure (the seat drives; maintainer steps are Tesla's)
- T-24h notice (seat): one comment here and one on objectui's pinned seat note naming the freeze window; land every green PR in both repos; Dependabot paused on objectui for the window. After this comment nothing new is enqueued in objectui.
- Final objectui round (seat → 2c round 2, tooling(objectui-readiness 3): objectui compiles against objectstack main HEAD — bump .objectstack-sha past the spec commits since e649c2d91e, fix the fallout (TranslationPreview TS1360), repeat until cutover (parent #25677, 2c/6) #25727):
.objectstack-shato objectstackmainHEAD; the fourui/SKILL.md frontmatter flags (metadata.internal: truefor.claude/skills/objectui-contributor,.claude/skills/verify,packages/plugin-dashboard; see decision C forskills/objectui); re-rungit apply --check scripts/ui-import/4a-ui-side.patchagainst that objectuimainand refresh the patch if it fails (bill item 10). objectuimainis then frozen (branch protection: maintainer, or the seat stops merging). - Refresh the verify branch on that objectui
mainwith the recipe inscratchpad/notes (non-squashgit subtree pull --prefix=ui, helper files--theirs, lock =pnpm install --lockfile-onlyon the spliced lock thenpnpm dedupe, ⛔ never re-runsplice-lockfile.mjs --outon a spliced base — bill item 8) and read the run: every red must be in the accepted-class list below; a new class stops the window. - Cutover PR (seat opens as draft against
main; maintainer merges, Tier H by size ~2.59M lines): commit 1 =git subtree add --prefix=ui objectui <frozen main sha>(history kept, as the tooling(monorepo): 在试验分支上把 objectui 并入ui/workspace(subtree add、单 lockfile、turbo 构建图),交冲突清单、必改脚本清单与各类 PR 的 CI 时长读数 — 不落 main(父单 1/6) #25678 spike); commit 2 = the adaptation commit, the bill made concrete:- lockfile:
scripts/ui-import/splice-lockfile.mjsthenpnpm dedupe(5a + items 6/16: run 7 measured 50/527 ui importer rows moving onto objectstack's versions and the vite/postcss TS2321 class clearing); rootpnpm-workspace.yamloverrides scoped so objectui's dependency lines are not rewritten (react-router 7, happy-dom 21 — 5a); ui/manifests: every@objectstack/*dependencyworkspace:^;ui/package.jsonwhole-suitetestscript dropped (item 4);ui/turbo.jsonparked asturbo.objectui.json(rootturbo.jsonowns the graph); QUICK_REFERENCE rows onworkspace:^;- gates:
check-type-check-coverage.mjsaccepts objectui'stype-checkspelling for members underui/and the remaining findings get ledger rows (item 1);check:lockfile-integrityper-package verdict (dedupe or allowlist with reason) andcheck:lockfile-deduperun from the workspace root (items 6/7); rootbuildfilter may tighten to!./ui/apps/site(item 3); - census:
packages/client/src/envelope-caller-census.test.tsconverts the recordedOBJECTUI_CENSUSconstant into a liveLEDGERrow forui/packages/data-objectstack/src/index.ts(analytics.query, production consumer, not envelope-dependent), count 28 → 29 (item 17); - skills catalog: per decision C (item 18);
- decisions carried here:
ui/skills/objectui→ rootskills/(C); rooteslint.config.mjsglobalignoresgainsui/**(G1, item 25);check:test-source-aliasvitest-alias half scoped to non-ui/members (F, item 21d);check:dts-closureexpands*subpath patterns against dist (item 22);scripts/js-comment-mask.mjsstops reading JSX text as a comment opener, with a pinned self-test (item 23);check:adr-anchorsallowlist rows for theui/**/CHANGELOG.mdADR-0075 lines (item 19);check:undeclared-dep-importsledger row forui/apps/console/srcwith the bundled-SPA evidence (item 20); watch-hint / population declarations listui/**(item 21a);ui/.objectstack-pin/**deleted (item 21b); - the verify branch is the proof: the PR's CI must match the last verify read class for class.
- lockfile:
- Land the window's PRs in order (maintainer approves and merges each; the seat flips ready and requests review from GOVERNED_APPROVERS only now, never before): subtree PR → 4a release(ui-merge): one release lane for both scopes — @object-ui joins the fixed group, @objectstack/console builds from ui/apps/console, the objectui pin is deleted (#25711) #25745 (release lane; approval 5641652106 already stands; carries decisions B/17c and D/17b) → PR B of tooling(ui-wiring): objectstack-side inert wiring for the
ui/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 (retires Spec Shape Gate, Console Pin Gate, prerelease-pin-watch,check-single-claim-paths,findObjectuiPin; item 12) → 4b PR 2 (tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712: README Export Check port,ui/.changesetpresence gates, sdui manifest fromui/, AGENTS.md cross-repo convention rewrite, the sixui/**Tier H rows with item 16; items 2/13 — QUICK_REFERENCE moved to 4a). Each lands withmaingreen or with only the classes the previous PR in the chain is about to clear; the seat posts the 维护者速读 +## 席位核对finale on each. - Repository settings (maintainer): required checks — drop
Spec Shape Gate,Console Pin Gate, prerelease-pin-watch contexts, addTest UI,Type Check UI,Lint UI,Build & E2E UI(names as A2's ci.yml spells them); the release npm token's publish rights on@object-ui(decision A); the Vercel project for objectui's docs site (4b'sdocs-deploy.yml). The seat lists the exact context names in a comment before this step. - Branch and card migration (seat): every open objectui branch with a PR is ported with
git format-patch origin/main..<branch> --stdout | git am --directory=uionto an objectstack branch and re-opened as an objectstack PR (Part ofits transferred card); the ~28 open objectui cards transfer to objectstack withscripts/pm/issue-transfer.mjs(same organisation), labels mapped (domain:uilane folds in per 4b); objectui seat notes closed; staleclaude/*branches (382, one with a PR) deleted after the transfer. - Archive objectui (seat PR + maintainer click): objectui README first section becomes the migration notice (where the code lives now, how to port a branch, where issues went); the repo is archived by the maintainer. The parent's item 6 (first joint 18.x release, docs-site deploy, process: a published-type change objectui consumes lands in lockstep with objectui's adaptation — #24947 left framework main and objectui main uncompilable together, so cloud's pin round had to stop 7 commits short #25556) is sub-issue 6.
Accepted red classes on the verify branch at freeze (anything else stops the window)
pin / spec-drift class (Test UI 1, 2 — cleared by step 2); QUICK_REFERENCE release-sync class (Test UI 9, 13, 14 — decision B); type-check coverage findings (source gates, debt ledger — item 1); lint-lane workspace-glob classes and Validate Package Dependencies (cleared by PR B / 4b PR 2); census (item 17) and skills catalog (item 18) — cleared by the adaptation commit; main-side regressions not of this epic (e.g. check-liveness translation/flows.screens, red on main since #25734) are tracked by their owning lane and do not count. Added from runs 8–11: clocked-window class (Test UI 3/16, DraftChangesPanel.securityProblems) — cleared by 2c round 2 (a) / card F; ESLint 121 errors under ui/** — cleared by G1 in the adaptation commit; check:dts-closure @object-ui/i18n wildcard — cleared by the item 22 gate fix; plugin-pinyin-search boot-reconcile 5 s timeout (main's #25634, item 26) — main-side timing, re-run once, not ours.
Done when
ui/is onmainwith objectui's history; 4a, PR B and 4b PR 2 are merged;mainis green except for classes the maintainer has explicitly accepted into ledgers.- No
.objectui-sha/.objectstack-shaand none of the pin scripts in 4a's items 3–4 are in the tree; the required-checks set names no retired gate. - Every open objectui PR has an objectstack PR or a closing comment; every open objectui card is transferred; objectui is archived with the migration notice as its README head.
- Hand-off comment to sub-issue 6 with the first joint release's expected version.
Size: XL (procedure; the PR is mechanical). Clause-②: no. Metadata-protocol: none.
风险
- A GOVERNED_APPROVER flipping a held PR early (happened on release(ui-merge): one release lane for both scopes — @object-ui joins the fixed group, @objectstack/console builds from ui/apps/console, the objectui pin is deleted (#25711) #25745 at 05:06Z; reverted). The seat reverts and re-states the hold; the landing order above is the only safe order.
- An 18.1.x patch release needed inside the freeze: release before the freeze through the old lane or after through the new one, never inside it (parent's Done when).
- Rollback: objectui's pre-freeze
mainstays; within two weeksgit subtree split --prefix=uirestores a standalone repo. - Unmeasured until the first joint release: npm scope rights (decision A), Version PR shape with 39 more packages.
Decisions for the maintainer — DECIDED (Tesla, director thread, 2026-10-25 09:06Z: 「第 16 项 · 同意;17a · 有权限;17b · 你决定;17c · 17d · 同意」「17e · 17f · 17g · 同意」)
- A (17a). The release npm token HAS publish rights on the
@object-uiscope (Tesla's word). Step 6 needs no token change; the first joint release (sub-issue 6) is the measurement. - B (17c). Retire the QUICK_REFERENCE release-sync rows (
sync-quick-reference-release, its tests, the synced rows). Carried by 4a release(ui-merge): one release lane for both scopes — @object-ui joins the fixed group, @objectstack/console builds from ui/apps/console, the objectui pin is deleted (#25711) #25745 (seat ruling 09:09Z: the only release-path caller is thechangeset-release.yml4a deletes and 4a's ui patch already editsui/QUICK_REFERENCE.md); 4b PR 2 drops the item. - C (17d). Move
ui/skills/objectuiinto the rootskills/catalog; mark the three contributor skills underui/metadata.internal: true(packages/plugin-dashboardin 2c round 2 (a);.claude/skills/objectui-contributorand.claude/skills/verifyin the governed round 2 (b)). The move is in the cutover adaptation commit. - D (17b). Tesla delegated to the director; ruling B: the private VS Code extension
object-uistays in the changesets fixed group (4a implements: root.changeset/config.jsonfixed gainsobject-ui,check-changeset-fixedaccepts the declared private member). - E (17e). Rename the 9
@object-ui/typesduration keys so the key name carries the unit, with ADR-0087 conversions (autoPlay,autoResponseDelay,timeout,delay,duration,delayDuration,openDelay,closeDelay,refreshInterval; bill item 21(d)). Prep card, objectui-side, before the freeze. - F (17f). Adopt for the function-body half: warm module-scope imports in the ~25 ui test files
check:test-source-aliasnames (the clocked-window class that reddened Test UI 3/16 on verify runs 8 and 11, bill item 24); scope the vitest-alias half of the gate to non-ui/members (adaptation commit). Prep card, objectui-side, before the freeze. - G (17g). G1: the root ESLint flat config ignores
ui/**at cutover (adaptation commit, oneignoresentry with the config's own census comment); Lint UI stays ui/'s lint; the two configs converge in aftercare aftercare(ui-merge): the first joint 18.x release from the merged repo — both scopes at one version, @object-ui published, docs site deployed — then close #25556 as superseded and the epic (parent #25677, 6/6) #25753 (bill item 25: 121 errors, all underui/**, mostlyreact-hooks/static-components). - Item 16 (4b).
ui/.claude/**stays Tier H (human-approved) until it folds into the root.claude/**.
Pre-freeze prep cards (dispatched 2026-10-25 after the rulings; each lands in objectui before step 2's final pin bump)
- 2c round 2 (a)/(b) on tooling(objectui-readiness 3): objectui compiles against objectstack main HEAD — bump .objectstack-sha past the spec commits since e649c2d91e, fix the fallout (TranslationPreview TS1360), repeat until cutover (parent #25677, 2c/6) #25727: pin to objectstack
mainHEAD,plugin-chatbot@ai-sdk/reactexactly4.0.121+ai^7.0.118(bill 16),plugin-dashboardSKILL.md internal (C),ObjectUI ADR-0075spelling +ADR-9999fixture rename (bill 19),better-authexactly1.7.12(bill 21c), warm@objectstack/lintimport inDraftChangesPanel.securityProblems.test.tsx(bill 24); (b) governed: the two contributor-skill flags (C) andui/AGENTS.md:210(bill 21c). - Decision E card (rename the 9 duration keys).
- Decision F card (warm the remaining ~24 function-body imports).
- The verify branch
claude/project-thread-dwhq6r-25697-verify(head 9e37acd, run 8 tree) stays the measured tree; the cutover bill is/mnt/project-files/d1-merge/out/5-cutover-bill-notes.mditems 1–26 (19–26 added from verify runs 8–11: adr-anchors allowlist rows for CHANGELOG lines,check:undeclared-dep-importsledger row forui/apps/console/src, watch-hint/population declarations gainingui/**,check:dts-closureexpanding*subpath patterns,js-comment-maskJSX-text defect, the pinyin boot-reconcile 5 s timeout from main's plugin-pinyin-search: every boot scans all rows of transientsys_inbox_message, making startup O(table size) #25634).
Dedupe
search_issues 2026-10-25 05:33Z 「objectui merge cutover day freeze subtree add ui/ archive objectui repo migrate branches transfer issues」: 33 hits, all this epic's family (#25677, #25678, #25685, #25711, #25712, #25726, #25727) plus #25556; no card describes the cutover day itself — the parent's item 5 is this card's only prior text; #25556 (open) is sub-issue 6's. New.
Activity