Where will your agent have to guess?
1 gap found.
The agent has no clear answer for these parts of the system.
01
Charts have no palette
5 chart files paint 17 series colours by hand (apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/analytics/commissions-analytics-chart.tsx (8), packages/ui/src/charts/x-axis.tsx (3), apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/page-client.tsx (2) and 2 more), and no token names a chart colour. The next chart will invent colours 18 to 23, because that is what every chart here did.
Close it: Name the series once (--chart-1, --chart-2 … in packages/tailwind-config/themes.css) and point the existing charts at them. From then on a chart that writes a colour by hand is a finding the checks catch.
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/analytics/commissions-analytics-chart.tsxpackages/ui/src/charts/x-axis.tsxapps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/page-client.tsxpackages/ui/src/charts/y-axis.tsxpackages/ui/src/mini-area-chart.tsx

Fixes you can make right now to increase the health score

Three fixes could raise the design system health score from 20 to 50.

01
Tokenise the 79 stray colours
+10
They are hardcoded where no token names them; apps/web/ui/partners/payouts/stablecoin-payout-modal.tsx alone carries 13. Every one is a value your agent will happily copy.
paste it into your agent ·
02
Collapse the 13 near-identical colours
+10
#f5f5f5 and #f2f3f5 are the same colour to any eye, and they are used 6 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
Decide about the 16 components nobody imports
+10
<Alert>, <AlertDescription>, <AlertTitle> and others sit in the system with no callers. Adopt them or delete them: either answer is better than a system with rooms nobody enters.
paste it into your agent ·

What your AI agent sees today

Your agent reads packages/hubspot-app/CLAUDE.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.

+1 nested in subfolders

Readable by: Claude Code ✓ · Codex — · Cursor — · copy the same rules into an AGENTS.md and the other tools see them too

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. <PayoutStats> alone has 3 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. [400px] appears 24 times. An agent looking for how this repo does spacing reads a repeated value as the rule, so it will write use number 25. The most copied value here is the one you least want copied.
Agent trap. This palette holds 13 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.
142
distinct colours
Ideal Design System~24 ▲
Avg Design System119 ▲
Reputable systems14 ▲
17
shades of grey
Ideal Design System~13 ▲
Avg Design System28 ▼
Reputable systems4 ▲
29
off-scale spacing values
Ideal Design System~12 ▲
Avg Design System24 · messier than 62% ▲
Reputable systems5 ▲
21
duplicated components
Ideal Design System0 ▲
Avg Design System16 · messier than 62% ▲
Reputable systems9 ▲
52
inline style blocks
Ideal Design System0 ▲
Avg Design System51 ▲
Reputable systems12 ▲
13
near-identical colour pairs
Ideal Design System0 ▲
Avg Design System7 · messier than 65% ▲
Reputable systems1 ▲
1
!important declarations
Ideal Design System0 ▲
Avg Design System5 ▼
Reputable systems3 ▼
16
components never imported
Ideal Design System0 ▲
Avg Design System17 · messier than 65% ▼
Reputable systems0 ▲
642
arbitrary bracket values
Ideal Design System~20 ▲
Avg Design System56 · messier than 91% ▲
Reputable systems0 ▲

Package by package

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

packagescoreworst findingsize
apps/web 40 45 inline style blocks 3,415 files
packages/ui 70 16 components nobody imports 488 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
142colours

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.

63 tokens79 strays
Colour usage
Sized by how often the code uses each colour
token named, colour not shown Tailwind palette stray
+16
+84
+87

Of every 100 colour uses, 14 use a theme colour by name, 85 use Tailwind's palette and 1 is a stray. A stray is a value written by hand.

Grey ramp · sorted dark → light · how many can you tell apart?
13 nearly identical pairs · each pair is 1 colour recorded twice
#f5f5f5 ×5 ≈ #f2f3f5 ×1#d4d4d4 ×4 ≈ #d1d5db ×2#f0f0f0 ×4 ≈ #ececec ×1rgb(23 23 23) ×3 ≈ #0f1419 ×1#ffe2e2 ×2 ≈ #ffdbe5 ×1#eab308 ×2 ≈ #efb100 ×1#db2777 ×2 ≈ #da2778 ×1#fdf2fa ×1 ≈ #fdf8f6 ×1+5 more

