
Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.



The TDM Calculator is a web app that city agencies, project applicants, and development professionals use to navigate and comply with Los Angeles Transportation Demand Management regulations. It's built and maintained by a volunteer team at Hack for LA, with designers and engineers rotating on and off over the years, which is how the inconsistencies piled up. I joined as a UX designer and took ownership of the design-system update. The product spans user-facing, admin, and security screens, so a color decision doesn't live in one place, it has to hold across the whole system.
LA parents feel overwhelmed by the mental load of finding and planning family activities because event information is scattered and hard to trust.


The product spans user-facing, admin, and security screens, so a color decision doesn't live in one place, it has to hold across the whole system.
LA parents feel overwhelmed by the mental load of finding and planning family activities because event information is scattered and hard to trust.
The Assignment
It started with a small assignment:
It started with a small assignment:
The Thread
That one mismatch was a thread. I audited every overlay and found the same problems in all of them, then followed the grays down to their tokens and audited every color in the system. None of it was isolated.
Three things stood out that were not equally serious:
Red flags. Accessibility and brand violations sitewide in the code, and a made-up token.
Discrepancies. Figma and production had drifted apart, so neither could be trusted as the source of truth.
Smaller tells. Like buttons that weren't centered. Minor alone, but on a public agency's tool, sloppiness signals a system that isn't maintained with care.
Nothing was being enforced.
The Design System
Sort
A-Z
Sort
Z-A
RESET
APPLY
The Dev-Site

The Design System
#939393
theme.js value
#939393
Both are labeled #939393. They don't match. Which one is right?
Turns out “Gray” in the design system was made up of three layers that add up to #5E5E5E, the value it should have been in the first place.
Red Flags
1
X-close tap target: below the WCAG minimum on the dev site
2
Text color: #000000 is not a LADOT brand color, should be Soft Black #231F20
3
Gray token: mislabeled and inaccurate in the design system
Discrepancies
4
X-close icon: size and padding
5
Radio button: vector weight
6
Separator: width and length
7
Button: height and shadow
8
Overlay: width
9
Padding and spacing: across the overlay
10
Input field: size, border color, placeholder text, and search icon size and placement
The causes were not a mystery:
It's a volunteer-run project, with designers cycling on and off at different stages.
The existing design system was vague and thinly documented.
Variable collections were built around color names instead of function, so designers picked by how a color looked, or by loose usage notes, rather than the job it did.
The result showed up in the grays: the same job often had a different gray behind it, eleven in all before the cleanup.


#808080
Disabled numbers, excluding the number of the current active page (1)

#CFCFCF
Disabled `Rename Snapshot` text & icon


#EEF1F4 Disabled toolbar icon
Three different grays, all doing 'disabled,' on the live site.
How do we build a design system that current and future designers and engineers can all follow without guessing?
The fix
The obvious fix was to pick better grays. The real fix was to build a system that made the right color easier to identify and apply consistently. I worked with a PM and an engineer to audit the code, and audited the entire design system component by component. The mismatch between the documented palette and the actual components was everywhere.
How I chose each value
Picking the grays wasn't about redrawing a prettier scale. Each choice balanced three things:
1
What was already coded.
Reusing hardcoded values where I could, so the system didn't create a migration project for the engineers.
2
What stakeholders had approved.
Reusing signed-off values where I could, and weighing whether a change would visibly depart from approved designs or go unnoticed against them.
3
What met accessibility standards.
The non-negotiable floor. When a value failed contrast, it changed, regardless of the other two.

The inherited palette. The rules lived in prose notes, not the tokens themselves, which left them ambiguous.
So I rebuilt the color portion of the design system in three levels: Primitive, Semantic, and Component.
Primitive
gray/0 - gray/950, plus navy, blue, green, and the status hues - values that nobody is meant to use directly.
Semantic
The job lives in the semantic token, which resolves to a primitive value.
border/input resolves to the gray that clears 3:1, text/placeholder to the gray that clears 4.5:1, so the contrast rule is built into the assignment, not remembered by a person.

