| name | dogfood |
| description | Simulate a first-time pixel_ui user to discover DX issues, missing widgets, and bugs. Use /dogfood run to start a collection cycle, /dogfood fix to resolve filed issues. Triggers when user mentions dogfooding, DX testing, user simulation, widget gap, or wants to find usability issues in pixel_ui. |
| user_invocable | true |
Dogfood Skill (pixel_ui)
์ฒซ ์ฌ์ฉ์ ํ๋ฅด์๋๋ฅผ ๋งค ์ฌ์ดํด ์๋ฎฌ๋ ์ด์
ํด pixel_ui์ ๋ง์ฐฐยท์๋ ์์ ฏยท๋ฒ๊ทธ๋ฅผ ๋ฐ๊ตดํ๊ณ GitHub Issue๋ก ๊ธฐ๋กํ๋ค. ์ค๊ณ ์ ์ฒด๋ docs/superpowers/specs/2026-04-23-dogfood-skill-design.md ์ฐธ์กฐ.
Argument Parsing
/dogfood run โ Run Mode (Section: Run Mode)
/dogfood run --keep โ Run Mode, ์ฌ์ดํด ๋๋ ํ ๋ฆฌ ์ญ์ ์คํต
/dogfood fix โ Fix Mode (Section: Fix Mode)
/dogfood โ Usage: /dogfood run [--keep] | /dogfood fix ์ถ๋ ฅ ํ ์ค๋จ
Prerequisites (์์ชฝ ๋ชจ๋ ๊ณตํต)
- git identity ๊ฒ์ฆ โ
.claude/settings.json SessionStart hook ๊ฒฐ๊ณผ ์ฌํ์ธ. ๋ถ์ผ์น ์ ๊ฒฝ๊ณ ํ ์ค๋จ.
- gh auth โ
gh auth status. ์คํจ ์ ! gh auth login ์๋ด ํ ์ค๋จ.
- GitHub ๋ผ๋ฒจ ์์ฑ โ ์๋ ์คํฌ๋ฆฝํธ idempotent ์คํ:
gh label create dogfood --color 0E8A16 --description "Dogfood cycle issue" 2>/dev/null || true
gh label create bug --color D73A4A --description "Something isn't working" 2>/dev/null || true
gh label create feature --color A2EEEF --description "New feature or request" 2>/dev/null || true
gh label create docs --color 0075CA --description "Improvements or additions to documentation" 2>/dev/null || true
gh label create dx --color D93F0B --description "Developer experience issue" 2>/dev/null || true
gh label create widget-gap --color 5319E7 --description "Missing widget request" 2>/dev/null || true
gh label create tuner --color FBCA04 --description "Tuner-related" 2>/dev/null || true
gh label create stale --color CCCCCC --description "Outdated content" 2>/dev/null || true
gh label create missing --color EEEEEE --description "Missing coverage" 2>/dev/null || true
gh label create upstream --color BFD4F2 --description "Upstream Flutter limit" 2>/dev/null || true
- .gitignore ์ฒดํฌ โ
dogfood_cycle_*/ ํจํด ์์ผ๋ฉด ์ถ๊ฐ ํ ์ปค๋ฐ.
- ๋ธ๋์น ํ์ธ โ Fix ๋ชจ๋๋ ๋ฐ๋์ main์์ ๋ถ๊ธฐํ feature branch์์ ์คํ. Run ๋ชจ๋๋ ์ ์ฝ ์์.
Run Mode
ํ๋ฅด์๋ยท์ฃผ์ ยท์ฌ์ดํด ๋๋ ํ ๋ฆฌ๋ personas.md, topics.md ์ฐธ์กฐ.
Step 1: ์ด์ ์ฌ์ดํด ์ ๋ฆฌ
rm -rf dogfood_cycle_*/ (๋จ --keep ํ๋๊ทธ๋ฉด ์คํต)
Step 2: ์ฌ์ดํด ๋ฒํธ ๊ฒฐ์
gh issue list --label dogfood --state all --limit 200 --json body -q '.[].body' โ body์์ ์ฌ์ดํด: #N ํ์ฑ โ max+1. ์ด์ ์์ผ๋ฉด #1.
Step 3: ํ๋ฅด์๋ ๋๋ค ์ ํ
personas.md์ C1/C2/C3 ์ค 1๋ช
. ๊ธฐ์ต ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ง์ ์ฌ์ดํด๊ณผ ์ฐ์ ํํผ. C1์ด๋ฉด 50/50์ผ๋ก pub.dev vs path ์์กด์ฑ ๋ชจ๋ ๋ถ๊ธฐ.
Step 4: ์ฃผ์ ์ ํ
topics.md์ ํ ์ค ์นํ ํ๋ฅด์๋ ๋งค์นญ ์ฐ์ , ๊ณผ๊ฑฐ ์ด์ body์ ์ฃผ์ : ํ์ฑํด ์ค๋ณต ํํผ.
Step 5: ์ฌ์ดํด ๋๋ ํ ๋ฆฌ ์์ฑ
flutter create dogfood_cycle_{N} --project-name dogfood_cycle_{N}
pubspec์ ์์กด์ฑ ์ถ๊ฐ (ํ๋ฅด์๋/๋ชจ๋์ ๋ฐ๋ผ path: ../ ๋๋ pixel_ui: ^<pub.dev latest>).
cd dogfood_cycle_{N} && flutter pub get. ์คํจ ์ ์๋ฌ ์์ฒด๋ฅผ ์ด์๋ก ํ์ผ๋งํ๊ณ ์ฌ์ดํด ์ค๋จ.
Step 6: ํ๋ฅด์๋ ์๋ฎฌ๋ ์ด์
๊ฐ๋ฐ
์ ๋ณด ์ ๊ทผ ์ ์ฝ์ ์๊ฒฉํ ์งํจ๋ค (personas.md ์ธ์น). ์ต์ ์ปค๋ฒ๋ฆฌ์ง:
- C1ยทC2: ๊ณต๊ฐ API 4๊ฐ ์ด์
- C3: ์ฃ์ง ์ผ์ด์ค 3๊ฐ ์ด์
- ๋ ์ด์์ + ์ธํฐ๋์
๋ ๋ค ํฌํจ
๋ง์ฐฐ ๋ง๋ ๋๋ง๋ค dogfood_cycle_{N}/NOTES.md์ 3-ํํ๋ก ๊ธฐ๋ก:
- ์๋: ๋ฌด์์ ํด๋ณด์๋
- ๊ธฐ๋: ์ด๋ป๊ฒ ๋์ํ ์ค ์์๋
- ์ค์ : ์ค์ ๋ก ๋ญ๊ฐ ์ผ์ด๋ฌ๋
์๊ฐ ๋ฒ๊ทธ๋ ์คํฌ๋ฆฐ์ท(์๋ ์บก์ฒ ๋๋ ASCII diagram)์ NOTES์ ์ฒจ๋ถ.
Step 7: Tuner ์ปค๋ฒ๋ฆฌ์ง ๋๋ฆฌํํธ ์ฒดํฌ
ํ๋ก์ ํธ ๋ฃจํธ์์:
fvm dart run tool/check_tuner_coverage.dart --json > /tmp/tuner_drift_{N}.json
๋๋ฆฌํํธ ์์ผ๋ฉด Step 10c์์ ์ง๊ณ ์ด์ 1๊ฐ ์ค๋น(quota ๋ฐ).
Step 8: ์ด์ ๋ถ๋ฅ ยท ์ฐ์ ์์
ํ๋ฅด์๋ ๋ฐ๊ฒฌ ์ด์๋ฅผ issue-templates/์ ์นดํ
๊ณ ๋ฆฌ๋ก ๋ถ๋ฅ:
bug > dx > feature(widget-gap ์ฐ์ ) > docs. Max 7๊ฐ quota. ์ด๊ณผ๋ summary์ "deferred"๋ก ๊ธฐ๋ก.
Step 9: ์ค๋ณต ๊ฒ์ฌ
gh issue list --label dogfood --state open --json title,number,body
์ ๋ชฉยทํค์๋ ์ ์ฌ๋ ๋น๊ต. ๋ช
๋ฐฑ ์ค๋ณต ์คํต + summary์ "์ค๋ณต ์คํต" ์น์
๊ธฐ๋ก.
Step 10: Upstream ๊ฒฉ๋ฆฌ & GitHub Issue ํ์ผ๋ง
10a. Upstream: upstream ๋ถ๋ฅ ์ด์๋ docs/upstream/{slug}.md ์์ฑ(upstream-template.md ๊ธฐ๋ฐ) + docs/upstream/README.md์ "์์ง๋จ" ์น์
์ ํ ์ค ๋งํฌ ์ถ๊ฐ. GitHub Issue๋ ํ์ผ๋งํ์ง ์์.
10b. ํ๋ฅด์๋ ์ด์: issue-templates/{category}.md์ body ํ
ํ๋ฆฟ์ผ๋ก gh issue create. ๋ผ๋ฒจ ์กฐํฉ:
- ๊ธฐ๋ณธ:
dogfood,{category}
- widget-gap์ด๋ฉด
dogfood,feature,widget-gap
- tuner ์ด์๋ฉด
dogfood,{category},tuner,{stale|missing}
10c. Tuner drift ์ง๊ณ: issue-templates/tuner-drift.md ํ
ํ๋ฆฟ ์ฌ์ฉ. ๊ธฐ์กด open drift ์ด์ ์์ผ๋ฉด ์ ๊ท ์์ฑ ๋์ gh issue comment๋ก "cycle #N์์๋ ๊ฐ์ง๋จ" ์ถ๊ฐ. ๋์ผ drift๊ฐ 3์ฌ์ดํด ์ฐ์ open์ด๋ฉด priority-high ๋ผ๋ฒจ ์๋ ์ถ๊ฐ.
Step 11: ์ฌ์ดํด ์์ฝ ์ถ๋ ฅ
## Dogfood Cycle #{N} Summary
๐ ์ฃผ์ : {topic}
๐ญ ํ๋ฅด์๋: {name} ({C1/C2/C3})
๐ฆ ์์กด์ฑ: {path | pub.dev ^x.y.z}
๐ฏ ์ปค๋ฒ ์์ ฏ: {list} ({count}๊ฐ)
### ํ์ผ๋ง๋ Persona ์ด์ ({filed}/{discovered})
| # | ์นดํ
๊ณ ๋ฆฌ | ์ด์ | GitHub |
### Widget-gap ์ด์ (fast-track ๋์)
| # | ์์ ฏ | GitHub |
### Tuner Drift ({status})
(์ ์ด์ #N) | (๊ธฐ์กด #M ์ฝ๋ฉํธ) | (drift ์์ โ
)
### Upstream ({count}๊ฑด, docs/upstream/)
| # | ์ด์ | ํ์ผ |
### Deferred ({count}๊ฑด)
- {list}
### Skipped ์ค๋ณต ({count}๊ฑด)
- {list}
### ์์ ฏ ์ปค๋ฒ๋ฆฌ์ง
- ์ต์ ์๊ตฌ: {4 (C1/C2) | 3 (C3)}
- ์ค์ : {count}
- ๋ฌ์ฑ: {โ
| โ ๏ธ}
Clean cycle(์ด์ 0, drift ์์)์ ์ถํ ๋ฉ์์ง + "๋ค์ ์ฌ์ดํด์ ์ฃ์ง ์ผ์ด์ค ๋ ๊น๊ฒ" ํํธ.
Fix Mode
Step 1: Open ์ด์ ๋์ด
gh issue list --label dogfood --state open --json number,title,labels \
-q '.[] | "\(.number)\t\(.title)\t\([.labels[].name] | join(","))"'
Step 2: ์ฐ์ ์์ ์ ๋ ฌ & ๋ถํ ํ์
## ๐ Widget Gap Fast-track
| # | ์ด์ | cycle |
## ๊ธฐํ Open Issues (bug > dx > feature > docs)
| # | ์นดํ
๊ณ ๋ฆฌ | ์ด์ |
## Tuner Drift
| # | ๋๋ฆฌํํธ ์ข
๋ฅ |
## Upstream (GitHub Issue ์์)
- docs/upstream/ ์์ ์๋ ์ถ์
์ฌ์ฉ์์๊ฒ ๋ฒํธ ์ ํ ์์ฒญ. ์ถ์ฒ: fast-track ์ต์๋จ ์ฒซ ๋ฒ์งธ.
Step 3: ์ด์ ์์ธ ๋ก๋ & ๋ธ๋์น ์์ฑ
gh issue view {N} --json body,title,labels
๋ธ๋์น๋ช
๊ท์น:
fix/dogfood-{N}-{slug} โ bugยทdxยทdocs
feat/dogfood-{N}-pixel-{widget} โ widget-gap
fix/tuner-drift-{N} โ tuner
๋ฐ๋์ main์์ ๋ถ๊ธฐ. spec/plan ํ์ ์ ๋ธ๋์น์ ๋จผ์ ์์ฑ ํ ๊ตฌํ.
Step 4: ๊ตฌํ
- widget-gap: 8-ํญ๋ชฉ ์ฒดํฌ๋ฆฌ์คํธ(์๋) ์ ๋ถ ํต๊ณผํด์ผ ๋จธ์ง.
superpowers:writing-plans๋ก ์ธ๋ถ ๊ณํ ๋ฝ๊ณ TDD๋ก ์งํ.
- bug: ์ฌํ ํ
์คํธ ์ ํ(Red) โ ์์ (Green) โ ํ์ ์ ๊ณจ๋ ๊ฐฑ์ .
- dx: API ๊ฐ์ ์ด breaking์ธ์ง ํ๋จ โ deprecate ์ฐํ ๋๋ major bump ํ์.
- docs: README/Gallery/CHANGELOG ๊ฐฑ์ .
- tuner drift: ์คํ์ ๋ค์ด๋ฐ ์ปจ๋ฒค์
๊ถ์ฅ์ ์ค์(composite OK), ์ปจํธ๋กค ์ถ๊ฐ/์ ๋ฆฌ ํ
dart run tool/check_tuner_coverage.dart ์ฌํ์ธ.
Widget-gap ๊ตฌํ ์ฒดํฌ๋ฆฌ์คํธ (PR ๋จธ์ง ์กฐ๊ฑด)
- [ ] API ์ค๊ณ ๊ธฐ๋ก: `docs/widgets/pixel_{name}.md` ๋๋ PR description์ ์๊ทธ๋์ฒยท์ฌ์ฉ ์์ ์์ฑ
- [ ] ๊ณต๊ฐ API ๋
ธ์ถ: `lib/pixel_ui.dart` export ์ถ๊ฐ
- [ ] ๋จ์ ํ
์คํธ: `test/pixel_{name}_test.dart`
- [ ] ๊ณจ๋ ํ
์คํธ: ์ต์ 1๊ฐ ์๊ฐ ํ๊ท ๋ฐฉ์ง
- [ ] README Gallery ๊ฐฑ์ : ์ ์์ ฏ ์คํฌ๋ฆฐ์ท + ์ฝ๋ ์์
- [ ] CHANGELOG ์ํธ๋ฆฌ: "Added" ์น์
์ถ๊ฐ
- [ ] example ์ผ์ผ์ด์ค ๋ฐ์: ํ์ ์ `example/lib/`์ ๋ฐ๋ชจ ์ถ๊ฐ
- [ ] tuner ๋์ ์ฌ๋ถ ํ๋จ: ์๊ฐ ํ๋ผ๋ฏธํฐ ์์ผ๋ฉด tuner ์ปจํธ๋กค ์ถ๊ฐ (๋ณ๋ ์ด์ ๋ถ๋ฆฌ ๊ฐ๋ฅ)
Step 5: ๊ฒ์ฆ (QA ๊ฒ์ดํธ)
fvm flutter analyze
fvm flutter test --exclude-tags screenshot
ํ์ ์:
fvm flutter test --update-goldens
fvm dart run tool/check_tuner_coverage.dart
์คํจ ์ ์์ ๊น์ง ๋ฐ๋ณต. --no-verify๋ฅ ์ฐํ ๊ธ์ง.
Step 6: ์ปค๋ฐ & PR
- ์ปค๋ฐ ์ ์:
BottlePumpkin <p4569zz@gmail.com>, Claude ์ธ๊ธ ์์.
- ๋ฉ์์ง ์ปจ๋ฒค์
:
fix: resolve {issue} / feat: add Pixel{Name} / docs: improve {section} / chore: tuner coverage cycle#{N}.
- PR ๋ณธ๋ฌธ:
Closes #{issue_N}
## ๋ณ๊ฒฝ์ฌํญ
- ...
## ๊ฒ์ฆ
- [x] flutter analyze
- [x] flutter test --exclude-tags screenshot
- [x] (widget-gap๋ง) ์ 8-ํญ๋ชฉ ์ฒดํฌ๋ฆฌ์คํธ ์๋ฃ
## ์คํฌ๋ฆฐ์ท
(์๊ฐ ๋ณ๊ฒฝ์ด๋ฉด)
gh pr create --title "..." --body "..."
Step 7: ์ด์ ๋งํฌ & ์ ๋ฆฌ
gh issue comment {N} --body "Fix submitted in PR #{PR_N}"
๋จธ์งยท๋ฐฐํฌ๋ ์ฌ์ฉ์ ํ๋จ.