Docs · skills/examples/02-drift-report.md

Meridian design system — inventory and drift

Composite example. All numbers invented for illustration.

Inventoried from: web-portal @ release/2026.2, agent-console @ main, and 48 production screens captured 2026-03-18 Not inventoried: the native iOS shell (no source access), three admin screens behind a role we were not granted Date: 2026-03-20

Headline

Sixty-one per cent of production screens contain at least one detached component, and the portal ships 31 grey values against a declared ramp of 6. Together these mean the announced 2027 rebrand cannot be executed by changing tokens — it would be a manual edit of roughly 400 instances.

Fix the colour primitives first. One change — collapsing greys onto the declared ramp and re-pointing components at semantic tokens — closes eleven of the nineteen findings below and is the precondition for every other fix.

Coverage

Count
Components in the library84
Components actually used in production52
Library components used nowhere32
Bespoke components not in the library27
Screens audited48
Screens with at least one detached instance29 (61%)

Thirty-two unused library components is the more interesting number. Six of them duplicate bespoke components teams built instead — which is a discoverability failure, not a discipline failure.

Token diff

TokenDeclaredUsedFindingCost
Greys6 steps31 distinct valuesUsed and undeclaredRe-theming impossible; 400+ manual edits
Brand bluecolor.brand.5004 near-values (#1B5FD9, #1C5FD9, #1B60DA, #2060D9)Copy-paste driftReads as sloppy at scale; no single source
Spacing8px scale17 values, 9 off-scaleOff-scale usageVertical rhythm reads accidental
color.text.primarydeclaredcomponents reference color.neutral.900 directlyTier bypassDark mode would require touching every component
Radius4 steps4 stepsClean
button.danger.*declaredunusedDead weightDocumented but nobody found it; two teams built their own
Type scale9 steps14 sizes5 undeclaredHierarchy is inconsistent between the two apps

Component scores

Five axes, 0–3. Anything scoring 0 on states or accessibility is a finding regardless of total. Ten most-used components shown.

ComponentStatesA11yDocsAdoptionCode parityTotal
Button3223212
Text input2223211
Select111317
Data table101215
Modal211228
Tabs100214
Card2213210
Alert / banner211217
Date picker000202
Pagination110114

Date picker scores 0 on states, accessibility and code parity while appearing on every payment-related screen. It is the highest-risk component in the system.

Findings

#FindingCountCostFixCloses
1Greys off the declared ramp31 valuesRe-theming impossibleCollapse to 6, re-point components1, 4, 7, 9, 11, 12, 14, 15, 16, 18, 19
2Detached instances in production29 screensLibrary fixes stop propagatingRe-link the top 10 flows2, 6
3Date picker has no keyboard path1 component, 14 screensWCAG 2.2 failure on a contractual requirementRebuild the primitive3, 10
4Components reference primitives directly38 instancesNo theming layer; dark mode impossibleInsert semantic tier
5Data table has no focus management1 component, 9 screensKeyboard users cannot operate the core screenRebuild
6Two button implementations in code2Every screen re-decidesCollapse, deprecate one
7Off-scale spacing9 valuesRhythm reads accidentalSnap to the 8pt scale

(Findings 8–19 continue in the same format.)

Sequenced fixes

Now — the primitives

  1. Collapse the grey ramp and insert the semantic tier. Closes 11 findings.
  2. Rebuild the date picker. Contractual WCAG exposure on 14 screens.
  3. Fix data-table focus management.

This quarter

  1. Re-link detached instances across the top ten flows.
  2. Collapse the two button implementations; deprecate with a dated notice.
  3. Snap spacing to the 8-point scale.

Parked — with the reason

  • Deleting the 32 unused library components. Parked until the discoverability problem is understood; six of them duplicate bespoke work, which suggests the docs are the fault, not the components.
  • Type-scale consolidation. Real, but low-cost until the rebrand lands.

What I could not determine

  • The native iOS shell — no source access. Its drift is unmeasured and likely worse, since it has no coded library at all.
  • Three admin screens behind a role we were not granted.
  • Whether Code Connect is configured; the engineer who set it up has left. Parity scores above are from a manual read of the source, not from tooling, and should be treated as approximate.

The method, written down

Every page here is one file from the skill library. The folder is loadable as a Claude project as-is.