<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LE-VAI</title>
    <description>The latest articles on DEV Community by LE-VAI (@levaiinbey).</description>
    <link>https://dev.to/levaiinbey</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4039123%2Fac956bfa-b7b0-4363-8a60-f03de01ae058.png</url>
      <title>DEV Community: LE-VAI</title>
      <link>https://dev.to/levaiinbey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/levaiinbey"/>
    <language>en</language>
    <item>
      <title>The 23-check verification checklist we built for our design system</title>
      <dc:creator>LE-VAI</dc:creator>
      <pubDate>Tue, 21 Jul 2026 04:56:30 +0000</pubDate>
      <link>https://dev.to/levaiinbey/the-23-check-verification-checklist-we-built-for-our-design-system-52gf</link>
      <guid>https://dev.to/levaiinbey/the-23-check-verification-checklist-we-built-for-our-design-system-52gf</guid>
      <description>&lt;p&gt;A design system contract isn't a document. It's a testable standard.&lt;/p&gt;

&lt;p&gt;Most design systems are Figma files and Storybook pages — they tell you what the tokens &lt;em&gt;are&lt;/em&gt;, but not whether what you shipped actually &lt;em&gt;holds&lt;/em&gt;. We wanted to close that gap. So we built a verification engine that runs 23 automated checks against the live site, with provenance back to every contract token.&lt;/p&gt;

&lt;p&gt;This is the checklist, what each check does, and why we picked it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The premise
&lt;/h2&gt;

&lt;p&gt;The contract lives at &lt;a href="https://www.designesy.org/contracts/design-system" rel="noopener noreferrer"&gt;designesy.org/contracts/design-system&lt;/a&gt;. It's a public, machine-readable design system — W3C DTCG 2025.10 token format, with two custom token types we added: &lt;code&gt;$type: spring&lt;/code&gt; (physics-based motion) and &lt;code&gt;$type: sound&lt;/code&gt; (acoustic cues).&lt;/p&gt;

&lt;p&gt;The verification engine fetches the page HTML, extracts all CSS (inline + linked stylesheets), parses &lt;code&gt;:root&lt;/code&gt; custom properties, and runs 23 checks. Each check returns &lt;code&gt;PASS&lt;/code&gt;, &lt;code&gt;FAIL&lt;/code&gt;, &lt;code&gt;WARN&lt;/code&gt;, or &lt;code&gt;SKIP&lt;/code&gt; with a detail string that traces back to the contract token or rule it's verifying.&lt;/p&gt;

&lt;p&gt;Current score: &lt;strong&gt;100% (Grade A)&lt;/strong&gt; — 19 passed, 0 failed, 7 skipped (browser-only checks).&lt;/p&gt;

&lt;h2&gt;
  
  
  The 23 checks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tokens (1 check)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v01 — Token values match the live site &lt;code&gt;:root&lt;/code&gt; foundation&lt;/strong&gt;&lt;br&gt;
Verifies that the custom properties in the live stylesheet match the values declared in the contract JSON. If the contract says &lt;code&gt;--signal: #0133CB&lt;/code&gt; and the site ships &lt;code&gt;--signal: #0133CC&lt;/code&gt;, this check fails. Nine tokens checked.&lt;/p&gt;

&lt;p&gt;This is the foundation. If the tokens don't match, nothing downstream is trustworthy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Responsive (1 check)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v02 — Routes render without horizontal overflow at 375px, 720px, 860px, 1080px+&lt;/strong&gt;&lt;br&gt;
Verifies that the layout doesn't break at four breakpoints. &lt;code&gt;SKIP&lt;/code&gt; in static analysis — requires a live browser viewport. We run this manually with Chrome DevTools device emulation.&lt;/p&gt;

&lt;p&gt;Horizontal overflow on mobile is the most common layout failure and the easiest to miss in development. This check exists because we've shipped it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Interaction (1 check)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v03 — Primary interactive elements show focus-visible rings&lt;/strong&gt;&lt;br&gt;
Parses the stylesheet for &lt;code&gt;:focus-visible&lt;/code&gt; rules. 31 rules present on the live site.&lt;/p&gt;

