What will your agent learn here?
This repo gives an agent something to copy everywhere this scan can measure.
25 components exist in more than 1 version. An agent asked for a Button can not tell which one to use. 97 inline style blocks skip the design system. An agent that reads them learns to do the same. 4 lines in your agent rules refer to files that no longer exist. Messier than the median of 34 scanned repos on 3 of 6 core metrics. And the median repo is already a mess.

Where agents will invent

No gap found. This scan checks for one kind of gap so far, a chart palette, and this repo either has one or has no charts. The list grows as more gap kinds are measured on real agent runs; a clean result here says the known gaps are closed, and no more than that.

Fix what makes agents guess

Three tweaks · 60 → 78

01
Fold 97 inline style blocks back into the system
+9
These are static values written as style attributes; start with frontend/src/component/admin/auth/OidcAuth/OidcAuth.tsx (9 blocks). Dynamic positioning was already excluded, so all of these could be classes or tokens today.
paste it into your agent ·
02
Collapse the 3 near-identical colours
+9
#635dc5 and #615bc2 are the same colour to any eye. 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
Crown the canonical <DeleteUser>
under 2 · +5
25 component names have competing implementations. Start with <DeleteUser>: frontend/src/component/admin/users/InactiveUsersList/DeleteUser/DeleteUser.tsx vs frontend/src/component/admin/users/UsersList/DeleteUser/DeleteUser.tsx. Decide which one is canonical, re-export it from one home, and rename or fold in the other.
paste it into your agent ·

What your AI agent sees today

Your agent reads CLAUDE.md, AGENTS.md. 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)

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

4 rule references gone stale · a rule your agent obeys is worse than no rule when the repo has moved on
unleash-enterprise/src/index.ts named in CLAUDE.md, but the path no longer exists
enterprise/src/util/setup-stores.ts named in CLAUDE.md, but the path no longer exists
enterprise/src/util/setup-services.ts named in CLAUDE.md, but the path no longer exists
enterprise/src/create-enterprise-routes.ts named in CLAUDE.md, 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. <StyledSuccessIcon> 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. 97 inline styles live where the system should. An agent learns a codebase by example, and every inline style is an example that says the system is optional. Each one it copies becomes the example for the next.
203
distinct colours
Ideal Design System~24 ▲
Avg mui repo141 ▲
Reputable systems14 ▲
19
shades of grey
Ideal Design System~13 ▲
Avg mui repo31 · cleaner than 63% ▼
Reputable systems2 ▲
17
off-scale spacing values
Ideal Design System~12 ▲
Avg mui repo15 ▲
Reputable systems5 ▲
25
duplicated components
Ideal Design System0 ▲
Avg mui repo12 · messier than 68% ▲
Reputable systems9 ▲
97
inline style blocks
Ideal Design System0 ▲
Avg mui repo28 · messier than 63% ▲
Reputable systems12 ▲
3
near-identical colour pairs
Ideal Design System0 ▲
Avg mui repo3 =
Reputable systems1 ▲
1
!important declarations
Ideal Design System0 ▲
Avg mui repo1 =
Reputable systems3 ▼
0
components never imported
Ideal Design System0 =
Reputable systems0 =
library: internal use only, downstream consumers invisible
0
arbitrary bracket values
Ideal Design System~20 ▼
Reputable systems0 =
4
colours written on components per 100 kit files
Ideal Design System~4 =
Avg mui repo9 · cleaner than 63% ▼
2
pixel sizes written on components per 100 kit files
Ideal Design System~4 ▼
Avg mui repo10 · cleaner than 79% ▼
Palette
203colours

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.

193 tokens10 strays
Colour usage
Sized by how often each is used
token stray
+143
Grey ramp · sorted dark → light · how many can you tell apart?
3 nearly identical pairs · each pair is 1 colour recorded twice
#635dc5 ×1 ≈ #615bc2 ×1#757575 ×1 ≈ #78787a ×1#201e42 ×1 ≈ #1a2641 ×1

Your MUI 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 frontend/src/themes/dark-theme.ts and 1 more · read 6,162 times from components

Components reach the theme 556 times per 100 kit files, through text.secondary and theme.spacing(). That is the system working.

43 colours written on components · 4 per 100 kit files
#6c65e5 ×4#f1f0fc ×3#302e42 ×3#fff ×3#607b81 ×3rgba(0,0,0,0.5) ×3#201e42 ×2#546c71 ×2
ProjectActivity.tsx ×6SnakeGame.tsx ×6IntroShowcase.tsx ×5AdminListItem.tsx ×4AuthPageLayout.tsx ×4
17 pixel sizes written on components · 2 per 100 kit files
padding: 20px ×7paddingBlock: 7px ×2marginBottom: 4px ×2marginBottom: 2px ×2marginRight: 5px ×2gap: 8px ×1gap: 12px ×1
OidcAuth.tsx ×3SsoGroupSettings.tsx ×2PasswordMatcher.tsx ×2AutoCreateForm.tsx ×1PasswordAuth.tsx ×1

