Where will your agent have to guess?
No gaps found.
Your repo gives the agent a clear answer for every check in this scan.

Fixes you can make right now to increase the health score

One fix could raise the design system health score from 83 to 94.

01
Unwind the 37 !important declarations
+11
Each one is a selector losing an argument with another selector; typography.css alone carries 8. Fix the specificity at the source and they stop being necessary.
paste it into your agent ·

What your AI agent sees today

Your agent reads AGENTS.md, .cursor/rules, plus 7 rules files nested in subfolders. But none of it points at a single source of truth for components and tokens, because there isn't one yet. The numbers below are what your agent actually works from.

AGENTS.md · generic (AGENTS.md standard).cursor/rules · Cursor+7 nested in subfolders

Readable by: Claude Code — · Codex ✓ · Cursor ✓ · Claude Code skips AGENTS.md: add a CLAUDE.md containing the single line @AGENTS.md and it reads the same rules

4 rule references gone stale · a rule your agent obeys is worse than no rule when the repo has moved on
@spectrum-web-components/COMPONENT/sp-COMPONENT.js named in .cursor/rules/component-readme.mdc, but the path no longer exists
2nd-gen/packages/swc/components/component-name/Component.ts named in .cursor/rules/stories-documentation.mdc, but the path no longer exists
2nd-gen/packages/core/components/component-name/Component.base.ts named in .cursor/rules/stories-documentation.mdc, but the path no longer exists
../../stylelint.config.js named in .cursor/rules/styles.mdc, but the path no longer exists

Rules rot quietly: nobody edits them when a component is renamed or a file moves. Regenerate them from a fresh scan, or fix the lines by hand.

Give the agent the answers

the rules file generated from this scan, wrapped as a present. Agents do not always ask before inventing, so the plugin also checks every file they edit, and guard-my-design-system checks the pull request.

Agent trap. 37 !important declarations, and each one forces a style through instead of fixing the rule that blocked it. An agent whose style will not apply does what the repo taught it and adds another. The count only goes up.
748
distinct colours
Ideal Design System~24 ▲
Avg web-component repo218 ▲
Reputable systems14 ▲
64
shades of grey
Ideal Design System~13 ▲
Avg web-component repo21 ▲
Reputable systems4 ▲
12
off-scale spacing values
Ideal Design System~12 =
Avg web-component repo24 · cleaner than 86% ▼
Reputable systems5 ▲
0
duplicated components
Ideal Design System0 =
Avg web-component repo1 ▼
Reputable systems9 ▼
0
inline style blocks
Ideal Design System0 =
Avg web-component repo13 ▼
Reputable systems12 ▼
1
near-identical colour pairs
Ideal Design System0 ▲
Avg web-component repo3 · cleaner than 86% ▼
Reputable systems1 =
37
!important declarations
Ideal Design System0 ▲
Avg web-component repo27 ▲
Reputable systems3 ▲
0
components never imported
Ideal Design System0 =
Avg web-component repo8 ▼
Reputable systems0 =
library: internal use only, downstream consumers invisible
0
arbitrary bracket values
Ideal Design System~20 ▼
Reputable systems0 =

Package by package

2 packages with enough UI to judge · the repo score above is the whole thing blended, and 90 packages were too small or too backend to score

packagescoreworst findingsize
2nd-gen/packages/swc 90 24 !important declarations 179 files
1st-gen/tools/styles 95 1 !important declarations 7 files

A repo scores below its own packages by arithmetic, not by accident: distinct values add up across packages, so the whole always carries more than any part. Read the package scores for where each team stands, and the repo score for what your agent sees when it looks at everything at once.

Palette
748colours

A healthy product palette is up to ~24 colours: one brand hue with a few tints, one accent, up to 13 greys, and status colours.

740 tokens8 strays
Colour usage
Sized by how often the code uses each colour
token named, colour not shown stray
+567
+13

Of every 100 colour uses, 97 use a theme colour by name and 3 are strays. A stray is a value written by hand.

Grey ramp · sorted dark → light · how many can you tell apart?
1 nearly identical pair · each pair is 1 colour recorded twice
rgb(252 125 0) ×3 ≈ #ff8000 ×1

12 off-scale spacing values

a disciplined repo keeps these around a dozen · on-scale Tailwind steps (·) shown for context · off-scale in coral

-1px
13
8px
5
2px
4
20px
2
1em
2
0px
1
-999em
1
-44px
1
0.25em
1
100px
1
3em
1
2em
1

