Files
pbakaus_impeccable/README.npm.md
T
Paul BakausandClaude Fable 5 c98f5d42ed detector: script-error, content-hidden-at-rest, edge-flush-cards + chip contrast and inline-overflow widenings (53 -> 56)
Three new rules and three widenings, all from confirmed eval-corpus
escapes found by eye:

script-error (quality, error severity, URL engine): pageerror listener
attached before goto catches uncaught exceptions AND parse errors (a
syntax error fires during the initial parse, long before load). Deduped
by message, capped at 3. A JS typo was silently deleting whole pages.

content-hidden-at-rest (quality, error, URL engine): after the main
at-rest scan, an instant-scroll reveal sweep (bypasses scroll-behavior:
smooth, which silently defeated the first sweep design) gives every
IntersectionObserver reveal its chance to fire, returns to top, then
measures the share of text characters still at opacity 0 / visibility
hidden. display:none / [hidden] / aria-hidden subtrees stay out of the
denominator. Fires above 30% with a 200/150-char floor. Calibration on
30 corpus samples: broken repro holds 83% after the sweep, all clean
samples (including 0.75-0.93 at-rest reveal pages) drop to <= 7%.

edge-flush-cards (quality, warning, browser): cards with their own
opaque background or 2+ borders inside a horizontal scroller, flush
against one edge of the clip box at rest (< 8px, > -24px so deliberate
mid-card peeks stay exempt) while keeping a gutter on the other side.
Grouped per scroller. Repro: transit-mobile pager whose first snap
panel is 407px wide inside a 390px clip. New --viewport WxH CLI flag
makes mobile-width URL scans reachable (--viewport 390x844).

Chip/badge contrast widening: the SAFE_TAGS styled-button exception in
checkColors now covers any text-bearing element painting its own opaque
background at >= 9px font, not just a/button. The shipped miss: a span
SEV-2 chip whose white text lost a specificity fight and rendered
muted-on-red at 1.2:1. Static adapter also resolves var() own-bg via
the custom-property map so the gate engages on token backgrounds.

background:none cascade fix: the background shorthand now resets
background-color/-image when it names neither (and no var()). Exposed
by the chip widening: pre code { background: none } left an earlier
surface color standing and manufactured 1.1:1 phantom findings.

text-overflow inline-owner widening: inline elements have no client
geometry (clientWidth 0) so the scrollWidth path never saw them, and
their block parent owns no direct text. New branch measures the inline
rect against the nearest block container's padding box (16px floor,
transform-path exempt). Repro: nowrap span.v spilling 45px past its
grid cell.

The round-3 nav-CTA contrast escape (val-a22-opus obs 003 header CTA)
was verified already covered at HEAD by the earlier parseAnyColor
oklch fallback; both engines fire 3.6:1 on the repro, no change needed.

FP sweep across 36 val-a21/a22/a23 samples: new rules fire only on
their repros (script-error also catches a second genuinely broken
sample); static-engine delta is limited to the chip repro plus two
borderline-but-real chip findings on one sample.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 17:10:44 -07:00

2.7 KiB

Impeccable CLI

Detect UI anti-patterns and design quality issues from the command line. Scans HTML, CSS, JSX, TSX, Vue, and Svelte files for 56 deterministic rules, including AI-generated UI tells, accessibility violations, and general design quality problems.

Quick Start

# Install skills into your AI harness (Claude, Cursor, Gemini, etc.)
npx impeccable skills install

# Non-interactive install for a specific scope
npx impeccable skills install -y --providers=claude,codex --scope=project

# First command to run inside your AI harness
/impeccable init

# Update skills to the latest version
npx impeccable skills update

# Install or update skills without hook manifests
npx impeccable skills install --no-hooks

# Link skills from a Git submodule checkout
npx impeccable skills link --source=.impeccable --providers=claude,cursor

# List all available commands
npx impeccable skills help

# Scan files or directories for anti-patterns
npx impeccable detect src/

# Scan a live URL (requires Puppeteer)
npx impeccable detect https://example.com

# JSON output for CI/tooling
npx impeccable detect --json src/

# Deprecated compatibility flag; full scan still runs
npx impeccable detect --fast src/

What It Detects

AI Slop Tells: patterns that scream "AI generated this":

  • Side-tab accent borders, gradient text on headings
  • Purple/violet gradients and cyan-on-dark palettes
  • Dark mode with glowing accents, border + border-radius clashes

Typography Issues: overused fonts (Inter, Roboto), flat type hierarchy, single font families

Color & Contrast: WCAG AA violations, gray text on colored backgrounds, pure black/white

Layout & Composition: nested cards, monotonous spacing, everything-centered layouts

Motion: bounce/elastic easing, layout property transitions

Quality: tiny body text, cramped padding, long line lengths, small touch targets

56 deterministic detector rules in total. See the full catalog at impeccable.style/slop.

Exit Codes

  • 0: no issues found
  • 2: anti-patterns detected

Options

impeccable detect [options] [file-or-dir-or-url...]

  --fast    Regex-only mode (skip jsdom, faster but less accurate)
  --json    Output findings as JSON
  --help    Show help

Requirements

  • Node.js 22.12+
  • jsdom (included as dependency, used for HTML scanning)
  • puppeteer (optional, only needed for URL scanning)

Part of Impeccable

This CLI is part of Impeccable, a cross-provider design skill pack for AI-powered development tools. The full suite includes 23 commands for Claude, Cursor, GitHub Copilot, Gemini, Codex, and more.

License

Apache 2.0