agentleFS
waqarqasimwaqarqasim/portable-agent-skills/skills/qa-test-plan/SKILL.md

qa-test-plan

Skill0 starsChanged 2 months agoMITView on GitHub

Writes a granular manual QA test plan for a specific pull request, commit, or branch — exact click paths, exact input values, exact expected results, plus negative and boundary cases derived from the code's real validation. Use when the user asks for QA test cases, a test plan, a test script, manual testing steps, regression steps, UAT cases, or "what should QA check for this PR".

4 other projects use a version of this.

Adopted by

Most recently taken up by

  • Other versions4 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 4

    1. elodin-sys/elodin★ 553same name
    2. keber/qa-framework★ 9same name
    3. geril07/skills★ 0same name
    4. Takkuya/claude-skills★ 0same name

    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 repository4 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 4 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If a case cannot answer all three, it is not a test case yet.

    line 27
  2. Distinctive:

    Every negative case you write must correspond to a guard that exists in the code, and must cite it.

    line 63
  3. Distinctive:

    If a precondition is expensive to create, say how (a seed script, an admin screen, a SQL snippet).

    line 78
  4. Distinctive:

    Never invent a UI element: If you cannot find the control in the code, say the path is unverified rather than guessing a menu name.

    line 158

“Common” is measured: kept by at least 6 in 10 of the 4 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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

QA test plan from a change

Produce a test plan a tester can execute without reading any code, derived from what a specific change actually did.

The bar

Most generated test plans fail the same way: they read as Verify the order saves correctly. A tester cannot execute that, and cannot tell you whether it passed. Every case you write must answer three questions on its face:

  1. Where do I start? — the exact screen, route, or endpoint, and the state and role required to reach it.
  2. What exactly do I do? — the exact values typed, the exact controls clicked, in order.
  3. How would I know it failed? — an observable result. Specific text, a specific state change, a specific HTTP status. Not "works", not "is correct", not "as expected".

If a case cannot answer all three, it is not a test case yet. Either sharpen it or move it to the Cannot be tested manually section.

Procedure

1. Establish the change set

Work from the diff, never from the description. A PR title is a claim about the change; the diff is the change.

# whichever applies
gh pr diff <number>
git diff <base>...<head>
git show <commit>

Then list, from the diff only:

  • User-visible surfaces touched — pages, components, routes, endpoints, jobs, emails, exports, notifications.
  • Behaviour changed — new fields, altered validation, changed defaults, new states, changed permissions.
  • Data changes — migrations, seed changes, config or feature flags.
  • Nothing user-visible — say so explicitly. A refactor with no observable change should produce a regression-only plan, and saying that plainly is more useful than inventing cases.

2. Read the guards before writing negative cases

This is the step that separates a real plan from a plausible one.

Open the changed code and find the actual validation: required fields, length and range limits, format rules, uniqueness constraints, authorization checks, state-machine transitions that are refused, concurrency guards.

Every negative case you write must correspond to a guard that exists in the code, and must cite it. Invented negative cases — "try entering emoji" — waste a tester's day and prove nothing. A guard with no case is a gap worth reporting.

Note the exact user-facing message where the code specifies one. "Shows an error" is not an expected result; "shows Quantity must be greater than zero" is.

3. Establish preconditions honestly

For each area, state what must be true before step 1:

  • Role and permissions — the specific role, and any permission the code checks.
  • Data state — the records that must exist, with the field values that matter.
  • Environment — feature flags, config, integrations that must be reachable.

If a precondition is expensive to create, say how (a seed script, an admin screen, a SQL snippet). A test case a tester cannot set up is not executable.

4. Write the cases

Cover, in this order:

TypeWhat it covers
PositiveThe change working as intended, including each new option or path
NegativeEach guard found in step 2, exercised so it fires
BoundaryThe exact edges of any limit in the code — 0, 1, max, max+1, empty, null
PermissionEach role that should and should not be able to reach it
RegressionExisting behaviour the change could plausibly have broken

Regression cases come from asking what else touches the changed code — other callers of a changed method, other screens using a changed component, other flows reading a changed column. Name the reason for each one; a regression case with no stated risk is filler.

5. State what manual testing cannot cover

Concurrency, timing, load, retry and idempotency behaviour, and anything requiring a simulated failure usually cannot be tested by clicking. List these explicitly as needing automation or a developer, rather than writing a case a tester will mark "passed" without having exercised anything.

Output format

# QA test plan — <PR/commit reference>

**Change summary:** <two lines: what a user can now do differently>
**Areas touched:** <screens / endpoints>
**Risk:** <low | medium | high> — <why>

## Preconditions
| # | Requirement | How to set up |
|---|---|---|
| P1 | A user with role X | Admin → Users → ... |
| P2 | An order in state Draft | Seed script `...`, or create via ... |

## Test cases

### TC-01 — <short title>
- **Type:** Positive
- **Precondition:** P1, P2
- **Steps:**
  1. Navigate to `Sales → Orders` and open order `SO-1001`.
  2. Set **Quantity** to `5`.
  3. Click **Save**.
- **Expected:** Line total shows `1,250.00 EUR`; a toast reads *Order updated*; the order
  stays in state `Draft`.
- **Covers:** `src/.../OrderEditor.razor:88`

### TC-02 — <short title>
- **Type:** Negative
- **Precondition:** P1, P2
- **Steps:**
  1. Navigate to `Sales → Orders` and open order `SO-1001`.
  2. Set **Quantity** to `0`.
  3. Click **Save**.
- **Expected:** Save is refused; the field shows *Quantity must be greater than zero*; the
  stored quantity is unchanged after reload.
- **Covers:** guard at `src/.../OrderValidator.cs:41`

## Regression checks
| # | Area | Why it is at risk |
|---|---|---|

## Not coverable by manual testing
| Behaviour | Why | Suggested approach |
|---|---|---|

## Gaps found while writing this plan
<Guards with no reachable UI path, error messages that are not specified, states that
cannot be reached. These are findings, and worth more than another test case.>

Rules

  • Never invent a UI element. If you cannot find the control in the code, say the path is unverified rather than guessing a menu name. A wrong click path destroys a tester's trust in the whole document.
  • Never write an expected result you cannot observe from the interface. "The record is saved to the database" is only acceptable if the plan says how to see it.
  • Prefer fewer, sharper cases. Twenty specific cases beat sixty vague ones, and a tester will actually finish twenty.
  • Report gaps. A guard you cannot reach through the UI, or an error message the code leaves unspecified, is a finding. Put it in the plan.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.