Typography & shape

18
typefaces
Ideal Design System~3 ▲
Avg web-component repo1 · messier than 86% ▲
Reputable systems1 ▲
65
font sizes
Ideal Design System~10 ▲
Avg web-component repo10 · messier than 86% ▲
Reputable systems5 ▲
63
border radii
Ideal Design System~10 ▲
Avg web-component repo11 · messier than 86% ▲
37
shadow styles
Ideal Design System~6 ▲
Avg web-component repo27 · messier than 71% ▲
Reputable systems1 ▲
the font sizes, by use
token("font-size-100") ×9var(--mod-menu-section-header-font-size, var(--spectrum-menu-section-header-font-size)) ×8token("font-size-75") ×5var(--mod-heading-cjk-font-size, var(--spectrum-heading-cjk-font-size)) ×4var(--mod-heading-font-size, var(--spectrum-heading-font-size)) ×3var(--mod-body-font-size, var(--spectrum-body-font-size)) ×3var(--mod-detail-font-size, var(--spectrum-detail-font-size)) ×3var(--mod-code-font-size, var(--spectrum-code-font-size)) ×3token("font-size-200") ×3100% ×2var(--mod-dialog-confirm-title-text-size, var(--spectrum-dialog-confirm-title-text-size)) ×2var(--mod-menu-item-label-font-size, var(--spectrum-menu-item-label-font-size)) ×2var(--mod-progressbar-font-size, var(--spectrum-progressbar-font-size)) ×2var(--mod-slider-font-size, var(--spectrum-slider-font-size)) ×2
the corners, drawn · 63 radii in one interface
100% ×11
50% ×6
24px ×1
30px ×1
9999px ×1

18 typefaces, declared 61 different ways

every distinct declaration is a chance for the next one to be wrong

token("sans-serif-font")×17
var(--mod-button-font-family, var(--mod-sans-font-family-stack, var(--×6
var(--mod-body-sans-serif-font-family, var(--spectrum-body-sans-serif-×4
var(--mod-heading-cjk-font-family, var(--spectrum-heading-cjk-font-fam×4
var(--mod-body-cjk-font-family, var(--spectrum-body-cjk-font-family))×4
var(--mod-detail-cjk-font-family, var(--spectrum-detail-cjk-font-famil×4
var(--mod-code-cjk-font-family, var(--spectrum-code-cjk-font-family))×4
token("serif-font")×4

Where it hurts most

the 5 files carrying the most off-system styling

01 2nd-gen/packages/swc/stylesheets/swc.css 7 stray colours
02 1st-gen/packages/color-wheel/src/spectrum-color-wheel.css 6 stray colours
03 1st-gen/packages/card/src/spectrum-card.css 4 stray colours
04 1st-gen/packages/textfield/src/spectrum-textfield.css 3 stray colours
05 1st-gen/tools/reactive-controllers/src/ColorController.ts 3 stray colours

37 !important declarations

styling no system can see

37 !important declarations · each one forces a style through
typography.css ×8card-template.css ×6overlay.css ×3tooltip.css ×3illustrated-message.css ×3tooltip.css ×3

The composition map

16 components defined · tile area is internal use: how the system builds from itself, downstream consumers invisible from here · the real system, drawn to scale

5 components are imported exactly once: <BreadcrumbItem>, <Combobox>, <CssTable>, <OnionSkinner>, <StoryDecorator>. Quiet corners, not yet a system.

componentuseddefined inprops
<Theme> 3× 1st-gen/tools/theme/sp-theme.ts none
<InfieldButton> 2× 1st-gen/packages/infield-button/sp-infield-button.ts none
<BreadcrumbItem> 1× 1st-gen/packages/breadcrumbs/sp-breadcrumb-item.ts none
<Combobox> 1× 1st-gen/packages/combobox/sp-combobox.ts none
<CssTable> 1× 1st-gen/projects/css-custom-vars-viewer/src/sp-css-table.ts none
<OnionSkinner> 1× 1st-gen/projects/vrt-compare/onion-skinner.ts none
<StoryDecorator> 1× 1st-gen/projects/story-decorator/sp-story-decorator.ts none
Generated by roast-my-design-system ver. 10.2.1 · free to run: npx roast-my-design-system@latest · also a Claude Code + Codex skill and a local MCP server
Designed and built by Greg Kozakiewicz · 747e9d93ad9e · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real