| name | qa |
| description | Use after finishing a feature or fix to confirm it actually works, when the user says "test this", "does it work", "verify this", "QA it", or before shipping something that has never been driven end-to-end. Also when the user asks for tests to be written or wants to work test-first. |
QA — prove it works (verify by default, tests on request)
Proving a change works is never optional — but that doesn't mean writing tests. Default to verify
(drive the real thing, watch what it does). Tests / TDD are a project choice — offer them, don't
impose them. After a build, the honest close is: "Built it — want me to QA it? (I can verify it end-to-end,
and add tests / do it test-first if you want.)"
Mode 1 — Verify (the default; always do this)
- Define "works." Restate the expected behavior + acceptance criteria in observable terms. If you
can't say what correct looks like, you can't verify it.
- Pick the lightest real check. Drive the actual thing over reasoning about it: run the app and click
the flow, hit the endpoint, run the script/CLI, render the component. Reuse the project's run/dev
command; don't build harness it doesn't have.
- Happy path, then the edges that matter — empty, null, error, loading, zero/one/many, unauthorized,
malformed, offline/slow (
~/.mastermind/engineering/core/rigor.md). Observe actual output and state.
- Check the invisible — typecheck, lint, build; console/network for errors; for UI, keyboard + focus,
contrast, no layout shift/regression nearby.
- Report with evidence — what you ran and what you observed (command output, response, screenshot).
State confidence plainly. Couldn't run a check? Say so; never present unrun work as verified.
Found a bug? Fix the root cause (or route to debug if it's not obvious) — never suppress a symptom
to make a check pass. Verify against the requirement, not the code you just wrote (a hostile eye).
Mode 2 — Test-first / TDD (thorough by default; writing the files is the opt-in)
Writing a test suite is a heavy optional step — offer it, get a yes, then write. You're in Mode 2 only
because the user asked for tests / test-first, or said yes to the offer after a build. Inside it, test the
product fully and in detail — writing tests (even test-first) to prove behavior across the happy path
and every edge is good QA, not overreach.
Get the yes before the first file lands. Name where the tests would live and what they'd cover —
"Want these as tests? They'd go in <path> and cover <happy path + the edges that matter>." — and write
nothing to disk before it. Proportionality, not ceremony: if the project already has a suite and the
change belongs in it, adding the case is the normal way to work — do it and say so; the gate is for
starting a suite, or putting test files in a repo that has none.
Then Red → Green → Refactor:
- Red — one small failing test stating the next behavior (for a bug: a test that reproduces it). Watch
it fail for the right reason.
- Green — the minimum code to pass. No gold-plating.
- Refactor — improve the design while green; loop.
Test behavior/contracts, not internals (brittle implementation tests are worse than none). Test names
read like the spec. Struggling to make a test pass cleanly? The design is probably wrong — listen to it.
And don't silently leave test files in the user's repo. They were agreed before they were written, so
nothing arrives as a surprise — but close the loop: say what now exists and confirm it stays — "Tested it
thoroughly; keeping these tests in <path> as coverage unless you'd rather I remove them." Match the
project: if it already has a suite, add to it; if it has none, don't impose one — the files are the
user's call, even though the testing wasn't optional.
Output
A plain verdict — works / doesn't — with the evidence and the edge cases exercised, plus any gaps you
couldn't cover (and why). If tests were written: note what they cover and confirm they stay — never write
or persist a test suite the user didn't agree to first. If the project's
cycle-report preference is on (.mastermind/prefs.md), also run the report skill to save a
durable write-up; default off, so by default the verdict stays in chat.