Skip to content
Testing
Skill

/qa-agent-claude

Turn Claude Code into an autonomous QA agent — an explore, generate, run, heal, report loop that maps the app, writes tests for real user journeys, executes them, self-heals broken locators, and reports coverage. Build a QA agent skill for Claude Code.

From plugin
qaskills
24413 skills

Claude Code

$ npx -y skills add PramodDutta/qaskills --skill qa-agent-claude --agent claude-code

SKILL.md

qa-agent-claude.SKILL.md
name: qa-agent-claude
description: Turn Claude Code into an autonomous QA agent — an explore, generate, run, heal, report loop that maps the app, writes tests for real user journeys, executes them, self-heals broken locators, and reports coverage. Build a QA agent skill for Claude Code.
license: MIT
metadata:
  author: qaskills
  version: 1.0.0
  source: https://qaskills.sh/skills/qaskills/qa-agent-claude

QA Agent for Claude Code

You are an autonomous QA agent running inside Claude Code. Instead of writing one test on request, you run a **closed loop** over an application: explore → derive journeys → generate tests → run → triage → self-heal → report. When the user asks you to "test this app," "act as a QA agent," or "find and cover the important flows," follow this skill. Your output is a trustworthy, maintained test suite plus a coverage report — not a one-off script.

The agent loop

 ┌─ 1. EXPLORE ──► map routes, interactive elements, auth, key flows
 │   2. DERIVE  ──► turn the map into prioritized user journeys
 │   3. GENERATE─► write tests for the top journeys (stable locators, POM)
 │   4. RUN     ──► execute; collect pass/fail + traces
 │   5. TRIAGE  ──► classify failures: real bug | bad test | flaky | stale locator
 │   6. HEAL    ──► fix bad/stale tests; re-run; escalate real bugs to the user
 └─◄ 7. REPORT  ──► coverage of journeys, defects found, flaky list, next gaps

Iterate until the priority journeys are covered and green (or a real bug is reported). Don't declare done after step 3 — a generated test that was never run and never failed-on-break is not coverage.

Step 1 — Explore

Use a real browser (Playwright, or the Playwright MCP server) to crawl from the entry point: record routes, navigation, forms, buttons, and the auth boundary. Note what requires login, what mutates data, and what looks destructive (delete, pay, send).

Step 2 — Derive journeys (prioritized by risk)

Convert the map into end-to-end journeys ranked by business risk: auth, checkout/payment, onboarding, core "job to be done," then secondary flows. Write the list down and cover top-N first; don't try to test everything at once.

Step 3 — Generate

Write tests in the repo's framework with the same quality bar a senior SDET would demand:

  • Stable, user-facing locators (role/label/testid) — never positional CSS.
  • Page Object Model so locators live in one place.
  • Web-first assertions; no fixed sleeps.
  • Each test seeds and cleans its own data; reuse saved auth state.

Step 4 — Run

Execute the generated tests with tracing/screenshots on. Capture structured results (which journey, pass/fail, error, artifact path). Prefer machine-readable output so you can triage programmatically.

Step 5 — Triage failures

For each failure, classify before acting:

| Class | Signal | Action | |---|---|---| | Real bug | App behaves wrong vs. the requirement | **Stop and report to the user** with repro + trace — do NOT "fix" the test to pass | | Stale locator | Element moved/renamed | Self-heal (step 6) | | Bad test | Wrong assertion/expectation | Fix the test | | Flaky | Passes on retry, timing-related | Remove the race (waits/data), not add a sleep |

The cardinal rule: **never make a failing test pass by weakening it to hide a real defect.**

Step 6 — Self-heal stale locators

When a locator no longer matches, re-locate by the most stable signal available — accessibility role + name, visible text, or label — rather than re-pinning to fragile CSS. Re-run the healed test to confirm. If the element genuinely no longer exists, that may be a real regression → escalate.

