بنقرة واحدة
uat-walk
Walk through a pending UAT file test-by-test with the user
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Walk through a pending UAT file test-by-test with the user
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
File a new bug report in wiki/work/bugs/ with required-on-report fields and append it to the bug index
Audit all project functionality at a high level and produce a 2-3 minute demo run book plus a Marp slideshow
Orchestrator for parallel agent teams. When invoked with a roadmap file path, drives every item through the full tackle → uat-generate → uat-auto pipeline until complete. When invoked with a task file path, runs that pipeline once and stops.
Refresh codebase context via Serena memories
Append a new item (task link or inline) to an existing roadmap in wiki/work/roadmaps/, optionally under a named phase
Create a structured execution-plan roadmap in wiki/work/roadmaps/ via short Socratic Q&A — captures goal, phases, and the initial hybrid (task-link OR inline) checklist
| name | uat-walk |
| description | Walk through a pending UAT file test-by-test with the user |
| category | executing |
| model | claude-sonnet-4-6 |
| argument-hint | <path/to/uat-file.md, number-slug, or description> |
| disable-model-invocation | false |
| user-invocable | true |
Always obey .docs/guides/mcp-tools.md. Read it now if not already in context.
Always obey wiki/work/tasks/lifecycle.md. Read it now if not already in context.
Run /primer first if you have not already this session.
Interactively walk through each test in a pending UAT file, presenting instructions to the user and recording pass/fail results.
UAT File: $ARGUMENTS
This command is part of the task lifecycle: /task-add → /tackle → /uat-generate → /uat-walk
Tasks remain at their stable path in wiki/work/tasks/ until all UAT tests pass, at which point this command flips their status: to done (files never move). UAT files are generated by /uat-generate and placed in wiki/work/uat/.
This command runs in a continuous loop, presenting tests in typed batches:
┌─────────────────────────────────────────────────────────────────────────────┐
│ 1. READ & PARSE → 1.5. MODE SELECT → 2. FIND NEXT BATCH → 3. PRESENT │
│ ↑ (first cycle) │ │
│ │ ┌─────────┼──────────┐ │
│ │ 3A. API 3B. UI 3C. Manual │
│ │ (auto-run) (compact) (single) │
│ │ └─────────┼──────────┘ │
│ │ ↓ │
│ │ 4. RECORD VERDICTS (per test) │
│ │ / \ │
│ │ [fix now] [other] │
│ │ ↓ ↓ │
│ │ FIX → RE-TEST UPDATE │
│ │ ↓ │ │
│ └──────────────── 5. UPDATE FILE ←───────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
Parse $ARGUMENTS to locate the UAT file:
If a file path is provided (e.g., wiki/work/uat/UAT-003-user-auth.md):
If a number-slug is provided (e.g., UAT-003 or 003-user-auth):
wiki/work/uat/ for a matching file (files never move — no completed/ subdir)If only a description or number is provided (e.g., user auth or 3):
wiki/work/uat/ for a matching UAT fileUse the resolved file path for all subsequent steps.
wiki/work/uat/, warn the user and confirm they want to proceed### UAT-* patterns (e.g., ### UAT-API-001:, ### UAT-UI-002:)## Prerequisites- [ ] Pass (pending), - [x] Pass (passed), - [FAIL: ...] ... (failed), - [FIXING: ...] ... (fix in progress), or - [SKIP: ...] ... (user skipped)After parsing, decide the mode based on what's present. Only ask the user when there is a genuine ambiguity — if only one mode is sensible, pick it silently and proceed.
| Failed count | Pending count | Action |
|---|---|---|
| 0 | any | Skip this step. Proceed with Pending only silently. |
| ≥1 | 0 | Skip this step. Proceed with Failed only silently (Failed first and Failed only are equivalent when no pending tests remain). Briefly note the auto-choice in your status line, e.g. "3 failed tests, no pending — re-running failed tests." |
| ≥1 | ≥1 | Ask the user inline (see prompt below). |
When asking is required, present the mode choice inline:
This UAT has N failed and M pending tests.
Failed first / Pending only / Failed only?
Store the chosen (or auto-selected) mode for the duration of this walkthrough.
- [ ]), attempt to auto-verify each one before presenting it to the user:
curl, pg_isready, a file existence check). One Bash call per prerequisite.| Mode | Order |
|---|---|
| Failed first | All [FAIL] tests in document order → then all - [ ] Pass tests in document order |
| Pending only | Only - [ ] Pass tests in document order (skip [FAIL]) |
| Failed only | Only [FAIL] tests in document order (skip - [ ] Pass) |
When re-testing a failed test, first reset its status from - [FAIL: ...] back to - [ ] Pass in the file before presenting it.
Tests are presented based on their type:
Classify each test by type:
curl, http, wget, or code blocks with shell commands in the Steps or Expected Result, OR has an Endpoint: metadata fieldUAT-UI-* prefix, or has Page: / Components: metadataCollect the next batch from the eligible tests (per mode):
Route to the appropriate presentation flow:
[FAIL: ...] and [FIXING: ...]. Non-blocking statuses are [x] Pass (passed) and [SKIP: ...] (user decided the test is not necessary). Only - [ ] Pass (untested) is ambiguous — it is non-blocking only if the current mode excluded it (e.g., "Failed only" mode skips pending tests).All presentation uses markdown bold (**Label:**) for labels — Claude Code renders bold in the terminal. Always show current progress counts.
API/CLI tests are executed automatically — no user prompt before running. Present the batch, run all commands, and show results.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
API TEST BATCH [tests 3–7 of 18]
**Progress:** 2/18 passed · 0 failed · 16 remaining
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
───────────────────────────────────────────
**[3 of 18] UAT-API-001: Create Position**
**Endpoint:** POST /api/positions
**Description:** Verify creating a new position returns 201
▶ **COMMAND:**
curl -sS -X POST 'http://localhost:4321/api/positions' -H 'Content-Type: application/json' -d '{"title":"Engineer"}'
▶ **EXPECTED:**
- HTTP 201
- Response body contains `id` and `title: "Engineer"`
▶ **ACTUAL:**
- HTTP 201
- Response: {"id": 1, "title": "Engineer", "created_at": "2026-04-04T..."}
▶ **RESULT:** ✅ Matches expected
───────────────────────────────────────────
Layout rule: EXPECTED must always appear immediately above ACTUAL with no other content between them — never side-by-side prose, never separated by intervening output. The user must be able to compare the two blocks at a glance without scrolling. If a response body is truncated for display, truncate it inside the ACTUAL block; do not move it elsewhere.
Assessment rule (mandatory, applies on every presentation including retests): After the ACTUAL block, always output a ▶ **RESULT:** line with a clear indicator:
✅ Matches expected — when all expected criteria appear to be met❌ Does not match expected — <one-line reason> — when the output diverges (wrong status code, missing field, error body, etc.)This indicator is the agent's observation, not a verdict — the user still issues the final pass/fail. It must appear on every API/CLI result presentation, including after a Fix Now retest.
Execute tests one at a time, one Bash invocation per test. Run the test, capture and present its result, then run the next test. Never batch multiple tests into a single Bash call. The walkthrough's "batch" concept refers to presentation grouping, not command chaining.
Capture for each test:
-i, or use -sS and rely on the response body for status indication)If a command fails to execute (connection refused, timeout, etc.) OR the actual result does not match the expected result (e.g., HTTP status mismatch, error in response body, missing fields, exception output):
▶ **RESULT:** ❌ Does not match expected — <reason>Pass / Fail / Fix now / Skip?After all tests in the batch are executed without failure, present the batch results summary and ask for verdicts (see Step 4A)
Pass / Fail / Fix now / Skip? for the failing test and wait for an explicit reply before running any further tests. The agent never moves on after a failure without explicit direction. Observing a mismatch is not the same as judging pass/fail — the user still issues the verdict; the agent only halts so the user can decide.**Command**: block written by /uat-generate)These patterns trigger user approval prompts on every invocation, slow the walkthrough to a crawl, and obscure the real curl output. Do not use them. Ever.
| ❌ Forbidden | Why | ✅ Do this instead |
|---|---|---|
Multiple curl calls in one Bash invocation | Chained commands trigger approval prompts; agent loses per-test feedback loop | One Bash call per test, run sequentially |
echo "=== UAT-API-001 ===" banners | Approval prompt; clutters output | The presentation header (Step 2) is the banner |
&&, ;, || chaining between commands | Same as above | Separate Bash calls |
-w "\nHTTP %{http_code}\n" format strings | The user reads response directly; this is line noise | Just curl -sS |
-o /tmp/api1.json then head -c 800 /tmp/api1.json | Approval prompt; pointless indirection | Print response to stdout, truncate display in your message |
--max-time 90 or other defensive flags | Defaults are fine; failing fast is good | Plain curl -sS |
Pre-assigning TOKEN=..., STRATEGY_ID=... then using $TOKEN in the curl | Multi-line shell scripts trigger approval prompts and hide values | Inline the literal value into the curl command on a single line |
curl ... \ line continuations | Single-line commands are easier to read in the approval dialog | One long line per curl |
Piping into head, tee, or output redirection | All trigger approval prompts | A single | jq '.' or | jq '<projection>' is permitted; nothing else |
The rule of thumb: each Bash call should contain exactly one program invocation (one
curl, optionally onejqpipe stage). If your bash command has more than one statement, more than onecurl, anecho, a;, or a&&, you are doing it wrong. Run the test again as a single clean curl.
If the previously generated UAT file contains any of these forbidden patterns in its **Command**: blocks, clean them up before running — do not faithfully execute a malformed command just because it was written that way. The clean curl style is documented in lib/skills/uat-generate/SKILL.md "Curl command standards".
UI tests are presented in batches of up to 3, written compactly so the entire batch fits on screen without scrolling. Every test entry must be brief — a one-line description, abbreviated steps, and a one-line expected result. Omit preamble, rationale, and prose padding.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
UI TEST BATCH [tests 8–10 of 18]
**Progress:** 7/18 passed · 0 failed · 11 remaining
**Page:** http://localhost:4321/strengths
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[8] UAT-UI-001 — Strength Panel Layout
Steps: Navigate to /strengths · Verify panel is on the right
Expected: Right-aligned, no horizontal scroll
───────────────────────────────────────────
[9] UAT-UI-002 — Strength Panel Empty State
Steps: Clear strengths · Navigate to /strengths
Expected: "No strengths yet" message visible
───────────────────────────────────────────
[10] UAT-UI-003 — Strength Card Display
Steps: Add a strength · Check the card
Expected: Card shows title and description
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Verdicts for UI batch (tests 8–10)?
[8] Pass / Fail / Fix now / Skip?
[9] Pass / Fail / Fix now / Skip?
[10] Pass / Fail / Fix now / Skip?
Page: URL, show it once in the batch headerTests that don't fit API/CLI or UI categories are presented one at a time (no batching):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TEST [14 of 18]: UAT-EDGE-003 — Concurrent Updates
**Progress:** 12/18 passed · 1 failed · 5 remaining
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**Description:** Verify that concurrent updates to the same record don't cause data loss
**Scenario:** Two users edit the same position simultaneously
**STEPS:**
1. Open position #1 in two browser tabs
2. Edit the title in tab 1 and save
3. Edit the description in tab 2 and save
───────────────────────────────────────────
▶ **EXPECTED RESULT:**
- Second save either merges or shows a conflict error
- No silent data loss
After presenting, proceed to Step 4C for a single verdict.
Prompt the user inline — do NOT use AskUserQuestion for verdicts. The approach varies by batch type.
You MUST receive an explicit pass/fail/fix/skip verdict from the user for every single test before moving on. No exceptions.
Pass / Fail / Fix now / Skip? for the single failing test and STOP and wait. Do NOT execute the next test in the batch, do NOT proceed to the batch verdict prompt, and do NOT call any other tools until the user has given direction for the failing test. The agent never moves on after a failure without explicit user direction.This is a hard requirement, not a preference. Violating it invalidates the walkthrough.
After executing and presenting all tests in the batch, collect verdicts per test:
**Verdicts for API batch (tests 3–7):**
[3] UAT-API-001: Create Position — Pass / Fail / Fix now / Skip?
[4] UAT-API-002: Get Position — Pass / Fail / Fix now / Skip?
[5] UAT-API-003: Update Position — Pass / Fail / Fix now / Skip?
[6] UAT-API-004: Delete Position — Pass / Fail / Fix now / Skip?
[7] UAT-API-005: List Positions — Pass / Fail / Fix now / Skip?
The user can respond in any of these formats:
all pass, all p — applies the same verdict to every test in the batchp p f fix s — space-separated verdicts in order3: pass, 5: fail, rest pass — named overrides with a defaultParse the response and apply verdicts. If ambiguous, ask for clarification.
After the user has tested the UI batch, collect verdicts per test:
**Verdicts for UI batch (tests 8–10):**
[8] UAT-UI-001: Strength Panel — Layout — Pass / Fail / Fix now / Skip?
[9] UAT-UI-002: Strength Panel — Empty State — Pass / Fail / Fix now / Skip?
[10] UAT-UI-003: Strength Card — Display — Pass / Fail / Fix now / Skip?
Same response formats as Step 4A (all same, per-test, selective, or single).
For manual (non-batched) tests, prompt:
Pass / Fail / Fix now / Skip?
The user will type their choice. Accept any unambiguous prefix (e.g., "p", "pass", "f", "fail", "fix", "s", "skip").
- [x] Pass <!-- YYYY-MM-DD -->- [FAIL: <user's note or "No details provided">] <!-- YYYY-MM-DD --><X> utility. Should I scope it narrowly to this test or update it globally?"
If the fix path is unambiguous (one obvious change, no shared-code risk), proceed directly.- [FIXING: <user's note>] <!-- YYYY-MM-DD -->- [ ] Pass and re-present this same test for the user to verify the fix- [SKIP: <user's reason or "User skipped">] <!-- YYYY-MM-DD -->After each verdict:
Edit tool — one Edit call per status line. Never use sed, awk, perl -i, or echo to flip status markers, even when many tests need updating in a row. One Edit call per test is correct; one sed is wrong (and triggers an approval prompt every time). See .docs/guides/mcp-tools.md "Common anti-patterns".
- [ ] Pass with the appropriate marker (see Step 4)Pass:
Before: - [ ] Pass
After: - [x] Pass <!-- 2026-03-03 -->
Fail:
Before: - [ ] Pass
After: - [FAIL: Returns 401 instead of 200, token may be expired] <!-- 2026-03-03 -->
When the user selects "Fix now", delegate the fix to a general-purpose subagent via the Task tool:
Fix a UAT test failure.
UAT File: <path>
Test: <UAT-ID> — <Test Name>
Failure: <user's description of what went wrong>
Test details:
<paste the full test section: endpoint/page, description, steps, expected result>
Instructions:
1. Use MCP Serena to find the relevant code for this test
2. Identify the root cause of the failure
3. Implement the fix
4. Run any available quality checks (linter, typecheck, tests)
5. Report what was changed and why
⚠️ NEVER AUTO-PASS AFTER A FIX — this is the most important rule in the fix workflow.
- [ ] PassPass / Fail / Fix now / Skip?[FIXING: ...] marker is temporary — it must be replaced with either [x] Pass, [FAIL: ...], or [ ] Pass before moving to the next testAfter updating:
When the walkthrough ends (all tests resolved or user aborts), report:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
UAT WALKTHROUGH COMPLETE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
File: wiki/work/uat/UAT-005-positions.md
Source: wiki/work/tasks/TASK-005-positions.md
Results:
✅ Passed: 6
⚠️ Skipped: 1
❌ Failed: 2
❔ Pending: 0
Total: 9
Failed Tests:
• UAT-API-003: Delete Position — "Returns 500 instead of 204"
• UAT-EDGE-001: Empty Positions — "Loading spinner never resolves"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
All complete (no [FAIL] or [FIXING] markers remain — every test is [x] Pass or [SKIP: ...]):
status: pending (or in-progress) → status: passed; bump updated: to today in the UAT file's frontmatter.task: frontmatter to get the task ID (e.g. TASK-014). Open wiki/work/tasks/TASK-NNN-slug.md, edit status: in-progress → status: done; bump updated:.wiki/work/uat/index.mdwiki/work/tasks/index.md
Use a single Edit call per file — never sed.git mv wiki/work/uat/<UAT-file>.md wiki/work/uat/archive/<UAT-file>.mdwiki/work/uat/archive/index.md: | [[UAT-NNN]] | Title | passed | YYYY-MM-DD |git mv wiki/work/tasks/<TASK-file>.md wiki/work/tasks/archive/<TASK-file>.mdwiki/work/tasks/archive/index.md: | [[TASK-NNN]] | Title | done | YYYY-MM-DD |
Use Bash for git mv only. Use Edit for all index appends.status: active in wiki/work/roadmaps/ (scan by frontmatter). For each:
Read the roadmap and look for checklist lines matching [[TASK-NNNEdit matching lines: - [ ] [[TASK-NNN → - [x] [[TASK-NNN- [ ] free-text lines; use judgment to determine if the completing task accomplished them; Edit - [ ] → - [x] for those it clearly did; leave uncertain items unchecked[x]: flip roadmap status: active → status: done; bump roadmap updated:; remove the roadmap's row from wiki/work/roadmaps/index.md; then archive the roadmap file:
git mv wiki/work/roadmaps/<file>.md wiki/work/roadmaps/archive/<file>.mdwiki/work/roadmaps/archive/index.md: | [[ROADMAP-NNN]] | Title | done | YYYY-MM-DD |Edit only (except git mv via Bash).implements::[[DEC-NNNN#DM]]:
wiki/work/decisions/DEC-NNNN-slug.md, find the "Source task(s):" line for this task, append — implemented YYYY-MM-DD to that linewiki/work/tasks/ and wiki/work/tasks/archive/ for other tasks with status: todo|in-progress that also implements::[[DEC-NNNN#DM]]; if none remain, also append — decision fully implemented YYYY-MM-DD on a new line in the decision block- [ ] lines in the ## D<N>. block; use judgment to decide which were accomplished; Edit accordinglyRead then Edit only — never sedwiki/log.md:
## [YYYY-MM-DD] uat | UAT-NNN passed · TASK-NNN done
Archived UAT-NNN → uat/archive/ and TASK-NNN → tasks/archive/. [one sentence on what was verified]
done/passed status, and the archive paths.Some failed (any [FAIL] or [FIXING] markers remain): Leave UAT file in wiki/work/uat/ with status: in-progress. Suggest next steps:
To fix failures and re-test: /uat-walk wiki/work/uat/UAT-NNN-slug.md
To create fix tasks: /task-add "Fix UAT failures in <feature>"
Aborted: Leave UAT in wiki/work/uat/, note progress was saved in the file.
AskUserQuestion for verdicts. The user types their choice directly in the chat.- [ ] Pass → - [x] Pass, - [FAIL: ...], - [FIXING: ...], or - [SKIP: ...])[FIXING: ...] is always temporary — must resolve to [x] Pass, [FAIL: ...], [SKIP: ...], or [ ] Pass before moving onNow start the walkthrough:
$ARGUMENTSStart now — read the UAT file and present the first test.