manual-test-script-author
Builds stakeholder-readable scripted manual test cases from a feature spec in four formats: a step-table (preconditions / steps / expected result / actual / pass-fail / notes) for spreadsheet review, a Gherkin Given/When/Then format for BDD-aware teams, a business-language UAT script with acceptance-criteria mapping and contractual sign-off (references/uat-format.md), and a one-line-per-item execution checklist for smoke / on-call / bug-bash / compliance sweeps (references/checklist-format.md). Each script is self-contained (no implicit team knowledge), single-scenario (one happy + N edge per script), and includes the data setup the tester needs without being a developer. Use when a feature can't be (or shouldn't be) fully automated and a human tester needs an executable script or checklist - UAT sign-off rounds, regression baselines, certification testing, deploy smoke checklists, exploratory follow-up scripts.
Install with skills.sh (any agent)
npx skills add testland/qa --skill manual-test-script-authormanual-test-script-author
Overview
Not every test should (or can) be automated. Some need a human:
This skill builds those scripts in four formats: a step-table for spreadsheet review, Gherkin for BDD-aware teams, a business-language UAT script for stakeholder sign-off (references/uat-format.md), and a focused execution checklist for smoke / on-call / compliance sweeps (references/checklist-format.md).
For session-based exploratory tests (where the script doesn't predetermine steps), use exploratory-testing - the charter-driven sibling skill - instead.
When to use
If the feature is fully automatable and the team has the budget, write an automated test - see gherkin-from-stories (in the qa-bdd plugin) for the upstream Gherkin generation.
Step 1 - Read the input
The skill takes one of:
Extract the actor, trigger, and observable outcomes - the same Gherkin structure as gherkin-from-stories (qa-bdd plugin). A manual script is the same logical shape as a Gherkin scenario; the difference is the level of detail + the inclusion of setup data.
Step 2 - Format A: step-table (spreadsheet)
The default format. Reads top-to-bottom; each row is one step the tester executes:
## TC-1234 - Apply promo code at checkout
**Feature:** Checkout - promo codes
**Tester:** ____________________ **Date:** ____________________
**Build:** ____________________ **Environment:** staging | prod
### Preconditions
- [ ] User account `qa-test-user@example.com` exists with valid
payment method (Stripe test card 4242…) attached.
- [ ] Cart contains 1× SKU `BOOK-001` ($24.99).
- [ ] Promo code `WELCOME10` is active in the admin panel
(10% off, no minimum).
### Steps
| # | Action | Expected result | Actual | Pass/Fail | Notes |
|----|---------------------------------------------------------|----------------------------------------------------------------|--------|-----------|-------|
| 1 | Navigate to `/checkout`. | Cart subtotal shows `$24.99`. Promo input is visible. | | | |
| 2 | Enter `WELCOME10` in the promo input. Click `Apply`. | Subtotal updates to `$22.49`. Confirmation toast: "Code applied". | | | |
| 3 | Click `Place order`. | Confirmation page shows order ID. Total `$22.49` (plus tax). | | | |
| 4 | Check email inbox for `qa-test-user@example.com`. | Confirmation email arrives within 5 min, total `$22.49`. | | | |
### Sign-off
**Tester signature:** ____________________
**Sign-off date:** ____________________
### Defects raised
(list)The Preconditions block is load-bearing - without it, the tester improvises setup, and the script's repeatability collapses. Cite specific test data (account email, SKU, code) so two runs produce the same result.
Step 3 - Format B: Gherkin (BDD-aware)
Feature: Apply promo code at checkout
Background:
Given a logged-in user "qa-test-user@example.com" with a valid Stripe test card attached
And the user's cart contains 1× SKU "BOOK-001" ($24.99)
And promo code "WELCOME10" is active (10% off, no minimum)
Scenario: Apply valid promo at checkout
Given the user is on the /checkout page
When the user enters "WELCOME10" in the promo input
And the user clicks "Apply"
Then the subtotal updates from "$24.99" to "$22.49"
And a confirmation toast appears: "Code applied"
When the user clicks "Place order"
Then the confirmation page shows an order ID
And the order total is "$22.49" (plus tax)
And a confirmation email arrives within 5 minutes at "qa-test-user@example.com" with total "$22.49"
Scenario: Apply expired promo at checkout
Given promo code "EXPIRED50" is inactive (expired 2026-01-01)
When the user enters "EXPIRED50" in the promo input
And the user clicks "Apply"
Then the subtotal remains "$24.99"
And an error appears: "This code has expired"Same content as Format A, different shape. Pick based on the team's tooling: spreadsheets prefer A; Cucumber / Behat prefer B.
Format C - UAT script (stakeholder sign-off)
When the runner is a business stakeholder and sign-off is the contractual gate (B2B contracts, regulated industries, customer acceptance as the payment trigger), use the UAT format: one script per user journey, business language only, an acceptance-criteria verification table, and a tester + stakeholder sign-off block. Full format, the business-language translation table, and the three-tasks scoping rule: references/uat-format.md.
Format D - focused execution checklist
When the need is a fast human-runnable sweep (a per-deploy production smoke, an on-call first-pass, a bug-bash kickoff, a periodic compliance record), a full step-table is overkill: use the checklist format - 10-30 one-line [ ] feature: action → observable outcome items grouped by flow, with a per-group time budget and versioned files. Full format and scoping table: references/checklist-format.md.
Step 4 - Single-scenario discipline
A 30-step script that bundles 5 scenarios (happy path + 4 edge cases) is unmaintainable. The pattern:
TC-1234 - Apply valid promo
TC-1235 - Apply expired promo
TC-1236 - Apply invalid-format promo
TC-1237 - Apply already-used promo
TC-1238 - Apply promo to empty cartThe cost is more TCs; the benefit is per-TC pass/fail clarity. A 30-step bundle that fails at step 17 obscures whether step 17 was the bug or step 12 was a precondition violation.
Step 5 - Self-contained data
Per exploratory-wiki (opens in new window):
"In reality, testing almost always is a combination of exploratory and scripted testing, but with a tendency towards either one, depending on context."
Manual scripts that depend on "the test data the team uses" or "whatever account QA has" fail when the next tester runs them. The script must specify:
Step 6 - Defect-raising integration
When a step fails, the tester needs to log a defect with enough context for the developer to reproduce. The script's Defects raised section captures:
| Defect ID | Step | Expected | Actual | Severity |
|-----------|-------|-----------------------------------|----------------------------------|----------|
| BUG-9876 | 2 | Subtotal updates to `$22.49` | Subtotal stays at `$24.99`; toast says "Invalid code" | high |Turn each failure into a structured bug-reproduction package.
Output format
## Manual test scripts - `<feature>`
**Source spec:** `<story / PRD / charter>`
**Format:** step-table | gherkin
**Scripts produced:** N
**Estimated wall time per full run:** ~M minutes
| TC ID | Title | Format | Wall time | Coverage |
|--------|---------------------------------------------|------------|----------:|----------|
| TC-1234 | Apply valid promo | step-table | ~3 min | happy path |
| TC-1235 | Apply expired promo | step-table | ~3 min | edge |
| TC-1236 | Apply invalid-format promo | step-table | ~2 min | edge |
(per-TC bodies follow)
### Test data dependencies
- Account: `qa-test-user@example.com`
- SKUs: `BOOK-001` ($24.99)
- Promo codes: `WELCOME10` (active), `EXPIRED50` (expired)
- Test card: Stripe `4242 4242 4242 4242`
### Author notes
- Each TC is self-contained - no implicit cross-TC dependencies.
- Sign-off block is per-TC; aggregate sign-off via release runbook.Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| One TC bundling 5 scenarios | Failure at step N obscures the cause; reruns repeat all N steps. | One TC per logical scenario (Step 4). |
| Vague preconditions ("the user is set up") | Different testers improvise differently; results diverge. | Specific account / SKU / data per script (Step 5). |
| Steps without expected results ("click submit") | Tester doesn't know what to assert; pass/fail is subjective. | Every step has an "Expected result" column (Step 2). |
| Manual scripts for fully-automatable features | Maintenance burden; diverges from the automated suite. | Automate first; manual scripts for the irreducibly-human cases (Use). |
| No defect-raising column | Failures get logged in chat / lost; reproducibility gone. | Defects-raised block (Step 6); link to bug-repro tooling. |
| Relying on the tester's experience to fill gaps | Onboarding new testers becomes painful. | Self-contained scripts; no implicit team knowledge (Step 5). |
| Scripts in PDF / Word that can't be diffed | Updates lost; tracking changes manual. | Markdown / Gherkin; version-controlled. |
Limitations
References
Execution checklist format
View source (opens in new window)Execution checklist format
Deep reference for manual-test-script-author SKILL.md. A full step-table script is overkill for some situations:
For these, a focused checklist wins: ~10-30 items, each one line, each with a clear pass/fail. The whole list fits on one screen / one printed page; the runner sweeps through it in 5-15 minutes. This format converts a regression suite (or test plan) into that checklist.
When to use this format
If the use case is "test a feature thoroughly before release," use the full step-table format from the SKILL.md body instead - expected results per step.
Step 1 - Pick scope
A checklist's value is its focus. Scope by one of:
| Scope | Item count | Wall time | Use |
|---|---|---|---|
| Critical-path smoke | ~10 | ~5 min | Per-deploy. |
| Primary-flow check | ~20 | ~15 min | On-call first-pass. |
| Full-feature sweep | ~30 | ~30 min | Bug-bash kickoff. |
| Compliance record | ~10 | ~10 min | Weekly / monthly. |
Wider scope = lower run frequency = less repeated value.
Step 2 - Convert each test case to one-line form
Source TCs from the step-table scripts or the existing regression suite. Compress each to a single line with three slots:
[ ] [feature]: [action] → [observable outcome]Examples:
[ ] **Login**: enter `qa-test-user@example.com` + valid pwd → dashboard loads in <3s.
[ ] **Cart**: add `BOOK-001` → cart count badge shows "1".
[ ] **Promo code**: apply `WELCOME10` → subtotal drops by 10%.
[ ] **Checkout**: click `Place order` → confirmation page within 5s.
[ ] **Email**: order confirmation arrives within 5 min.If a step needs 3+ lines to express, split into multiple checklist items OR move it back to the full step-table format - the checklist isn't the right artifact for that step.
Step 3 - Group by flow
A 30-item flat list is hard to scan. Group:
## Production smoke - release `v1.4.5`
**Tester:** ___________________ **Date:** ___________________ **Time:** ___________________
**Environment:** prod | staging **Build SHA:** ___________________
### Auth flow
- [ ] **Login** (existing user): `qa-test-user@example.com` + valid pwd → dashboard <3s
- [ ] **Logout**: click `Sign out` → redirect to `/login`
- [ ] **Password reset**: click `Forgot password` → email arrives within 5 min
### Cart + checkout flow
- [ ] **Add to cart**: SKU `BOOK-001` → cart count badge shows "1"
- [ ] **Cart page**: navigate to `/cart` → item visible with qty 1, $24.99
- [ ] **Promo code**: apply `WELCOME10` → subtotal drops to $22.49
- [ ] **Checkout**: complete checkout with Stripe test card 4242 → confirmation page
### Account flow
- [ ] **Profile update**: change email → save → reload → email persists
- [ ] **Order history**: view past orders → most recent test order present
### Sign-off
**Pass / fail / partial:**
**Defects raised:** (list IDs)
**Notes:**The flow grouping doubles as a coverage check - empty groups mean the smoke doesn't cover that flow.
Step 4 - Time-box and document
A checklist that takes "as long as it takes" gets skipped. Set an explicit budget per group:
| Group | Items | Budget |
|---------------------|------:|-------:|
| Auth flow | 3 | 3 min |
| Cart + checkout flow | 4 | 6 min |
| Account flow | 2 | 3 min |
| **Total** | 9 | 12 min |If the actual run exceeds the budget by >50%, the checklist is too long; trim to the highest-signal items.
Step 5 - Pair with a defect-raising flow
Same as the SKILL.md body's defect-raising step - checklist failures need a path to a logged defect:
### Defects raised this run
| # | Item | Observed | Severity | Bug ID |
|---|-----------------------------------------------|-------------------------------------|----------|---------|
| 1 | Promo code: apply WELCOME10 | Subtotal stayed at $24.99 | high | BUG-987 |Step 6 - Versioning
The checklist evolves with the product. Keep it in docs/:
docs/checklists/
├── prod-smoke-v1.md
├── prod-smoke-v2.md ← current
├── on-call-first-pass-v1.md
└── bug-bash-checkout-v1.mdBumping the version when the items change (rather than mutating in place) preserves the historical record - useful for audit ("what did the smoke check on 2026-04-15?") and for retrospective on incidents that the smoke missed.
Output format
## Test execution checklists - `<feature/area>`
**Generated from:** `<source - TC suite / test plan / story>`
**Total items:** N
**Total wall-time budget:** M minutes
**Scope:** smoke | first-pass | full sweep | compliance
(per-checklist bodies follow per Step 3)
### Coverage notes
- Auth flow: N items covering login + logout + password reset
- Cart flow: N items covering add + view + checkout
- Areas NOT covered (intentional): admin panel (out of smoke scope),
internationalized currencies (covered weekly via `prod-smoke-i18n.md`)Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| 50-item flat list | Tester loses focus; coverage drops mid-run. | Group by flow, ≤8-10 items per group (Step 3). |
| Items with multi-line steps | Defeats the checklist's purpose (one-line scan). | Split or move to full step-table (Step 2). |
| No time budget | "When you have time" → never run. | Per-group budget (Step 4). |
| One generic checklist for "everything" | Tries to be smoke + UAT + compliance; serves none well. | Per-purpose checklists; pick scope first (Step 1). |
| No defect-raising integration | Failed items get logged in chat; the run record is incomplete. | Defects-raised block in the sign-off (Step 5). |
| Checklist mutated in place (no version) | Can't tell what was checked when; audit / incident analysis broken. | Versioned files (Step 6). |
| "Smoke" check that takes 45 minutes | Smoke ≠ full regression; team skips after deploy. | Hard cap at 10-15 min for smoke (Step 1 table). |
Limitations
References
UAT script format
View source (opens in new window)UAT script format
Deep reference for manual-test-script-author SKILL.md. UAT scripts are written for stakeholders, not developers: the end user, subject-matter expert (SME), or solution owner runs the script in business language, and the success criterion is "this works for the business," not "no exceptions thrown." Sign-off is a contractual artifact - upon meeting the acceptance criteria the stakeholder signs off, confirming the product meets defined requirements (uat-wiki (opens in new window)).
When to use this format
If the test is technical (verify HTTP 200, validate schema), use the step-table or Gherkin format from the SKILL.md body - the developer-facing formats.
Step 1 - Identify the user journey
Per uat-wiki (opens in new window):
"UAT should be executed against test scenarios representing user journeys rather than technical click-by-click steps."
A UAT script covers one user journey end-to-end, not a single button-click. The journey is what the business stakeholder agreed to in the contract / SOW / acceptance criteria.
Examples:
Per uat-wiki (opens in new window), select the "three most common or difficult tasks users will perform" - UAT depth, not breadth.
Step 2 - Format
# UAT-001 - New customer first-order flow
**Customer / Stakeholder:** ____________________
**Tester:** ____________________ **Date:** ____________________
**Environment:** UAT **Build / Version:** v1.4.5
## Business context
This script verifies that a new prospective customer can complete
the full sign-up + first-order journey end-to-end, including
account creation, email confirmation, browsing the catalog, adding
items to cart, completing checkout, and receiving confirmation.
This corresponds to acceptance criterion **AC-1** in the SOW.
## Pre-conditions
- [ ] Test environment is at build `v1.4.5` (verified by tester).
- [ ] Tester has not previously created an account on this UAT
environment.
- [ ] Test payment method is available: Stripe test card
4242 4242 4242 4242, any expiry, any CVC.
- [ ] Tester has access to email inbox for `<email>@example.com`.
## Steps
| Step | Action | Expected outcome | Pass | Fail | Notes |
|------|------------------------------------------------------------------|-------------------------------------------------------------------------|:----:|:----:|-------|
| 1 | Open `https://uat.example.com/`. Click "Sign up". | Sign-up form appears. | | | |
| 2 | Enter email `uat-001-<initials>@example.com`, set password. | "Verify your email" prompt appears. | | | |
| 3 | Open the email inbox; click the verification link. | Browser opens to dashboard; greeting shows the user's name. | | | |
| 4 | Browse the catalog. Search for "BOOK-001". | Product page loads showing the item details and "Add to cart" button. | | | |
| 5 | Click "Add to cart". Click the cart icon. | Cart page shows "BOOK-001" qty 1, $24.99. | | | |
| 6 | Click "Checkout". Enter shipping address. | Order summary shows shipping cost; tax computed per address. | | | |
| 7 | Enter payment details (test card 4242…). Click "Place order". | Confirmation page shows order ID; total matches step 6. | | | |
| 8 | Open email inbox; verify confirmation email arrives within 5 min. | Email shows order ID, items, total, expected delivery date. | | | |
## Acceptance criteria verification
| AC ID | Description | Verified in step | Pass / fail |
|--------|------------------------------------------------------------|------------------|:-----------:|
| AC-1.1 | New customer can sign up | 1, 2, 3 | |
| AC-1.2 | New customer can browse the catalog | 4 | |
| AC-1.3 | New customer can add items to cart | 5 | |
| AC-1.4 | New customer can complete checkout | 6, 7 | |
| AC-1.5 | New customer receives order confirmation | 8 | |
## Sign-off
**Tester:** ____________________ **Date:** ____________________
**Customer / Stakeholder:** ____________________ **Date:** ____________________
By signing, the stakeholder confirms that the system meets
acceptance criteria AC-1.1 through AC-1.5 as defined in the
Statement of Work, dated YYYY-MM-DD.
## Defects raised
| Bug ID | Step | Severity | Description |
|--------|------|----------|-------------|
| | | | |Step 3 - Business language, not implementation
UAT scripts are read by stakeholders who don't speak HTTP / DB / React. Translate:
| Implementation language | Business language |
|---|---|
POST /orders returns 201 | The order is placed and the system shows a confirmation. |
cart.items.length === 1 | The cart shows the item. |
email.subject === 'Order confirmation' | An order confirmation email arrives. |
auth_token is set in the cookie | The user is logged in. |
INSERT INTO users succeeded | The account is created. |
The script is about outcomes, not mechanisms.
Step 4 - Three-tasks rule
Per uat-wiki (opens in new window): "the three most common or difficult tasks users will perform" - UAT covers depth, not breadth.
A UAT round shouldn't have 50 scripts. The pattern:
If the contract has 30 acceptance criteria, group them into ~10 journeys; one script per journey.
Step 5 - Run the round, log defects, re-test
Execute each script with the stakeholder. For every failed step, log a defect in the "Defects raised" table (Step 2 format) with its step and severity. Verify: every row in the acceptance-criteria table must read pass before sign-off; if any AC fails, hand the defects to the team, fix them, and re-run the affected scripts. Repeat until all acceptance criteria pass - do not proceed to sign-off with an open failing AC.
Step 6 - Sign-off as artifact
The signed UAT scripts go into the customer record:
The sign-off date triggers the contractual milestone (payment, go-live authorization, vendor approval).
Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| Implementation-language steps | Stakeholder can't follow. | Translate to business language (Step 3). |
| 50 UAT scripts | Stakeholder won't run them all; rubber-stamp result. | 5-10 + 2-5 difficult (Step 4). |
| Steps without expected outcomes | Stakeholder doesn't know what "success" means; subjective sign-off. | Every step has an expected outcome (Step 2). |
| No acceptance criteria mapping | Sign-off doesn't tie back to contract; legal exposure. | AC verification table (Step 2). |
| Script that mixes positive and negative cases | Stakeholder confused; sign-off ambiguous. | Positive cases only in UAT; negative cases via QA's regression suite. |
| Asking the developer to run UAT | Defeats the purpose; per uat-wiki (opens in new window) the end user / SME runs it. | Hand to the right person. |
| Skipping sign-off ("we'll do it later") | Contract milestone slips; payment delayed; trust eroded. | Hard-stop the release without signed scripts. |
Limitations
References
Related skills
bug-bash-facilitator
Builds a structured bug-bash session - pre-bash kit (charter, test-data prep, environment setup, sign-up sheet), in-bash structure (role rotation across cohorts, shared backlog board, real-time triage), scoring rubric (severity weighting, novelty bonus), and a post-bash same-day wrap-up authored by the facilitator (not a standalone debrief: for post-session writeups without a live bash, use the PROOF debrief in exploratory-testing). Use when a team needs a coordinated multi-tester sweep before a release or after a major change - converts an ad-hoc "everyone test for an hour" into a recorded, comparable session with deliverables.
decision-table-test-design
Derives human-readable manual test cases from a business-rule spec via a decision table: identify conditions and actions, build the full 2^n-column matrix, collapse columns with irrelevant entries, strike infeasible combinations, then emit one test case per remaining column (each feasible column is one coverage item per ISTQB CTFL v4.0 section 4.2.3). A deep single-technique walkthrough rather than a broad multi-lens case matrix; the output is manual step/expected cases rather than parameterized test code, and it covers how cases are derived rather than how a case record is structured. Use when a spec's outcome depends on interacting conditions (pricing, eligibility, discounts, routing rules) rather than the boundaries of a single input.
exploratory-charter-author
Authoring workflow that turns a feature spec, risk area, or bug cluster into a session-based exploratory testing charter per Jonathan and James Bach's SBTM - frames the one-sentence mission, scopes 3-7 areas, picks a 60 / 90 / 120 min time-box, suggests tours, and wires the PROOF debrief deliverables. Per Bach, exploratory testing is "performing tests while learning things that may influence the testing" - the charter sets the mission while leaving exact steps to the tester's judgment. Use when a feature has too many unknowns to script (new feature / refactor blast-radius / bug cluster) and a session-based exploration is the right approach. Authors the charter only: the ready-to-fill charter card, session vocabulary, debrief template, and session review live in the exploratory-testing skill this workflow composes with.
exploratory-testing
Plans and runs time-boxed exploratory testing when tester hours are scarce before a release - one tester with two free 45-minute blocks before code freeze, a high-stakes window such as year-end payroll, or a device and environment the scripted suite never touches. Session-based per the Bachs' SBTM: charters (Explore X with Y to discover Z), 60-90 minute sessions, session sheets with TBS metrics, and the PROOF debrief. Bundles the exploration heuristics as references - Whittaker's seven tours, Kelly's FCC CUTS VIDS, Bach's SFDPOT. Broader than exploratory-charter-author, which writes one charter document: this owns the whole cycle from budgeting the available hours to debriefing what was found. Use when deciding what to explore with the time available, and how to run and record those sessions.
state-transition-test-design
Derives human-readable manual test cases from stateful behavior: identify states, events, transitions, and guard conditions, draw the state table including invalid (empty-cell) transitions, choose a coverage level (all states, valid transitions / 0-switch, transition pairs / 1-switch per Chow, all transitions including invalid ones), then derive one test case per coverage item as an event sequence with per-step expected states (ISTQB CTFL v4.0 section 4.2.4). A deep single-technique walkthrough rather than a broad multi-lens case matrix; the output is manual step/expected cases rather than parameterized test code, and it covers how cases are derived rather than how a case record is structured. Use for lifecycle entities (accounts, orders, subscriptions), workflows, and UI wizards where the response to an event depends on the current state.