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

Three fixes could raise the design system health score from 43 to 67.

01
Tokenise the 99 stray colours
+8
They are hardcoded where no token names them; devel-common/src/sphinx_exts/pagefind_search/static/css/pagefind.css alone carries 76. Every one is a value your agent will happily copy.
paste it into your agent ·
02
Collapse the 14 near-identical colours
+8
#6c757d and #6e7681 are the same colour to any eye, and they are used 9 times between them. Nobody chose to have both. Pick the one that is already a token, point the other at it, and the pair stops multiplying.
paste it into your agent ·
03
Unwind the 14 !important declarations
+8
Each one is a selector losing an argument with another selector; custom.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 CLAUDE.md, AGENTS.md, .github/instructions, plus 14 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.

CLAUDE.md · Claude CodeAGENTS.md · generic (AGENTS.md standard).github/instructions · GitHub Copilot (scoped)+14 nested in subfolders

Readable by: Claude Code ✓ · Codex ✓ · Cursor ✓

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. <Content> alone has 6 implementations. An agent asked for one can not tell which is the real one, so it picks 1 at random or writes another. Every wrong pick becomes the example the next agent copies.
Agent trap. This palette holds 14 pairs of colours a screen can barely tell apart. An agent asked for the brand grey can not see the difference either, so it copies whichever twin is nearest, and when unsure it writes a third between them. 2 becomes 3.
166
distinct colours
Ideal Design System~24 ▲
Avg chakra repo48 · messier than 81% ▲
Reputable systems14 ▲
27
shades of grey
Ideal Design System~13 ▲
Avg chakra repo9 · messier than 81% ▲
Reputable systems2 ▲
40
off-scale spacing values
Ideal Design System~12 ▲
Avg chakra repo9 · messier than 81% ▲
Reputable systems5 ▲
17
duplicated components
Ideal Design System0 ▲
Avg chakra repo3 · messier than 88% ▲
Reputable systems9 ▲
44
inline style blocks
Ideal Design System0 ▲
Avg chakra repo20 · messier than 63% ▲
Reputable systems12 ▲
14
near-identical colour pairs
Ideal Design System0 ▲
Avg chakra repo2 · messier than 81% ▲
Reputable systems1 ▲
14
!important declarations
Ideal Design System0 ▲
Avg chakra repo4 · messier than 75% ▲
Reputable systems3 ▲
0
components never imported
Ideal Design System0 =
Avg chakra repo1 ▼
Reputable systems0 =
0
arbitrary bracket values
Ideal Design System~20 ▼
Avg chakra repo18 ▼
Reputable systems0 =
0
colours written on components per 100 kit files
Ideal Design System~3 ▼
Avg chakra repo6 · cleaner than 88% ▼
4
pixel sizes written on components per 100 kit files
Ideal Design System~4 =
Avg chakra repo11 · cleaner than 69% ▼
Palette
166colours

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.

67 tokens99 strays
Colour usage
Sized by how often each is used
token stray
+106
Grey ramp · sorted dark → light · how many can you tell apart?
14 nearly identical pairs · each pair is 1 colour recorded twice
#6c757d ×7 ≈ #6e7681 ×2#495057 ×7 ≈ #51504f ×2#e6edf3 ×3 ≈ #e9ecef ×3#f8f9fa ×4 ≈ #f9fafb ×1#f0f9ff ×2 ≈ #f0fdfa ×2#1a1a1a ×3 ≈ #161b22 ×1#8e8e8d ×3 ≈ #888888 ×1#21262d ×2 ≈ #212529 ×2+6 more

Your Chakra theme, and what is written around it

the theme, and the places a colour or a pixel size was written onto a component instead

Theme in airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/theme.ts and 3 more · read 463 times from components

Components reach the theme 108 times per 100 kit files, through color="fg.muted", bg="gray.100" and p={3}. That is the system working.

2 colours written on components · 0 per 100 kit files
rgb(${bundle.bg}) ×1rgb(${bundle.fg}) ×1
AnsiRenderer.tsx ×2
18 pixel sizes written on components · 4 per 100 kit files
pb: 2px ×3px: 2px ×3gap: 4px ×3paddingY: 8px ×3marginRight: 8px ×2px: 3px ×1px: 5px ×1paddingY: 4px ×1
GridButton.tsx ×4Bar.tsx ×2TaskLogHeader.tsx ×2JobsPage.tsx ×2WorkerPage.tsx ×2

40 off-scale spacing values

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

