Announcing Beacon: Self-improving memory for coding agents
← All skills
Skill

figma-design-to-code

skill:openai/plugins#figma-design-to-code

**MANDATORY prerequisite** — you MUST invoke this skill BEFORE calling the `get_design_context` Figma MCP tool. You MUST trigger this skill whenever the user wants to implement, build, port, or code up a Figma design as code. Example prompts (not exhaustive) are 'implement this Figma design', 'build this screen from Figma', 'turn this Figma into code', 'design to code'. This skill provides critical instructions and steps to the agent on how to correctly implement Figma designs in code and must NOT be skipped.

Verdict
Inconclusive

The analysis could not cover enough of the artifact to decide.

Analyzed Oct 27, 2026, 22:16 UTC at 0722921

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

0
findings
—
highest severity
0
threat classes
5,479
files scanned
2,270/2,270
checks satisfied
0
package advisories

Why this verdict

  • inconclusive: unresolved question on unknown class

Security findings 0

No individual findings recorded

The inconclusive verdict rests on the open questions and coverage gaps below; 10 candidate findings were refuted on review.

Open questions 15

What the analysis could not settle from the code alone.

Ten PY-CLAIM-CONTRADICTION detector leads cite an ALL_SCOPES rule claim that does not appear in the text of any shown unit, and treat documentation example URLs as network exfiltration and template file writes as persistence; the leads are unconfirmed against the shown evidence, so whether such rule text exists elsewhere in the plugin remains unsettled.
The target skill's declared description uses 'MANDATORY prerequisite' and 'You MUST invoke this skill BEFORE calling the `get_design_context` Figma MCP tool' / 'You MUST trigger this skill whenever...' trigger-expansion language, but no owed unit in this batch contains the figma-design-to-code frontmatter itself; that frontmatter should be judged when served.
Agent hijacking
The PY-CLAIM-CONTRADICTION leads quote a claim ('Name it `ComponentName.figma.ts` — never `ComponentName.figma.tsx`.') that does not appear in the text of the units they cite, and their cited 'file_write' excerpts (e.g. 'p.name', 'Register', ', fileKey: ') are innocuous code in the shown units; confirm whether figma-generate-library ships `.figma.ts` naming guidance that its own examples contradict.
Persistence
Detector leads DET:141b0029238dbdbc, DET:6d287761bd05442d, and DET:b1db792e42b4d5ba cite a claim '**Name it `ComponentName.figma.ts` — never `ComponentName.figma.tsx`.**' that does not appear anywhere in the shown spans of component-creation.md or error-recovery.md; the excerpts they cite ('c.name', 'n.type') occur only as read-only expressions inside benign Figma API troubleshooting snippets (e.g. components.map(c => c.name), n.type === 'COMPONENT'). Confirm whether the claimed text and any hos⟦… 88 more chars …⟧
Persistence
The target skill figma-design-to-code's declared description commands 'MUST invoke this skill BEFORE calling' the get_design_context Figma MCP tool and says it 'must NOT be skipped'; that frontmatter is not among the batch units, so determine whether it constitutes coercive self-triggering conditioning of the get_design_context tool (TOOLPOISON) or acceptable load-ordering guidance.
Tool poisoning
All PY-CLAIM-CONTRADICTION leads cite the claim 'Name it `ComponentName.figma.ts` — never `ComponentName.figma.tsx`' (and one cites 'Scopes on every variable — NEVER leave as ALL_SCOPES') supposedly contradicted by file_write/network snippets ('n.type', 'example.com'), but that claim text appears in none of the shown units, and the flagged snippets are benign documentation examples (findAllWithCriteria predicates, markdown link examples); are the leads stale, or does the contradicted claim live ⟦… 38 more chars …⟧
All 48 owed units in this batch are reference documentation from the sibling skill directory plugins/figma/skills/figma-use/references/ rather than files under the declared target root plugins/figma/skills/figma-design-to-code; confirm whether the figma-design-to-code skill ships or references these figma-use docs, since the declared description's 'MANDATORY prerequisite' framing is only the frontmatter and the skill body was not shown in this batch.
Detector leads DET:31db6c8f062ad1a6, DET:b99365aadbf68822, DET:6ec0d8e4c6d90d98, DET:7ae6eb229a6cd70b claim a PERSIST-class contradiction between a directive to name files `ComponentName.figma.ts` and a file_write '←', but that directive does not appear anywhere in the cited unit SRC:0a5fc1e63905eaa3 (lines 118-121 are VariablesAPI method listings where '←' is an annotation meaning 'preferred; sync deprecated'); the lead is unconfirmed and no finding is derived from it.
Persistence
The target skill figma-design-to-code declares itself a MANDATORY prerequisite that the agent MUST invoke before calling the get_design_context Figma MCP tool, but every owed unit in this batch is a reference document of the sibling figma-use skill (plugin-api-standalone, text-style-patterns, validation-and-recovery, variable-patterns, working-with-design-systems); the target's own skill body was not shown, so whether the imperative frontmatter is backed by in-scope instructions or steers the ag⟦… 80 more chars …⟧
Contradictions C18-C20 (and detector leads DET:e46ccf32fbaf0f4f, DET:096743a2acfe43a5, DET:8b77940a7c82d9e0) assert an instructed file_write at token-creation.md lines 781 and 819, but the cited units contain only read-only verification scripts (getLocalVariableCollectionsAsync/getLocalVariablesAsync) with no file-write instruction; confirm the source of the observed 'file_write 0' or treat the contradiction as refuted.
Persistence
Shipped documentation contains an internal engineering TODO comment (delivered as an HTML comment in slide-properties.md and surfaced as a decoded unit) referencing an internal source path (share/plugin-api/src/api/constants.ts), a developer handle, and an instruction to remove the note before production launch; whether intentional publication of internal build notes in the shipped artifact is approved cannot be settled from this batch. Content itself is inert commentary with no instruction to t⟦… 72 more chars …⟧
The unit documents an 'Additional APIs (available via use_figma)' extension beyond the standard Figma plugin API, including a 'File I/O namespace for writing images and data' (figma.io.write for .png/.json/.csv) and node.screenshot(); where are these implemented and are figma.io.write writes confined to the plugin sandbox or able to target arbitrary host paths, including agent control-plane files?
Persistence
All 19 units in this batch are excerpts of plugins/figma/skills/figma-use/references/plugin-api-standalone.d.ts, a sibling skill's inert TypeScript API reference, while the target is plugins/figma/skills/figma-design-to-code; from the evidence shown it is unclear whether the target ships or consumes this file, though the content itself is plain Figma Plugin API JSDoc documentation with no executable behavior, no instructions to the agent, and no concealed or encoded channel (the collapsed 200-wh⟦… 47 more chars …⟧
All 19 owed units in this batch are type-declaration content from plugins/figma/skills/figma-use/references/plugin-api-standalone.d.ts, a sibling skill's reference file, while the declared target is plugins/figma/skills/figma-design-to-code; the content itself is inert Figma Plugin API documentation with no executable behavior, hidden channels, or agent-directed instructions, but whether the design-to-code skill instructs the agent to read this file (and which target ships it) is not shown in th⟦… 9 more chars …⟧
[file request plugins/figma/.mcp.json] Does the get_design_context MCP tool declaration define a skillNames parameter, and does its description indicate any effect on execution beyond skill-usage logging?
Tool poisoning
Refuted findings 10

