You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
cutover-prep(ui-merge): warm the function-body import() of @objectstack/* / @object-ui/* in the ui test files check:test-source-alias names, so the merged tree's Test UI stops clocking out (parent #25677, decision F) #25763
Filing gate ③ + ④: pre-freeze prep card of the epic #25677 (pm:epic; epic PM session_01RSDL3SFtJaKzcymvCD8RsU), decided by the maintainer as cutover decision F (director thread, 2026-10-25 09:06Z: 「17f · 同意」: adopt for the function-body half; the vitest-alias half of the gate is scoped to non-ui/ members in the cutover adaptation commit, not here). Part of #25677. Lands in objectstack-ai/objectuimain before the cutover freeze (#25752 step 2).
谁付代价(业务筛): in the merged tree a ui test that does await import('@objectstack/lint') (or @objectstack/spec, @object-ui/*) inside a function body resolves to the workspace package's dist and pays its first transform inside the test's own clock. Verify runs 8 and 11 measured the cost: app-shell/src/preview/__tests__/DraftChangesPanel.securityProblems.test.tsx fails 2 of 3 because a 385-export @objectstack/lint transform exceeds the 1000 ms findBy* window (bill item 24); with a 1.5 s pre-wait it passes. Left as is, every Test UI shard carrying one of these files is a coin flip after the cutover, and each flip costs a re-run of a 12-minute shard.
Re-measure the list on the merged layout (recipe below): run objectstack's pnpm check:test-source-alias and keep only the function-body import findings under ui/ (the vitest-alias findings — "tests import workspace packages resolving to dist with no source alias" — are out of scope here). The epic seat measured 99 items in total on verify run 8 of which roughly 25 are this class (scratchpad log run8-test-source-alias.log; the seat posts the file list on this card as a comment).
⛔ No timeout widening, no vi.setConfig, no skipping: the fix is the import shape.
Acceptance
On the merged layout (verify branch claude/project-thread-dwhq6r-25697-verify head 9e37acd + your diff via git apply --directory=ui), pnpm check:test-source-alias reports 0 function-body-import findings under ui/ (alias findings may remain; they are the adaptation commit's).
objectui standalone: the touched test files pass pnpm exec vitest run --root . <files> from the ui root; pnpm type-check green; CI green on the draft PR.
PR body: the file list with before/after finding counts.
Size: M (mechanical over ~24 files; judgment only where a package needs an alias). Clause-②: no. Metadata-protocol: none. Responsibility: n/a — not a defect card.
风险
A warm import can itself be slow in objectui's standalone tree (it pays the same transform earlier); measure the shard time before/after and report it.
Files that import a package which is not yet built in the standalone tree: use the alias-to-source form there.
Dedupe
search_issues 2026-10-25 09:12Z 「test-source-alias function-body import ui tests」: 6 hits, all closed objectstack-side gate defects or service-package alias cards (#8020, #8104, #8108, #8180, #9955, #22047); none covers ui/. New.
Measured list for this card (verify run 8, merged tree head 3b0be7c; re-measure on the merged layout before you start)
pnpm check:test-source-alias reported 99 ui/ items; 40 of them are the function-body-import class this card adopts (the card text said ~25; the count below is the measurement). The alias-half items are not listed here and are out of scope. DraftChangesPanel.securityProblems.test.tsx belongs to 2c round 2 (a) on #25727 and is excluded.
ui/packages/app-shell/src/__tests__/spec-symbol-parity.test.ts:330: `import('@objectstack/spec')` is paid inside a function body
ui/packages/app-shell/src/console/__tests__/AppContent.deniedVsUnpublished.test.tsx:126: `import('@object-ui/i18n/locales')` is paid inside a function body
ui/packages/app-shell/src/hooks/__tests__/useConsoleActionRuntime.flowRowGuard-13397.test.tsx:37: `import('@object-ui/i18n/locales')` is paid inside a function body
ui/packages/app-shell/src/views/ObjectView.listLinksPlural-11733.test.tsx:84: `import('@object-ui/react')` is paid inside a function body
ui/packages/app-shell/src/views/RecordDetailView.paramRuntimeParity-6431.test.tsx:389: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/MetadataTypeActions.paramDialogClose-6473.test.tsx:238: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.requiredInGatedSection-6900.test.tsx:154: `import('@objectstack/formula')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:434: `import('@objectstack/spec/kernel')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:435: `import('@objectstack/spec/system')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:446: `import('@objectstack/spec')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:447: `import('@objectstack/spec/security')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:459: `import('@objectstack/spec/integration')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.retiredFormulaKey.test.ts:125: `import('@objectstack/spec/data')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/inspectors/ViewVariantInspector.requiredInGatedSection-6900.test.tsx:108: `import('@objectstack/formula')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/DataPillar.addFieldPopover-12516.test.tsx:52: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/DataPillar.formToolbar-12451.test.tsx:56: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/DataPillar.gridProjection.test.tsx:76: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/DataPillar.picklistServedOptions-10202.test.tsx:119: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.autosaveInFlight-11204.test.tsx:143: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.autosaveSwitch-11232.test.tsx:179: `import('@object-ui/components')` is paid inside a function body
ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.draftVersionConflict-11773.test.tsx:150: `import('@object-ui/components')` is paid inside a function body
ui/packages/auth/src/__tests__/auth-spec-parity.test.ts:257: `import('@objectstack/spec/api')` is paid inside a function body
ui/packages/components/src/renderers/complex/__tests__/data-table.test.ts:66: `import('@object-ui/types')` is paid inside a function body
ui/packages/plugin-calendar/src/__tests__/ObjectCalendar.dataObjectArmRefused-8348.test.tsx:199: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/plugin-calendar/src/__tests__/spec-symbol-4650.test.ts:58: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/plugin-dashboard/src/__tests__/ObjectMetricWidget.i18nLabel.test.tsx:271: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/plugin-form/src/__tests__/spec-symbol-4650.test.ts:50: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/plugin-grid/src/__tests__/gridBareArrayDataRefused-8348.test.tsx:250: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/plugin-grid/src/__tests__/spec-symbol-4650.test.ts:73: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/plugin-kanban/src/__tests__/spec-symbol-4650.test.ts:50: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/react/src/__tests__/SchemaRenderer.concealmentGateFaultDiagnostic.test.tsx:208: `import('@object-ui/core')` is paid inside a function body
ui/packages/react/src/__tests__/SchemaRenderer.disabledGateFaultDiagnostic.test.tsx:215: `import('@object-ui/core')` is paid inside a function body
ui/packages/react/src/__tests__/SchemaRenderer.productionPredicateFaultWarning.test.tsx:130: `import('@object-ui/core')` is paid inside a function body
ui/packages/types/src/__tests__/dashboard-global-filters-spec-binding.test.ts:102: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/types/src/__tests__/registry-meta-carry-9102.test.ts:786: `import('@objectstack/spec/data')` is paid inside a function body
ui/apps/console/src/__tests__/masterDetailFormTypeManifest.test.ts:106: `import('@objectstack/spec/ui')` is paid inside a function body
ui/apps/console/src/__tests__/masterDetailFormTypeManifest.test.ts:106: `import('@objectstack/spec/ui')` is paid inside a function body
ui/packages/app-shell/src/__tests__/spec-symbol-parity.test.ts:330: `import('@objectstack/spec')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.requiredInGatedSection-6900.test.tsx:154: `import('@objectstack/formula')` is paid inside a function body
ui/packages/app-shell/src/views/metadata-admin/clientValidation.optOuts.test.ts:434: `import('@objectstack/spec/kernel')` is paid inside a function body
Claim: PM loop round 1
Session: session_01N1dH2ywuFXe38A89awucwV
Account: os-tesla (the seat's linked user; the card's assignee)
Branch: claude/project-thread-upnjhm
Worktree: objectui-issue-25763
Domain: domain:devx
Seat: domain:devx#1
File surface: ui/**/__tests__/** and ui/**/*.test.ts(x) named by check:test-source-alias (function-body-import class), per-package vitest.config where an alias is needed (stop on breach; explain in the report)
Container & model: M, mode:thread, model: opus (default judgment tier), effort: xhigh
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6395883118
Premise: holds
Serial constraints cleared: objectui #25727 2c round 2 on claude/project-thread-gxm6ze owns ui/packages/app-shell/src/preview/tests/DraftChangesPanel.securityProblems.test.tsx — excluded from this card; objectstack#25762 (E) edits ui/packages/types zod, no test-file overlap expected
Resume-from: none
Dispatched by the epic seat (session_01RSDL3SFtJaKzcymvCD8RsU) under the pm-dispatch frame; order: /mnt/project-files/d1-merge/dispatch/ (E-25762 / F-25763). Part of #25677.
Acceptance adjusted (epic seat, after the seat's merged-layout measurement): 37 function-body-import findings under ui/, of which 7 are gate false positives (type alias / type annotation / template-literal text — the files resolve nothing at run time, and four of them are @ts-expect-error tripwires whose design excludes a namespace import). Those 7 are NOT this card's: they are the gate's, now filed as objectstack#25766 (prep card G, gate side). This card's acceptance reads: the 30 real findings warmed, 0 real findings left; the PR body lists the 7 residual files by name as "gate false positives, see the gate card". Nothing else changes.
verify head 9e37acd126: 57 function-body lines under ui/, 37 unique (file, specifier) findings in 33 files; all 33 files byte-identical to objectui main0063f22ce
Real findings warmed
30 in 26 files: 13 in a test body or a helper a test awaits, 10 inside a vi.mock factory, 3 re-imported after vi.resetModules(). Each file gains a module-scope side-effect import of the same specifier; every dynamic import stays; no timeout, no skip, no production change; empty-frontmatter changeset
Merged-layout gate, after
12 lines, 7 unique findings, 0 real. Every other line of the gate's output is byte-identical to before
Left untouched (gate false positives, objectstack#25766)
the four spec-symbol-4650.test.ts tripwires (plugin-calendar, plugin-form, plugin-grid, plugin-kanban), types dashboard-global-filters-spec-binding (type alias), components data-table (type annotation), scripts check-spec-range-floors (template-literal fixture)
Timing, the 26 files as one set, single runs
merged: vitest "tests" 173.88 s → 164.70 s, "import" 175.03 s → 190.95 s. Standalone: tests 161.17 s → 151.87 s, import 133.82 s → 138.96 s. Largest single moves (merged, slowest test): optOuts 848 → 11 ms, retiredFormulaKey 7161 → 1948 ms, auth-spec-parity 359 → 94 ms, the three SchemaRenderer diagnostics about 1.05 s → 0.4 s
Tests
26 files / 342 tests pass in all four runs (standalone and merged, before and after)
Gates
type-check of the 8 touched packages (43 tasks), changeset presence / overwrite / no-major / claims, new-line-citations, control-bytes, test-path-roots: all exit 0. ESLint on the changed files: 0 errors, 72 warnings, the same 72 as the base versions
Per-file before/after table and the full verification record are in the PR body.
ACCEPT — dispatch seat. objectui#13513 (head dd8f11eb27, branch claude/project-thread-upnjhm, +89/−0, 27 files) is accepted as the fix for this card.
Checked against the order (/mnt/project-files/d1-merge/dispatch/F-25763-objectui-warm-imports.md) and the seat's report (/mnt/project-files/d1-merge/out/F-25763-report.md):
26 test files gain a module-scope side-effect import of the specifier they otherwise first load in a clocked place (13 test body / awaited helper, 10 vi.mock factory, 3 after vi.resetModules()); the dynamic imports stay; no timeout widening, no vi.setConfig, no skipped test. DraftChangesPanel.securityProblems untouched (2c's).
Merged layout (verify head 9e37acd + diff via git apply --directory=ui): check:test-source-alias function-body findings 37 → 7 unique, real findings 30 → 0, the remaining 7 are the gate false positives the epic seat re-measured and filed as objectstack#25766 (acceptance adjusted on this card, comment 6396008217). The rest of the gate output is byte-identical before/after.
The cost moved where the order said it would: merged "tests" time 173.9 → 164.7 s on the 26-file set, "import" time 175.0 → 191.0 s, wall ≈ flat; the slowest clocked tests fall out of the window (retiredFormulaKey 7161 → 1948 ms, optOuts 848 → 11 ms, SchemaRenderer trio ≈ 1.05 → 0.4 s). Measured on the touched-file set rather than whole shards — deviation 2 accepted; the set spans most of the 16 shards.
Deviation 3 accepted: the empty-frontmatter changeset is required by objectui's changeset-presence gate for files under a released package's src/.
Standalone and merged: vitest on the 26 files 342/342 both layouts, type-check of the 8 touched packages 43 tasks exit 0, eslint 0 errors (72 warnings = base), changeset / line-citation / control-bytes / test-path-roots gates exit 0.
CI on the PR head: 36 check runs, none failed (16 Test shards, Test, Type Check, Lint, Repo Gates, Build & E2E, Build Docs, Bundle Analysis, Changeset checks, Line Citation Gate, Governed Surface Queue Guard). check-governed-merges --pr objectstack-ai/objectui#13513 on the final file list: NOT governed (0 of 27 paths hit the register), 89 changed lines ≤ 3000 — ordinary queue landing.
Writes: 2 relay writes (pr_create, one card comment), 0 MCP writes, no review requested.
Landing: the seat flips the PR ready and arms auto-merge via the relay now. The PR body says Part of objectstack#25763 (cross-repo, no auto-close), so the seat closes this card with a landing note once the merge lands; the 7 residual files close with objectstack#25766. The cutover pin bump (#25752 step 2) picks the merged objectui main up.
Landed. objectui#13513 (head dd8f11eb27) MERGED into objectui main as 7c83e70e0e on 2026-10-25 10:31Z (merge queue, auto-merge armed by the dispatch seat after the ACCEPT above). 26 ui test files now load their @objectstack/* / @object-ui/* specifier at module scope, so the first transform falls outside the test's own clock; on the merged layout (verify head 9e37acd + this diff) check:test-source-alias reads 0 real function-body-import findings under ui/. The 7 residual findings are gate false positives and close with objectstack#25766 (PR #25781, in the objectstack queue). The cutover pin bump (#25752 step 2) picks this main up. Closing this card; the parent #25677 ticks prep card F.
Activity
objectstack-fleet commentedon Oct 25, 2026
Measured list for this card (verify run 8, merged tree head 3b0be7c; re-measure on the merged layout before you start)
pnpm check:test-source-aliasreported 99ui/items; 40 of them are the function-body-import class this card adopts (the card text said ~25; the count below is the measurement). The alias-half items are not listed here and are out of scope.DraftChangesPanel.securityProblems.test.tsxbelongs to 2c round 2 (a) on #25727 and is excluded.维护者速读:本卡的文件清单以合并树实测为准,共 40 处函数体 import(卡文写约 25 为估计)。
Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 1
Session:
session_01N1dH2ywuFXe38A89awucwVAccount:
os-tesla(the seat's linked user; the card's assignee)Branch:
claude/project-thread-upnjhmWorktree:
objectui-issue-25763Domain:
domain:devxSeat:
domain:devx#1File surface:
ui/**/__tests__/** and ui/**/*.test.ts(x) named by check:test-source-alias (function-body-import class), per-package vitest.config where an alias is needed(stop on breach; explain in the report)Container & model:
M,mode:thread,model: opus (default judgment tier),effort: xhighClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6395883118
Premise: holds
Serial constraints cleared: objectui #25727 2c round 2 on claude/project-thread-gxm6ze owns ui/packages/app-shell/src/preview/tests/DraftChangesPanel.securityProblems.test.tsx — excluded from this card; objectstack#25762 (E) edits ui/packages/types zod, no test-file overlap expected
Resume-from: none
Dispatched by the epic seat (
session_01RSDL3SFtJaKzcymvCD8RsU) under the pm-dispatch frame; order:/mnt/project-files/d1-merge/dispatch/(E-25762 / F-25763). Part of #25677.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Acceptance adjusted (epic seat, after the seat's merged-layout measurement): 37 function-body-import findings under
ui/, of which 7 are gate false positives (type alias / type annotation / template-literal text — the files resolve nothing at run time, and four of them are@ts-expect-errortripwires whose design excludes a namespace import). Those 7 are NOT this card's: they are the gate's, now filed as objectstack#25766 (prep card G, gate side). This card's acceptance reads: the 30 real findings warmed, 0 real findings left; the PR body lists the 7 residual files by name as "gate false positives, see the gate card". Nothing else changes.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Card F, 2026-10-25T09:57Z: draft objectstack-ai/objectui#13513 (head
dd8f11eb27, branchclaude/project-thread-upnjhm).9e37acd126: 57 function-body lines underui/, 37 unique (file, specifier) findings in 33 files; all 33 files byte-identical to objectuimain0063f22cevi.mockfactory, 3 re-imported aftervi.resetModules(). Each file gains a module-scope side-effect import of the same specifier; every dynamic import stays; no timeout, no skip, no production change; empty-frontmatter changesetspec-symbol-4650.test.tstripwires (plugin-calendar, plugin-form, plugin-grid, plugin-kanban),typesdashboard-global-filters-spec-binding (type alias),componentsdata-table (type annotation),scriptscheck-spec-range-floors (template-literal fixture)Per-file before/after table and the full verification record are in the PR body.
Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
ACCEPT — dispatch seat. objectui#13513 (head
dd8f11eb27, branchclaude/project-thread-upnjhm, +89/−0, 27 files) is accepted as the fix for this card.Checked against the order (
/mnt/project-files/d1-merge/dispatch/F-25763-objectui-warm-imports.md) and the seat's report (/mnt/project-files/d1-merge/out/F-25763-report.md):vi.mockfactory, 3 aftervi.resetModules()); the dynamic imports stay; no timeout widening, novi.setConfig, no skipped test.DraftChangesPanel.securityProblemsuntouched (2c's).git apply --directory=ui):check:test-source-aliasfunction-body findings 37 → 7 unique, real findings 30 → 0, the remaining 7 are the gate false positives the epic seat re-measured and filed as objectstack#25766 (acceptance adjusted on this card, comment 6396008217). The rest of the gate output is byte-identical before/after.src/.check-governed-merges --pr objectstack-ai/objectui#13513on the final file list: NOT governed (0 of 27 paths hit the register), 89 changed lines ≤ 3000 — ordinary queue landing.Landing: the seat flips the PR ready and arms auto-merge via the relay now. The PR body says
Part of objectstack#25763(cross-repo, no auto-close), so the seat closes this card with a landing note once the merge lands; the 7 residual files close with objectstack#25766. The cutover pin bump (#25752 step 2) picks the merged objectuimainup.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Landed. objectui#13513 (head
dd8f11eb27) MERGED into objectuimainas7c83e70e0eon 2026-10-25 10:31Z (merge queue, auto-merge armed by the dispatch seat after the ACCEPT above). 26 ui test files now load their@objectstack/*/@object-ui/*specifier at module scope, so the first transform falls outside the test's own clock; on the merged layout (verify head 9e37acd + this diff)check:test-source-aliasreads 0 real function-body-import findings underui/. The 7 residual findings are gate false positives and close with objectstack#25766 (PR #25781, in the objectstack queue). The cutover pin bump (#25752 step 2) picks thismainup. Closing this card; the parent #25677 ticks prep card F.Generated by Claude Code