Autonomous multi-app QA sweep that drives template apps with Playwright MCP. Use only when the user explicitly runs /qa or asks for an end-to-end QA sweep. Do not load it for ordinary feature work, single-page checks, or one-off bug fixes.
68
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Autonomous QA testing that spins up template apps, tests them with Playwright in parallel, fixes issues, retests, and reports findings. Only alerts the user when blocked.
This is an explicitly requested sweep, not a default verification step. Do not run any part of it — dev servers, browser automation, tester agents — as follow-up to a normal code change.
/qa # test mail, calendar, content, forms
/qa --apps mail,forms # test specific apps
/qa --focus "test form submission and compose" # prioritize specific flowsQA can use the framework's built-in browser MCP capabilities instead of a hand-written mcp.config.json. The built-ins are off by default and are toggled through /_agent-native/mcp/builtin.
browser-playwright for automated QA sweeps: it runs npx -y @playwright/mcp@0.0.75.browser-chrome-devtools only when the test specifically needs to attach to a live Chrome session. It runs npx -y chrome-devtools-mcp@0.26.0 --autoConnect --no-usage-statistics and requires Chrome 144+ with remote debugging enabled. Do not assume it signs into the user's Chrome profile.computer-use runs npx -y computer-use-mcp@1.8.0 and is macOS-only.Args:
--apps — comma-separated app names (default: mail,calendar,content,forms)--focus — natural language guidance for what to prioritizeYou (the agent running this skill) are the orchestrator. Follow these steps in order.
Parse the user's invocation to determine:
For each app, check if required credentials exist:
| App | Check | Can test without? |
|---|---|---|
| forms | No credentials needed | Yes |
| content | No credentials needed (Notion is opt-in) | Yes |
| calendar | templates/calendar/.env has GOOGLE_CLIENT_ID present | Partially — local events work, Google sync won't |
templates/mail/.env has GOOGLE_CLIENT_ID present | Partially — UI renders, Gmail features won't |
Read each app's .env file (if it exists) only to check whether required names
are present. Never print, copy, summarize, paste, or pass .env values into
tester prompts, reports, screenshots, logs, or chat. If credentials are missing:
Start each app's dev server on a dedicated port using run_in_background:
| App | Port | Command |
|---|---|---|
| 9201 | cd templates/mail && PORT=9201 pnpm dev | |
| calendar | 9202 | cd templates/calendar && PORT=9202 pnpm dev |
| content | 9203 | cd templates/content && PORT=9203 pnpm dev |
| forms | 9204 | cd templates/forms && PORT=9204 pnpm dev |
Start all servers in parallel (multiple Bash calls with run_in_background: true).
Then verify each server is ready by polling with curl:
for i in {1..30}; do curl -s -o /dev/null -w "%{http_code}" http://localhost:9201 && break; sleep 1; doneIf a server fails to start within 30 seconds, skip that app and note it in the report.
For each app, read these files to understand what to test:
templates/<app>/app/routes/ or templates/<app>/app/routes.ts — discover all pagestemplates/<app>/CLAUDE.md — features, API routes, data modeltemplates/<app>/actions/ — domain operations the UI and agent sharetemplates/<app>/server/routes/api/ — route-only endpoints such as uploads, streaming, webhooks, and OAuth callbacksCombine with any --focus guidance to produce a test plan. The test plan is a numbered list of user-facing flows to verify. Example:
1. Home page loads without errors
2. Create a new item via the UI
3. Edit an existing item
4. Delete an item
5. Check all navigation links work
6. Verify no console errors on any page
7. Verify no failed network requestsCreate a team and spawn one tester agent per app, all in parallel:
TeamCreate: name="qa", description="QA testing sweep"Create one task per app:
TaskCreate: subject="QA test <app> on port <port>", description="<test plan>"Then spawn tester agents in parallel using the Agent tool. Each agent gets:
name: qa-<app> (e.g., qa-mail)team_name: qamode: autoAfter spawning testers, wait for their idle notifications and task updates.
Gather all tester reports from their task updates. Print a compiled summary:
# QA Summary — <date>
## Apps Tested: N
## Total Issues Found: N
## Fixed: N
## Needs Review: N
### Mail App
[tester report]
### Forms App
[tester report]
...Then shut down all teammates:
SendMessage to each tester: { type: "shutdown_request" }Use this as the prompt when spawning each tester agent via the Agent tool. Fill in the {{placeholders}}:
START OF TESTER PROMPT
You are a QA tester for the {{app_name}} app running at http://localhost:{{port}}.
Test the app thoroughly using Playwright MCP tools. Find bugs, fix them, retest. Report your findings.
You are on team "qa". Your name is "qa-{{app_name}}".
in_progress when you startcompleted when done, with your report in the description{{credential_status}}
{{test_plan}}
Use these Playwright MCP tools:
browser_navigate to http://localhost:{{port}}<path>browser_snapshot — returns an accessibility tree showing all visible elements with ref attributesbrowser_click with ref from the snapshotbrowser_type with ref and textbrowser_fill_form with ref and valuesbrowser_console_messages — look for errorsbrowser_network_requests — look for failed requests (4xx, 5xx)browser_wait_for when you need to wait for content to appearbrowser_take_screenshot when you want to capture the visual stateFor each test in your plan:
After completing all tests, do one more pass on any pages where you found issues to verify fixes didn't break other things.
Maximum 2 full passes. Don't loop forever.
Always start by navigating to http://localhost:{{port}}/ and taking a snapshot to verify the app is running.
If the app shows an error page or fails to load, check the dev server output and try to diagnose. If it's a missing dependency or config issue, report it and stop — don't spend time debugging infrastructure.
CRITICAL: You may ONLY modify files within templates/{{app_name}}/. If a bug requires changes to packages/core/ or any other template, report it as a finding but do NOT fix it.
After modifying any source file, run:
npx prettier --write <file>What is NOT a bug:
When you're done, update your task (via TaskUpdate) with status completed and set the description to your report:
## QA Report: {{app_name}}
### Summary: N found, N fixed, N needs review
#### Fixed
1. **Short description** — What file you changed and why
#### Needs Review
1. **Short description** — Why you couldn't fix it
#### Skipped (needs credentials)
1. **Feature name** — What credential is needed
#### Pages Tested
- /path (page name) — status (OK, N issues fixed, N needs review)END OF TESTER PROMPT
Kill the process on the port before starting:
lsof -ti :9201 | xargs kill -9 2>/dev/null; trueCommon causes:
node_modules — run pnpm install from root first.env file — some apps need one even if empty. Check .env.examplepnpm --filter @agent-native/core build firstThe Playwright MCP server must be configured in Claude Code's MCP settings. If browser tools aren't available, the tester agent should report "Playwright MCP tools not available" and stop.
After editing a file, wait 2-3 seconds. If the page doesn't update, try a hard refresh by navigating away and back. Vite HMR sometimes misses changes in server-side files — restart the dev server if needed.
This is a known issue. The tester should:
.env file exists and has the right variable names.env or data/.envOnly report variable names and presence/absence. Do not include secret values.
c1ee18b
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.