aeabff6aec
CI's check:lint caught three real issues in the directive surface: - TranscriptDirectiveLeaf called the contribution's render() inline in JSX — the exact pattern no-restricted-syntax bans because the callback's hooks land in the host and a plugin reload changes the host hook count (React #310). The callback is now memoized and mounted via ContribRender. - The inline frame mirrored its height state into a ref from the message handler (the stale-read pattern no-restricted-syntax flags). Functional setState reads current state directly; the shadow refs are gone. - perfectionist import/export ordering in the frame and the SDK index.