From f604d31d549783f23076461d735370bf5e6c678b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 08:30:06 +0000 Subject: [PATCH] Sync generated provider output --- .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ .../detector/detect-antipatterns-browser.js | 47 +++++++++++++++++++ .../detector/registry/antipatterns.mjs | 11 +++++ .../scripts/detector/rules/checks.mjs | 36 ++++++++++++++ 39 files changed, 1222 insertions(+) diff --git a/.agents/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.agents/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.agents/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.agents/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.agents/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.agents/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.agents/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.agents/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.agents/skills/impeccable/scripts/detector/rules/checks.mjs b/.agents/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.agents/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.agents/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.claude/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.claude/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.claude/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.claude/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.claude/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.claude/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.claude/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.claude/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.claude/skills/impeccable/scripts/detector/rules/checks.mjs b/.claude/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.claude/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.claude/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.cursor/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.cursor/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.cursor/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.cursor/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.cursor/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.cursor/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.cursor/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.cursor/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.cursor/skills/impeccable/scripts/detector/rules/checks.mjs b/.cursor/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.cursor/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.cursor/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.gemini/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.gemini/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.gemini/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.gemini/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.gemini/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.gemini/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.gemini/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.gemini/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.gemini/skills/impeccable/scripts/detector/rules/checks.mjs b/.gemini/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.gemini/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.gemini/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.github/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.github/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.github/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.github/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.github/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.github/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.github/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.github/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.github/skills/impeccable/scripts/detector/rules/checks.mjs b/.github/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.github/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.github/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.kiro/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.kiro/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.kiro/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.kiro/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.kiro/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.kiro/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.kiro/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.kiro/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.kiro/skills/impeccable/scripts/detector/rules/checks.mjs b/.kiro/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.kiro/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.kiro/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.opencode/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.opencode/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.opencode/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.opencode/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.opencode/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.opencode/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.opencode/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.opencode/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.opencode/skills/impeccable/scripts/detector/rules/checks.mjs b/.opencode/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.opencode/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.opencode/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.pi/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.pi/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.pi/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.pi/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.pi/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.pi/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.pi/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.pi/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.pi/skills/impeccable/scripts/detector/rules/checks.mjs b/.pi/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.pi/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.pi/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.qoder/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.qoder/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.qoder/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.qoder/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.qoder/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.qoder/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.qoder/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.qoder/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.qoder/skills/impeccable/scripts/detector/rules/checks.mjs b/.qoder/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.qoder/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.qoder/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.rovodev/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.rovodev/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.rovodev/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.rovodev/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.rovodev/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.rovodev/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.rovodev/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.rovodev/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.rovodev/skills/impeccable/scripts/detector/rules/checks.mjs b/.rovodev/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.rovodev/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.rovodev/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.trae-cn/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.trae-cn/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.trae-cn/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.trae-cn/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.trae-cn/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.trae-cn/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.trae-cn/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.trae-cn/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.trae-cn/skills/impeccable/scripts/detector/rules/checks.mjs b/.trae-cn/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.trae-cn/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.trae-cn/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.trae/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/.trae/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/.trae/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/.trae/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/.trae/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/.trae/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/.trae/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/.trae/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/.trae/skills/impeccable/scripts/detector/rules/checks.mjs b/.trae/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/.trae/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/.trae/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/plugin/skills/impeccable/scripts/detector/detect-antipatterns-browser.js b/plugin/skills/impeccable/scripts/detector/detect-antipatterns-browser.js index b2091c609..3bfc2de47 100644 --- a/plugin/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +++ b/plugin/skills/impeccable/scripts/detector/detect-antipatterns-browser.js @@ -478,6 +478,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', @@ -1172,6 +1183,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path. diff --git a/plugin/skills/impeccable/scripts/detector/registry/antipatterns.mjs b/plugin/skills/impeccable/scripts/detector/registry/antipatterns.mjs index 99eb2da04..ec1045022 100644 --- a/plugin/skills/impeccable/scripts/detector/registry/antipatterns.mjs +++ b/plugin/skills/impeccable/scripts/detector/registry/antipatterns.mjs @@ -376,6 +376,17 @@ const ANTIPATTERNS = [ skillSection: 'Visual Details', skillGuideline: 'repeating-gradient decorative stripes', }, + { + id: 'codex-grid-background', + category: 'slop', + severity: 'advisory', + gated: 'gpt', + name: 'Decorative grid-line background', + description: + 'A two-axis grid drawn with hairline linear-gradient layers ("1px, transparent 1px" on both axes) 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.', + skillSection: 'Visual Details', + skillGuideline: 'two-axis grid-line gradient background', + }, { id: 'theater-slop-phrase', category: 'slop', diff --git a/plugin/skills/impeccable/scripts/detector/rules/checks.mjs b/plugin/skills/impeccable/scripts/detector/rules/checks.mjs index 747d9a10f..13bcdc224 100644 --- a/plugin/skills/impeccable/scripts/detector/rules/checks.mjs +++ b/plugin/skills/impeccable/scripts/detector/rules/checks.mjs @@ -573,6 +573,42 @@ function checkHtmlPatterns(html) { findings.push({ id: 'repeating-stripes-gradient', snippet: 'repeating-gradient decorative stripes' }); } + // --- Provider tells (gated): two-axis grid-line background (Codex/GPT) --- + // The Codex grid tell is two hairline `linear-gradient(... 1px, + // transparent 1px)` layers (one per axis) tiled by a repeating + // `background-size` cell. Both signals must co-occur in the SAME style block + // (a CSS rule body or one inline `style="..."`): two hairline stops WITHOUT a + // tiling background-size is a fixed crosshair, not a grid, and a single + // hairline is a legitimate ruled line. Scoping to one block also stops + // unrelated single-axis rules on separate elements from adding up across the + // page. Count hairlines only inside `background`/`background-image` values so + // a hairline in an unrelated property (mask-image, border-image) can't stand + // in for the second axis. Colors like `oklch(96% 0.012 82 / 0.055)` carry + // nested parens, so match the hairline stop directly rather than parsing + // whole gradient layers. + { + const hairlineRe = /\b\d{1,3}px\s*,\s*transparent\s+\d{1,3}px/gi; + const gridSizeRe = /background-size\s*:[^;{}"']*\b\d{1,3}px\b/i; + const bgDeclRe = /\bbackground(?:-image)?\s*:\s*([^;{}"']*)/gi; + const blockRe = /\{([^{}]*)\}|style\s*=\s*"([^"]*)"|style\s*=\s*'([^']*)'/gi; + let blk; + while ((blk = blockRe.exec(html)) !== null) { + const block = blk[1] || blk[2] || blk[3] || ''; + if (!gridSizeRe.test(block)) continue; + let hairlineCount = 0; + let bm; + bgDeclRe.lastIndex = 0; + while ((bm = bgDeclRe.exec(block)) !== null) { + const stops = bm[1].match(hairlineRe); + if (stops) hairlineCount += stops.length; + } + if (hairlineCount >= 2) { + findings.push({ id: 'codex-grid-background', snippet: 'two-axis grid-line gradient background' }); + break; + } + } + } + // --- Provider tells (gated): "X theater" framing copy (GPT) --- // Lives here (regex-on-HTML) rather than in the text-content analyzers so it // runs in the bundled browser path too, not just the CLI/static path.