Get started

DESIGN.md vs design tokens: choose authority and prevent drift

DESIGN.md does not replace design tokens, and tokens do not replace DESIGN.md. Use tokens for reusable values and aliases, DESIGN.md for intent and usage rules, and component contracts for structure and behavior. Then name one authority for every decision. Two synchronized files without a conflict rule are still two possible sources of drift.

Updated October 6, 2026

The artifacts make different promises

A design token is a named piece of structured data. It may hold a color, dimension, font family, duration, or reference to another token. Its promise is narrow: a known identifier can be resolved and transformed for a consumer. For example, a token can say that color.action.primary points to one value in light mode and another in dark mode. It cannot decide whether a page should have one primary action or five.

A DESIGN.md provides context for people and coding agents. The current published format can include tokens in YAML front matter, but the document also carries prose about visual direction, roles, components, layout, and constraints. It can explain that the primary action should remain visually scarce, that shadows are forbidden, or that a motif belongs on marketing surfaces but not dense tables.

A component contract makes a third promise. It defines the variants, states, structure, interaction, and content behavior supported by a reusable component. A button contract may specify loading behavior, disabled semantics, focus treatment, and whether an icon-only variant requires an accessible name. Neither a palette nor broad visual guidance can replace it.

Files do not enforce themselves

A valid token file proves that structured data exists. A clear DESIGN.md proves that someone wrote the guidance. Neither proves that an agent received the right version, a project mapped it correctly, a component adopted it, or the intended result rendered.

Choose authority decision by decision

Don't appoint an entire file as the universal source of truth. Authority belongs to decisions. One system may make DTCG tokens canonical for color roles, DESIGN.md canonical for layout principles, and component code canonical for supported button states. Each row needs one owner and one precedence rule.

Canonical homeSupporting artifactConflict rule
Semantic color values and mode aliasesCanonical tokensDESIGN.md explains roles and restrictionsToken value wins; revise stale prose or regenerate the derived representation
Typography families, weights, and reusable scale valuesCanonical tokensDESIGN.md explains role selection and toneTokens win for exact values; DESIGN.md wins for permitted usage
Reusable spacing and radius valuesCanonical tokensDESIGN.md describes density and compositionTokens win for values; local literals require an approved exception
Layout principles and responsive intentDESIGN.md or an owned layout specificationTokens may provide reusable dimensionsThe documented rule wins until a narrower approved layout contract overrides it
Component variants and statesComponent contractDESIGN.md helps an agent choose among supported variantsThe component contract wins on supported behavior; DESIGN.md must not invent unavailable variants
Content voice and interface wording rulesDESIGN.md or a dedicated content standardComponents may constrain labels and slotsThe content rule wins unless a product requirement records a narrower exception
One-off exceptionVersioned exception recordAffected component or page references itThe exception wins only inside its declared scope and review period
Rendered appearanceNo authority roleObservation and test evidenceA screenshot can reveal divergence but cannot silently redefine the system
Recommended authority by decision type. Synchronized means one named source governs and the other representation is derived or explicitly reviewed.

Saying "both are the source of truth" is incomplete. If a color value appears in DTCG and in DESIGN.md, decide whether the document is generated from tokens, tokens are generated from structured front matter, or a review must approve both in one change. Never leave the direction implicit.

Freeze the contract before synchronizing files

Synchronization starts with identity, not copying. Record the approved source version, the exact artifact versions emitted from it, and the consumers expected to receive them. Without those identifiers, people can blame a mismatch on the wrong layer, and "latest" can mean something different to every participant.

  • Source identity: system name, version, approval state, owner, and scope.
  • Artifact identity: DESIGN.md revision, token package or file revision, generation route, and content hash when available.
  • Synchronization direction: which artifact governs each duplicated fact and how the other is updated.
  • Supported consumers: named repositories, applications, builders, agents, or transformation pipelines.
  • Mappings: the project names or variables that connect an upstream role to each consumer.
  • Exclusions: surfaces, modes, components, and behaviors this handoff does not cover.
  • Evidence: expected result first, then observed result, environment, date, and reviewer.
  • Disposition: accept, revise, or block, with an owner and retest trigger.

Keep evidence states separate

Available means an upstream artifact can be obtained. Delivered means a particular version reached a project. Mapped means the project connects its own names to it. Adopted means a component or surface uses that mapping. Observed means someone checked the result under recorded conditions. Progress at one state does not prove the next.

Ambient Sage shows the upstream boundary

