reviewing-hi-fi — SKILL.md
Variant: standard · When to use: judging a finished (or amended) hi-fi design-as-code as an acceptance gate — re-rendering it, vision-reviewing the result against the bar, then emitting VERDICT: approve|revise with actionable findings.
Overview
This skill is the review half of a producing/judging hi-fi pair. Loaded by a reviewer who has a finished hi-fi (code + its screens) in hand, it judges one question: is this rendered hi-fi a sound build seed — covering every wireframe-named screen, visually realized to the bar, accessible on the render, and conformant to the design-system? It applies a fixed single-sourced checklist — the same bar authoring-hi-fi produces to — then emits a single machine-parseable verdict plus findings the producer can act on in one pass. It is an acceptance gate — it does not author, fix, or re-render-to-improve; it judges and returns findings.
The artifact is code that renders to pixels. The reviewer's distinctive move: it re-renders the code itself (headless browser, agent-browser/Playwright), captures a fresh screenshot per viewport × state, and vision-reviews that fresh render — it never trusts a handed-in screenshot (which can be stale/cherry-picked) or grades the code by reading alone. This requires a vision-capable runtime; a text-only reviewer is degraded (it can read the code but cannot see the render) — say so, and flag if the artifact itself was produced blind.
Two boundaries: hi-fi owns the rendered visuals + the numeric pixel-WCAG judgment (the wireframe only reserved them); the design-system owns the per-component a11y contract spec — this gate judges whether the rendered composed result achieves it (spec-vs-realized; no double-judge). It judges conformance to the DS + wireframe, never grades them; and it judges a seed, not production code (don't revise for missing tests/real backend).
When to activate
- A finished hi-fi design-as-code needs an accept/revise decision before the human visual gate / the build milestone.
- You are the independent reviewer / gate for a hi-fi a producer just rendered.
- Re-judging a revised hi-fi after a prior
revise, or reviewing an amended hi-fi as a scoped delta (see cond. 13).
Do NOT activate when:
- Authoring or repairing a hi-fi → use
authoring-hi-fi. This skill never writes or re-renders to improve.
- Judging the screen structure (layout regions, component selection, states-as-structure) → that is the upstream wireframes (
reviewing-wireframes).
- Judging the token system / component catalog / per-component a11y contract → that is the design-system (
reviewing-design-system); this gate checks the rendered result conforms.
- Re-deciding which screens/transitions exist → that is user-flows.
- Judging final production code (tests, real backend, perf) → this is a seed; the build phase owns that.
Workflow
Step 1: Re-render the code + read the whole hi-fi with fresh, independent eyes
Render the hi-fi code yourself at the target viewports and capture a fresh screenshot per state — do not trust a handed-in screenshot. If you cannot render (no headless browser) or cannot see the render (text-only runtime), say so: the review is degraded and you judge only what the code statically shows (flag it). Read the code + the screens end to end. If the upstream wireframes and/or design-system were provided, skim them so Step 2 can cross-check coverage + conformance.
Step 2: Run the checklist — judge each condition on the RENDER
For each condition decide pass or gap, against the fresh render (not the code text alone). A condition fails only on a real, named deficiency — "I'd have used a different hue/layout" is not a gap (out-of-set subjective taste is excluded). Capture the exact location (which screen / which state / which viewport). Each condition is proportional to the screen's archetype — a thin/static screen legitimately collapses the interactive/stateful/responsive sub-checks; don't manufacture a gap from brevity.
The capability-boundary checklist item (below) applies ONLY when a capability_record was injected into the authoring invocation and is available as review context. When absent, treat it as n/a — do not penalise a document for lacking capability-boundary markers when no boundary was defined.
Full coverage vs the wireframes. Every wireframe-named screen + flow-visited state is rendered. Gap when one is un-rendered (cross-check the wireframes; if absent, check the doc's own inventory + note the missing input). Non-collapsing baseline. (On an amend, the pre-existing inventory satisfies whole-artifact coverage — don't re-litigate untouched screens; cond-13 owns delta-introduced coverage regressions.)
Fidelity + scope. Hi-fidelity visuals reached (not wireframe-grey / default-browser styling); no invented structure/nav/screen beyond the wireframe; and it is judged as a seed — NOT revised for lacking tests/real-backend/routing, NOT approved if it claims production-readiness it isn't. Non-collapsing baseline.
Visual execution + hierarchy. The DS visual language is realized on the render (color/type/spacing/elevation/radius/icons/imagery); the primary element is visually dominant; hierarchy legible. Gap on a flat, undifferentiated, or unstyled screen. Collapse: a one-element screen needs little hierarchy.
Polish — objective + named heuristics. Objective: grid-aligned, consistent scale, no clipped/overlapping/orphaned element, on-token, sibling-consistent. Named heuristics (each articulable): balance, whitespace & restraint, spacing rhythm, focal clarity, aesthetic cohesion. Gap only on an objective failure OR a named heuristic failure (state WHICH heuristic + why). Subjective out-of-set taste ("a nicer hue/layout exists") is NOT a gap. Collapse: a trivial screen trivially holds.
Token-backed / no DS drift. Every visual value traces to a DS token (Tailwind token-utility / CSS var / shadcn token); no raw #hex/px/bg-blue-500 bypassing a token; no local override of a DS token/component; a missing token/component is surfaced, not inlined. Gap on any off-token raw value or drift. Non-collapsing baseline.
Rendered + vision-reviewed (by you). You re-rendered the code, captured a fresh screenshot, and it renders without breakage + matches the wireframe structure + the DS. Gap when the screen fails to render, renders broken, or diverges from the wireframe. A review done off a handed-in image or code-read-only is incomplete. Non-collapsing baseline (the mechanism IS the gate).
Content realism. Real, representative content — no lorem/placeholder filler; realistic + edge data (long strings, overflow) exercised. Gap on lorem or only-tidy-data. Non-collapsing baseline.
Rendered states + quality. Each flow-visited state is rendered (a screenshot, not a note): empty (reason + guide-to-action), loading (a skeleton mirroring the layout, not a bare spinner), populated, error (plain-language cause + recovery), success, partial. Gap when an applicable state is un-rendered or empty-shell. Collapse: a static screen has only populated.
Responsive reflow. Rendered + correct at the target viewports; mobile content-priority + adaptive nav where form-factor matters; touch targets sized. Gap when a responsive surface is shown at one width only or reflows broken. Collapse: a single-form-factor surface (stated reason).
Numeric WCAG 2.2 AA on the render. axe-core clean with no rule disabled (necessary, not sufficient — axe can't see focus appearance, keyboard/focus order, contrast over imagery, or reduced-motion; judge those on the render + a manual/AT spot-check) + (judged on the render): text contrast ≥4.5:1 / large+UI ≥3:1 (SC 1.4.3/1.4.11); focus visible (2.4.7) + not-obscured (2.4.11) + appearance ≥2px/3:1 (2.4.13, house rule); target ≥24px (2.5.8); keyboard operable + logical focus order; reduced-motion honored. Gap on a measured failure or a suppressed rule. Fix belongs in the token layer. Baseline: contrast + landmarks + names always; focus/target/motion where interactive/animated. Spec-vs-realized: judge whether the RENDER achieves the threshold, not whether the DS doc states it (that's the design-system gate).
DS conformance. The rendered result conforms to the design-system (components are the DS's or faithful to its contract; no contradiction). A finding about the DS's own quality is out-of-lane — surface it, route it to the DS gate. Non-collapsing baseline.
Gaps surfaced, not invented. Undefined screen/content, a missing DS token/component, a degraded (no-render) production = explicit assumptions/open-questions. Gap when the doc papers over a gap with an invented token/component or a faked screenshot. An honestly-labelled assumption is not a gap.
Delta-scoped review (amended hi-fi only). Review the diff + the re-rendered changed screens, not the whole artifact: scope-confined (untouched screens' code byte-stable + their screenshots not re-captured); ripple-clean (a changed token reached all consuming screens + none hand-edited off-token; no consumer left stale; no wireframe-named screen newly un-rendered; no component-name drift; every changed screen's screenshot re-captured — no stale render); the changed screens re-vision-reviewed (still meet polish + WCAG + DS-conformance on the new render); the doc's own version bump correct for the change class; a breaking removal carries deprecation; changelog matches the diff. Gap on any of these. N/A for a greenfield first build.
Capability boundary (n/a when no capability_record): design-system tokens used throughout; no new components outside the design-system; boundary matches the wireframes scope (interior only for per-capability; shell only for system-scope).
Step 3: Decide the verdict
- approve — every applicable condition passes on the render. The hi-fi is a sound build seed: covered, visually realized to the bar, accessible, DS-conformant. Approve even if you can imagine visual improvements; the bar is the conditions, not perfection. A thin screen with proportionally collapsed conditions still approves.
- revise — one or more conditions have a real, named gap (an un-rendered screen, wireframe-grey fidelity, an off-token raw value, a contrast failure on the render, lorem content, a missing rendered state, a named-heuristic failure, a bad delta).
Do not revise to signal effort or request nice-to-haves; do not revise on out-of-set subjective taste (cond. 4) or on the design-system's own quality (cond. 11) or for seed-only-gaps like missing tests (cond. 2). A condition is either met or it isn't.
Step 4: Emit the verdict + actionable findings
Emit the verdict as a single line — the literal text VERDICT: approve or VERDICT: revise, on its own line, with no surrounding fences, quotes, or extra words (the fences here are illustration only):
VERDICT: approve
Then list findings. On revise, every finding is actionable — the failed condition, the exact location (which screen / state / viewport), and how to fix it (with the fix at the token layer where it's a contrast/token issue) — so the producer resolves it in one pass. On approve, findings are optional non-blocking notes.
A good finding names the gap and the fix:
revise — Numeric WCAG (cond. 10): on the rendered Projects-empty screen, the "New project" button is --muted on white at 2.9:1 (below 4.5:1, SC 1.4.3). Fix: bind the button to the --primary token (don't recolor one button off-token); re-render to confirm ≥4.5:1.
A bad finding is vague: "The contrast could be better somewhere."
Rules
Hard rules (never violate):
- Emit exactly one verdict line,
VERDICT: approve or VERDICT: revise — that literal token, on its own line. Downstream tooling parses it.
- Re-render; never trust a handed-in screenshot. Render the code yourself + vision-review the fresh result (cond. 6). A code-read-only or trust-the-image review is incomplete; a degraded (no-render/text-only) run must be flagged.
- Judge, never author. Return findings; do not rewrite or re-render-to-improve. The producer revises.
- Single-sourced bar. Judge against the Step-2 conditions — the same bar the author produces to. No private stricter standard, no invented extra condition.
- No false-revise. A seed meeting every applicable condition is approved, even a thin one. Out-of-set subjective taste is never a gap; seed-only gaps (no tests/backend) are never a gap.
- No false-approve. An un-rendered screen, off-token raw value, contrast failure on the render, lorem content, or invented token/component is a
revise.
- Numeric a11y on the render; never accept a disabled rule. Judge contrast/focus/target on the rendered pixels; a suppressed axe rule used to pass is itself a finding.
- Spec-vs-realized, stay in lane. Judge whether the RENDER achieves the WCAG threshold + conforms to the DS — do NOT grade the DS's own contract/quality (that's
reviewing-design-system) or the screen structure (that's reviewing-wireframes).
- Seed, not production. Don't revise for missing tests/real-backend/routing — those are the build phase's.
- Judge against the upstreams given. A not-produced upstream is never a revise trigger; a produced-but-ignored upstream (a wireframe screen left un-rendered; a DS token bypassed) is a fair finding.
- Amend = delta review. On an amendment, review the diff + ripple + re-vision-review the delta (cond. 13); don't re-litigate untouched screens.
- Every revise finding is actionable — failed condition + location + concrete fix.
Preferences (override-able):
- Order findings by severity — blocking gaps first (un-rendered screen, contrast failure, off-token drift, lorem), then minor (a single heuristic nit).
- Reference the condition number/name in each finding.
- Keep approve-notes few and clearly non-blocking.
- When a cross-check input (wireframes or design-system) is absent, or a render was degraded, say so once rather than silently assuming.
Gotchas
- Trusting the handed-in screenshot. A supplied image can be stale or cherry-picked — re-render the code yourself (cond. 6); that IS the gate.
- Reviewing the code by reading it. Code that reads fine can render broken — you must render + look (cond. 6).
- Grading the design-system. Revising because a DS token value or component contract seems off is out-of-lane — judge whether the render conforms (cond. 11); route DS-quality findings to the DS gate.
- Double-judging WCAG. The DS states the per-component thresholds; this gate judges whether the RENDER achieves them (spec-vs-realized) — not a re-grade of the DS's stated numbers.
- Revising a seed for prod gaps. No tests / mock data / single-file / CDN are seed allowances, not gaps (cond. 2).
- Revising on taste. "A nicer hue/layout exists" is out-of-set subjective taste — cond. 4 judges the objective subset + the named heuristics (state which one fails). Manufacturing a taste gap is a false-revise.
- Letting lorem pass. Placeholder filler hides overflow/tone/a11y problems — it's a
revise (cond. 7).
- Letting an off-token value pass. A raw
#hex/px that bypasses the token map is drift (cond. 5) — fix at the token layer.
- Re-reviewing the whole artifact on an amend. Review the diff + ripple + re-vision-review the delta (cond. 13); re-litigating untouched screens is noise.
- Verdict token drift. "Approved", "LGTM", "needs work", or a verdict buried mid-paragraph won't parse. Emit the literal
VERDICT: approve|revise on its own line.
Anti-patterns
- Rubber-stamp approve. Skimming the code/screens and approving — the gate exists to catch un-rendered screens, contrast failures, and DS drift before the build seeds from them.
- Nit-pick revise. Blocking on visual taste, a DS token value, or seed-only gaps dressed as defects. Revise is for real coverage/fidelity/a11y/conformance blockers only.
- Trust-the-image review. Grading a handed-in screenshot instead of re-rendering — defeats the gate's whole point.
- Silent re-render-to-fix. "Easier to just tweak the code" — authoring inside a review collapses the produce/judge separation.
- Inventing conditions. "It should also pass AAA / add motion / a different layout" — that drifts the bar past the single-sourced conditions.
- Grading the wrong artifact. Judging the structure (wireframes) or the token catalog (design-system) instead of the rendered hi-fi — stay in lane.
- Hedged verdict. "Mostly approve but…" or two verdict lines. Exactly one decision, one token.
Output
A single review result for one hi-fi design:
- One verdict line —
VERDICT: approve or VERDICT: revise, verbatim, on its own line.
- Findings — on
revise, one actionable finding per blocking gap (failed condition + location + concrete fix); on approve, optional non-blocking notes.
The abstract consumer is whatever orchestrates the produce→review loop: approve accepts the hi-fi for the human visual gate / the build milestone; revise returns the findings to the producer for a bounded revision pass.
Worked finding (a real revise). Hand-off: a hi-fi "Settings" screen, code only, one screenshot supplied. The reviewer re-renders at 360/768/1280: at 360 the form fields overflow the viewport (no reflow), the section heading uses a raw #1a1a1a (off-token), and axe flags the toggle's label. Verdict: revise — cond. 9 (Settings reflows broken at 360: fields overflow; fix: stack the field group + single-column below 768), cond. 5 (heading uses raw #1a1a1a; fix: bind to --foreground), cond. 10 (toggle missing an accessible name, axe label; fix: add aria-label). The supplied screenshot (desktop, populated) looked fine — the gate caught it only by re-rendering at all viewports.
Related
authoring-hi-fi — the produce half; writes to the same bar this skill judges. Pairing single-sources the bar so produce + review don't drift.
reviewing-wireframes — the sibling gate for the screen structure; the wireframes are a cross-check input here (coverage), not what this skill grades.
reviewing-design-system — the sibling gate for the token system + the per-component a11y contract; the design-system is a cross-check input here (conformance), and this gate judges the realized render against it (spec-vs-realized).
agent-browser (+ playwright-best-practices) — renders + screenshots the code so the reviewer can vision-review it; this skill drives it.
- A hi-fi template / content-template tool — owns the section structure; this skill judges quality against the bar, not structural conformance.
Progressive disclosure
references/buildability-bar.md — the 14 conditions expanded with per-condition pass/gap signals + worked findings (incl. the spec-vs-realized WCAG boundary, the named-heuristic polish call, the seed-not-prod line, and the delta-review). Load when a borderline condition needs a sharper call.
references/sources.md — research provenance for the method + the single-sourced bar (shared with the authoring-hi-fi sibling).
Body budget
description ≤ 1,024 chars (agentskills.io cap); combined description + when_to_use truncated at 1,536 chars in the listing.
- Body ~500 lines / 5,000 tokens (soft target — quality takes precedence; flag if consistently over 700 lines / 7,000 tokens) — kept in context every turn.
- Per reference file: warn >10k tokens, error >25k. Total references: warn >25k tokens, error >50k.
1---2name: reviewing-hi-fi3description: Use when reviewing/judging a finished (or amended) high-fidelity UI design produced AS CODE — an acceptance gate: is the rendered hi-fi a sound build seed? The reviewer RE-RENDERS the code itself (headless browser) and vision-reviews the fresh screenshots — never trusting handed-in images. Judges a single-sourced bar: full coverage vs the wireframes; hi-fidelity + seed-not-over-built; visual execution + objective polish + named aesthetic heuristics (subjective taste never a gap); token-backed/no-DS-drift; real content (no lorem); rendered states; responsive reflow; NUMERIC WCAG 2.2 AA on the render (axe-core + vision, no rule disabled); gaps surfaced; an amend as a scoped versioned delta. Emits `VERDICT: approve|revise` + actionable findings; approves a seed meeting the bar (no false-revise on a thin screen), revises only on a named, rendered gap. Requires a vision-capable runtime. Not for authoring hi-fi, the structure (wireframes), the token system (design-system), or final code.4---56# `reviewing-hi-fi` — SKILL.md78> **Variant:** standard · **When to use:** judging a finished (or amended) hi-fi design-as-code as an acceptance gate — re-rendering it, vision-reviewing the result against the bar, then emitting `VERDICT: approve|revise` with actionable findings.910## Overview1112This skill is the *review* half of a producing/judging hi-fi pair. Loaded by a reviewer who has a **finished hi-fi (code + its screens)** in hand, it judges one question: **is this rendered hi-fi a sound build seed — covering every wireframe-named screen, visually realized to the bar, accessible on the render, and conformant to the design-system?** It applies a fixed **single-sourced checklist** — the same bar `authoring-hi-fi` produces to — then emits a single machine-parseable verdict plus findings the producer can act on in one pass. It is an acceptance gate — it does **not** author, fix, or re-render-to-improve; it judges and returns findings.1314The artifact is **code that renders to pixels**. The reviewer's distinctive move: it **re-renders the code itself** (headless browser, `agent-browser`/Playwright), captures a **fresh screenshot per viewport × state**, and **vision-reviews that fresh render** — it never trusts a handed-in screenshot (which can be stale/cherry-picked) or grades the code by reading alone. This **requires a vision-capable runtime**; a text-only reviewer is degraded (it can read the code but cannot see the render) — say so, and flag if the artifact itself was produced blind.1516Two boundaries: hi-fi owns **the rendered visuals + the numeric pixel-WCAG judgment** (the wireframe only reserved them); the **design-system** owns the per-component a11y *contract spec* — this gate judges whether the **rendered composed result achieves** it (spec-vs-realized; no double-judge). It judges *conformance to* the DS + wireframe, never grades them; and it judges a **seed**, not production code (don't revise for missing tests/real backend).1718## When to activate1920- A finished hi-fi design-as-code needs an accept/revise decision before the human visual gate / the build milestone.21- You are the independent reviewer / gate for a hi-fi a producer just rendered.22- Re-judging a revised hi-fi after a prior `revise`, or reviewing an **amended** hi-fi as a scoped delta (see cond. 13).2324**Do NOT activate when:**2526- Authoring or repairing a hi-fi → use `authoring-hi-fi`. This skill never writes or re-renders to improve.27- Judging the screen **structure** (layout regions, component selection, states-as-structure) → that is the upstream **wireframes** (`reviewing-wireframes`).28- Judging the **token system / component catalog / per-component a11y contract** → that is the **design-system** (`reviewing-design-system`); this gate checks the rendered result *conforms*.29- Re-deciding which screens/transitions exist → that is **user-flows**.30- Judging final **production code** (tests, real backend, perf) → this is a seed; the build phase owns that.3132## Workflow3334### Step 1: Re-render the code + read the whole hi-fi with fresh, independent eyes3536Render the hi-fi code yourself at the target viewports and capture a fresh screenshot per state — **do not trust a handed-in screenshot**. If you cannot render (no headless browser) or cannot see the render (text-only runtime), say so: the review is **degraded** and you judge only what the code statically shows (flag it). Read the code + the screens end to end. If the upstream wireframes and/or design-system were provided, skim them so Step 2 can cross-check coverage + conformance.3738### Step 2: Run the checklist — judge each condition on the RENDER3940For each condition decide **pass** or **gap**, against the **fresh render** (not the code text alone). A condition fails only on a *real, named* deficiency — "I'd have used a different hue/layout" is **not** a gap (out-of-set subjective taste is excluded). Capture the exact location (which screen / which state / which viewport). Each condition is **proportional to the screen's archetype** — a thin/static screen legitimately collapses the interactive/stateful/responsive sub-checks; don't manufacture a gap from brevity.4142The capability-boundary checklist item (below) applies ONLY when a `capability_record` was injected into the authoring invocation and is available as review context. When absent, treat it as n/a — do not penalise a document for lacking capability-boundary markers when no boundary was defined.43441. **Full coverage vs the wireframes.** Every wireframe-named screen + flow-visited state is rendered. *Gap* when one is un-rendered (cross-check the wireframes; if absent, check the doc's own inventory + note the missing input). *Non-collapsing baseline.* (On an **amend**, the pre-existing inventory satisfies whole-artifact coverage — don't re-litigate untouched screens; cond-13 owns delta-introduced coverage regressions.)452. **Fidelity + scope.** Hi-fidelity visuals reached (not wireframe-grey / default-browser styling); no invented structure/nav/screen beyond the wireframe; and it is judged as a **seed** — NOT revised for lacking tests/real-backend/routing, NOT approved if it claims production-readiness it isn't. *Non-collapsing baseline.*463. **Visual execution + hierarchy.** The DS visual language is realized on the render (color/type/spacing/elevation/radius/icons/imagery); the primary element is visually dominant; hierarchy legible. *Gap* on a flat, undifferentiated, or unstyled screen. *Collapse:* a one-element screen needs little hierarchy.474. **Polish — objective + named heuristics.** Objective: grid-aligned, consistent scale, no clipped/overlapping/orphaned element, on-token, sibling-consistent. Named heuristics (each articulable): balance, whitespace & restraint, spacing rhythm, focal clarity, aesthetic cohesion. *Gap* only on an objective failure OR a **named** heuristic failure (state WHICH heuristic + why). Subjective out-of-set taste ("a nicer hue/layout exists") is **NOT** a gap. *Collapse:* a trivial screen trivially holds.485. **Token-backed / no DS drift.** Every visual value traces to a DS token (Tailwind token-utility / CSS var / shadcn token); no raw `#hex`/`px`/`bg-blue-500` bypassing a token; no local override of a DS token/component; a missing token/component is surfaced, not inlined. *Gap* on any off-token raw value or drift. *Non-collapsing baseline.*496. **Rendered + vision-reviewed (by you).** You re-rendered the code, captured a fresh screenshot, and it renders without breakage + matches the wireframe structure + the DS. *Gap* when the screen fails to render, renders broken, or diverges from the wireframe. A review done off a handed-in image or code-read-only is incomplete. *Non-collapsing baseline (the mechanism IS the gate).*507. **Content realism.** Real, representative content — **no lorem/placeholder filler**; realistic + edge data (long strings, overflow) exercised. *Gap* on lorem or only-tidy-data. *Non-collapsing baseline.*518. **Rendered states + quality.** Each flow-visited state is **rendered** (a screenshot, not a note): empty (reason + guide-to-action), loading (a skeleton mirroring the layout, not a bare spinner), populated, error (plain-language cause + recovery), success, partial. *Gap* when an applicable state is un-rendered or empty-shell. *Collapse:* a static screen has only populated.529. **Responsive reflow.** Rendered + correct at the target viewports; mobile content-priority + adaptive nav where form-factor matters; touch targets sized. *Gap* when a responsive surface is shown at one width only or reflows broken. *Collapse:* a single-form-factor surface (stated reason).5310. **Numeric WCAG 2.2 AA on the render.** axe-core clean **with no rule disabled** (necessary, not sufficient — axe can't see focus *appearance*, keyboard/focus order, contrast over imagery, or reduced-motion; judge those on the render + a manual/AT spot-check) + (judged on the render): text contrast ≥4.5:1 / large+UI ≥3:1 (SC 1.4.3/1.4.11); focus visible (2.4.7) + not-obscured (2.4.11) + appearance ≥2px/3:1 (2.4.13, house rule); target ≥24px (2.5.8); keyboard operable + logical focus order; reduced-motion honored. *Gap* on a measured failure or a suppressed rule. Fix belongs in the token layer. *Baseline:* contrast + landmarks + names always; focus/target/motion where interactive/animated. **Spec-vs-realized:** judge whether the RENDER achieves the threshold, not whether the DS doc states it (that's the design-system gate).5411. **DS conformance.** The rendered result conforms to the design-system (components are the DS's or faithful to its contract; no contradiction). A finding about the DS's *own* quality is out-of-lane — surface it, route it to the DS gate. *Non-collapsing baseline.*5512. **Gaps surfaced, not invented.** Undefined screen/content, a missing DS token/component, a degraded (no-render) production = explicit assumptions/open-questions. *Gap* when the doc papers over a gap with an invented token/component or a faked screenshot. An honestly-labelled assumption is **not** a gap.5613. **Delta-scoped review (amended hi-fi only).** Review the **diff + the re-rendered changed screens**, not the whole artifact: scope-confined (untouched screens' code byte-stable + their screenshots not re-captured); ripple-clean (a changed token reached **all** consuming screens + none hand-edited off-token; no consumer left stale; no wireframe-named screen newly un-rendered; no component-name drift; every changed screen's screenshot re-captured — no stale render); the changed screens **re-vision-reviewed** (still meet polish + WCAG + DS-conformance on the new render); the doc's own version bump correct for the change class; a breaking removal carries deprecation; changelog matches the diff. *Gap* on any of these. *N/A* for a greenfield first build.575814. **Capability boundary (n/a when no capability_record):** design-system tokens used throughout; no new components outside the design-system; boundary matches the wireframes scope (interior only for per-capability; shell only for system-scope).5960### Step 3: Decide the verdict6162- **approve** — every applicable condition passes on the render. The hi-fi is a sound build seed: covered, visually realized to the bar, accessible, DS-conformant. Approve even if you can imagine visual improvements; the bar is the conditions, not perfection. A thin screen with proportionally collapsed conditions still approves.63- **revise** — one or more conditions have a real, named gap (an un-rendered screen, wireframe-grey fidelity, an off-token raw value, a contrast failure on the render, lorem content, a missing rendered state, a named-heuristic failure, a bad delta).6465Do not revise to signal effort or request nice-to-haves; do not revise on out-of-set subjective taste (cond. 4) or on the design-system's own quality (cond. 11) or for seed-only-gaps like missing tests (cond. 2). A condition is either met or it isn't.6667### Step 4: Emit the verdict + actionable findings6869Emit the verdict as a single line — the literal text `VERDICT: approve` or `VERDICT: revise`, on its own line, with **no** surrounding fences, quotes, or extra words (the fences here are illustration only):7071```72VERDICT: approve73```7475Then list findings. On `revise`, every finding is **actionable** — the failed condition, the exact location (which screen / state / viewport), and **how to fix it** (with the fix at the token layer where it's a contrast/token issue) — so the producer resolves it in one pass. On `approve`, findings are optional non-blocking notes.7677A good finding names the gap and the fix:7879> **revise** — Numeric WCAG (cond. 10): on the rendered Projects-empty screen, the "New project" button is `--muted` on white at 2.9:1 (below 4.5:1, SC 1.4.3). Fix: bind the button to the `--primary` token (don't recolor one button off-token); re-render to confirm ≥4.5:1.8081A bad finding is vague: *"The contrast could be better somewhere."*8283## Rules8485**Hard rules (never violate):**8687- **Emit exactly one verdict line, `VERDICT: approve` or `VERDICT: revise`** — that literal token, on its own line. Downstream tooling parses it.88- **Re-render; never trust a handed-in screenshot.** Render the code yourself + vision-review the fresh result (cond. 6). A code-read-only or trust-the-image review is incomplete; a degraded (no-render/text-only) run must be flagged.89- **Judge, never author.** Return findings; do not rewrite or re-render-to-improve. The producer revises.90- **Single-sourced bar.** Judge against the Step-2 conditions — the same bar the author produces to. No private stricter standard, no invented extra condition.91- **No false-revise.** A seed meeting every applicable condition is approved, even a thin one. Out-of-set subjective taste is never a gap; seed-only gaps (no tests/backend) are never a gap.92- **No false-approve.** An un-rendered screen, off-token raw value, contrast failure on the render, lorem content, or invented token/component is a `revise`.93- **Numeric a11y on the render; never accept a disabled rule.** Judge contrast/focus/target on the rendered pixels; a suppressed axe rule used to pass is itself a finding.94- **Spec-vs-realized, stay in lane.** Judge whether the RENDER achieves the WCAG threshold + conforms to the DS — do NOT grade the DS's own contract/quality (that's `reviewing-design-system`) or the screen structure (that's `reviewing-wireframes`).95- **Seed, not production.** Don't revise for missing tests/real-backend/routing — those are the build phase's.96- **Judge against the upstreams given.** A *not-produced* upstream is never a revise trigger; a *produced-but-ignored* upstream (a wireframe screen left un-rendered; a DS token bypassed) **is** a fair finding.97- **Amend = delta review.** On an amendment, review the diff + ripple + re-vision-review the delta (cond. 13); don't re-litigate untouched screens.98- **Every revise finding is actionable** — failed condition + location + concrete fix.99100**Preferences (override-able):**101102- Order findings by severity — blocking gaps first (un-rendered screen, contrast failure, off-token drift, lorem), then minor (a single heuristic nit).103- Reference the condition number/name in each finding.104- Keep approve-notes few and clearly non-blocking.105- When a cross-check input (wireframes or design-system) is absent, or a render was degraded, say so once rather than silently assuming.106107## Gotchas108109- **Trusting the handed-in screenshot.** A supplied image can be stale or cherry-picked — re-render the code yourself (cond. 6); that IS the gate.110- **Reviewing the code by reading it.** Code that reads fine can render broken — you must render + look (cond. 6).111- **Grading the design-system.** Revising because a DS token value or component contract seems off is out-of-lane — judge whether the render conforms (cond. 11); route DS-quality findings to the DS gate.112- **Double-judging WCAG.** The DS states the per-component thresholds; this gate judges whether the RENDER achieves them (spec-vs-realized) — not a re-grade of the DS's stated numbers.113- **Revising a seed for prod gaps.** No tests / mock data / single-file / CDN are seed allowances, not gaps (cond. 2).114- **Revising on taste.** "A nicer hue/layout exists" is out-of-set subjective taste — cond. 4 judges the objective subset + the named heuristics (state which one fails). Manufacturing a taste gap is a false-revise.115- **Letting lorem pass.** Placeholder filler hides overflow/tone/a11y problems — it's a `revise` (cond. 7).116- **Letting an off-token value pass.** A raw `#hex`/`px` that bypasses the token map is drift (cond. 5) — fix at the token layer.117- **Re-reviewing the whole artifact on an amend.** Review the diff + ripple + re-vision-review the delta (cond. 13); re-litigating untouched screens is noise.118- **Verdict token drift.** "Approved", "LGTM", "needs work", or a verdict buried mid-paragraph won't parse. Emit the literal `VERDICT: approve|revise` on its own line.119120## Anti-patterns121122- **Rubber-stamp approve.** Skimming the code/screens and approving — the gate exists to catch un-rendered screens, contrast failures, and DS drift before the build seeds from them.123- **Nit-pick revise.** Blocking on visual taste, a DS token value, or seed-only gaps dressed as defects. Revise is for real coverage/fidelity/a11y/conformance blockers only.124- **Trust-the-image review.** Grading a handed-in screenshot instead of re-rendering — defeats the gate's whole point.125- **Silent re-render-to-fix.** "Easier to just tweak the code" — authoring inside a review collapses the produce/judge separation.126- **Inventing conditions.** "It should also pass AAA / add motion / a different layout" — that drifts the bar past the single-sourced conditions.127- **Grading the wrong artifact.** Judging the structure (wireframes) or the token catalog (design-system) instead of the rendered hi-fi — stay in lane.128- **Hedged verdict.** "Mostly approve but…" or two verdict lines. Exactly one decision, one token.129130## Output131132A single review result for one hi-fi design:133134- **One verdict line** — `VERDICT: approve` or `VERDICT: revise`, verbatim, on its own line.135- **Findings** — on `revise`, one actionable finding per blocking gap (failed condition + location + concrete fix); on `approve`, optional non-blocking notes.136137The abstract consumer is whatever orchestrates the produce→review loop: `approve` accepts the hi-fi for the human visual gate / the build milestone; `revise` returns the findings to the producer for a bounded revision pass.138139**Worked finding (a real revise).** Hand-off: a hi-fi "Settings" screen, code only, one screenshot supplied. The reviewer re-renders at 360/768/1280: at 360 the form fields overflow the viewport (no reflow), the section heading uses a raw `#1a1a1a` (off-token), and axe flags the toggle's label. Verdict: `revise` — cond. 9 (Settings reflows broken at 360: fields overflow; fix: stack the field group + single-column below 768), cond. 5 (heading uses raw `#1a1a1a`; fix: bind to `--foreground`), cond. 10 (toggle missing an accessible name, axe `label`; fix: add `aria-label`). The supplied screenshot (desktop, populated) looked fine — the gate caught it only by re-rendering at all viewports.140141## Related142143- **`authoring-hi-fi`** — the produce half; writes to the same bar this skill judges. Pairing single-sources the bar so produce + review don't drift.144- **`reviewing-wireframes`** — the sibling gate for the screen structure; the wireframes are a *cross-check input* here (coverage), not what this skill grades.145- **`reviewing-design-system`** — the sibling gate for the token system + the per-component a11y *contract*; the design-system is a *cross-check input* here (conformance), and this gate judges the *realized* render against it (spec-vs-realized).146- **`agent-browser`** (+ `playwright-best-practices`) — renders + screenshots the code so the reviewer can vision-review it; this skill drives it.147- A **hi-fi template / content-template** tool — owns the section *structure*; this skill judges *quality against the bar*, not structural conformance.148149## Progressive disclosure150151- `references/buildability-bar.md` — the 14 conditions expanded with per-condition pass/gap signals + worked findings (incl. the spec-vs-realized WCAG boundary, the named-heuristic polish call, the seed-not-prod line, and the delta-review). Load when a borderline condition needs a sharper call.152- `references/sources.md` — research provenance for the method + the single-sourced bar (shared with the `authoring-hi-fi` sibling).153154## Body budget155156- `description` ≤ 1,024 chars (agentskills.io cap); combined `description` + `when_to_use` truncated at 1,536 chars in the listing.157- Body ~500 lines / 5,000 tokens (soft target — quality takes precedence; flag if consistently over 700 lines / 7,000 tokens) — kept in context every turn.158- Per reference file: warn >10k tokens, error >25k. Total references: warn >25k tokens, error >50k.