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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding: three element: renderers are swept by the DOM-leak gate only in their empty-state branch, so their clean reading covers the branch that never spreads #5630
Observation-class finding, recorded while widening the DOM-leak sweep in #5574 (PR #5629). Not fixed there — that card's job was reaching the family at all, and this is a depth-of-fixture gap the widening created rather than one it inherited.
The gap
packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx now sweeps all 158 registry-reachable types from packages/components/src/renderers/**. Three of them reach their readiness selector through a placeholder branch that returns before the element the renderer spreads onto is ever constructed:
target
source
what actually rendered
element:definition-list
basic/data-list.tsx:56-57
No details — items.length === 0, early return
element:repeater
basic/data-list.tsx:157
No records — the sweep's FAKE_ADAPTER answers with no rows by design
element:metadata_viewer
basic/metadata-viewer.tsx:100
the amber not-found placeholder — the canary node names no resolvable metadata
All three currently read clean, and PR #5629 records that reading as covering the placeholder branch only (READY_OVERRIDE_REASONS in that file, pinned two-way so the list cannot grow quietly).
Why it matters, and why it is not urgent
This is the trap-1 shape from that file's own docblock — "a lazy boundary answers with a skeleton" — in a different dress. A clean reading taken off a branch that structurally cannot spread says nothing about the branch that can. It is a phantom clean in waiting: not currently misleading anyone, because it is written down, but it is exactly the reading that would be misread as "these three converged" once the surrounding rows start disappearing.
Of the 16 phantom cleans that widening surfaced, 12 were removed by authoring a schema and 4 by adding a SidebarProvider host. These three are the residue: they need data, not schema, and FAKE_ADAPTER returning empty is load-bearing elsewhere in the file (it is what keeps every data-bound target on its real render path rather than an error state).
Suggested shape
Author items for element:definition-list (pure schema — no adapter involved, so this one is cheap). For element:repeater and element:metadata_viewer, either a per-target adapter override on Target, or a data-bearing fixture adapter used only by the targets that declare it. Re-measure the three; if a leak appears, it is a new ledger row rather than a new gate.
Whoever picks this up should confirm the leak set from a real render before changing any row — the whole discipline of that file is that a row records a measurement, never a prediction.
Concentration-round first-touch (triage seat): promoted finding → pm:queue, Task S. Closes the three recorded phantom-cleans-in-waiting: author items for element:definition-list (cheap, pure schema), and a per-target adapter override / data-bearing fixture for element:repeater + element:metadata_viewer — keeping FAKE_ADAPTER's empty answer load-bearing for everyone else, as the card requires. Discipline stands: re-measure, and a leak found is a new ledger row recording a measurement, never a predicted one; READY_OVERRIDE_REASONS shrinks by three in the same change (its two-way pin will insist). Sequencing: inside the #5632 burn-down family — the ui seat may fold this into the ledger campaign's first batch per the five gates, or land it first as the fixture-depth prerequisite.
Dispatching to a dev this round (R24). Sequencing answered at claim time: landed first, as the fixture-depth prerequisite — not folded into the #5632 ledger campaign. ⛔ Triage's discipline is binding: re-measure, and a leak found is a NEW ledger row recording a measurement, never a predicted one; READY_OVERRIDE_REASONS shrinks by exactly three in the same change and its two-way pin will insist.
{
"issue": 5630,
"status": "done",
"branch": "claude/issue-5630-dom-leak-fixture-depth",
"pr": "https://github.com/objectstack-ai/objectui/pull/5787",
"premise_still_valid": true,
"summary": "Deepened all three placeholder-branch fixtures in widget-dom-leak-sweep.test.tsx: element:definition-list authors items (pure schema); element:repeater and element:metadata_viewer each get a new per-target React host (AdapterCtx.Provider / MetadataCtx.Provider) so they reach real populated markup instead of the empty-state placeholder. FAKE_ADAPTER stays load-bearing and unchanged for the other 155 targets. Two measurements corrected assumptions made at dispatch time rather than confirming them: (1) element:repeater's mechanism is not 'FAKE_ADAPTER answers empty' -- useAdapter() reads a separate AdapterCtx that this sweep never wired at all, so the renderer never even called .find() on any fixture; (2) READY_OVERRIDE_REASONS shrinks by TWO (6 to 4), not the predicted three -- element:metadata_viewer's Shell wrapper hardcodes its className in every branch (no fixture depth reaches it), so its override entry is rewritten, not deleted. All three renderers read CLEAN in the populated branch (no LEAK_LEDGER rows added; traced -- neither renderer file spreads the props bag onto any DOM element in any branch), and reverse-verification (a deliberately planted leak on each newly-reached host element) confirmed the deepened fixtures actually catch a leak the old placeholder-only fixture structurally could not reach, then was reverted uncommitted before the real fix was committed.",
"tests": "pnpm exec vitest run packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx -> Test Files 1 passed (1), Tests 200 passed (200), at 94d9cb4df (PR head). Reverse-verification run (temporary zzinjectedleak attribute planted on the dl, ul and Shell wrapper div elements in basic/data-list.tsx and basic/metadata-viewer.tsx, confirmed present on disk via grep -c before running): exactly the 3 deepened targets went RED (e.g. 'element:definition-list leaked 1 non-DOM attribute(s): the dl element leaked zzinjectedleak=...', same shape for element:repeater's ul and element:metadata_viewer's Shell div), 197 others stayed green; mutation reverted via git checkout on the two source paths (uncommitted, both files otherwise clean) before building the real fix. pnpm --filter @object-ui/app-shell type-check: clean, after building the package's full dependency closure (pnpm --workspace-concurrency=4 --filter '@object-ui/app-shell^...' build, 29 packages, all succeeded) -- tsconfig.test.json deliberately resolves @object-ui/* through built .d.ts, so the check is meaningless without that build. pnpm exec eslint packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx --no-inline-config: clean. node scripts/check-control-bytes.mjs: clean (repo-native gate, scans all tracked files). node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs: clean, empty-frontmatter changeset added (test-only, no release).",
"open_questions": [],
"out_of_scope_findings": []
}
{
"issue": 5630,
"status": "done",
"branch": "claude/issue-5630-dom-leak-fixture-depth",
"pr": "https://github.com/objectstack-ai/objectui/pull/5787",
"premise_still_valid": true,
"summary": "Deepened all three placeholder-branch fixtures in widget-dom-leak-sweep.test.tsx: element:definition-list authors items (pure schema); element:repeater and element:metadata_viewer each get a new per-target React host (AdapterCtx.Provider / MetadataCtx.Provider) so they reach real populated markup instead of the empty-state placeholder. FAKE_ADAPTER stays load-bearing and unchanged for the other 155 targets. Two measurements corrected assumptions made at dispatch time rather than confirming them: (1) element:repeater's mechanism is not 'FAKE_ADAPTER answers empty' -- useAdapter() reads a separate AdapterCtx that this sweep never wired at all, so the renderer never even called .find() on any fixture; (2) READY_OVERRIDE_REASONS shrinks by TWO (6 to 4), not the predicted three -- element:metadata_viewer's Shell wrapper hardcodes its className in every branch (no fixture depth reaches it), so its override entry is rewritten, not deleted. All three renderers read CLEAN in the populated branch (no LEAK_LEDGER rows added; traced -- neither renderer file spreads the props bag onto any DOM element in any branch), and reverse-verification (a deliberately planted leak on each newly-reached host element) confirmed the deepened fixtures actually catch a leak the old placeholder-only fixture structurally could not reach, then was reverted uncommitted before the real fix was committed.",
"tests": "pnpm exec vitest run packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx -> Test Files 1 passed (1), Tests 200 passed (200), at 94d9cb4df (PR head). Reverse-verification run (temporary zzinjectedleak attribute planted on the dl, ul and Shell wrapper div elements in basic/data-list.tsx and basic/metadata-viewer.tsx, confirmed present on disk via grep -c before running): exactly the 3 deepened targets went RED (e.g. 'element:definition-list leaked 1 non-DOM attribute(s): the dl element leaked zzinjectedleak=...', same shape for element:repeater's ul and element:metadata_viewer's Shell div), 197 others stayed green; mutation reverted via git checkout on the two source paths (uncommitted, both files otherwise clean) before building the real fix. pnpm --filter @object-ui/app-shell type-check: clean, after building the package's full dependency closure (pnpm --workspace-concurrency=4 --filter '@object-ui/app-shell^...' build, 29 packages, all succeeded) -- tsconfig.test.json deliberately resolves @object-ui/* through built .d.ts, so the check is meaningless without that build. pnpm exec eslint packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx --no-inline-config: clean. node scripts/check-control-bytes.mjs: clean (repo-native gate, scans all tracked files). node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs: clean, empty-frontmatter changeset added (test-only, no release).",
"open_questions": [],
"out_of_scope_findings": []
}
(Superseding the previous comment on this issue, whose leading marker was mis-escaped by me and never rendered as the literal <!-- os-dev-report --> tag. This comment is the authoritative report.)
{
"issue": 5630,
"status": "done",
"branch": "claude/issue-5630-dom-leak-fixture-depth",
"pr": "https://github.com/objectstack-ai/objectui/pull/5787",
"premise_still_valid": true,
"summary": "Deepened all three placeholder-branch fixtures in widget-dom-leak-sweep.test.tsx: element:definition-list authors items (pure schema); element:repeater and element:metadata_viewer each get a new per-target React host (AdapterCtx.Provider / MetadataCtx.Provider) so they reach real populated markup instead of the empty-state placeholder. FAKE_ADAPTER stays load-bearing and unchanged for the other 155 targets. Two measurements corrected assumptions made at dispatch time rather than confirming them: (1) element:repeater's mechanism is not 'FAKE_ADAPTER answers empty' -- useAdapter() reads a separate AdapterCtx that this sweep never wired at all, so the renderer never even called .find() on any fixture; (2) READY_OVERRIDE_REASONS shrinks by TWO (6 to 4), not the predicted three -- element:metadata_viewer's Shell wrapper hardcodes its className in every branch (no fixture depth reaches it), so its override entry is rewritten, not deleted. All three renderers read CLEAN in the populated branch (no LEAK_LEDGER rows added; traced -- neither renderer file spreads the props bag onto any DOM element in any branch), and reverse-verification (a deliberately planted leak on each newly-reached host element) confirmed the deepened fixtures actually catch a leak the old placeholder-only fixture structurally could not reach, then was reverted uncommitted before the real fix was committed.",
"tests": "pnpm exec vitest run packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx -> Test Files 1 passed (1), Tests 200 passed (200), at 94d9cb4df (PR head). Reverse-verification run (temporary zzinjectedleak attribute planted on the dl, ul and Shell wrapper div elements in basic/data-list.tsx and basic/metadata-viewer.tsx, confirmed present on disk via grep -c before running): exactly the 3 deepened targets went RED (e.g. 'element:definition-list leaked 1 non-DOM attribute(s): the dl element leaked zzinjectedleak=...', same shape for element:repeater's ul and element:metadata_viewer's Shell div), 197 others stayed green; mutation reverted via git checkout on the two source paths (uncommitted, both files otherwise clean) before building the real fix. pnpm --filter @object-ui/app-shell type-check: clean, after building the package's full dependency closure (pnpm --workspace-concurrency=4 --filter '@object-ui/app-shell^...' build, 29 packages, all succeeded) -- tsconfig.test.json deliberately resolves @object-ui/* through built .d.ts, so the check is meaningless without that build. pnpm exec eslint packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx --no-inline-config: clean. node scripts/check-control-bytes.mjs: clean (repo-native gate, scans all tracked files). node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs: clean, empty-frontmatter changeset added (test-only, no release).",
"open_questions": [],
"out_of_scope_findings": []
}
(Third attempt: the HTML-comment marker form does not survive this repo's body sanitizer at all -- confirmed empty on read-back twice, once mis-escaped by me and once posted raw. Per AGENTS.md's byte discipline, falling back to the literal-text marker above. This comment is the authoritative report; the two before it on this issue can be disregarded.)
Activity
huangyiirene commentedon Aug 22, 2026
Concentration-round first-touch (triage seat): promoted
finding→pm:queue, Task S. Closes the three recorded phantom-cleans-in-waiting: authoritemsforelement:definition-list(cheap, pure schema), and a per-target adapter override / data-bearing fixture forelement:repeater+element:metadata_viewer— keepingFAKE_ADAPTER's empty answer load-bearing for everyone else, as the card requires. Discipline stands: re-measure, and a leak found is a new ledger row recording a measurement, never a predicted one;READY_OVERRIDE_REASONSshrinks by three in the same change (its two-way pin will insist). Sequencing: inside the #5632 burn-down family — the ui seat may fold this into the ledger campaign's first batch per the five gates, or land it first as the fixture-depth prerequisite.Generated by Claude Code
claude commentedon Aug 23, 2026
Claim —
domain:uiexecution seat.session_01EuPCi56cnGyykygi3z9w4mclaude/issue-5630-dom-leak-fixture-depthDispatching to a dev this round (R24). Sequencing answered at claim time: landed first, as the fixture-depth prerequisite — not folded into the #5632 ledger campaign. ⛔ Triage's discipline is binding: re-measure, and a leak found is a NEW ledger row recording a measurement, never a predicted one;
READY_OVERRIDE_REASONSshrinks by exactly three in the same change and its two-way pin will insist.Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
<!-- os-dev-report -->
{ "issue": 5630, "status": "done", "branch": "claude/issue-5630-dom-leak-fixture-depth", "pr": "https://github.com/objectstack-ai/objectui/pull/5787", "premise_still_valid": true, "summary": "Deepened all three placeholder-branch fixtures in widget-dom-leak-sweep.test.tsx: element:definition-list authors items (pure schema); element:repeater and element:metadata_viewer each get a new per-target React host (AdapterCtx.Provider / MetadataCtx.Provider) so they reach real populated markup instead of the empty-state placeholder. FAKE_ADAPTER stays load-bearing and unchanged for the other 155 targets. Two measurements corrected assumptions made at dispatch time rather than confirming them: (1) element:repeater's mechanism is not 'FAKE_ADAPTER answers empty' -- useAdapter() reads a separate AdapterCtx that this sweep never wired at all, so the renderer never even called .find() on any fixture; (2) READY_OVERRIDE_REASONS shrinks by TWO (6 to 4), not the predicted three -- element:metadata_viewer's Shell wrapper hardcodes its className in every branch (no fixture depth reaches it), so its override entry is rewritten, not deleted. All three renderers read CLEAN in the populated branch (no LEAK_LEDGER rows added; traced -- neither renderer file spreads the props bag onto any DOM element in any branch), and reverse-verification (a deliberately planted leak on each newly-reached host element) confirmed the deepened fixtures actually catch a leak the old placeholder-only fixture structurally could not reach, then was reverted uncommitted before the real fix was committed.", "tests": "pnpm exec vitest run packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx -> Test Files 1 passed (1), Tests 200 passed (200), at 94d9cb4df (PR head). Reverse-verification run (temporary zzinjectedleak attribute planted on the dl, ul and Shell wrapper div elements in basic/data-list.tsx and basic/metadata-viewer.tsx, confirmed present on disk via grep -c before running): exactly the 3 deepened targets went RED (e.g. 'element:definition-list leaked 1 non-DOM attribute(s): the dl element leaked zzinjectedleak=...', same shape for element:repeater's ul and element:metadata_viewer's Shell div), 197 others stayed green; mutation reverted via git checkout on the two source paths (uncommitted, both files otherwise clean) before building the real fix. pnpm --filter @object-ui/app-shell type-check: clean, after building the package's full dependency closure (pnpm --workspace-concurrency=4 --filter '@object-ui/app-shell^...' build, 29 packages, all succeeded) -- tsconfig.test.json deliberately resolves @object-ui/* through built .d.ts, so the check is meaningless without that build. pnpm exec eslint packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx --no-inline-config: clean. node scripts/check-control-bytes.mjs: clean (repo-native gate, scans all tracked files). node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs: clean, empty-frontmatter changeset added (test-only, no release).", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
{ "issue": 5630, "status": "done", "branch": "claude/issue-5630-dom-leak-fixture-depth", "pr": "https://github.com/objectstack-ai/objectui/pull/5787", "premise_still_valid": true, "summary": "Deepened all three placeholder-branch fixtures in widget-dom-leak-sweep.test.tsx: element:definition-list authors items (pure schema); element:repeater and element:metadata_viewer each get a new per-target React host (AdapterCtx.Provider / MetadataCtx.Provider) so they reach real populated markup instead of the empty-state placeholder. FAKE_ADAPTER stays load-bearing and unchanged for the other 155 targets. Two measurements corrected assumptions made at dispatch time rather than confirming them: (1) element:repeater's mechanism is not 'FAKE_ADAPTER answers empty' -- useAdapter() reads a separate AdapterCtx that this sweep never wired at all, so the renderer never even called .find() on any fixture; (2) READY_OVERRIDE_REASONS shrinks by TWO (6 to 4), not the predicted three -- element:metadata_viewer's Shell wrapper hardcodes its className in every branch (no fixture depth reaches it), so its override entry is rewritten, not deleted. All three renderers read CLEAN in the populated branch (no LEAK_LEDGER rows added; traced -- neither renderer file spreads the props bag onto any DOM element in any branch), and reverse-verification (a deliberately planted leak on each newly-reached host element) confirmed the deepened fixtures actually catch a leak the old placeholder-only fixture structurally could not reach, then was reverted uncommitted before the real fix was committed.", "tests": "pnpm exec vitest run packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx -> Test Files 1 passed (1), Tests 200 passed (200), at 94d9cb4df (PR head). Reverse-verification run (temporary zzinjectedleak attribute planted on the dl, ul and Shell wrapper div elements in basic/data-list.tsx and basic/metadata-viewer.tsx, confirmed present on disk via grep -c before running): exactly the 3 deepened targets went RED (e.g. 'element:definition-list leaked 1 non-DOM attribute(s): the dl element leaked zzinjectedleak=...', same shape for element:repeater's ul and element:metadata_viewer's Shell div), 197 others stayed green; mutation reverted via git checkout on the two source paths (uncommitted, both files otherwise clean) before building the real fix. pnpm --filter @object-ui/app-shell type-check: clean, after building the package's full dependency closure (pnpm --workspace-concurrency=4 --filter '@object-ui/app-shell^...' build, 29 packages, all succeeded) -- tsconfig.test.json deliberately resolves @object-ui/* through built .d.ts, so the check is meaningless without that build. pnpm exec eslint packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx --no-inline-config: clean. node scripts/check-control-bytes.mjs: clean (repo-native gate, scans all tracked files). node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs: clean, empty-frontmatter changeset added (test-only, no release).", "open_questions": [], "out_of_scope_findings": [] }(Superseding the previous comment on this issue, whose leading marker was mis-escaped by me and never rendered as the literal
<!-- os-dev-report -->tag. This comment is the authoritative report.)Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
os-dev-report
{ "issue": 5630, "status": "done", "branch": "claude/issue-5630-dom-leak-fixture-depth", "pr": "https://github.com/objectstack-ai/objectui/pull/5787", "premise_still_valid": true, "summary": "Deepened all three placeholder-branch fixtures in widget-dom-leak-sweep.test.tsx: element:definition-list authors items (pure schema); element:repeater and element:metadata_viewer each get a new per-target React host (AdapterCtx.Provider / MetadataCtx.Provider) so they reach real populated markup instead of the empty-state placeholder. FAKE_ADAPTER stays load-bearing and unchanged for the other 155 targets. Two measurements corrected assumptions made at dispatch time rather than confirming them: (1) element:repeater's mechanism is not 'FAKE_ADAPTER answers empty' -- useAdapter() reads a separate AdapterCtx that this sweep never wired at all, so the renderer never even called .find() on any fixture; (2) READY_OVERRIDE_REASONS shrinks by TWO (6 to 4), not the predicted three -- element:metadata_viewer's Shell wrapper hardcodes its className in every branch (no fixture depth reaches it), so its override entry is rewritten, not deleted. All three renderers read CLEAN in the populated branch (no LEAK_LEDGER rows added; traced -- neither renderer file spreads the props bag onto any DOM element in any branch), and reverse-verification (a deliberately planted leak on each newly-reached host element) confirmed the deepened fixtures actually catch a leak the old placeholder-only fixture structurally could not reach, then was reverted uncommitted before the real fix was committed.", "tests": "pnpm exec vitest run packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx -> Test Files 1 passed (1), Tests 200 passed (200), at 94d9cb4df (PR head). Reverse-verification run (temporary zzinjectedleak attribute planted on the dl, ul and Shell wrapper div elements in basic/data-list.tsx and basic/metadata-viewer.tsx, confirmed present on disk via grep -c before running): exactly the 3 deepened targets went RED (e.g. 'element:definition-list leaked 1 non-DOM attribute(s): the dl element leaked zzinjectedleak=...', same shape for element:repeater's ul and element:metadata_viewer's Shell div), 197 others stayed green; mutation reverted via git checkout on the two source paths (uncommitted, both files otherwise clean) before building the real fix. pnpm --filter @object-ui/app-shell type-check: clean, after building the package's full dependency closure (pnpm --workspace-concurrency=4 --filter '@object-ui/app-shell^...' build, 29 packages, all succeeded) -- tsconfig.test.json deliberately resolves @object-ui/* through built .d.ts, so the check is meaningless without that build. pnpm exec eslint packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx --no-inline-config: clean. node scripts/check-control-bytes.mjs: clean (repo-native gate, scans all tracked files). node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs: clean, empty-frontmatter changeset added (test-only, no release).", "open_questions": [], "out_of_scope_findings": [] }(Third attempt: the HTML-comment marker form does not survive this repo's body sanitizer at all -- confirmed empty on read-back twice, once mis-escaped by me and once posted raw. Per AGENTS.md's byte discipline, falling back to the literal-text marker above. This comment is the authoritative report; the two before it on this issue can be disregarded.)
Generated by Claude Code