Ambient Sage v1 is a useful public example because its kit page exposes several representations of one design direction. The page describes a warm-sage system with Plus Jakarta Sans for heading and body roles, JetBrains Mono for technical strings, light and dark semantic tokens, and a downloadable DESIGN.md. It also lists DTCG, CSS variables, Tailwind v3, Tailwind v4, and shadcn artifact families.

Token specimen · real values

Ambient Sage

Live render

Ambient Sage's actual tokens — the same values its exports use.

Color tokensSemantic roles with HEX / HSL / CMYK

Color tokens

Ambient Sage
light · HEX · HSL · CMYK

Core

#F3F4EF

background

H 72 · C0, 0, 2, 4

#1A1C17

foreground

H 84 · C7, 0, 18, 89

#E5E6E0

card

H 70 · C0, 0, 3, 10

#ECEEE8

muted

H 80 · C1, 0, 3, 7

#D8D9D2

border

H 68.57 · C0, 0, 3, 15

Brand

#FEE951

primary

H 52.72 · C0, 8, 68, 0

#1A1C17

primary-fg

H 84 · C7, 0, 18, 89

#E5E6E0

secondary

H 70 · C0, 0, 3, 10

#F7E464

accent

H 52.24 · C0, 8, 60, 3

#FEE951

ring

H 52.72 · C0, 8, 68, 0

Semantic

#C0392B

destructive

H 5.64 · C0, 70, 78, 25

#FFFFFF

destructive-fg

H 0 · C0, 0, 0, 0

#2D7238

success

H 129.57 · C61, 0, 51, 55

#C97D12

warning

H 35.08 · C0, 38, 91, 21

#545651

muted-fg

H 84 · C2, 0, 6, 66

Charts

#FEE951

chart-1

H 52.72 · C0, 8, 68, 0

#4A8FD4

chart-2

H 210 · C65, 33, 0, 17

#6BBF8A

chart-3

H 142.14 · C44, 0, 28, 25

#E07498

chart-4

H 340 · C0, 48, 32, 12

#E8A24B

chart-5

H 33.25 · C0, 30, 68, 9

Type scaleHeading, body, and mono in the kit's fonts

Typography

Ambient Sage

Scale: compact-product

Density: balanced

Heading · Plus Jakarta Sans · 1.875rem

Ship beautiful product faster

Subheading · Plus Jakarta Sans · 1.375rem

A warm-sage neutral-surface mobile kit with a single vivid yellow accent, flat tonal cards, and oversized display numerals.

Body · Plus Jakarta Sans · 1rem

