qa skill
scriptsUse when the user starts, continues or retests a QA test session — «/qa <link|description>», «test this task», «run a test session», «retest session X», a tracker task handed over for verification; also triggers on the Russian «протестируй задачу», «проведи тест-сессию», «ретест по сессии X».
- GitHub stars
- 5
- Files
- 24
- Last commit
- Nov 13, 2026
- License
- MIT
- Allowed tools
- —
What does the qa skill do?
qa uses when the user starts, continues or retests a QA test session — «/qa <link|description>», «test this task», «run a test session», «retest session X», a tracker task handed over for verification; also triggers on the Russian «протестируй задачу», «проведи тест-сессию», «ретест по сессии X».
How to install the qa skill
Each command copies the skill folder into the client's skills directory. Restart the client or start a new session to load it.Install the qa skill in Plugin
/plugin marketplace add codecube01/qa-cube /plugin install qa-cube@qa-cube
Install the qa skill in Claude Code
~/.claude/skills/qa/SKILL.md
$ npx degit codecube01/qa-cube/skills/qa ~/.claude/skills/qaInstall the qa skill in Claude Code (project)
.claude/skills/qa/SKILL.md
$ npx degit codecube01/qa-cube/skills/qa .claude/skills/qaInstall the qa skill in Codex
~/.agents/skills/qa/SKILL.md
$ npx degit codecube01/qa-cube/skills/qa ~/.agents/skills/qaInstall the qa skill in Gemini CLI
~/.gemini/skills/qa/SKILL.md
$ npx degit codecube01/qa-cube/skills/qa ~/.gemini/skills/qaInstall the qa skill in Claude.ai
npx degit codecube01/qa-cube/skills/qa qa && zip -r qa.zip qa # claude.ai → Customize → Skills → + → Create skill → Upload a skill → qa.zip
SKILL.md
View on GitHub/qa — test session
Step 0. The project profile
Read .claude/qa-profile.md — it is a short map: the capability header (tracker, tms, test-cases, environments, logs,
autotests, browser, secrets, knowledge, sessions, engine-clone, language) plus pointer sections. The profile answers every
project question: how to read tasks, how to create cases, how to reach the environments, how to run the autotests.
Do not read the .claude/qa-profile/*.md subfiles up front — pull them in targeted, at the moment of the step that needs them: Tracker
— while reading the task (step 1), Environments and Browser — before the preflight check (step 4), Autotests — while writing the automator's
brief (step 5), the project's report format — at step 6. The pipeline below points at the profile at each such spot. A subfile the session
does not need (browser.md on a pure backend task) is not read at all; a subfile's first screen is the quick flow, the pitfalls come below.
Targeting picks the file, or the sections named after it; what is picked is read whole, with Read — a topical grep misses a pitfall filed under another heading,
and cat of a large file spills into persisted output, to be read again.
The session's language is language from the profile (no field → the language of this file, i.e. English): everything the user sees is
written in it — the whole conversation plus every artifact: the plan, the briefs, the result files, the report, the retro, the TMS cases,
the tracker comment, and the project profile itself. Files rendered from templates go in it too (translate the table headings). The
engine's own instructions are in English, and that says nothing about the output language — the output language is set by language
alone.
The executors are held to the same rule, and it reaches them only through the prompt: make Output language: <language> the first line
of every executor's prompt (the analyst, the manual tester, the automator — the brief file repeats it, the prompt carries it). A subagent
starts working, and narrating what it does, before it has opened the profile, and that narration — its reasoning, its progress notes, its
final summary — is shown to the user in the same console as your own; a round whose language lived only in the profile read as English
in the console while its files came out right.
A number in the text the user reads says what it is: its kind and title in brackets — ACME-123 (task «Export of payouts»),
merge request 45 («Add export», draft), pipeline 2071 (the nightly run). A title not in hand is looked up in the tracker or the TMS
before the message goes out, never left bare, and «(the same title)» or «(see above)» is no title: it sends the reader up the scroll. A
file writes the full title at the first mention; in the chat every mention carries its bracket — the full title first in a message, a
short tag after it (ACME-123 (the frontend task)), a question's options included: the chat is read in pieces, and every bare number
costs the reader a question. Precedent: a triage named a task and its merge
request by number alone, then a sibling task as «(the same title)» — both drew «what is this number?».
No profile → do not start the session: suggest the user run /qa-setup. A capability declared none or a key missing from the profile
→ apply the degradation from the table at the end of this file; the profile does not invent degradations of its own. The single exception is
test-cases: a missing key reads as inline (the manual tester creates the case after the run), not as none — otherwise a contract
update would silently switch cases off in profiles written before version 5.
The contract version. Compare the profile's contract-version (no field → 1) with the current version in the «Contract versions»
section of PROFILE-CONTRACT.md (the plugin root, next to this skill: ../../PROFILE-CONTRACT.md). The profile is behind → do not
block the session: tell the user in one line that the profile is behind (what is new — from the version history) and that /qa-setup
closes the gap, then carry on with degradations for the missing keys. That line is the session's first message to the user, sent the
moment the comparison is made — before the tracker is read or any other tool is called, and never folded into a later status update or
left for the finale's action block. Tool output is collapsed in the user's console, so a gap noticed «in passing» while reading the
profile is a gap the user never sees — one session noticed it in passing and the user had to ask twice.
Then the project's layer of engine rules — .claude/qa-cube-feedback.md, next to the profile. Read its open rows right after the
profile (the «Closed» block is skipped: the engine already carries those). Each row is a rule about the process that a retro in this project
learned and could not write into the engine for want of a clone (step 7); each names its address in the engine — a catalogue, a step, an
agent's instruction — and from the moment it is written it counts as one more entry at that address: when a step sends you to
references/planning.md, the rows addressed to planning.md are part of what you read there. Two consequences:
- a row addressed to an executor's own instruction (
agents/qa-*.md) reaches that executor only through you — the executor never reads this file, so the row goes into the brief's rules verbatim, or the lesson was paid for and is never applied; - where a row contradicts the engine's text, the row wins — it is the later lesson, learned on this project — and the retro records the
contradiction as an observation: an engine update that argues with the user's rule is exactly what
/qa-setupneeds to see when it reconciles the file.
No file → nothing to read. A profile still below contract version 6 may keep the rows at the old address, <sessions>/engine-feedback.md —
read them from there; the contract-version line above already tells the user that /qa-setup moves the file.
The profile and this file never carry the same rule — two layers: the profile holds what is true only for this project, the feedback file holds what would hold in anyone's. Step 7 decides which is which.
The <sessions> path below is the value of sessions from the profile (e.g. docs/test-sessions/).
The harness — before the first action it answers. Read references/harness/README.md and the adapter it names for the harness you run in (claude-code.md, codex.md, opencode.md, generic.md): it says how this file's actions are done there — launching a role, continuing an executor, asking the user, <plugin root> (the plugin's own directory, in every script path below), the transcripts — and what to do where the harness lacks one. 0-session.md records it as Harness: <name>; the profile never does. The browser tool is the profile's browser (default/dedicated → claude-in-chrome), its adapter references/browser/<browser>.md.
The manager runs the shell too — the sweep, preflight, on-chain and bundle recon — so references/shell-pitfalls.md is read whole
before the session's first shell command beyond reading the profile: a manager once printed every private key of a secrets file into the
transcript through a pitfall that file already named.
--preflight in the input (/qa --preflight <task>) → a preflight run: everything up to the first executor that touches the
environment, then a decision card and a stop — no report, no retro, no tracker write, and no question waits for an answer, because nobody
may be watching. Read references/preflight-run.md whole before step 1 begins: where the run stops in each mode, where the steps'
questions go instead, the card, and how the session continues once the user decides.
Roles
QA Manager — that is you, the main session. You plan, write the briefs, accept the results, write the report, run the retro. You do not
test yourself: there are exactly two exceptions — a quick sanity request to refine the plan, and checking a fact yourself when the user
has raised an objection after delivery (step 9): such a claim gets re-verified with your own eyes, not by re-reading the report. You are
the only one who may ask the user a question: at the start (1–2 at most, and only if the plan falls apart without them) and after delivery —
when their question grows into a candidate rule and you must ask whether to adopt it (step 9). In a preflight run the questions go into
its card instead (references/preflight-run.md).
QA Manual — a subagent (the role qa-manual, its instruction is agents/qa-manual.md). The manual check on the environment;
with test-cases: inline also the TMS case for what was verified, while with upfront it runs the analyst's cases and creates none of its
own. Its result is the evidence for automation and, with inline, also the source of the case id. It does not touch code.
QA Analyst — a subagent (the role qa-analyst, its instruction is agents/qa-analyst.md). Runs when test-cases: upfront:
unfolds the plan's scenarios into test cases from the requirements, before the run and without seeing the environment. Creates no files
in the session — it receives its assignment in the prompt and reports through the cases plus a final summary. Files no bugs and passes no
verdict on whether things work.
QA Automator — a subagent (the role qa-automator, its instruction is agents/qa-automator.md). From the manual tester's
evidence: an autotest driven to green and linked to a case (with upfront — from the analyst, with inline — from the manual tester, with
none — to the tracker task), then the automation flag on the case. The project's automation specifics (code map, code style) live in the
profile, not here.
The executors ask no questions — not one of them.
The pipeline
1. Understand the task and assemble the bundle. Where entering the environment needs the user's hands (per the profile), the liveness oracle is this step's FIRST call — a dead session then overlaps your reading instead of following it; that call and every re-check of it is a new tab → navigate → the call, never the tab that answered 401; the entry in references/manual-brief.md is read only at step 4, too late for this rule. The input is a link/id of a tracker task or free-form text. Read the task with the tools
from the profile (Tracker section): the description and the comments, mandatorily — that is where the requirements, the status and the
related changes live. Check for related tasks in three ways, not one: (1) explicit links/relations; (2) the task's subtasks and
parent; (3) a substring search on the title (neighboring FE/BE tasks of the same area). Empty relations do not mean «there are none». If a
frontend task has a related backend task in a suitable status on the same environment, we test them in one session (and vice versa)
— proposed to the user, not decided alone: when and how wide the round runs is a start question, asked now, before step 2 makes the
folder, and an option resting on a fact the task never states (a limit read off the developer's report, a refusal measured earlier) names
that source and says the task is silent on it (the entry is in references/planning.md, «What the plan rests on», which is read only at step 3).
Related tasks that pass the filter enter the scope, the plan and the briefs. Each of the three ways is a query you RUN and whose result you
write into 0-session.md, not a box you tick — «relations came back empty» closes way (1) only, and the subtask scan is the one that gets
skipped, because the tracker shows no hint that it is missing. Where the tracker's API makes subtasks awkward to list (a timeout on the
child-of filter, a parent field that is not searchable), the project's tracker skill names the working route; run it. And every related
task that enters the scope is read the same way the main one is — description AND comments in full, never by its title in a listing.
For a parent task the acceptance scope is set by the labels of the subtasks in a testing status, and a user-voiced parent with no
labels is a container whose engineering spec sits in a labelled subtask — both shapes, what each costs and the one exception (a parent whose
only subtask is an empty layer label is not a container) are in references/planning.md, «What the plan rests on».
Start preconditions — not met → tell the user and do not begin:
- the mode is determined: the status of the task (and of the related ones in scope) determines the session's mode — full cycle (manual check + autotest + case) or automation-only (a minimal manual run for the autotest's evidence, without full bug hunting). The status→mode mapping is in the profile, Tracker section;
- the environment is determined (env — from the task or the profile). It is not — that is exactly your one question to the user.
- the verdict on the requirements is passed (required with
test-cases: upfront; useful but optional in the other modes). While reading the task, answer: do its requirements work as the reference the product is checked against. Spec-grade — the requirements are written as requirements: there are acceptance criteria, functional requirements or numbered items, each with its own verifiable outcome; the expected result reads out of the text verbatim, nothing needs to be guessed. Draft — everything else, including a page-long detailed task description: solid prose does not become spec-grade by being long, the expected result has to be extracted from it, and extraction is guesswork; requirements scattered across a comment thread and a task like «fix the filter behavior» are always draft. Write the verdict with a one-phrase rationale as a line in0-session.mdand carry it into the analyst's prompt and the manual tester's brief: it decides whether an executor may edit a case's expected result. A verdict can be compound («spec-grade on the contract, draft on „nothing broke“»), and a «draft» verdict lowers the strictness, not the duty of a line-by-line verdict — both inreferences/planning.md, «What the plan rests on».
Then the product knowledge (the path and the reading rules — the profile, Knowledge section): read the sections the task touches and the
findings of past sessions on them — the side-findings registry included, grepped by the screen's name (references/planning.md, «The
tracker is searched at step 1»).
A link or a reference to a document outside the tracker is part of the requirements, chased BEFORE the verdict on them: open it
yourself first (one call); only what you cannot reach becomes the start question, asked once — black-box against the spec is a fallback
only after a refusal, and the report says so; either way its contents are what was done or required, never permission to read code
(references/planning.md).
If there is a critical ambiguity (which environment? which direction?) — one question to the user now, and no questions after that.
2. Create or continue the session. First, the monthly sweep: python3 "<plugin root>/skills/qa/scripts/session.py" sweep <sessions> moves the session folders of previous months into their month archives <sessions>/<YYYY-MM>/, rewrites every link to them
and, when it moved anything, checks that every path naming a session folder resolves. The invariant: the root of <sessions>/ holds what is alive (the
current month and active retests), the month folders hold closed history; side-findings.md and the non-session folders stay. It
printed an unresolved link or a folder it could not move → read references/session-folder.md, section «Sweeping», and fix it by hand
before going on. Nothing printed — read nothing.
Then check whether a session for this task (and for the related ones) already exists: search for the task id in folder names and in
0-session.md recursively across all of <sessions>/, including the month archives — grep -rl "<task id>" --include=*session.md <sessions>/.
- A session with the status
preflight-done, and no--preflightin the input → not a new round: the session continues from the launch (references/preflight-run.md, «The continuation»). - A session existed → this is a new round in the same folder: the folder is renamed to the current date (out of a month archive it
returns to the root of
<sessions>/), the round's new files continue the folder's running numbering with a round-number suffix (8-manual-task-2.md,9-manual-result-2.md, … — each name fromsession.py next-file <folder> <role> <round>, called once per file at the moment of its creation, never counted by hand: a round that counted named three files8-…), the report is not created anew — the same99-report.mdis updated with a mandatory comparison against the previous round — and task comments that appeared since the last round are appended to the «Raw source» section of0-session.md. Readreferences/session-folder.md, section «Continuing a session», before the round's first move: dating the round's trigger, what the rename must bring to the convention besides the date, what the executor's brief carries over from the previous round, when the analyst is re-launched at all, and how stale evidence is marked — all of it is decided before planning and cannot be added afterwards. - There was no session → a new folder
<sessions>/<YYYY-MM-DD>_<source>-<slug>/(example:2026-08-10_acme-412-partial-cascade).
A folder holding files under the old naming scheme (session.md, report.md, *-r2.md, …) → the same file, section «Folders from the
old scheme»: what is left as it is, and the two files that are renamed even so.
The file skeletons live in templates/ next to this skill:
0-session.md # meta (tasks, mode, env, status, round log) + the task's raw source
1-plan.md # the plan: what we test, why, scenarios by priority
2-manual-task.md # the manual tester's brief
3-manual-result.md # written by the manual tester, incrementally; the automator's evidence
4-automator-task.md # the automator's brief (the manager writes it after accepting the manual round)
5-automator-result.md # written by the automator
7-retro.md # the retro
99-report.md # the manager's report — one per session, updated every round
The task's raw source goes into 0-session.md. Everything read at step 1 goes in there verbatim: the full text of the task (and of the
related ones pulled into scope) and all the comments — as a separate «Raw source» section, with no paraphrasing and no cuts. It is the
session's only raw layer: from then on you, the executors and the next round read the requirements out of it instead of going back to the
tracker. Secrets that ended up in the task text or the comments (passwords, tokens, magic links) are masked per the «Secrets» rules below.
The number in a name is the order of the file's appearance, i.e. the order of work; paired executor files are named «role-type»
(manual-task / manual-result). Zero is 0-session.md: not a step of work but the session's entry point (meta and raw source) — work
starts with the plan. From there the numbering is running across the folder and is never reset: a file gets the next free number at the
moment of creation, and the round is marked with a digit suffix. A second round continues from 8 — 8-manual-task-2.md,
9-manual-result-2.md, 10-retro-2.md; if a plan reappears too, it goes under its own number in the same sequence (8-plan-2.md, which
makes the manual brief the 9th). In round 2+ the name comes from session.py next-file <folder> <role> <round>, not from counting.
Two files sit outside the numbering — they are not duplicated but updated in place: 0-session.md and 99-report.md. The number 99
keeps the report last in the listing and makes it the one current report: round 2+ brings its sections to their current state and puts the
round's delta at the top of «Round history» (how a finding moves between sections: references/report.md). Nothing from past rounds is
erased silently — a fact that stopped being true moves to where its new status says.
3. The plan. Fixtures, access and what is flaky come from <sessions>/environment-state.md; a fact older than the build is
re-measured first. Scenarios by priority: first the business-critical ones and whatever the task fixed/changed, then the negative ones, then
the regression around them. Each scenario carries an expected business effect (what must change), not «get a 200». Execution order ≠
priority order: negatives that do not mutate the environment under expected behavior are run before mutating positives — a clean state is
worth more; but keep in mind that on a buggy server a «safe» negative may mutate the environment after all (account for that in the artifact
estimate). A scenario that closes a requirement with a couple of cheap reads goes before scenarios with fragile preconditions
(references/planning.md).
The source of the scenarios is the task's requirements and the product's behavior, not the implementation. We test as a black box: do not pull MR/PR diffs by default — it clutters the context and skews the optics («I read how it was done and decided it was right» — whereas the comparison must be against the requirement, not the code). Reading the changed code is allowed purely as an extra, for yourself, when the requirements are ambiguous and there is nowhere else to clarify them; what you read out of the code does not go into the plan or the briefs — those carry only the expected behavior from the requirements.
Before writing the plan, read the «Contents» of references/planning.md whole — it is the rules: one line per shape of scenario,
the trigger and what the plan does. Read the Contents and nothing else: grep -n '^## ' gives the first body heading, Read with limit just below it returns the index alone; a Read with no limit returns a third of the body too. Plan from that list and open one entry per fired line, as the catalogue's header says. Once 1-plan.md is written, launch the catalogue reviewer: a general subagent, with no context
from the session. Its brief: the absolute path of the catalogue (references/planning.md, next to this skill); the paths of the
session files it judges (0-session.md, 1-plan.md); «read the catalogue whole, bodies included, then the files;
return the entries whose situation this round is in and the file does not honour: for each, the entry's title, the line it would change,
and what to add — at most eight items, those that would change a verdict, a budget or an irreversible step; nothing else». Apply what it returns by targeted edits — the file is in your context, do not re-read it — and say in it, in one line, what the
review added. Why a reviewer and not your own reading: the value of a catalogue is in the shapes you did not think of, and an author
who reads the whole catalogue for them pays for every entry in every later step; a reader with no stake reads it once and leaves. Steps 4 and 6 reuse it.
3.5. Test design (only with test-cases: upfront; with inline and none the step is skipped entirely). The plan's scenarios are
turned into cases by the qa-analyst subagent — before the manual run and without seeing the environment, so that a case describes a
requirement rather than an observation. It has no brief file: the plan already contains the scenarios, the scope and the priorities, and a
brief file would be a retelling of it. Launch the role qa-analyst, passing in the prompt:
Output language: <language>as the first line (step 0);- the path to the session folder
Files in this skill
24qa skill questions
How do I install the qa skill in Claude Code?
Run npx degit codecube01/qa-cube/skills/qa ~/.claude/skills/qa. Claude Code loads skills from ~/.claude/skills (all projects) or .claude/skills (one project) and uses a skill when its description matches the task.
Which clients can use the qa skill?
Any client that reads the Agent Skills format: Claude Code, Codex, Gemini CLI and claude.ai (upload as a ZIP). Scripts in the skill run only where the client allows code execution.