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
Measured by the #4425 phase-1 DOM-leak sweep gate (packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx). Recorded in that gate's ledger, not fixed there — phase 1 is measurement only.
The defect
Both registrations in packages/plugin-chatbot/src/renderer.tsx destructure exactly two keys and forward everything else:
SchemaRenderer hands a registered component the authored node's own keys, the contents of its props container, and the host's trailing props. Only schema and className are removed, so all the rest becomes DOM attributes — React passes unknown lowercase attributes through in silence and stringifies object values.
Measured, through the real SDUI path
One render of a node carrying the canary set, under SchemaRendererProvider with a data-source adapter attached. Both plugin-chatbot:chatbot and plugin-chatbot:chatbot-enhanced emit the same 14 attributes:
datasource="[object Object]" is the injected adapter, not a schema key. It only appears when a host actually passes one — i.e. on a real deployment, never in a fixture that renders the widget bare. This is the same prop whose absence from a schema-only measurement shipped a six-key first pass in PR fix(plugin-dashboard): keep schema-shaped props off the KPI card DOM (#4357) #4428.
arialabel / ariadescribedby are the camelCase authored forms sitting next to the resolved aria-label / aria-describedby the renderer already emits correctly, so the element carries each ARIA value twice under two spellings, one of them meaningless to assistive technology.
plugin-chatbot:chatbot-floating is clean — its content mounts through a portal and its root does not spread onto a host element. Only the two registrations above are affected.
Not in scope of the gate that found it
#4425 phase 1 is measurement only and touches no widget source. These two targets are ledgered in the sweep with this issue as their owner, and the ledger assertion is exact set equality: fixing the leak turns the gate red until the ledger row is deleted in the same change. The row cannot outlive the defect.
Fix shape
Whatever #4425 phase 2 rules for the SDUI widget prop contract generally. If that decision lands on the toDomProps whitelist (#3291), these two call sites are covered by it and this issue closes with the ledger row. If it does not, they still need closing on their own terms — a deny-list here would have to enumerate the open tail, which is the half a deny-list cannot finish.
Measured by the #4425 phase-1 DOM-leak sweep gate (
packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx). Recorded in that gate's ledger, not fixed there — phase 1 is measurement only.The defect
Both registrations in
packages/plugin-chatbot/src/renderer.tsxdestructure exactly two keys and forward everything else:SchemaRendererhands a registered component the authored node's own keys, the contents of itspropscontainer, and the host's trailing props. OnlyschemaandclassNameare removed, so all the rest becomes DOM attributes — React passes unknown lowercase attributes through in silence and stringifies object values.Measured, through the real SDUI path
One render of a node carrying the canary set, under
SchemaRendererProviderwith a data-source adapter attached. Bothplugin-chatbot:chatbotandplugin-chatbot:chatbot-enhancedemit the same 14 attributes:Raw, from the sweep's failure output on the chatbot root element:
Two of these matter beyond tidiness:
datasource="[object Object]"is the injected adapter, not a schema key. It only appears when a host actually passes one — i.e. on a real deployment, never in a fixture that renders the widget bare. This is the same prop whose absence from a schema-only measurement shipped a six-key first pass in PR fix(plugin-dashboard): keep schema-shaped props off the KPI card DOM (#4357) #4428.arialabel/ariadescribedbyare the camelCase authored forms sitting next to the resolvedaria-label/aria-describedbythe renderer already emits correctly, so the element carries each ARIA value twice under two spellings, one of them meaningless to assistive technology.plugin-chatbot:chatbot-floatingis clean — its content mounts through a portal and its root does not spread onto a host element. Only the two registrations above are affected.Not in scope of the gate that found it
#4425 phase 1 is measurement only and touches no widget source. These two targets are ledgered in the sweep with this issue as their owner, and the ledger assertion is exact set equality: fixing the leak turns the gate red until the ledger row is deleted in the same change. The row cannot outlive the defect.
Fix shape
Whatever #4425 phase 2 rules for the SDUI widget prop contract generally. If that decision lands on the
toDomPropswhitelist (#3291), these two call sites are covered by it and this issue closes with the ledger row. If it does not, they still need closing on their own terms — a deny-list here would have to enumerate the open tail, which is the half a deny-list cannot finish.Generated by Claude Code