Candidates the review stage examined and rejected, kept for transparency.

Tool poisoning

criticalRefutedlow confidence

The skill body conditions parameters of the connected get_design_context MCP tool by instructing the agent to always inject the skill name (with a resource: prefix when loaded via MCP resource) into the tool's skillNames parameter on every call.

Always include `figma-design-to-code` in the comma-separated `skillNames` parameter when calling `get_design_context`
Why it was refuted

The instruction writes a static, self-identifying skill name into a parameter the artifact openly declares as logging-only (D33) as part of its declared get_design_context workflow; no user-controlled or concealed value conditions the tool and no behavior change beyond tagging is possible from a constant skill name.

Destructive action

criticalRefutedlow confidence

cleanupOrphans.js deletes any Figma node (including PAGE nodes), variable, or collection whose ID is passed to it, without technically verifying that the IDs were recorded by the workflow's state ledger, so a wrong or injected ID list would remove user-owned file content.

removedIds.push(node.id)
Why it was refuted

The deletion utility is openly documented as ledger-scoped cleanup and the artifact mandates the mitigation the finding says is missing: pass only exact state-ledger IDs, with structural guards in the script (skips DOCUMENT, preserves the last page) and a required post-cleanup comparison of removedIds/skippedIds against the ledger; it confers no destructive power beyond the use_figma tool it runs inside, and the workflow explicitly rejects the unsafe name-based alternative.