29 off-scale spacing values

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

·2
2,792
·4
2,003
·3
1,546
·1
1,201
·6
1,079
·0
861
·1.5
646
·2.5
433
·5
382
·0.5
304
·8
260
·10
225
·px
183
·16
92
·12
87
·3.5
41
·7
36
·20
24
642 bracket values written outside the scale
[400px] ×24[0.625rem] ×24[10px] ×22[200px] ×21[300px] ×20[18px] ×17[180px] ×17[-0.02em] ×16[1200px] ×14[50px] ×12+157 more

Typography & shape

3
typefaces
Ideal Design System~3 =
Avg Design System3 =
Reputable systems1 ▲
41
font sizes
Ideal Design System~10 ▲
Avg Design System18 · messier than 91% ▲
Reputable systems5 ▲
29
border radii
Ideal Design System~10 ▲
Avg Design System14 · messier than 85% ▲
the font sizes, by use
·sm ×2312·xs ×856·lg ×280·base ×230·xl ×71·3xl ×14·2xl ×14·[0.625rem] ×14·[13px] ×12·4xl ×10·[11px] ×8·5xl ×8·[0.8125rem] ×7·[0.7rem] ×6
the corners, drawn · 29 radii in one interface
999px ×3
50% ×2
10px ×1

3 typefaces, declared 5 different ways

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

system-ui×2
Inter×1
satoshi×1
Geist×1
ui-monospace×1

Where it hurts most

the 5 files carrying the most off-system styling

01 apps/web/ui/partners/payouts/stablecoin-payout-modal.tsx 13 stray colours 3 inline
02 apps/web/ui/partners/payouts/stablecoin-payout-icon.tsx 12 stray colours 3 inline
03 apps/web/ui/workspaces/slack-support-settings-card.tsx 10 stray colours
04 apps/web/ui/links/link-builder/link-preview.tsx 9 stray colours
05 apps/web/ui/placeholders/bubble-icon.tsx 9 stray colours

Duplicated components

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

two icon sets collide on 11 names · one problem, not 11
<Download><Users><Lock><CursorRays><Hyperlink><User><Gear><Eye><ConnectedDots4><LinesY><Heart>

packages/ui/src/icons/nucleo/download.tsx vs apps/web/ui/shared/icons/download.tsx

