mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-13 06:36:26 +03:00
process.exit() right after a large piped stdout write truncated JSON output at the pipe buffer boundary; found by the oracle harness. Re-record the six directory-scan goldens that had captured the truncation. Prepared with AI assistance (Claude Code).
8 lines
94 KiB
JSON
8 lines
94 KiB
JSON
{
|
||
"stdout": "[\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"pass-split-container\\\": children flush against border on all sides (no inset)\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"div.box.flag-overflow-hidden clips a positioned child\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"div.box.flag-overflow-clip clips a positioned child\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"div.box.flag-overflow-negative clips a positioned child\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"div.box.flag-overflow-right clips a positioned child\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"div.box.flag-shadow-utility clips a positioned child\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/clipped-overflow-container.html\",\n \"line\": 0,\n \"snippet\": \"div.box.flag-overlay-surface clips a positioned child\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/color.html\",\n \"line\": 0,\n \"snippet\": \"8px functional text \\\"tick\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"skipped-heading\",\n \"name\": \"Skipped heading level\",\n \"description\": \"Heading levels should not skip (e.g. h1 then h3 with no h2). Screen readers use heading hierarchy for navigation. Skipping levels breaks the document outline.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/color.html\",\n \"line\": 0,\n \"snippet\": \"<h1> \\\"Welcome to Our Platform\\\" followed by <h3> \\\"Gradient text\\\" (missing h2)\"\n },\n {\n \"antipattern\": \"skipped-heading\",\n \"name\": \"Skipped heading level\",\n \"description\": \"Heading levels should not skip (e.g. h1 then h3 with no h2). Screen readers use heading hierarchy for navigation. Skipping levels breaks the document outline.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/color.html\",\n \"line\": 0,\n \"snippet\": \"<h1> \\\"Purple heading text\\\" followed by <h3> \\\"Styled <a> and <button> with low contrast\\\" (missing h2)\"\n },\n {\n \"antipattern\": \"skipped-heading\",\n \"name\": \"Skipped heading level\",\n \"description\": \"Heading levels should not skip (e.g. h1 then h3 with no h2). Screen readers use heading hierarchy for navigation. Skipping levels breaks the document outline.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/color.html\",\n \"line\": 0,\n \"snippet\": \"<h1> \\\"Gradient Clipped Heading Text\\\" followed by <h3> \\\"Faint accent-glow gradient (issue #409 Case B — must not fla\\\" (missing h2)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 11,\n \"snippet\": \"font-family: 'Inter\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-gradient-ground.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: arial\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/edge-flush-cards.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"scroller\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/edge-flush-cards.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"scroller\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/edge-flush-cards.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"scroller\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/external-styles.css\",\n \"line\": 23,\n \"snippet\": \"font-family: 'Inter\"\n },\n {\n \"antipattern\": \"extreme-negative-tracking\",\n \"name\": \"Crushed letter spacing\",\n \"description\": \"Letter-spacing pulled tighter than the point where characters keep their own shapes costs legibility. Tighten display type optically, not destructively.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/extreme-negative-tracking.html\",\n \"line\": 0,\n \"snippet\": \"letter-spacing: -0.06em — \\\"Tracking crushed em paragraph copy that \\\"\"\n },\n {\n \"antipattern\": \"extreme-negative-tracking\",\n \"name\": \"Crushed letter spacing\",\n \"description\": \"Letter-spacing pulled tighter than the point where characters keep their own shapes costs legibility. Tighten display type optically, not destructively.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/extreme-negative-tracking.html\",\n \"line\": 0,\n \"snippet\": \"letter-spacing: -0.06em — \\\"Tracking crushed pixels heading line\\\"\"\n },\n {\n \"antipattern\": \"extreme-negative-tracking\",\n \"name\": \"Crushed letter spacing\",\n \"description\": \"Letter-spacing pulled tighter than the point where characters keep their own shapes costs legibility. Tighten display type optically, not destructively.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/extreme-negative-tracking.html\",\n \"line\": 0,\n \"snippet\": \"letter-spacing: -0.07em — \\\"Tracking crushed heading variant text\\\"\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/flush-against-border.html\",\n \"line\": 0,\n \"snippet\": \"<section> \\\"flag-frameworks\\\": children flush against border+bg on right/bottom/left (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/flush-against-border.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"flag-card-borders\\\": children flush against border+bg on right/bottom/left (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/flush-against-border.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"flag-bg-only\\\": children flush against bg on right/bottom/left (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/flush-against-border.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"flag-outline-only\\\": children flush against outline on right/bottom/left (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/flush-against-border.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"flag-asym-leftflush\\\": children flush against border+bg on left (no inset)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/flush-against-border.html\",\n \"line\": 0,\n \"snippet\": \"<section> \\\"pass-marquee-shell\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/GlobalStyle.tsx\",\n \"line\": 13,\n \"snippet\": \"font-family: 'Inter\",\n \"importedBy\": [\n \"_app.tsx\"\n ]\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/Hero.tsx\",\n \"line\": 16,\n \"snippet\": \"font-family: 'Montserrat\",\n \"importedBy\": [\n \"index.tsx\"\n ]\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-modules/app/globals.css\",\n \"line\": 10,\n \"snippet\": \"font-family: 'Roboto\",\n \"importedBy\": [\n \"layout.tsx\"\n ]\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-modules/components/StatsCard.module.css\",\n \"line\": 23,\n \"snippet\": \"font-family: 'Inter\",\n \"importedBy\": [\n \"StatsCard.tsx\"\n ]\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-tailwind/app/globals.css\",\n \"line\": 19,\n \"snippet\": \"font-family: 'Inter\",\n \"importedBy\": [\n \"layout.tsx\"\n ]\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/glow.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 11px, 12px, 13px, 14px, 16px (ratio 1.5:1)\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/heading-rhythm.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"pass-band\\\": children flush against bg on right/left (no inset)\"\n },\n {\n \"antipattern\": \"hero-eyebrow-chip\",\n \"name\": \"Hero eyebrow / pill chip\",\n \"description\": \"A tiny uppercase letter-spaced label sitting immediately above an oversized hero headline — or the same shape rendered as a pill chip — is now the default AI SaaS hero. Drop the eyebrow, integrate the kicker into the headline, or run it as a navigation breadcrumb instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"eyebrow chip (tracked-caps) \\\"AI-NATIVE WORKFLOWS\\\" above h1 \\\"Eyebrow Above Hero\\\"\"\n },\n {\n \"antipattern\": \"hero-eyebrow-chip\",\n \"name\": \"Hero eyebrow / pill chip\",\n \"description\": \"A tiny uppercase letter-spaced label sitting immediately above an oversized hero headline — or the same shape rendered as a pill chip — is now the default AI SaaS hero. Drop the eyebrow, integrate the kicker into the headline, or run it as a navigation breadcrumb instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"eyebrow chip (tracked-caps) \\\"NEW IN 2026\\\" above h1 \\\"Span Eyebrow Above Hero\\\"\"\n },\n {\n \"antipattern\": \"hero-eyebrow-chip\",\n \"name\": \"Hero eyebrow / pill chip\",\n \"description\": \"A tiny uppercase letter-spaced label sitting immediately above an oversized hero headline — or the same shape rendered as a pill chip — is now the default AI SaaS hero. Drop the eyebrow, integrate the kicker into the headline, or run it as a navigation breadcrumb instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"eyebrow chip (tracked-caps) \\\"FEATURED\\\" above h1 \\\"Pill Chip Above Hero\\\"\"\n },\n {\n \"antipattern\": \"hero-eyebrow-chip\",\n \"name\": \"Hero eyebrow / pill chip\",\n \"description\": \"A tiny uppercase letter-spaced label sitting immediately above an oversized hero headline — or the same shape rendered as a pill chip — is now the default AI SaaS hero. Drop the eyebrow, integrate the kicker into the headline, or run it as a navigation breadcrumb instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"eyebrow chip (tracked-caps) \\\"NEW\\\" above h1 \\\"Already Uppercase Text\\\"\"\n },\n {\n \"antipattern\": \"hero-eyebrow-chip\",\n \"name\": \"Hero eyebrow / pill chip\",\n \"description\": \"A tiny uppercase letter-spaced label sitting immediately above an oversized hero headline — or the same shape rendered as a pill chip — is now the default AI SaaS hero. Drop the eyebrow, integrate the kicker into the headline, or run it as a navigation breadcrumb instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"eyebrow chip (tracked-caps) \\\"A VERY LONG UPPERCASE TABLE OF CONTENTS \\\" above h1 \\\"Long Uppercase Sentence Above Hero\\\"\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 46 chars of body text\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: inter\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hero-eyebrow-chip.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"SECTION KICKER\\\" above h1 \\\"Body-Sized Heading Below Eyebrow\\\"\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/hook-inline-ignore.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: roboto\"\n },\n {\n \"antipattern\": \"icon-tile-stack\",\n \"name\": \"Icon tile stacked above heading\",\n \"description\": \"A small rounded-square icon container above a heading is the universal AI feature-card template — every generator outputs this exact shape. Try a side-by-side icon and heading, or let the icon sit in flow without its own container.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"80x80px icon tile above h3 \\\"Lightning Fast\\\"\"\n },\n {\n \"antipattern\": \"icon-tile-stack\",\n \"name\": \"Icon tile stacked above heading\",\n \"description\": \"A small rounded-square icon container above a heading is the universal AI feature-card template — every generator outputs this exact shape. Try a side-by-side icon and heading, or let the icon sit in flow without its own container.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"64x64px icon tile above h3 \\\"Secure Storage\\\"\"\n },\n {\n \"antipattern\": \"icon-tile-stack\",\n \"name\": \"Icon tile stacked above heading\",\n \"description\": \"A small rounded-square icon container above a heading is the universal AI feature-card template — every generator outputs this exact shape. Try a side-by-side icon and heading, or let the icon sit in flow without its own container.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"72x72px icon tile above h3 \\\"Easy Setup\\\"\"\n },\n {\n \"antipattern\": \"icon-tile-stack\",\n \"name\": \"Icon tile stacked above heading\",\n \"description\": \"A small rounded-square icon container above a heading is the universal AI feature-card template — every generator outputs this exact shape. Try a side-by-side icon and heading, or let the icon sit in flow without its own container.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"96x96px icon tile above h3 \\\"Powerful Analytics\\\"\"\n },\n {\n \"antipattern\": \"icon-tile-stack\",\n \"name\": \"Icon tile stacked above heading\",\n \"description\": \"A small rounded-square icon container above a heading is the universal AI feature-card template — every generator outputs this exact shape. Try a side-by-side icon and heading, or let the icon sit in flow without its own container.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"48x48px icon tile above h3 \\\"Emoji Inline Icon\\\"\"\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 14px, 16px, 18px, 24px (ratio 1.7:1)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/image-backed-contrast.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: arial\"\n },\n {\n \"antipattern\": \"italic-serif-display\",\n \"name\": \"Italic serif display headline\",\n \"description\": \"Oversized italic serif (Fraunces, Recoleta, Playfair, Newsreader-italic) as the primary hero headline reads as taste in isolation but has become the universal AI-startup landing page hero. Set roman, or move to a non-serif display face. Editorial / magazine register may legitimately want this — judge by context.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"italic serif h1 (fraunces) at 88px \\\"Fraunces 88px italic\\\"\"\n },\n {\n \"antipattern\": \"italic-serif-display\",\n \"name\": \"Italic serif display headline\",\n \"description\": \"Oversized italic serif (Fraunces, Recoleta, Playfair, Newsreader-italic) as the primary hero headline reads as taste in isolation but has become the universal AI-startup landing page hero. Set roman, or move to a non-serif display face. Editorial / magazine register may legitimately want this — judge by context.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"italic serif h1 (recoleta) at 64px \\\"Recoleta 64px italic\\\"\"\n },\n {\n \"antipattern\": \"italic-serif-display\",\n \"name\": \"Italic serif display headline\",\n \"description\": \"Oversized italic serif (Fraunces, Recoleta, Playfair, Newsreader-italic) as the primary hero headline reads as taste in isolation but has become the universal AI-startup landing page hero. Set roman, or move to a non-serif display face. Editorial / magazine register may legitimately want this — judge by context.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"italic serif h1 (playfair display) at 72px \\\"Playfair 72px italic\\\"\"\n },\n {\n \"antipattern\": \"italic-serif-display\",\n \"name\": \"Italic serif display headline\",\n \"description\": \"Oversized italic serif (Fraunces, Recoleta, Playfair, Newsreader-italic) as the primary hero headline reads as taste in isolation but has become the universal AI-startup landing page hero. Set roman, or move to a non-serif display face. Editorial / magazine register may legitimately want this — judge by context.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"italic serif h1 (customserifface) at 56px \\\"Unknown Serif Generic Fallback\\\"\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: fraunces\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: recoleta\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/italic-serif-display.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: inter\"\n },\n {\n \"antipattern\": \"hero-eyebrow-chip\",\n \"name\": \"Hero eyebrow / pill chip\",\n \"description\": \"A tiny uppercase letter-spaced label sitting immediately above an oversized hero headline — or the same shape rendered as a pill chip — is now the default AI SaaS hero. Drop the eyebrow, integrate the kicker into the headline, or run it as a navigation breadcrumb instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"eyebrow chip (tracked-caps) \\\"Platform overview\\\" above h1 \\\"\\\"Hero Owned By Hero Rule\\\"\\\"\"\n },\n {\n \"antipattern\": \"wide-tracking\",\n \"name\": \"Wide letter spacing on body text\",\n \"description\": \"Letter spacing above 0.05em on body text disrupts natural character groupings and slows reading. Reserve wide tracking for short uppercase labels only.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"letter-spacing: 0.11em on body text\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: arial\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Invitation protocol\\\" above h2 \\\"A Single Kicker Still Flags\\\"\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Output model\\\" above h2 \\\"Standard Tracking Kicker\\\"\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Preview sequence\\\" above h3 \\\"Kicker Above An H3\\\"\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Access window\\\" above h4 \\\"Kicker Above An H4\\\"\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Platform notes\\\" above h1 \\\"Sub Hero Heading\\\"\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"materials briefing\\\" above h2 \\\"Small Caps Kicker\\\"\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Field studies\\\" above div \\\"Heading Role Kicker\\\"\"\n },\n {\n \"antipattern\": \"skipped-heading\",\n \"name\": \"Skipped heading level\",\n \"description\": \"Heading levels should not skip (e.g. h1 then h3 with no h2). Screen readers use heading hierarchy for navigation. Skipping levels breaks the document outline.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"<h1> \\\"\\\"Page Title After Nav\\\"\\\" followed by <h3> \\\"\\\"48%\\\"\\\" (missing h2)\"\n },\n {\n \"antipattern\": \"skipped-heading\",\n \"name\": \"Skipped heading level\",\n \"description\": \"Heading levels should not skip (e.g. h1 then h3 with no h2). Screen readers use heading hierarchy for navigation. Skipping levels breaks the document outline.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/kicker-above-heading.html\",\n \"line\": 0,\n \"snippet\": \"<h1> \\\"\\\"Hero Owned By Hero Rule\\\"\\\" followed by <h3> \\\"\\\"Garden Suite\\\"\\\" (missing h2)\"\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/layout.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 11px, 14px, 16px (ratio 1.5:1)\"\n },\n {\n \"antipattern\": \"nested-cards\",\n \"name\": \"Nested cards\",\n \"description\": \"Cards inside cards create visual noise and excessive depth. Flatten the hierarchy — use spacing, typography, and dividers instead of nesting containers.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/layout.html\",\n \"line\": 0,\n \"snippet\": \"Card inside card (div)\"\n },\n {\n \"antipattern\": \"nested-cards\",\n \"name\": \"Nested cards\",\n \"description\": \"Cards inside cards create visual noise and excessive depth. Flatten the hierarchy — use spacing, typography, and dividers instead of nesting containers.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/layout.html\",\n \"line\": 0,\n \"snippet\": \"Card inside card (div)\"\n },\n {\n \"antipattern\": \"nested-cards\",\n \"name\": \"Nested cards\",\n \"description\": \"Cards inside cards create visual noise and excessive depth. Flatten the hierarchy — use spacing, typography, and dividers instead of nesting containers.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/layout.html\",\n \"line\": 0,\n \"snippet\": \"Card inside card (div)\"\n },\n {\n \"antipattern\": \"nested-cards\",\n \"name\": \"Nested cards\",\n \"description\": \"Cards inside cards create visual noise and excessive depth. Flatten the hierarchy — use spacing, typography, and dividers instead of nesting containers.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/layout.html\",\n \"line\": 0,\n \"snippet\": \"Card inside card (div)\"\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/modern-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 13px, 14px, 16px (ratio 1.2:1)\"\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/motion.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 11px, 12px, 13px, 14px, 16px (ratio 1.5:1)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/multifile/styles.css\",\n \"line\": 3,\n \"snippet\": \"font-family: 'Inter\",\n \"importedBy\": [\n \"App.tsx\"\n ]\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 13px, 14px, 16px (ratio 1.2:1)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nonrendered-text.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nonrendered-text.html\",\n \"line\": 0,\n \"snippet\": \"9px functional text \\\"Rendered Nav Link\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"numbered-section-labels\",\n \"name\": \"Tiny numbered section labels\",\n \"description\": \"Small numeric index labels riding next to section headings, repeated section after section, are AI editorial scaffolding — a page numbering its own chapters instead of earning structure. Let hierarchy, content, and rhythm carry the sequence.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/numbered-section-labels.html\",\n \"line\": 0,\n \"snippet\": \"tiny numbered label \\\"01\\\" beside h2 \\\"Alpha ships first\\\" (4 on page)\"\n },\n {\n \"antipattern\": \"numbered-section-labels\",\n \"name\": \"Tiny numbered section labels\",\n \"description\": \"Small numeric index labels riding next to section headings, repeated section after section, are AI editorial scaffolding — a page numbering its own chapters instead of earning structure. Let hierarchy, content, and rhythm carry the sequence.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/numbered-section-labels.html\",\n \"line\": 0,\n \"snippet\": \"tiny numbered label \\\"02\\\" beside h2 \\\"Beta earns trust\\\" (4 on page)\"\n },\n {\n \"antipattern\": \"numbered-section-labels\",\n \"name\": \"Tiny numbered section labels\",\n \"description\": \"Small numeric index labels riding next to section headings, repeated section after section, are AI editorial scaffolding — a page numbering its own chapters instead of earning structure. Let hierarchy, content, and rhythm carry the sequence.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/numbered-section-labels.html\",\n \"line\": 0,\n \"snippet\": \"tiny numbered label \\\"03\\\" beside h2 \\\"Gamma holds the line\\\" (4 on page)\"\n },\n {\n \"antipattern\": \"numbered-section-labels\",\n \"name\": \"Tiny numbered section labels\",\n \"description\": \"Small numeric index labels riding next to section headings, repeated section after section, are AI editorial scaffolding — a page numbering its own chapters instead of earning structure. Let hierarchy, content, and rhythm carry the sequence.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/numbered-section-labels.html\",\n \"line\": 0,\n \"snippet\": \"tiny numbered label \\\"04 / ROLLOUT\\\" beside h2 \\\"Delta closes the loop\\\" (4 on page)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 43 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 41 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 45 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 35 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 45 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 46 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 38 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 40 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 42 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 37 chars of body text\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"absolute-container\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"flex-center\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"cramped-padding\",\n \"name\": \"Cramped padding\",\n \"description\": \"Text is too close to the edge of its container. Two shapes: (1) an element with its own text where the padding is too low for the font size, and (2) a wrapper with text-bearing children and near-zero padding against a visible boundary (border, outline, or non-transparent background) — children land flush against the boundary line. Add at least 8px (ideally 12–16px) of padding inside bordered, outlined, or colored containers.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"<div> \\\"grid-center\\\": children flush against bg on all sides (no inset)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 45 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 33 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 37 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 31 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 39 chars of body text\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 52 chars of body text\"\n },\n {\n \"antipattern\": \"clipped-overflow-container\",\n \"name\": \"Positioned child clipped by overflow container\",\n \"description\": \"A clipping container (overflow hidden or clip) wrapping an absolutely-positioned child cuts off tooltips, menus, and popovers that need to escape. Let the overflow be visible, or move the positioned layer out of the clip.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/overlay-positioning.html\",\n \"line\": 0,\n \"snippet\": \"div clips a positioned child\"\n },\n {\n \"antipattern\": \"oversized-h1\",\n \"name\": \"Oversized hero headline\",\n \"description\": \"A full-sentence headline set at display size ends up dominating the viewport, leaving no room for anything else above the fold. A punchy one- or two-word headline at that size is fine — the problem is a long headline blown up too large. Set long headlines smaller, or tighten the copy.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/oversized-h1-browser.html\",\n \"line\": 0,\n \"snippet\": \"104px h1, 82 chars \\\"A sweeping product headline that sprawls across the whole vi\\\"\"\n },\n {\n \"antipattern\": \"oversized-h1\",\n \"name\": \"Oversized hero headline\",\n \"description\": \"A full-sentence headline set at display size ends up dominating the viewport, leaving no room for anything else above the fold. A punchy one- or two-word headline at that size is fine — the problem is a long headline blown up too large. Set long headlines smaller, or tighten the copy.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/oversized-h1-browser.html\",\n \"line\": 0,\n \"snippet\": \"83px h1, 41 chars \\\"The missing design vocabulary for agents.\\\"\"\n },\n {\n \"antipattern\": \"oversized-h1\",\n \"name\": \"Oversized hero headline\",\n \"description\": \"A full-sentence headline set at display size ends up dominating the viewport, leaving no room for anything else above the fold. A punchy one- or two-word headline at that size is fine — the problem is a long headline blown up too large. Set long headlines smaller, or tighten the copy.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/oversized-h1.html\",\n \"line\": 0,\n \"snippet\": \"96px h1, 73 chars \\\"A sweeping product headline that runs on far too long to sit\\\"\"\n },\n {\n \"antipattern\": \"oversized-h1\",\n \"name\": \"Oversized hero headline\",\n \"description\": \"A full-sentence headline set at display size ends up dominating the viewport, leaving no room for anything else above the fold. A punchy one- or two-word headline at that size is fine — the problem is a long headline blown up too large. Set long headlines smaller, or tighten the copy.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/oversized-h1.html\",\n \"line\": 0,\n \"snippet\": \"80px h1, 76 chars \\\"Everything your whole team needs to launch quickly and final\\\"\"\n },\n {\n \"antipattern\": \"tight-leading\",\n \"name\": \"Tight line height\",\n \"description\": \"Line height below 1.3x the font size makes multi-line text hard to read. Use 1.5 to 1.7 for body text so lines have room to breathe.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/quality.html\",\n \"line\": 0,\n \"snippet\": \"line-height 1.00x (need >=1.3)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/quality.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"justified-text\",\n \"name\": \"Justified text\",\n \"description\": \"Justified text without hyphenation creates uneven word spacing (\\\"rivers of white\\\"). Use text-align: left for body text, or enable hyphens: auto if you must justify.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/quality.html\",\n \"line\": 0,\n \"snippet\": \"text-align: justify without hyphens: auto\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/quality.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 285 chars of body text\"\n },\n {\n \"antipattern\": \"wide-tracking\",\n \"name\": \"Wide letter spacing on body text\",\n \"description\": \"Letter spacing above 0.05em on body text disrupts natural character groupings and slows reading. Reserve wide tracking for short uppercase labels only.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/quality.html\",\n \"line\": 0,\n \"snippet\": \"letter-spacing: 0.15em on body text\"\n },\n {\n \"antipattern\": \"skipped-heading\",\n \"name\": \"Skipped heading level\",\n \"description\": \"Heading levels should not skip (e.g. h1 then h3 with no h2). Screen readers use heading hierarchy for navigation. Skipping levels breaks the document outline.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/quality.html\",\n \"line\": 0,\n \"snippet\": \"<h1> \\\"Top heading\\\" followed by <h3> \\\"Skips straight to h3\\\" (missing h2)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: arial\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 19,\n \"snippet\": \"font-family: 'Roboto\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/text-occlusion.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 32 chars of body text\"\n },\n {\n \"antipattern\": \"kicker-above-heading\",\n \"name\": \"Kicker / eyebrow label above heading\",\n \"description\": \"A tiny tracked uppercase or small-caps label sitting as its own block directly above a heading is banned outright, repeated or not. Generated kickers never earn their place: the heading carries its own weight. Delete the label and let the heading speak; if the words matter, work them into the heading or the body.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/text-occlusion.html\",\n \"line\": 0,\n \"snippet\": \"kicker \\\"Family Italian on the waterfront\\\" above h1 \\\"Trattoria da Nonna Lucia\\\"\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: inter\"\n },\n {\n \"antipattern\": \"flat-type-hierarchy\",\n \"name\": \"Flat type hierarchy\",\n \"description\": \"Font sizes are too close together — no clear visual hierarchy. Use fewer sizes with more contrast (aim for at least a 1.25 ratio between steps).\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"Sizes: 13px, 14px, 15px, 16px, 18px (ratio 1.4:1)\"\n },\n {\n \"antipattern\": \"tight-leading\",\n \"name\": \"Tight line height\",\n \"description\": \"Line height below 1.3x the font size makes multi-line text hard to read. Use 1.5 to 1.7 for body text so lines have room to breathe.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography.html\",\n \"line\": 0,\n \"snippet\": \"line-height 1.05x (need >=1.3)\"\n },\n {\n \"antipattern\": \"tiny-text\",\n \"name\": \"Tiny body text\",\n \"description\": \"Body text below 12px is hard to read, especially on high-DPI screens. Use at least 14px for body content, 16px is ideal.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography.html\",\n \"line\": 0,\n \"snippet\": \"10px body text\"\n },\n {\n \"antipattern\": \"all-caps-body\",\n \"name\": \"All-caps body text\",\n \"description\": \"Long passages in uppercase are hard to read. We recognize words by shape (ascenders and descenders), which all-caps removes. Reserve uppercase for short labels and headings.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography.html\",\n \"line\": 0,\n \"snippet\": \"text-transform: uppercase on 159 chars of body text\"\n },\n {\n \"antipattern\": \"wide-tracking\",\n \"name\": \"Wide letter spacing on body text\",\n \"description\": \"Letter spacing above 0.05em on body text disrupts natural character groupings and slows reading. Reserve wide tracking for short uppercase labels only.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography.html\",\n \"line\": 0,\n \"snippet\": \"letter-spacing: 0.08em on body text\"\n },\n {\n \"antipattern\": \"justified-text\",\n \"name\": \"Justified text\",\n \"description\": \"Justified text without hyphenation creates uneven word spacing (\\\"rivers of white\\\"). Use text-align: left for body text, or enable hyphens: auto if you must justify.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography.html\",\n \"line\": 0,\n \"snippet\": \"text-align: justify without hyphens: auto\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/typography.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: inter\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"8px functional text \\\"Flag Nav Link\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"8px functional text \\\"Flag Category\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"9px functional text \\\"Flag Meta Row\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"10px functional text \\\"Flag Button\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"9px functional text \\\"Flag Table Cell\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"10px functional text \\\"Flag Caps Label\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"undersized-ui-text\",\n \"name\": \"Undersized functional text\",\n \"description\": \"Interactive and content-bearing UI text (links, buttons, nav items, labels, table cells, meta rows, timecodes) below 11px is a legibility failure, not a style choice. WCAG sets no absolute pixel floor, but functional text under 11px is a defensible quality bar: it fails on high-DPI and small viewports and it degrades tap and read targets. The 11px floor holds even inside a footer; only non-interactive legal smallprint gets the softer 10px floor. Being ON the DESIGN.md size ramp does not exempt a value here: adding 8px to the ramp launders the token but not the legibility problem, and that is exactly the escape hatch this rule closes. Exempts sup/sub, visually-hidden (sr-only) text, and code/terminal contexts. Decorative letterspaced micro-labels are still functional and stay in scope.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/undersized-ui-text.html\",\n \"line\": 0,\n \"snippet\": \"8px functional text \\\"Flag Footer Link\\\" (below 11px floor)\"\n },\n {\n \"antipattern\": \"overused-font\",\n \"name\": \"Overused font\",\n \"description\": \"Inter, Roboto, Fraunces, Geist, Plus Jakarta Sans, and Space Grotesk are used on so many sites they no longer feel distinctive. Each new wave of AI-generated UIs converges on the same handful of faces. Choose a face that gives your interface personality.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/vue-should-flag.vue\",\n \"line\": 22,\n \"snippet\": \"font-family: 'Inter\"\n }\n]\n",
|
||
"stderr": "",
|
||
"exit": 2,
|
||
"signal": null,
|
||
"files": {}
|
||
}
|