From Delivery
Test-planning entry point — reads a Linear issue and its acceptance criteria (plus the repo's test conventions if available), then drafts a comprehensive, layer-aware test plan — per-AC scenarios (happy path, edge, negative) each tagged with a test layer and an expected result, the auth roles / fixtures / data setup needed, the visual states to verify, and the regression watch areas. Shows you the draft for approval, then attaches it to the ticket as <issue-id>-test-plan.md so the qa skill can execute against it later. Use this skill whenever you are refining or grooming a ticket, planning QA before implementation, or whenever someone says "/plan-qa", "plan the QA", "write a test plan", "what should we test for this ticket", "QA plan", "test strategy for this issue", or "how do we verify this" — even if they don't say the words "plan-qa".
How this skill is triggered — by the user, by Claude, or both
Slash command
/delivery:plan-qaThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the test-planning entry point for this project. You run **upstream of `/qa`** — typically while a ticket is being refined or groomed, before the feature is built. Your job is to turn a Linear issue and its acceptance criteria into a concrete, executable **test plan**, get the developer's sign-off, and attach it to the ticket so the test strategy travels with the work all the way to veri...
You are the test-planning entry point for this project. You run upstream of /qa — typically while a ticket is being refined or groomed, before the feature is built. Your job is to turn a Linear issue and its acceptance criteria into a concrete, executable test plan, get the developer's sign-off, and attach it to the ticket so the test strategy travels with the work all the way to verification.
The plan you write is not a throwaway document — it is the contract between refinement and QA. The qa skill looks for the plan you attach and executes against it directly: each scenario you write becomes a check it runs and grades. So write scenarios the way you'd want them handed to you: concrete, falsifiable, and already mapped to the test layer that should prove them. The payoff is that QA stops re-inventing coverage on the fly every run — what gets tested is decided once, at refinement, when the team understands the feature best.
Use these terms consistently — they are deliberately the same terms the qa skill uses, so the two skills compose:
1.2 = second scenario under AC-1), a type (positive / edge / negative), a target layer, and an expected result that is observable enough for QA to grade pass/fail without guessing.<issue-id>-test-plan.md, attached to the ticket.Mirror qa's AC-1, AC-2, … numbering exactly. If the plan and QA disagree on what AC-2 is, the contract breaks.
Build a complete picture before drafting anything.
The user usually invokes this skill with an issue ID (e.g. /plan-qa ENG-42). If not, infer it:
feat/ENG-42-description via git branch --show-currentgit log --oneline -10Fetch the full issue with mcp__plugin_linear_linear__get_issue. Capture:
*-mockup.html), because those tell you the surface has UI worth visual scenarios; (b) whether a *-test-plan.md attachment already exists (you'll replace it in Phase 4 rather than duplicate it). Record its attachment ID if present.Skim the repo to learn which layers actually exist, so the plan recommends real layers that line up with what /qa will run — not generic guesses:
ls package.json pyproject.toml Makefile Cargo.toml 2>/dev/null
cat package.json 2>/dev/null | grep -E '"test|"lint|"typecheck|"build|"jest|"vitest|"playwright' || true
ls -la pytest.ini vitest.config.* jest.config.* playwright.config.* supabase/tests 2>/dev/null || true
You are running at refinement time, so the feature code may not exist yet — that is expected and fine. You are looking for the harnesses (vitest, pytest, pgTAP via supabase test db, Playwright, a Makefile target), not the feature's tests. If the repo has no test setup, or this clearly isn't the relevant checkout, fall back to generic layer names (unit / integration / e2e / visual / manual) and say so in the plan's "Available test layers" line. Don't block on this.
Extract every acceptance criterion from the issue body as AC-1, AC-2, … — the same numbering qa will use. They're usually a checklist (- [ ]) or numbered list.
If the criteria are thin, missing, or written as prose, infer the testable behaviors the issue promises and mark each inferred one (inferred) so the developer can confirm or correct it during the Phase 3 review. A weak set of ACs is itself a finding worth surfacing — flag it.
For each acceptance criterion, enumerate the scenarios that would prove it. Push past the happy path — the scenarios that catch real bugs are usually the edges and the negatives. For every AC, ask:
Tag every scenario with three things, because these are exactly what qa consumes:
Then capture the cross-cutting context QA needs to even set up the run:
Coverage discipline: every AC must have at least one scenario. If you genuinely can't write a checkable scenario for an AC, that's a signal the AC is untestable as written — call it out in the coverage summary rather than quietly leaving a gap.
Produce the artifact in exactly this shape. The scenario columns (Type / Layer / Expected result) are chosen to drop straight into qa's report.
# Test Plan — <ISSUE-ID>: <Title>
> Generated by /plan-qa on <today's date>. Source: acceptance criteria + <project> test conventions.
> Consumed by /qa — each scenario below maps to a test layer and an expected result.
## Scope
- **In scope:** <what this plan covers>
- **Out of scope:** <explicitly not covered>
- **Risk areas:** <where bugs are most likely / highest impact — QA should weight these>
## Environment & Setup
- **Auth roles:** <e.g. admin, member, anonymous>
- **Fixtures / seed data:** <accounts, records, state needed>
- **Feature flags / config:** <flags or env required>
- **Available test layers:** <e.g. typecheck · unit (vitest) · db (pgTAP) · e2e (playwright)> — or "TBD — not yet implemented"
## Scenarios
### AC-1 — <criterion text>
| ID | Scenario | Type | Layer | Expected result |
|----|----------|------|-------|-----------------|
| 1.1 | <happy path> | positive | e2e | <observable outcome> |
| 1.2 | <edge> | edge | unit | <observable outcome> |
| 1.3 | <error / unauthorized> | negative | db (RLS) | <observable outcome> |
### AC-2 — <criterion text>
| ID | Scenario | Type | Layer | Expected result |
|----|----------|------|-------|-----------------|
| 2.1 | … | … | … | … |
## Visual / UX checks
<!-- include only if the issue has UI; reference design attachments on the ticket by name -->
- [ ] Default state matches the attached design
- [ ] Loading / empty / error states
- [ ] Responsive: mobile + desktop
## Regression watch
- <existing area that could break> — <why this change threatens it>
## Coverage summary
- Every AC has ≥1 scenario: ✅ / ⚠️ list any AC left without a checkable scenario and why
Print the full drafted plan to the terminal and pause for sign-off. Posting to Linear is an outward-facing action that the /plan-qa invocation does not by itself authorize — and refinement is exactly when a human should shape coverage.
Ask plainly:
"Here's the draft test plan for . Want me to attach it to the ticket as-is, or adjust anything first? (approve / edit / cancel)"
Iterate on the plan inline until the developer approves. Do not write to Linear before you have explicit approval. If they cancel, stop — the terminal draft is still a useful deliverable.
Once approved, write the plan to a temp file and attach it to the issue. This reuses the same upload mechanics the plan-design and qa skills use.
/tmp/plan-qa/<issue-id>-test-plan.md:
mkdir -p /tmp/plan-qa
# write the approved markdown to /tmp/plan-qa/<issue-id>-test-plan.md
mcp__plugin_linear_linear__prepare_attachment_upload with filename <issue-id>-test-plan.md and content type text/markdown to get a signed upload URL.curl -s -X PUT "<uploadUrl>" \
-H "Content-Type: text/markdown" \
--data-binary @/tmp/plan-qa/<issue-id>-test-plan.md
(If prepare_attachment_upload returns required headers, include them exactly.)mcp__plugin_linear_linear__create_attachment_from_upload to attach it to the issue. Set the attachment title to exactly <issue-id>-test-plan.md — qa finds the plan by matching this title (*-test-plan.md), so the name is part of the contract.Idempotent re-run. If Phase 0.1 found an existing *-test-plan.md attachment, replace it rather than duplicate: create the new attachment first, then mcp__plugin_linear_linear__delete_attachment on the old one. Creating before deleting means a mid-run failure never leaves the ticket with no plan.
Optional pointer comment. Attachments are easy to miss in Linear. If there isn't already a plan-qa pointer comment on the issue, you may post a one-liner via mcp__plugin_linear_linear__save_comment — "📋 Test plan attached: <issue-id>-test-plan.md (N scenarios across M ACs). Run /qa <issue-id> to execute against it." Keep it to a single comment; don't repost on re-runs.
Tell the developer:
<issue-id>-test-plan.md is attached to the ticket (and that re-running replaces it in place)./qa <issue-id> will now pick up this plan and test against it.Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub mvdmakesthings/skills --plugin delivery