agentsclimarketplace

Repaint

Skill LucasSantana-Dev/repaint

repaint — a self-contained npx-skills / Claude Code skill for frontend UI that doesn't look AI-made: research, tokens, a reference library, and a live browser slop-audit loop.

Install
npx -y skills add LucasSantana-Dev/repaint

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Build production-grade frontend UI that doesn't read as "AI-made" — and behaves like an elite product, not just looks like one. A self-contained pipeline — research real references, lock a register + anchor, commit OKLCH tokens + distinctive type, design the interaction (feedback, forgiving input, keyboard, recovery), make it accessible and SEO-ready (semantic HTML, landmarks, alt, metadata), build, then iterate against slop + experience + a11y/SEO audits and a live browser-screenshot loop. Grounded in the industry-standard design systems (Material 3, Apple HIG, Carbon, Polaris, Fluent, Ant, shadcn) and the psychology of interface design (Gestalt, Hick, Fitts, peak-end), with manipulative dark patterns banned. Use for any page, component, dashboard, landing page, settings, data table, onboarding, or app surface — especially when output looks generic, templated, or "AI-made", feels hollow, or is inaccessible/invisible to search; aim at Linear/Vercel/Stripe/Notion quality. Ships a reference library + 23 evals.

The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

31.5 KB, as published. Nobody here has run it

repaint

A self-contained pipeline for frontend UI that looks designed, not generated — and behaves like it, too. It depends on no other skills and no agents — everything it needs ships in this folder. It stands on six pillars:

  1. Scraping — research real, current references for the brief (your web search), not vibes.
  2. Tokens — commit a concrete token system (OKLCH color + distinctive type) before any markup.
  3. References — a curated library (references/context-anchors.md) of named anchors per context, art-direction directions, 2026 token defaults, a slop catalog, type-by-role, experience patterns, microcopy, and an accessibility & SEO checklist.
  4. Experience — the interaction is designed, not just the pixels: honest feedback and perceived performance, forgiving input, recoverable actions, and a real keyboard path. Looks pass the eye; experience passes the hand. Gate 4, Gate 5, and the experience audit enforce it.
  5. Reach — the work is accessible to every user (assistive tech) and findable by search. One semantic-HTML foundation — landmark regions, one H1 + a logical heading order, real labels, meaningful alt — serves screen readers and crawlers. Gate 6 and the accessibility & SEO audit enforce it (SEO is register-gated to public surfaces).
  6. Real iteration feedback — build → render → screenshot → slop-audit + experience-audit + a11y/SEO audit → iterate, against live browser output, not a one-shot guess. The 23 evals are the regression harness.

Where this skill earns its keep

A capable model already produces competent generic structure on a well-specified brief (a pricing page gets a comparison table and a "Most Popular" badge unaided). Don't spend effort re-adding structure the model nails alone. The real leverage — eval-verified — is in six places the model gets wrong without help:

  1. Killing cliché on open/creative briefs. Left alone, "make it bold/memorable" collapses to the same neon-gradient-on-dark or purple-gradient tells. The register lock + slop audit prevent that. This is the single biggest win.
  2. Register-appropriate restraint. A product-app settings panel should be calmer than a saas-landing hero. The model over-decorates by default; the register playbook pulls it back.
  3. Distinctive typography. The model defaults to Inter/system fonts; Gate 3 forces a committed type choice.
  4. Compile-clean, durable output. Generated copy and tokens must actually build and be written down (Phase 3 string rule + DESIGN.md persistence).
  5. Wired, honest interaction. Generated UI looks fine but the interaction is hollow — handlers that do nothing, states styled but never reached, silent submits with no loading feedback, <div onClick> with no keyboard path, generic "Something went wrong" copy. This is the experiential "AI made that". Gate 4 + Gate 5 + the experience audit force real, reachable, honest interaction.
  6. Accessible & findable. Generated markup is inaccessible-by-default (<div> soup, no landmarks, unlabeled inputs, missing/empty alt, no <h1>/heading order) and SEO-blind (no <title>/meta/structured data; content trapped behind client-only JS). Gate 6 + the a11y/SEO audit enforce the one semantic foundation that serves screen readers and crawlers alike.