&lt;p&gt;Focus-visible is the keyboard user's cursor. If it's missing, keyboard navigation is invisible. This check fails if focus-visible is absent or overridden by &lt;code&gt;outline: none&lt;/code&gt; without a replacement.&lt;/p&gt;
&lt;h3&gt;
  
  
  Motion (5 checks)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v05 — &lt;code&gt;prefers-reduced-motion&lt;/code&gt; disables entrance and wordmark breath&lt;/strong&gt;&lt;br&gt;
Verifies that &lt;code&gt;@media (prefers-reduced-motion: reduce)&lt;/code&gt; collapses non-essential animation. This is non-negotiable — animation that can't be reduced is an accessibility failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v11 — No &lt;code&gt;transition: all&lt;/code&gt; in the live stylesheet&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;transition: all&lt;/code&gt; is a performance anti-pattern — it transitions properties you didn't intend (like &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;) and causes layout jank. Every transition should name its specific properties. This check parses the stylesheet and fails if &lt;code&gt;transition: all&lt;/code&gt; appears anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v12 — &lt;code&gt;will-change&lt;/code&gt; restricted to &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;opacity&lt;/code&gt; only&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;will-change&lt;/code&gt; is a hint to the browser about what's about to animate. Using it on properties other than &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;opacity&lt;/code&gt; wastes GPU memory and can cause more jank than it prevents. This check fails if &lt;code&gt;will-change&lt;/code&gt; is set to anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v23 — Duration tokens &lt;code&gt;--duration-quick&lt;/code&gt; through &lt;code&gt;--duration-slow&lt;/code&gt; present in &lt;code&gt;:root&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Verifies that the five duration tokens (150ms, 250ms, 350ms, 400ms, 600ms) are all present as custom properties. Duration should be tokenized, not hard-coded — otherwise every animation drifts independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v13 — Press scale 0.96 on cells, 0.985 on cards/rows — both above 0.95 floor&lt;/strong&gt;&lt;br&gt;
Parses every &lt;code&gt;:active&lt;/code&gt; scale transform in the stylesheet and verifies none goes below 0.95. Press scale below 0.95 reads as a glitch, not a press. We learned this from &lt;a href="https://www.designesy.org/labs/takt" rel="noopener noreferrer"&gt;Takt&lt;/a&gt; — the interface-feel lab.&lt;/p&gt;
&lt;h3&gt;
  
  
  Accessibility (2 checks)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v06 — Contrast remains readable for ink, muted, and accent on paper&lt;/strong&gt;&lt;br&gt;
Verifies WCAG contrast ratios for the three text colors against the page background. Current values: ink on paper = 21:1, muted on paper = 8.03:1, muted-dim on paper = 5.10:1. All pass AA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v22 — Primary button text passes WCAG AA 4.5:1 contrast against &lt;code&gt;--signal&lt;/code&gt; fill&lt;/strong&gt;&lt;br&gt;
Verifies that the button label is readable against the brand accent fill. Current: ink on signal = 8.99:1. This check exists because brand colors are often chosen for aesthetics, not contrast — and button text is the most common failure point.&lt;/p&gt;
&lt;h3&gt;
  
  
  Identity (1 check)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v07 — No public surface displays internal control-plane naming&lt;/strong&gt;&lt;br&gt;
Verifies that the page title, h1, and visible text don't contain internal naming. This is a brand-discipline check — internal vocabulary should never leak to the user.&lt;/p&gt;
&lt;h3&gt;
  
  
  Poise (3 checks)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v04 — Sound toggle flips &lt;code&gt;aria-pressed&lt;/code&gt; and applies the audio preference&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SKIP&lt;/code&gt; in static analysis — requires live DOM interaction. Verifies that the sound toggle is a proper toggle button with &lt;code&gt;aria-pressed&lt;/code&gt; state, not just a visual switch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v08 — Poise interaction rules match live &lt;code&gt;/labs/poise&lt;/code&gt; and &lt;code&gt;contract.interaction&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SKIP&lt;/code&gt; — requires a page-specific check. Verifies that the interaction lab and the contract agree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v09 — Poise keyboard-path verification remains published and current&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SKIP&lt;/code&gt; — requires a page-specific check. Verifies that the keyboard-path proof page is still live.&lt;/p&gt;