Two interaction blues shipped in the UI with no token behind them, invisible to the system.
Component
The specific cases that need their own treatment, named by component and state. button/primary/background, pagination/table/current-text, date-picker/focus-background.
When a control does something the semantic layer doesn't cover, it gets a token that says exactly where it lives, so its color can change without touching anything else.
AI-assisted audit reconciliation
AI-assisted audit reconciliation
I used AI to cross-check the real code inventory against my working token tables, helping verify which discrepancies had already been resolved in the actual token system and which still needed attention.
Now the name does the deciding.
A new designer on the project needing an input field, reaches for border/input token and gets the value that clears contrast, without ever looking up a hex or a WCAG number. They inherit the reasoning, not just the color. That is the difference between a palette you have to understand and a system you can follow without guessing.

The rebuilt system in Figma using variables. The token name carries the job, so the value is never a guess.
What the system replaced the guessing with:
20
Primitive Tokens
The raw palette. The only place a hex lives.
46
Semantic Tokens
Every value bound to a job and its rule.
11 → 7
Grays, Governed
Consolidated from a scattered set, each pinned to a role and a contrast rule.
Named by function, not appearance, so the next designer or engineer inherits the reasoning instead of guessing.





Cleaning a design system is governance, not decoration.
The hard problems were decisions: which values were intentional and which were leftovers, what to consolidate, where accessibility should override a legacy choice, and when not to add a token at all. The existing palette was the artifact. The real work was building a system that makes those calls for the next person, so they inherit the reasoning instead of re-making it.
The Dev-Site

The Rebuild
Sort A-Z
Sort Z-A
Select all 280
|
Clear
0 selected
Development Project Name
Anza Apartments 1
Anza Apartments 3
2566 Test Submit
2865 snapshot
2nd copy snapshot
4 Snapshot 1
RESET
Apply
Where it started and where it landed. The overlay I was assigned to build, rebuilt on the token system, every color now resolving to a semantic token and clearing its contrast rule.
Selected changes:
Input field
#5E5E5E
border
#757575
placeholder
border/input
#5E5E5E
|
6.5:1
|
non-text
1.4.11
text/placeholder
#757575
|
4.6:1
|
text
1.4.3
One shared gray became two tokens, each cleared against the rule its job answers to.
X-close target
Before: 16x16
After: 44x44
icon/close
#231F20
|
gray/950
16x16 fails 2.5.8 (AA) → 44x44 meets
2.5.5 (AAA)
The tap target went from 16x16 below the AA minimum, to 44x44 clearing the AAA standard.
Apply button
APPLY
button/primary/background
#A7C539
|
green/500
pagination/stepper/current-background
#A7C539
|
green/500
One green served two different jobs, a primary button and the current step in the TDM form. Both now resolve to green/500 through their own tokens.
Where it stands
The color system is complete in Figma and ready for design-team review. What started as an inconsistent palette is now a structured set of tokens with defined roles, documented usage, and accessibility requirements built into the color assignments.
For designers, the file provides a clear reference for choosing colors by function instead of appearance. For engineers, it establishes a documented mapping between the new tokens and the values already used in the application.
The next step is to review the system with the design team, incorporate feedback, and prepare the approved file for LADOT handoff. The production code still contains the hardcoded and duplicated values identified during the audit.
Complete
Color System
Tokens, accessibility decisions and Figma documentation.
In Progress
Code alignment
Reconcile existing hardcoded values with the new tokens.
Up Next
Team review
Gather feedback and prepare the approved handoff.
What’s next
Color was the proof of concept. The same method, audit, find the functional logic, build tiered tokens, extends to the rest of the foundation: typography, spacing, icons, elevation, and the interaction and layout systems that sit on top of them. Governance is the throughline that keeps all of it from drifting again.
A system only holds if it's maintained. The next challenge is making sure these decisions stay clear and usable as the team changes.

Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.



