Visual QA
Visual QA is a review protocol. The project adapter owns capture; the skill supplies the state matrix, independent expert lenses, refutation, synthesis, and optional verified fixes.
Inputs
Infer these when safe; otherwise ask.
- adapter: project-specific capture and test instructions in
adapters/<project>.md
- tier:
quick, full, or deep; default full
- mode:
review or fix; default review
- scope: flows and screens; default to the adapter's declared flows
- focus: optional lens or risk to emphasize
Capability discovery
Before capture:
- Inspect the adapter and project scripts for an existing screenshot command.
- Inventory actually available browser, device, native-UI, and image-reading tools.
- Prefer the project's deterministic capture harness. Do not assume Playwright, a browser MCP, or a particular agent runtime exists.
- If capture or image inspection is unavailable, stop and name the missing capability. Never fabricate screenshots or visual findings.
This repository does not ship a universal browser driver. Start from adapters/_template.md when a project has no adapter.
Pipeline
- Capture — render a deterministic matrix of flows, states, breakpoints, and themes; add a clearly marked exploratory pass.
- Validate — run
python3 scripts/validate_manifest.py path/to/manifest.json --check-files.
- Review — give each selected expert only its lens, negative constraint, manifest, and images. Experts do not see one another's findings.
- Refute — assign a skeptic to every critical/high/medium finding. The default verdict is “not proven” unless pixels or interaction evidence support it.
- Synthesize — deduplicate, preserve dissent, and rank by severity, confidence, independent votes, and user impact.
- Fix — only in
mode: fix, with explicit authority. Give disjoint file scopes to isolated implementers and apply reviewed diffs once.
- Re-verify — recapture affected states and compare before/after for improvement and regression.
Capture contract
The matrix should cover:
- flows: the core user journeys;
- states: default, empty, long-content, loading, error/offline, disabled, and first-run;
- breakpoints: project-specific, with narrow/mobile, medium, and wide coverage;
- themes: every supported theme;
- transitions: pending, focus, hover, pressed, open/close, and success/failure where relevant.
Pin time, timezone, locale, randomness, animation policy, and fixtures where the project permits. Deterministic fixtures should be purpose-built and non-sensitive. Exploratory screenshots are useful evidence but are not goldens.
manifest.json is an array of:
{
"label": "checkout-error-mobile-dark",
"path": "qa-shots/checkout-error-mobile-dark.png",
"flow": "checkout",
"state": "error",
"breakpoint": 320,
"theme": "dark"
}
Paths must be repository-relative and use forward slashes.
Finding contract
Each finding must contain:
- expert slug and lens;
- manifest label and exact visible region;
- issue and governing principle;
- pixel or interaction evidence;
- severity:
critical, high, medium, low, or nit;
- concrete proposed fix;
- confidence from 0 to 1;
- any additional capture required.
Silence beats weak findings. Aesthetic preference is not an objective defect. Preserve minority opinions when they are high-confidence and clearly labeled as taste.
Severity
- critical: data loss, unintended irreversible action, unreadable core content, or sensitive information exposed in-frame
- high: blocks or badly degrades a core task, fails a required accessibility criterion, or breaks a required state
- medium: material friction, inconsistency, or ambiguous affordance
- low/nit: polish with limited user impact
Guardrails
- Isolation is mandatory during review.
- Validate capture coverage before judging design.
- Real-account or sensitive screenshots are ephemeral: keep them outside version control and remove them according to project policy.
- Never commit raw captures by default. Only synthetic goldens may be committed after human ratification.
- The human owns final taste, brand direction, and golden-image approval.
- A screenshot cannot prove DOM semantics, keyboard behavior, screen-reader output, performance, or network correctness. Route those claims to appropriate tests.
Select experts from roster.md. Keep the committee as small as the risk permits.
1---2name: visual-qa3description: Review a rendered interface with an isolated committee of orthogonal visual experts. Use for UI audits, responsive and theme checks, edge-state coverage, screenshot-based accessibility review, adversarial finding validation, and optional fix-and-recapture loops.4---56# Visual QA78Visual QA is a review protocol. The project adapter owns capture; the skill supplies the state matrix, independent expert lenses, refutation, synthesis, and optional verified fixes.910## Inputs1112Infer these when safe; otherwise ask.1314- **adapter**: project-specific capture and test instructions in `adapters/<project>.md`15- **tier**: `quick`, `full`, or `deep`; default `full`16- **mode**: `review` or `fix`; default `review`17- **scope**: flows and screens; default to the adapter's declared flows18- **focus**: optional lens or risk to emphasize1920## Capability discovery2122Before capture:23241. Inspect the adapter and project scripts for an existing screenshot command.252. Inventory actually available browser, device, native-UI, and image-reading tools.263. Prefer the project's deterministic capture harness. Do not assume Playwright, a browser MCP, or a particular agent runtime exists.274. If capture or image inspection is unavailable, stop and name the missing capability. Never fabricate screenshots or visual findings.2829This repository does not ship a universal browser driver. Start from [`adapters/_template.md`](adapters/_template.md) when a project has no adapter.3031## Pipeline32331. **Capture** — render a deterministic matrix of flows, states, breakpoints, and themes; add a clearly marked exploratory pass.342. **Validate** — run `python3 scripts/validate_manifest.py path/to/manifest.json --check-files`.353. **Review** — give each selected expert only its lens, negative constraint, manifest, and images. Experts do not see one another's findings.364. **Refute** — assign a skeptic to every critical/high/medium finding. The default verdict is “not proven” unless pixels or interaction evidence support it.375. **Synthesize** — deduplicate, preserve dissent, and rank by severity, confidence, independent votes, and user impact.386. **Fix** — only in `mode: fix`, with explicit authority. Give disjoint file scopes to isolated implementers and apply reviewed diffs once.397. **Re-verify** — recapture affected states and compare before/after for improvement and regression.4041## Capture contract4243The matrix should cover:4445- flows: the core user journeys;46- states: default, empty, long-content, loading, error/offline, disabled, and first-run;47- breakpoints: project-specific, with narrow/mobile, medium, and wide coverage;48- themes: every supported theme;49- transitions: pending, focus, hover, pressed, open/close, and success/failure where relevant.5051Pin time, timezone, locale, randomness, animation policy, and fixtures where the project permits. Deterministic fixtures should be purpose-built and non-sensitive. Exploratory screenshots are useful evidence but are not goldens.5253`manifest.json` is an array of:5455```json56{57 "label": "checkout-error-mobile-dark",58 "path": "qa-shots/checkout-error-mobile-dark.png",59 "flow": "checkout",60 "state": "error",61 "breakpoint": 320,62 "theme": "dark"63}64```6566Paths must be repository-relative and use forward slashes.6768## Finding contract6970Each finding must contain:7172- expert slug and lens;73- manifest label and exact visible region;74- issue and governing principle;75- pixel or interaction evidence;76- severity: `critical`, `high`, `medium`, `low`, or `nit`;77- concrete proposed fix;78- confidence from 0 to 1;79- any additional capture required.8081Silence beats weak findings. Aesthetic preference is not an objective defect. Preserve minority opinions when they are high-confidence and clearly labeled as taste.8283## Severity8485- **critical**: data loss, unintended irreversible action, unreadable core content, or sensitive information exposed in-frame86- **high**: blocks or badly degrades a core task, fails a required accessibility criterion, or breaks a required state87- **medium**: material friction, inconsistency, or ambiguous affordance88- **low/nit**: polish with limited user impact8990## Guardrails9192- Isolation is mandatory during review.93- Validate capture coverage before judging design.94- Real-account or sensitive screenshots are ephemeral: keep them outside version control and remove them according to project policy.95- Never commit raw captures by default. Only synthetic goldens may be committed after human ratification.96- The human owns final taste, brand direction, and golden-image approval.97- A screenshot cannot prove DOM semantics, keyboard behavior, screen-reader output, performance, or network correctness. Route those claims to appropriate tests.9899Select experts from [`roster.md`](roster.md). Keep the committee as small as the risk permits.