Not counted: 4 files of colour data or artwork (bar-chart-options.ts, PlausibleChart.tsx, LineChart.tsx).

17 off-scale spacing values

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

1rem
13
16px
8
20px
8
0.5rem
6
8px
4
10px
4
24px
3
0.6rem
3
4px
2
56px
1
2rem
1
0.25rem
1
0.8rem
1
1.5rem
1
2px
1
32px
1
0px
1

Typography & shape

1
typefaces
Ideal Design System~3 ▼
Avg mui repo1 =
Reputable systems1 =
4
font sizes
Ideal Design System~10 ▼
Avg mui repo3 ▲
Reputable systems5 ▼
2
border radii
Ideal Design System~10 ▼
Avg mui repo2 =
2
shadow styles
Ideal Design System~6 ▼
Avg mui repo1 ▲
Reputable systems1 ▲
the type scale, at its real sizes · how many of these are the same decision?
20px ×1 Almost but not quite
1.1rem ×1 Almost but not quite
16px ×1 Almost but not quite
12px ×1 Almost but not quite
the radii, by use
2px ×225px ×1

Where it hurts most

the 5 files carrying the most off-system styling

01 frontend/src/component/admin/auth/OidcAuth/OidcAuth.tsx 9 inline
02 frontend/src/component/admin/auth/SamlAuth/SamlAuth.tsx 6 inline
03 frontend/src/component/admin/invoice/InvoiceList.tsx 5 inline
04 frontend/src/component/strategies/strategies.module.scss 4 stray colours
05 frontend/src/component/feedbackNew/FeedbackComponent.tsx 4 inline

Duplicated components

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

