Turn recurring exceptions into decisions

Not every deviation is a mistake. When a component keeps getting overridden run after run, ds-bridge flags it as needing an owner, so the team can decide whether to fix the usage or evolve the component, without ever hiding it from the numbers.

What you’ll learn: exceptions

What you’ll learn

A hard-coded value or an overridden component is often just an oversight. But when several teams keep overriding the same component in the same way, the library is probably missing a real use case. That’s useful feedback, and a score alone can’t tell you which case you’re looking at.

ds-bridge watches for deviations that keep coming back across your recorded runs, and turns each one into a conversation with a clear owner: does the implementation need fixing, or should the component evolve?

This tutorial is for design-system managers and designers who look after a Figma library.

Setup

You’ll need the ds-bridge plugin, a connected Figma library, and at least two recorded library-health runs. A deviation has to show up more than once before it counts as recurring.

ds-bridge library-health        # or: ds-bridge record --figma

Each run saves the top components for each signal (override hotspots, deprecated components still in use, likely detached instances) to .ds-bridge/history.jsonl. Run it again after a week of work, or let CI record it for you.

Steps

  1. Review the queue. In Claude Code, run the slash command. It lists every recurring exception, the ones still waiting for an owner first:

    /ds-bridge:exceptions
    ds-bridge report --artifacts exceptions-review --open   # the same, as a page
    

    A component is listed when it shows up on two or more recorded runs and isn’t back to zero. A one-off deviation is left out on purpose.

  2. Read each row as a question, not a fault. A row with no owner asks the question that fits its signal:

    • Overrides: fix the usage, or evolve the component?
    • Deprecated: migrate off it, or does the replacement miss a use case?
    • Detached: re-attach it, or does the component miss a use case?

    The answer usually comes from talking to the team that made the change. The tool’s job is to show you where that conversation needs to happen.

  3. Log the owner and the decision. Add an entry to the exceptions array in .ds-bridge.json. /ds-bridge:exceptions drafts it for you and edits the file only after you confirm.

    {
      "exceptions": [
        {
          "component": "Card",
          "owner": "@checkout-design",
          "decision": "evolve-component",
          "note": "Needs a compact layout for order lists",
          "review_by": "2026-11-15"
        }
      ]
    }
    

    decision is one of investigating, fix-implementation or evolve-component. note and review_by are optional. Add "signal": "overrides" (or deprecated, detached) to scope an entry to one signal. Without it, the entry covers all three for that component. Because the file is committed, the decision is reviewed in a pull request like any other change.

  4. Keep the queue current. Each later run updates the state of every entry:

    • Overdue: the review_by date has passed and the deviation is still there. Pick a new date or a new decision.
    • Resolved: the component’s count is back to zero. Remove the entry.
    • Not seen: the name matches nothing that was recorded, usually a typo.
  5. Share it. The Recurring exceptions panel is part of the dashboard and the ds-designer and ds-manager views. It is also in ds-bridge report --format json, so it travels with everything else.

Result

> /ds-bridge:exceptionsexample · acme-shop
Recorded runs2
Need an owner1
Decided1
  • Legacy Buttonneeds an owneroverrides · 1 latest · 2 of 2 runsfix the usage, or evolve the component?
  • Legacy Buttonfix the implementationdeprecated · 1 latest · 2 of 2 runs@acme-design · review by Oct 31 · “Swap the last instance for Button”
Deviations that keep coming back, run after run — each one either waiting for an owner or carrying the decision someone made. Logging one never changes a score.

Recurring deviations are no longer a number to argue about. Each one has an owner, a decision and a date, stored in your repo next to the code.

Troubleshooting