The TDM Calculator is a web app that city agencies, project applicants, and development professionals use to navigate and comply with Los Angeles Transportation Demand Management regulations. It's built and maintained by a volunteer team at Hack for LA, with designers and engineers rotating on and off over the years, which is how the inconsistencies piled up. I joined as a UX designer and took ownership of the design-system update. The product spans user-facing, admin, and security screens, so a color decision doesn't live in one place, it has to hold across the whole system.
LA parents feel overwhelmed by the mental load of finding and planning family activities because event information is scattered and hard to trust.


The product spans user-facing, admin, and security screens, so a color decision doesn't live in one place, it has to hold across the whole system.
LA parents feel overwhelmed by the mental load of finding and planning family activities because event information is scattered and hard to trust.
The Assignment
It started with a small assignment:
It started with a small assignment:
The Thread
That one mismatch was a thread. I audited every overlay and found the same problems in all of them, then followed the grays down to their tokens and audited every color in the system. None of it was isolated.
Three things stood out that were not equally serious:
Red flags. Accessibility and brand violations sitewide in the code, and a made-up token.
Discrepancies. Figma and production had drifted apart, so neither could be trusted as the source of truth.
Smaller tells. Like buttons that weren't centered. Minor alone, but on a public agency's tool, sloppiness signals a system that isn't maintained with care.
Nothing was being enforced.
The Design System
Sort
A-Z
Sort
Z-A
RESET
APPLY
The Dev-Site

The Design System
#939393
theme.js value
#939393
Both are labeled #939393. They don't match. Which one is right?
Turns out “Gray” in the design system was made up of three layers that add up to #5E5E5E, the value it should have been in the first place.
Red Flags
1
X-close tap target: below the WCAG minimum on the dev site
2
Text color: #000000 is not a LADOT brand color, should be Soft Black #231F20
3
Gray token: mislabeled and inaccurate in the design system
Discrepancies
4
X-close icon: size and padding
5
Radio button: vector weight
6
Separator: width and length
7
Button: height and shadow
8
Overlay: width
9
Padding and spacing: across the overlay
10
Input field: size, border color, placeholder text, and search icon size and placement
The causes were not a mystery:
It's a volunteer-run project, with designers cycling on and off at different stages.
The existing design system was vague and thinly documented.
Variable collections were built around color names instead of function, so designers picked by how a color looked, or by loose usage notes, rather than the job it did.
The result showed up in the grays: the same job often had a different gray behind it, eleven in all before the cleanup.


#808080
Disabled numbers, excluding the number of the current active page (1)

#CFCFCF
Disabled `Rename Snapshot` text & icon


#EEF1F4 Disabled toolbar icon
Three different grays, all doing 'disabled,' on the live site.
How do we build a design system that current and future designers and engineers can all follow without guessing?
The fix
The obvious fix was to pick better grays. The real fix was to build a system that made the right color easier to identify and apply consistently. I worked with a PM and an engineer to audit the code, and audited the entire design system component by component. The mismatch between the documented palette and the actual components was everywhere.
How I chose each value
Picking the grays wasn't about redrawing a prettier scale. Each choice balanced three things:
1
What was already coded.
Reusing hardcoded values where I could, so the system didn't create a migration project for the engineers.
2
What stakeholders had approved.
Reusing signed-off values where I could, and weighing whether a change would visibly depart from approved designs or go unnoticed against them.
3
What met accessibility standards.
The non-negotiable floor. When a value failed contrast, it changed, regardless of the other two.

The inherited palette. The rules lived in prose notes, not the tokens themselves, which left them ambiguous.
So I rebuilt the color portion of the design system in three levels: Primitive, Semantic, and Component.
Primitive
gray/0 - gray/950, plus navy, blue, green, and the status hues - values that nobody is meant to use directly.
Semantic
The job lives in the semantic token, which resolves to a primitive value.
border/input resolves to the gray that clears 3:1, text/placeholder to the gray that clears 4.5:1, so the contrast rule is built into the assignment, not remembered by a person.

