/design-review
The polish gate. Drives /browse to capture the current state of a frontend change, then evaluates against six pillars: visual polish, accessibility, motion, copy, layout/density, brand consistency. Output is a scored finding list with file:line + screenshot anchors.
Distinct from /plan-design-review: that one reviews a design doc plan. This one reviews the built result.
Voice tier note: the critique itself is internal (builder-to-builder). When the copy pillar fires on a customer-facing surface, this skill references the active pack's voice corpus as the standard, but does NOT produce pack-voice copy. Use a pack-provided voice-rewrite skill for that.
When to use
- Frontend change is feature-complete; want a polish pass before the active pack's release gate
- A
/qa run is clean but the UI "feels off"
- Pre-launch on a customer-facing surface — design review is non-negotiable
- After a design-system migration — verify pages still hold together
When NOT to use
- Backend-only change, no UI touched — skip
- Pure copy change with no layout impact — use a pack-provided voice-rewrite skill directly
- Plan-stage review before any code is written — use
/plan-design-review
Inputs
- Required
--url <url> — running app URL OR local dev server (e.g. http://localhost:5173)
- Optional
--routes <file> — list of routes to review (default: just /)
- Optional
--viewport <list> — viewports to capture (default: 1440x900,375x812)
- Optional
--baseline <ref> — git ref to diff against for changed-files context
- Optional
--include-copy-pillar — explicit opt-in for copy critique (default: on for customer-facing routes per ~/.lintel/config.yaml)
Workflow
- Preflight. Verify URL is live (
curl -I). Verify managed Chromium installed.
- Capture phase. For each route × each viewport: invoke
/browse to load + screenshot + capture DOM + console log. Artifacts land in ~/.lintel/design-runs/<ts>/.
2b. Mechanical validator (ADR-0015). On captured DOM/HTML:
python3 "${LINTEL_SKILLS_DIR:-skills}/design-dna/scripts/validate_design.py" <captured.html> --profile <active-profile> —
exit 1 findings become automatic P1s (objective violations; no judgment needed).
- Six-pillar pass — for each captured route:
- Visual polish: alignment, spacing rhythm, hover/focus states present, no Lorem Ipsum, no broken images, no overflow.
- Accessibility: contrast ratio per WCAG AA, semantic HTML in DOM, focus order, alt text on images, ARIA labels where needed.
- Motion: if motion exists, does it respect
prefers-reduced-motion? Are transitions consistent in duration/easing?
- Copy: typos, voice/tone consistency, length appropriate to context. If customer-facing AND
--include-copy-pillar: cross-reference against the active pack's voice corpus (modes + ground rules, if the pack defines them).
- Layout/density: information density appropriate, viewport-responsive, no wasted whitespace at mobile, no cramped desktop.
- Brand consistency: colors from token set, typography from token set, signature elements present where expected (per project CLAUDE.md). No project token set → the active design profile (
skills/design-dna/profiles/, default anthropic-default) is the reference.
- Score findings. Each pillar gets a 1-10 score + finding list. Findings get P1/P2/P3 severity.
- Persist via the native
bin/li-review-log with skill: design-review.
- Output the structured report.
Report format
Design Review: <branch>
URL: http://localhost:5173
Routes reviewed: 3 (/, /portal, /portal/cases/:id)
Viewports: 1440x900, 375x812
Baseline: main@7e7a021
## Pillar scores
| Pillar | Score |
|---------------------|-------|
| Visual polish | 8/10 |
| Accessibility | 6/10 |
| Motion | 9/10 |
| Copy | 7/10 |
| Layout/density | 8/10 |
| Brand consistency | 9/10 |
Overall: 7.8/10
## Findings (5)
[P1] Accessibility — / hero CTA
Contrast 3.2:1 on emerald-500 over wave-watermark. WCAG AA requires 4.5:1.
Screenshot anchor: ~/.lintel/design-runs/.../landing-hero.png#cta
Fix: darken emerald to -600 OR remove watermark overlap behind CTA.
[P2] Copy — /portal greeting (customer-facing)
"Welcome back, friend" — too casual for the active pack's register.
The pack voice corpus suggests a plainer line here ("Welcome back. Pick up where you left off.").
Use a pack-provided voice-rewrite skill for the actual rewrite.
[P3] Visual polish — /portal/cases card
3px misalignment between status chip and case title at 1440. Consistent at 375.
[P3] Layout/density — /portal at 375
AreaCard subtitle wraps to 4 lines; truncate or shorten.
[P3] Brand consistency — /portal/cases/:id
Section label uses `text-[10px]` instead of `eyebrow` utility. Per project CLAUDE.md frozen-zone token.
Compliance integration
/browse underlies this skill, so Layer 2 prod-host gate applies for the URL.
- Customer-data scan on captured DOM — if real customer data appears in the screenshot/DOM, the artifact is auto-quarantined to
~/.lintel/quarantine/ and the run is marked FAILED (no review possible on un-sanitized data).
- Brand consistency pillar reads from project CLAUDE.md's frozen-zone + token rules. Lintel does not opine on what brand consistency means — the repo does.
Failure modes
- URL unreachable: report + exit. No partial review.
- Chromium missing: print install command, exit.
- DOM capture contains customer-data patterns: quarantine artifacts, BLOCK review, surface to operator. The review cannot proceed on un-sanitized data.
- No routes specified + no project default in
~/.lintel/config.yaml: ask via AskUserQuestion which routes to review.
- Copy pillar requested but no pack voice corpus configured: skip copy pillar, surface "copy pillar deferred — no pack voice corpus installed". Other pillars still run.
Examples
Local dev server, default routes:
> /design-review --url http://localhost:5173
[/browse runs 2 routes × 2 viewports = 4 captures]
Pillar scores: Polish 8/10, A11y 6/10, Motion 9/10, Copy 7/10, Layout 8/10, Brand 9/10
5 findings (1 P1, 1 P2, 3 P3). Fix P1 before the active pack's release gate.
Multi-route staging:
> /design-review --url https://staging.example.com --routes routes.txt
[8 routes × 2 viewports = 16 captures]
Pillar avg: 7.2/10. 12 findings, 2 P1.
Skip copy pillar:
> /design-review --url http://localhost:5173 --include-copy-pillar=false
5 pillars scored, copy skipped. 3 findings, all P3.
See also
/browse — the screenshot/DOM engine underneath
/plan-design-review — plan-stage equivalent (use BEFORE code is written)
- A pack-provided voice-rewrite skill — actually rewrite copy to the pack's voice
- The active pack's compliance gates — gate for customer-facing artifacts before they leave
- The active pack's release gate — reads design-review log as part of clearance check
1---2name: design-review3description: 6-pillar visual review of frontend changes — screenshot via /browse, scored findings.4---56# /design-review78The polish gate. Drives `/browse` to capture the current state of a frontend change, then evaluates against six pillars: visual polish, accessibility, motion, copy, layout/density, brand consistency. Output is a scored finding list with file:line + screenshot anchors.910Distinct from `/plan-design-review`: that one reviews a design doc *plan*. This one reviews the *built result*.1112Voice tier note: the critique itself is internal (builder-to-builder). When the copy pillar fires on a customer-facing surface, this skill references the active pack's voice corpus as the standard, but does NOT produce pack-voice copy. Use a pack-provided voice-rewrite skill for that.1314## When to use1516- Frontend change is feature-complete; want a polish pass before the active pack's release gate17- A `/qa` run is clean but the UI "feels off"18- Pre-launch on a customer-facing surface — design review is non-negotiable19- After a design-system migration — verify pages still hold together2021## When NOT to use2223- Backend-only change, no UI touched — skip24- Pure copy change with no layout impact — use a pack-provided voice-rewrite skill directly25- Plan-stage review before any code is written — use `/plan-design-review`2627## Inputs2829- Required `--url <url>` — running app URL OR local dev server (e.g. `http://localhost:5173`)30- Optional `--routes <file>` — list of routes to review (default: just `/`)31- Optional `--viewport <list>` — viewports to capture (default: `1440x900,375x812`)32- Optional `--baseline <ref>` — git ref to diff against for changed-files context33- Optional `--include-copy-pillar` — explicit opt-in for copy critique (default: on for customer-facing routes per `~/.lintel/config.yaml`)3435## Workflow36371. **Preflight.** Verify URL is live (`curl -I`). Verify managed Chromium installed.382. **Capture phase.** For each route × each viewport: invoke `/browse` to load + screenshot + capture DOM + console log. Artifacts land in `~/.lintel/design-runs/<ts>/`.392b. **Mechanical validator (ADR-0015).** On captured DOM/HTML:40 `python3 "${LINTEL_SKILLS_DIR:-skills}/design-dna/scripts/validate_design.py" <captured.html> --profile <active-profile>` —41 exit 1 findings become automatic P1s (objective violations; no judgment needed).423. **Six-pillar pass** — for each captured route:43 - **Visual polish:** alignment, spacing rhythm, hover/focus states present, no Lorem Ipsum, no broken images, no overflow.44 - **Accessibility:** contrast ratio per WCAG AA, semantic HTML in DOM, focus order, alt text on images, ARIA labels where needed.45 - **Motion:** if motion exists, does it respect `prefers-reduced-motion`? Are transitions consistent in duration/easing?46 - **Copy:** typos, voice/tone consistency, length appropriate to context. If customer-facing AND `--include-copy-pillar`: cross-reference against the active pack's voice corpus (modes + ground rules, if the pack defines them).47 - **Layout/density:** information density appropriate, viewport-responsive, no wasted whitespace at mobile, no cramped desktop.48 - **Brand consistency:** colors from token set, typography from token set, signature elements present where expected (per project CLAUDE.md). No project token set → the active design profile (`skills/design-dna/profiles/`, default anthropic-default) is the reference.494. **Score findings.** Each pillar gets a 1-10 score + finding list. Findings get P1/P2/P3 severity.505. **Persist via the native `bin/li-review-log`** with `skill: design-review`.516. **Output** the structured report.5253## Report format5455```56Design Review: <branch>5758URL: http://localhost:517359Routes reviewed: 3 (/, /portal, /portal/cases/:id)60Viewports: 1440x900, 375x81261Baseline: main@7e7a0216263## Pillar scores6465| Pillar | Score |66|---------------------|-------|67| Visual polish | 8/10 |68| Accessibility | 6/10 |69| Motion | 9/10 |70| Copy | 7/10 |71| Layout/density | 8/10 |72| Brand consistency | 9/10 |73Overall: 7.8/107475## Findings (5)7677[P1] Accessibility — / hero CTA78 Contrast 3.2:1 on emerald-500 over wave-watermark. WCAG AA requires 4.5:1.79 Screenshot anchor: ~/.lintel/design-runs/.../landing-hero.png#cta80 Fix: darken emerald to -600 OR remove watermark overlap behind CTA.8182[P2] Copy — /portal greeting (customer-facing)83 "Welcome back, friend" — too casual for the active pack's register.84 The pack voice corpus suggests a plainer line here ("Welcome back. Pick up where you left off.").85 Use a pack-provided voice-rewrite skill for the actual rewrite.8687[P3] Visual polish — /portal/cases card88 3px misalignment between status chip and case title at 1440. Consistent at 375.8990[P3] Layout/density — /portal at 37591 AreaCard subtitle wraps to 4 lines; truncate or shorten.9293[P3] Brand consistency — /portal/cases/:id94 Section label uses `text-[10px]` instead of `eyebrow` utility. Per project CLAUDE.md frozen-zone token.95```9697## Compliance integration9899- `/browse` underlies this skill, so Layer 2 prod-host gate applies for the URL.100- Customer-data scan on captured DOM — if real customer data appears in the screenshot/DOM, the artifact is auto-quarantined to `~/.lintel/quarantine/` and the run is marked FAILED (no review possible on un-sanitized data).101- Brand consistency pillar reads from project CLAUDE.md's frozen-zone + token rules. Lintel does not opine on what brand consistency means — the repo does.102103## Failure modes104105- **URL unreachable:** report + exit. No partial review.106- **Chromium missing:** print install command, exit.107- **DOM capture contains customer-data patterns:** quarantine artifacts, BLOCK review, surface to operator. The review cannot proceed on un-sanitized data.108- **No routes specified + no project default in `~/.lintel/config.yaml`:** ask via AskUserQuestion which routes to review.109- **Copy pillar requested but no pack voice corpus configured:** skip copy pillar, surface "copy pillar deferred — no pack voice corpus installed". Other pillars still run.110111## Examples112113**Local dev server, default routes:**114```115> /design-review --url http://localhost:5173116[/browse runs 2 routes × 2 viewports = 4 captures]117Pillar scores: Polish 8/10, A11y 6/10, Motion 9/10, Copy 7/10, Layout 8/10, Brand 9/101185 findings (1 P1, 1 P2, 3 P3). Fix P1 before the active pack's release gate.119```120121**Multi-route staging:**122```123> /design-review --url https://staging.example.com --routes routes.txt124[8 routes × 2 viewports = 16 captures]125Pillar avg: 7.2/10. 12 findings, 2 P1.126```127128**Skip copy pillar:**129```130> /design-review --url http://localhost:5173 --include-copy-pillar=false1315 pillars scored, copy skipped. 3 findings, all P3.132```133134## See also135136- `/browse` — the screenshot/DOM engine underneath137- `/plan-design-review` — plan-stage equivalent (use BEFORE code is written)138- A pack-provided voice-rewrite skill — actually rewrite copy to the pack's voice139- The active pack's compliance gates — gate for customer-facing artifacts before they leave140- The active pack's release gate — reads design-review log as part of clearance check