UAT-cycle
Executing UAT cycle: $ARGUMENTS
Phase 1: Select Test Case
If a test case ID was provided (e.g., UAT-001):
- Read
docs/testing/UAT_COVERAGE.md
- Find the test case by ID
- Present it to the user:
- Test Case ID: UAT-###
- Title: [title]
- Covers: [backlog story IDs or feature area]
- Prerequisites: [what's needed]
- Steps: [numbered steps]
- Acceptance Criteria: [checklist]
- Ask: "Ready to start testing? Are all prerequisites met?"
If a description was provided instead of an ID:
- Read
docs/testing/UAT_COVERAGE.md
- Find the best matching test case(s)
- If ambiguous, present options for the user to choose
- Once selected, present as above
If no argument was provided:
- Read
docs/testing/UAT_COVERAGE.md
- Show the status summary table
- List all test cases with status "Not Tested" (prioritized) or "Fail" (for retesting)
- Ask the user to select which test case to execute
Phase 2: Execute Test
Persona Context Loading
If the test case's parent story has a Personas: field (not "internal"), load the referenced persona(s) from docs/context/personas.md. When persona context is available:
- Frame test guidance from the persona's perspective — use their context (device, proficiency, constraints) to inform how the test should be performed
- Present steps with persona awareness — e.g., "As [Name] ([Role]), try to [step]. Given their [constraint], watch for [specific friction point]."
- Evaluate results against the persona's EVALUATES BY questions in addition to the acceptance criteria
- Flag FAILURE LOOKS LIKE matches — if a test result resembles the persona's failure scenario, escalate severity
Skip when: No Personas: field on the story, personas.md doesn't exist, or the test case is purely technical (API contract, data migration, etc.).
Test Execution
The user performs the test steps manually (or with automation tooling). Claude assists by:
- Ensuring prerequisites: Check that required services, data, or environments are available
- If prerequisites aren't met, help the user set them up
- Guiding through steps: Present steps one at a time or all at once (user preference). If persona context was loaded, annotate steps with persona perspective where relevant.
- Collecting results: After the user completes testing, ask for results on each acceptance criterion:
- Pass / Fail / Blocked / Not Applicable
- Any observations, screenshots, or feedback per criterion
- If persona context loaded: "From [persona name]'s perspective, did this meet their expectations?"
- Recording findings: For each failing criterion, ask:
- What happened vs. what was expected?
- Severity: Critical / Major / Minor / Cosmetic
- Any error messages or unexpected behavior?
- If persona context loaded: note which persona is most affected
Phase 3: Process Findings
For each finding (failing acceptance criterion), classify and act:
| Classification |
Indicators |
Action |
| Bug (Critical) |
Core functionality broken, data loss, crash |
Fix now (TDD: test → fix → verify) |
| Bug (Minor) |
UI glitch, cosmetic, non-blocking, edge case |
Fix now (minimal change) |
| Gap |
Feature missing entirely, expected capability absent |
Log to backlog |
| Enhancement |
Works but could be better, UX improvement |
Log to backlog or fix if trivial |
| Known Issue |
Already documented in known issues |
Note as confirmed, skip fix |
For each finding:
Bug (Critical)
- Investigate: Find the root cause in code
- Test first: Write a failing test capturing the bug
- Fix: Minimal code change
- Verify: Run the project's test command (from CLAUDE.md)
- Ask user to re-verify the specific acceptance criterion
- Commit:
fix(scope): description
Bug (Minor)
- Identify the issue in code
- Fix with minimal change
- Add test if regression-prone
- Run the project's test command
- Commit:
fix(scope): description
Gap
- Document clearly
- Write a user story (INVEST format) and add to the appropriate backlog file in
docs/reference/backlog/
- Do NOT implement — scope control
- Report what was logged
Enhancement
- Evaluate scope: Trivial (< 10 lines) → ask user if should fix now
- Larger → log to backlog
- Act accordingly
Known Issue
- Confirm the issue matches the known issue description
- Note it in the test results (no fix needed, already tracked)
Phase 4: Update UAT Coverage
After all findings are processed:
Update docs/testing/UAT_COVERAGE.md:
- Set the test case Status to: Pass (all criteria met) / Fail (any criteria failed and unfixed) / Pass (if all failures were fixed during this cycle)
- Set Tested On to today's date
- Add Findings notes summarizing what was found and done
- Update the Dashboard table at the top of the file
- Check/uncheck the acceptance criteria checkboxes based on results
- Append a row to the test case's
#### Results table:
| [status emoji] [status] | [today's date] | [tester] | [build via git rev-parse --short HEAD] | [one-line summary] |
Never delete existing rows — the Results table is an append-only execution log.
Update acceptance criteria checkboxes:
[x] for criteria that passed
[ ] for criteria that still fail (with a note explaining why)
Phase 5: Close Cycle
Run verification
- Run the project's test command (from CLAUDE.md) to confirm all automated tests still pass
Commit changes
If any code was changed during this cycle:
- Stage relevant files
- Commit with:
test(UAT): <test-case-id> — <summary of findings>
- Include fixes in the commit or as separate commits with proper conventional format
Completion Report
### UAT Cycle Complete
**Test Case:** UAT-### — [title]
**Result:** Pass / Fail / Partial
**Acceptance Criteria:** [x/y] passed
**Findings:**
- [summary of each finding and action taken]
**Files Modified:** [list]
**Commits:** [hash(es) and message(s)]
**Backlog Items Created:** [story IDs if any gaps were logged]
**Next:** Select another test case (`/UAT-cycle <id>`) or finish testing session.
Rules
- NEVER skip presenting the test case to the user first
- NEVER auto-pass acceptance criteria — only the user can confirm pass/fail
- ALWAYS update the UAT coverage file after each cycle
- ALWAYS commit code changes with proper conventional format
- Log gaps to the appropriate backlog file, not as inline TODOs
- Follow coding standards in
docs/reference/CODING_STANDARDS.md
1---2name: uat-cycle3description: Execute a UAT test case — select, test, process findings, fix or log, and close the cycle.4---5______________________________________________________________________67## UAT-cycle89Executing UAT cycle: **$ARGUMENTS**1011## Phase 1: Select Test Case1213### If a test case ID was provided (e.g., UAT-001):14151. Read `docs/testing/UAT_COVERAGE.md`161. Find the test case by ID171. Present it to the user:18 - **Test Case ID**: UAT-###19 - **Title**: \[title\]20 - **Covers**: \[backlog story IDs or feature area\]21 - **Prerequisites**: \[what's needed\]22 - **Steps**: \[numbered steps\]23 - **Acceptance Criteria**: \[checklist\]241. Ask: "Ready to start testing? Are all prerequisites met?"2526### If a description was provided instead of an ID:27281. Read `docs/testing/UAT_COVERAGE.md`291. Find the best matching test case(s)301. If ambiguous, present options for the user to choose311. Once selected, present as above3233### If no argument was provided:34351. Read `docs/testing/UAT_COVERAGE.md`361. Show the status summary table371. List all test cases with status "Not Tested" (prioritized) or "Fail" (for retesting)381. Ask the user to select which test case to execute3940## Phase 2: Execute Test4142### Persona Context Loading4344If the test case's parent story has a `Personas:` field (not "internal"), load the referenced persona(s) from `docs/context/personas.md`. When persona context is available:4546- **Frame test guidance** from the persona's perspective — use their context (device, proficiency, constraints) to inform how the test should be performed47- **Present steps** with persona awareness — e.g., "As [Name] ([Role]), try to [step]. Given their [constraint], watch for [specific friction point]."48- **Evaluate results** against the persona's **EVALUATES BY** questions in addition to the acceptance criteria49- **Flag FAILURE LOOKS LIKE** matches — if a test result resembles the persona's failure scenario, escalate severity5051**Skip when:** No `Personas:` field on the story, personas.md doesn't exist, or the test case is purely technical (API contract, data migration, etc.).5253### Test Execution5455The user performs the test steps manually (or with automation tooling). Claude assists by:56571. **Ensuring prerequisites**: Check that required services, data, or environments are available58 - If prerequisites aren't met, help the user set them up591. **Guiding through steps**: Present steps one at a time or all at once (user preference). If persona context was loaded, annotate steps with persona perspective where relevant.601. **Collecting results**: After the user completes testing, ask for results on each acceptance criterion:61 - Pass / Fail / Blocked / Not Applicable62 - Any observations, screenshots, or feedback per criterion63 - If persona context loaded: "From [persona name]'s perspective, did this meet their expectations?"641. **Recording findings**: For each failing criterion, ask:65 - What happened vs. what was expected?66 - Severity: Critical / Major / Minor / Cosmetic67 - Any error messages or unexpected behavior?68 - If persona context loaded: note which persona is most affected6970## Phase 3: Process Findings7172For each finding (failing acceptance criterion), classify and act:7374| Classification | Indicators | Action |75| -------------- | ---------------------------------------------------- | ----------------------------------- |76| Bug (Critical) | Core functionality broken, data loss, crash | Fix now (TDD: test → fix → verify) |77| Bug (Minor) | UI glitch, cosmetic, non-blocking, edge case | Fix now (minimal change) |78| Gap | Feature missing entirely, expected capability absent | Log to backlog |79| Enhancement | Works but could be better, UX improvement | Log to backlog or fix if trivial |80| Known Issue | Already documented in known issues | Note as confirmed, skip fix |8182For each finding:8384### Bug (Critical)85861. **Investigate**: Find the root cause in code871. **Test first**: Write a failing test capturing the bug881. **Fix**: Minimal code change891. **Verify**: Run the project's test command (from CLAUDE.md)901. **Ask user to re-verify** the specific acceptance criterion911. **Commit**: `fix(scope): description`9293### Bug (Minor)94951. **Identify** the issue in code961. **Fix** with minimal change971. **Add test** if regression-prone981. **Run** the project's test command991. **Commit**: `fix(scope): description`100101### Gap1021031. **Document** clearly1041. **Write a user story** (INVEST format) and add to the appropriate backlog file in `docs/reference/backlog/`1051. **Do NOT implement** — scope control1061. **Report** what was logged107108### Enhancement1091101. **Evaluate scope**: Trivial (< 10 lines) → ask user if should fix now1111. Larger → log to backlog1121. Act accordingly113114### Known Issue1151161. **Confirm** the issue matches the known issue description1171. **Note** it in the test results (no fix needed, already tracked)118119## Phase 4: Update UAT Coverage120121After all findings are processed:1221231. **Update `docs/testing/UAT_COVERAGE.md`**:124125 - Set the test case **Status** to: Pass (all criteria met) / Fail (any criteria failed and unfixed) / Pass (if all failures were fixed during this cycle)126 - Set **Tested On** to today's date127 - Add **Findings** notes summarizing what was found and done128 - Update the **Dashboard** table at the top of the file129 - Check/uncheck the acceptance criteria checkboxes based on results130 - Append a row to the test case's `#### Results` table:131 `| [status emoji] [status] | [today's date] | [tester] | [build via git rev-parse --short HEAD] | [one-line summary] |`132 Never delete existing rows — the Results table is an append-only execution log.1331341. **Update acceptance criteria checkboxes**:135136 - `[x]` for criteria that passed137 - `[ ]` for criteria that still fail (with a note explaining why)138139## Phase 5: Close Cycle140141### Run verification1421431. Run the project's test command (from CLAUDE.md) to confirm all automated tests still pass144145### Commit changes146147If any code was changed during this cycle:1481491. Stage relevant files1501. Commit with: `test(UAT): <test-case-id> — <summary of findings>`1511. Include fixes in the commit or as separate commits with proper conventional format152153### Completion Report154155```markdown156### UAT Cycle Complete157158**Test Case:** UAT-### — [title]159**Result:** Pass / Fail / Partial160**Acceptance Criteria:** [x/y] passed161**Findings:**162- [summary of each finding and action taken]163164**Files Modified:** [list]165**Commits:** [hash(es) and message(s)]166**Backlog Items Created:** [story IDs if any gaps were logged]167168**Next:** Select another test case (`/UAT-cycle <id>`) or finish testing session.169```170171## Rules172173- NEVER skip presenting the test case to the user first174- NEVER auto-pass acceptance criteria — only the user can confirm pass/fail175- ALWAYS update the UAT coverage file after each cycle176- ALWAYS commit code changes with proper conventional format177- Log gaps to the appropriate backlog file, not as inline TODOs178- Follow coding standards in `docs/reference/CODING_STANDARDS.md`