Repository navigation
Description
Filing gate ④: sub-issue 5a/6 of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU). Part of #25677; preparation for sub-issue 5 (cutover). ⛔ Not a claim. Measured on the DO NOT MERGE verification PR #25718, run 3 (40148461539, head 1cade69) and the lockfiles of objectui main (cd70b78) and that branch.
Why. The verification branch built its single pnpm-lock.yaml by deleting objectui's lockfile and running pnpm install (verify commit 717defb). That resolves every ui/* dependency afresh from its range, and puts the git-root pnpm-workspace.yaml overrides (48 today) over the imported tree. Against objectui main's lockfile, 138 importer×dependency rows moved across 69 packages (308 unchanged). The merged tree therefore runs objectui's code on dependency versions objectui never tested, and the first CI run that reached the component tests shows it: every remaining Test UI failure is a radix Select / Tooltip interaction (@radix-ui/react-select 2.3.7→2.4.1, react-tooltip 1.2.16→1.4.1 and 15 other radix minors), the generated lucide icon-name list drifts (lucide-react 1.43.0→1.61.0, +94/−9 names, red gate + 13 unit failures), and the root override react-router@<8.3.0 → ^8.3.0 rewrites the react-router under objectui's react-router-dom@7.18 to 8.5.0 — a major mismatch inside one router line that type-checks and would ship. happy-dom moves 20.11.2→21.0.4 (major) by the same mechanism. A cutover that ships this is a dependency upgrade of 69 packages smuggled into a repository move; the merge must be dependency-neutral, with upgrades filed on their own cards afterwards.
Who does it, where it lands: the epic PM dispatches it (os-dev, objectstack checkout + the objectui checkout for the source lockfile). Deliverable = one reusable script plus a procedure, verified on a scratch copy of the verification worktree; the epic PM applies the resulting lockfile as a verify commit on #25718 to re-measure Test UI, and sub-issue 5's cutover PR runs the same script against the then-current objectui main. No PR to main before cutover unless the script is wanted earlier (then it is inert tooling under scripts/, not a governed surface).
维护者速读
验证分支的单一锁文件是"删掉 objectui 的 pnpm-lock.yaml、重新 install"得来的,结果 ui/ 下 69 个依赖包换了版本(138 处),根 pnpm-workspace.yaml 的 48 条 overrides 也套到了 objectui 的包上。合并树上剩下的组件测试红全是 radix Select/Tooltip 小版本变化造成的;lucide 从 1.43 跳到 1.61 让生成的图标名单漂移;根 override react-router@<8.3.0 → ^8.3.0 把 objectui 的 react-router-dom 7 底下的 react-router 换成了 8.5.0。本卡只做一件事:导入时把 objectui 自己锁文件里的解析原样搬进合并锁文件(pnpm install --frozen-lockfile 通过、与 objectui 锁相比 0 处变动),并把会改写 objectui 依赖线的根 overrides 限定作用域。依赖升级不随合并走,之后单独立卡。
Measured
| Evidence | Reading |
|---|---|
Resolution diff (objectui main lock vs verify branch lock, ui importers) |
138 rows / 69 packages moved; table on #25697 (run 3 pointer) |
| Type Check UI run 3 | red at check:icon-record-names: lucide-record-icon-names.ts drifted (lucide 1.61.0 resolved; objectui pins 1.43.0) |
| Test UI run 3, shards 1/4/9/14 | ListView.fieldListRead-11984, ListView.sortFieldFallback, importWriteModes-12697, CreateViewDialog.chartBinding-11576, PublicFormsPage.servedRule-11545, action-disabled-reason-11839, MarketplacePackagePage.installMode-12288 — Select/Tooltip behaviour; 13 unit failures in check-lucide-icon-record-names.test.ts |
Merged lock snapshots |
react-router-dom@7.18.4 → react-router: 8.5.0 (objectui lock: 7.18.2 → 7.18.2) |
Merged lock importers.ui |
happy-dom specifier rewritten ^20.11.2 → ^21.0.4 by the root override |
Scope
- Lockfile splice script (name is the dev's, e.g.
scripts/ui-import/splice-lockfile.mjs, Node builtins + theyamlalready in the workspace): inputs = objectstack'spnpm-lock.yaml, objectui'spnpm-lock.yamlat the imported sha, the prefixui/. Output = a merged lockfile in which (a) every objectui importer is re-keyed underui/(.→ui), (b) each ui importer's dependency keeps objectui's resolved version and specifier, except@objectstack/*entries which become the workspace links the adaptation already writes (link:../../../packages/<name>), (c) thepackages:andsnapshots:entries those versions need are carried over (and peer-suffixed snapshot keys recomputed by pnpm, see 2), (d) objectstack's own importers are untouched. The script prints the moved-row count against the source lock the way the measurement did (0 is the pass). - Reconcile with pnpm, not by hand: after the splice,
pnpm install --lockfile-onlymust leave the file unchanged, andpnpm install --frozen-lockfilemust pass. Where pnpm insists on a change (peer-suffix keys, dedupe of a version both sides pin identically), the script's output is adjusted until the diff is explainable line by line; the dev states what pnpm changed and why. - Overrides: classify the 48 git-root overrides against the ui tree: security floors objectui lacks (
qs,tar,undici,minimatch, …) stay — a single lockfile applying one advisory policy is a goal of the merge; an override that moves a dependency objectui pins to another major or into a mismatched line is scoped:react-router@<8.3.0becomesreact-router@>=8.0.0 <8.3.0(objectui stays on the 7.18 line until its own router card);happy-dom@>=17.0.0 <22.0.0 → ^21.0.4is measured (Test UI on 21 vs 20) and scoped to>=21.0.0 <22.0.0if 21 is not green for objectui's suites. Each scoping change carries the advisory it keeps covering, so the security intent is not weakened. - Procedure note for sub-issue 5 (one file under
docs/or the script's header): the order — subtree add → deleteui/pnpm-lock.yaml→ splice →pnpm install --frozen-lockfile→ regenerate nothing (if the moved-row count is 0, no generated file such aslucide-record-icon-names.tschanges).
Out of scope: upgrading any objectui dependency (own cards after cutover); objectstack's own resolutions; the react-router 7→8 move for objectui.
Verification (the dev's)
- On a scratch copy of the verification worktree (
/home/claude/objectstack-issue-25697at d17ed5e; objectui lock fromgit show 0dad5c2e11^:ui/pnpm-lock.yamlor the objectui checkout at cd70b78): run the splice, thenpnpm install --frozen-lockfilepasses; the moved-row count is 0;pnpm --dir ui exec vitest runon the seven failing files above is green;pnpm --dir ui run check:icon-record-namesis green without regenerating the list (revert verify commit d17ed5e's regeneration in the scratch copy first). react-routerunderreact-router-domin the merged lock is 7.18.x;happy-domis whatever the measurement decided, stated.- Objectstack's own packages:
pnpm install --frozen-lockfileandpnpm exec turbo run build --filter=@objectstack/core...unchanged (the splice must not touch their rows — diff of the objectstack importers is empty).
Done when
- The script and procedure are on the verification branch as a verify commit (applied by the epic PM from the dev's patch) and Test UI / Type Check UI no longer show a dependency-version failure; the moved-row count against objectui's lock is 0.
- The patch is filed at
/mnt/project-files/d1-merge/5a-lockfile-splice.patchfor sub-issue 5.
Size: M — one script (~300 lines), one override classification, one procedure note; verification is the bulk. Clause-②: no. Metadata-protocol: none. Blocked-by: none (the verification worktree exists); sub-issue 5 is blocked by this.
风险
- pnpm's peer-dependency suffixes in
snapshots:keys make a textual splice fragile; the reconcile step (2) is what keeps the result honest — if pnpm rewrites more than the dev can explain, the fallback ispnpm installwith objectui's resolutions pinned via a temporaryoverridesblock generated from objectui's lock, then removed. - Scoping an override must not drop coverage of the advisory it was added for; each change states the advisory range it still covers.
Dedupe
Open issues 2026-10-25 01:10Z filtered on lockfile / overrides / react-router / happy-dom: none about the ui/ import; this epic's own cards only. New.
Activity
objectstack-fleet commentedon Oct 25, 2026
Claim: epic #25677 round 4 (dispatch of sub-issue 5a)
Session:
session_01RSDL3SFtJaKzcymvCD8RsUAccount:
os-teslaBranch: none for the dev — the deliverable is a patch the epic PM applies as a verify commit on objectstack
claude/project-thread-dwhq6r-25697-verify(#25718, DO NOT MERGE) and files at/mnt/project-files/d1-merge/5a-lockfile-splice.patchfor sub-issue 5; no PR tomainon this cardWorktree: a scratch copy of
/home/claude/objectstack-issue-25697(verification branch at d17ed5e) plus the thread's objectui checkout for the source lockfile (cd70b78)Domain:
domain:devxSeat:
epic:#25677File surface: one new script under
scripts/ui-import/(name the dev's), one procedure note beside it,pnpm-workspace.yamloverrides:scoping lines,pnpm-lock.yaml(generated by the script + pnpm); no.github/**, noAGENTS.md, no package codeContainer & model: M,
mode:subagent,model: opus,effort: high; no governed path on the surfaceClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: #25723 (objectui#13484) touches objectui
scripts/, not the lockfile or overrides; PR A2 (not yet opened) touchesscripts/pm/andscripts/partition-test-shards.mjs; no overlap. The verification branch is the only place this is applied before cutover.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Dev report received; patch applied as verify commit cfa1676 on objectstack#25718 (
DO NOT MERGE, run 5). The patch (5 files:pnpm-lock.yaml,pnpm-workspace.yaml,scripts/ui-import/splice-lockfile.mjs,scripts/ui-import/README.md, revert ofui/packages/components/src/lib/lucide-record-icon-names.ts) is on that branch for sub-issue 5 to pick up;git apply --checkclean on d17ed5e,pnpm install --frozen-lockfilepasses in the verification worktree.Measured (the dev, against objectui@cd70b7818's lock): before splice 219 of 527 ui importer×dependency rows moved (the card's 138 was taken at an earlier head); after splice 0; after
pnpm install --lockfile-onlyreconcile 3 — all from overrides kept on purpose: happy-dom 20.11.2→21.0.4 (ui, ui/apps/console), better-auth 1.7.2→1.7.12 (ui/packages/auth; security floor, auth suite 34 files / 322 tests green on it).react-routeroverride scoped to>=8.0.0 <8.3.0: objectui's react-router-dom 7.18.2 → react-router 7.18.2 line is kept; GHSA-qwww-vcr4-c8h2 has no 7.x fix, so the 7.18 line carries it exactly as objectui's own lock does today — belongs to a router card, not this one. lucide-react back on 1.43.0 (the run-4 regenerated icon list is reverted), radix back on objectui's versions. Side effects pnpm makes on reconcile: 11 direct specifiers rewritten (postcss ×8, happy-dom ×2, better-auth ×1), transitive security floors raised (esbuild 0.28.1, undici 7.30.1, qs 6.16, hono 4.13.12, …), 94 base importer rows change only in peer suffixes (base direct versions and specifiers untouched; the script asserts base importers byte-identical before writing), 113packages:entries deduped away. Target dom tests green on the spliced tree: ListView.fieldListRead-11984, ListView.sortFieldFallback, importWriteModes-12697, CreateViewDialog.chartBinding-11576, MarketplacePackagePage.installMode-12288, action-disabled-reason-11839, PublicFormsPage.servedRule-11545, check-lucide-icon-record-names — 8 files, 155 tests.Open on this card until run 5 is read: (1) happy-dom 21 vs 20 over the broad sample did not finish (30+ min on a loaded box); Test UI on run 5 is the measurement — if happy-dom failures remain, the selector becomes
happy-dom@>=21.0.0 <22.0.0and the splice +--lockfile-onlyare re-run. (2) ACCEPT and the splice's place in the cutover procedure (sub-issue 5) follow the run-5 read.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT — dispatch seat. The 5a deliverable is accepted and the card closes.
scripts/ui-import/splice-lockfile.mjs(+scripts/ui-import/README.md) and the splicedpnpm-lock.yaml/pnpm-workspace.yaml(root overrides scoped:react-router>=8.0.0 <8.3.0,happy-dom21 andbetter-auth1.7.12 kept), delivered as/mnt/project-files/d1-merge/5a-lockfile-splice.patchand applied as verify commitcfa1676afcon the DO NOT MERGE PR DO NOT MERGE — verification run for #25697: PR A + the ui/ subtree import of objectui main cd70b7818d #25718 (run 5).pnpm install --frozen-lockfileexits 0 on the spliced lockfile. Measured: before the splice 219 of 527 ui importer rows moved; after, 3 of 527.packages/consolebuilds fromui/apps/console, both repos' pin scripts and sha files are deleted (parent #25677, 4a/6) #25711, 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, 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 or tooling(objectui-readiness 5): three objectui tests assume the objectui root is the pnpm workspace root —.pnpminstall probes, the CLI generator IN-WORKSPACE map, the Console vendor-chunk standalone baseline (parent #25677, 2e/6) #25733). No happy-dom failure, so the happy-dom 21 decision stands. Full read on DO NOT MERGE — verification run for #25697: PR A + the ui/ subtree import of objectui main cd70b7818d #25718.git subtree add --prefix=ui, runnode scripts/ui-import/splice-lockfile.mjs --base pnpm-lock.yaml --import ui/pnpm-lock.yaml --prefix ui --out pnpm-lock.yaml, apply the override scoping,pnpm install --frozen-lockfile. The script and README ship with the cutover PR; nothing lands onmainbefore it. Re-run the splice at cutover time against the then-current lockfiles (the patch file is the recipe, not the artifact).ui/workspace:D1 裁定(A+)的执行父单 — 一个 PR 同时改 spec 与渲染器,删除两仓互钉,@object-ui 保留包名并与 @objectstack 同一版本组,objectui 仓归档为迁移说明 #25677 ticks 5a.Generated by Claude Code