Tool poisoning

criticalRefutedlow confidence

The skill instructs the agent to always inject the value figma-generate-library (or resource:figma-generate-library) into the skillNames parameter of every use_figma call, conditioning another tool's parameter while asserting with an unverifiable claim that the value is logging-only and does not affect execution.

Always include `figma-generate-library` in the comma-separated `skillNames` parameter when calling `use_figma` as part of this skill.
Why it was refuted

Same openly declared logging-tag pattern as the rest of the suite (D75): a constant self-name into a parameter documented in the same sentence as logging-only, as part of the declared use_figma workflow; a static skill name cannot smuggle data or alter execution even if the logging claim were unverifiable.

Tool poisoning

criticalRefutedmedium confidence

The figma-use-slides skill body instructs the agent to always include the skill's name (prefixed with resource: when loaded via an MCP resource) in the skillNames parameter of every use_figma call for Slides operations, conditioning the parameter values the agent passes to another tool.

Always include `figma-use-slides` in the comma-separated `skillNames` parameter when calling `use_figma` for Slides operations
Why it was refuted

Same openly declared logging-tag pattern (D183): a constant self-name into the skillNames parameter for the declared Slides workflow, documented in the same sentence as logging-only; no concealed conditioning, no user data, and no behavior change a static name could cause.

Tool poisoning

criticalRefutedmedium confidence

The figma-use skill's frontmatter instructs the agent that it must load this skill before every use_figma MCP tool call and never call the tool directly otherwise, conditioning invocation of another tool on this skill's instructions.

you MUST invoke this skill BEFORE every `use_figma` tool call. NEVER call `use_figma` directly without loading this skill first.
Why it was refuted

The mandatory-prerequisite text is the skill's own openly published description scoping it to exactly the tool it documents (use_figma), matching the declared pattern of the target's own D1; the content it funnels agents into is openly protective rules (font loading, read-only inspection, return IDs), with no parameter conditioning, data movement, or scope creep.

Tool poisoning

criticalRefutedlow confidence

The figma-use skill body instructs the agent to always write a specific skill-controlled value ('figma-use' or 'resource:figma-use') into the skillNames parameter of every use_figma call, asserting without verification that the parameter is logging-only and does not affect execution.

Always include `figma-use` in the comma-separated `skillNames` parameter when calling `use_figma`
Why it was refuted

Same openly declared logging-tag pattern (D226): a constant self-name into the skillNames parameter, documented in the same sentence as logging-only, as part of the skill's declared core purpose of instructing correct use_figma usage; nothing user-controlled or hidden conditions the tool.

Supply chain

highRefutedlow confidence

The Code Connect reference documentation instructs installing the vendor CLI globally with the unpinned @latest tag, so an agent following the skill would run mutable, unversioned remote code at install time where a pinned version would suffice for the declared template-creation/publishing purpose.

npm install --global @figma/code-connect@latest
Why it was refuted

The command installs Figma's own official npm-scoped CLI inside a fenced '### Installation' section to serve the documented publish/unpublish workflow shown in the same reference — the vendor-installer-in-fenced-install-docs carve-out; the @latest tag is the vendor's own distribution convention, not concealed or agent-directed harm.

