Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/onewave-ai-design-tokens-sync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-03 | ✓→✗ | ▼ Worse | 31% | 0% |
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.
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.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 nowhereUNTOKENIZED -- raw values appearing 3+ times with no token; these are tokens waiting to be namednpm 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.#0B1121 vs #0b1220 may be drift or may be a decision.color.blue.500 -> color.accent -> button.bg, fix references at the right layer instead of flattening everything to primitives.theme.css is built from tokens.json, fix the source and rebuild; never hand-edit output.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 11,126 | 8,434 | -24% | 1 | 1 | 0% | 1,937 | 2,238 | +16% | 0 | 0 | — |
case-06 | pass→pass | 15,244 | 6,227 | -59% | 1 | 1 | 0% | 2,523 | 1,761 | -30% | 0 | 0 | — |
case-20 | pass→pass | 18,974 | 14,587 | -23% | 1 | 1 | 0% | 3,142 | 3,527 | +12% | 0 | 0 | — |
case-01 | fail→fail | 22,035 | 13,527 | -39% | 1 | 1 | 0% | 3,775 | 1,278 | -66% | 0 | 0 | — |
case-02 | fail→fail | 7,513 | 2,902 | -61% | 1 | 1 | 0% | 1,356 | 1,169 | -14% | 0 | 0 | — |
case-03 | pass→fail | 19,919 | 24,765 | +24% | 1 | 1 | 0% | 3,492 | 4,582 | +31% | 0 | 0 | — |
case-04 | fail→fail | 7,800 | 3,588 | -54% | 1 | 1 | 0% | 1,382 | 1,286 | -7% | 0 | 0 | — |
case-07 | fail→fail | 2,603 | 8,186 | +214% | 1 | 1 | 0% | 457 | 1,890 | +314% | 0 | 0 | — |
case-08 | pass→pass | 9,193 | 4,799 | -48% | 1 | 1 | 0% | 1,544 | 1,371 | -11% | 0 | 0 | — |
case-09 | pass→pass | 9,117 | 6,778 | -26% | 1 | 1 | 0% | 1,591 | 1,971 | +24% | 0 | 0 | — |
case-10 | pass→pass | 10,273 | 6,819 | -34% | 1 | 1 | 0% | 1,783 | 1,804 | +1% | 0 | 0 | — |
case-21 | pass→pass | 29,528 | 23,814 | -19% | 1 | 1 | 0% | 6,187 | 5,770 | -7% | 0 | 0 | — |
case-11 | fail→pass | 6,507 | 3,735 | -43% | 1 | 1 | 0% | 1,228 | 1,379 | +12% | 0 | 0 | — |
case-12 | pass→pass | 6,790 | 3,637 | -46% | 1 | 1 | 0% | 1,082 | 1,337 | +24% | 0 | 0 | — |
case-13 | pass→pass | 14,003 | 6,071 | -57% | 1 | 1 | 0% | 2,222 | 1,619 | -27% | 0 | 0 | — |
case-14 | fail→pass | 11,377 | 7,507 | -34% | 1 | 1 | 0% | 2,067 | 2,134 | +3% | 0 | 0 | — |
case-15 | pass→pass | 9,844 | 5,369 | -45% | 1 | 1 | 0% | 1,621 | 1,613 | -0% | 0 | 0 | — |
case-16 | fail→pass | 13,994 | 12,198 | -13% | 1 | 1 | 0% | 2,553 | 2,943 | +15% | 0 | 0 | — |
case-17 | fail→fail | 5,977 | 3,458 | -42% | 1 | 1 | 0% | 920 | 970 | +5% | 0 | 0 | — |
case-18 | fail→fail | 13,152 | 3,881 | -70% | 1 | 1 | 0% | 2,327 | 1,137 | -51% | 0 | 0 | — |
case-19 | pass→pass | 11,437 | 6,849 | -40% | 1 | 1 | 0% | 2,029 | 2,007 | -1% | 0 | 0 | — |
case-22 | pass→pass | 14,865 | 15,871 | +7% | 1 | 1 | 0% | 2,959 | 3,855 | +30% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.