Token drift never announces itself. It starts with one hardcoded hex value shipped under deadline pressure, then a spacing tweak that skips the scale, then a shadow that exists only in one file. A year later the product has four slightly different grays for the same surface and nobody remembers which one is canonical.
Drift is an architecture problem
Telling engineers to "use the tokens" doesn't work, because drift isn't a discipline failure — it's what happens when the token system can't express what a screen needs. If there's no semantic token for a hovered destructive action, someone will invent a value, and that invention is drift.
The fix is a semantic layer between primitives and components. Primitives define what values exist; semantic tokens define what they mean; component tokens define where they apply. When each layer only references the layer below, a rebrand is a primitive swap and drift has nowhere to hide.
Automate the boundary
Sync tokens from the source of truth into code on every change — generated, versioned, and reviewed like any other dependency. Then lint for raw values in component styles so drift is caught in the pull request, not in an audit two quarters later.
Once the pipeline is in place, drift stops being a cleanup project and becomes a build failure. That's the difference between a system that erodes and one that compounds.