One Attribute, One Feature
An embedded frame declares which capabilities it grants to the content inside it. The shared panel's policy allowed clipboard writing and nothing else — correct for every consumer it had.
The app being converted allowed clipboard writing and microphone access, because its embedded surface supports voice input. Adopting the shared component as written would have replaced that declaration with the shared one, and voice input would have stopped working.
Nothing about that failure announces itself. The frame renders. The panel opens. The conversation works. Text input is unaffected. One button stops doing anything, and the reason lives in an attribute nobody looks at during a component migration, because the migration is about the component.
Why the Reviews Would Have Passed
Consider what everyone would have checked. Does the build pass — yes. Do the tests pass — yes, because no test asserted on the frame's permission attribute. Does the panel look right — yes. Does the conversation still work — yes. Every question anybody would have thought to ask returns a clean answer, because every one of them is about whether the component works, and the component works.
The question that finds it is a different shape: what capabilities did the thing being replaced have that the replacement does not? That question is not asked by default, because a merge is framed as making two similar things one, and framing it that way directs attention to similarity.
The Fix, and the Rule It Left Behind
The shared component grew a permission prop so the app could pass its wider declaration, defaulting to the previous value so the other consumers were untouched. Small change, correct outcome.
What it left behind is a checklist item that generalizes past this family. Whenever a shared component is adopted in place of a bespoke one, enumerate the declarations the bespoke version carried — every attribute that grants, permits, or enables something — and confirm each survives. A later conversion in the same family did exactly this check, found its frame already carried precisely the shared default, and proceeded knowing rather than hoping.