Two interaction blues shipped in the UI with no token behind them, invisible to the system.
Component
The specific cases that need their own treatment, named by component and state. button/primary/background, pagination/table/current-text, date-picker/focus-background.
When a control does something the semantic layer doesn't cover, it gets a token that says exactly where it lives, so its color can change without touching anything else.
AI-assisted audit reconciliation
AI-assisted audit reconciliation
I used AI to cross-check the real code inventory against my working token tables, helping verify which discrepancies had already been resolved in the actual token system and which still needed attention.
Now the name does the deciding.
A new designer on the project needing an input field, reaches for border/input token and gets the value that clears contrast, without ever looking up a hex or a WCAG number. They inherit the reasoning, not just the color. That is the difference between a palette you have to understand and a system you can follow without guessing.

The rebuilt system in Figma using variables. The token name carries the job, so the value is never a guess.
What the system replaced the guessing with:
20
Primitive Tokens
The raw palette. The only place a hex lives.
46
Semantic Tokens
Every value bound to a job and its rule.
11 → 7
Grays, Governed
Consolidated from a scattered set, each pinned to a role and a contrast rule.
Named by function, not appearance, so the next designer or engineer inherits the reasoning instead of guessing.





Cleaning a design system is governance, not decoration.
The hard problems were decisions: which values were intentional and which were leftovers, what to consolidate, where accessibility should override a legacy choice, and when not to add a token at all. The existing palette was the artifact. The real work was building a system that makes those calls for the next person, so they inherit the reasoning instead of re-making it.
The Dev-Site

The Rebuild
Sort A-Z
Sort Z-A
Select all 280
|
Clear
0 selected
Development Project Name
Anza Apartments 1
Anza Apartments 3
2566 Test Submit
2865 snapshot
2nd copy snapshot
4 Snapshot 1
RESET
Apply
Where it started and where it landed. The overlay I was assigned to build, rebuilt on the token system, every color now resolving to a semantic token and clearing its contrast rule.
Selected changes:
Input field
#5E5E5E
border
#757575
placeholder
border/input
#5E5E5E
|
6.5:1
|
non-text
1.4.11
text/placeholder
#757575
|
4.6:1
|
text
1.4.3
One shared gray became two tokens, each cleared against the rule its job answers to.
X-close target
Before: 16x16
After: 44x44
icon/close
#231F20
|
gray/950
16x16 fails 2.5.8 (AA) → 44x44 meets
2.5.5 (AAA)
The tap target went from 16x16 below the AA minimum, to 44x44 clearing the AAA standard.
Apply button
APPLY
button/primary/background
#A7C539
|
green/500
pagination/stepper/current-background
#A7C539
|
green/500
One green served two different jobs, a primary button and the current step in the TDM form. Both now resolve to green/500 through their own tokens.
Where it stands
The color system is complete in Figma and ready for design-team review. What started as an inconsistent palette is now a structured set of tokens with defined roles, documented usage, and accessibility requirements built into the color assignments.
For designers, the file provides a clear reference for choosing colors by function instead of appearance. For engineers, it establishes a documented mapping between the new tokens and the values already used in the application.
The next step is to review the system with the design team, incorporate feedback, and prepare the approved file for LADOT handoff. The production code still contains the hardcoded and duplicated values identified during the audit.
Complete
Color System
Tokens, accessibility decisions and Figma documentation.
In Progress
Code alignment
Reconcile existing hardcoded values with the new tokens.
Up Next
Team review
Gather feedback and prepare the approved handoff.
What’s next
Color was the proof of concept. The same method, audit, find the functional logic, build tiered tokens, extends to the rest of the foundation: typography, spacing, icons, elevation, and the interaction and layout systems that sit on top of them. Governance is the throughline that keeps all of it from drifting again.
A system only holds if it's maintained. The next challenge is making sure these decisions stay clear and usable as the team changes.

Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.




Rebuilding A Color System
From inconsistent colors to a scalable token architecture.

