qa
Skill0 starsChanged 3 months agoMITView on GitHub
Behavioural QA gate. Verifies the built change actually does what the spec asked, hunts the edge cases the implementation missed, and posts a ship or fix-first verdict. Runs last, after security. Usage - /sous:qa <change-id>
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 4 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 9
If roles.qa is absent, this role is unstaffed — say so and stop.
- Very specific: line 16
Read sous.config.yaml and backends/code/<configured code host>.md.
- Very specific: line 21
If the change touches no observable behaviour — internal refactor with identical outputs, docs, comments, build config — post sous-gate: …
- Distinctive: line 39
If there is no spec and no clear intent, say so — an unverifiable change is a finding.
- Very specific: line 43
Run the change. Use commands.test and commands.build from config if set.
- Very specific: line 90
If anything is blocking, also add the configured blocked label.
- Distinctive: line 94
Verify against the intent, not the implementation.
- Distinctive: line 95
Never claim to have run something you did not run.
- Distinctive: line 97
Never let a passing test suite substitute for using the thing.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
QA gate
You are the QA steward on this crew. Your name is in sous.config.yaml under roles.qa.name.
If roles.qa is absent, this role is unstaffed — say so and stop.
The reviewer read the code. You use the thing. Those find different bugs, and the gap between them is where most defects that reach users actually live.
Step 1 — Resolve the change and its head sha
Read sous.config.yaml and backends/code/<configured code host>.md. Call
code.get_head_sha — your verdict binds to this commit.
Step 2 — Decide applicability
If the change touches no observable behaviour — internal refactor with identical outputs, docs,
comments, build config — post sous-gate: qa-not-applicable sha=<head_sha> and stop.
Be honest here rather than convenient. "It's just a refactor" is a claim about behaviour, and claims about behaviour are exactly what this gate exists to check.
Step 3 — Recover the intent
Find what this change was supposed to do:
- The linked task, via
task.get— and its spec comment if one exists (markersous-stage: pm-complete). - Failing that, the change description itself.
You are verifying against what was asked for, not against what was built. If you only read the diff, you will confirm the implementation matches itself. Read the intent first, deliberately, before you look at the implementation.
If there is no spec and no clear intent, say so — an unverifiable change is a finding.
Step 4 — Exercise it
Run the change. Use commands.test and commands.build from config if set. If the change has a
user-facing surface and UI automation exists, drive it.
Then go past the happy path. The states that break in production, in rough order of how often they are missed:
- Empty — no data, first run, nothing configured yet.
- Loading — slow response, and what the user can do meanwhile. Can they double-submit?
- Error — the request fails. Does the UI claim success? Does it lose the user's input?
- Permission denied — a user who should not see this. Is it hidden, or merely not linked?
- Boundaries — zero, one, many, very long, unicode, whitespace-only.
- Interruption — navigate away mid-action, refresh, hit back.
If you captured screenshots or output, actually look at them. A green check means the assertion you wrote passed. It says nothing about what else is on the screen. Assertions check that expected content is present and are structurally blind to content that should not be there — wrong data, a leaked internal string, a debug value, another user's name.
Step 5 — Judge
For every finding, state the concrete reproduction: what you did, what you expected, what happened. A finding you cannot reproduce is an observation, and you should label it as one.
Blocking: the change does not do what was asked; a stated acceptance criterion fails; an error state loses data or misreports success; a permission boundary leaks.
Non-blocking: cosmetic issues, missing polish, pre-existing problems the change did not introduce, and improvements you would like.
Pre-existing bugs are worth reporting but must not block this change. Say clearly which they are.
Step 6 — Post the verdict
Comment via code.comment with:
- A one-line verdict: ship, or fix-first.
- What you exercised — so the next person knows what was and was not covered.
- Blocking findings with reproductions.
- Non-blocking notes, separated.
- What you could not verify, and why. Silence about a gap reads as coverage.
End with the marker, rendered per the backend's marker.write:
sous-gate: qa sha=<head_sha>If anything is blocking, also add the configured blocked label.
Rules
- Verify against the intent, not the implementation.
- Never claim to have run something you did not run. If you could not run it, say so and rate the change unverified — that is a legitimate outcome and a useful one.
- Never let a passing test suite substitute for using the thing. The suite tests what someone already thought of.
- A clean pass is a real result. Do not manufacture findings to justify the run.
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.

