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.
npx -y skills add LucasSantana-Dev/repaintAssembled 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:
- Scraping — research real, current references for the brief (your web search), not vibes.
- Tokens — commit a concrete token system (OKLCH color + distinctive type) before any markup.
- 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.
- 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.
- 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).
- 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:
- 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.
- Register-appropriate restraint. A
product-appsettings panel should be calmer than asaas-landinghero. The model over-decorates by default; the register playbook pulls it back. - Distinctive typography. The model defaults to Inter/system fonts; Gate 3 forces a committed type choice.
- Compile-clean, durable output. Generated copy and tokens must actually build and be written down (Phase 3 string rule +
DESIGN.mdpersistence). - 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. - 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> 2026and 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 personsaas-landing— product marketing, convert visitorsproduct-app— post-login app surfacemarketing— 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:
| Category | Must specify |
|---|---|
| Color | OKLCH triplets for bg, fg, muted, border, one accent — tinted toward the accent hue. Never #000/#fff. |
| Type | Display 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. |
| Spacing | Base unit (4pt or 8pt). Max 6 steps. State where each applies. |
| Radius | ≤3 values, assigned per component. |
| Motion | Duration tokens (120/200/320ms). Ease curve. No bounce. |
| Accessibility | WCAG 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-visiblering 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) inDESIGN.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
Esccloses, 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 descriptivealt, decorative imagesalt="". - 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"(orrole="status";alertonly for time-critical), present at load with content swapped inside; never a silent handler or a barealert(). langon<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:imageURL,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.jsonpresent → 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,Buttonvariants,cn()), and itsiconLibrary. - 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,
dataarrays,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"tis a visible typo, not a fix.
- In JSX text nodes, leave it exactly as written —
- 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.
| Pattern | Severity | Signal |
|---|---|---|
| Distributional convergence | critical | All of: Inter + purple gradient + rounded cards + 3-icon row |
| Sophisticated-dark mismatch | critical | Dark + cyan palette on a non-SaaS register |
| Clarity / identity fail | critical | 3-second scan fails OR a portfolio passes the name-swap test |
| Purple gradient | major | violet→pink/blue gradient in the hero |
| Bento trifecta | major | bento + dark + repeated feature blocks |
| Split-personality surface | critical | two 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.
| Pattern | Severity | Signal |
|---|---|---|
| Hollow interaction | critical | onClick that does nothing · states styled in CSS but no code path reaches them · <div onClick> with no key handler/role |
| Destructive w/o recovery | critical | delete/charge/publish fires immediately — no confirm, no undo |
| Silent action | critical | submit/load with no spinner/skeleton/optimistic feedback; the user can't tell it worked (and double-submits) |
| No keyboard path / invisible focus | major | the primary action is unreachable by Tab, or outline:none with no replacement |
| Validation on every keystroke | major | a red error on the first character, before the user has finished typing |
| Dead-end empty/error state | major | "No data" / "An error occurred" with no cause and no next step |
| Generic microcopy | major | "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 proof | minor | "loved by millions" / "industry-leading" instead of named, specific proof ("Trusted by 2,000+ teams"; real logos/metrics) |
| Motion ignores reduced-motion | major | animation/parallax with no prefers-reduced-motion guard |
| Dark pattern | critical | confirmshaming · 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.)
| Pattern | Severity | Signal |
|---|---|---|
No <main> / <div> soup | critical | no landmark regions — crawlers can't find the unique content; SR users can't skip the chrome |
Wrong <h1> / heading order | critical | zero or multiple <h1>, or heading levels skip (<h1> → <h3>) |
| Unlabeled input | critical | an <input>/<select>/<textarea> with no programmatically associated <label> |
| Missing / wrong alt | major | a content <img> with no alt, or a decorative image with verbose alt |
| Custom widget no semantics | major | role / aria-* state missing on a non-native control; an async update with no aria-live |
Missing lang / skip-link | minor | <html> without lang; a nav-heavy page with no skip-to-main link |
| (public) SEO head missing | critical | no <title> / meta description / canonical — or title/H1/body that only render after client JS |
| (public) No structured data / bad meta | major | no 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
importis allowlisted / inpackage.jsonand 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:
Tabthrough the page — every interactive element shows a visible focus ring, in a logical order; the primary action is reachable and fires onEnter/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 imagealt. 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.