| name | qa |
| description | Use for UI-affecting changes before /ship. Drives an actual browser through the user flow to reproduce what the user will see โ clicks, forms, error states, loading spinners. Finds the bugs that unit tests can't catch (DOM event ordering, CSS breakage, auth session edge cases, race conditions in UI state). |
QA
UI ๋ณ๊ฒฝ์ ์ค์ ๋ธ๋ผ์ฐ์ ๋ก ์ฌ์ฉ์ ํ๋ฆ ์ฌํ ํด์ ๊ฒ์ฆํ๋ skill.
์ธ์ ์ฐ๋๊ฐ
- UI ๊ฐ ์๋ ๊ธฐ๋ฅ ๋ณ๊ฒฝ (ํ๋ก ํธ์๋ ์ฝ๋, ํ
ํ๋ฆฟ, ์คํ์ผ, ํด๋ผ์ด์ธํธ JS)
/ship ์ง์ ์ต์ข
๊ฒ์ฆ
- ๋จ์ ํ
์คํธ๋ green ์ธ๋ฐ "์ค์ ๋ก ๋ ๊น?" ์ถ์ ์๊ฐ
- ์ฌํ ๋น๋ ์ ๋งคํ ๋ฒ๊ทธ (UI race, async load, event ordering)
์ธ์ ์ฐ์ง ์๋๊ฐ
- ์์ ์๋ฒ / API / CLI ๋ณ๊ฒฝ (โ Gate โฃ ์ pytest/unit test ๋ก ์ถฉ๋ถ)
- trivial UI tweak (์์ ๋ณ๊ฒฝ ํ ์ค ๋ฑ)
- ์์ง ๊ตฌํ ์๋ฃ ์ ๋จ (โ
/vibe-coding-workflow ๋ด๋ถ ๊ฒ์ฆ์ผ๋ก ์ถฉ๋ถ)
๋๊ตฌ (์๋ก ํ๊ฒฝ)
gstack ์ /browse ์ ์ฉ ๋ฐ์ด๋๋ฆฌ (Playwright wrapper) ๋ฅผ ์ฐ์ง๋ง, ์ด
ํ๋ ์์ํฌ๋ ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉ:
- Claude-in-Chrome MCP (
mcp__claude-in-chrome__*) โ ๊ฐ์ฅ ๊ถ์ฅ.
์ค์ Chrome ํญ์์ DOM ์กฐ์ + ์คํฌ๋ฆฐ์ท + network ๊ฒ์ฌ + console.
- Playwright (ํ๋ก์ ํธ๊ฐ ์ด๋ฏธ ์ฐ๋ฉด) โ ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์ฌํ ๊ฐ๋ฅ
- ์๋ ๋ธ๋ผ์ฐ์ โ ์ตํ. Claude ๊ฐ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ์ ๊ณตํ๊ณ ์ฌ์ฉ์๊ฐ ํด๋ฆญ
๋ฐฉ์
1. ํ
์คํธ ์๋๋ฆฌ์ค ์ ์ (๊ตฌํ ์ ์๋ ๊ฐ๋ฅ)
Plan.md ์ acceptance criteria ๋ฅผ ์ฌ์ฉ์ ๋์ ์์ ๋ก ๋ฒ์ญ:
AC-1: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ ๋์๋ณด๋๋ฅผ ๋ณธ๋ค
โ ์๋๋ฆฌ์ค:
1. Navigate /login
2. email + password ์
๋ ฅ
3. submit
4. Expect redirect /dashboard
5. Expect user-name ์์์ "ํ๊ธธ๋"
6. Expect dashboard-cards >= 1 ๊ฐ
2. ์ค์ ์ฌํ
Chrome MCP ์ฐ๋ ๊ฒฝ์ฐ ๋จ๊ณ๋ณ:
mcp__claude-in-chrome__navigate(url)
mcp__claude-in-chrome__form_input ๋ก ํ๋ ์ฑ์
mcp__claude-in-chrome__left_click ๋ก submit
mcp__claude-in-chrome__get_page_text ๋๋ ์คํฌ๋ฆฐ์ท์ผ๋ก ์ํ ๊ฒ์ฆ
mcp__claude-in-chrome__read_console_messages ๋ก JS ์๋ฌ ํ์ธ
3. ํ์ ์ฒดํฌ
UI QA ๋ ๋ค์ 5๊ฐ์ง๋ฅผ ํญ์ ํ์ธ (๋จ์ ํ
์คํธ๊ฐ ๋์น๋ ์์ญ):
| ์์ญ | ๊ตฌ์ฒด ์ฒดํฌ |
|---|
| Loading state | spinner / skeleton ์ด ์ค์ ๋ก ๋ํ๋๋? |
| Empty state | ๋ฐ์ดํฐ ์์ ๋ ๋ฌด์์ ๋ณด์ด๋? ("๋ฐ์ดํฐ ์์" ๋ฉ์์ง ์กด์ฌ?) |
| Error state | ์๋ฒ 5xx / ๋คํธ์ํฌ ๋๊น ์ UI ๊ฐ ์ผ์ด๋ถ์ง ์๋? |
| Auth boundary | ๋ก๊ทธ์ธ ์์ด ์ ๊ทผ ์ redirect? ๊ถํ ์๋ ํ์ด์ง๋ 403? |
| Event ordering | ๋น ๋ฅด๊ฒ ํด๋ฆญ ๋ ๋ฒ ํ์ ๋ ์ค๋ณต ์ ์ถ๋๋? |
4. ์คํจ ์
- ๋ฒ๊ทธ ์ฌํ ์์/์คํฌ๋ฆฐ์ท ์ ์ฅ (๊ฐ๋ฅํ๋ฉด)
- Investigation skill ๋ก ๋๊น (
/investigate)
- Ship ์ค๋จ
์ถ๋ ฅ ํ์
# QA Run โ <YYYY-MM-DD> โ <feature slug>
## Scenarios tested
1. <AC-1> โ PASS | FAIL
2. <AC-2> โ PASS | FAIL
## ํ์ ์ฒดํฌ
- Loading state: PASS / FAIL / N/A
- Empty state: PASS / FAIL / N/A
- Error state: PASS / FAIL / N/A
- Auth boundary: PASS / FAIL / N/A
- Event ordering: PASS / FAIL / N/A
## Findings
- <bug ๋๋ ์ด์ ๋์ โ ์คํฌ๋ฆฐ์ท ๊ฒฝ๋ก ํฌํจ>
## Console errors
- <JS error ์บก์ฒ>
## Verdict
- ship-ready | fix-needed | needs-more-testing
## Attachments
- screenshots: .claude/audits/qa-<ts>/screenshot-N.png
- network traces (if captured): ...
์ ์ฅ: .claude/audits/qa-<ts>/report.md
๊ฐ๋๋ ์ผ
- "์ ๋ ํ
์คํธ ํต๊ณผํ์ผ๋ OK" ๊ธ์ง โ UI ๋ DOM ์์ ์ค์ ๋ํ๋์ผ
- ์คํฌ๋ฆฐ์ท ์๋ PASS ๋ ์ฝํ ์ฆ๊ฑฐ
- ์ค์ ์ฌ์ฉ์ ํ๋ฆ 1๊ฐ๋ผ๋ ๋น ๋จ๋ฆฌ๋ฉด FAIL ๋ก ๊ฐ์ฃผ
- Console ์ ์๋ฌ ์์ผ๋ฉด (๋ณด์ด์ง ์๋ ๊นจ์ง) ship ๊ธ์ง
- ๋ชจ๋ฐ์ผ viewport ๋ ์ฒดํฌ (responsive ์ด์)
๋จผ์ ์ฝ์ ๊ฒ
Plan.md ์ acceptance criteria
- Implementation ์ UI ์ํฅ ํ์ผ (components / templates / styles)
- ์ด์ QA ๋ฆฌํฌํธ (
.claude/audits/qa-*/) ๋ก ํ๊ท ์ ๋ฌด ์ฐธ์กฐ