Skip to content

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

Closed

Description

@objectstack-fleet

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)

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):

  1. lockfile: scripts/ui-import/splice-lockfile.mjs then pnpm dedupe (5a, items 6/16/28: exact @ai-sdk/react 4.0.121 AND exact ai 7.0.118, one lock copy each); root pnpm-workspace.yaml overrides scoped so objectui's dependency lines are not rewritten (react-router 7, happy-dom 21). ⛔ never re-run splice-lockfile.mjs --out on a spliced base (item 8). Note the lock is the one patch that must be REBUILT on the frozen objectui main, so deliver it as a recipe (commands + expected pnpm dedupe --check output) as well as a patch.
  2. ui/ manifests: every @objectstack/* dependency workspace:^; ui/package.json whole-suite test script dropped (item 4); ui/turbo.json parked as turbo.objectui.json; QUICK_REFERENCE rows on workspace:^ (coordinate with 4a's patch: only rows 4a does not touch).
  3. gates: check-type-check-coverage.mjs accepts objectui's type-check spelling for members under ui/, remaining findings get ledger rows (item 1); check:lockfile-integrity per-package verdict and check:lockfile-dedupe from the workspace root (items 6/7); root build filter !./ui/apps/site if still needed after A2 (item 3).
  4. census: packages/client/src/envelope-caller-census.test.ts — OBJECTUI_CENSUS constant becomes a live LEDGER row for ui/packages/data-objectstack/src/index.ts (analytics.query, production consumer), count 28 → 29 (item 17).
  5. skills catalog: ui/skills/objectui → root skills/ (decision C, item 18) — ⛔ skills/** is Tier H; keep this as its own patch and flag it in SERIES.md.
  6. decisions carried: root eslint.config.mjs global ignores gains ui/** with the config's own census comment (G1, item 25); check:test-source-alias vitest-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-closure expands * subpath patterns against dist (item 22); scripts/js-comment-mask.mjs stops reading JSX text as a comment opener, pinned self-test (item 23); check:adr-anchors allowlist rows for the ui/**/CHANGELOG.md ADR-0075 lines (item 19); check:undeclared-dep-imports ledger row for ui/apps/console/src with the bundled-SPA evidence (item 20); watch-hint / population declarations list ui/** (item 21a: check:tier-file-adoption, check:turbo-task-graph, check:workspace-manifest-cycles, check:merge-driver, check:cross-package-test-inputs, check:published-files floor, check-closing-keyword-parity ui parsers); ui/.objectstack-pin/** deleted (item 21b); check:agent-test-spelling COUNTER_EXAMPLE_FILES gains { path: 'ui/AGENTS.md', reason } (item 21c amendment); scripts/partition-test-shards.mjs excludes members under ui/ (run 4 note, with item 2 above).
  7. 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 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: measure, fix if mechanical, otherwise list it in SERIES.md as a new class for the epic PM to rule.

Acceptance

Size: L (many small mechanical items, each measured). Clause-②: no. Metadata-protocol: none. Responsibility: n/a — epic step.

风险

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

  1. added
    pm:epicReserved by a dedicated epic PM, parent or sub-issue; other PMs never take it; never with pm:queue
    on Oct 25, 2026
  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01CUXv64KLMfYv3ia2sWi6te
    Account: os-tesla (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-vmrkwz
    Worktree: objectstack-issue-25803
    Domain: domain:devx
    Seat: domain:devx#1
    File 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: xhigh
    Clause-②: 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

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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-dwhq6r at 1c0d02e. The files are in the project workspace under d1-merge/out/cutover-adaptation/, and SERIES.md there 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 passes git apply --check, but it has not been run (see below).

    # side item gate before → after
    02 root G1 root lint (ui/** left to Lint UI) → 0
    03–09, 15, 16 root bill 19–21 agent-test-spelling, adr-anchors, undeclared-dep-imports, four population declarations, merge driver, cross-package-test-inputs, closing-keyword-parity, pnpm-flag-spellings, manifest-repository-directory each 1 → 0
    10 root bill 1 type-check-coverage (ui/ type-check spelling) 1 (490) → 0
    11 root F test-source-alias 1 → 0
    12 root bill 22 dts-closure (subpath patterns) 1 → 0 (119-task build)
    13 root bill 17 envelope census 28 → 29 3 failed → 21/21
    14 root bill 23 comment-mask corpus (JSX text) 1 file disagrees → 0
    17 root K1 published-files 1 → 0
    18 root README step 6 happy-dom comment (optional) 0 → 0
    19 root Tier H, C skills move skill gates 0 → 0
    20 root item 38 check:pm-dispatch-gates fast tier 1 of 1917 failed → 1917 pass
    21 root item 39(a), 4a's text byte for byte check-changeset-fixed / lockstep-package-count 1 → 1 / 0 → 1
    22 root item 39(b) 65 ui changesets to the root .changeset/ not measured
    54–56 ui bill 2, 21(b) pin snapshot delete, repository retarget, QUICK_REFERENCE command rows quick-reference-commands-4149 passes
    57 ui item 37 lazy-node pin 6 → 5 2 failed → 314/314

    Gate sweep on the result.

    • ui 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).
    • doc-json-fences, skill-examples, ui type-check:scripts and the package type-checks all exit 0.

    Open for the epic PM:

    • Item 39(a): main's two gates stay red with 4a's text. object-ui is private, so main's check-changeset-fixed calls it missing, and the lockstep count reads 112 against 111. 4a's own script edits are what make both 0. A probe without object-ui gives 0 on both.
    • Item 39(b): written but not run. Patch 22 was not applied locally. One file is renamed, 13526-react-pages-default-off.md, because its basename collides with the root's file of the same name. Reading the gate rules, I expect check-empty-changeset to fail on 3 changesets with empty frontmatter, and check-adr-0087-registration on 1 BREAKING changeset with no marker. I have not run either gate.
    • 4a overlap. Merging the result with 4a 9a776c6 conflicts in one file, scripts/ui-import/README.md.
  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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) is SERIES.md in the project workspace under d1-merge/out/cutover-adaptation/. This card opened no PR.

    patches item state on the branch
    01, 51–53 + lock recipe (drop 1) ui workspace deps, nested root, turbo scripts, splice script applied
    02–18, 54–56 (drop 2) bill 1, 2, 17, 19–23, 25, 34 (K1), decision F, README step 6 applied
    19 (Tier H, skills move) decision C applied, then reverted (3ee2fbc); decision C becomes its own card after the import
    57, 20, 21 (drop 2) items 37, 38, 39(a) applied
    22 item 39(b), 65 ui changesets not applied; input for the aftercare card
    58–60, 23 (drop 3) item 40, OSV: wait-on ^9.5.1, shadcn ^4.22.1, next 16.4.1, three root overrides, recomputed lock applied; pnpm audit 28 → 1 (main's own @azure/msal-node), dedupe --check 0, frozen install 0
    24 (drop 3) item 44, respin of 13 applied; census 28 walked + 1 recorded = 29, check-ci-filter-parity and self-test 0
    25 (drop 3) item 43, companion of 11 applied; bare-root-worklist REFUSE-WIDE row, self-test 0
    61 (drop 3) pin class applied; ui objectstack-pin, ci-cd-pipeline-doc and lockfile-integrity tests assert the merged workspace, 138/138
    62 pin class (claims-gate delete) not applied; it collides with 4a, which deletes the whole pin class at the sitting

    The PM's own commits beside the series: cba73d0 (item 39 follow-up), 0b8ae93 (item 18, metadata.internal on 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:

    • 4a's removal of the claims-test row in markdown-test-inputs.mjs probably reds "EVERY tracked markdown document is an input" for ui/.github/pull_request_template.md. That row is the file's only reader.
    • 4a still applies cleanly on the run-4 tree (git apply --check --directory=ui).
  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatchpm:epicReserved by a dedicated epic PM, parent or sub-issue; other PMs never take it; never with pm:queue

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions