Add oracle harness: verb goldens and function-level vectors

Records stdout/stderr/exit/files for every impeccable verb over a fixed
corpus and replays them against an alternate implementation. Adds a loader
hook that captures per-function call vectors from the pure engine modules.

Prepared with AI assistance (Claude Code).
This commit is contained in:
Paul Bakaus
2026-08-31 19:56:22 -07:00
parent d3f4cc8f4b
commit 57c1fccf73
212 changed files with 2089 additions and 0 deletions
+1
View File
@@ -129,3 +129,4 @@ tmp/
# PNGs, the old card backup). The canonical generator is `bun run og-image`
# (scripts/generate-og-image.js); this dir is throwaway and safe to delete.
.og-build/
tests/oracle/vectors/calls/
+7
View File
@@ -0,0 +1,7 @@
# Accepted deltas
Cases listed here differ from their JS golden on purpose. Each entry names the
case id, what differs, and why it is an improvement. Nothing gets on this list
without review.
Format: `- \`<case-id>\`: <what differs> (<why>)`
+19
View File
@@ -0,0 +1,19 @@
# Oracle: behavior goldens for every `impeccable` verb
`lib.mjs` runs each case (verb + args + staged workspace + stdin) against an
implementation and captures stdout, stderr, exit code, and named files, with
machine-specific paths and timestamps normalized.
- `record.mjs` writes goldens from the JS scripts (`skill/scripts`, `cli/bin`).
- `run.mjs` replays the corpus against `$IMPECCABLE_BIN` (or `--js` for a
self-check) and diffs. Byte-equal is the bar; `DELTAS.md` lists reviewed
exceptions.
- `cases/*.mjs` define the corpus (default export: array or async function
returning an array). `workspaces/` holds project fixtures that are copied to
a temp dir per run, so cases can write freely.
Adding a case: append to the matching `cases/*.mjs`, run
`node tests/oracle/record.mjs <prefix>`, commit the golden.
Verb names are the binary's subcommands. `cli-help` and `cli-version` map to
`impeccable --help` / `--version`.
+83
View File
@@ -0,0 +1,83 @@
/**
* `impeccable detect` corpus.
*
* Every antipattern fixture is scanned individually in JSON and text mode with
* --no-config (the repo's own .impeccable config ignores tests/fixtures), plus
* directory scans, project-config / DESIGN.md / inline-ignore behaviour from
* the detect-config workspace, and the flag surface (help, scope, quiet,
* no-advisory, errors).
*/
import fs from 'node:fs';
import path from 'node:path';
import { REPO_ROOT } from '../lib.mjs';
const FIXTURES = path.join(REPO_ROOT, 'tests', 'fixtures', 'antipatterns');
export default function cases() {
const out = [];
const entries = fs.readdirSync(FIXTURES, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
for (const ent of entries) {
const rel = `tests/fixtures/antipatterns/${ent.name}`;
const id = ent.name.replace(/[^a-z0-9]+/gi, '-').toLowerCase();
out.push({
id: `detect-fixture-json-${id}`,
verb: 'detect',
args: ['--no-config', '--json', `<REPO>/${rel}`],
isolateHome: false,
});
out.push({
id: `detect-fixture-text-${id}`,
verb: 'detect',
args: ['--no-config', `<REPO>/${rel}`],
isolateHome: false,
});
}
out.push(
{ id: 'detect-dir-json-all-fixtures', verb: 'detect', args: ['--no-config', '--json', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-dir-text-all-fixtures', verb: 'detect', args: ['--no-config', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-dir-quiet-all-fixtures', verb: 'detect', args: ['--no-config', '--quiet', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-scope-type', verb: 'detect', args: ['--no-config', '--json', '--scope', 'type', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-scope-layout-text', verb: 'detect', args: ['--no-config', '--scope', 'layout', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-scope-both', verb: 'detect', args: ['--no-config', '--json', '--scope', 'type,layout', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-scope-unknown', verb: 'detect', args: ['--no-config', '--json', '--scope', 'nope', `<REPO>/tests/fixtures/antipatterns/blinking-cursor.html`], isolateHome: false },
{ id: 'detect-no-advisory-json', verb: 'detect', args: ['--no-config', '--no-advisory', '--json', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-no-advisory-text', verb: 'detect', args: ['--no-config', '--no-advisory', `<REPO>/tests/fixtures/antipatterns`], isolateHome: false, timeoutMs: 180_000 },
{ id: 'detect-multifile-json', verb: 'detect', args: ['--no-config', '--json', `<REPO>/tests/fixtures/antipatterns/multifile`], isolateHome: false },
{ id: 'detect-multifile-text', verb: 'detect', args: ['--no-config', `<REPO>/tests/fixtures/antipatterns/multifile`], isolateHome: false },
{ id: 'detect-framework-vite-json', verb: 'detect', args: ['--no-config', '--json', `<REPO>/tests/fixtures/antipatterns/framework-vite`], isolateHome: false },
{ id: 'detect-framework-next-tailwind-json', verb: 'detect', args: ['--no-config', '--json', `<REPO>/tests/fixtures/antipatterns/framework-next-tailwind`], isolateHome: false },
{ id: 'detect-framework-next-modules-text', verb: 'detect', args: ['--no-config', `<REPO>/tests/fixtures/antipatterns/framework-next-modules`], isolateHome: false },
{ id: 'detect-framework-next-cssinjs-json', verb: 'detect', args: ['--no-config', '--json', `<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs`], isolateHome: false },
// Flag surface and errors
{ id: 'detect-help', verb: 'detect', args: ['--help'] },
{ id: 'detect-no-args', verb: 'detect', args: [] },
{ id: 'detect-missing-file', verb: 'detect', args: ['--no-config', 'does-not-exist.html'] },
{ id: 'detect-missing-file-json', verb: 'detect', args: ['--no-config', '--json', 'does-not-exist.html'] },
{ id: 'detect-unknown-flag', verb: 'detect', args: ['--bogus', `<REPO>/tests/fixtures/antipatterns/blinking-cursor.html`], isolateHome: false },
{ id: 'detect-bad-viewport', verb: 'detect', args: ['--viewport', 'wide', `<REPO>/tests/fixtures/antipatterns/blinking-cursor.html`], isolateHome: false },
{ id: 'cli-help', verb: 'cli-help', args: [] },
{ id: 'cli-version', verb: 'cli-version', args: [] },
// Project config, DESIGN.md, inline ignores (detect-config workspace)
{ id: 'detect-config-page-json', verb: 'detect', workspace: 'detect-config', args: ['--json', 'src/page.html'] },
{ id: 'detect-config-page-text', verb: 'detect', workspace: 'detect-config', args: ['src/page.html'] },
{ id: 'detect-config-page-no-config', verb: 'detect', workspace: 'detect-config', args: ['--no-config', '--json', 'src/page.html'] },
{ id: 'detect-config-page-no-design-system', verb: 'detect', workspace: 'detect-config', args: ['--no-design-system', '--json', 'src/page.html'] },
{ id: 'detect-config-dir-json', verb: 'detect', workspace: 'detect-config', args: ['--json', 'src'] },
{ id: 'detect-config-dir-text', verb: 'detect', workspace: 'detect-config', args: ['src'] },
{ id: 'detect-config-dir-dot', verb: 'detect', workspace: 'detect-config', args: ['--json', '.'] },
{ id: 'detect-config-inline-json', verb: 'detect', workspace: 'detect-config', args: ['--json', 'src/inline.html'] },
{ id: 'detect-config-inline-disabled', verb: 'detect', workspace: 'detect-config', args: ['--no-inline-ignores', '--json', 'src/inline.html'] },
{ id: 'detect-config-css-json', verb: 'detect', workspace: 'detect-config', args: ['--json', 'src/styles.css'] },
{ id: 'detect-config-css-text', verb: 'detect', workspace: 'detect-config', args: ['src/styles.css'] },
{ id: 'detect-config-vendor-ignored', verb: 'detect', workspace: 'detect-config', args: ['--json', 'src/vendor/ignored.html'] },
{ id: 'detect-config-from-subdir', verb: 'detect', workspace: 'detect-config', cwd: 'src', args: ['--json', 'page.html'] },
// A file in one project must not pick up another project's DESIGN.md
{ id: 'detect-config-cross-project', verb: 'detect', workspace: 'detect-config', args: ['--json', `<REPO>/tests/fixtures/antipatterns/blinking-cursor.html`], isolateHome: false },
);
return out;
}
+7
View File
@@ -0,0 +1,7 @@
{
"stdout": "Usage: impeccable <command> [options]\n\nCommands:\n detect [file-or-dir-or-url...] Scan for UI anti-patterns and design quality issues\n ignores Manage detector ignore rules, files, and values\n help List all available skills and commands\n install Install impeccable skills into your project or global harness\n link Symlink skills from a local checkout or submodule\n update Update skills to the latest version\n check Check if skill updates are available\n\nOptions:\n --help Show this help message\n --version Show version number\n\nCompatibility:\n impeccable skills <command> Legacy namespace; still supported.\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
+7
View File
@@ -0,0 +1,7 @@
{
"stdout": "3.6.0\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "",
"stderr": "Error: --viewport requires a WxH value, e.g. --viewport 390x844\n",
"exit": 1,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/blinking-cursor.html\",\n \"line\": 20,\n \"snippet\": \"Undocumented color #33d17a is outside DESIGN.md colors\",\n \"ignoreValue\": \"#33d17a\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/blinking-cursor.html\",\n \"line\": 58,\n \"snippet\": \"Undocumented color #999 is outside DESIGN.md colors\",\n \"ignoreValue\": \"#999\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<WS>/src/styles.css\",\n \"line\": 1,\n \"snippet\": \"cubic-bezier(0.68, -0.55, 0.265, 1.55)\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/styles.css\",\n \"line\": 2,\n \"snippet\": \"Undocumented color rgba(99, 102, 241, 0.6) is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgba(99, 102, 241, 0.6)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "",
"stderr": "\n<WS>/src/styles.css\n line 1: [bounce-easing] cubic-bezier(0.68, -0.55, 0.265, 1.55)\n → Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\n line 2: [design-system-color] Undocumented color rgba(99, 102, 241, 0.6) is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n\n2 anti-patterns found.\n",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 5,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"faint text\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on p \\\"x\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 3,\n \"snippet\": \"div \\\"Hi\\\" uses verdana; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"verdana\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on div \\\"Hi\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 4,\n \"snippet\": \"p \\\"Brand\\\" uses inter; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"inter\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 6,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"Off palette\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<WS>/src/styles.css\",\n \"line\": 1,\n \"snippet\": \"cubic-bezier(0.68, -0.55, 0.265, 1.55)\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/styles.css\",\n \"line\": 2,\n \"snippet\": \"Undocumented color rgba(99, 102, 241, 0.6) is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgba(99, 102, 241, 0.6)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 5,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"faint text\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on p \\\"x\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 3,\n \"snippet\": \"div \\\"Hi\\\" uses verdana; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"verdana\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on div \\\"Hi\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 4,\n \"snippet\": \"p \\\"Brand\\\" uses inter; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"inter\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 6,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"Off palette\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<WS>/src/styles.css\",\n \"line\": 1,\n \"snippet\": \"cubic-bezier(0.68, -0.55, 0.265, 1.55)\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/styles.css\",\n \"line\": 2,\n \"snippet\": \"Undocumented color rgba(99, 102, 241, 0.6) is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgba(99, 102, 241, 0.6)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "",
"stderr": "\n<WS>/src/inline.html\n line 5: [design-system-color] text color rgb(255, 0, 170) on p \"faint text\" is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n [design-system-color] text color rgb(0, 0, 0) on p \"x\" is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n\n<WS>/src/page.html\n [low-contrast] 3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\n → Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\n line 3: [design-system-font] div \"Hi\" uses verdana; not declared in DESIGN.md typography\n → A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\n [design-system-color] text color rgb(0, 0, 0) on div \"Hi\" is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n line 4: [design-system-font] p \"Brand\" uses inter; not declared in DESIGN.md typography\n → A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\n line 6: [design-system-color] text color rgb(255, 0, 170) on p \"Off palette\" is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n\n<WS>/src/styles.css\n line 1: [bounce-easing] cubic-bezier(0.68, -0.55, 0.265, 1.55)\n → Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\n line 2: [design-system-color] Undocumented color rgba(99, 102, 241, 0.6) is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n\n9 anti-patterns found.\n",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 3,\n \"snippet\": \"div \\\"Hi\\\" uses verdana; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"verdana\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on div \\\"Hi\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 4,\n \"snippet\": \"p \\\"Brand\\\" uses inter; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"inter\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 6,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"Off palette\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\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\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: inter\"\n },\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \".dot — 8x8px dot with infinite \\\"blink\\\" animation\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 5,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"faint text\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 6,\n \"snippet\": \"p \\\"x\\\" uses verdana; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"verdana\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on p \\\"x\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 5,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"faint text\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/inline.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on p \\\"x\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 3,\n \"snippet\": \"div \\\"Hi\\\" uses verdana; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"verdana\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"text color rgb(0, 0, 0) on div \\\"Hi\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(0, 0, 0)\"\n },\n {\n \"antipattern\": \"design-system-font\",\n \"name\": \"Font outside DESIGN.md\",\n \"description\": \"A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 4,\n \"snippet\": \"p \\\"Brand\\\" uses inter; not declared in DESIGN.md typography\",\n \"ignoreValue\": \"inter\"\n },\n {\n \"antipattern\": \"design-system-color\",\n \"name\": \"Color outside DESIGN.md\",\n \"description\": \"A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\",\n \"severity\": \"advisory\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 6,\n \"snippet\": \"text color rgb(255, 0, 170) on p \\\"Off palette\\\" is outside DESIGN.md colors\",\n \"ignoreValue\": \"rgb(255, 0, 170)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\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\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"Primary font: inter\"\n },\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \".dot — 8x8px dot with infinite \\\"blink\\\" animation\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<WS>/src/page.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "",
"stderr": "\n<WS>/src/page.html\n [low-contrast] 3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\n → Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\n line 3: [design-system-font] div \"Hi\" uses verdana; not declared in DESIGN.md typography\n → A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\n [design-system-color] text color rgb(0, 0, 0) on div \"Hi\" is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n line 4: [design-system-font] p \"Brand\" uses inter; not declared in DESIGN.md typography\n → A font is used that is not declared in DESIGN.md typography. Use the documented type system or update DESIGN.md if this is an intentional brand addition.\n line 6: [design-system-color] text color rgb(255, 0, 170) on p \"Off palette\" is outside DESIGN.md colors\n → A literal color is outside the DESIGN.md palette and sidecar tonal ramps. This may be legitimate, but it should be an intentional design-system addition rather than drift.\n\n5 anti-patterns found.\n",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "",
"stderr": "392 anti-patterns found.\n2 advisory notes (not counted).\n",
"exit": 2,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/blinking-cursor.html\",\n \"line\": 0,\n \"snippet\": \".pass-round-dot — 8x8px dot with infinite \\\"blink-anim\\\" animation\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 10px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-right: 5px + border-radius: 10px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-top: 4px + border-radius: 10px\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-bottom: 3px + border-radius: 10px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 10px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-top: 4px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/border-baseline.html\",\n \"line\": 0,\n \"snippet\": \"border-bottom: 3px\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"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 1216px) 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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cramped-padding.html\",\n \"line\": 0,\n \"snippet\": \"3.7:1 (need 4.5:1) — text #ffffff on #3b82f6\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"cream-palette\",\n \"name\": \"Cream / beige palette\",\n \"description\": \"A warm cream or beige page background has become the default \\\"tasteful\\\" AI surface, reached for by reflex. Choose a background that comes from a deliberate palette, not the safe warm off-white.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cream-palette.html\",\n \"line\": 0,\n \"snippet\": \"cream/beige page background rgb(245, 239, 226)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"cream-palette\",\n \"name\": \"Cream / beige palette\",\n \"description\": \"A warm cream or beige page background has become the default \\\"tasteful\\\" AI surface, reached for by reflex. Choose a background that comes from a deliberate palette, not the safe warm off-white.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cream-palette-tailwind.html\",\n \"line\": 0,\n \"snippet\": \"cream/beige page background (Tailwind bg-amber-50)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"background-clip: text + gradient\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"background-clip: text + gradient\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"bg-clip-text + bg-gradient (Tailwind)\"\n },\n {\n \"antipattern\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"Purple/violet gradient (Tailwind)\"\n },\n {\n \"antipattern\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"Purple/violet accent colors detected\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"background-clip: text + gradient\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/css-in-prose-should-flag.html\",\n \"line\": 0,\n \"snippet\": \"bg-clip-text + bg-gradient (Tailwind)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 8,\n \"snippet\": \"border-left: 4px solid #3b82f6\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 36,\n \"snippet\": \"border-right: 5px solid #8b5cf6\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 42,\n \"snippet\": \"borderLeft: '4px solid\"\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\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 30,\n \"snippet\": \"animation: bounce\"\n },\n {\n \"antipattern\": \"layout-transition\",\n \"name\": \"Layout property animation\",\n \"description\": \"Animating width, height, padding, or margin causes layout thrash and janky performance. Use transform and opacity instead, or grid-template-rows for height animations.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 31,\n \"snippet\": \"transition: width\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/cssinjs-should-flag.tsx\",\n \"line\": 22,\n \"snippet\": \"background-clip: text + gradient\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-gradient-ground.html\",\n \"line\": 0,\n \"snippet\": \"1.0:1 (need 4.5:1) — text #d7d7d7 on #dcdbd8\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-gradient-ground.html\",\n \"line\": 0,\n \"snippet\": \"1.5:1 (need 4.5:1) — text #2e2e2e on #010101\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-gradient-ground.html\",\n \"line\": 0,\n \"snippet\": \"1.7:1 (need 4.5:1) — text #333333 on #010101\"\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"1.6:1 (need 4.5:1) — text #35332d on #050403\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"1.9:1 (need 4.5:1) — text #47474d on #1a1c1f\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"2.7:1 (need 4.5:1) — text #59595c on #121215\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"1.8:1 (need 4.5:1) — text #56514e on #302b27\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"1.8:1 (need 4.5:1) — text #bfbdb8 on #faf7f2\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"1.6:1 (need 4.5:1) — text #c7c4bf on #faf7f2\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/dark-theme-modern-color.html\",\n \"line\": 0,\n \"snippet\": \"1.6:1 (need 4.5:1) — text #bfbdb8 on #f0ede8\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/design-system.html\",\n \"line\": 0,\n \"snippet\": \"3.6:1 (need 4.5:1) — text #ff00aa on #ffffff\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/design-system.html\",\n \"line\": 0,\n \"snippet\": \"3.9:1 (need 4.5:1) — text #d55a42 on #ffffff\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"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 1216px) 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 1216px) 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 1216px) 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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"em-dash-overuse\",\n \"name\": \"Em-dash overuse\",\n \"description\": \"Em-dash saturation in body copy is an AI cadence tell. Advisory only: humans use em-dashes legitimately, so this fires only on saturation — at least 8 em-dashes (— or --) at a density near one per 500 characters of body text — never on a long article that uses a few. Prefer commas, colons, periods, or parentheses.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/em-dash-entities.html\",\n \"line\": 0,\n \"snippet\": \"8 em-dashes in body text\",\n \"advisory\": true\n }\n]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/external-styles.css\",\n \"line\": 8,\n \"snippet\": \"border-left: 4px solid #3b82f6\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/external-styles.css\",\n \"line\": 17,\n \"snippet\": \"border-top: 3px solid\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/external-styles.css\",\n \"line\": 49,\n \"snippet\": \"border-top: 4px solid\"\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"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 1216px) 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 1216px) 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 1216px) 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 1216px) 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 1216px) 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 1216px) 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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/FeatureGrid.tsx\",\n \"line\": 13,\n \"snippet\": \"border-left: 4px solid #8b5cf6\",\n \"importedBy\": [\n \"index.tsx\"\n ]\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/FeatureGrid.tsx\",\n \"line\": 24,\n \"snippet\": \"animation: bounce\",\n \"importedBy\": [\n \"index.tsx\"\n ]\n },\n {\n \"antipattern\": \"layout-transition\",\n \"name\": \"Layout property animation\",\n \"description\": \"Animating width, height, padding, or margin causes layout thrash and janky performance. Use transform and opacity instead, or grid-template-rows for height animations.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/FeatureGrid.tsx\",\n \"line\": 18,\n \"snippet\": \"transition: width\",\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-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\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/Hero.tsx\",\n \"line\": 18,\n \"snippet\": \"background-clip: text + gradient\",\n \"importedBy\": [\n \"index.tsx\"\n ]\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/Testimonials.tsx\",\n \"line\": 21,\n \"snippet\": \"border-left: 4px solid #6366f1\",\n \"importedBy\": [\n \"index.tsx\"\n ]\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-cssinjs/components/Testimonials.tsx\",\n \"line\": 15,\n \"snippet\": \"background-clip: text + gradient\",\n \"importedBy\": [\n \"index.tsx\"\n ]\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-modules/app/page.module.css\",\n \"line\": 16,\n \"snippet\": \"background-clip: text + gradient\",\n \"importedBy\": [\n \"page.tsx\"\n ]\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-modules/components/Sidebar.module.css\",\n \"line\": 4,\n \"snippet\": \"border-right: 3px solid #4f46e5\",\n \"importedBy\": [\n \"Sidebar.tsx\"\n ]\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-modules/components/StatsCard.module.css\",\n \"line\": 2,\n \"snippet\": \"border-left: 4px solid #6366f1\",\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-modules/components/StatsCard.module.css\",\n \"line\": 23,\n \"snippet\": \"font-family: 'Inter\",\n \"importedBy\": [\n \"StatsCard.tsx\"\n ]\n },\n {\n \"antipattern\": \"layout-transition\",\n \"name\": \"Layout property animation\",\n \"description\": \"Animating width, height, padding, or margin causes layout thrash and janky performance. Use transform and opacity instead, or grid-template-rows for height animations.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-next-modules/components/StatsCard.module.css\",\n \"line\": 10,\n \"snippet\": \"transition: width\",\n \"importedBy\": [\n \"StatsCard.tsx\"\n ]\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/framework-vite/main.tsx\",\n \"line\": 5,\n \"snippet\": \"border-l-4\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"image-hover-transform\",\n \"name\": \"Image hover transform\",\n \"description\": \"Scaling or rotating an image on hover is a recurring generated-UI signature. Let imagery sit still, or use a subtler, purposeful interaction.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/gemini-tells.html\",\n \"line\": 0,\n \"snippet\": \"img:hover { transform } rule\"\n },\n {\n \"antipattern\": \"image-hover-transform\",\n \"name\": \"Image hover transform\",\n \"description\": \"Scaling or rotating an image on hover is a recurring generated-UI signature. Let imagery sit still, or use a subtler, purposeful interaction.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/gemini-tells.html\",\n \"line\": 0,\n \"snippet\": \"Tailwind hover transform on <img>\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"gpt-thin-border-wide-shadow\",\n \"name\": \"Hairline border with wide shadow\",\n \"description\": \"A hairline border paired with a wide, diffuse shadow is a recurring generated-UI signature. Commit to one — a defined edge or a soft elevation — rather than both at once.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/gpt-tells.html\",\n \"line\": 0,\n \"snippet\": \"1px border + 24px shadow blur\"\n },\n {\n \"antipattern\": \"repeating-stripes-gradient\",\n \"name\": \"Repeating-gradient stripes\",\n \"description\": \"Repeating-gradient stripes used as surface decoration are a recurring generated-UI signature. Reach for a deliberate texture or leave the surface plain.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/gpt-tells.html\",\n \"line\": 0,\n \"snippet\": \"repeating-gradient decorative stripes\"\n },\n {\n \"antipattern\": \"codex-grid-background\",\n \"name\": \"Decorative grid-line background\",\n \"description\": \"A decorative grid or line-field background drawn with hairline linear-gradient layers tiled by a fixed pixel cell is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/gpt-tells.html\",\n \"line\": 0,\n \"snippet\": \"two-axis grid-line gradient background\"\n },\n {\n \"antipattern\": \"theater-slop-phrase\",\n \"name\": \"Theater framing copy\",\n \"description\": \"Dismissing something as \\\"theater\\\" is a recurring generated-copy tic. Say plainly what the thing does or does not do.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/gpt-tells.html\",\n \"line\": 0,\n \"snippet\": \"\\\"growth theater\\\"\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"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 1216px) 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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"Purple/violet accent colors detected\"\n },\n {\n \"antipattern\": \"marketing-buzzword\",\n \"name\": \"Marketing buzzword\",\n \"description\": \"Generic SaaS phrases (streamline / empower / supercharge / world-class / enterprise-grade / next-generation / cutting-edge / etc) are instant AI tells. Pick a specific verb and noun that says what the product literally does.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/icon-tile-stack.html\",\n \"line\": 0,\n \"snippet\": \"1 buzzword phrase: \\\"ure Storage Enterprise-grade security fo\\\"\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 8,\n \"snippet\": \"border-l-4\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 35,\n \"snippet\": \"borderLeft: '4px solid\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 22,\n \"snippet\": \"bg-clip-text + bg-gradient\"\n },\n {\n \"antipattern\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 10,\n \"snippet\": \"text-purple-500 on heading\"\n },\n {\n \"antipattern\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 22,\n \"snippet\": \"from-purple-400 gradient\"\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 50,\n \"snippet\": \"animate-bounce (Tailwind)\"\n },\n {\n \"antipattern\": \"layout-transition\",\n \"name\": \"Layout property animation\",\n \"description\": \"Animating width, height, padding, or margin causes layout thrash and janky performance. Use transform and opacity instead, or grid-template-rows for height animations.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/jsx-should-flag.jsx\",\n \"line\": 51,\n \"snippet\": \"transition: width\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/linked-stylesheet.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 12px\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/linked-stylesheet.html\",\n \"line\": 0,\n \"snippet\": \"border-top: 3px + border-radius: 12px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/linked-stylesheet.html\",\n \"line\": 0,\n \"snippet\": \"border-top: 4px\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/multifile/Card.tsx\",\n \"line\": 11,\n \"snippet\": \"border-l-4\",\n \"importedBy\": [\n \"App.tsx\"\n ]\n },\n {\n \"antipattern\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/multifile/Card.tsx\",\n \"line\": 12,\n \"snippet\": \"text-purple-500 on heading\",\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/multifile/styles.css\",\n \"line\": 3,\n \"snippet\": \"font-family: 'Inter\",\n \"importedBy\": [\n \"App.tsx\"\n ]\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/multifile/styles.css\",\n \"line\": 8,\n \"snippet\": \"animation: bounce\",\n \"importedBy\": [\n \"App.tsx\"\n ]\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/multifile/theme.sass\",\n \"line\": 4,\n \"snippet\": \"border-left: 4px solid $primary\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/multifile/theme.scss\",\n \"line\": 4,\n \"snippet\": \"border-left: 4px solid $primary\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 8px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 5px + border-radius: 4px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"border-top: 4px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 3px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 6px + border-radius: 4px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 7px\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/named-color-borders.html\",\n \"line\": 0,\n \"snippet\": \"4.4:1 (need 4.5:1) — text #64748b on #f6f6f6\"\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.3:1 (need 4.5:1) — text #c9d6ea on #e8b84b\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.2:1 (need 4.5:1) — text #b7c6de on #e5a93f\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.3:1 (need 4.5:1) — text #cfd9e9 on #f0b64e\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.3:1 (need 4.5:1) — text #d3dcec on #f2b854\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.3:1 (need 4.5:1) — text #d0daea on #efb352\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.1:1 (need 4.5:1) — text #b7c6de on #eab04a\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.8:1 (need 4.5:1) — text #d2dcec on #cf9c48\"\n },\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/nav-cta-constructions.html\",\n \"line\": 0,\n \"snippet\": \"1.0:1 (need 4.5:1) — text #aabfde on #fcb442\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/partial-component.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 8px\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.css\",\n \"line\": 16,\n \"snippet\": \".card[data-case=\\\"Inset Shorthand Left Edge\\\"]::before — absolute 4px pseudo-element stripe (left: 0)\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.css\",\n \"line\": 25,\n \"snippet\": \".card[data-case=\\\"Longhand Left Edge\\\"]::before — absolute 4px pseudo-element stripe (left: 0)\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.css\",\n \"line\": 36,\n \"snippet\": \".card[data-case=\\\"Bottom Edge\\\"]::after — absolute 4px pseudo-element stripe (bottom: 0)\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.css\",\n \"line\": 47,\n \"snippet\": \".card[data-case=\\\"Full Height Right Edge\\\"]::before — absolute 3px pseudo-element stripe (right: 0)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.html\",\n \"line\": 0,\n \"snippet\": \".card-stripe::before — absolute 5px pseudo-element stripe (left: 0)\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.html\",\n \"line\": 0,\n \"snippet\": \".row-stripe::after — absolute 4px pseudo-element stripe (right: 0)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pseudo-stripe.vue\",\n \"line\": 13,\n \"snippet\": \".card[data-case=\\\"Component Left Edge\\\"]::before — absolute 4px pseudo-element stripe (left: 0)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pulsing-dot.html\",\n \"line\": 0,\n \"snippet\": \".live-dot — 7x7px dot with infinite \\\"pulse\\\" animation\"\n },\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pulsing-dot.html\",\n \"line\": 0,\n \"snippet\": \".status .dot — 8x8px dot with infinite \\\"ripple\\\" animation\"\n },\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pulsing-dot.html\",\n \"line\": 0,\n \"snippet\": \".beacon — 10x10px dot with infinite \\\"pulse\\\" animation\"\n },\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"error\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pulsing-dot.html\",\n \"line\": 0,\n \"snippet\": \".rec-mark — 10x10px dot with infinite \\\"pulse\\\" animation in header/nav\"\n },\n {\n \"antipattern\": \"pulsing-dot\",\n \"name\": \"Pulsing status dot\",\n \"description\": \"Small pulsing status dots simulate liveness decoratively. Reserve pulse animation for indicators tied to genuinely live, changing data; a static indicator with clear labeling is honest and calmer.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/pulsing-dot.html\",\n \"line\": 0,\n \"snippet\": \"animate-ping on tiny rounded-full element\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"radial-spotlight-glow\",\n \"name\": \"Decorative radial spotlight glow\",\n \"description\": \"A soft, low-opacity accent-colored radial gradient fading to transparent, dropped behind a hero or section as a \\\"spotlight.\\\" It is a reflex AI decoration — the translucent cousin of the saturated radial halo. Let the surface stand on its own, or light the composition with a deliberate material accent rather than a floating colored haze.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/radial-spotlight-glow.html\",\n \"line\": 0,\n \"snippet\": \"radial-gradient spotlight glow \\\"Hero Spotlight Blue\\\" (#506fff a0.26 → transparent) on 360x560 surface\"\n },\n {\n \"antipattern\": \"radial-spotlight-glow\",\n \"name\": \"Decorative radial spotlight glow\",\n \"description\": \"A soft, low-opacity accent-colored radial gradient fading to transparent, dropped behind a hero or section as a \\\"spotlight.\\\" It is a reflex AI decoration — the translucent cousin of the saturated radial halo. Let the surface stand on its own, or light the composition with a deliberate material accent rather than a floating colored haze.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/radial-spotlight-glow.html\",\n \"line\": 0,\n \"snippet\": \"radial-gradient spotlight glow \\\"Section Glow Violet\\\" (#8b5cf6 a0.30 → transparent) on 900x600 surface\"\n },\n {\n \"antipattern\": \"radial-spotlight-glow\",\n \"name\": \"Decorative radial spotlight glow\",\n \"description\": \"A soft, low-opacity accent-colored radial gradient fading to transparent, dropped behind a hero or section as a \\\"spotlight.\\\" It is a reflex AI decoration — the translucent cousin of the saturated radial halo. Let the surface stand on its own, or light the composition with a deliberate material accent rather than a floating colored haze.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/radial-spotlight-glow.html\",\n \"line\": 0,\n \"snippet\": \"radial-gradient spotlight glow \\\"Overlay Glow Cyan\\\" (#22d3ee a0.22 → transparent) on 760x480 surface\"\n },\n {\n \"antipattern\": \"radial-spotlight-glow\",\n \"name\": \"Decorative radial spotlight glow\",\n \"description\": \"A soft, low-opacity accent-colored radial gradient fading to transparent, dropped behind a hero or section as a \\\"spotlight.\\\" It is a reflex AI decoration — the translucent cousin of the saturated radial halo. Let the surface stand on its own, or light the composition with a deliberate material accent rather than a floating colored haze.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/radial-spotlight-glow.html\",\n \"line\": 0,\n \"snippet\": \"radial-gradient spotlight glow \\\"Two Stop Soft Glow\\\" (#ff5a78 a0.28 → transparent) on 640x400 surface\"\n },\n {\n \"antipattern\": \"radial-spotlight-glow\",\n \"name\": \"Decorative radial spotlight glow\",\n \"description\": \"A soft, low-opacity accent-colored radial gradient fading to transparent, dropped behind a hero or section as a \\\"spotlight.\\\" It is a reflex AI decoration — the translucent cousin of the saturated radial halo. Let the surface stand on its own, or light the composition with a deliberate material accent rather than a floating colored haze.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/radial-spotlight-glow.html\",\n \"line\": 0,\n \"snippet\": \"radial-gradient spotlight glow \\\"Hex Alpha Glow\\\" (#506fff a0.24 → transparent) on 700x460 surface\"\n },\n {\n \"antipattern\": \"radial-halo\",\n \"name\": \"Radial-gradient background halo\",\n \"description\": \"A chromatic radial-gradient wash — saturated at the center, fading to transparent — used as a decorative background glow on a dark page. Same tell as glowing shadows, drawn with a gradient instead of a shadow. Ground the surface with a solid or subtly shifted background instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/radial-spotlight-glow.html\",\n \"line\": 0,\n \"snippet\": \"radial-gradient halo (#ff0080 → transparent) on dark page\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"repeated-container-text\",\n \"name\": \"Same text repeated inside one container\",\n \"description\": \"The same literal text rendered three or more times in structurally different spots inside a single card or panel is redundant messaging — usually a status or label wired into every slot of a template. Say it once, in the slot where it matters most.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/repeated-container-text.html\",\n \"line\": 0,\n \"snippet\": \"\\\"Suspended\\\" rendered 3× in distinct spots inside div.card\"\n },\n {\n \"antipattern\": \"repeated-container-text\",\n \"name\": \"Same text repeated inside one container\",\n \"description\": \"The same literal text rendered three or more times in structurally different spots inside a single card or panel is redundant messaging — usually a status or label wired into every slot of a template. Say it once, in the slot where it matters most.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/repeated-container-text.html\",\n \"line\": 0,\n \"snippet\": \"\\\"Unavailable\\\" rendered 4× in distinct spots inside div.shadow-card\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 6px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 8px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 12px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 5px\"\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\": \"cream-palette\",\n \"name\": \"Cream / beige palette\",\n \"description\": \"A warm cream or beige page background has become the default \\\"tasteful\\\" AI surface, reached for by reflex. Choose a background that comes from a deliberate palette, not the safe warm off-white.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"cream/beige page background rgb(250, 248, 244)\"\n },\n {\n \"antipattern\": \"codex-grid-background\",\n \"name\": \"Decorative grid-line background\",\n \"description\": \"A decorative grid or line-field background drawn with hairline linear-gradient layers tiled by a fixed pixel cell is a recurring generated-UI signature. Reserve grid overlays for actual canvas, map, blueprint, or measurement surfaces; elsewhere use product structure or a plain surface.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/scoped-ignore.html\",\n \"line\": 0,\n \"snippet\": \"two-axis grid-line gradient background\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"shape-assembled-illustration\",\n \"name\": \"Shape-assembled illustration\",\n \"description\": \"A large inline SVG that builds a pictorial scene from a pile of primitive shapes reads as placeholder clip art, not illustration. Icons, logos, and data graphics are fine at their scale; a hero-sized visual deserves real artwork, a photograph, or a deliberately drawn graphic.\",\n \"severity\": \"advisory\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/shape-assembled-illustration.html\",\n \"line\": 0,\n \"snippet\": \"inline <svg> scene: 12 primitive shapes, ~640x480px, 6 fill colors\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 0.375px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-right: 5px + border-radius: 0.375px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 3px + border-radius: 0.375px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-right: 6px + border-radius: 0.375px\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-top: 4px + border-radius: 12px\"\n },\n {\n \"antipattern\": \"border-accent-on-rounded\",\n \"name\": \"Border accent on rounded element\",\n \"description\": \"Thick accent border on a rounded card — the border clashes with the rounded corners. Remove the border or the border-radius.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-bottom: 3px + border-radius: 12px\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/should-flag.html\",\n \"line\": 0,\n \"snippet\": \"border-left: 4px + border-radius: 12px\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 6,\n \"snippet\": \"border-r-4\"\n },\n {\n \"antipattern\": \"side-tab\",\n \"name\": \"Side-tab accent border\",\n \"description\": \"Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 17,\n \"snippet\": \"border-right: 4px solid #8b5cf6\"\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\": \"ai-color-palette\",\n \"name\": \"AI color palette\",\n \"description\": \"Purple/violet gradients and cyan-on-dark are the most recognizable tells of AI-generated UIs. Choose a distinctive, intentional palette.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 7,\n \"snippet\": \"text-purple-500 on heading\"\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 10,\n \"snippet\": \"animate-bounce (Tailwind)\"\n },\n {\n \"antipattern\": \"bounce-easing\",\n \"name\": \"Bounce or elastic easing\",\n \"description\": \"Bounce and elastic easing feel dated and tacky. Real objects decelerate smoothly — use exponential easing (ease-out-quart/quint/expo) instead.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 30,\n \"snippet\": \"animation: elastic\"\n },\n {\n \"antipattern\": \"layout-transition\",\n \"name\": \"Layout property animation\",\n \"description\": \"Animating width, height, padding, or margin causes layout thrash and janky performance. Use transform and opacity instead, or grid-template-rows for height animations.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 31,\n \"snippet\": \"transition: height\"\n },\n {\n \"antipattern\": \"gradient-text\",\n \"name\": \"Gradient text\",\n \"description\": \"Gradient text is decorative rather than meaningful — a common AI tell, especially on headings and metrics. Use solid colors for text.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/svelte-should-flag.svelte\",\n \"line\": 26,\n \"snippet\": \"background-clip: text + gradient\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"low-contrast\",\n \"name\": \"Low contrast text\",\n \"description\": \"Text does not meet WCAG AA contrast requirements (4.5:1 for body, 3:1 for large text). Increase the contrast between text and background.\",\n \"severity\": \"warning\",\n \"category\": \"quality\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/text-occlusion.html\",\n \"line\": 0,\n \"snippet\": \"1.0:1 (need 3:1) — text #ffffff on #ffffff\"\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[\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",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}
@@ -0,0 +1,7 @@
{
"stdout": "[]\n",
"stderr": "",
"exit": 0,
"signal": null,
"files": {}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"stdout": "[\n {\n \"antipattern\": \"cream-palette\",\n \"name\": \"Cream / beige palette\",\n \"description\": \"A warm cream or beige page background has become the default \\\"tasteful\\\" AI surface, reached for by reflex. Choose a background that comes from a deliberate palette, not the safe warm off-white.\",\n \"severity\": \"warning\",\n \"category\": \"slop\",\n \"file\": \"<REPO>/tests/fixtures/antipatterns/visual-contrast.html\",\n \"line\": 0,\n \"snippet\": \"cream/beige page background rgb(247, 243, 238)\"\n }\n]\n",
"stderr": "",
"exit": 2,
"signal": null,
"files": {}
}

Some files were not shown because too many files have changed in this diff Show More