Repository navigation
metadata-admin DOM tests: two surfaces that never settle under the light dom project, with no diagnostic #4249
Description
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:
- leave as-is and let this issue be the searchable record;
- teach the light setup enough for Radix Dialog/Sheet to settle (has a cost — the
dom/dom-heavysplit in perf(test): make the DOM projects hermetic so they can run isolate:false (~3-4x suite speedup) #2648 exists precisely to keep heavy graphs out of ~290 files); - have
ConditionWidgetno-op its loader when no loader is registered, so a fixture that namesconditiondegrades to a plain input in tests instead of hanging.
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
os-zhuang commentedon Aug 11, 2026
Findings triage (first grading) @
origin/main6d01319: HOLD asfinding— the searchable record is the deliverable.Premises verified:
SchemaForm.tsx:344carriesCONDITION_FIELD_NAMESverbatim (with the/When$/route at:356), and theheavyDomTestsescape hatch plus its AGENTS.md restriction ("only for registry not-registered failures, never a flake remedy") is live atAGENTS.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
ConditionWidgetchanges 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 theConditionWidgetloader-fallback direction, smallest blast radius) when a third silent-hang specimen lands on either trap, or when anyone opens thedom/dom-heavysetup for another reason.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
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 theConditionWidgetloader-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-heavysetup 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_NAMESroute), thecelAuthoringloader seam, and the vitestdomproject config — dispatchers touching these read this card first.This comment is from the triage seat Routine — session
session_01Y6RnGGr6eNirCHrU7QmFRd.Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
Triage:
domain:devx(lane only —pm:on-holduntouched). 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.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
objectstack-fleet commentedon Sep 24, 2026
关闭
not_planned—— 维护者同意:测试环境里的卡死现象,用户看不到;关闭后仍可搜索到这条记录分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T12:40Z。objectui 清理第八批(#8587 的挂起卡一次性清点):本席读完了卡面和评论(3 条,全部读到),并在本地 main(62597c5)上重新测量,把建议报给维护者。维护者答:「第⑧批 同意」。本卡说的是什么
metadata-admin 有两个界面放在轻量的
domvitest 项目里测试时,会一直等不到完成,而且没有任何输出:一个是 Radix Sheet 宿主,另一个是 SchemaForm 把condition字段交给 CEL ConditionWidget 的动态加载器。这是测试环境的陷阱,产品本身没有问题。本席实测(本地 main
62597c5)CONDITION_FIELD_NAMES现在位于SchemaForm.tsx:798。文件改过位置,但陷阱还在。AGENTS.md没有提到这个陷阱。5251239218说过,这张卡的产出就是"一条能搜到的记录"。重启条件5316302520(出现第三个同类卡死实例,或有人改dom/dom-heavy的测试配置)没有发生。为什么关
什么时候重开
出现第三个同类卡死实例(测试在
dom项目里无输出地一直等下去),或者有人着手改dom/dom-heavy的测试配置时。届时可以顺便把这个陷阱写进AGENTS.md。标签:摘
pm:on-hold;以not_planned关闭。Generated by Claude Code