<PayoutStats> · 3 implementations
apps/web/app/(ee)/partners.dub.co/(dashboard)/payouts/payout-stats.tsx
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/payouts/payout-stats.tsx
apps/web/ui/layout/sidebar/payout-stats.tsx
<Logo> · 2 implementations
packages/ui/src/logo.tsx
apps/web/app/(ee)/partners.dub.co/(auth-other)/logo.tsx
<EmptyState> · defined twice, one wraps the other
apps/web/ui/shared/empty-state.tsx
packages/ui/src/empty-state.tsx
<FormControl> · 2 implementations
apps/web/ui/partners/groups/design/application-form/fields/form-control.tsx
apps/web/ui/submitted-leads/form-fields/form-control.tsx
<SettingsRow> · 2 implementations
apps/web/app/(ee)/partners.dub.co/(dashboard)/profile/settings-row.tsx
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/program-settings-row.tsx
<Hero> · 2 implementations
apps/web/ui/placeholders/hero.tsx
apps/web/ui/modals/dot-link-offer-modal.tsx
<Analytics> · 2 implementations
apps/web/ui/analytics/index.tsx
apps/web/ui/placeholders/feature-graphics/analytics.tsx
<ConversionTrackingToggle> · 2 implementations
apps/web/ui/links/link-builder/conversion-tracking-toggle.tsx
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/tracking/conversion-tracking-toggle.tsx
dropdown family · 8 variants
<FolderDropdown>
apps/web/ui/folders/folder-dropdown.tsx
used 3×
<PartnerProgramDropdown>
apps/web/ui/layout/sidebar/partner-program-dropdown.tsx
used 3×
<UserDropdown>
apps/web/ui/layout/sidebar/user-dropdown.tsx
used 2×
<MoreDropdown>
apps/web/ui/links/link-builder/more-dropdown.tsx
used 1×
<PayoutMethodDropdown>
apps/web/ui/partners/payouts/payout-method-dropdown.tsx
used 1×
<SubmittedLeadStatusDropdown>
apps/web/ui/submitted-leads/submitted-lead-status-dropdown.tsx
used 1×
…and 2 more
sidebar family · 8 variants
<MarketplaceExternalFilterSidebar>
apps/web/ui/program-marketplace/external/marketplace-external-filters.tsx
used 2×
<LayoutSidebar>
packages/ui/src/icons/nucleo/layout-sidebar.tsx
used 1×
<MarketplaceExternalFilterSidebarSkeleton>
apps/web/ui/program-marketplace/external/marketplace-external-filters.tsx
used 1×
<MarketplaceSidebarFilters>
apps/web/ui/program-marketplace/marketplace-sidebar-filters.tsx
used 1×
<ProgramSidebar>
apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/apply/program-sidebar.tsx
used 1×
<SidebarProvider>
apps/web/app/(ee)/app.dub.co/(new-program)/sidebar-context.tsx
used 1×
…and 2 more
avatar family · 7 variants
<PartnerAvatar>
apps/web/ui/partners/partner-avatar.tsx
used 74×
<UserAvatar>
apps/web/ui/users/user-avatar.tsx
used 35×
<CustomerAvatar>
apps/web/ui/customers/customer-avatar.tsx
used 9×
<TokenAvatar>
apps/web/ui/token-avatar.tsx
used 9×
<Avatar>
packages/ui/src/avatar.tsx
used 3×
<ActivityLogUserAvatar>
apps/web/ui/activity-logs/activity-entry-chips.tsx
used 2×
…and 1 more
alert family · 7 variants
<AlertCircleFill>
apps/web/ui/shared/icons/alert-circle-fill.tsx
used 12×
<ShieldAlert>
packages/ui/src/icons/nucleo/shield-alert.tsx
used 2×
<ReviewFraudAlertSheet>
apps/web/app/(ee)/admin.dub.co/(dashboard)/partners/fraud/review-fraud-alert-sheet.tsx
used 1×
<Alert>
packages/ui/src/alert.tsx
<AlertDescription>
packages/ui/src/alert.tsx
<AlertTitle>
packages/ui/src/alert.tsx
…and 1 more
progress family · 6 variants
<ProgressCircle>
packages/ui/src/progress-circle.tsx
used 6×
<BountyProgressBarRow>
apps/web/ui/partners/bounties/bounty-progress-bar-row.tsx
used 4×
<StepProgressBar>
apps/web/ui/partners/merge-accounts/step-progress-bar.tsx
used 4×
<PerformanceBountyProgress>
apps/web/ui/partners/bounties/bounty-performance.tsx
used 3×
<SubmissionBountyProgress>
apps/web/ui/partners/bounties/bounty-performance.tsx
used 3×
<ProgressBar>
packages/ui/src/progress-bar.tsx
spinner family · 5 variants
<LoadingSpinner>
packages/ui/src/icons/loading-spinner.tsx
used 111×
<LayoutLoader>
apps/web/ui/layout/layout-loader.tsx
used 21×
<AnalyticsLoadingSpinner>
apps/web/ui/analytics/analytics-loading-spinner.tsx
used 12×
<FeaturedIntegrationsLoader>
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/integrations/featured-integrations.tsx
used 1×
<IntegrationsCardsLoader>
apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/integrations/integrations-cards.tsx
used 1×

52 inline style blocks

styling no system can see

apps/web/ui/partners/groups/design/lander/modals/accordion-block-modal.tsx×4
apps/web/ui/partners/groups/design/lander/modals/files-block-modal.tsx×3
apps/web/ui/partners/payouts/stablecoin-payout-icon.tsx×3
apps/web/ui/partners/payouts/stablecoin-payout-modal.tsx×3
apps/web/ui/program-marketplace/program-marketplace-logos.tsx×2
apps/web/app/(ee)/app.dub.co/embed/referrals/bounties/index.tsx×1
1 !important declaration · each one forces a style through
globals.css ×1

The adoption map

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

