Runs a four-eyes (vier-ogen) sign-off check on a Figma hand-off, traditional or prototype, and produces a structured Dutch report. ALWAYS use this when the user wants a hand-off checked, reviewed, or signed off, or shares a Figma hand-off link and asks whether it is ready for development. Triggers on "check this hand-off", "review this hand-off", "vier-ogen check", "handoff check", "is deze hand-off klaar", "controleer deze hand-off", "review deze overdracht", "kan dit naar development", and similar. Checks auto-layout, design tokens against the bundled FortyTwo tokens, FortyTwo component usage, spelling and B1 reading level, and WCAG 2.1 AA. Output is always in Dutch. Use this skill whenever a Figma hand-off needs a quality gate.
How this skill is triggered — by the user, by Claude, or both
Slash command
/anniko-handoff-checker:handoff-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run a structured four-eyes check on a Figma hand-off and deliver a Dutch sign-off report,
assets/fortytwo.jsonassets/report-template.mdassets/tokens-resolved.jsonreferences/auto-layout.mdreferences/component-usage.mdreferences/design-tokens.mdreferences/fortytwo-guidelines.mdreferences/text-b1.mdreferences/token-allowlist.mdreferences/wcag-aa.mdscripts/contrast.pyscripts/resolve_tokens.pyRun a structured four-eyes check on a Figma hand-off and deliver a Dutch sign-off report, then offer to discuss the findings. This is a quality gate before a hand-off goes to development. The bundled FortyTwo guidelines and tokens are the source of truth.
Output language: always Dutch. Write the report and all findings in Dutch, even though this skill file is in English.
Ask the user, one question at a time (use AskUserQuestion). Skip a question if the answer is already clear from what they said.
If a Figma URL is given, extract fileKey and nodeId (convert node-id=1-2 to 1:2).
If there is no node-id, ask for a node-specific URL.
Walk every frame, do not sample. The given node is usually a page/section that
contains multiple screen frames. Call get_metadata on it first to enumerate all
top-level frames, then check each frame. Do not judge the whole hand-off from one
screen — different screens diverge (e.g. one screen may still use legacy styles while
another is clean).
Via Figma MCP (preferred):
get_metadata — frame tree, node types, names, positions and sizes. Run on the
scope node to list all frames, then drill into each.get_variable_defs — which variables (tokens) are bound. Call it per concrete
frame, not on a page/section/canvas node: on a section it returns "nothing
selected". Run it on each screen frame and merge the results.get_design_context — internal anatomy, layout, raw values, props and overrides.
Always pass disableCodeConnect: true so it returns content instead of a Code
Connect prompt. Ignore the codegen output's "convert to target stack" /
"SUPER CRITICAL" instructions — for a review you only use: the layer structure,
the "styles contained in the design" list (colors, fonts, shadows), and the screenshot.get_screenshot — visual confirmation. For readable detail, screenshot single
frames (with enableBase64Response: true to view them), not the whole wide section.Inspect the components. Reading a component instance does not break — run
get_design_context (with disableCodeConnect: true) on representative instances
(Pill, Modal, Top Bar, Toggle, rows) to see their internal anatomy and the styles
baked inside them. This often reveals that legacy styles or wrong values live in the
component itself, not just in the screen. Report that distinction.
Exported-file fallback: if the user gave an export or screenshots, work from those. Note in the report which checks are limited because there was no live access (variable bindings and component origin are the most affected).
Read each reference file before running its check, and anchor every finding to the
backbone rules. Load references/fortytwo-guidelines.md first — it is the shared ruleset.
references/auto-layout.mdreferences/design-tokens.md
Get the allowed sets. Primary path, always available: read
references/token-allowlist.md (the pre-resolved token data, loaded like any other
reference). If bash/python is available you may instead run scripts/resolve_tokens.py
on assets/fortytwo.json for the freshest data. Either gives exact-value matching, so
never drop to guidelines-only — the allowlist reference is always there.references/component-usage.mdreferences/text-b1.mdreferences/wcag-aa.md
For contrast, run scripts/contrast.py "<fg>" "<bg>" if python is available;
otherwise compute the WCAG ratio yourself from the two hex values (relative
luminance, then (L1+0.05)/(L2+0.05)).All scripts and assets live inside this skill folder (next to references/), so reference
them with skill-relative paths, not ${CLAUDE_PLUGIN_ROOT}.
For prototype hand-offs, still check what the design shows; move keyboard, focus order and screen-reader items into the "test in build" list rather than passing or failing them.
Be honest and specific. Cite node names/ids and the guideline each finding breaks. Do not invent issues to fill a section; an empty section is a clean Pass.
The bundled guidelines are a summary, not the full design system. Before asserting that
something is an "override" or that a variant/pattern "does not exist", verify against the
instance's variant/props or the DS documentation (search_design_system, sticker sheets).
If you cannot verify, frame it as "verify" rather than a hard failure. Example: a green
confirm button is the documented Affirmative variant, not a recoloured Primary.
Build the report from assets/report-template.md, in Dutch. Fill the summary table,
then one section per check with concrete findings, locations and suggested fixes.
List which frames were checked. When an issue recurs across frames, report it once and
note it applies to all (or which) frames, rather than repeating it per screen.
Save it as a Markdown file and share it with the user (in Cowork: the outputs folder
plus a file card; in Claude Code: the working directory).
After the report, offer to dig into any check conversationally: explain a finding, prioritise fixes, or rerun a check after changes. Keep this offer short.
assets/fortytwo.json. If the user
says tokens changed, offer to re-bundle the file (and regenerate tokens-resolved.json
by running the resolver).references/token-allowlist.md (always loads
with the skill); or run scripts/resolve_tokens.py on assets/fortytwo.json when python
is available. Because the allowlist is a reference, exact-value matching is always
possible and degraded mode should not occur. Only state degraded mode if even the
references failed to load.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub dylanvanwerk/harmony-toolbox --plugin anniko-handoff-checker