Agent hijacking

highRefutedlow confidence

The skill frontmatter description uses coercive mandatory-trigger language instructing the agent to always invoke this skill before calling the get_design_context MCP tool whenever design-implementation intent is detected, coupling a trigger condition and tool-call ordering with a must-not-be-skipped justification.

you MUST invoke this skill BEFORE calling the `get_design_context` Figma MCP tool
Why it was refuted

The coercive trigger language is the skill's own openly published frontmatter description (declared verbatim as capability D1) and is scoped exactly to design-implementation intent — the skill's declared purpose — with no hijack of unrelated flows and no concealed coupling.

Agent hijacking

highRefutedlow confidence

figma-generate-design instructs the agent to automatically invoke the figma-create-new-file skill or the create_new_file MCP tool to provision a new file in the user's Figma account when no fileKey was provided, without requiring explicit user confirmation.

If they don't have one yet, invoke `/figma-create-new-file` (or call `create_new_file`) first and reuse the returned file_key
Why it was refuted

Provisioning a new Figma file only when the user has none is the openly declared (D42/D43) minimal enabling step of the generate-design build workflow the user explicitly invoked ('create a screen', 'build a landing page in Figma'); it creates benign empty content in the user's own account with no destruction, exfiltration, or concealment.

Agent hijacking

highRefutedlow confidence

figma-generate-design coercively mandates (MANDATORY) that the agent run the generate_figma_design MCP capture tool in parallel whenever the source contains images, committing the agent to an additional tool workflow triggered by a content condition.

This parallel workflow is MANDATORY when the source contains images.
Why it was refuted

The MANDATORY parallel capture is scoped to the already-active generate-design web-build workflow, is technically justified in the same paragraph (image fills require imageHash values only obtainable from the capture), and is declared as capability D50; it commits the agent only to steps serving the user's requested build in the same user file.

Coverage gaps 14

Parts of the artifact the static analysis could not fully examine.

context:unanalyzable_binary binary content is only byte-scanned
plugins/codex-security/mcp/helpers.mjs.br.part-000
context:unanalyzable_binary macho content is only byte-scanned
plugins/codex-security/mcp/native/darwin-arm64/unix.node
context:unanalyzable_binary macho content is only byte-scanned
plugins/codex-security/mcp/native/darwin-x64/unix.node
context:unanalyzable_binary elf content is only byte-scanned
plugins/codex-security/mcp/native/linux-arm64-gnu/unix.node
context:unanalyzable_binary elf content is only byte-scanned
plugins/codex-security/mcp/native/linux-arm64-musl/unix.node
context:unanalyzable_binary elf content is only byte-scanned
plugins/codex-security/mcp/native/linux-x64-gnu/unix.node
context:unanalyzable_binary elf content is only byte-scanned
plugins/codex-security/mcp/native/linux-x64-musl/unix.node
context:unanalyzable_binary pe content is only byte-scanned
plugins/codex-security/mcp/native/win32-arm64/windows.node
context:unanalyzable_binary pe content is only byte-scanned
plugins/codex-security/mcp/native/win32-x64/windows.node
context:unanalyzable_binary binary content is only byte-scanned
plugins/codex-security/mcp/server.mjs.br.part-000
context:unanalyzable_binary binary content is only byte-scanned
plugins/codex-security/mcp/server.mjs.br.part-001
context:oversize archive member exceeds 8388608 bytes; truncated, no text
plugins/shopify/skills/shopify-admin/assets/admin_2026-04.json.gz!/admin_2026-04.json
context:decoded_views_exceeded 452 derived view(s) beyond the per-file view cap: decoded:charcode, decoded:rot13, decoded:unicode-escape
plugins/creative-production/mcp/server.bundle.mjs
context:bytes_unavailable yara-x: no bytes to scan
plugins/shopify/skills/shopify-admin/assets/admin_2026-04.json.gz!/admin_2026-04.json