Scholar HeistScholar Heist
← All skills
Qualityv1.0.0 · 2026-08-07

Design Review

A review that lists forty problems gets ignored. This produces a score, the critical fixes, and the quick wins — in that order — so the reader knows what to do on Monday morning.

Download skill

What it does

  • Run the static audit
  • Check contrast
  • Check responsive behaviour
  • Check performance against Core Web Vitals
  • Judge hierarchy and consistency
  • Score and rank
SKILL.md
---
name: design-review
description: Audit an existing website or page for accessibility, responsive behaviour, performance and visual hierarchy, and return a score with ranked fixes. Use when asked to review a website, audit a page, check accessibility or WCAG issues, find out why a site looks wrong or feels slow, do a UX or design review, check if a site is mobile friendly, check Core Web Vitals, or someone says 'the site feels off but I can't say why'. For fixing the copy, see landing-page-copy. For the standards being audited against, see design-system-spec.
metadata:
  version: 1.0.0
---

# Design review

A review that lists forty problems gets ignored. This produces a **score, the
critical fixes, and the quick wins** — in that order — so the reader knows what to do
on Monday morning.

Two rules shape the whole thing. **Report, never fix**: the reviewer's job is to find
and rank, and applying changes without approval is how a review loses trust. And
**every finding names the element**, so nobody has to hunt for what you meant.

## Before you start

| Input | Why |
| --- | --- |
| The URL, or the HTML file | Step 1 needs something to parse |
| Which pages matter most | A whole-site audit nobody reads is worth less than three pages fixed |
| The brand's design system, if one exists | Lets you check consistency, not just correctness |
| Who the audience is | A dashboard for staff and a public landing page get judged differently |

If you only have a screenshot, say so. You can review hierarchy and layout from an
image, but not markup, contrast values, or performance — do not imply otherwise.

## Step 1 — Run the static audit

```bash
python3 scripts/audit_html.py page.html
python3 scripts/audit_html.py page.html --json
```

This catches the machine-checkable problems — missing `lang`, absent `alt`, skipped
heading levels, unlabelled inputs, blocked pinch-zoom, positive `tabindex`. Let the
script find those so your attention goes where judgement is needed.

**It reads markup only.** It cannot see rendered colour, layout, or speed. The
remaining steps are the parts it cannot do.

## Step 2 — Check contrast

Pull the actual text and background colours and check each pair. Do not judge by eye —
contrast is a computed ratio.

| Requirement | Ratio | WCAG |
| --- | --- | --- |
| Body text | 4.5:1 | SC 1.4.3, Level AA |
| Large text (24px+, or 18.5px+ bold) | 3:1 | SC 1.4.3, Level AA |
| Icons, borders, focus rings | 3:1 | SC 1.4.11, Level AA |

The usual offenders: grey placeholder text, light-grey captions, brand colour used
for body copy, and white text on a mid-tone brand background.

## Step 3 — Check responsive behaviour

Look at the page at **360px**, **768px** and **1280px** wide.

| Check | Failure looks like |
| --- | --- |
| Horizontal scroll at 360px | A fixed-width element, usually a table or image |
| Text reflows | Content cut off rather than wrapped |
| Touch targets ≥ 24×24 CSS px | Buttons and links too small or too close together |
| Tap targets not crowded | Two links so close a thumb hits both |
| Images scale | Overflow, or squashed aspect ratio |

360px is the important one. It is where most real phones sit, and where fixed widths
show up.

## Step 4 — Check performance against Core Web Vitals

Measured at the **75th percentile** of real page loads, not on your laptop.

| Metric | Good | Needs work | Poor |
| --- | --- | --- | --- |
| **LCP** — largest element painted | ≤ 2.5s | 2.5–4.0s | > 4.0s |
| **INP** — interaction to next paint | ≤ 200ms | 200–500ms | > 500ms |
| **CLS** — layout shift | ≤ 0.1 | 0.1–0.25 | > 0.25 |

INP replaced First Input Delay in 2024. If a report still quotes FID, it is out of
date.

The usual causes: an unoptimised hero image (LCP), heavy third-party scripts (INP),
and images or ads with no reserved dimensions (CLS).

If you cannot measure these, **say they were not measured**. Do not estimate them.

## Step 5 — Judge hierarchy and consistency

This is the part no script can do.

- **Squint test.** Blur the page. What stands out first? Is that what should?
- **One primary action per screen.** Three buttons of equal weight means no primary.
- **Consistency.** Do headings, buttons and spacing repeat, or is each section
  invented fresh? If a design system exists, check against it.
- **Line length.** 45–75 characters. Full-width body text on desktop is the common
  failure.
- **Spacing rhythm.** Related things close together, unrelated things apart.

## Step 6 — Score and rank

Sort by **what hurts most users first**, not by how easy it is to fix. Split into
critical (under 70 means it needs attention before anything else) and quick wins.

## Output

```
# Design review: <page>

## Score
<n>/100 — one sentence on the single biggest problem.

## Critical
Ranked. Each: what's wrong, the element, why it matters, the fix.
1. [contrast] Body text #999 on #fff is 2.85:1, needs 4.5:1
   Where: .card p
   Why:   unreadable for low-vision users; fails WCAG AA
   Fix:   darken to #595959 (7.0:1)

## Quick wins
Same shape, lower impact.

## Not measured
<Anything you could not check, and what it would need.>
```

## When it breaks

| What you see | What it means | The fix |
| --- | --- | --- |
| Script reports 100/100 but the page looks wrong | It checks markup, not rendered design | Steps 2–5 are the real review. The score is a floor, not a verdict |
| Everything is "critical" | Severity assigned by ease of fix, not user impact | Re-rank by how many users are blocked |
| Contrast passes but text is still hard to read | Ratio is fine; size, weight or line length is not | Check 16px minimum, line length 45–75 characters |
| Cannot measure Core Web Vitals | No field data, or only a local load | Report them as not measured. Never estimate |
| Only a screenshot available | No markup, no computed colour, no timing | Review hierarchy and layout only; state the limit explicitly |
| Client disputes a finding | The finding named a symptom, not the element | Every finding names the selector and the measured value |
| Review lists 40 issues, nothing changes | No ranking, so no starting point | Cut to the critical few; keep the rest as an appendix |
| Page passes every check but converts badly | Accessibility and design are not conversion | This skill audits build quality. Copy and offer are a separate job |

Never apply fixes as part of a review. Report, get approval, then change — a reviewer
who edits is a reviewer nobody asks back.

## Rules

- **Report, never auto-fix.** Findings and approval come before changes.
- **Name the element and the measured value** in every finding. "Contrast is bad" is
  not actionable; "`.card p` is 2.85:1, needs 4.5:1" is.
- **Rank by user impact, not by effort.** The easiest fix is rarely the most important.
- **Never estimate a metric you did not measure.** Say it was not measured.
- **Do not review what you cannot see.** From a screenshot, say so.
- **Under 70 is the critical threshold.** Below that, fix before adding anything new.
- A clean score is not a conformance claim. This audits common failures; it does not
  replace an audit by a qualified accessibility professional. Standards are external —
  see `SOURCES.md`.

## Related skills

- **design-system-spec** — the standards this audit measures against; build it first
  where none exists.
- **landing-page-copy** — when the page passes the build audit but converts badly.
- **answer-engine-optimisation** — the AEO pass for pages engines should quote.
- **ai-content-qc** — the content-truth gate; this skill audits the build.

Reviews

Sign in to leave a review.