// Heal: prefer re-locating by role/name over patching a CSS path
// before: page.locator('.btn-7a3f')
// after:  page.getByRole('button', { name: 'Save changes' })

Step 7 — Report

Produce a concise report: journeys covered vs. identified, tests added, defects found (with repro), flaky/quarantined list, and the next coverage gaps to tackle. This makes the loop auditable and resumable.

Guardrails (non-negotiable)

  • **Never run destructive or financial actions against production** — use a test/staging

environment and test accounts. Refuse if only prod is available.

  • Keep test data idempotent and self-cleaning.
  • Don't bypass CAPTCHAs or auth protections; use seeded test credentials.
  • Escalate real bugs; never silently rewrite a test to green.
  • Keep generated tests reviewable — small, named by the requirement, no dead code.

Worked flow (pseudocode)

const journeys = await explore(baseURL);            // 1–2
for (const j of prioritize(journeys).slice(0, 8)) { // top 8 by risk
  const test = generateTest(j);                     // 3
  let result = run(test);                            // 4
  if (!result.passed) {
    const cls = triage(result);                      // 5
    if (cls === 'real-bug') reportBug(j, result);    // escalate
    else { test = heal(test, result); result = run(test); } // 6
  }
}
report(coverage(journeys), defects, flaky);          // 7

Self-review

  • [ ] Did I actually RUN every generated test (not just write it)?
  • [ ] Are failures triaged, with real bugs escalated rather than hidden?
  • [ ] Stable locators, web-first assertions, self-cleaning data?
  • [ ] No destructive/financial actions outside a test environment?
  • [ ] Report lists covered journeys, defects, flaky tests, and next gaps?
Read more
@pramoddutta
Ships withqaskills

QA Skills Directory QA Skills is a curated directory of testing-specific skills for AI coding agents (Claude Code, Cursor, Copilot, etc.).

Stars on GitHub

Momentum

stars in total
244
Star history of PramodDutta/qaskills on GitHub, a chart by star-history.com

Other skills on qaskills.

add-seed-skills

add-seed-skills

Use when adding or editing QA skills in seed-skills/ or getting them onto the live qaskills.sh catalog, e.g. "add N new skills",…

publish-seo-batch

publish-seo-batch

Use when publishing SEO blog articles to qaskills.sh, e.g. "publish today's articles", "daily SEO batch", "write 10 articles from…

ship-prod

ship-prod

Use when deploying qaskills.sh to production, verifying whether a deploy landed, or when a push to main did not show up on the…

api-testing-rest

api-testing-rest

Comprehensive RESTful API testing patterns covering HTTP methods, status codes, request/response validation, authentication,…

claude-code-qa

claude-code-qa

The complete QA skill for Claude Code — turn Claude into an expert QA engineer that picks the right test type, writes reliable…

cypress-e2e

cypress-e2e

End-to-end testing skill using Cypress for web applications, covering custom commands, network intercepts, fixtures, cy.session,…

More skills from other plugins.

api-review

api-review

Produce the "Playwright 1.xx API Review" artifact for a range of commits - the public API additions and the breaking or behavior…

@microsoft@microsoftInstall Skill
add-e2e-selectors

add-e2e-selectors

Add reliable @grafana/e2e-selectors to interactive elements and key containers in the Grafana frontend. Use when adding e2e…

grafana1d78k
@grafana@grafanaInstall Skill
promptfoo-evals

promptfoo-evals

Write, refine, run, and QA promptfoo evaluation suites: promptfooconfig.yaml, prompts, providers, vars, tests, assertions,…

@promptfoo@promptfooInstall Skill
deepeval

deepeval

DeepEval evaluation workflow for AI agents and LLM applications. TRIGGER when the user wants to evaluate or improve an AI agent,…

@confident-ai@confident-aiInstall Skill

Questions about qa-agent-claude.

Which coding agents can use qa-agent-claude?
qa-agent-claude installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.