<StyledSuccessIcon> · 6 implementations
frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestReviewers/ChangeRequestReviewer.tsx
frontend/src/component/changeRequest/ChangeRequestSidebar/ChangeRequestSidebar.tsx
frontend/src/component/integrations/IntegrationEvents/IntegrationEventsStateIcon.tsx
frontend/src/component/project/Project/ProjectSettings/ProjectActions/ProjectActionsTable/ProjectActionsActionsCell/ProjectActionsLastEvent.tsx
frontend/src/component/project/Project/ProjectSettings/ProjectActions/ProjectActionsTable/ProjectActionsEventsModal/ProjectActionsEventsDetails/ProjectActionsEventsDetailsAction.tsx
frontend/src/component/project/Project/ProjectSettings/ProjectActions/ProjectActionsTable/ProjectActionsEventsModal/ProjectActionsEventsStateCell.tsx
<StyledContainer> · 4 implementations
frontend/src/component/changeRequest/ChangeRequests/ChangeRequestFilters/ChangeRequestFilters.styles.tsx
frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx
frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestHeader/ChangeRequestHeader.styles.tsx
frontend/src/component/feedbackNew/FeedbackComponent.tsx
<StyledFailedIcon> · 4 implementations
frontend/src/component/integrations/IntegrationEvents/IntegrationEventsStateIcon.tsx
frontend/src/component/project/Project/ProjectSettings/ProjectActions/ProjectActionsTable/ProjectActionsActionsCell/ProjectActionsLastEvent.tsx
frontend/src/component/project/Project/ProjectSettings/ProjectActions/ProjectActionsTable/ProjectActionsEventsModal/ProjectActionsEventsDetails/ProjectActionsEventsDetailsAction.tsx
frontend/src/component/project/Project/ProjectSettings/ProjectActions/ProjectActionsTable/ProjectActionsEventsModal/ProjectActionsEventsStateCell.tsx
<StyledHeader> · 2 implementations
frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestHeader/ChangeRequestHeader.styles.tsx
frontend/src/component/changeRequest/ChangeRequestSidebar/EnvironmentChangeRequest/ChangeRequestTitle.tsx
<StyledTitle> · defined twice, one wraps the other
frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx
frontend/src/component/feedbackNew/FeedbackComponent.tsx
<StyledForm> · defined twice, one wraps the other
frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx
frontend/src/component/feedbackNew/FeedbackComponent.tsx
<TabPanel> · 2 implementations
frontend/src/component/changeRequest/ChangeRequest/Changes/Change/ChangeTabComponents.tsx
frontend/src/component/common/TabNav/TabPanel/TabPanel.tsx
<StyledSelect> · defined twice, one wraps the other
frontend/src/component/feature/Dependencies/FeatureStatusOptions.tsx
frontend/src/component/feature/FeatureView/FeatureOverview/ReleasePlan/shared/SharedFormComponents.tsx
label family · 8 variants
<StyledLabel>
frontend/src/component/feature/FeatureView/FeatureOverview/ReleasePlan/shared/SharedFormComponents.tsx
used 37×
<StyledMetaDataItemLabel>
frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/FeatureOverviewMetaData.tsx
used 5×
<LegalValueLabel>
frontend/src/component/common/NewConstraintAccordion/LegalValueLabel/LegalValueLabel.tsx
used 4×
<LabelFilterSection>
frontend/src/component/impact-metrics/ImpactMetricModal/LabelFilter/LabelFilterSection/LabelFilterSection.tsx
used 2×
<FeatureStatusLabel>
frontend/src/component/feature/FeatureToggleList/StatusCell/FeatureStatusLabel.tsx
used 1×
<LabelDiscoveryError>
frontend/src/component/impact-metrics/ImpactMetricModal/LabelFilter/LabelDiscoveryStatus.tsx
used 1×
…and 2 more
tag family · 8 variants
<Tag>
frontend/src/component/common/Tag/Tag.tsx
used 3×
<TagRow>
frontend/src/component/feature/FeatureView/FeatureOverview/FeatureOverviewMetaData/TagRow.tsx
used 1×
<TagTypeColorPicker>
frontend/src/component/tags/TagTypeForm/TagTypeColorPicker.tsx
used 1×
<TagTypeForm>
frontend/src/component/tags/TagTypeForm/TagTypeForm.tsx
used 1×
<CreateTagType>
frontend/src/component/tags/CreateTagType/CreateTagType.tsx
<EditTagType>
frontend/src/component/tags/EditTagType/EditTagType.tsx
…and 2 more
alert family · 8 variants
<FeatureStrategyChangeRequestAlert>
frontend/src/component/feature/FeatureStrategy/FeatureStrategyForm/FeatureStrategyChangeRequestAlert/FeatureStrategyChangeRequestAlert.tsx
used 2×
<StrategyVariantsUpgradeAlert>
frontend/src/component/common/StrategyVariantsUpgradeAlert/StrategyVariantsUpgradeAlert.tsx
used 2×
<CorsHelpAlert>
frontend/src/component/admin/cors/CorsHelpAlert.tsx
used 1×
<DependenciesUpgradeAlert>
frontend/src/component/feature/Dependencies/DependenciesUpgradeAlert.tsx
used 1×
<EnterpriseEdgeDismissibleAlert>
frontend/src/component/admin/enterprise-edge/EnterpriseEdgeDismissibleAlert.tsx
used 1×
<SegmentProjectAlert>
frontend/src/component/segments/SegmentProjectAlert.tsx
used 1×
…and 2 more
switch family · 5 variants
<PermissionSwitch>
frontend/src/component/common/PermissionSwitch/PermissionSwitch.tsx
used 4×
<FeatureToggleSwitch>
frontend/src/component/project/Project/ProjectFeatureToggles/FeatureToggleSwitch/FeatureToggleSwitch.tsx
used 3×
<FormSwitch>
frontend/src/component/common/FormSwitch/FormSwitch.tsx
used 3×
<IntegrationStateSwitch>
frontend/src/component/integrations/IntegrationForm/IntegrationStateSwitch/IntegrationStateSwitch.tsx
used 1×
<StrategySwitch>
frontend/src/component/strategies/StrategiesList/StrategySwitch/StrategySwitch.tsx
used 1×
sidebar family · 5 variants
<ChangeRequestSidebar>
frontend/src/component/changeRequest/ChangeRequestSidebar/ChangeRequestSidebar.tsx
used 1×
<LicensedUsersSidebar>
frontend/src/component/admin/users/UsersHeader/LicensedUsersSidebar.tsx
used 1×
<MetricDefinitionSidebar>
frontend/src/component/impact-metrics/RegisterMetricDialog/InfoSidebar.tsx
used 1×
<MobileNavigationSidebar>
frontend/src/component/layout/MainLayout/NavigationSidebar/MobileNavigationSidebar.tsx
used 1×
<NavigationSidebar>
frontend/src/component/layout/MainLayout/NavigationSidebar/NavigationSidebar.tsx
used 1×
dropdown family · 4 variants
<DropdownList>
frontend/src/component/common/DialogFormTemplate/ConfigButtons/DropdownList.tsx
used 1×
<DropdownMenu>
frontend/src/component/common/DropdownMenu/DropdownMenu.tsx
used 1×
<MultiPillDropdown>
frontend/src/component/common/DialogFormTemplate/NewDialogFormTemplate.tsx
<SinglePillDropdown>
frontend/src/component/common/DialogFormTemplate/NewDialogFormTemplate.tsx

97 inline style blocks

styling no system can see

