25 decisions of record
One decision per file, numbered and never reassigned. Two superseded, one deliberately left open.
DECISION REGISTERFINTECH · DESIGN SYSTEM · 0→1, THEN SCALE
I built the token architecture, component contracts and governance for a B2B fintech platform's design system — then rebuilt the parts I got wrong, on the record.
Reconstructed catalog shown for public-safe storytelling. Client name, brand marks, counterparties and amounts are adapted or invented. No proprietary metrics appear here.

// AT A GLANCE
Component count is the usual measure. The one that predicted whether this system survived a team change was whether a decision could be found, questioned and reversed.
One decision per file, numbered and never reassigned. Two superseded, one deliberately left open.
DECISION REGISTERTokens in Figma variables, components built twice, mapping in Code Connect. No layer has two owners.
ARCHITECTUREForm drift for every component; value correctness for anything that renders money or a number.
VERIFICATION// THE PROBLEM
The platform grew from its first flows into a complex fintech product, and the system grew with it — unevenly. We were not short of components. Nobody could tell which version of a decision was current, so teams re-litigated settled questions and quietly diverged.
Durable decisions lived as dated callouts across four places.
NOT FINDABLEA retired tool stayed named as source of truth for five weeks.
OBSERVABLE COSTParallel sets defined different greys, radii and font stacks.
FRAGMENTATIONThe documented button and the shipped button were not the same.
DRIFT// ARCHITECTURE
The tempting fix is bidirectional sync between design and code. I ruled it out. Components are built twice, deliberately, and alignment is enforced by a contract and an automated check rather than by a pipeline that pretends two representations are one.
One source, one direction, so there is no merge to arbitrate.
SOURCEA semantic token points at a primitive and nothing else.
CONSTRAINTFigma variables plus a hand-authored layer, merged in the build.
PIPELINEA structure copied per module does not scale, it multiplies.
LAYERINGConsumed at a version. A fork is a liability, not a shortcut.
BOUNDARY
// TRANSPARENCY AS A TOKEN PROBLEM
The platform's principles were already written. My job was the design-system reading of each: what a component must actually do to honor it, and how it fails. That turned three sentences into enforceable rules.
A negative sign is always visible and never carried by colour alone. Rounding never silently loses precision. The positive and negative pair passes AA independent of colour perception. These are correctness rules, so they are a contract — not a guideline.
VALUE CORRECTNESSWhere colour carries financial meaning, a mode in which that meaning degrades is a correctness bug. That is why light and dark ship together: a component is not done until both modes are done.
ONE RELEASEAI state got its own semantic namespace inside the existing collections, so an accent meaning "the model is unsure" is never the accent meaning "payment pending".
AI TOKEN GROUP
// GOVERNANCE
Every rule here exists because its absence had already cost us something. Rules this specific are cheap to follow; vague ones get ignored.
No foundation token change without an eight-step gate that starts with a written proposal naming the rationale, the affected surfaces and the migration. Token changes are wide-impact by definition.
EIGHT-STEP GATEBefore any new component: does the reference system already solve this well? The answer gets written down either way, so the same question isn't re-argued next quarter.
REUSE BEFORE CREATINGDesign never touches component code; engineering never invents design. The token package is the contract between them. Shared ownership of the same artifact is how drift starts.
DESIGN / CODE BOUNDARYA deterministic check with no AI in it sits between the build and human review. Red means something changed, not that it is wrong. A human still decides, but starts from a diff instead of a blank page.
VERIFICATION
// OUTCOME
Most of the product surface now renders from the system, and two people keep it current. The change I valued most is harder to count: once the primitives were settled, design review moved off spacing and onto whether the flow was right.
Rendering from system components, not one-off styling. The rest is legacy, on a known path.
COVERAGEEvery pod shipping from the same primitives, so a component decided once didn't get re-decided in parallel three more times.
CONSUMERSMe and one developer. The register answers most questions without either of us.
LEVERAGEDeliberately small. Gate zero asks if the reference system already solves it.
LIBRARYEvery one resolved in both light and dark, so theming is a token concern and never a component override.
FOUNDATIONTwo superseded, one still open. New designers onboard by reading why, not by asking someone who remembers.
GOVERNANCEFigures describe the system artifact — component, token and decision counts are countable in the repository. Coverage and team numbers are my own, stated without client-identifying detail.
// THE ARTIFACT
The catalog renders components in isolation so their API, states and behaviour are proven before they reach the product. It is the shared reference between design and engineering, and it is executable — you can open it, change a prop, and flip the theme.
The catalog opens in full screen. Colour ramps, type scale, components, patterns and the theme switch are all live.

// WHAT I GOT WRONG
An accepted decision is never edited to change its meaning — a new one supersedes it and the original stays as history. That rule is uncomfortable by design, and it is the reason these are visible at all.
"The showcase app" was ambiguous and pointed at the wrong one. Superseded once the product's own component catalog became the home and the showcase became reference only.
SUPERSEDEDI recorded that the framework version inherited no headless behaviour. Both premises turned out to be wrong — the version and the behaviour source. The replacement names the real runtime and specifies accessibility behaviour per component.
SUPERSEDEDWhat supplies interaction behaviour going forward is still open. The evidence is gathered so it is not re-derived, and the record names the conditions that should trigger the decision. Proposed is not allowed to quietly become permanent.
OPENUnverified assumptions carry a verification date, so a stale constraint is visible as stale rather than mistaken for a fact.
IN PROGRESS// REFLECTION
The architecture held. The thing that nearly sank it was that decisions had nowhere to live for the first stretch, and recovering that history cost more than recording it would have.
Reconstructing six months of reasoning costs far more.
RecordA principle that cannot be failed cannot be applied.
ApplyA check that says this changed beats ten more components.
VerifyNothing failed when they diverged. That check comes first.
Enforce