Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when authoring a machine-readable design tokens file for a design system or Figma-to-code pipeline: emit the W3C Design Tokens Community Group (DTCG) Format Module — $-prefixed properties, {alias} references, the exact $type vocabulary, and per-type value objects — which cheaper models do not produce by default.
.claude/skills/design-tokens-dtcg-format/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 91% | 22 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +21% | +191% | 0% | 24 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✓ | ▲ Improved | — | — |
When you output a design-tokens file (a tokens.json / design-system token set for a Figma-to-code or Style-Dictionary pipeline), emit the W3C Design Tokens Community Group (DTCG) Format Module exactly. This means $-prefixed reserved properties, the fixed $type vocabulary, per-type value objects (not CSS strings), and curly-brace {alias} references. Apply whenever the requested artifact is a machine-readable token file.
$value is the only required property. Optional reservedproperties: $type, $description, $extensions, $deprecated. Every reserved property begins with $. A group is a plain object whose non-$ keys are nested tokens or groups.
value, type, description, extensions, deprecated.Always the $-prefixed form ($value, $type, …). This is the single most common miss.
$type comes from a closed vocabulary. Atomic: color dimension fontFamilyfontWeight duration cubicBezier number. Composite: strokeStyle border transition shadow gradient typography. Use these exact tokens — never size, spacing, space, px, font, text, string, or boolean.
$type once on a group; children omit it. A token with no $type inherits the$type of its nearest ancestor group; if its value is an alias, the type resolves from the referenced token. Do not repeat $type on every leaf when a group covers them.
"$value": "{group.subgroup.token}".Never put a $ref, a var(--x), an @token, or a copied hex literal in a $value to mean "same as". (A property-level $ref JSON Pointer exists for document access, but the token-value alias is the curly form.)
$ and MUST NOT contain., {, or } — those are reserved for the alias path syntax. Use nesting or hyphens instead of dots (color.brand.primary → nested color → brand → primary).
$value shapes:{ "colorSpace": "srgb", "components": [r, g, b] } with 0–1 channelnumbers; optional "alpha" (0–1) and optional "hex" fallback. Not a bare "#2563eb" string.
{ "value": <number>, "unit": "px" | "rem" }. Not "16px".{ "value": <number>, "unit": "ms" | "s" }. Not "200ms".1–1000, or a lowercase hyphenated keyword alias:thin hairline extra-light ultra-light light normal regular book medium semi-bold demi-bold bold extra-bold ultra-bold black heavy extra-black ultra-black. Not "Bold", not CSS "bolder"/"lighter".
[x1, y1, x2, y2] (x in [0,1]).Not "ease-in-out", not "cubic-bezier(0.4,0,0.2,1)".
outset inset }, or an object { "dashArray": <dimension>…], "lineCap": "round"|"butt"|"square" }.
{ "color", "width", "style" } (each a value or {alias}).{ "duration", "delay", "timingFunction" }.{ "color", "offsetX", "offsetY", "blur", "spread" } (or an arrayof these for layered shadows). Not a "0 1px 2px rgba(...)" string.
{ "color", "position" } with position in [0,1].{ "fontFamily", "fontSize", "fontWeight", "lineHeight" }.$extensions keyed by reverse-domain names("com.figma.tokens": {…}), never as extra top-level keys on the token.
"$deprecated": true (or a string reason) — never a bare deprecatedkey and never a // comment.
Color — before (bare keys + hex string) → after:
json// before { "color": { "primary": { "value": "#2563eb", "type": "color" } } } // after { "color": { "$type": "color", "primary": { "$value": { "colorSpace": "srgb", "components": [0.145, 0.388, 0.922] } } } }
Dimension — before → after:
json// before { "spacing": { "md": { "value": "16px", "type": "size" } } } // after { "spacing": { "$type": "dimension", // "md": { "$value": { "value": 16, "unit": "px" } } } }
Alias — before (copy / $ref / var) → after (curly path):
json// before { "button": { "bg": { "$value": "#2563eb" } } } // copied literal // before { "button": { "bg": { "$ref": "#/color/primary" } } } // wrong: $ref in value // after { "button": { "bg": { "$value": "{color.primary}" } } }
Typography composite — before (flat CSS-ish) → after:
json// before { "heading": { "value": "700 24px/1.2 Inter", "type": "font" } } // after { "heading": { "$type": "typography", "$value": { "fontFamily": "Inter", "fontSize": { "value": 24, "unit": "px" }, "fontWeight": "bold", "lineHeight": 1.2 } } }
Shadow — before (CSS string) → after (object):
json// before { "elevation": { "1": { "$value": "0 1px 2px rgba(0,0,0,0.1)" } } } // after { "elevation": { "1": { "$type": "shadow", "$value": { "color": { "colorSpace": "srgb", "components": [0,0,0], "alpha": 0.1 }, "offsetX": { "value": 0, "unit": "px" }, "offsetY": { "value": 1, "unit": "px" }, "blur": { "value": 2, "unit": "px" }, "spread": { "value": 0, "unit": "px" } } } } }
$type → its type resolves from the token it points at; do notinvent one. { "$value": "{color.primary}" } is a color because color.primary is.
hex may accompany a color as an optional convenience property inside the colorobject, but colorSpace + components remain the authoritative value.
$ref (JSON Pointer, "#/…") is allowed for cross-document reuse of aproperty, but the ordinary "same value as another token" case uses the {curly} alias.
0.5, line-height multiplier 1.5, z-index 10) are$type: "number", a plain JSON number — not a dimension, not a string.
$. Don't write value/type."#hex", "16px", "200ms"."{group.token}". Don't use $ref, var(--x), @, or a copied literal in $value.$type to the group. Don't contradict it on children../{/}/leading $. Don't name a token "brand.primary".$extensions (reverse-domain key). Don't add ad-hoc top-level keys."value" / "type" without the $ — the #1 non-conformance.$type: "size" or "spacing" instead of "dimension"; "font"/"text" instead of "typography"."#2563eb", dimension as "16px", duration as "200ms" (CSS strings, not objects).cubicBezier as "ease-in-out" instead of [0.4, 0, 0.2, 1].$type on every leaf instead of once on the group.$ref/var() inside $value for a simple alias.$-prefixed ($value required).$type drawn from the closed atomic/composite vocabulary; hoisted to groups.[4 numbers]."{group.token}", never $ref/var()/copied literals../{/} and never start with $.$values carry their exact sub-keys; tool data under $extensions.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
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. 24 cases were attempted. The headline lift of +21 percentage points is the difference between those two pass rates over the 24 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/10/2026 | +79% |
Other measured skills in the registry, with their headline benchmark lift.