design-review
When to use
Render-verification gate. A UI verdict is gated on the
design-artifact verification checklist:
where render capability exists, do not pass a design task without render
evidence (checklist steps 1–5); where it is absent, scope the verdict to what
was statically checked and say so — never "looks good" without evidence.
Use this skill when:
- Reviewing pull requests with UI changes
- Auditing frontend components for design quality
- Verifying responsive design across viewports
- Checking accessibility compliance (WCAG 2.1 AA)
- Testing interaction flows and user experience
- Conducting visual QA on new features
Do NOT use when:
- Creating new designs (use
fe-design skill instead)
- Reviewing backend/API code only
- Quick syntax checks (use linters)
Prerequisites
One of the following browser automation tools:
- Playwright MCP (recommended) — browser automation, screenshots, viewport testing
- Chrome DevTools — screenshot capture, performance analysis
A live preview URL is required for testing.
Procedure: Design review
- Inspect the PR and preview — Read the PR description, diff, and identify changed components/pages; capture a baseline screenshot of the preview URL.
- Walk the interactions — Run Phase 1; cover hover/focus/active/disabled, keyboard, loading, and form error states.
- Cover responsiveness, polish, a11y, robustness — Run Phases 2–5 in order; record findings per phase.
- Audit code-health and content — Run Phases 6–7; check tokens, dead styles, copy, console warnings.
- Verify and report — Consolidate findings in the report structure; classify each as Blocker / High / Medium / Nit before posting.
Phase 0: Preparation
- Read PR description and git diff.
- Identify changed components and affected pages.
- Navigate to preview URL.
- Take baseline screenshot.
Phase 1: Interaction
- Test user flows end-to-end.
- Six interaction states — every interactive element asserts each one (this
is the single canonical states checklist; no other review phase repeats it):
- default — the resting state is a deliberate style, not the browser default.
- hover — pointer feedback present (and not the only affordance — see focus).
- active — pressed/engaged state visibly distinct from hover.
- disabled — visually unmistakable as non-interactive (a contrast dip alone
that a user cannot read as "disabled" is a WCAG 1.4.1 failure — see
accessibility-auditor).
- focus — a visible
:focus-visible indicator (Q6 floor, lint_design_quality).
- loading — an explicit pending state (skeleton/spinner/disabled-submit), never a dead frozen control.
- Transition timing between these states follows the motion bands in
fe-design § Motion (micro-feedback ~100–200 ms;
structural open/close ~200–500 ms) — the timing source of truth; do not restate
a competing band set here. Every animated transition also carries a
prefers-reduced-motion alternative (M5 / Q4).
- Reduced motion is a presentation, not a suppression. Check what the
surface shows instead of the motion, not that a
prefers-reduced-motion block exists — the block is greppable and says
nothing. A reveal presents its content at the final state; a scrubbed
sequence presents each beat at its resting state; only decoration is
correctly removed. animation: none over a reveal leaves the content
invisible. Verdict table:
accessibility-auditor § 2.
- Test keyboard navigation (Tab, Enter, Escape, Arrow keys).
- Verify form submission and error recovery.
Phase 2: Responsiveness
Test at four viewports:
| Viewport |
Width |
Device |
| Desktop |
1440px |
Standard monitor |
| Tablet |
768px |
iPad |
| Mobile |
375px |
iPhone SE |
| Floor |
320px |
Narrowest supported — the asserted floor |
The 320px row is the floor fe-design already asserts
("every layout must work on 320px width"). It is in this table because an
asserted floor outside the measured set is an assertion nobody checks; 375px
passing says nothing about 320px, which is where a two-column grid or a fixed
min-width actually breaks.
- Take screenshots at each viewport.
- Scroll-driven surface — read the
scroll_evidence artefact
(references/verification-automation.md
§ Scroll evidence) and report every sample whose asserted state and
observed disagree as a finding. An empty samples array is a recorded null,
not a pass.
- Check layout shifts, overflow, and content reflow.
- Verify touch targets are at least 44x44px on mobile.
Phase 3: Visual Polish
- Typography: Font sizes, weights, line heights, hierarchy.
- Spacing: Consistent margins, padding, alignment.
- Colors: Contrast ratios, brand consistency, dark mode.
- Alignment: Grid alignment, visual balance.
- Icons: Consistent size, style, and spacing.
Phase 4: Accessibility (WCAG 2.1 AA)
| Criterion |
Check |
| 1.1.1 |
All images have meaningful alt text |
| 1.3.1 |
Semantic HTML (headings, landmarks, lists) |
| 1.4.3 |
Color contrast ≥ 4.5:1 (text), ≥ 3:1 (large text) |
| 1.4.11 |
Non-text contrast ≥ 3:1 (UI components, borders) |
| 2.1.1 |
All functionality available via keyboard |
| 2.4.3 |
Focus order is logical and predictable |
| 2.4.7 |
Focus indicator is visible |
| 3.3.1 |
Error messages identify the field and describe the error |
| 3.3.2 |
Labels and instructions for form inputs |
| 4.1.2 |
ARIA roles, states, and properties are correct |
Phase 5: Robustness
- Empty states: What happens with no data?
- Error states: What happens when things fail?
- Content overflow: Long text, many items, large numbers.
- Loading states: Skeleton screens, spinners, progressive loading.
- Boundary values: Min/max inputs, special characters.
Phase 6: Code Health
- Component reuse — are existing components used where possible?
- Design tokens — are colors, spacing, fonts from the design system?
- CSS patterns — utility classes vs. custom CSS, consistency.
- Accessibility in code — semantic HTML, ARIA attributes.
Phase 7: Content & Console
- Grammar and spelling in UI text.
- Consistent terminology and tone.
- No placeholder text left in production.
- Check browser console for JavaScript errors or warnings.
Reviewer posture
Approval is earned, not assumed. Default to flagging.
A design review is a skeptic's pass. The default verdict for every element
is "this needs to justify itself" — not "this is probably fine." Approve
explicitly when you have examined the evidence and found it sound.
This posture prevents the failure of "nothing to report" reviews that miss
real issues because the reviewer defaulted to charitable assumptions.
Subtraction-first remedial hierarchy
When a finding warrants a remediation recommendation, prefer in this order:
- Delete — remove the element, animation, pattern, or copy entirely
- Reduce — make it smaller, shorter, subtler, less frequent
- Fix the specific issue — change easing, origin, duration, contrast, font
- Make it interruptible (for motion) — switch to transition/spring
- Move to GPU (for motion) — animate only transform/opacity
- Polish — the lowest-leverage fix; only if the above don't apply
"Delete the animation" is always the first option to consider, even before
suggesting a different easing curve. The same applies to decorative elements,
excessive copy, and redundant UI chrome.
Section index — load on demand
Load the reference file whose sections the review needs — never all of them by default:
references/review-communication.md — Before / After / Why output format · Communication principles · Report structure · Design Review Summary
references/verification-automation.md — Visual QA with browser automation · Async-verifier pattern (keep the main context clean)
Output format
- Design review report following the Report structure section
- Severity-rated findings (blocker, suggestion, nit)
- Accessibility and responsive compliance summary
Auto-trigger keywords
- design review
- UI review
- UX audit
- accessibility
- WCAG
- responsive
Gotcha
- Don't review design without understanding the user's constraints (time, resources, scope).
- The model tends to suggest accessibility improvements that break the existing design system.
- "Best practice" is not always the right choice — sometimes "good enough" ships faster.
Read the authority object — the review is scoped by it
Read the resolved ui_authority
(contract) before reviewing. Three
fields change what a finding means:
surface_mode sets the density, hierarchy and expressiveness a reviewer
should expect. A dense operate screen is not "cramped" and a generous
persuade hero is not "wasteful".
change_intent decides whether a visual-world difference is a finding at
all. Under preserve a palette or type-family delta is a defect; under
redesign it is the point.
reference_maturity decides whether a difference from the reference is a
defect. A wireframe declares structure, so reproducing its gray boxes is
over-fidelity, not fidelity.
QUALITY FLOORS DO NOT VARY BY SURFACE MODE.
THE Q1-Q6 FLOOR SET IS IDENTICAL IN ALL FOUR MODES.
Do not re-derive any of these fields here. This skill is a declared consumer of
that object, and the contract's consumer table names it.
Review independence — two passes, isolated, in this order
PASS A (JUDGEMENT) RUNS BEFORE PASS B (DETECTOR + RENDER), AND IN ISOLATION.
INLINE EXECUTION IS PERMITTED ONLY WHERE NO SPAWN PRIMITIVE EXISTS, AND THEN
LINE 1 READS `DEGRADED: single-context (<reason>)`.
THERE IS NO THIRD STATE.
Pass A — judgement. Read the surface and form a verdict without the
detector output and without the render artefact. Emit an assessment id.
Pass B — detector plus render. Run lint_design_slop and read the
ui:render manifest. Emit a second assessment id.
Order is the whole point. A judgement formed after reading a detector's
findings is anchored to them: the reviewer confirms the list instead of looking
at the surface. Running A first is what keeps B's findings additive rather than
directive — the same reason
evaluator-independence forbids
pre-loading a verdict into a reviewer's prompt.
When no spawn primitive exists the two passes share one context, which
means A cannot be isolated from B. That is a real degradation and it is
reported, not hidden: line 1 of the output reads
DEGRADED: single-context (<reason>)
Output therefore carries either two assessment ids or that banner.
Neither present is not a third state — it is an unreported degradation, and it
is the failure this section exists to prevent.
Anti-slop scan
Hybrid: a deterministic detector does the mechanical pattern-matching (zero
token cost, no catalog reload); you do the judgment it cannot. After the
structured review phases, add an explicit Anti-Slop Check section:
- Run the deterministic detector first — it catches the pattern-detectable
tells so you don't eyeball or re-derive them:
npx tsx node_modules/@event4u/agent-config/src/scripts/lint_design_slop.ts --dir <consumer-ui-path> --json
Each finding carries rule (e.g. slop-v1-side-stripe), catalogId
(V1), severity (P0–P3), file:line, and a message. Cite these
verbatim (rule-id + catalogId + file:line) — do not re-describe them from
the prose catalog. Findings are rebuttable presumptions: a finding the
consumer's DESIGN.md gate suppresses is already filtered out; a remaining
finding means the project has not declared the pattern as intentional.
lint_design_slop is flags, never a block (default exit 0; CI opts into
failure via --fail-on).
- Judge what the detector cannot — load
docs/guidelines/design-antipatterns.md
for the tells that need structural/aesthetic judgment (e.g. T3 icon-tile
stack, L2 three-identical-card grid, V2 glassmorphism intent). List any that
appear, cite by entry ID, and check the override condition.
- Run the AI-slop originality self-test on the overall aesthetic direction.
Report the result (pass / flag / fail) with one sentence of evidence — this
is the human judgment the detector deliberately does not make.
- Mark the findings a provided artifact already answers. When the run is a
port (
state.ui_design.provided_artifact is set), a finding about a
decision the artifact makes is correct about the pattern and wrong about the
action. Keep it in the output, cite it as "matches provided spec", and
set artifact_covered: true on it — the polish gate drops those from the
round-driving set, so an unmarked finding will send a round at the user's
own design. The flag is scoped to decisions the artifact actually covers;
anything it leaves open (a state it never showed) is generative work and
keeps the full scan. Precedence + scope:
design-fidelity-mechanics
§ Provided-artifact precedence. Regression witness: daf-slop-vs-provided.
For the objective quality floors (WCAG contrast, font-size, line-length,
reduced-motion, heading hierarchy, focus indicator), do NOT eyeball them —
run the accessibility-auditor checklist (Q1–Q6 in the catalog) and cite its
verdict. The review owns the subjective anti-slop judgment (Visual /
Typography / Color / Layout taste); accessibility-auditor owns the
objective floors and the WCAG audit method. Cite, don't re-derive.
Do NOT
- Do NOT skip accessibility testing — it's not optional.
- Do NOT report issues without evidence (screenshots, specific elements).
- Do NOT prescribe solutions — describe problems and impact.
- Do NOT block PRs on nitpicks.
- Do NOT test only at desktop resolution.
1---2name: design-review3description: When the user says "review the design", "check the UI", or wants a comprehensive UI/UX review. 7 phases: interaction, responsiveness, accessibility. Inventory via existing-ui-audit.4---56# design-review78## When to use910> **Render-verification gate.** A UI verdict is gated on the11> [design-artifact verification checklist](../../../docs/contracts/design-artifact-verification.md#verification-checklist):12> where render capability exists, do not pass a design task without render13> evidence (checklist steps 1–5); where it is absent, scope the verdict to what14> was statically checked and say so — never "looks good" without evidence.1516Use this skill when:17- Reviewing pull requests with UI changes18- Auditing frontend components for design quality19- Verifying responsive design across viewports20- Checking accessibility compliance (WCAG 2.1 AA)21- Testing interaction flows and user experience22- Conducting visual QA on new features2324Do NOT use when:25- Creating new designs (use `fe-design` skill instead)26- Reviewing backend/API code only27- Quick syntax checks (use linters)2829## Prerequisites3031One of the following browser automation tools:32- **Playwright MCP** (recommended) — browser automation, screenshots, viewport testing33- **Chrome DevTools** — screenshot capture, performance analysis3435A **live preview URL** is required for testing.3637## Procedure: Design review38391. **Inspect the PR and preview** — Read the PR description, diff, and identify changed components/pages; capture a baseline screenshot of the preview URL.402. **Walk the interactions** — Run Phase 1; cover hover/focus/active/disabled, keyboard, loading, and form error states.413. **Cover responsiveness, polish, a11y, robustness** — Run Phases 2–5 in order; record findings per phase.424. **Audit code-health and content** — Run Phases 6–7; check tokens, dead styles, copy, console warnings.435. **Verify and report** — Consolidate findings in the report structure; classify each as Blocker / High / Medium / Nit before posting.4445### Phase 0: Preparation4647- Read PR description and git diff.48- Identify changed components and affected pages.49- Navigate to preview URL.50- Take baseline screenshot.5152### Phase 1: Interaction5354- Test user flows end-to-end.55- **Six interaction states — every interactive element asserts each one** (this56 is the single canonical states checklist; no other review phase repeats it):57 1. **default** — the resting state is a deliberate style, not the browser default.58 2. **hover** — pointer feedback present (and not the *only* affordance — see focus).59 3. **active** — pressed/engaged state visibly distinct from hover.60 4. **disabled** — visually unmistakable as non-interactive (a contrast dip alone61 that a user cannot read as "disabled" is a WCAG 1.4.1 failure — see `accessibility-auditor`).62 5. **focus** — a visible `:focus-visible` indicator (Q6 floor, `lint_design_quality`).63 6. **loading** — an explicit pending state (skeleton/spinner/disabled-submit), never a dead frozen control.64- **Transition timing** between these states follows the motion bands in65 [`fe-design`](../fe-design/SKILL.md) § Motion (micro-feedback ~100–200 ms;66 structural open/close ~200–500 ms) — the timing source of truth; do not restate67 a competing band set here. Every animated transition also carries a68 `prefers-reduced-motion` alternative (M5 / Q4).69- **Reduced motion is a presentation, not a suppression.** Check what the70 surface shows *instead of* the motion, not that a71 `prefers-reduced-motion` block exists — the block is greppable and says72 nothing. A reveal presents its content at the final state; a scrubbed73 sequence presents each beat at its resting state; only decoration is74 correctly removed. `animation: none` over a reveal leaves the content75 invisible. Verdict table:76 [`accessibility-auditor`](../accessibility-auditor/SKILL.md) § 2.77- Test keyboard navigation (Tab, Enter, Escape, Arrow keys).78- Verify form submission and error recovery.7980### Phase 2: Responsiveness8182Test at four viewports:8384| Viewport | Width | Device |85|---|---|---|86| Desktop | 1440px | Standard monitor |87| Tablet | 768px | iPad |88| Mobile | 375px | iPhone SE |89| Floor | 320px | Narrowest supported — the asserted floor |9091The 320px row is the floor [`fe-design`](../fe-design/SKILL.md) already asserts92("every layout must work on 320px width"). It is in this table because an93asserted floor outside the measured set is an assertion nobody checks; 375px94passing says nothing about 320px, which is where a two-column grid or a fixed95`min-width` actually breaks.9697- Take screenshots at each viewport.98- **Scroll-driven surface** — read the `scroll_evidence` artefact99 ([`references/verification-automation.md`](references/verification-automation.md)100 § Scroll evidence) and report every sample whose asserted `state` and101 `observed` disagree as a finding. An empty `samples` array is a recorded null,102 not a pass.103- Check layout shifts, overflow, and content reflow.104- Verify touch targets are at least 44x44px on mobile.105106### Phase 3: Visual Polish107108- **Typography:** Font sizes, weights, line heights, hierarchy.109- **Spacing:** Consistent margins, padding, alignment.110- **Colors:** Contrast ratios, brand consistency, dark mode.111- **Alignment:** Grid alignment, visual balance.112- **Icons:** Consistent size, style, and spacing.113114### Phase 4: Accessibility (WCAG 2.1 AA)115116| Criterion | Check |117|---|---|118| **1.1.1** | All images have meaningful alt text |119| **1.3.1** | Semantic HTML (headings, landmarks, lists) |120| **1.4.3** | Color contrast ≥ 4.5:1 (text), ≥ 3:1 (large text) |121| **1.4.11** | Non-text contrast ≥ 3:1 (UI components, borders) |122| **2.1.1** | All functionality available via keyboard |123| **2.4.3** | Focus order is logical and predictable |124| **2.4.7** | Focus indicator is visible |125| **3.3.1** | Error messages identify the field and describe the error |126| **3.3.2** | Labels and instructions for form inputs |127| **4.1.2** | ARIA roles, states, and properties are correct |128129### Phase 5: Robustness130131- **Empty states:** What happens with no data?132- **Error states:** What happens when things fail?133- **Content overflow:** Long text, many items, large numbers.134- **Loading states:** Skeleton screens, spinners, progressive loading.135- **Boundary values:** Min/max inputs, special characters.136137### Phase 6: Code Health138139- Component reuse — are existing components used where possible?140- Design tokens — are colors, spacing, fonts from the design system?141- CSS patterns — utility classes vs. custom CSS, consistency.142- Accessibility in code — semantic HTML, ARIA attributes.143144### Phase 7: Content & Console145146- Grammar and spelling in UI text.147- Consistent terminology and tone.148- No placeholder text left in production.149- Check browser console for JavaScript errors or warnings.150151## Reviewer posture152153**Approval is earned, not assumed. Default to flagging.**154155A design review is a skeptic's pass. The default verdict for every element156is "this needs to justify itself" — not "this is probably fine." Approve157explicitly when you have examined the evidence and found it sound.158159This posture prevents the failure of "nothing to report" reviews that miss160real issues because the reviewer defaulted to charitable assumptions.161162## Subtraction-first remedial hierarchy163164When a finding warrants a remediation recommendation, prefer in this order:1651661. **Delete** — remove the element, animation, pattern, or copy entirely1672. **Reduce** — make it smaller, shorter, subtler, less frequent1683. **Fix the specific issue** — change easing, origin, duration, contrast, font1694. **Make it interruptible** (for motion) — switch to transition/spring1705. **Move to GPU** (for motion) — animate only transform/opacity1716. **Polish** — the lowest-leverage fix; only if the above don't apply172173*"Delete the animation" is always the first option to consider, even before174suggesting a different easing curve.* The same applies to decorative elements,175excessive copy, and redundant UI chrome.176177## Section index — load on demand178179Load the reference file whose sections the review needs — never all of them by default:180181- [`references/review-communication.md`](references/review-communication.md) — Before / After / Why output format · Communication principles · Report structure · Design Review Summary182- [`references/verification-automation.md`](references/verification-automation.md) — Visual QA with browser automation · Async-verifier pattern (keep the main context clean)183184## Output format1851861. Design review report following the Report structure section1872. Severity-rated findings (blocker, suggestion, nit)1883. Accessibility and responsive compliance summary189190## Auto-trigger keywords191192- design review193- UI review194- UX audit195- accessibility196- WCAG197- responsive198199## Gotcha200201- Don't review design without understanding the user's constraints (time, resources, scope).202- The model tends to suggest accessibility improvements that break the existing design system.203- "Best practice" is not always the right choice — sometimes "good enough" ships faster.204205## Read the authority object — the review is scoped by it206207Read the resolved `ui_authority`208([contract](../../../docs/contracts/ui-authority.md)) before reviewing. Three209fields change what a finding *means*:210211- **`surface_mode`** sets the density, hierarchy and expressiveness a reviewer212 should expect. A dense `operate` screen is not "cramped" and a generous213 `persuade` hero is not "wasteful".214- **`change_intent`** decides whether a visual-world difference is a finding at215 all. Under `preserve` a palette or type-family delta is a **defect**; under216 `redesign` it is the point.217- **`reference_maturity`** decides whether a difference from the reference is a218 defect. A `wireframe` declares structure, so reproducing its gray boxes is219 over-fidelity, not fidelity.220221```222QUALITY FLOORS DO NOT VARY BY SURFACE MODE.223THE Q1-Q6 FLOOR SET IS IDENTICAL IN ALL FOUR MODES.224```225226Do not re-derive any of these fields here. This skill is a declared consumer of227that object, and the contract's consumer table names it.228229## Review independence — two passes, isolated, in this order230231```232PASS A (JUDGEMENT) RUNS BEFORE PASS B (DETECTOR + RENDER), AND IN ISOLATION.233INLINE EXECUTION IS PERMITTED ONLY WHERE NO SPAWN PRIMITIVE EXISTS, AND THEN234LINE 1 READS `DEGRADED: single-context (<reason>)`.235THERE IS NO THIRD STATE.236```237238**Pass A — judgement.** Read the surface and form a verdict without the239detector output and without the render artefact. Emit an assessment id.240241**Pass B — detector plus render.** Run `lint_design_slop` and read the242`ui:render` manifest. Emit a second assessment id.243244**Order is the whole point.** A judgement formed after reading a detector's245findings is anchored to them: the reviewer confirms the list instead of looking246at the surface. Running A first is what keeps B's findings additive rather than247directive — the same reason248[`evaluator-independence`](../../rules/evaluator-independence.md) forbids249pre-loading a verdict into a reviewer's prompt.250251**When no spawn primitive exists** the two passes share one context, which252means A cannot be isolated from B. That is a real degradation and it is253reported, not hidden: line 1 of the output reads254255```256DEGRADED: single-context (<reason>)257```258259Output therefore carries **either** two assessment ids **or** that banner.260Neither present is not a third state — it is an unreported degradation, and it261is the failure this section exists to prevent.262263## Anti-slop scan264265Hybrid: a deterministic detector does the mechanical pattern-matching (zero266token cost, no catalog reload); you do the judgment it cannot. After the267structured review phases, add an explicit **Anti-Slop Check** section:2682691. **Run the deterministic detector first** — it catches the pattern-detectable270 tells so you don't eyeball or re-derive them:271 ```272 npx tsx node_modules/@event4u/agent-config/src/scripts/lint_design_slop.ts --dir <consumer-ui-path> --json273 ```274 Each finding carries `rule` (e.g. `slop-v1-side-stripe`), `catalogId`275 (`V1`), `severity` (`P0`–`P3`), `file:line`, and a `message`. **Cite these276 verbatim** (rule-id + catalogId + file:line) — do not re-describe them from277 the prose catalog. Findings are *rebuttable presumptions*: a finding the278 consumer's `DESIGN.md` gate suppresses is already filtered out; a remaining279 finding means the project has not declared the pattern as intentional.280 `lint_design_slop` is **flags, never a block** (default exit 0; CI opts into281 failure via `--fail-on`).2822. **Judge what the detector cannot** — load283 [`docs/guidelines/design-antipatterns.md`](../../../docs/guidelines/design-antipatterns.md)284 for the tells that need structural/aesthetic judgment (e.g. T3 icon-tile285 stack, L2 three-identical-card grid, V2 glassmorphism intent). List any that286 appear, cite by entry ID, and check the override condition.2873. Run the AI-slop originality self-test on the overall aesthetic direction.288 Report the result (pass / flag / fail) with one sentence of evidence — this289 is the human judgment the detector deliberately does not make.2904. **Mark the findings a provided artifact already answers.** When the run is a291 port (`state.ui_design.provided_artifact` is set), a finding about a292 decision the artifact makes is correct about the pattern and wrong about the293 action. Keep it in the output, cite it as **"matches provided spec"**, and294 set `artifact_covered: true` on it — the polish gate drops those from the295 round-driving set, so an unmarked finding will send a round at the user's296 own design. The flag is scoped to decisions the artifact actually covers;297 anything it leaves open (a state it never showed) is generative work and298 keeps the full scan. Precedence + scope:299 [`design-fidelity-mechanics`](../../../docs/guidelines/design-fidelity-mechanics.md)300 § Provided-artifact precedence. Regression witness: `daf-slop-vs-provided`.301302For the **objective quality floors** (WCAG contrast, font-size, line-length,303reduced-motion, heading hierarchy, focus indicator), do NOT eyeball them —304run the `accessibility-auditor` checklist (Q1–Q6 in the catalog) and cite its305verdict. The review owns the *subjective* anti-slop judgment (Visual /306Typography / Color / Layout taste); `accessibility-auditor` owns the307*objective* floors and the WCAG *audit method*. Cite, don't re-derive.308309## Do NOT310311- Do NOT skip accessibility testing — it's not optional.312- Do NOT report issues without evidence (screenshots, specific elements).313- Do NOT prescribe solutions — describe problems and impact.314- Do NOT block PRs on nitpicks.315- Do NOT test only at desktop resolution.