<Button> · used 1006× · packages/ui/src/button.tsx Button 1006× <Link> · used 627× · apps/web/ui/shared/icons/link.tsx Link 627× <Modal> · used 188× · packages/ui/src/modal.tsx Modal 188× <Tooltip> · used 150× · packages/ui/src/tooltip.tsx Tooltip 150× <LoadingSpinner> · used 111× · packages/ui/src/icons/loading-spinner.tsx LoadingSpinner 111× <Footer> · used 105× · packages/email/src/components/footer.tsx Footer 105× <Popover> · used 100× · packages/ui/src/popover.tsx Popover 100× <InfoTooltip> · used 95× · packages/ui/src/tooltip.tsx InfoTooltip 95× <X> · used 92× · apps/web/ui/shared/icons/x.tsx X 92× <AnimatedSizeContainer> · used 90× · packages/ui/src/animated-size-container.tsx AnimatedSizeCo… 90× <PageContent> · used 85× · apps/web/ui/layout/page-content/index.tsx PageContent 85× <PageWidthWrapper> · used 81× · apps/web/ui/layout/page-width-wrapper.tsx PageWidthWrapp… 81× <StatusBadge> · used 79× · packages/ui/src/status-badge.tsx StatusBadge 79× <Switch> · used 79× · packages/ui/src/switch.tsx Switch 79× <PartnerAvatar> · used 74× · apps/web/ui/partners/partner-avatar.tsx PartnerAvatar 74× <Table> · used 70× · packages/ui/src/table/table.tsx Table 70× <MenuItem> · used 68× · packages/ui/src/menu-item.tsx MenuItem 68× <TimestampTooltip> · used 66× · packages/ui/src/timestamp-tooltip.tsx Timestamp… 66× <InlineBadgePopover> · used 58× · apps/web/ui/shared/inline-badge-popover.tsx InlineBad… 58× <ChevronRight> · used 54× · packages/ui/src/icons/nucleo/chevron-right.tsx ChevronRi… 54× <BlurImage> · used 53× · packages/ui/src/blur-image.tsx BlurImage 53× <AnimatedEmptyState> · used 46× · apps/web/ui/shared/animated-empty-state.tsx AnimatedEmpty… 46× <Combobox> · used 45× · packages/ui/src/combobox/index.tsx Combobox 45× <TooltipContent> · used 45× · packages/ui/src/tooltip.tsx Toolt… 45×

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

551 components are imported exactly once: <AboutYouForm>, <AcceptProgramInviteButton>, <AccordionBlockThumbnail>, <ActivityLogDescription>, <ActivityLogProvider>, <ActivityRing> and 545 more. Quiet corners, not yet a system.

componentuseddefined inprops
<Button> 1006× packages/ui/src/button.tsx text variant textWrapperClassName shortcutClassName loading
<Link> 627× apps/web/ui/shared/icons/link.tsx none
<Modal> 188× packages/ui/src/modal.tsx showModal setShowModal onClose desktopOnly preventDefaultClose
<Tooltip> 150× packages/ui/src/tooltip.tsx content contentClassName disabled side disableHoverableContent
<LoadingSpinner> 111× packages/ui/src/icons/loading-spinner.tsx none
<Footer> 105× packages/email/src/components/footer.tsx email marketing unsubscribeUrl https notificationSettingsUrl
<Popover> 100× packages/ui/src/popover.tsx content align side openPopover setOpenPopover
<InfoTooltip> 95× packages/ui/src/tooltip.tsx none
<X> 92× apps/web/ui/shared/icons/x.tsx none
<AnimatedSizeContainer> 90× packages/ui/src/animated-size-container.tsx none
16 components defined but never imported · an agent may use one of these by mistake
untouched since 2026
<Alert><AlertDescription><AlertTitle><CardContext><CardListCard><CompositeLogo><DubWireframeGraphic><FilterList><FilterSelect><FilterSidebar><ImageAltNodeView><InlineSnippet><ProductContent><ProgressBar><ResourcesContent><SolutionsContent>

Routers, dynamic imports and barrel files can hide real usage, so treat this as a shortlist to check, not a demolition order.

Generated by roast-my-design-system ver. 10.1.5 · 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 · 3b40cf3a3d7c · Think it got something wrong?
Non-destructive scanRead-onlyPaths are real