duration
3 months
tools
Figma / Github
my role
I owned the design-system update, from auditing the existing colors to rebuilding them as a documented token system.



The TDM Calculator is a web app that city agencies, project applicants, and development professionals use to navigate and comply with Los Angeles Transportation Demand Management regulations. It's built and maintained by a volunteer team at Hack for LA, with designers and engineers rotating on and off over the years, which is how the inconsistencies piled up. I joined as a UX designer and took ownership of the design-system update. The product spans user-facing, admin, and security screens, so a color decision doesn't live in one place, it has to hold across the whole system.
LA parents feel overwhelmed by the mental load of finding and planning family activities because event information is scattered and hard to trust.


The product spans user-facing, admin, and security screens, so a color decision doesn't live in one place, it has to hold across the whole system.
LA parents feel overwhelmed by the mental load of finding and planning family activities because event information is scattered and hard to trust.
The Assignment
It started with a small assignment:
It started with a small assignment:
The Thread
That one mismatch was a thread. I audited every overlay and found the same problems in all of them, then followed the grays down to their tokens and audited every color in the system. None of it was isolated.
Three things stood out that were not equally serious:
Red flags. Accessibility and brand violations sitewide in the code, and a made-up token.
Discrepancies. Figma and production had drifted apart, so neither could be trusted as the source of truth.
Smaller tells. Like buttons that weren't centered. Minor alone, but on a public agency's tool, sloppiness signals a system that isn't maintained with care.
Nothing was being enforced.
The Design System
Sort
A-Z
Sort
Z-A
RESET
APPLY
The Dev-Site

The Design System
#939393
theme.js value
#939393
Both are labeled #939393. They don't match. Which one is right?
Turns out “Gray” in the design system was made up of three layers that add up to #5E5E5E, the value it should have been in the first place.
Red Flags
1
X-close tap target: below the WCAG minimum on the dev site
2
Text color: #000000 is not a LADOT brand color, should be Soft Black #231F20
3
Gray token: mislabeled and inaccurate in the design system
Discrepancies
4
X-close icon: size and padding
5
Radio button: vector weight
6
Separator: width and length
7
Button: height and shadow
8
Overlay: width
9
Padding and spacing: across the overlay
10
Input field: size, border color, placeholder text, and search icon size and placement
The causes were not a mystery:
It's a volunteer-run project, with designers cycling on and off at different stages.
The existing design system was vague and thinly documented.
Variable collections were built around color names instead of function, so designers picked by how a color looked, or by loose usage notes, rather than the job it did.
The result showed up in the grays: the same job often had a different gray behind it, eleven in all before the cleanup.


#808080
Disabled numbers, excluding the number of the current active page (1)

#CFCFCF
Disabled `Rename Snapshot` text & icon


#EEF1F4 Disabled toolbar icon
Three different grays, all doing 'disabled,' on the live site.
How do we build a design system that current and future designers and engineers can all follow without guessing?
The fix
The obvious fix was to pick better grays. The real fix was to build a system that made the right color easier to identify and apply consistently. I worked with a PM and an engineer to audit the code, and audited the entire design system component by component. The mismatch between the documented palette and the actual components was everywhere.
How I chose each value
Picking the grays wasn't about redrawing a prettier scale. Each choice balanced three things:
1
What was already coded.
Reusing hardcoded values where I could, so the system didn't create a migration project for the engineers.
2
What stakeholders had approved.
Reusing signed-off values where I could, and weighing whether a change would visibly depart from approved designs or go unnoticed against them.
3
What met accessibility standards.
The non-negotiable floor. When a value failed contrast, it changed, regardless of the other two.

The inherited palette. The rules lived in prose notes, not the tokens themselves, which left them ambiguous.
So I rebuilt the color portion of the design system in three levels: Primitive, Semantic, and Component.
Primitive
gray/0 - gray/950, plus navy, blue, green, and the status hues - values that nobody is meant to use directly.
Semantic
The job lives in the semantic token, which resolves to a primitive value.
border/input resolves to the gray that clears 3:1, text/placeholder to the gray that clears 4.5:1, so the contrast rule is built into the assignment, not remembered by a person.

