Code is the source of truth
Titan tokens are authored as DTCG JSON. Components and their intent live in code. Style Dictionary builds from that source and emits CSS, TypeScript, this documentation — and the Figma library. Figma is an emission target, not an authority. A value that exists only in Figma is not part of the system.This is a statement about where values live, not about who decides. Design
authority over what the system should do is unchanged — see
Proposing a change below. What changed is that a decision is only
real once it lands in source.
Three kinds of disagreement
“Drift” is used for three different situations, and only one of them has a mirror. Identify which you have before reaching for a fix, because the resolutions are not the same.Code and Figma: drift has a direction
When Figma and code disagree, the question is not “which one is right?” It is “how far has the mirror drifted?” The answer is always the same:Reporting drift
1
Identify what disagrees
Name the token, component, or variant, and both values — the code value and what Figma
shows. Screenshots help a human triage, but they are not the evidence. A screenshot
confirms a script ran; it does not confirm accuracy.
2
Check whether it is drift or a gap
Two different problems with different fixes:
- Drift — the value exists in code and Figma shows something else. The mirror is stale. Re-emit.
- Gap — the value exists in neither, and what renders has no token behind it at all. Not drift. It needs a token added to source. See Token workflow.
3
File it
Include the token or component name, the code value, the Figma value, and which
tier and axis it touches — primitive/semantic/component, and whether a mode is
involved (light/dark, comfortable/compact).
4
Resolution is a re-emission, not an edit
The fix runs the sync. If the sync produces the wrong result, the sync is the bug.
Proposing a change
Reporting drift and proposing a change are different actions. Confusing them is how “code is the source of truth” gets misheard as “designers do not get a say.”
A designer changing a value in Figma is not authoring. A designer deciding a value
absolutely is — the decision simply has to land in source to become real, the same way an
engineer’s decision does. Nobody’s judgment is downstream here. Only the file format is.
What not to do
Do not hand-edit generated output. Not the emitted CSS, not the TypeScript, not the files undersnippets/generated/. A hand-edit does not fix anything; it creates a value
that disagrees with source and survives until someone notices.
Do not resolve drift with a local override. An override is invisible to the audit, to
Figma, and to every other consumer. It is how a design system stops being one.
Do not resolve a divergence by editing the documentation to match the code. That is the
non-mirror case, and quietly rewriting the intent destroys the decision. Record it in
Divergences instead.
Do not treat the legacy library as evidence. The “IDS – Core Components” Figma file
may be referenced for design intent — it carries real direction about how things were
meant to feel — but it is not a source for values, for variant models, or for Code
Connect mappings. It is history, not input.
Related
- Token workflow — how a missing value becomes a token
- Versioning & deprecation — what happens when one is removed
- Divergences — where code and intent disagree, and which to follow
- Open decisions — what has not been decided