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:

LayerExample evidenceDecision
DesignDefault and dark variants specified; pending state absentAdd a pending-state specification before implementation
ComponentDefault story exists; focus and pending stories missingAdd observable states and verify their behavior
ProductInvitation action uses a local button with a literal colorMigrate 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:

  1. Repair the shared component. The intended pattern is sound, but the implementation does not support it.
  2. Repair the specification. The library leaves a decision undefined or contradicts the intended behavior.
  3. Migrate a consumer. A product screen bypasses a suitable shared component.
  4. 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.