Mode detection (before any phase)

Art-direction mode when the brief contains: bold, editorial, experimental, scroll-driven, unforgettable, striking, art-directed, motion-heavy, avant-garde, or when the visual concept itself is the primary challenge.

Production mode (default) for everything else: dashboards, landing pages, app surfaces, settings, onboarding, data tables, command palettes, marketing sites, and any surface where credibility with a tech-savvy audience matters.


Phase 0 — Research references (the "scraping" pillar; skip if direction is locked)

When the design direction is open, gather real, current references before committing — do not invent a vibe:

  • Use your web search for <product type> <industry> <style> 2026 and for the named anchor's own site (e.g. "Linear pricing", "Stripe docs", "Warby Parker product page"). Pull: dominant palette, the actual typefaces, the layout pattern, and the spacing rhythm.
  • Open references/context-anchors.md §A for the named anchor + concrete tokens that fit this context (retail, fintech, healthcare, editorial, mobile, b2b dashboards, auth) — it is the curated, offline version of the same research.

Extract: recommended palette, typography pairing, layout pattern, and the anti-patterns to avoid.

Skip when: the user gave a reference brand, an existing DESIGN.md is found, art-direction mode is detected, or the user gave explicit visual direction.


Phase 1 — Quality gates (production) / Design thinking (art-direction)

Production mode: run all 7 gates in order

Gate 0.5 — Register lock. Classify the brief into exactly one of:

  • personal-portfolio — identity-first, single person
  • saas-landing — product marketing, convert visitors
  • product-app — post-login app surface
  • marketing — blog, launch page, campaign (narrative/editorial — never a feature-card grid)
  • docs — API reference, developer docs, KB

If the brief matches 2+ registers, ask one disambiguation question first. Default-DENY: SaaS-landing patterns (bento grid, dual-CTA hero, feature-row rhythm) must NOT apply to other registers without affirmative intent. In particular marketing ≠ saas-landing: a launch/announcement page gets a narrative/editorial layout + an editorial anchor (Stripe-marketing, Medium, The Verge, Linear changelog), never a feature-card grid (and NOT a .map() loop over identical feature cards: fold highlights into the narrative prose, or give each a distinct, varied treatment — alternating sides, different sizes) or product-UX anchor.

Gate 2 — Reference anchor. Pick ≥1 named industry pattern; the anchor is a contract — use actual tokens, not vibes. State it in one sentence: "Sidebar anchored to Linear; cards anchored to Stripe Dashboard." Don't reflex to Linear/Vercel — those are dev-tooling anchors, the wrong bar for an e-commerce page, a patient portal, an editorial feature, or a banking app. For ANY non-dev-tool brief, open references/context-anchors.md §A and use the named anchor for that context. Beyond a named product, anchor to the industry design system that fits the register — Carbon/Fluent/Ant for enterprise data, Polaris for commerce admin, Material 3/Apple HIG for native-feel, Primer for dev-tools (§I maps systems to contexts + the cross-cutting patterns they define). When the direction is open, name 2–3 candidate anchors as variant directions (e.g. Linear-calm · Stripe-editorial · Monzo-warm), each with a one-line trade-off, then commit to one — design-then-code: present the variants for selection before writing component code. In an autonomous or eval context — no human to pick, including when dispatched to the builder agent — default to the strongest of the 2–3, state that choice in one line, and build it in the same pass; never stop after only presenting the options. (This applies to aesthetic / anchor choice only — it does not override Gate 0.5's register disambiguation: when the brief genuinely matches 2+ registers, still surface that and ask one focused question before building.)

Gate 3 — Token spec. Lock concrete tokens before writing markup:

CategoryMust specify
ColorOKLCH triplets for bg, fg, muted, border, one accent — tinted toward the accent hue. Never #000/#fff.
TypeDisplay family + weight, body family + weight, mono. Weight contrast ≥400 between display and body. Name the actual faces — never Inter/Roboto/Arial as the default body, not even in the fallback stack, and not a bare font-serif/font-sans generic (that resolves to Georgia/system — the "no-personality" tell). Pick a real face from context-anchors.md §E.
SpacingBase unit (4pt or 8pt). Max 6 steps. State where each applies.
Radius≤3 values, assigned per component.
MotionDuration tokens (120/200/320ms). Ease curve. No bounce.
AccessibilityWCAG 2.2: 4.5:1 (normal text), 3:1 (large/UI), focus ring ≥2px at ≥3:1, touch targets ≥44px.

When the project has no tokens, use the 2026 token defaults in context-anchors.md §C (warm earthy neutrals + one restrained accent, 8/4px grid, semantic radius, two-part-shadow elevation).

Gate 4 — Component anatomy + interaction affordances. Every interactive component designs all 8 states: default, hover, focus, active, loading, empty, error, disabled (loading/empty/error are the most-skipped). Each state must carry three things, not just a look:

  • Visual feedback — the state is perceivable (a real spinner/skeleton on load, a pressed look on active), never a silent change.
  • Keyboard access — a :focus-visible ring per Gate 3 (≥2px at ≥3:1); semantic <button>/<a>/<input> not <div onClick>. For a custom control, document its interaction model (focus order, keys, state changes) in DESIGN.md.
  • Outcome clarity — the result is announced ("Copied", Saving…Saved, an inline error), not left for the user to guess.

Gate 5 — Experience contract. The cross-cutting interaction guarantees, beyond any single component (cross-references Gate 3 for the a11y numbers and §A for per-context density — does not restate them; §J is the psychology under these — Gestalt, Hick, Fitts, peak-end, Zeigarnik — and the dark-pattern bans):

  • Honest feedback + perceived performance. Optimistic UI or a skeleton for content; a spinner only for brief actions; never a silent wait >1s. <100ms feels instant; show progress by ~800ms; explicit progress + cancel beyond ~1s. (See §F.)
  • Forgiving input. Smart defaults; validate on blur or submit, not on every keystroke; specific, inline, non-blaming errors; autosave/draft for anything long. (Microcopy patterns in §G.)
  • Recoverable actions. A destructive action (delete, charge, publish) needs confirm or undo — a clear confirmation (safe option focused, the verb named: "Delete invoice") or a live undo affordance. Never a bare immediate delete.
  • Keyboard path to the primary task. The main action is reachable and operable by keyboard end-to-end; modals trap focus intentionally and Esc closes, returning focus to the trigger.
  • Motion safety. Honor prefers-reduced-motion; no parallax/auto-play that can't be stopped.

Gate 6 — Accessibility & SEO. One semantic-HTML foundation serves both assistive tech and search crawlers — what a screen reader reads is what a crawler reads. Build on it (detail + checkable criteria in §H).

