Skip to content

metadata-admin DOM tests: two surfaces that never settle under the light dom project, with no diagnostic #4249

Closed as not planned

Description

@yinlianghui

Observation-class finding, measured while writing objectui#4132's pins (PR #4248). Nothing a user hits — this is a test-harness characteristic. Recording it because both specimens present identically (the test file produces no output at all and never exits), which is the most expensive failure shape to diagnose from scratch: there is no timeout message, no failing assertion, no partial reporter output, and --reporter=verbose does not help because it flushes per file.

Specimen 1 — a component that opens a Radix Sheet

Rendering MetadataDetailDrawer (which wraps its body in Sheet / SheetContent) inside the dom project ran past 540s with zero output. The component it hosts renders on its own in ~6s:

render result
< MetadataDetailDrawer target={embedded} … > no output, killed at 540s
< EmbeddedItemEditor … > (the entirety of the drawer's embedded branch) 8 tests, 6.7s

Consistent with the repo's own layout: the only test that renders an open Sheet — layout/__tests__/ChatDock.test.tsx — is in heavyDomTests (i.e. the dom-heavy project with the full setup). The two other light-project files that mention Sheet do not render one: preview/__tests__/CommitTimeline.test.tsx names it in a comment, and views/studio-design/__tests__/studioChatDockPersistence.test.tsx mocks it away (ChatDockMobileSheet: () => null).

Specimen 2 — a SchemaForm whose schema declares a condition property

SchemaForm.tsx:344 (CONDITION_FIELD_NAMES) routes visible / hidden / disabled / visibleOn / condition / predicate / *When to the CEL ConditionWidget, whose formula loader is a dynamic import (celAuthoring.__setCelFormulaLoader). Bisected one property at a time against an otherwise identical fixture:

schema property added result
name renders, 43ms
label renders, 44ms
condition no output, killed

This is the unbounded-module-load trap AGENTS.md §测试纪律 already describes, reached through a schema key name rather than through an obvious React.lazy in the component under test — which is why it is not obvious from the test's own source that a dynamic import is involved at all.

Why it is worth writing down rather than fixing here

Both are avoidable once known, and #4132 avoided both (mount the hosted component directly; keep the routed key out of the fixture's schema — the value is still asserted, on the preview that reads it off the draft). Neither is a defect in the product code, and neither should be "fixed" by parking a file in heavyDomTests — AGENTS.md restricts that list to registry <type> not registered failures and explicitly rejects it as a flake remedy.

Possible dispositions, none obviously right, hence finding and not pm:queue:

Provenance

Measured on branch claude/issue-4132-retire-standalone-validation at 733935e3, container-shared runner, pnpm exec vitest run <file> --maxWorkers=2 from the repo root. Related: #2648 (closed — the DOM project split these two specimens land on).


Generated by Claude Code

Activity

  1. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    Contributor

    Findings triage (first grading) @ origin/main 6d01319: HOLD as finding — the searchable record is the deliverable.

    Premises verified: SchemaForm.tsx:344 carries CONDITION_FIELD_NAMES verbatim (with the /When$/ route at :356), and the heavyDomTests escape hatch plus its AGENTS.md restriction ("only for registry not-registered failures, never a flake remedy") is live at AGENTS.md:193 — so both the trap and the reason not to park files around it stand exactly as filed.

    Graded hold rather than queue: nothing user-facing, #4132/PR #4248 already routed around both specimens, and the filer's three dispositions genuinely trade off (teaching the light setup Radix costs the #2648 split its point; a no-op loader fallback in ConditionWidget changes widget behavior under test and deserves the owning lane's judgment, not a triage default). This card is the diagnostic that turns a 540s silent hang into a known shape — it earns its keep as a record today.

    Restart condition: promote to pm:queue (likely the ConditionWidget loader-fallback direction, smallest blast radius) when a third silent-hang specimen lands on either trap, or when anyone opens the dom/dom-heavy setup for another reason.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. os-zhuang commented on Aug 17, 2026

    @os-zhuang
    Contributor

    Concentrate round (state transition, no re-grade): finding → pm:on-hold, executing the standing HOLD verdict (2026-08-11): the searchable record is the deliverable; the three dispositions genuinely trade off and the ConditionWidget loader-fallback direction belongs to the owning lane's judgment, not a triage default.

    Restart-when (per the standing verdict): a third silent-hang specimen lands on either trap, or anyone opens the dom/dom-heavy setup for another reason — promote then (likely the loader-fallback direction, smallest blast radius). Trigger files: packages/app-shell/src/views/metadata-admin/SchemaForm.tsx (CONDITION_FIELD_NAMES route), the celAuthoring loader seam, and the vitest dom project config — dispatchers touching these read this card first.

    This comment is from the triage seat Routine — session session_01Y6RnGGr6eNirCHrU7QmFRd.


    Generated by Claude Code

  3. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Aug 23, 2026
  4. os-zhuang commented on Aug 23, 2026

    @os-zhuang
    Contributor

    Triage: domain:devx (lane only — pm:on-hold untouched). The defect is in the DOM test harness — two surfaces that never settle under it. Test infrastructure, so the engineering stream, even though the surfaces under test are product code.

    ⚠️ Same harness family as #5194 (await act(async …) never settling). Worth pricing together.

    Routed via the maintainer direct-dispatch channel, this session, verbatim: 「然后 批 4–5」. PM session session_0124Qg8rLvpXnQDwCmpKUmaJ. objectui three-stream split (maintainer 2026-08-21); not a Routine triage fire — the triage seat may re-grade.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    关闭 not_planned —— 维护者同意:测试环境里的卡死现象,用户看不到;关闭后仍可搜索到这条记录

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T12:40Z。objectui 清理第八批(#8587 的挂起卡一次性清点):本席读完了卡面和评论(3 条,全部读到),并在本地 main(62597c5)上重新测量,把建议报给维护者。维护者答:「第⑧批 同意」。

    本卡说的是什么

    metadata-admin 有两个界面放在轻量的 dom vitest 项目里测试时,会一直等不到完成,而且没有任何输出:一个是 Radix Sheet 宿主,另一个是 SchemaForm 把 condition 字段交给 CEL ConditionWidget 的动态加载器。这是测试环境的陷阱,产品本身没有问题。

    本席实测(本地 main 62597c5)

    • CONDITION_FIELD_NAMES 现在位于 SchemaForm.tsx:798。文件改过位置,但陷阱还在。
    • AGENTS.md 没有提到这个陷阱。
    • 首次定级 5251239218 说过,这张卡的产出就是"一条能搜到的记录"。重启条件 5316302520(出现第三个同类卡死实例,或有人改 dom / dom-heavy 的测试配置)没有发生。

    为什么关

    • 这是测试工具层面的观察,不影响用户。按北极星第 3 条,产品的 P0/P1 还没清完时,不排 p2/p3 的工具类工作。
    • 卡片的价值在于留下记录。关闭后记录仍然可以搜到,继续挂起没有额外价值。

    什么时候重开

    出现第三个同类卡死实例(测试在 dom 项目里无输出地一直等下去),或者有人着手改 dom / dom-heavy 的测试配置时。届时可以顺便把这个陷阱写进 AGENTS.md。

    标签:摘 pm:on-hold;以 not_planned 关闭。


    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

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions