Audit a Figma screen or component for design-system integration drift, including missing shared components, local overrides, and unbound tokens.
Review a Figma node for evidence that the design is not properly integrated with the design system.
This skill is read-only. When the user wants a write action afterward, downstream skills should use use_figma through a figma-use-style helper when the host environment requires one.
--json or JSON, output raw JSON (no markdown fences, no prose).--markdown, markdown, or a specific human-readable format, output the human-readable markdown report.Parse the Figma input.
Accept a full Figma URL, or a fileKey and nodeId.
Normalize node IDs from 72-293 to 72:293 when needed.
Pull the minimum required evidence with Figma MCP read tools.
Call get_design_context for the exact node under review.
Call get_screenshot for visual confirmation.
Call get_variable_defs to see which variables are actually bound.
Call get_code_connect_map when relevant.
Call get_metadata when the reviewed node is large, repeated, or board-like and you need to map nested instances before drilling in.
Call search_design_system when you have identified a likely non-systemized primitive and there is a realistic chance of suggesting a concrete replacement from the audited design system.
Review for systemization failures, not visual taste. Look for places where the design should probably inherit from the design system but is locally constructed instead. Base every finding on structure visible in Figma: instances, duplicated frames, raw values, variant drift, or missing token bindings. Prefer omissions over weak findings.
When the evidence is strong enough, suggest a replacement candidate.
After identifying a likely custom primitive, use search_design_system to find the closest matching component family from the audited design system.
Include a candidate only when the match is credible from structure and naming, not just screenshot similarity.
If search results are noisy or ambiguous, omit the candidate instead of guessing.
Present findings in the appropriate format based on the environment. Use JSON for Codex Desktop and machine-consumed review surfaces, markdown for Claude Code CLI and other chat-style environments (see Output Format Selection above).
When the user wants a fix, route to the right downstream skill. Prefer fix-design-system-finding when one specific offending node should be repaired. Prefer apply-design-system when the user wants a broader screen-wide pass, multiple sections need coordinated remediation, or the review is being used to define scope before writing.
Shared UI primitives recreated as ad-hoc frames instead of component instances. Common targets: buttons, icon buttons, cards, alerts, pills, chips, avatars, stat tiles, tab bars, nav bars, FABs, list rows.
Repeated sibling structures that should clearly collapse into one reusable primitive. Example: three nearly identical stat tiles with different content.
Hard-coded visual values where the rest of the design system uses variables. Common targets: fills, strokes, text colors, radius, spacing, typography, shadows. Only flag this when the evidence is concrete, such as a raw hex value or bespoke geometry sitting beside tokenized peers.
Global navigation or other high-leverage patterns built from custom frames instead of system components. Flag these aggressively because drift there scales across many screens.
Variant drift inside a nominal component. Example: a local edit button with unusual size, stroke width, or radius that does not match the expected icon-button primitive.
Every finding must answer both questions:
Good evidence includes:
Weak evidence includes:
When a finding is about a missing shared primitive, try to attach one likely replacement suggestion.
Use search_design_system after you already know what category of thing is missing, for example:
Only suggest a replacement when:
Good suggestion language:
This custom avatar frame could likely be replaced with Avatar from library X.These repeated stat tiles appear to map to Metric item from library X.Do not overstate:
When the selected output format is JSON, return this exact JSON shape with no markdown fences and no extra prose:
{
"findings": [
{
"title": "<= 80 chars, imperative>",
"body": "<valid Markdown explaining why this is a problem>",
"confidence_score": 0.0,
"priority": 0,
"code_location": {
"absolute_file_path": "/figma/<fileKey>/nodes/<nodeId>",
"line_range": {
"start": 1,
"end": 1
}
}
}
],
"overall_correctness": "patch is correct" | "patch is incorrect",
"overall_explanation": "<1-3 sentence summary>",
"overall_confidence_score": 0.0
}
Schema notes:
overall_correctness: "patch is incorrect" whenever you found one or more design-system integration issues.overall_correctness: "patch is correct" only when there are no findings.code_location.absolute_file_path to /figma/<fileKey>/nodes/<nodeId> using the most specific offending node.line_range.start and line_range.end to 1.When the selected output format is markdown, present a formatted markdown report with:
Header section:
Summary: 2-3 sentences explaining the overall state
Findings table: Quick overview with priority indicators
Details section: Expand each finding with:
search_design_systemRecommendations: Prioritized action items
/figma/<fileKey>/nodes/<nodeId> exactly.Use priority like this:
0: nit or low-impact consistency issue1: moderate system drift2: important reusable primitive or tokenization issue3: severe library-level or navigation-level issue likely to propagate widelyUse confidence_score like this:
0.9-1.0: direct structural evidence0.7-0.89: strong inference from repetition and nearby token usage0.5-0.69: plausible but incomplete evidence; prefer omitting insteadFor a single screen:
For a board or larger page:
get_metadata first to identify candidate screens or repeated modulesUse this routing rule after the review:
Do not force every review result through the single-finding fix skill. Some reviews are better used as scope discovery for a broader apply pass.