Two ways to carry a design change into a product. Figma-first work is a flow: the change moves forward through frames, handoff, build and QA, and the reasoning behind it burns off along the way. Token-first work is a loop: the change lands in the contract, the browser shows the result, a gate measures it, and the decision stays to be reused.
Figma-first
A static frame is the source of truth, and the product is a translation of it.
Token-first
The token contract is the source of truth. Figma and code both read from it, and the rendered page is the proof.
Figma is in both
The question is which one decides.
The loop is the product. What survives is the measured relationship between intent, implementation, and production truth.
Five everyday changes follow. On the token-first side, press the buttons: every number there is measured in this browser from TokenKit’s real tokens, with the kit’s own contrast maths. Arrow keys step between changes.
Before the laps · survivorship bias
Where the damage isn’t
In the Second World War, the military wanted to armor its bombers where the returning planes showed the most bullet holes. Abraham Wald saw the bias: the holes marked where a plane could be hit and still come home. The fatal spots were the ones with no holes. The planes hit there never came back to be counted.
Hits on the planes that came back: survivable.Armor here: the planes hit here never returned to be counted.
Design review runs on the same trap. A Figma-first review inspects what came back: the approved frame, in one brand, one language, one theme, at one density. The failures live where no one looks, and they send back no data until a customer finds them. Each lap below goes looking there.
Change 1 of 5
The brand’s primary color changes
Marketing picks a brighter orange. It has to hold up everywhere a button appears.
Figma-first a flow
DesignThe new orange goes into the color style, and every frame using the style repaints.
Hand offDetached instances and exported assets keep the old color until someone spots them.
BuildEngineering copies the new hex into the codebase.
FoundWhite on the new orange measures 2.15:1. No step in the flow measures it, so an audit finds it after launch.
The decision ends upin a review thread that says “looks good”.
Token-first a loop
Try
Draft
Save your changes
Your draft is kept for 30 days. Publish when the team has reviewed it.
Button fill
Label on fill
To keep a white label, the fill becomes
ObserveOne token changes: the brand fill becomes #F59E0B, and every button re-renders.
NameMeasured: white on the new fill is 2.15:1, against the 4.5:1 a label needs.
DecideKeeping white would move the fill to #A56A07, ΔE 0.20. The kit calls that a rebrand, not a tweak, so the label flips to ink: 9.9:1.
CaptureThe pack records the choice and the numbers behind it.
LearnEvery button in every context inherits it, and the contrast gate holds it on every run.
Change 2 of 5
The copy arrives in German
Same components, a longer language. German typically runs about a third longer than English.
Figma-first a flow
DesignFrames are drawn with English copy, and text boxes are sized to fit it.
Hand offRedlines specify widths that were really the English string lengths.
BuildTranslation arrives after the build.
FoundTruncated buttons and three-line titles on the German site, fixed one screen at a time.
The decision ends upas a ticket per screen, and the next language repeats it.
Token-first a loop
Try
Draft
Save your changes
Your draft is kept for 30 days. Publish when the team has reviewed it.
Characters
Body text lines
Elements overflowing their box
Line length token
ObserveSwap the copy to German, in the browser.
NameMeasured: +45% more characters, and nothing overflows its box.
DecideLine length is a token, not a box width, and buttons grow with their labels.
CaptureThe type gate checks line length against real rendered text on every run.
LearnThe next language arrives the same way.
Change 3 of 5
The product gets a dark theme
Every surface flips, and every pair of text and background has to stay readable.
Figma-first a flow
DesignDark is a second set of frames, with colors picked by eye on a bright monitor.
Hand offTwo sets of values to keep in step, per component.
BuildThe dark palette is re-typed in code.
FoundA plugin check ran once, on the frames someone remembered. The palette picked by eye, measured on the right: 3.3:1 for secondary text.
The decision ends upas a note on one frame. The next component needs its dark twin drawn and checked again.
Token-first a loop
Try
Draft
Save your changes
Your draft is kept for 30 days. Publish when the team has reviewed it.
Title on card
Body text on card
Label on button
ObserveDark is a pack: the same slots, filled with other values.
NameMeasured: every pair in the table, in either theme.
DecideA pair that fails fails the build, before anyone sees it.
CaptureThe contrast gate checks 812 pairs across every pack, density and root size.
LearnA new component is dark-ready the day it is built.
Change 4 of 5
A second brand joins
A sister brand needs the same product in its own colors, type and shape.
Figma-first a flow
DesignThe library is duplicated for the new brand; components are detached and restyled.
Hand offTwo libraries, two sets of redlines.
BuildComponents are forked, or sprout brand props.
FoundA fix made in one brand never reaches the other.
The decision ends upsplit across two files, and every brand after that multiplies the drift.
Token-first a loop
Try
Draft
Save your changes
Your draft is kept for 30 days. Publish when the team has reviewed it.
Title on card
Body text on card
Label on button
Component files edited
0
ObserveA brand is a pack: its values, in the same slots.
NameMeasured for each brand: the pairs every brand has to clear.
DecideBrand colors that fail are nudged or rejected when the pack is generated, with the reason written into it.
CaptureThe component never learns which brand it is rendering.
LearnSix brands in this kit, one contract.
Change 5 of 5
A data view needs a dense mode
The people using it want more rows on screen without losing the targets they tap.
Figma-first a flow
DesignA compact variant of each component is drawn by hand.
Hand offCompact button, compact row, compact input, each specified separately.
BuildThe variants are built as separate components.
FoundCompact buttons shrink below a comfortable target, and nothing measures it.
The decision ends upas variants that drift from the originals they copied.
Token-first a loop
Try
Open orders
Order 1042 · 3 items
Order 1043 · 1 item
Order 1044 · 6 items
Density
Row height
Button height (minimum target 24px)
ObserveOne attribute on the region: data-density="compact".
NameMeasured: rows go from 57px to 45px.
DecideSpacing scales with density; tap targets stop at the 24px minimum by design.
CaptureNo variants to keep in step.
LearnAny component, in any region, at any time.
After the laps · expert in the loop
Experts in the loop turn learning into outcomes, not artifacts.
Every lap ended in a call a tool couldn’t make alone: flip the label or move the brand color, which dark palette, how much a dense row can give up. The kit measured, a person who knew what the numbers meant decided, and the loop kept the decision. My aviation talk makes the same case in five eras of flight.
Mechanical flightSkill directly controls the machine.
The crewExperts coordinate, and flight gets reliable.
Full autonomyNobody qualified aboard. A bird strike or a bad sensor breaks it.
The wrong humanA pastry chef at the controls makes it worse.
Expert in the loopSystems handle weather, hazards and stability. The pilot keeps the final say.
Token-first is the fifth era. The gates handle contrast, line length and tap targets, so the expert’s attention goes to the calls only an expert can make.
Five changes, two ways
Loops learn. Flows burn.
Question
Flow · Figma-first
Loop · token-first
Where the change is made
Every frame that shows it
One token, pack or attribute
When problems surface
In QA, an audit, or after launch
In the browser, before merge
Where the decision lives
Threads, tickets and memory
The contract, with its reasons
What the next change starts from
Zero
The last decision
Stake small. Capture truth. Measure diffs. Retune intent. Fund the next lap only when evidence improves.