Verify application UI changes with uploaded screenshot or video artifacts
61
71%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./packages/sandbox-runtime/src/sandbox_runtime/skills/visual-verification/SKILL.mdUse this skill when the goal is to verify UI changes inside the application and return visual evidence in the Open-Inspect session.
agent-browser remains the low-level browser tool. This skill defines the workflow contract for
using it reliably.
upload-media is a bash command installed on PATH. Run it with your Bash tool, not as an MCP
tool or tool binding. For videos, use agent-browser record directly, then probe and upload the
resulting MP4 with upload-media.
The task is not complete until all of these are true:
artifactId is reported back to the user.agent-browser open.agent-browser set viewport <width> <height>.If the screenshot already exists as a file — for example, captured via Playwright MCP
(playwright_browser_take_screenshot), a manual capture, or any other tool — skip the
agent-browser steps and upload the file directly:
upload-media /path/to/existing-screenshot.png \
--caption "Description of what was captured" \
--source-url "$URL"Add --full-page or --viewport '{"width":1512,"height":982}' as appropriate. The same reporting
template and guardrails below still apply.
For a dedicated upload-only workflow, see the upload-screenshot skill.
Viewport capture:
agent-browser open "$URL" && \
agent-browser set viewport 1512 982 && \
agent-browser wait 2000 && \
agent-browser screenshot --json /tmp/verify.png && \
upload-media /tmp/verify.png \
--caption "UI verification screenshot" \
--source-url "$URL" \
--viewport '{"width":1512,"height":982}'Full-page capture:
agent-browser open "$URL" && \
agent-browser set viewport 1512 982 && \
agent-browser wait 2000 && \
agent-browser screenshot --full --json /tmp/verify-full.png && \
upload-media /tmp/verify-full.png \
--caption "Full-page verification screenshot" \
--source-url "$URL" \
--viewport '{"width":1512,"height":982}' \
--full-pageAnnotated capture for review/debugging:
agent-browser open "$URL" && \
agent-browser wait 2000 && \
agent-browser screenshot --annotate --json /tmp/verify-annotated.png && \
upload-media /tmp/verify-annotated.png \
--caption "Annotated UI verification screenshot" \
--source-url "$URL" \
--annotatedVideo recording for interaction flows:
set -e
agent-browser open "$URL"
agent-browser set viewport 1512 982
agent-browser snapshot -i
STARTED_AT_MS=$(date +%s%3N)
agent-browser record start /tmp/opencode/menu-recording.mp4
recording_started=1
cleanup_recording() {
if [ "${recording_started:-0}" = "1" ]; then
agent-browser record stop || true
fi
}
trap cleanup_recording EXIT
interaction_exit_code=0
agent-browser click "[data-testid=settings]" || interaction_exit_code=$?
agent-browser wait 1000 || interaction_exit_code=$?
agent-browser record stop
recording_started=0
trap - EXIT
ENDED_AT_MS=$(date +%s%3N)
PROBE_JSON=$(ffprobe -v error -print_format json -show_streams -show_format /tmp/opencode/menu-recording.mp4)
DURATION_MS=$(node -e 'const p=JSON.parse(process.argv[1]); const v=(p.streams||[]).find((s)=>s.codec_type==="video")||{}; const d=Number(v.duration ?? p.format?.duration); console.log(Math.max(1, Math.round(d * 1000)));' "$PROBE_JSON")
DIMENSIONS=$(node -e 'const p=JSON.parse(process.argv[1]); const v=(p.streams||[]).find((s)=>s.codec_type==="video")||{}; console.log(JSON.stringify({width:Number(v.width),height:Number(v.height)}));' "$PROBE_JSON")
upload-media /tmp/opencode/menu-recording.mp4 \
--artifact-type video \
--caption "Menu interaction recording" \
--source-url "$URL" \
--duration-ms "$DURATION_MS" \
--recording-started-at "$STARTED_AT_MS" \
--recording-ended-at "$ENDED_AT_MS" \
--dimensions "$DIMENSIONS" \
--truncated false \
--has-audio false
exit "$interaction_exit_code"Include the following in the final response:
Example:
Verified the updated settings page header.
Capture mode: viewport
Viewport: 1512x982
Source: http://127.0.0.1:3000/settings
Uploaded artifact: abc123upload-media in a later prompt; it is prompt-scoped.agent-browser record stop if a recording was
started.ffprobe; do not reuse the
requested viewport as video dimensions.[data-testid=...], [data-clear-completed], or #todo-title.
Run agent-browser snapshot -i before recording when selectors or accessible names are uncertain.agent-browseragent-browser directly for open-ended browsing, debugging, auth flows, snapshots, and custom
inspection.visual-verification when the deliverable is proof that a UI change works and the user should
receive an uploaded screenshot or video artifact.52af550
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.