With the shape of the problem clear, I worked out what a real fix would take. The core idea: separate what a design decision means (a button's primary color, an error state's text color) from what that decision actually resolves to for a given brand. If components referenced meanings instead of hardcoded values, swapping brands would become a matter of repointing meanings — not rewriting components one by one under deadline pressure.
But a swappable architecture is only as good as the names it's built on, so before I mapped a single token to Spectrum, I tackled naming head-on. I researched established approaches to token taxonomy and standardized on the naming framework popularized by Nathan Curtis of EightShapes — a structured, layered approach ("Naming Tokens in Design Systems") that's become something of an industry reference point for exactly this problem. Adopting it gave us a predictable, self-documenting pattern: given a token's purpose, anyone on the team could now guess its name correctly, and given a name, they could guess its purpose — something that had been genuinely impossible under the old system.
I also settled a question that had never been formally answered on our team: where does a token actually live? I established Figma's Token Studio plugin as the single source of truth for the entire system — every token, in every brand, authored and governed there first, then synced downstream into code. That gave designers and engineers one shared, authoritative place to define a value, instead of tokens drifting out of sync between what a designer intended and what shipped.
That naming standard and source-of-truth decision became the scaffolding for everything after it. From there, I defined the actual token mapping — the translation layer from our legacy Residential/Business values into the new Spectrum identity — and because Nova and Kite each had their own slightly different token sets, this meant working out two parallel mappings side by side, both authored in Token Studio and built on the same naming convention, checking each against its respective component library rather than assuming one mapping would serve both.
I also made the case that this shouldn't be scoped to just our application. If we were going to solve this mapping and naming problem properly, other teams across the organization adopting Spectrum would run into the exact same problem — so I pushed for the tokens to be extracted into their own standalone package rather than living inside our codebase.