Ambient Sage uses a near-white warm-sage canvas (#f3f4ef) with card panels distinguished only by a tonal shift to #e5e6e0, never by shadows or borders. A single vivid yellow (#fee951) is the only saturated color and appears sparingly at component scale as orbs, button fills, and focus rings. Primary data values render as oversized bold hero numerals with a small superscript unit. Typography is a friendly rounded geometric (Plus Jakarta Sans) with no uppercase and no tight tracking, while JetBrains Mono is reserved for hex codes and technical strings. Generous rounding and luminance-only contrast give the whole system a calm, minimal feel.

Mono · JetBrains Mono · 0.8125rem

npx shadcn add ambientsage.json

Aa

Plus Jakarta Sans · Heading

400500600700

Aa

Plus Jakarta Sans · Body

400500600700

ABCDEFGHIJKLM NOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

0123456789 & @ # % →

Radius & spacingCorner radius, elevation, and spacing steps

Tokens

Ambient Sage primitives
density: balanced

Radius scale

sm · 0.375rem
md · 0.75rem
lg · 1.25rem
xl · 1.75rem

Component radius

button
card
input

Elevation

level 1
level 2
level 3
level 4

Spacing · base 4px

1x
2x
3x
4x
6x
8x
Ambient Sage v1 demonstrates the kinds of reusable values a token artifact can expose. The specimen does not prove that any external project maps or renders them correctly.

That public evidence establishes upstream availability. It does not establish that a repository downloaded all six families, that every export contains identical coverage, that a particular token transformer accepts the DTCG file, or that a button in a consuming application uses the intended role. Each of those claims requires evidence from the named project and consumer.

This boundary matters when evaluating any design-system generator. Producing several files can be useful, but file count is not consistency. Consistency depends on shared authority, known transformation rules, correct project mappings, component adoption, and observations from representative states.

Inspect a real dual-artifact kit

Use Ambient Sage to compare written design guidance with its token and implementation exports. Treat the kit as upstream input, then apply the verification record below to your own project.

Copy the dual-artifact contract

Keep the record beside the system or in the receiving project's handoff documentation. The format matters less than completing every applicable field. Leave unknown values marked unknown instead of replacing them with assumptions.

dualArtifactContract:
  scope:
    decision: ""
    surfaces: []
    modes: []
    exclusions: []

  source:
    system: ""
    version: ""
    approvalState: "draft | approved | deprecated"
    owner: ""

  artifacts:
    designMd:
      identity: ""
      versionOrHash: ""
      role: "authority | derived | supporting"
    tokens:
      format: "DTCG | JSON | YAML | other"
      identity: ""
      versionOrHash: ""
      role: "authority | derived | supporting"
    generatedOutputs: []

  synchronization:
    governingArtifactByField: {}
    direction: ""
    updateMethod: "generated | reviewed-together | manual"
    conflictPrecedence: ""

  consumers:
    - name: ""
      version: ""
      artifactReceived: ""
      projectMapping: ""
      componentContract: ""
      approvedExceptions: []

  acceptance:
    expectation: ""
    observation: "not-run"
    environment: ""
    evidenceLocation: ""
    owner: ""
    retestTriggers: []
    disposition: "accept | revise | block | pending-evidence"
A portable record for one bounded decision. Repeat the consumer entry when the same source serves more than one application or platform.

The contract stores expectations before observations on purpose. This stops a reviewer from seeing an attractive result and retroactively declaring it correct. It also preserves an honest pending-evidence state when the artifact exists but no consumer has been tested.

Trace one decision through both artifacts

Consider an illustrative, unexecuted decision: a shared action.primary role should style the main action in light and dark modes. DESIGN.md says to reserve that treatment for the page's principal action and avoid competing primary buttons in the same action group. This example explains the method. It is not a claim about a tested Ambient Sage consumer.

  1. 1

    Name the governing decisions

    Let canonical tokens own the exact light and dark values for action.primary. Let DESIGN.md own the selection rule that describes when the primary treatment is appropriate.

  2. 2

    Identify every emitted artifact

    Record which DTCG object carries the role and which CSS, Tailwind, or registry output should represent it. Pin versions or hashes instead of referring to "the latest export."

  3. 3

    Record the project mapping

    Write the exact path from the upstream role to the project's variable, theme key, utility, or component property. A delivered file without an active mapping remains only delivered.

  4. 4

    Inspect the component contract

    Confirm that the button supports the required default, hover, focus, and disabled states and consumes the mapped role. The narrative rule cannot compensate for a missing state implementation.

  5. 5

    Select a named consumer

    Choose one real page or flow with a principal action, plus a protected surface that should not change. Record both modes and any relevant viewport or interaction condition.

  6. 6

    Write expectations before running the check

    State which element should change, which states should preserve their behavior, and which unrelated elements must remain stable. Leave observations marked not run.

Why one role is enough to start

A narrow trace exposes weak ownership faster than an inventory of hundreds of tokens. If the team cannot explain one reused semantic role from source to consumer, expanding the artifact set creates more ambiguity, not more control.

Verify from source to rendered consumer

Test a bounded claim instead of asking whether the whole interface "feels consistent." Pick one decision with meaningful reuse and examine each layer in order. Stop at the first divergence. Later symptoms may be real, but the first divergence owns the correction.

  1. 1

    Check the approved source decision

    Is the role explicit, current, approved, in scope, and owned? If not, the source needs a decision before anyone can judge downstream files.

  2. 2

    Check artifact identity and content

    Do the recorded DESIGN.md and token artifact match the approved source version? Does each contain the part it is expected to carry? A generation failure belongs here.

  3. 3

    Check distribution

    Did the named project receive the intended artifact version through the recorded route? A correct upstream file that never arrived is a distribution failure.

  4. 4

    Check project mapping

    Does the project map its local name to the intended upstream role in each required mode? Stale aliases, duplicated literals, and the wrong import belong here.

  5. 5

    Check the component contract

    Does the shared component consume the mapping and implement the required variants and states? If the contract lacks the required behavior, changing prose or token values will not solve it.

  6. 6

    Check approved exceptions

    Determine whether an apparent mismatch is deliberate, bounded, owned, and still within its review period. An undocumented override is drift, not an exception.

  7. 7

    Observe representative consumers

    Inspect the named component in both modes and required states under the recorded environment. Capture what happened without promoting the observation into policy.

  8. 8

    Choose a disposition

    Accept when the bounded claim is supported. Revise when the intended contract is sound but a correctable layer diverges. Block when required evidence is missing or the mismatch creates unacceptable risk.

Representative cases worth recording

  • Default, hover, focus, and disabled states for the selected component.
  • Light and dark modes when the role has mode-specific values.
  • One intended consumer and one protected surface that should remain unchanged.
  • A content or viewport condition likely to expose a local override.
  • An agent-generated edit, when agent adherence is part of the claim.
  • A stale-artifact case when the delivery route can cache or pin versions.

Don't claim that DESIGN.md or tokens "enforce consistency" unless a named mechanism actually rejects, rewrites, or reports violations. A token pipeline may transform data deterministically while an application still bypasses the output. An agent may retrieve DESIGN.md and ignore a rule. Enforcement is a property of the complete workflow, not the file extension.

Resolve drift at the first divergent layer

What it meansCorrection owner
Source decisionThe intended rule is missing, conflicting, or unapprovedDesign-system decision owner
Generated artifactThe approved source did not produce the expected DESIGN.md, token, or output contentGenerator or artifact pipeline owner
DistributionThe correct artifact did not reach the named consumerPackage, registry, CLI, or delivery-route owner
Project mappingThe project points at the wrong role, value, version, or modeConsuming project owner
Component contractThe shared component lacks or overrides the intended state or behaviorComponent owner
Exception recordA divergence is deliberate but undocumented, expired, or broader than approvedException approver and product owner
Rendered consumerAll prior layers agree, but the observed result still differsConsumer implementation owner, with environment evidence
Fix the owner of the first divergence instead of editing the most visible symptom.

This order prevents a common waste pattern: patching a page-level value when the generator emitted stale data, or rewriting DESIGN.md when the component never supported the requested state. Correct the owning layer, regenerate or redistribute downstream artifacts as required, then rerun the same bounded cases.

The practical decision

Choose tokens alone when the immediate problem is deterministic value distribution and the consumers already have adequate component and usage rules. Add DESIGN.md when people or agents must make contextual choices that values cannot settle. Use both when the same system needs machine-readable values and portable reasoning, but record which artifact governs every duplicated field.

Start with one reused semantic role. Name its authority, pin the two artifact identities, map it into one real consumer, write the expected result, and inspect the rendered state. Expand the contract only after that first path is traceable.

DESIGN.md and design token questions

Does DESIGN.md replace design tokens?

No. DESIGN.md can carry structured token data and written guidance, but a dedicated canonical token artifact remains useful when values and aliases must be transformed or distributed across consumers. Decide based on the required behavior, then name the authoritative representation for duplicated facts.

Should DESIGN.md or the token file be the source of truth?

Neither should be universal by default. Tokens should usually govern reusable values and aliases. DESIGN.md should govern intent, selection rules, prohibitions, and contextual guidance. Component contracts should govern supported structure, states, and behavior.

Can tokens be embedded in DESIGN.md?

Yes. The published DESIGN.md specification describes design tokens in YAML front matter. Embedding them does not remove the need to define authority, transformation, distribution, and consumer verification.

What happens when DESIGN.md and tokens disagree?

Follow the recorded field-level precedence rule. If tokens govern an exact value, correct or regenerate the conflicting prose or derived representation. If DESIGN.md governs a usage rule, changing the token value does not override that rule.

Does generating both artifacts guarantee consistency?

No. Joint generation supports upstream alignment at that version. It does not prove that the right files reached a project, mappings are current, components adopted them, an agent followed the guidance, or the rendered interface matches expectations.

How do I prove an AI coding agent followed the system?

Record the exact context and artifact versions supplied to the agent, define a bounded expected result, inspect the generated mapping and component use, and observe representative rendered states. The proof applies only to that task, consumer, version, and environment.

Sources

  • DESIGN.md Format specification: The published specification defines DESIGN.md structure and places design tokens in YAML front matter at the beginning of the file.
  • DESIGN.md vs Design Tokens: This comparison distinguishes reusable token values from the rationale and usage guidance carried by DESIGN.md.
  • design.md vs Design Tokens for AI UI Workflows: This comparison frames tokens around deterministic distribution and DESIGN.md around contextual guidance for coding agents.
  • Atlassian's DESIGN.md is here: Atlassian reports practical work compressing an established design system into portable agent context and discusses limits beyond one-shot prototypes.
  • DESIGN.md at scale: This guide shows why token values alone do not settle component selection, states, structure, or behavior.
  • Ambient Sage Design Kit: The public Ambient Sage v1 page exposes DESIGN.md and lists DTCG, CSS variables, Tailwind v3, Tailwind v4, and shadcn delivery artifacts.