&lt;h3&gt;
  
  
  Takt (2 checks)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v10 — Takt interface-feel rules match live CSS and &lt;code&gt;contract.takt&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SKIP&lt;/code&gt; — requires a page-specific check. Verifies that the interface-feel lab and the contract agree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v13 — Press scale 0.96 on cells, 0.985 on cards/rows&lt;/strong&gt; (also listed under motion — it spans both categories because it's both a motion rule and a Takt rule)&lt;/p&gt;
&lt;h3&gt;
  
  
  Cadence (8 checks)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v14 — Cadence typography rules match live CSS and &lt;code&gt;contract.cadence&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SKIP&lt;/code&gt; — requires a page-specific check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v15 — Font smoothing: antialiased + grayscale on &lt;code&gt;:root&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Verifies &lt;code&gt;-webkit-font-smoothing: antialiased&lt;/code&gt; and &lt;code&gt;-moz-osx-font-smoothing: grayscale&lt;/code&gt; are set on &lt;code&gt;:root&lt;/code&gt;. Without these, the browser uses subpixel rendering, which looks heavier and less crisp on modern displays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v16 — Rem-based scale: all text sizes in rem, root at 16px&lt;/strong&gt;&lt;br&gt;
Verifies that text sizes use &lt;code&gt;rem&lt;/code&gt;, not &lt;code&gt;px&lt;/code&gt;. Pixel-based font sizes break user zoom preferences. Root at 16px is the browser default — respecting it is the difference between "works for everyone" and "works for me."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v17 — Line-height by role: headings 1.08, body 1.55&lt;/strong&gt;&lt;br&gt;
Verifies that headings and body text have different line-heights. A single global &lt;code&gt;line-height&lt;/code&gt; is a common mistake — headings need tight leading (1.05–1.1), body needs relaxed leading (1.5–1.6). Using one value for both makes either headings feel loose or body feel cramped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v18 — &lt;code&gt;text-wrap: balance&lt;/code&gt; + &lt;code&gt;pretty&lt;/code&gt; both present in live CSS&lt;/strong&gt;&lt;br&gt;
Verifies that headings use &lt;code&gt;text-wrap: balance&lt;/code&gt; (prevents orphaned words on the last line) and body uses &lt;code&gt;text-wrap: pretty&lt;/code&gt; (prevents orphans while preserving rhythm). Both are modern CSS features that improve typography without JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v19 — &lt;code&gt;tabular-nums&lt;/code&gt;: 8 instances across the live CSS&lt;/strong&gt;&lt;br&gt;
Verifies &lt;code&gt;font-variant-numeric: tabular-nums&lt;/code&gt; is used for numerical data. Tabular numbers have fixed widths — they align in columns and don't jitter when values change. Essential for stats, prices, and tables. Current: 17 instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v20 — &lt;code&gt;::selection&lt;/code&gt; styled with &lt;code&gt;var(--signal)&lt;/code&gt; — not browser default&lt;/strong&gt;&lt;br&gt;
Verifies that text selection uses the brand accent, not the browser's default blue. Selection is a brand surface that most sites forget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v21 — Core Web Vitals plausible: LCP &amp;lt; 2.5s, INP &amp;lt; 200ms, CLS &amp;lt; 0.1&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;SKIP&lt;/code&gt; — requires a live browser performance trace. We run this with Chrome DevTools &lt;code&gt;performance_start_trace&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Extended checks (3 checks, v0.3.0 resolved tensions)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;x01 — &lt;code&gt;font-synthesis: none&lt;/code&gt; set&lt;/strong&gt;&lt;br&gt;
Verifies that &lt;code&gt;font-synthesis: none&lt;/code&gt; is on &lt;code&gt;:root&lt;/code&gt;. Without it, the browser synthesizes fake bold and italic weights when the real ones aren't loaded — and they look terrible. This was an open tension we resolved in v0.3.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;x02 — &lt;code&gt;text-underline-position: from-font&lt;/code&gt; set&lt;/strong&gt;&lt;br&gt;
Verifies that underlines align to the font's metrics, not the browser's default. Prevents underlines from cutting through descenders on fonts with low underline positions. Resolved in v0.3.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;x03 — &lt;code&gt;text-decoration-skip-ink: auto&lt;/code&gt; set&lt;/strong&gt;&lt;br&gt;
Verifies that underlines skip descenders (the loops of g, j, p, q, y) for readability. Without &lt;code&gt;skip-ink&lt;/code&gt;, underlines cut straight through descenders and reduce legibility. Resolved in v0.3.0.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why verification, not just documentation
&lt;/h2&gt;

&lt;p&gt;A contract without verification is a wish. A contract with verification is a standard.&lt;/p&gt;

&lt;p&gt;The difference: if the contract says "contrast must pass WCAG AA" but there's no check, the rule drifts. Someone ships a new component with a slightly-off color, nobody notices, and six months later the contract says one thing and the site does another.&lt;/p&gt;

&lt;p&gt;Verification closes that loop. Every check is executable. Every check has provenance back to a token or rule. Every check runs against the live site, not a snapshot. If the site drifts, the check fails.&lt;/p&gt;

&lt;p&gt;This is the same principle as unit tests for code — but for design. We don't ship code without tests. We shouldn't ship design without verification.&lt;/p&gt;
&lt;h2&gt;
  
  
  The open tensions (9)
&lt;/h2&gt;

&lt;p&gt;We document them, not hide them. A design system that claims to be complete is lying. Here are the nine things we haven't resolved yet:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Light theme is not contracted — dark technical foundation is provisional&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--activation&lt;/code&gt; exists but has limited public surface usage&lt;/li&gt;
&lt;li&gt;Inter is named in the stack but not self-hosted; system fallback is intentional&lt;/li&gt;
&lt;li&gt;Shadow tokens exist; elevation language is still light-touch (borders lead)&lt;/li&gt;
&lt;li&gt;Human contract page and machine export remain dual sources until a single generator owns both&lt;/li&gt;
&lt;li&gt;Keyboard-path verification packets are published for Poise only — not every public route&lt;/li&gt;
&lt;li&gt;Inline-axis logical properties applied — block-axis and border-inline remain physical (Cadence partial migration)&lt;/li&gt;
&lt;li&gt;Block-axis logical properties (&lt;code&gt;margin-block-start/end&lt;/code&gt;) not yet migrated — only inline-axis done&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;border-left&lt;/code&gt; decorative accents not yet migrated to &lt;code&gt;border-inline-start&lt;/code&gt; — visual regression risk needs testing&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Run it yourself
&lt;/h2&gt;

&lt;p&gt;The verification engine is available as an MCP tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @designesy/mcp designesy_score &lt;span class="nt"&gt;--url&lt;/span&gt; https://www.designesy.org/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can run it against any URL — it'll extract the CSS, parse the tokens, and run the same 23 checks. If your site uses a different token system, the checks that depend on Designesy-specific tokens will &lt;code&gt;SKIP&lt;/code&gt;, but the general checks (contrast, focus-visible, reduced-motion, font smoothing, rem scale, text-wrap, tabular-nums, &lt;code&gt;::selection&lt;/code&gt;, &lt;code&gt;transition: all&lt;/code&gt;, &lt;code&gt;will-change&lt;/code&gt;) will run against any site.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://www.designesy.org/contracts/design-system" rel="noopener noreferrer"&gt;designesy.org/contracts/design-system&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine export:&lt;/strong&gt; &lt;a href="https://www.designesy.org/contracts/design-system.json" rel="noopener noreferrer"&gt;designesy.org/contracts/design-system.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SKILL.md export (for AI coding agents):&lt;/strong&gt; &lt;a href="https://www.designesy.org/contracts/skill" rel="noopener noreferrer"&gt;designesy.org/contracts/skill&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labs:&lt;/strong&gt; &lt;a href="https://www.designesy.org/labs/poise" rel="noopener noreferrer"&gt;Poise&lt;/a&gt; · &lt;a href="https://www.designesy.org/labs/takt" rel="noopener noreferrer"&gt;Takt&lt;/a&gt; · &lt;a href="https://www.designesy.org/labs/cadence" rel="noopener noreferrer"&gt;Cadence&lt;/a&gt; · &lt;a href="https://www.designesy.org/labs/acoustics" rel="noopener noreferrer"&gt;Acoustics&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Designesy is design intelligence infrastructure. The contract is public, machine-readable, and verified against the live site. We build against it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>designsystems</category>
      <category>a11y</category>
      <category>css</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
