| name | qa |
| description | Independent acceptance verification skill. Run after execute completes to validate the implementation against the original REPORT's reproduction scenarios and the PLAN's success criteria โ using actual environment verification (test runs, API calls, UI checks via agent-browser, DB state inspection), not just self-reported "tests pass". Generates [ISSUE_ID]_QA.md with PASS/FAIL verdict and evidence. Korean triggers: QA ๊ฒ์ฆ, ํ์ง ๊ฒ์ฆ, qa ์คํ, ์ธ์ ๊ฒ์ฆ, ์๋๋ฆฌ์ค ๊ฒ์ฆ, qa ๋๋ ค, ๊ฒ์ฆํด์ค, ์ธ์ ํ
์คํธ, ์์ฉ ๊ฒ์ฆ. |
QA โ Independent Acceptance Verification
โ ๏ธ CRITICAL LANGUAGE POLICY
- Skill instructions, Phase descriptions, workflow steps: English (this file's prose)
- User-facing output, QA documents, verdict messages, examples: Korean (ํ๊ตญ์ด)
QA writes verdict reports that humans read. The QA process itself runs with English instructions to keep the procedure mechanical and unambiguous.
Why this skill exists
execute skill verifies its own work via auto-recovery test loops โ but a Worker that wrote the code is structurally biased to declare it done. qa is an independent acceptance gate that re-runs the original REPORT's reproduction scenario and the PLAN's success criteria from scratch, using the actual deployed/built artifact, before record can document the work as complete.
This is the load-bearing pattern of the new wf v3.30: executor and verifier must be different sessions. Without that separation, record could publish a CHANGELOG entry for a "fix" that never actually fixed anything.
When this skill runs
- Inside the wf pipeline: invoked by
execute after Phase 7 (AC Achievement Report) and before Phase 8 (record handoff). wf:qa must return PASS for execute to hand off cleanly to record.
- Standalone: user invokes directly when they want to verify a branch's actual behavior matches a previously written REPORT/PLAN โ no need to re-run analyze/plan.
Inputs
When spawned (either by execute or standalone), the skill expects:
issue_id: Issue tracker ID (e.g., JIRA-1333, ISSUE-456, or repo-specific pattern)
report_path: Path to [ISSUE_ID]_REPORT.md produced by analyze
plan_path: Path to *_PLAN.md produced by plan
branch: Working branch name
If any of these are missing, the skill asks for them once via AskUserQuestion before proceeding.
Phase 1: Context collection
- Read the REPORT โ extract root cause, reproduction scenario, and impact scope
- Read the PLAN โ extract success criteria and the planned testing strategy
- Inspect actual changes โ
git diff origin/main...HEAD (or the project's base branch) to see what was actually committed on the branch
- Note discrepancies โ if PLAN says "modify file X" but git diff shows X unchanged, flag it. The verdict cannot be PASS if the branch doesn't even contain the planned changes.
Phase 2: Test scenario design
Build the scenario list from REPORT + PLAN content (do not invent new criteria; QA's job is verification, not redesign):
- Bug-reproduction scenarios โ re-run the exact reproduction steps from the REPORT and confirm "the bug no longer occurs"
- Success-criteria scenarios โ for each success criterion in the PLAN, design a verification scenario
- Edge-case scenarios โ derived from the REPORT's impact-scope section
- Regression scenarios โ verify nearby existing functionality wasn't broken by the changes
Tag each scenario as ํต์ฌ (critical โ required for PASS) or ๋ณด์กฐ (auxiliary โ informational).
Phase 3: Test execution
Pick the right verification method per scenario type. Run the commands; do not paraphrase or assume.
3A. Automated tests
make test
pnpm test
uv run pytest -v
pytest tests/ -v
Capture verbatim stdout/stderr.
3B. API direct verification
curl -i -X GET http://localhost:8000/api/endpoint
http GET localhost:8000/api/endpoint
Compare HTTP status code, response shape, headers โ exactly what the PLAN's success criterion specifies.
3C. UI verification (agent-browser)
For UI-affecting changes:
agent-browser --auto-connect open http://localhost:3000/target-page
agent-browser --auto-connect snapshot -i
agent-browser --auto-connect screenshot qa-screenshot.png
agent-browser usage rules:
- Prefer
--auto-connect over --head (reuses real Chrome session)
- For login-required flows, rely on the existing browser session
- Capture a screenshot at each verification step โ screenshots are evidence, not optional
3D. Data / DB verification
docker exec <container> psql -U <user> -d <db> -c "SELECT ..."
docker exec <container> python -c "..."
Replace <container> with the project's actual container name (check docker ps first).
3E. Build / typecheck (often the cheapest L1 signal)
make validate
pnpm build
mypy src/
Phase 4: Write the QA document
Save to [ISSUE_ID]_QA.md (same convention as REPORT/PLAN โ colocated with the analyze/plan artifacts).
# QA Report โ {ISSUE_ID}
## ๊ฒ์ฆ ๋์
- **Issue**: {ISSUE_ID}
- **๋ธ๋์น**: {branch}
- **REPORT**: {report_path}
- **PLAN**: {plan_path}
- **๊ฒ์ฆ ์ผ์**: {timestamp}
## ์ฝ๋ ๋ณ๊ฒฝ ์์ฝ
| ํ์ผ | ๋ณ๊ฒฝ ์ ํ | ์ค๋ช
|
|------|----------|------|
| path/to/file.py | Modified | ํ ์ค ์ค๋ช
|
## ํ
์คํธ ์๋๋ฆฌ์ค ๋ฐ ๊ฒฐ๊ณผ
### ์๋๋ฆฌ์ค 1: ๋ฒ๊ทธ ์ฌํ ๊ฒ์ฆ (ํต์ฌ)
- **๋ชฉ์ **: ๋ณด๊ณ ๋ ๋ฒ๊ทธ๊ฐ ๋ ์ด์ ๋ฐ์ํ์ง ์์์ ํ์ธ
- **๋จ๊ณ**:
1. ๊ตฌ์ฒด ๋จ๊ณ (URL/์
๋ ฅ๊ฐ/ํด๋ฆญ ๋์ ๋ช
์)
2. ๊ตฌ์ฒด ๋จ๊ณ
- **์์ ๊ฒฐ๊ณผ**: ์ ์ ๋์ ์ค๋ช
- **์ค์ ๊ฒฐ๊ณผ**: ๊ด์ฐฐ๋ ๋์ (verbatim)
- **ํ์ **: PASS / FAIL
### ์๋๋ฆฌ์ค 2: ์ฑ๊ณต ๊ธฐ์ค ๊ฒ์ฆ (ํต์ฌ)
...
### ์๋๋ฆฌ์ค 3: ์ฃ์ง์ผ์ด์ค (๋ณด์กฐ)
...
### ์๋๋ฆฌ์ค 4: ํ๊ท (๋ณด์กฐ)
...
## ๊ฒ์ฆ ๊ฒฐ๊ณผ ์์ฝ
| # | ์๋๋ฆฌ์ค | ์ ํ | ๊ฒฐ๊ณผ | ๋น๊ณ |
|---|---------|------|------|------|
| 1 | ๋ฒ๊ทธ ์ฌํ | ํต์ฌ | PASS/FAIL | |
| 2 | ์ฑ๊ณต ๊ธฐ์ค A | ํต์ฌ | PASS/FAIL | |
| 3 | ์ฃ์ง์ผ์ด์ค | ๋ณด์กฐ | PASS/FAIL | |
| 4 | ํ๊ท | ๋ณด์กฐ | PASS/FAIL | |
## ์๋ ํ
์คํธ ์ถ๋ ฅ (verbatim)
[pytest/jest ์ถ๋ ฅ ๊ทธ๋๋ก ๋ถ์ฌ๋ฃ๊ธฐ]
## ์คํฌ๋ฆฐ์ท
- agent-browser ์บก์ฒ: `qa-screenshot.png`
## ์ต์ข
ํ์
### PASS ์กฐ๊ฑด
- ๋ชจ๋ **ํต์ฌ** ์๋๋ฆฌ์ค๊ฐ PASS
- **๋ณด์กฐ** ์๋๋ฆฌ์ค ์ค FAIL์ด ์์ด๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ํฅ ์์ผ๋ฉด PASS (์ด์ ์ฝ๋ฉํธ ์ฒจ๋ถ)
### FAIL ์กฐ๊ฑด
- ํ๋ ์ด์์ **ํต์ฌ** ์๋๋ฆฌ์ค๊ฐ FAIL
- ๋๋ git diff์ PLAN๊ณผ ๋ค๋ฅธ ๋ณ๊ฒฝ์ด ๋ฐ๊ฒฌ๋จ (์ค์ฝํ ์ธ ํ์ผ/๋๋ฝ ํ์ผ)
**VERDICT: PASS** ๋๋ **VERDICT: FAIL**
### FAIL ์ ์์ ์์ฒญ (FAIL์ผ ๋๋ง)
- **์คํจ ์๋๋ฆฌ์ค**: [๋ฒํธ]
- **์์ธ ๋ถ์**: ์ ์คํจํ๋์ง
- **์์ ์ ์**: ์ด๋ป๊ฒ ๊ณ ์ณ์ผ ํ๋์ง โ patch-level
โ Execute ๋จ๊ณ๋ก ๋ณต๊ทํ์ฌ ์์ ํ์
Phase 5: Verdict return
- PASS โ ํธ์ถ์(
execute ๋๋ ์ฌ์ฉ์)์๊ฒ PASS ๋ฐํ. record ๋จ๊ณ ์งํ ๊ฐ๋ฅ.
- FAIL โ Execute๋ก ๋ณต๊ทํ๊ณ ์์ ์์ฒญ ์ฌํญ(์์ธ + patch-level ์ ์)์ ์ ๋ฌ. record ์งํ ๊ธ์ง.
QA Principles
- ์ค์ ํ๊ฒฝ ๊ฒ์ฆ โ
pytest๋ง์ผ๋ก ๋๋ด์ง ์๊ณ ์ค์ ์ฌ์ฉ์ ํ๋ก์ฐ (UI/API/DB)๋ฅผ ํ์ธ
- ์ฌํ ์ฐ์ โ REPORT์ ๋ฒ๊ทธ ์ฌํ ์๋๋ฆฌ์ค๋ฅผ ์ต์ฐ์ ์ผ๋ก ๊ฒ์ฆ. ์ฌํ์ด ์ ๋๋ฉด ๊ทธ๊ฒ ์ง์ง fix์ธ์ง ์์ฌ
- ์ฆ๊ฑฐ ๊ธฐ๋ฐ โ ๋ชจ๋ ํ์ ์ ์คํฌ๋ฆฐ์ท/๋ก๊ทธ/verbatim output ์ฒจ๋ถ. ์๊ธฐ ์ธ์ ๊ธฐ๋ฐ PASS ๊ธ์ง
- ๋ณด์์ ํ์ โ ์์ฌ์ค๋ฌ์ฐ๋ฉด FAIL. False PASS๋ record๋ฅผ ์๋ชป ํธ๋ฆฌ๊ฑฐํ๊ณ PR์ด ๋๊ฐ๊ฒ ํ๋ค
- ๊ตฌ์ฒด์ ํผ๋๋ฐฑ โ FAIL ์ "๋ญ ๊ณ ์ณ์ผ ํ๋์ง" patch-level๋ก ๋ช
ํํ. "ํ
์คํธ๊ฐ ์ ๋๋ค์" ์์ค์ด๋ฉด Execute๊ฐ ์ฒ๋ฆฌ ๋ชปํจ
- ์๊ธฐ ๊ฒ์ฆ ๊ธ์ง โ QA๋ execute๊ฐ ์๋ ๋ค๋ฅธ ์ธ์
์ด ๋๋ฆฌ๋ ๊ฒ ์์น. ๊ฐ์ ์ธ์
์์ ๋๋ ค์ผ ํ๋ค๋ฉด ์ต์ํ
git diff๋ง ๋ณด์ง ๋ง๊ณ ์ค์ ๋ช
๋ น์ ์คํํ ๊ฒ