skills/browser-qa/SKILL.md
Use when you need lightweight browser QA for a web page, local HTML file, or app: inspect console errors, broken assets, keyboard/focus behavior, viewport readability, and publish evidence-backed findings JSON through a local HTML report viewer.
npx skillsauth add liatrio-labs/ai-prompts browser-qaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill for a focused, evidence-producing browser QA pass against a public URL, local page, or running web app. Browser automation drives the page; this skill defines which checks to run, what counts as evidence, how to classify results, where to store report data, and how to launch the local report viewer.
Keep the pass demo-sized. This is for quick confidence, reviewer proof, and actionable defect reports, not for full accessibility certification, cross-browser coverage, or CI replacement.
Use this skill when the user asks you to:
Do not use this skill for:
Load and use the agent-browser skill for browser mechanics before starting the QA pass. Confirm the browser automation path is available enough to navigate, inspect console/network state, and capture screenshots or snapshots.
This skill owns the QA judgment:
pass, warn, fail, or unknownFor demos or multi-agent work, start the agent-browser dashboard before the QA pass so the user can watch what browser sessions are doing in the background:
agent-browser dashboard start
The dashboard defaults to http://localhost:4848 and shows live browser viewports plus command activity for all active sessions. Use it when the user wants to observe agent browser behavior, during webinar demos, or when multiple agents may be using browser automation at the same time.
Prefer a named session for each QA pass so cleanup is precise and visible in the dashboard:
agent-browser --session browser-qa-<run-id> open <target-url>
Clean up browser sessions before finishing. Close the named session when possible:
agent-browser --session browser-qa-<run-id> close
If you are unsure which session you created, list active sessions and close only the ones from this task:
agent-browser session list
agent-browser --session <session-name> close
Use agent-browser close --all only when you are confident no unrelated browser automation should remain open. If you started the dashboard only for the current task and the user no longer needs it, stop it too:
agent-browser dashboard stop
Do not rely on late JavaScript monkey-patching or visual error-overlay inspection for the console check. agent-browser has built-in buffers for console messages, uncaught page errors, and network requests. Clear those buffers before opening the target, then read them after the page load and critical path.
Use this sequence for every QA run:
SESSION=browser-qa-<run-id>
TARGET_URL=https://example.com
agent-browser --session "$SESSION" open about:blank
agent-browser --session "$SESSION" console --clear
agent-browser --session "$SESSION" errors --clear
agent-browser --session "$SESSION" network requests --clear
agent-browser --session "$SESSION" open "$TARGET_URL"
agent-browser --session "$SESSION" wait --load networkidle
# Exercise the critical path here, then collect evidence.
agent-browser --session "$SESSION" errors --json
agent-browser --session "$SESSION" console --json
agent-browser --session "$SESSION" network requests --json
Classify console/network checks from those command outputs:
fail: uncaught JavaScript exceptions, page errors, or target-resource failures that break required behavior.warn: relevant console warnings, blocked analytics/third-party resources, or suspicious non-blocking target-resource failures.pass: buffers were inspected and no relevant errors or failed target resources were found.unknown: only when these commands fail or the browser provider cannot expose the buffers.Keep local report-viewer noise out of the target findings. For example, ignore 127.0.0.1:10891/favicon.ico when the target is https://example.com, but include failed requests from the target origin or required app assets.
Before opening the browser, identify the smallest useful QA target:
If the target is missing and cannot be inferred, ask one question. Otherwise proceed with the obvious target and state any assumption in the final report.
All browser-qa runs live under one system temp folder:
/tmp/browser-qa-reports/
20260528-154216-example-com/
findings.json
screenshot-home.png
screenshot-focus.png
Use the platform temp directory, not the repository, for run outputs:
python - <<'PY'
import tempfile
from pathlib import Path
print(Path(tempfile.gettempdir()) / 'browser-qa-reports')
PY
Create one subfolder per QA run. Use a stable, readable run id such as YYYYMMDD-HHMMSS-slug. Keep screenshots and supporting artifacts in the same run subfolder. In findings.json, artifact values should be filenames or relative paths inside that run folder, for example "screenshot": "screenshot-home.png".
agent-browser and follow its installed guidance for navigation, snapshots, console/network inspection, and screenshots.agent-browser dashboard start and use http://localhost:4848 to watch live sessions.browser-qa-<run-id> when running browser commands.agent-browser console, page-error, and network-request buffers before opening the target so load-time errors are captured from the start.Exercise the main flow before broad checks. For each step:
agent-browser errors --json, agent-browser console --json, and agent-browser network requests --json before writing findings.Use references/checks.md for check definitions. Keep the default pass to:
Preserve unknown when automation cannot prove a result.
Before rendering or summarizing, produce findings.json matching references/evidence-contract.md in the run subfolder under /tmp/browser-qa-reports.
Minimum rule: every non-pass check must include evidence. Evidence can be console text, network URL/status, screenshot path, DOM/snapshot detail, or a manual note.
Validate the JSON before reporting:
uv run skills/browser-qa/scripts/validate-findings.py /tmp/browser-qa-reports/<run-id>/findings.json
Fix the JSON until validation passes.
The report viewer is static HTML served by a tiny Python server in this skill. It lists every findings.json under /tmp/browser-qa-reports and lets the user switch runs from a dropdown.
Check whether the server is already running before starting another one:
python - <<'PY'
from urllib.request import urlopen
try:
print(urlopen('http://127.0.0.1:10891/api/reports', timeout=1).status)
except Exception:
raise SystemExit(1)
PY
If that check fails, start it in the background from the repository root or skill folder:
uv run skills/browser-qa/scripts/serve-report.py --port 10891
If the server is already running, do not restart it. Just use the existing server.
Give the user a link that opens the latest run directly:
http://127.0.0.1:10891/?report=<run-id>
Also include the run folder path so artifacts are easy to inspect locally.
Before finalizing, close the task-scoped browser session so the user is not left with orphaned agent-browser sessions:
agent-browser --session browser-qa-<run-id> close
Then verify there are no sessions from this QA run still active:
agent-browser session list
If you started the dashboard only for this run and the user does not need to keep watching background browser activity, stop it with agent-browser dashboard stop. Do not stop a dashboard the user explicitly wants to keep open for a demo.
pass, warn, fail, or unknown.findings.json path.?report=<run-id>.browser-qa-reports directory./api/reports; only start the server if the probe fails.agent-browser console, agent-browser errors, and agent-browser network requests; only mark unknown if those commands fail or the provider lacks the buffers.about:blank before target navigation so hydration/load-time errors are not missed.unknown when browser tooling cannot inspect a surface.agent-browser session list to verify cleanup.Before finishing, confirm:
agent-browser was loaded or a browser tooling fallback was explicitly noted.agent-browser console, page-error, and network-request buffers were cleared before target navigation.unknown.agent-browser errors --json, agent-browser console --json, and agent-browser network requests --json outputs were checked after the critical path./tmp/browser-qa-reports/<run-id>/findings.json.validate-findings.py.http://127.0.0.1:10891/?report=<run-id>.testing
Interactive GitHub Epic planner. Plans one milestone at a time. The first epic is always Shell (scaffold + CI with a fixed set of stories). Each subsequent epic is defined through operator dialogue. Use /plan-issue to create the individual stories once an epic is defined.
data-ai
Provision DNS records for liatr.io subdomains in the liatrio/liatrio-external-dns repository. Use when adding, modifying, or removing DNS CNAME records, A records, or other Route53 records for liatr.io or k8s-ignite.com domains. Triggers on requests like 'add a domain', 'create a subdomain', 'point X.liatr.io to Y', or 'set up DNS for a new site'.
development
Provides concise guidance for using uv (Python package manager), including project workflows, pip-compatible commands, Python version management, and PEP 723 inline script dependencies. Use when users mention uv, uv run, inline dependencies, PEP 723, or Python dependency/project management.
development
Manage local development environments with Tilt. Use when working with projects that run services via Tilt (indicated by presence of Tiltfile), including checking service status, viewing logs, troubleshooting connectivity issues, or managing the Tilt stack. Essential for projects using Tiltfile with local_resource for orchestrating backend, frontend, and other services.