---
wraps: surface-qa
description: Run the consumer-side exit gate on a composed surface — dispatches the read-only surface-qa-agent seat; returns the completed VerifyProof (ship | hold).
argument-hint: "[url or surface] [key selectors]"
disable-model-invocation: false
user-invocable: true
---

Verify the composed surface named in the current request.

Dispatch the **surface-qa-agent** agent on the named surface/URL — the exit
gate runs ISOLATED from whatever context built the surface (generator ≠
critic). It runs the shipped probe (`scripts/adia-probe.mjs`: console/page
errors, bounding boxes, the deviceScaleFactor:2 capture), completes the
judgment half (`imageRead` carries what the pixels actually show; the a11y
row checked item by item), and returns the VerifyProof (surface-qa
§Deliverable) with verdict **ship | hold**.

Findings route back to the owning builder skill (screen-composition · data-wiring ·
shell-selection · host-wiring) — never fix inline from this command. No running
app or missing Playwright → the gate reports UNMEASURED with the reason,
never a silent pass. (Mid-build self-checks still invoke the `surface-qa`
skill inline; this command is the independent verdict at definition-of-done.)
