Audit and sync design tokens between the source of truth (tokens.json, Figma variables export) and the code that should consume them (Tailwind config, CSS custom properties, theme files). Finds drift -- hardcoded values, orphan tokens, out-of-date copies -- and fixes it in the right direction.
SkillScore68Maintained
Automatic
◆Frontend / UI pack
Last verified 8/24/2026
What it changes
Passed 15 of 22 test cases with the skill, and 12 of 22 without it.
Without skill55%
With skill68%
Checks it passed that the model alone missed
Categorizes the mismatch under STALE COPIES.
Adds the proposed token to the canonical file only upon user approval.
Excludes `#0F172A` from UNTOKENIZED because it appears fewer than 3 times.
and 2 more in the full report
4 fixed11 passed either way6 still failing1 broke
Pass-rate lift
+14 pp
Tokens
-1%
Agent turns
0%
Response time
-29%
Model gemini-3.6-flashMeasured 8/24/2026v115 of 22 cases passed with skill
Tokens, turns and time describe resource use, not a dollar price.
See it in action
One of 4 test cases the skill fixed. Same model, same prompt, with and without the skill.
1 of 4
Prompt
In `tokens.json`, `color.primary` is `#3B82F6`. In `tailwind.config.js`, `theme.colors.primary` is set to `#2563EB`. Where in `token-drift-report.md` should this mismatch be reported, and what details must be shown?
What was checked, without and with the skill
Checked
Without skill
With skill
Categorizes the mismatch under STALE COPIES.
Missed
Passed
Includes both canonical and downstream values in the entry.
Passed
Passed
case-11 · gemini-3.6-flash · 8/24/2026 · answers are capped and redacted
What's inside
The instructions your model reads when the skill loads.
SKILL.md31 linessingle file
Design Tokens Sync
Keep one source of truth actually true. Every design system decays the same way: a hex gets hardcoded in a hurry, a token gets renamed in Figma but not in Tailwind, a second half-copy of the palette appears in a one-off CSS file. This skill finds the drift, decides direction with the user, and reconciles.
Workflow
Locate the truths. Find every place tokens are defined: tokens.json/*.tokens.json (W3C format), Figma variables export, tailwind.config.* theme, CSS custom properties, TS theme objects, SCSS variable files. If more than one claims to be canonical, ask which wins before touching anything -- direction of sync is a human decision.
Build the graph. For each token: canonical value, every downstream definition, and every consumption site. For each raw value in code (hex, px, rem, ms, cubic-bezier): whether a token exists for it.
Drift report. Output token-drift-report.md in four buckets:
STALE COPIES -- downstream definitions that no longer match canonical (with both values)
HARDCODED -- raw values in components where a matching token exists (exact match, then near-match within perceptual distance for colors)
ORPHANS -- tokens defined but consumed nowhere
UNTOKENIZED -- raw values appearing 3+ times with no token; these are tokens waiting to be named
Reconcile on approval. Stale copies: regenerate downstream from canonical. Hardcoded: replace with token references -- exact matches automatically, near-matches only with per-case confirmation (that slightly-off blue might be intentional). Untokenized: propose names following the existing convention and add to canonical. Orphans: list for deletion; never auto-delete.
Guard. Offer to add the cheap tripwire: a script (npm run tokens:check) that re-runs the drift detection and fails CI on new stale copies or hardcoded near-matches, so the system stays synced after you leave.
Rules
Never sync both directions in one run. Canonical wins; anything flowing the other way (a designer wants the code's newer value) is an explicit canonical edit first.
Near-match replacement is per-case, never bulk. #0B1121 vs #0b1220 may be drift or may be a decision.
Preserve semantic layering: if the system has color.blue.500 -> color.accent -> button.bg, fix references at the right layer instead of flattening everything to primitives.
Renames propagate everywhere or nowhere -- a half-renamed token is worse than the old name.
Respect generated files: if theme.css is built from tokens.json, fix the source and rebuild; never hand-edit output.
The report quantifies health: token coverage percentage (tokenized vs. raw values in components) is the number to move release over release.
Quick Commands
"Audit my tokens" -- steps 1-3, report only
"Sync from [source]" -- full reconciliation with the named canonical