browser-qa
Use to exercise the running app in a real browser — after UI changes, before ship, or when the user asks to QA the site, smoke-test a branch, or check "does…
Skill by AbdurRafay2004
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/abdurrafay2004-browser-qa
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, design, testing
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 26, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/browser-qa
What's inside
- Skill name
browser-qa- Description
- Use to exercise the running app in a real browser — after UI changes, before ship, or when the user asks to QA the site, smoke-test a branch, or check "does it actually work". Drives affected routes headlessly via Playwright, captures console errors, failed requests, and screenshots, and produces a report with a health score. Report-only — it finds bugs, it never fixes them.
- License
- MIT
- Instructions
- 212 lines in SKILL.md · view on GitHub
Before installing
- Instructions call the network
Files (1)
- SKILL.md
SKILL.md (first lines)
# Browser QA: exercise the running app, report what breaks
Part of the **Verify** phase — see the `workflow` skill for tiers and sequencing.
You are a QA engineer. Test the app like a real user — load the pages this change
touched, click what a user would click, watch the console. Produce a report with
evidence. **NEVER fix anything.** Fixes go through the normal Build/Verify loop
(see Report-only discipline at the end).
## Tier plan
Match effort to the tier the `workflow` skill assigned (or infer from the change's risk):
| Tier | What to do |
|------|------------|
| **T1** (typo, comment, config-only) | Skip browser QA entirely. Say so and stop. |
| **T2** (normal features, including refactors; bug fixes) | Smoke the affected routes only: load, console clean, no failed requests, screenshot, one DOM assert per route. |
| **T3** (money, auth, user data, migrations — or pre-ship of such work) | Full plan: affected routes **plus** adjacent routes and the top navigation targets, per-page checklist on each, health score with all categories. |
Every run — even T2 — ends with a health score and the plain-language summary.
## Scope: derive routes from the diff
Test what changed, not the whole site. From `git diff main...HEAD --name-only` and
`git log main..HEAD --oneline`, map changed files to routes:
> A multi-route QA run is token-heavy — a delegate trigger. Ask the user
> delegate-or-inline before running it (`delegate` skill).
| Changed file | Routes to test |
|---|---|
| Route/page file (`app/**/page.tsx`, `pages/foo.tsx`, `src/pages/foo.astro`) | The route it serves (`/foo`) |
| Shared component | Grep for importers; test the routes that render them |
| Layout, global CSS, providers | Every route inherits it — test homepage + one route per layout |
| API handler (`app/api/**`, `src/api/**`) | Hit the endpoint directly (fetch in the script or `curl`), plus the page that calls it |
| Model/service/lib code | Routes whose pages call into it |
| Backend/config/infra with no obvious route | Do NOT skip — smoke homepage + top 5 nav targets; backend changes still break pages |
Cross-reference commit messages to understand *intent*: what is this change supposed
to do? Verify it does that, not just that pages load.
## Driving the browser
**Prefer the built-in `verify` and `run` skills** when available in this environment:
`run` knows how to launch this project's app; `verify` drives a changed flow end-to-end.
If they cover the need, use them and fold their observations into the report below.
If the host supplies browser tools, prefer those and adapt the checks and
evidence below to that API. In Codex, follow the installed browser skill;
don't install Playwright or drive it through Bash when the host requires its
own browser tools.
Otherwise, drive Chromium yourself via Playwright through Bash.
**1. Get the app running.** Check common dev ports first — Next.js `:3000`,
Vite `:5173`, Astro `:4321`:
```bash
for p in 3000 5173 4321; do curl -sf -o /dev/null "http://localhost:$p" && echo "UP :$p"; done
```
If nothing is up, start `npm run dev` in the background, wait for the ready line,
and note the port. If the port can't be determined, ask the user for the URL.
**2. Check Playwright is available.**
```bash
node -e "require.resolve('playwright')" 2>/dev/null && echo READY || echo MISSING
```
If MISSING, ask the user once: "Browser QA needs Playwright (dev-only dependency).
OK to run `npm i -D playwright && npx playwright install chromium`?" Wait for a yes
before installing. Never install silently.
**3. Set up an evidence directory** in the session scratchpad (never inside the repo):
```bash
QA_OUT="$SCRATCHPAD/browser-qa-$(date +%Y%m%d-%H%M%S)" # use this session's scratchpad dir
mkdir -p "$QA_OUT"
```
**4. Write the smoke script** to `$QA_OUT/qa-smoke.mjs` and run it with the route list:
```js
// qa-smoke.mjs — node qa-smoke.mjs <baseURL> [path ...] (QA_OUT=screenshot dir)
import { chromium } from 'playwright';
const [base, ...paths] = process.argv.slice(2);
const routes = paths.length ? paths.map(p => new URL(p, base).href) : [base];
const out = process.env.QA_OUT || '.';
const browser = await chromium.launch();
const page = await browser.newPage();
const findings = [];
page.on('console', m => { if (m.type() === 'error') findings.push(`[console] ${page.url()} :: ${m.text()}`); });
page.on('pageerror', e => findings.push(`[exception] ${page.url()} :: ${e.message}`));
page.on('requestfailed', r => findings.push(`[netfail] ${r.url()} :: ${r.failure()?.errorText}`));
page.on('response', r => { if (r.status() >= 400) findings.push(`[http ${r.status()}] ${r.url()}`); });
for (const url of routes) {
const res = await page.goto(url, { waitUntil: 'networkidle', timeout: 15000 })
.catch(e => { findings.push(`[nav] ${url} :: ${e.message}`); return null; });
if (!res) continue;
const slug = new URL(url).pathname.replace(/\W+/g, '-').replace(/^-|-$/g, '') || 'home';
await page.screenshot({ path: `${out}/${slug}.png`, fullPage: true });
const body = (await page.textContent('body')) ?? '';
if (!body.trim()) findings.push(`[blank] ${url} :: body rendered empty`);
console.log(`VISITED ${url} -> ${slug}.png (status ${res.status()})`);
}
await browser.close();
console.log(findings.length ? findings.join('\n') : 'NO FINDINGS');
```
```bash
QA_OUT="$QA_OUT" node "$QA_OUT/qa-smoke.mjs" http://localhost:3000 / /pricing /dashboard
```
**Per-route DOM asserts and interactions:** extend a copy of the script for the
specific change — e.g. `await page.getByText('Saved!').waitFor({ timeout: 5000 })`
after clicking submit, or `page.getByRole('button', { name: 'Add' }).click()` then
re-screenshot. One throwaway script per flow is fine; they all live in `$QA_OUT`.
For SPAs, click links in-page rather than only `goto` — client-side routing bugsFrom AbdurRafay2004/handoff, MIT.
More from AbdurRafay2004/handoff
- 0.614score
security
AbdurRafay2004
Use for a full security audit — T3 verify gate (money, auth, user data, migrations), pre-launch check, or when the user asks to audit the codebase for…
SkillAFreshness: A★ 4Claude Code +9 - 0.614score
verify-done
AbdurRafay2004
Use when about to claim work is complete, fixed, or passing — before committing, opening a PR, or telling the user it works.
SkillAFreshness: A★ 4Claude Code +9 - 0.614score
ship
AbdurRafay2004
Use when work is verified and ready to leave the machine — branch/PR/merge/deploy/smoke-check.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
workflow
AbdurRafay2004
The operating pipeline for all development work — 6 phases (Brief, Plan, Build, Verify, Ship, Learn) with risk tiers that decide how much process a task gets.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
delegate
AbdurRafay2004
Use when a task would flood the main context window — broad searches, verbose test/build output, 2+ independent parallel tasks, or an isolated large workstream.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
brief
AbdurRafay2004
Use when starting a new feature or product request — clarifies scope and decisions before implementation.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
plan
AbdurRafay2004
Use when a task is T2/T3 — before building a feature that spans multiple files or carries risk.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
setup
AbdurRafay2004
Scaffold the handoff project-memory system into THIS repository (new or existing) — copies the template tree into .handoff/, then runs a guided discovery pass…
SkillAFreshness: A★ 4Claude Code +9 - 0.524score
tdd
AbdurRafay2004
Use when building any T3 feature or bugfix, recommended for T2 on the affected path — write the failing test before the implementation, one behavior at a…
SkillCFreshness: C★ 4Claude Code +9 - 0.524score
design
AbdurRafay2004
Use when designing or improving a module's interface, deciding where a seam goes, making code more testable or navigable, or pinning down domain terminology.
SkillCFreshness: C★ 4Claude Code +9 - 0.519score
architecture
AbdurRafay2004
Scan the codebase for architectural friction and propose deepening opportunities as candidate cards, then interrogate the chosen one into a decision.
SkillCFreshness: C★ 4Claude Code +9 - 0.519score
learn
AbdurRafay2004
Use at the end of T3 work, after an incident/rollback, or when the user asks for a retro — turns what happened into recorded learnings that live in the repo…
SkillCFreshness: C★ 4Claude Code +9
Signals
- Stars
- 4
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 8, 2026 (21 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/AbdurRafay2004/handoff
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from AbdurRafay2004
- 0.614score
verify-done
AbdurRafay2004
Use when about to claim work is complete, fixed, or passing — before committing, opening a PR, or telling the user it works.
SkillAFreshness: A★ 4Claude Code +9 - 0.614score
ship
AbdurRafay2004
Use when work is verified and ready to leave the machine — branch/PR/merge/deploy/smoke-check.
SkillAFreshness: A★ 4Claude Code +9 - 0.614score
security
AbdurRafay2004
Use for a full security audit — T3 verify gate (money, auth, user data, migrations), pre-launch check, or when the user asks to audit the codebase for…
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
brief
AbdurRafay2004
Use when starting a new feature or product request — clarifies scope and decisions before implementation.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
workflow
AbdurRafay2004
The operating pipeline for all development work — 6 phases (Brief, Plan, Build, Verify, Ship, Learn) with risk tiers that decide how much process a task gets.
SkillAFreshness: A★ 4Claude Code +9 - 0.609score
delegate
AbdurRafay2004
Use when a task would flood the main context window — broad searches, verbose test/build output, 2+ independent parallel tasks, or an isolated large workstream.
SkillAFreshness: A★ 4Claude Code +9
Cite this page
browser-qa skill. Agent Mart. https://agentmart.dev/skills/abdurrafay2004-browser-qa (last updated 2026-10-24)