10px
12
8px
11
0.375rem
9
2px
8
0.125rem
8
20px
7
3px
7
16px
6
1rem
6
15px
6
6px
5
0.5rem
5
0.25rem
5
12px
4
4px
4
0rem
2
5px
2
163px
1

Typography & shape

4
typefaces
Ideal Design System~3 ▲
Avg chakra repo1 · messier than 75% ▲
Reputable systems1 ▲
13
font sizes
Ideal Design System~10 ▲
Avg chakra repo2 · messier than 69% ▲
Reputable systems5 ▲
9
border radii
Ideal Design System~10 ▼
Avg chakra repo2 ▲
14
shadow styles
Ideal Design System~6 ▲
Avg chakra repo2 · messier than 94% ▲
Reputable systems1 ▲
the type scale, at its real sizes · the largest are capped to fit · how many of these are the same decision?
3.75rem ×1 Almost but not quite
3rem ×1 Almost but not quite
2.25rem ×1 Almost but not quite
16px ×1 Almost but not quite
15px ×1 Almost but not quite
14px ×4 Almost but not quite
0.875rem ×1 Almost but not quite
13px ×1 Almost but not quite
12px ×3 Almost but not quite
11px ×5 Almost but not quite
0.625rem ×1 Almost but not quite
the corners, drawn · 9 radii in one interface
4px ×6
6px ×3
50% ×3
5px ×2
8px ×1
2px ×1
the elevations, cast, 10 of 14 · on the light surface they were drawn for
0 10px 40px -10px r… ×3
0 10px 40px -10px l… ×3
0 1px 2px rgba(0, 0… ×2
0 20px 60px rgba(0,… ×1
0 1px 2px rgba(0, 0… ×1
0 2px 8px rgba(0, 0… ×1
0 4px 12px rgba(1, … ×1
0 3px 3px #aaa ×1
0 4px 6px -1px rgba… ×1
light-dark(0 4px 6p… ×1

4 typefaces, declared 5 different ways

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

'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace×3
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue×1
monospace×1
'Plus Jakarta Sans'×1
'JetBrains Mono'×1

Where it hurts most

the 5 files carrying the most off-system styling

01 devel-common/src/sphinx_exts/pagefind_search/static/css/pagefind.css 76 stray colours
02 registry/src/css/main.css 72 stray colours
03 providers/fab/src/airflow/providers/fab/www/static/css/main.css 68 stray colours
04 airflow-core/src/airflow/ui/src/pages/DagsList/AssetSchedule.tsx 11 inline
05 airflow-core/src/airflow/ui/src/components/Graph/nodeColors.ts 3 stray colours

Duplicated components

an agent asking which one is canonical gets several plausible answers. Paths open in VS Code

<Content> · 6 implementations
airflow-core/src/airflow/ui/src/system-components/ActionBar/BarContent.tsx
airflow-core/src/airflow/ui/src/system-components/Dialog/Content.tsx
airflow-core/src/airflow/ui/src/system-components/Menu/MenuContent.tsx
airflow-core/src/airflow/ui/src/system-components/Popover/Content.tsx
airflow-core/src/airflow/ui/src/system-components/Select/Content.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/Select/Content.tsx
<Root> · 4 implementations
airflow-core/src/airflow/ui/src/system-components/Menu/MenuRoot.tsx
airflow-core/src/airflow/ui/src/system-components/Pagination/Root.tsx
airflow-core/src/airflow/ui/src/system-components/Select/Root.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/Select/Root.tsx
<ErrorAlert> · 3 implementations
airflow-core/src/airflow/ui/src/components/ErrorAlert.tsx
airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/alert/ErrorAlert.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ErrorAlert.tsx
<Alert> · 3 implementations
airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/alert/Alert.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/Alert.tsx
airflow-core/src/airflow/ui/src/system-components/Alert.tsx
<Toaster> · 3 implementations
airflow-core/src/airflow/ui/src/system-components/Toaster/Toaster.tsx
providers/common/ai/src/airflow/providers/common/ai/plugins/www/src/toaster.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/toaster.tsx
<Item> · 3 implementations
airflow-core/src/airflow/ui/src/system-components/Pagination/Item.tsx
airflow-core/src/airflow/ui/src/system-components/Select/Item.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/Select/Item.tsx
<CloseTrigger> · 3 implementations
airflow-core/src/airflow/ui/src/system-components/ActionBar/CloseTrigger.tsx
airflow-core/src/airflow/ui/src/system-components/Dialog/CloseTrigger.tsx
airflow-core/src/airflow/ui/src/system-components/Popover/CloseTrigger.tsx
<Trigger> · 3 implementations
airflow-core/src/airflow/ui/src/system-components/Menu/MenuTrigger.tsx
airflow-core/src/airflow/ui/src/system-components/Select/Trigger.tsx
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/Select/Trigger.tsx
alert family · 7 variants
<ErrorAlert>
airflow-core/src/airflow/ui/src/components/ErrorAlert.tsx
used 49×
<ErrorAlert>
airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/alert/ErrorAlert.tsx
used 46×
<ErrorAlert>
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ErrorAlert.tsx
used 46×
<Alert>
airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/alert/Alert.tsx
used 8×
<Alert>
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/Alert.tsx
used 8×
<Alert>
airflow-core/src/airflow/ui/src/system-components/Alert.tsx
used 7×
…and 1 more
badge family · 6 variants
<StateBadge>
airflow-core/src/airflow/ui/src/components/StateBadge.tsx
used 50×
<StateBadge>
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/StateBadge.tsx
used 47×
<DrainingBadge>
airflow-core/src/airflow/ui/src/components/DrainingBadge.tsx
used 3×
<WorkerStateBadge>
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/WorkerStateBadge.tsx
used 3×
<NeedsReviewBadge>
airflow-core/src/airflow/ui/src/components/NeedsReviewBadge.tsx
used 2×
<WorkerSysinfoBadge>
providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/WorkerSysinfoBadge.tsx
used 1×
card family · 6 variants
<HeaderCard>
airflow-core/src/airflow/ui/src/components/HeaderCard.tsx
used 8×
<RadioCardItem>
airflow-core/src/airflow/ui/src/system-components/RadioCard.tsx
used 7×
<StatsCard>
airflow-core/src/airflow/ui/src/components/StatsCard.tsx
used 7×
<RadioCardRoot>
airflow-core/src/airflow/ui/src/system-components/RadioCard.tsx
used 5×
<RadioCardLabel>
airflow-core/src/airflow/ui/src/system-components/RadioCard.tsx
used 2×
<CardList>
airflow-core/src/airflow/ui/src/components/DataTable/CardList.tsx
used 1×
toggle family · 5 variants
<TogglePause>
airflow-core/src/airflow/ui/src/components/TogglePause.tsx
used 4×
<AdvancedSearchToggle>
airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx
used 2×
<PasswordToggle>
airflow-core/src/airflow/ui/src/components/PasswordToggle.tsx
used 2×
<MatchModeToggle>
airflow-core/src/airflow/ui/src/components/MatchModeToggle.tsx
used 1×
<ToggleGroups>
airflow-core/src/airflow/ui/src/layouts/Details/ToggleGroups.tsx
used 1×
form family · 5 variants
<FlexibleForm>
airflow-core/src/airflow/ui/src/components/FlexibleForm/FlexibleForm.tsx
used 3×
<ConfigForm>
airflow-core/src/airflow/ui/src/components/ConfigForm.tsx
used 2×
<TriggerDAGForm>
airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGForm.tsx
used 2×
<LoginForm>
airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/login/LoginForm.tsx
used 1×
<RunBackfillForm>
airflow-core/src/airflow/ui/src/components/DagActions/RunBackfillForm.tsx
used 1×
link family · 4 variants
<RouterLink>
airflow-core/src/airflow/ui/src/system-components/RouterLink.tsx
used 63×
<CrumbLink>
airflow-core/src/airflow/ui/src/components/Breadcrumb/Crumb.tsx
used 2×
<TaskLink>
airflow-core/src/airflow/ui/src/components/Graph/TaskLink.tsx
used 1×
<ClipboardLink>
airflow-core/src/airflow/ui/src/system-components/Clipboard.tsx

44 inline style blocks

styling no system can see

airflow-core/src/airflow/ui/src/pages/DagsList/AssetSchedule.tsx×11
airflow-core/src/airflow/ui/src/pages/Connections/ConnectionForm.tsx×3
airflow-core/src/airflow/ui/src/components/Graph/NodeWrapper.tsx×2
airflow-core/src/airflow/ui/src/components/TeamSelector.tsx×2
airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGAdvancedOptions.tsx×2
airflow-core/src/airflow/ui/src/layouts/Details/Gantt/GanttTimeline.tsx×2
14 !important declarations · each one forces a style through
custom.css ×8main.css ×3main.css ×3

The adoption map

328 components defined · tile area is import count · the real system, drawn to scale

<Time> · used 110× · airflow-core/src/airflow/ui/src/components/Time.tsx Time 110× <IconButton> · used 80× · airflow-core/src/airflow/ui/src/system-components/IconButton.tsx IconButton 80× <RouterLink> · used 63× · airflow-core/src/airflow/ui/src/system-components/RouterLink.tsx RouterLink 63× <Tooltip> · used 52× · airflow-core/src/airflow/ui/src/system-components/Tooltip.tsx Tooltip 52× <StateBadge> · used 50× · airflow-core/src/airflow/ui/src/components/StateBadge.tsx StateBadge 50× <ErrorAlert> · used 49× · airflow-core/src/airflow/ui/src/components/ErrorAlert.tsx ErrorAlert 49× <Modal> · used 47× · airflow-core/src/airflow/ui/src/system-components/Modal/Modal.tsx Modal 47× <StateBadge> · used 47× · providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/StateBadge.tsx StateBadge 47× <ErrorAlert> · used 46× · airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/alert/ErrorAlert.tsx ErrorAlert 46× <ErrorAlert> · used 46× · providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ErrorAlert.tsx ErrorAlert 46× <DataTable> · used 29× · airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx DataTable 29× <TruncatedText> · used 22× · airflow-core/src/airflow/ui/src/components/TruncatedText.tsx TruncatedText 22× <CloseButton> · used 21× · providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ui/CloseButton.tsx CloseButton 21× <Checkbox> · used 16× · airflow-core/src/airflow/ui/src/system-components/Checkbox.tsx Checkbox 16× <SearchBar> · used 16× · airflow-core/src/airflow/ui/src/components/SearchBar.tsx SearchBar 16× <SearchBar> · used 16× · providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/SearchBar.tsx SearchBar 16× <ClipboardIconButton> · used 14× · airflow-core/src/airflow/ui/src/system-components/Clipboard.tsx Clipboard… 14× <ClipboardRoot> · used 14× · airflow-core/src/airflow/ui/src/system-components/Clipboard.tsx Clipboard… 14× <TeamName> · used 14× · airflow-core/src/airflow/ui/src/components/TeamName.tsx TeamName 14× <FilterBar> · used 12× · airflow-core/src/airflow/ui/src/components/FilterBar/FilterBar.tsx FilterBar 12× <ReactMarkdown> · used 12× · airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx ReactMarkdown 12× <StateIcon> · used 12× · airflow-core/src/airflow/ui/src/components/StateIcon.tsx StateIcon 12× <StateIcon> · used 12× · providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/StateIcon.tsx StateIcon 12× <NavButton> · used 11× · airflow-core/src/airflow/ui/src/layouts/Nav/NavButton.tsx NavButton 11×

121 more adopted components below the top 24, not drawn.

128 components are imported exactly once: <AddQueueButton>, <AdminButton>, <AndGateNode>, <AssetEvent>, <AssetEventsFilter>, <AssetProgressCell> and 122 more. Quiet corners, not yet a system.

componentuseddefined inprops
<Time> 110× airflow-core/src/airflow/ui/src/components/Time.tsx datetime format DEFAULT_DATETIME_FORMAT showTooltip rest
<IconButton> 80× airflow-core/src/airflow/ui/src/system-components/IconButton.tsx label variant
<RouterLink> 63× airflow-core/src/airflow/ui/src/system-components/RouterLink.tsx to rest
<Tooltip> 52× airflow-core/src/airflow/ui/src/system-components/Tooltip.tsx none
<StateBadge> 50× airflow-core/src/airflow/ui/src/components/StateBadge.tsx state rest
<ErrorAlert> 49× airflow-core/src/airflow/ui/src/components/ErrorAlert.tsx error err
<Modal> 47× airflow-core/src/airflow/ui/src/system-components/Modal/Modal.tsx bodyProps cancelActionProps contentProps footerActions footerProps
<StateBadge> 47× providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/StateBadge.tsx state rest
<ErrorAlert> 46× airflow-core/src/airflow/api_fastapi/auth/managers/simple/ui/src/alert/ErrorAlert.tsx error err
<ErrorAlert> 46× providers/edge3/src/airflow/providers/edge3/plugins/www/src/components/ErrorAlert.tsx error err
Generated by roast-my-design-system ver. 9.4.0 · 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 · 5e6c1ec25d08 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real