Skip to content

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

Closed

Description

@objectstack-fleet

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/objectui main 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.

维护者速读

objectstack 的 check:test-source-alias 在合并树上点名约 25 个 ui 测试文件:它们在函数体内 import() workspace 包,首个转换落在测试自己的计时窗里。验证分支第 8/11 轮已有一个真实失败(DraftChangesPanel)。你裁定「采纳」(F):本卡在冻结前把这些 import 热化(模块顶层预先导入,或 vitest 别名到源码),让合并后的 Test UI 不再靠运行时机运气。

What to change (objectui, one draft PR to main)

  1. 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).
  2. For each file: a module-scope warm import of the same specifier (or the vitest alias to source, where the package already aliases), so the first transform happens before the test's clock starts. The DraftChangesPanel.securityProblems file is handled by 2c round 2 (a) 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 — skip it, do not conflict.
  3. ⛔ 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.

Activity

  1. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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
    

    维护者速读:本卡的文件清单以合并树实测为准,共 40 处函数体 import(卡文写约 25 为估计)。


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Card F, 2026-10-25T09:57Z: draft objectstack-ai/objectui#13513 (head dd8f11eb27, branch claude/project-thread-upnjhm).

    Fact Reading
    Merged-layout gate, before verify head 9e37acd126: 57 function-body lines under ui/, 37 unique (file, specifier) findings in 33 files; all 33 files byte-identical to objectui main 0063f22ce
    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.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions