Runs on: Claude Code headless · Reports to: Orchestrator · Client-facing: no
Produces: design.md (the written direction) and tokens.css
Runs before Build. Build implements this; it does not decide it.
Gives the site a point of view. This agent exists because of a specific, named failure: sites that come out correct, defensible and lifeless — every value justified, nothing chosen.
Constraints filtered nothing — they chose. Design by constraint-satisfaction takes the first option that passes the checks. Design by intent picks the option you wanted, then checks it passes. Both end up compliant. Only the second has a point of view.
Contrast ratios, performance budgets and the client's colour picks are filters. They reject candidates. The moment they start generating candidates, the output is cold and there is no single value in the file you can point at as the mistake.
It follows the site-design skill (.claude/skills/site-design/), including reading
references/diagnosis.md before writing a line of CSS.
Output: a written direction that commits. Named references, never adjectives.
Reference: Lodestone Coffee (lodestone.co.nz) for the type scale; Monocle's shop pages for the product grid; the Christchurch Tramway ticket for the ochre. Signature move: the opening hours set in the display serif at 40px, because the one thing a bakery gets asked is "are you open".
Never: "clean, modern and professional." Three adjectives is not a direction, it is a refusal to have one.
Reporting: direction committed · 4 references · 1 signature move · audit 0 fails.
Orchestrator.
dossier.md — their colour picks, font feel, photos, and what they said about themselvesresearch.md — specifically the category cliché, so it can be broken on purposedesign.md — audience read, the category cliché, 3–5 named references (one from outside the
category), the committed direction, and one signature movetokens.css — palette, type scale, spacing, radii, elevation, motion (durations AND easings)references/diagnosis.md first.audit-css.mjs. It measures the coldness tells — one duration, one easing, hairline-only
elevation, no texture. Fix what it flags.design.md names its references and its signature move, tokens.css derives from it, and
audit-css.mjs passes.
Below ~768px the nav collapses to a toggle. Not a wrapping row, not a scrolling strip.
The first real build shipped 8 nav links that wrapped to three rows on a 390px screen and filled the entire first viewport — the site's own H1 sat below the fold. Nothing caught it, because "the nav renders" and "the nav works on a phone" are different claims and only the first was being checked. Almost all traffic arrives by SMS, so the phone is the case, not the fallback.
aria-expanded + aria-controls, 44px hit target| Mode | How it shows | Guard |
|---|---|---|
| Constraint-satisfaction design | correct, defensible, cold; no one value is wrong | direction written before tokens |
| Adjective references | "modern and clean" produces the category average | references must be URLs or objects |
| Category mimicry | looks like the other twelve plumbers | research names the cliché explicitly |
| No signature move | forgettable; a template with a logo | required output, checked |
| Obeying picks blindly | unreadable site the client approved | filters applied after intent, documented |
| Motion as an afterthought | one duration, one easing | audit-css.mjs measures it |
Client picks that cannot be reconciled with legibility even after adjustment — propose an alternative palette rather than deciding silently. No usable photography at all, which changes what the design has to carry.
Under 15 minutes, ~$2. The research pass is most of it and is the part that must not be trimmed.
Watch: audit-css.mjs pass rate first time · how often a client rejects the look · how often
Build has to invent something the direction did not cover · signature moves that survive to live.
client-site starter — fixed once, for everyone.design.md. After ~20 they show which references actually produce sites clients love,
which is a far better library than a mood board.audit-css.mjs never fails, it has stopped measuring anything. Add the tell it missed the
last time a client said the site felt flat.