frontend/src/component/admin/auth/OidcAuth/OidcAuth.tsx×9
frontend/src/component/admin/auth/SamlAuth/SamlAuth.tsx×6
frontend/src/component/admin/invoice/InvoiceList.tsx×5
frontend/src/component/feedbackNew/FeedbackComponent.tsx×4
frontend/src/component/admin/auth/AutoCreateForm/AutoCreateForm.tsx×3
frontend/src/component/admin/auth/SsoGroupSettings.tsx×3
1 !important declaration · each one forces a style through
common.module.scss ×1

The composition map

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

<StyledContainer> · used 110× · frontend/src/component/changeRequest/ChangeRequests/ChangeRequestFilters/ChangeRequestFilters.styles.tsx StyledContainer 110× <StyledContainer> · used 109× · frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx StyledContainer 109× <StyledContainer> · used 108× · frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestHeader/ChangeRequestHeader.styles.tsx StyledContainer 108× <StyledContainer> · used 108× · frontend/src/component/feedbackNew/FeedbackComponent.tsx StyledContainer 108× <Dialogue> · used 97× · frontend/src/component/common/Dialogue/Dialogue.tsx Dialogue 97× <TextCell> · used 96× · frontend/src/component/common/Table/cells/TextCell/TextCell.tsx TextCell 96× <PageContent> · used 84× · frontend/src/component/common/PageContent/PageContent.tsx PageContent 84× <PageHeader> · used 76× · frontend/src/component/common/PageHeader/PageHeader.tsx PageHeader 76× <Badge> · used 67× · frontend/src/component/common/Badge/Badge.tsx Badge 67× <StyledHeader> · used 67× · frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestHeader/ChangeRequestHeader.styles.tsx StyledHeader 67× <StyledTitle> · used 67× · frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx StyledTitle 67× <StyledHeader> · used 66× · frontend/src/component/changeRequest/ChangeRequestSidebar/EnvironmentChangeRequest/ChangeRequestTitle.tsx StyledHeader 66× <StyledTitle> · used 64× · frontend/src/component/feedbackNew/FeedbackComponent.tsx StyledTitle 64× <TablePlaceholder> · used 61× · frontend/src/component/common/Table/TablePlaceholder/TablePlaceholder.tsx TablePlaceholder 61× <Search> · used 56× · frontend/src/component/common/Search/Search.tsx Search 56× <PermissionButton> · used 55× · frontend/src/component/common/PermissionButton/PermissionButton.tsx PermissionButton 55× <StyledBox> · used 53× · frontend/src/component/admin/users/InviteLinkBar/InviteLinkBarContent.tsx StyledBox 53× <StyledInput> · used 53× · frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx StyledInput 53× <FormTemplate> · used 49× · frontend/src/component/common/FormTemplate/FormTemplate.tsx FormTemplate 49× <Input> · used 48× · frontend/src/component/common/Input/Input.tsx Input 48× <HelpIcon> · used 47× · frontend/src/component/common/HelpIcon/HelpIcon.tsx HelpIcon 47× <StyledForm> · used 46× · frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx StyledForm 46× <PermissionIconButton> · used 45× · frontend/src/component/common/PermissionIconButton/PermissionIconButton.tsx PermissionIconBu… 45× <StyledForm> · used 45× · frontend/src/component/feedbackNew/FeedbackComponent.tsx StyledForm 45×

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

790 components are imported exactly once: <AccessOverviewAccordion>, <AccessProvider>, <AccessProviderMock>, <AccessRequestsNotifications>, <AccordionContent>, <ActionsCell> and 784 more. Quiet corners, not yet a system.

componentuseddefined inprops
<StyledContainer> 110× frontend/src/component/changeRequest/ChangeRequests/ChangeRequestFilters/ChangeRequestFilters.styles.tsx none
<StyledContainer> 109× frontend/src/component/integrations/IntegrationForm/IntegrationForm.styles.tsx theme
<StyledContainer> 108× frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestHeader/ChangeRequestHeader.styles.tsx theme
<StyledContainer> 108× frontend/src/component/feedbackNew/FeedbackComponent.tsx theme
<Dialogue> 97× frontend/src/component/common/Dialogue/Dialogue.tsx none
<TextCell> 96× frontend/src/component/common/Table/cells/TextCell/TextCell.tsx none
<PageContent> 84× frontend/src/component/common/PageContent/PageContent.tsx none
<PageHeader> 76× frontend/src/component/common/PageHeader/PageHeader.tsx none
<Badge> 67× frontend/src/component/common/Badge/Badge.tsx none
<StyledHeader> 67× frontend/src/component/changeRequest/ChangeRequestOverview/ChangeRequestHeader/ChangeRequestHeader.styles.tsx theme
Generated by roast-my-design-system ver. 9.1.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 · 30151e9058f7 · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real