Repository navigation
cutover(ui-merge): build the cutover PR adaptation commit as a measured patch series against the verify tree — lock splice, ui/ manifests, gate ledgers, skills move, decisions C/F/G1, bill items 1–32 (parent #25677, #25752 step 4) #25803
Description
Filing gate ③ + ④: pre-cutover card of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677. This is step 4's "commit 2" of #25752, split out so a dev seat builds and measures it while the epic PM runs the freeze, the pin bump and the verify refresh in parallel. Deliverable = a patch series the epic PM applies onto the cutover branch, not a PR of its own.
谁付代价(业务筛): the cutover PR (git subtree add --prefix=ui + one adaptation commit) must read green class-for-class with the last verify run, and the maintainer merges it by hand in one sitting (proposed 2026-10-26 09:00Z). Every adaptation item left out is a red gate in that PR's CI that the maintainer sees and the seat has to explain live; the verify branch #25718 measured each of them over 11 runs (bill items 1–32). Building the series now, in parallel with the freeze, is what lets the sitting happen tomorrow instead of a day later.
维护者速读
切换 PR 的第二个提交(适配提交)交给一个席位先做成补丁序列并在合并布局上测量,PM 在冻结后把它贴到切换分支上。内容全部来自验证分支 11 轮的账单(1–32 项)和你已裁的 C/F/G1。不新增决策。
Inputs (read first)
- The procedure and the bill-made-concrete list: cutover(ui-merge): the switch itself — freeze both repos,
git subtree addobjectui asui/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 step 4 ("commit 2 = the adaptation commit") and its "Accepted red classes" section. - The bill with every measurement:
/mnt/project-files/d1-merge/out/5-cutover-bill-notes.md(items 1–32; 25–32 added today). - The measured tree: objectstack branch
claude/project-thread-dwhq6r-25697-verifyat 9e37acd (= run 8 tree: objectui main of 2026-10-25 ~04:30Z underui/, spliced + deduped lock, exact@ai-sdk/react4.0.121). ⛔ Read-only for you: never push to it. objectuimainhas since merged Pin test-typecheck debt by error IDENTITY, not per-file count #13512 (pin 5874d25, better-auth 1.7.12,ai7.0.118 exact), [finding]pnpm --filter '<pkg>^...' buildfails on an UNMODIFIED origin/main — two independent observations, two different packages, same construct #13513 (26 warm imports), feat(plugin-security): walled bootstrap stops minting the platform-admin grant row; platformAdmin audit service; legacy-grant deprecation pointer (L4) #13514 (2 skills internal), platform-admin re-anchor (L5 removal half): delete the legacy grant-row read — one minor after L4's landing #13515 (9 duration keys renamed), fix(service-storage): scope the sys_file / sys_upload_session update and delete doors to the acting organization (#13178) #13527 (dependabot workflow off); the final pin bump lands at the freeze. Build against 9e37acd and say which items you re-verified against a fresh objectuimainsubtree. - 4a's ui-side patch (
scripts/ui-import/4a-ui-side.patch, base 9e37acd, in 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) is the sibling: ⛔ do not overlap its files (QUICK_REFERENCE release rows, the sync script,.github/workflowsunderui/).
What to produce
A patch series under /mnt/project-files/d1-merge/out/cutover-adaptation/ — numbered NN-<slug>.patch (git format-patch output, one logical item per patch), a SERIES.md listing each patch with: bill item(s) / decision it implements, files, the gate it clears, the before/after measurement on the merged layout, and whether it is root-side (applies at the repo root) or ui-side (applies with git apply --directory=ui against objectui main). Root-side and ui-side patches in separate number ranges. The epic PM applies the series onto the cutover branch after the subtree refresh, so every patch must apply with git am --3way on 9e37acd + the series before it.
Items (from #25752 step 4; measurement wins over the wording here):
- lockfile:
scripts/ui-import/splice-lockfile.mjsthenpnpm dedupe(5a, items 6/16/28: exact@ai-sdk/react4.0.121 AND exactai7.0.118, one lock copy each); rootpnpm-workspace.yamloverrides scoped so objectui's dependency lines are not rewritten (react-router 7, happy-dom 21). ⛔ never re-runsplice-lockfile.mjs --outon a spliced base (item 8). Note the lock is the one patch that must be REBUILT on the frozen objectuimain, so deliver it as a recipe (commands + expectedpnpm dedupe --checkoutput) as well as a patch. ui/manifests: every@objectstack/*dependencyworkspace:^;ui/package.jsonwhole-suitetestscript dropped (item 4);ui/turbo.jsonparked asturbo.objectui.json; QUICK_REFERENCE rows onworkspace:^(coordinate with 4a's patch: only rows 4a does not touch).- gates:
check-type-check-coverage.mjsaccepts objectui'stype-checkspelling for members underui/, remaining findings get ledger rows (item 1);check:lockfile-integrityper-package verdict andcheck:lockfile-dedupefrom the workspace root (items 6/7); rootbuildfilter!./ui/apps/siteif still needed after A2 (item 3). - census:
packages/client/src/envelope-caller-census.test.ts—OBJECTUI_CENSUSconstant becomes a liveLEDGERrow forui/packages/data-objectstack/src/index.ts(analytics.query, production consumer), count 28 → 29 (item 17). - skills catalog:
ui/skills/objectui→ rootskills/(decision C, item 18) — ⛔skills/**is Tier H; keep this as its own patch and flag it in SERIES.md. - decisions carried: root
eslint.config.mjsglobalignoresgainsui/**with the config's own census comment (G1, item 25);check:test-source-aliasvitest-alias half scoped to non-ui/members (F, item 21d; the clocked half is already fixed by tooling(test-source-alias): a type reference or literal text is not a clocked load #25781);check:dts-closureexpands*subpath patterns against dist (item 22);scripts/js-comment-mask.mjsstops reading JSX text as a comment opener, 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:check:tier-file-adoption,check:turbo-task-graph,check:workspace-manifest-cycles,check:merge-driver,check:cross-package-test-inputs,check:published-filesfloor,check-closing-keyword-parityui parsers);ui/.objectstack-pin/**deleted (item 21b);check:agent-test-spellingCOUNTER_EXAMPLE_FILESgains{ path: 'ui/AGENTS.md', reason }(item 21c amendment);scripts/partition-test-shards.mjsexcludes members underui/(run 4 note, with item 2 above). - Anything else the merged-layout gates print that is not in the accepted-red-classes list of cutover(ui-merge): the switch itself — freeze both repos,
git subtree addobjectui asui/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: measure, fix if mechanical, otherwise list it in SERIES.md as a new class for the epic PM to rule.
Acceptance
- On 9e37acd + the full series:
pnpm install --frozen-lockfile0;pnpm type-check(root turbo) and the gate families cutover(ui-merge): the switch itself — freeze both repos,git subtree addobjectui asui/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 names exit 0, or the residual is exactly the accepted-red-classes list;pnpm lint(root,--no-inline-config) 0 errors;pnpm check:test-source-alias,check:dts-closure,check:adr-anchors,check:undeclared-dep-imports,check:type-check-coverage,check:lockfile-integrity,check:lockfile-dedupe,check:agent-test-spelling,check:tier-file-adoption,check:turbo-task-graph,check:workspace-manifest-cycles,check:merge-driver,check:cross-package-test-inputs,check:published-files, the envelope census test, the JSX-mask self-test: each exit 0 with the before/after in SERIES.md. git am --3wayof the whole series on a fresh worktree at 9e37acd succeeds; the lock recipe reproduces the lock patch byte-for-byte on that base.- Report: SERIES.md + one
post-stampedcomment on this card with the table; no PR.
Size: L (many small mechanical items, each measured). Clause-②: no. Metadata-protocol: none. Responsibility: n/a — epic step.
风险
- The lock patch goes stale the moment objectui
mainmoves; hence the recipe. The ui-side manifest patch may conflict with platform-admin re-anchor (L5 removal half): delete the legacy grant-row read — one minor after L4's landing #13515/Pin test-typecheck debt by error IDENTITY, not per-file count #13512's manifest lines; build it against a fresh objectuimainsubtree if you can, and say so. skills/**andAGENTS.mdare Tier H: patches touching them are flagged, never folded into another patch.
Dedupe
The epic's family only (#25752 step 4 is this work; #25753 aftercare takes what is not needed for the sitting). New as a card: the procedure card deliberately kept the adaptation commit for the seat; it is split out now for parallelism under the maintainer's 13:39Z freeze ruling.
Activity
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 1
Session:
session_01CUXv64KLMfYv3ia2sWi6teAccount:
os-tesla(the seat's linked user; the card's assignee)Branch:
claude/project-thread-vmrkwzWorktree:
objectstack-issue-25803Domain:
domain:devxSeat:
domain:devx#1File surface:
patch series only (no PR): root gates/ledgers/config named in the card items 1–7, ui/ manifests and skills move as separate patches, lock recipe(stop on breach; explain in the report)Container & model:
L,mode:thread,model: opus (default judgment tier),effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: n/a — epic step (#25752 step 4, commit 2)
Thread-read: none
Premise: holds — verify tree 9e37acd is the measured base; bill items 1–32 name every item
Serial constraints cleared: 4a #25745's ui patch surface (QUICK_REFERENCE release rows, sync script, ui/.github/workflows) is excluded; the verify branch is read-only; no PR is opened by this card
Resume-from: none
Dispatched by the epic seat (
session_01RSDL3SFtJaKzcymvCD8RsU) under the pm-dispatch frame; order:/mnt/project-files/d1-merge/dispatch/J-25803-cutover-adaptation-series.md. Part of #25677.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Card J: drop 2 of 2 delivered, 2026-10-25T17:13Z
This is a patch series for the cutover PR #25825, not a PR of its own. The base is
claude/project-thread-dwhq6rat 1c0d02e. The files are in the project workspace underd1-merge/out/cutover-adaptation/, andSERIES.mdthere is the full record: apply order, per-patch before/after and the drop 1 rows.Root patches 02–22 apply with
git am --3way; ui patches 54–57 add--directory=ui. On a fresh worktree at 1c0d02e, patches 02–21 and 54–57 apply cleanly and give exactly the measured tree. Patch 22 passesgit apply --check, but it has not been run (see below).ui/**left to Lint UI)type-checkspelling).changeset/Gate sweep on the result.
scripts/__tests__has 15 failures, all in accepted classes: the pin class (7, plus the lockfile-integrity file, which fails as a whole), and 4a's QUICK_REFERENCE release-sync (8, which is 4a's surface).type-check:scriptsand the package type-checks all exit 0.Open for the epic PM:
object-uiis private, so main'scheck-changeset-fixedcalls it missing, and the lockstep count reads 112 against 111. 4a's own script edits are what make both 0. A probe withoutobject-uigives 0 on both.13526-react-pages-default-off.md, because its basename collides with the root's file of the same name. Reading the gate rules, I expectcheck-empty-changesetto fail on 3 changesets with empty frontmatter, andcheck-adr-0087-registrationon 1 BREAKING changeset with no marker. I have not run either gate.scripts/ui-import/README.md.objectstack-fleet commentedon Oct 25, 2026
Card J: series complete, 2026-10-25T18:21Z
All three drops are on the cutover branch
claude/project-thread-dwhq6r(#25825); run 4's head is c04b36d. The full record (apply order, per-patch before/after, measurements, rulings) isSERIES.mdin the project workspace underd1-merge/out/cutover-adaptation/. This card opened no PR.pnpm audit28 → 1 (main's own@azure/msal-node),dedupe --check0, frozen install 0check-ci-filter-parityand self-test 0The PM's own commits beside the series: cba73d0 (item 39 follow-up), 0b8ae93 (item 18,
metadata.internalon the objectui skill bundle), d2342a1 and c04b36d (item 45), 1180de6 (item 46).Left for 4a: 12 Test UI reds, QUICK_REFERENCE ×8 and the claims test ×4. Two notes for the 4a apply, both read from its patch and not measured with 4a applied:
markdown-test-inputs.mjsprobably reds "EVERY tracked markdown document is an input" forui/.github/pull_request_template.md. That row is the file's only reader.git apply --check --directory=ui).objectstack-fleet commentedon Oct 25, 2026
Epic PM audit (#25677 step 4): card J complete. Drops 1–3 are on the cutover branch (
claude/project-thread-dwhq6r, head c04b36d = run 4 of #25825); SERIES.md "Final state on the cutover branch" maps every patch to its commit, 19 reverted (decision C → its own aftercare card), 22 and 62 kept as aftercare input. Closing as completed; no PR was part of this card by design.