A design system audit should end with decisions: which shared components to repair, which product exceptions to keep, and who owns the next change. A count of inconsistent colors cannot tell you that on its own.
This guide compares three sources: the design library, the component implementation, and a small sample of product screens. Start with one important workflow. Expand only when the findings justify it.
Download the inventory worksheet and sample findings (CSV). The first rows are fictional demonstration data. Replace them with evidence from your own product.
Decide what you are auditing
Write a short scope before opening Figma. For example: “Review the invitation flow, from entering an email to resolving a failed invitation, in light and dark themes.” Name the design file, component-library version and product release. A moving target makes findings hard to reproduce.
Choose a sample that includes a common task, a consequential failure and a permission boundary. This is a purposeful sample, not a statistical estimate of the whole product. Record what you exclude: mobile, other themes or other workflows. A clean sample does not establish that the rest of the system is healthy.
Build an inventory that connects design to use
For each component in the sampled flow, record:
- The design component and variant, including the variable mode.
- The coded component and version or commit.
- The screen where it is used and the state being reviewed.
- The expected behavior and the observed difference.
- Evidence someone else can revisit: a frame, story, screenshot or reproduction.
A component named “Button” in both places is not enough to establish parity. Compare the variant, theme, content and state. Figma variable modes can supply different values for the same variable; checking only a default swatch misses that distinction.
Work through one discrepancy
Consider this constructed example, not a client finding. The design contract says that an invitation’s primary action uses action.primary, has a visible keyboard focus treatment and communicates a pending request. The sample implementation uses a literal color and has only a default state.
/* Demonstration contract */
:root { --action-primary: #202020; }
.light { --action-primary: #202020; }
.dark { --action-primary: #f2efe9; }
/* Demonstration consumer: a literal bypasses the theme decision. */
.invite-button { background: #202020; }
The mismatch is not simply “wrong color.” The consumer has stopped following the shared theme decision. Changing the design variable will not update it. Replacing the literal with a token can solve that specific issue, but it does not prove that the label contrast, focus appearance or pending behavior is correct.
Now compare the other parts of the contract:
| Layer | Example evidence | Decision |
|---|---|---|
| Design | Default and dark variants specified; pending state absent | Add a pending-state specification before implementation |
| Component | Default story exists; focus and pending stories missing | Add observable states and verify their behavior |
| Product | Invitation action uses a local button with a literal color | Migrate this consumer after shared behavior is ready |
One discrepancy can therefore require three changes. Assigning the whole finding to “frontend” hides the missing design decision. Assigning it only to design leaves the product exception in place.
Classify the finding before choosing a fix
Use four dispositions rather than treating every difference as a violation:
- Repair the shared component. The intended pattern is sound, but the implementation does not support it.
- Repair the specification. The library leaves a decision undefined or contradicts the intended behavior.
- Migrate a consumer. A product screen bypasses a suitable shared component.
- Keep a documented exception. The product has a real requirement the shared pattern should not absorb yet.
For an exception, record its reason, owner and review condition. “We needed it quickly” explains its origin; it does not establish why it should remain.
Separate coverage from correctness
Report at least two quantities: the items inspected and the items with supported findings. “Three of twelve sampled controls bypass shared tokens” is defensible if your inventory shows those twelve controls. “The design system is 75% healthy” is not the same claim.
Also record repeated impact. A defect in a component used in the main workflow deserves different attention from an isolated decorative difference. Do not multiply a speculative user impact by an arbitrary severity score and present the result as measured business cost.
For accessibility, combine automated checks with manual review. Storybook’s accessibility testing can check component stories, but a passing story is not proof that the full product workflow is accessible. Check the component in context as well.
Turn the audit into a repair sequence
For the demonstration above, a sensible order is: specify pending behavior, implement and check the shared component, migrate the invitation screen, then inspect other consumers for the same pattern. This prevents several teams from inventing different local fixes.
Each action needs an owner and an acceptance check. Replace “fix token usage” with “the invitation action follows the selected theme without a local color override; its label and focus treatment remain legible in both themes.” Record separate checks for pending, success and failure behavior.
Close a finding only after revisiting the same screen and state. Keep the original evidence beside the resolution. A merged change is evidence of implementation; it is not evidence that every consumer adopted it.
Use the result on the next release
Keep the inventory small enough to maintain. Revisit it after a component migration, a new theme or a meaningful workflow change. Add examples when a recurring gap exposes a missing rule; remove obsolete exceptions only after confirming they are no longer used.
For the release review itself, use the design QA guide. If the problem is deciding whether a workflow makes sense at all, start with the worked UX audit.
Review notes
First published September 9, 2026. This is a maintained field guide. The examples and worksheet describe a fictional invitation flow, with no claimed client outcomes. Send a correction or an example we should cover.