Accessibility (every register — this is the structural layer beyond Gate 3's contrast/focus/touch and Gate 4/5's keyboard):

  • Semantic structure — landmark regions (<header>/<nav>/<main>/<footer>), real elements over <div> soup; native HTML before ARIA (ARIA only to fill a gap native HTML can't).
  • Exactly one <h1> stating the page's purpose, then a logical heading order (no level skips).
  • Labels & alt — every input has a real, associated <label> (never placeholder-as-label); content images carry descriptive alt, decorative images alt="".
  • Name/role/value for any custom widget (role + aria-* state); accessible errors (aria-invalid + aria-describedby).
  • Live regions — any form submit / status / async result announces via aria-live="polite" (or role="status"; alert only for time-critical), present at load with content swapped inside; never a silent handler or a bare alert().
  • lang on <html> (BCP-47, e.g. lang="en"); a skip-to-main link as the first focusable element on any page with <nav>/<header>.

SEO (public registers only — saas-landing, marketing, docs, e-commerce, editorial; N/A for product-app / personal-portfolio):

  • A unique, descriptive <title> (~50–60 chars) + a unique meta description (~120–160) + a self-referential canonical; the <h1> + heading hierarchy above is shared with a11y.
  • Open Graph + Twitter card (absolute og:image URL, summary_large_image) for shareable pages; JSON-LD for the context (Product/Offer, Article, FAQPage, BreadcrumbList, Organization).
  • Crawlable content — title/H1/body present in the server-rendered HTML (SSR/SSG), not client-JS-only; descriptive link text (never "click here"); <meta viewport> set.
  • Core Web Vitals targets: LCP ≤2.0s · INP ≤200ms · CLS <0.1 (a ranking factor — but don't turn this into a perf budget). Never ship a <meta keywords> tag or keyword-stuffed copy.

Gate 7 — Compile-clean contract. The output must run on the first try, not just look right (the discipline behind Claude Artifacts + v0's autofixer). Lock what is importable now so the build can't fail on a phantom dependency: in a self-contained artifact, only the sandbox-preloaded allowlist is importable; in a project-scaffold, only packages already in package.json. No import of an undeclared package, no named import the package doesn't actually export (the icon/symbol-mismatch class — the thing v0's autofixer exists to catch), no emoji-as-icon. Enforced by the pre-verify lint at the top of Phase 4. Full allowlist + forbidden-pattern list + lint checklist in §K.

Art-direction mode: design thinking instead

Commit to ONE bold named direction from context-anchors.md §B — warm-editorial-serif, Swiss/neo-grotesque, soft-organic/biophilic, brutalist, typographic-maximalism, retro-futurist-3D, imperfect-by-design, deconstructed/specimen, cyber/technical, or cinematic-pacing. Each ships execution specs — exact type scale, tracking, leading, a color triplet, and a signature move — so don't stop at the name; lock its specifics. For motion-heavy directions, layer §L motion craft. Choose an extreme and execute with precision. What makes it unforgettable? One distinctive thing the user will remember.

Persist the decisions to DESIGN.md (both modes)

Before writing component code, write the locked register, anchor(s), token table, chosen variant, and direction to a DESIGN.md at the project root (or update it if present). A rationale that lives only in chat is lost when the session ends, and the surface drifts. This DESIGN.md is the approval checkpoint and the cross-surface token-lock: it is the design-then-code handoff (present the locked spec before building), and every later surface in the same project reads and reuses it — never re-derive tokens per surface, or sibling screens drift apart. If a DESIGN.md already exists, its tokens are non-negotiable — adopt them; do not invent a competing palette.


Phase 2 — Scaffold

Route by project setup, and defer to any established design system — it overrides Gate 3. This is the most common way a UI pipeline regresses below a no-skill baseline: a custom OKLCH spec conflicts with a system that already owns tokens, and you get the worst of both (raw bg-red-50 colors instead of either system).

  • shadcn components.json present → use its semantic tokens (bg-primary, text-muted-foreground, bg-destructive, border-input) — never raw color classes, never a parallel OKLCH palette — and its primitives (Field/Label, Button variants, cn()), and its iconLibrary.
  • An established design-system library in package.json (@mui/material, antd, @shopify/polaris, @mantine/core, @carbon/react, @fluentui/react-components, @primer/react, baseui) → defer to it: its tokens/theme, components, and icon set — never a parallel OKLCH palette. §I maps each system to its context.
  • Tailwind config present → adopt its token structure and primitives.
  • An existing DESIGN.md → adopt its tokens verbatim.
  • Neither → scaffold from the project's conventions; Gate 3 supplies the tokens — structure them primitive → semantic → component (W3C DTCG naming, §I) so dark mode and theming stay clean, not a flat list of hex values.

Phase 3 — Build

Implement in the project's framework + file conventions; the code should look like the team wrote it.

  • Write realistic content (not "Lorem ipsum" or "Item 1").
  • One H1 per page; no restated headings; no em dashes in UI copy.
  • Copy must compile — but never corrupt the apostrophe. Contractions ("you're", "we'll", "don't") break a single-quoted JS/TS string. The fix is about the string's outer quotes, never the apostrophe:
    • In JSX text nodes, leave it exactly as written — <span>Don't have an account?</span> is already valid.
    • In string literals (props, data arrays, aria-label), wrap the whole value in double quotes ("you're") or a template literal.
    • NEVER replace the apostrophe with a double-quote or backtick — Don"t is a visible typo, not a fix.
  • Microcopy carries the experience. High-stakes text is specific and human, never generic placeholder: errors name the specific failure and the next step ("Card declined — try another card or contact your bank"; "Incorrect email or password"; "Email already in use — try another or reset your password"), never "Payment failed" / "Something went wrong" / "Invalid input"; CTAs are verb-forward ("Create workspace", not "Submit"/"OK"); empty states reassure and point somewhere ("You're all caught up — we'll let you know"); confirmations name the action ("Delete this conversation?", not "Are you sure?"). Test each: does it tell the user what happened and what to do without reading the surrounding prose? Full patterns in §G.

Phase 4 — Audit + verify (the "real iteration feedback" pillar)

This is a loop, not a one-shot check: build → render → screenshot → audit → iterate until it passes.

Slop audit (mandatory)

Run these on the output. Any critical finding = fix before done.

PatternSeveritySignal
Distributional convergencecriticalAll of: Inter + purple gradient + rounded cards + 3-icon row
Sophisticated-dark mismatchcriticalDark + cyan palette on a non-SaaS register
Clarity / identity failcritical3-second scan fails OR a portfolio passes the name-swap test
Purple gradientmajorviolet→pink/blue gradient in the hero
Bento trifectamajorbento + dark + repeated feature blocks
Split-personality surfacecriticaltwo design systems on one page — a compact/utility section beside big editorial-hero sections that don't share type/color/framing; content behind a "more details" toggle styled unlike the main page; the same data rendered twice in two styles

Hard bans (instant rewrite): purple/blue gradient on white · generic bento hero (3×2 colored tiles) · identical card grid (icon + heading + 2 lines × N) · glassmorphism by default · box-shadow: 0 4px 6px rgba(0,0,0,0.1) as elevation · em dashes in UI copy · emoji as UI icons (📊 🔧 in cards/nav/buttons — one of the loudest "AI made that" tells; use the project's icon set or inline SVG). The extended 2026 catalog is in context-anchors.md §D.

Cohesion / type / asset bans (instant rewrite): two design systems on one surface — pick one language and apply it to every section, including headers and the densest content · a mono-only stack carrying the whole hierarchy (monospace flattens 400↔700 contrast — pair a display face for headings, and load each face at the weights you actually use; a face loaded only at 500 has no real bold) · a dark-on-transparent logo on a dark chip (it vanishes — give it a light chip; normalize mixed-ratio wordmarks to a consistent size, and don't force a 6:1 wordmark into a 1:1 square) · card framing (border/shadow) leaking onto table rows · a polished SPA linking out to plain, off-brand static pages.

Five-second test: would an engineer at Linear/Vercel/Stripe say "AI made that" within 5 seconds? If yes, return to Gate 2 and pick a stronger anchor.

Subtraction test (the Chanel principle): before declaring done, name one decorative element you could remove without losing intent — and remove it. If three things can go, it was overdecorated; if nothing can, it may already be too sparse.

Experience audit (mandatory)

The slop audit catches the looks; this catches the behaviour — the experiential "AI made that". Run it on the output. Any critical finding = fix before done.

PatternSeveritySignal
Hollow interactioncriticalonClick that does nothing · states styled in CSS but no code path reaches them · <div onClick> with no key handler/role
Destructive w/o recoverycriticaldelete/charge/publish fires immediately — no confirm, no undo
Silent actioncriticalsubmit/load with no spinner/skeleton/optimistic feedback; the user can't tell it worked (and double-submits)
No keyboard path / invisible focusmajorthe primary action is unreachable by Tab, or outline:none with no replacement
Validation on every keystrokemajora red error on the first character, before the user has finished typing
Dead-end empty/error statemajor"No data" / "An error occurred" with no cause and no next step
Generic microcopymajor"Something went wrong" / "Payment failed" / "Submit" / "No items" instead of copy that names the failure + next step ("Card declined — try another card or contact your bank")
Vague social proofminor"loved by millions" / "industry-leading" instead of named, specific proof ("Trusted by 2,000+ teams"; real logos/metrics)
Motion ignores reduced-motionmajoranimation/parallax with no prefers-reduced-motion guard
Dark patterncriticalconfirmshaming · a fake-urgency countdown · preselected paid add-ons · roach-motel cancel · hidden costs · disguised ads — psychology used against the user

Experience hard bans (instant rewrite): <div onClick> for an action (use <button>) · placeholder-as-label · outline: none with no focus replacement · a destructive action with neither confirm nor undo · a blocking full-page spinner as the default loading state · toast-only reporting of a critical error that auto-dismisses before the user can act · any dark pattern (confirmshaming · fake urgency · preselected opt-ins · roach-motel cancel · hidden costs). Extended catalog + the elite alternative for each: context-anchors.md §F (interaction) and §J (psychology / dark patterns).

Experience test: could you complete the primary task keyboard-only, see honest feedback at every step, recover from a mistake, and never hit a dead end? If no, return to Gate 4 / Gate 5.

Accessibility & SEO audit (mandatory)

The structural-semantic layer — what assistive tech and crawlers read. (SEO rows apply to public registers only; full criteria in context-anchors.md §H.)

PatternSeveritySignal
No <main> / <div> soupcriticalno landmark regions — crawlers can't find the unique content; SR users can't skip the chrome
Wrong <h1> / heading ordercriticalzero or multiple <h1>, or heading levels skip (<h1><h3>)
Unlabeled inputcriticalan <input>/<select>/<textarea> with no programmatically associated <label>
Missing / wrong altmajora content <img> with no alt, or a decorative image with verbose alt
Custom widget no semanticsmajorrole / aria-* state missing on a non-native control; an async update with no aria-live
Missing lang / skip-linkminor<html> without lang; a nav-heavy page with no skip-to-main link
(public) SEO head missingcriticalno <title> / meta description / canonical — or title/H1/body that only render after client JS
(public) No structured data / bad metamajorno Open Graph / JSON-LD on a shareable page; a <meta keywords> tag; keyword-stuffed copy

A11y/SEO hard bans (instant fix): a content <img> with no alt · more than one (or zero) <h1> · <meta name="keywords"> · primary content that only renders after client-side JS on a public page · a public page with no <title>/meta-description/canonical.

Browser verification (the real feedback)

Render it for real and look — don't trust the code alone:

  • Compile-clean lint first (Gate 7), before spending a render: every import is allowlisted / in package.json and every named symbol the package actually exports; no forbidden pattern from §K in the diff; the entry component default-exports and renders with zero props (self-contained). Fix violations then render — the lint catches the import/compile class cheaply; the browser is for runtime + visual.
  • Run the project's dev server, navigate with Playwright (or your browser tooling), and save desktop + mobile screenshots.
  • Capture console errors and check responsive breakpoints + a11y (axe-core).
  • Interaction: Tab through the page — every interactive element shows a visible focus ring, in a logical order; the primary action is reachable and fires on Enter/Space. Trigger one error state (is the copy specific?) and one loading state (does feedback appear before it resolves?). Screenshot a loading and an error state — not just the happy path.
  • Accessibility & SEO: run axe-core (0 critical violations) and confirm the heading outline (one <h1>, no skips), landmark regions, and image alt. For a public page, run Lighthouse SEO and confirm <title>, meta description, canonical, Open Graph, and JSON-LD are present in the server-rendered HTML (View Source, not DevTools).
  • If the screenshot fails the slop audit, the experience audit, or the a11y/SEO audit, a console error or axe critical appears, focus is invisible/trapped, or a breakpoint breaks → return to the relevant phase, fix, and re-screenshot. Repeat. Do not declare done on a one-shot render.

Reconcile your report against the diff (anti-overclaim). Before declaring done, run git diff --stat — every change you describe must appear in it. If you only wrote a DESIGN.md/spec with no component/CSS edit, say "spec only — not implemented", never "redesigned". Verify each "removed X" claim by grepping the source, not from memory (you cannot claim "0 purple" while the color still matches). A report the diff contradicts is a regression.

Fallback: if no browser is available, mark verify as PARTIAL and recommend a manual smoke test.


Reconciliation output (signal-first)

FRONTEND — <surface name>
Mode:      <production|art-direction>
Register:  <register> — <DONE|SKIPPED>
Anchor:    <named references> — <DONE|SKIPPED>
Tokens:    <locked table or "from DESIGN.md"> — <DONE|SKIPPED>
DESIGN.md: <path written, or "inline — no repo"> — <DONE|SKIPPED>
Built:     <files created/modified> — <DONE|BLOCKED>
Audit:     <slop pass|N rewrites; copy compiles> — <DONE|BLOCKED>
Experience: <feedback on load/error states Y/N; keyboard path + visible focus Y/N; destructive action recoverable Y/N; microcopy specific Y/N> — <DONE|BLOCKED>
Reach:     <a11y: landmarks + one H1 + labels + alt Y/N; SEO (public): title+meta+canonical+OG+JSON-LD Y/N, or N/A for product-app> — <DONE|BLOCKED>
Verified:  <axe critical=0, console clean Y/N, breakpoints, Lighthouse SEO (public), loading+error screenshots> — <DONE|PARTIAL|BLOCKED>

If any phase is BLOCKED: state the blocker + next action. If all DONE: link the screenshot.


Reference library

Everything heavy ships in this folder — no external skills required:

  • references/context-anchors.md — §A named anchors + tokens + per-context slop tells (e-commerce, fintech, healthcare, editorial, mobile, b2b dashboards, auth, AI-chat, command palette) · §B 8 art-direction directions · §C 2026 token defaults · §D extended slop catalog · §E type-by-role · §F interaction & experience patterns (+ the experience anti-pattern catalog and latency thresholds) · §G microcopy by interaction type · §H accessibility & SEO (the shared semantic foundation, a11y checklist, register-gated SEO checklist, JSON-LD by context, verify tooling) · §I design systems & the cross-cutting patterns big companies define (Material 3, Apple HIG, Carbon, Polaris, Fluent, Ant, Lightning, Spectrum, Primer, Atlassian, Base Web, Radix, shadcn, Mantine; multi-tier tokens, DTCG, density, dark-first, motion tokens, two-part elevation, container queries) · §J psychology of interface design (Gestalt, Hick, Fitts, Miller, Jakob, Tesler, peak-end, Zeigarnik, goal-gradient, ethical persuasion) + dark-pattern bans · §K compile-clean contract (import allowlist by mode + forbidden patterns + the pre-verify lint) · §L motion craft (scroll choreography, timeline orchestration, stagger recipes, performance guardrails + motion-slop tells). Open §A first for any non-dev-tool brief; §B ships per-direction execution specs for art-direction; §I backs Gate 2/Phase 2; §F/§G/§J back Gate 5 and the experience audit; §H backs Gate 6 and the a11y/SEO audit; §K backs Gate 7 and the Phase-4 lint; §L backs motion-heavy briefs.
  • evals/evals.json — 23 evals across all 5 registers + the regression guards (design-system-present, DESIGN.md-exists, non-dev-tool anchor per context, accessibility, mobile thumb-zone, data-viz restraint, register disambiguation, copy-compiles), the experience guards (feedback/loading honesty, specific microcopy, keyboard + visible focus, recoverable destructive actions), the reach guards (semantic a11y structure, SEO head + structured data), and the foundations guards (defer to an established design-system library, ethical persuasion / no dark patterns), in the canonical assertions-as-strings eval format (evals/files/ holds the fixtures). Use them to verify changes to this skill don't regress.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.