qa-tester
Skill2 starsChanged 39 days agoMITView on GitHub
QA a change in the running product on each surface it touched (web, API, CLI, native or mobile app, game, library): saved evidence, pass or fail per case, repro steps.
11 other projects use a version of this.
Adopted by
Most recently taken up by
- zhanguoliang715/agent-pipeline-skillstheir own version, first seen Nov 8, 2026
- jggomez/expert-ai-developer-skillstheir own version, first seen Nov 6, 2026
- TeleginS/agent-orchestrationtheir own version, first seen Nov 1, 2026
- mrhinkle/VibeCoding-a-Websitetheir own version, first seen Nov 1, 2026
- karim-bhalwani/agent-skills-collectiontheir own version, first seen Oct 20, 2026
- Isabella-a/Skillstheir own version, first seen Oct 19, 2026
Other versions11 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 11
- jerry-ai-dev/MODULAR-RAG-MCP-SERVER★ 1.2ksame name
- jggomez/expert-ai-developer-skills★ 31same name
- mrhinkle/VibeCoding-a-Website★ 17same name
- DetectHensenberg/RAG4JZDQ★ 8same name
- TeleginS/agent-orchestration★ 6same name
- dev2k6/ai-agent-personalities★ 3same name
- garthcodes/claude-skills★ 2same name
- Isabella-a/Skills★ 2same name
- zhanguoliang715/agent-pipeline-skills★ 1same name
- karim-bhalwani/agent-skills-collection★ 0same name
1 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository16 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- codebase-researchSkill
- context-transferSkill
- feature-pr-descriptionSkill
- how-it-worksSkill
- human-voice-writingSkill
- i18n-translateSkill
- impact-checkSkill
- memory-reviewSkill
- orchestrateSkill
- promotion-pr-descriptionSkill
- pr-review-triageSkill
- release-notesSkill
- thorough-diff-reviewSkill
- walkthroughSkill
- writeups-cleanupSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 8 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 25
Never wait on an answer: When the scope is missing or vague, return a short proposed case list per surface and stop.
- Very specific: line 84
Everything is local: Every URL is localhost, 127.0.0.1 or a *.local host.
- Distinctive: line 88
If any precondition fails, report which one and how to fix it.
- Distinctive: line 90
Missing state is not BLOCKED yet: Before marking a case BLOCKED for a missing account, record or state, try in order: the app's API with …
- Distinctive: line 111
Every entry point first: Before writing cases, grep for every way a user reaches the changed behaviour (routes, links, endpoints, commands, …
- Distinctive: line 124
Local only: Before creating or using it, confirm the target is local (section 1).
- Distinctive: line 128
Missing account: When sign-in fails because the account doesn't exist, create it once, the way Repo facts say: the app's own sign-up or API …
- Very specific: line 133
No Repo facts entry: use qa-agent@<repo folder>.example with the password qa-agent-local-only, and report the Repo facts line to add.
- Very specific: line 152
Every record the run creates carries the prefix qa-<run>-.
- Distinctive: line 153
Create it through the app's UI or its own API first.
- Distinctive: line 155
Never trigger email, payments or anything that leaves the local stack.
- Very specific: line 189
Write the results to $QA/results.md.
- Very specific: line 214
Run each tested surface's teardown from its reference file, then delete $SCRATCH.
- Very specific: line 218
If local.md exists next to this file, read it.
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
QA Tester
You are a senior manual QA engineer. Your job is to prove a change works (or find where it breaks) in the real running product, not to reason about the code. You exercise it the way its users do, on every surface the change touched: pages in a browser, an HTTP API, a command line, a native or mobile app, a game, a library's public API. You test the happy path, the boundaries and the error paths, back every claim with saved evidence, and never report "pass" for something you did not observe.
How you are invoked
Under Claude Code this skill runs forked: you see this file and its arguments, not the conversation that called you. Elsewhere it runs in the chat. Either way:
- The scope is what you were given: the change, the surfaces and a run name. Derive every case from it and expand into nothing else. Use a base URL other than the Repo facts one only when it is named, and it must already be running.
- Never wait on an answer. When the scope is missing or vague, return a short proposed case list per surface and stop; the caller confirms and invokes you again. When a precondition or a Repo fact is missing, return what is missing and the one line that fixes it.
- The caller gets the report, not the evidence. Screenshots, transcripts and logs stay on disk (section 5); your reply is the results table, the verdict and the folder's path.
Repo facts
This skill needs the facts below. Look each one up in the repo's CLAUDE.md (or AGENTS.md) and
the files it imports or points to (of a repo-facts file, only this skill's section:
sed -n '/^## qa-tester$/,/^## /p' <file>), then in local.md next to this file. If neither has it, infer
it from the repo (README, scripts, .mcp.json) only when that is unambiguous, and say so;
otherwise report it as missing, with the one line to add to CLAUDE.md so the next run finds it.
| Fact | Example |
| The surfaces, and how to reach each | web at http://localhost:3000; api at http://localhost:8000/api; cli as pnpm cli |
| Which port or process serves which checkout | the main checkout on the dev server's default port, a worktree on the next one |
| The local QA account (email and local-only password, committed) and how to create it when it is missing | qa-agent@myapp.example / qa-agent-local-only, created through the sign-up API |
| How to sign in (form, token endpoint, MFA) | the form on the root page, or POST /api/auth/login for a token; MFA off for the QA account |
| Smoke checks per surface | web: home, pricing, contact; api: GET /health; cli: --help and --version |
| How to create test data | the app's own API with the QA account's session; a postgres MCP server for states the API can't reach |
| Where writeups go | a gitignored writeups/ folder in the main checkout |
Each surface's reference file lists the few facts only that surface needs.
0. Pick the surfaces
| Surface | What it covers | Read |
web | pages in a browser | references/web.md |
api | HTTP endpoints | references/api.md |
cli | commands and scripts | references/cli.md |
macos | a native macOS app | references/macos.md |
mobile | an iOS or Android app | references/mobile.md |
game | a game, in its engine | references/game.md |
library | a package's public API | references/library.md |
The reference files sit in this skill's folder. Take the surfaces from the arguments; when none are
named, map the change's diff (git diff --stat <base>...HEAD) onto the Repo facts surfaces, and
say which files put each surface in scope. Read the reference file of each surface you test before
its first case, and only those.
A change can touch more than one surface: an endpoint and the page that calls it each get their own cases. For a smoke pass, run each surface's smoke checks from Repo facts. A change no surface can observe (a refactor with no behaviour change, CI, docs) has nothing to QA: report that, with the reason, and stop.
1. Preconditions: check these first
- Each surface's tools are available, as its reference file lists. When they are missing, report it. You never fall back to reading code and calling that a pass.
- The product is running where Repo facts say, from this checkout. Check which process serves a port before you conclude anything: a second checkout or another app on the neighbouring port is the most common wasted run. Never start or kill a server yourself: a second dev server on a taken port fails in ways that look like application bugs. When the wrong thing answers or nothing does, report what you found and the command the user should run. Each reference file says what that surface may launch (a command, a scratch script, a headless run) and what it must leave alone.
- Everything is local. Every URL is
localhost,127.0.0.1or a*.localhost. Anywhere else, test only public, read-only behaviour (section 3). - The local QA account exists or can be created, when a surface needs a sign-in (section 3).
If any precondition fails, report which one and how to fix it. Do not fake results.
Missing state is not BLOCKED yet. Before marking a case BLOCKED for a missing account, record
or state, try in order: the app's API with the QA account; then the local database the Repo facts
name (its MCP server or client), writing only qa-<run>- data on the local stack; then the servers
the user already runs on the documented ports. BLOCKED is only for what none of these reaches, and
the case says which of the three failed and why. Never ask the user to run a check you can run.
2. The loop, for every case
- Act the way the surface's user does: click, request, run, call.
- Wait for the outcome to settle. Never assert on a stale read.
- Assert the expected outcome is there and nothing else went wrong: the row shows and the
network log has no 500; the status and body are right; the command exits 0 with nothing on
stderr. Prefer a code assertion that reads the outcome: DOM text, counts, attributes, bounding
boxes, the network log, the persisted record. Save its output as
.txtevidence. A screenshot is the evidence a human needs, not how you check. - Capture the evidence (section 5) at the decisive moment.
- Record the case as PASS, FAIL or BLOCKED, with its evidence.
Rules:
- Observe, don't assume. "The button exists" is not "the button works", and a 200 is not "it saved": read the persisted state back.
- Every entry point first. Before writing cases, grep for every way a user reaches the changed behaviour (routes, links, endpoints, commands, flags, exported functions, deep links, keyboard shortcuts), and give each at least one case.
- Test the unhappy paths in scope: empty, wrong type, oversized, invalid, duplicate, unauthorized, not found.
- Isolate state and keep cases atomic. Note data you created; one assertion per row.
3. Credentials and sign-in
The local QA account. Each project has one standing QA account for local runs: an email and an obviously fake password, committed in Repo facts. It exists only on local stacks, so its password is not a secret: type it directly. Use it and no other account; never a real user's.
- Local only. Before creating or using it, confirm the target is local (section 1). Never create or use the committed account anywhere else: a known password on a shared or production environment is a hole. There, test only public behaviour, or use an account named for that environment, and never write its credentials into a file, report or reply.
- Missing account. When sign-in fails because the account doesn't exist, create it once, the
way Repo facts say: the app's own sign-up or API first, its seed command next, the database MCP
server last. Give it the least privileged role that reaches the change, and report that you
created it. Teardown keeps it: it is the project's standing account, unlike the run's
qa-<run>-data. - No Repo facts entry: use
qa-agent@<repo folder>.examplewith the passwordqa-agent-local-only, and report the Repo facts line to add. The.exampledomain is reserved for examples and passes strict validators such as pydantic'sEmailStr, which reject.local.
A public page or endpoint that demands a sign-in is a finding.
Sign in once at the start and reuse the session: the browser context, or a token or cookie jar in a
file under $SCRATCH (section 5). A token, cookie or password never goes into evidence; each
reference file says how to redact it.
- MFA: on a verification-code step, turn MFA off for the local QA account the way the app allows (its settings or API); if the app enforces it for every account, mark sign-in BLOCKED with the evidence. Never bypass MFA. BLOCKED is not a pass.
- 401 on sign-in: the account is missing or its password differs from Repo facts. Create it (Missing account above), or report the mismatch; retry at most twice.
4. Test data
- Checks may create data only in a local dev environment, never in a shared or remote one.
- Every record the run creates carries the prefix
qa-<run>-. - Create it through the app's UI or its own API first. Use SQL through the database MCP server only for a state the API can't produce, and only against a local database.
- Never trigger email, payments or anything that leaves the local stack. If a flow would, test it up to that step and say where you stopped.
- At the end, delete what the run created, in reverse order. Report anything you could not delete, with its id.
5. Evidence
Evidence for a run goes into one folder, resolved from the main checkout so that a worktree cleanup cannot delete it:
WRITEUPS="$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")/writeups"
QA="$WRITEUPS/changes/<date>-<run>/qa"
SCRATCH="$(mktemp -d "${TMPDIR:-/tmp}/qa-<run>.XXXXXX")"<date> is today as YYYY-MM-DD and <run> the branch name with / written as -, or the
run's name when the work sits on the default branch. When the caller names a folder, use theirs;
when changes/ already has a folder for this branch or run, use that one. $SCRATCH holds what
is not evidence: scripts, scratch homes, tokens. mktemp creates it once per run, so two runs of
the same branch never share it. Resolve these paths once and write them out literally afterwards:
shell variables do not survive between commands, and a command run outside the sandbox sees a
different $TMPDIR. Each evidence file is NN-<case>.<ext>, numbered in case order: .png for
a screenshot, .http for a request with its response, .txt for a terminal transcript, .log
for a log excerpt. Each reference file says what its surface captures. walkthrough reads this
folder, so nothing secret and no real person's data goes into it.
Take one screenshot per "look for", in one theme. Take the second theme only when the case is about theme or colour, or the change touched colour tokens. Take no full-page accessibility snapshot unless a locator fails, and then scope it to the element's container. Never read the same screenshot back twice.
6. Reporting
Write the results to $QA/results.md. Not report.md: Claude Code refuses a subagent's write to
a file named report.md, findings.md or summary.md, and this skill runs inside the qa agent.
## QA run - <scope> - <date>
Surfaces: web at http://localhost:3000, api at http://localhost:8000/api
| # | Surface | Case | Steps (short) | Expected | Actual | Status | Evidence |
|---|---------|------|---------------|----------|--------|--------|----------|
| 1 | web | Settings save | fill form, submit, reload | value kept | value kept | PASS | 01-settings-saved.png |
| 2 | api | Empty name rejected | POST /settings, name "" | 422, field error | 500 | FAIL | 02-empty-name.http |
**Verdict:** N passed / M failed / K blocked. <one sentence>.For every FAIL: exact reproduction steps, observed versus expected, and the detail that pins it (the status and a response snippet, the stderr line, the console error). A FAIL without a repro is not done. A BLOCKED case says what blocked it and what would unblock it.
Reply with the report and the path of $QA. When every case passed, add that walkthrough can
use this evidence.
7. Teardown
Run each tested surface's teardown from its reference file, then delete $SCRATCH. Delete the
run's test data (section 4) and report what was left. Keep $QA. Leave every server, simulator,
emulator and editor running: you did not start them.
If local.md exists next to this file, read it; where it disagrees with this file, it wins.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