Two interaction blues shipped in the UI with no token behind them, invisible to the system.
Component
The specific cases that need their own treatment, named by component and state. button/primary/background, pagination/table/current-text, date-picker/focus-background.
When a control does something the semantic layer doesn't cover, it gets a token that says exactly where it lives, so its color can change without touching anything else.
AI-assisted audit reconciliation
AI-assisted audit reconciliation
I used AI to cross-check the real code inventory against my working token tables, helping verify which discrepancies had already been resolved in the actual token system and which still needed attention.
Now the name does the deciding.
A new designer on the project needing an input field, reaches for border/input token and gets the value that clears contrast, without ever looking up a hex or a WCAG number. They inherit the reasoning, not just the color. That is the difference between a palette you have to understand and a system you can follow without guessing.

The rebuilt system in Figma using variables. The token name carries the job, so the value is never a guess.
What the system replaced the guessing with:
20
Primitive Tokens
The raw palette. The only place a hex lives.
46
Semantic Tokens
Every value bound to a job and its rule.
11 → 7
Grays, Governed
Consolidated from a scattered set, each pinned to a role and a contrast rule.
Named by function, not appearance, so the next designer or engineer inherits the reasoning instead of guessing.





Cleaning a design system is governance, not decoration.
The hard problems were decisions: which values were intentional and which were leftovers, what to consolidate, where accessibility should override a legacy choice, and when not to add a token at all. The existing palette was the artifact. The real work was building a system that makes those calls for the next person, so they inherit the reasoning instead of re-making it.
The Dev-Site

The Rebuild
Sort A-Z
Sort Z-A
Select all 280
|
Clear
0 selected
Development Project Name
Anza Apartments 1
Anza Apartments 3
2566 Test Submit
2865 snapshot
2nd copy snapshot
4 Snapshot 1
RESET
Apply
Where it started and where it landed. The overlay I was assigned to build, rebuilt on the token system, every color now resolving to a semantic token and clearing its contrast rule.
Selected changes:
Input field
#5E5E5E
border
#757575
placeholder
border/input
#5E5E5E
|
6.5:1
|
non-text
1.4.11
text/placeholder
#757575
|
4.6:1
|
text
1.4.3
One shared gray became two tokens, each cleared against the rule its job answers to.
X-close target
Before: 16x16
After: 44x44
icon/close
#231F20
|
gray/950
16x16 fails 2.5.8 (AA) → 44x44 meets
2.5.5 (AAA)
The tap target went from 16x16 below the AA minimum, to 44x44 clearing the AAA standard.
Apply button
APPLY
button/primary/background
#A7C539
|
green/500
pagination/stepper/current-background
#A7C539
|
green/500
One green served two different jobs, a primary button and the current step in the TDM form. Both now resolve to green/500 through their own tokens.
Where it stands
The color system is complete in Figma and ready for design-team review. What started as an inconsistent palette is now a structured set of tokens with defined roles, documented usage, and accessibility requirements built into the color assignments.
For designers, the file provides a clear reference for choosing colors by function instead of appearance. For engineers, it establishes a documented mapping between the new tokens and the values already used in the application.
The next step is to review the system with the design team, incorporate feedback, and prepare the approved file for LADOT handoff. The production code still contains the hardcoded and duplicated values identified during the audit.
Complete
Color System
Tokens, accessibility decisions and Figma documentation.
In Progress
Code alignment
Reconcile existing hardcoded values with the new tokens.
Up Next
Team review
Gather feedback and prepare the approved handoff.
What’s next
Color was the proof of concept. The same method, audit, find the functional logic, build tiered tokens, extends to the rest of the foundation: typography, spacing, icons, elevation, and the interaction and layout systems that sit on top of them. Governance is the throughline that keeps all of it from drifting again.
A system only holds if it's maintained. The next challenge is making sure these decisions stay clear and usable as the team changes.