docs(p9): 도그푸딩 피드백을 20개 task spec + reset 구현 plan으로 분해 #48
Reference in New Issue
Block a user
Delete Branch "docs/p9-dogfooding-decomposition"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
P9-1 ~ P9-4 (TUI Library / Search / Ask / Inspect) 머지 후 사용자가 직접
cargo install한 binary 로 도그푸딩 하며 수집한 16 항목 UX 피드백을 20 개 single-PR 사이즈 task spec 으로 분해한다. 각 spec 은tasks/_template.md형식 (Goal/Allowed deps/Public surface/Behavior contract/Test plan/DoD/Out of scope) 을 따른다.변경 내용
tasks/p9/p9-fb-01-*.md~p9-fb-20-*.md— 분해된 task spec 20 개. 각 spec 의 frontmatter 에depends_on/unblocks/source_feedback으로 의존 / 출처 추적.tasks/p9/p9-dogfooding-feedback.md— master index. 16 항목 원본 + 20 개 task 표 + 권장 실행 순서 + spec PR 동반 task 목록.tasks/INDEX.md— p9-fb-01 ~ 20 link 추가.docs/superpowers/plans/2026-05-02-p9-fb-06-reset-command.md— 첫 후속 작업 (kebab reset명령) 의 6-task 구현 plan. spec → plan 분리는superpowers:writing-plans의 워크플로우..gitignore—.worktrees/추가.superpowers:using-git-worktreesskill 이 만드는 로컬 worktree 디렉토리가 git status 를 오염시키지 않게.Task spec 매핑
실행 시작점
머지 직후 첫 후속 PR 은 p9-fb-06 (
kebab reset명령) — 도그푸딩 막힘 강도 1위 (사용자가 여러 config 을 테스트하는 동안 데이터 wipe 가 4 개 경로 수동rm -rf였음). plan 은docs/superpowers/plans/2026-05-02-p9-fb-06-reset-command.md에 6 task 로 분해되어 있고 첫 task 부터 바로 실행 가능.Test plan
코드 변경 없음 — 모든 변경은 docs (
tasks/p9/**,docs/superpowers/plans/**,tasks/INDEX.md) +.gitignore1 줄. CI 가 markdown linter 를 돌린다면 그것이 유일한 게이트._template.md형식과 일치p9-dogfooding-feedback.md) 의 표가 실제 파일과 일치tasks/INDEX.mdlink 가 모두 존재하는 파일 가리킴cargo check --workspace통과 (코드 변경 없으니 무영향, sanity check)회차 1 — docs PR 정합성 위주 리뷰. 5 issue + 2 칭찬.
핵심 actionable:
p9-fb-11.depends_onvsp9-fb-14.unblocks양방향 정합 깨짐 — master index 표는11 → 14의존 명시, 14.unblocks 도 [11] 명시, 그러나 11.depends_on 비어있음. fix 권장: 11.depends_on = [p9-fb-14].p9-fb-01의14 번과 wiringcross-ref 모호 —14가 task ID 인지 도그푸딩 항목 번호인지 mix-up. 정정 필요.tasks/HOTFIXES.md — n/a (skip)모순 — Modify list 안에 있으면서 동시에 skip. list 에서 제거.p9-dogfooding-feedback.mditem 14 의READEtypo —README한 글자 누락.let _ = data_only;— pattern binding 자체를_data_only로 변경하는 게 관용적 (cosmetic).전체 인상: spec 20 개 + master index + plan 1 개 — 분해의 깊이와 의존 추적의 명시성 모두 충실. 위 5 건만 정리하면 머지 가능.
@@ -0,0 +24,4 @@- `crates/kebab-cli/src/main.rs` — add `Cmd::Reset` arm + handler- `crates/kebab-cli/src/wire.rs` — `wire_reset` helper- `README.md` — `kebab reset` in 명령 표 + Quick start safety note- `tasks/HOTFIXES.md` — n/a (new feature, not deviation; skip)(자기모순)
**Modify:**절의 마지막 항목tasks/HOTFIXES.md — n/a (new feature, not deviation; skip)가Modify list안에 있으면서 동시에skip으로 명시 — 모순. "수정 안 함" 이면Modifylist 에서 빼야 함.Why: plan 의 File Structure 절은 "이 PR 이 어떤 파일을 건드리는지" 의 명시적 ground truth. 건드리지 않는 파일이 list 에 있으면 reviewer 가 "왜 안 건드렸지?" 물을 수 있고, 자동화 도구 (예:
git diff --stat | sort와 비교) 가 false alarm.How to apply:
tasks/HOTFIXES.md — n/a ...줄을Modifylist 에서 제거. "새 기능이라 HOTFIXES 항목 없음" 안내가 필요하면 별도 한 줄로**HOTFIXES:** n/a — 신규 기능이지 deviation 아님.로 분리.@@ -0,0 +742,4 @@ResetScope::ConfigOnly} else {// `--data-only` explicit OR no scope flag at all → DataOnlylet _ = data_only;(cosmetic)
let _ = data_only;로 unused warning 회피하는 것보다 패턴 매치에서 직접 prefix 로_data_only받는 쪽이 관용적. handler 시그니처 줄data_only,→data_only: _,또는 enum variant pattern 의 binding 이름을data_only→_data_only로 변경 가능.Why:
let _ = x;는 unused 를 명시적으로 "버린다" 의도일 때 쓰는 idiom (보통 lock guard 같이 RAII 가 있을 때). 단순 boolean flag 의 unused warning suppression 으로는 의미 과잉.How to apply: handler match arm 의
data_only,줄을data_only: _,로 변경하고 본문의let _ = data_only;한 줄 제거. 더 명료.(칭찬) Self-review 절의
One spec note we did NOT implement separately—vector-onlyend-to-end integration test 누락을 솔직히 명시 + 그 이유 (Lance dir + embedding row 동시 seeding 비용) + reviewer pushback 시 same-PR follow-up 약속까지. plan 의 self-review 가 "빠진 건 없다" 를 반복하는 보일러플레이트가 아니라 의도적 trade-off 를 굳이 노출 — 정직성 + 미래 reviewer 의 작업량 ↓.@@ -0,0 +220,4 @@- `--json` 모드 호환: `answer.v1` 에 `conversation_id` / `turn_index` 필드 (13 번에서 추가) — 외부 도구가 session 추적 가능.- **외부 AI 통합 효과** (README 의 외부 AI 섹션): Claude Code skill / MCP server 도 `--session` 으로 conversation context 보존. 이 부분이 multi-turn CLI 의 진짜 가치 — 내장 TUI 만 쓰는 사용자보다 외부 wrapper 사용자가 큼.**spec 영향**: §7 RAG 절 multi-turn 정책 + §externalAI 통합 절 (READE 와 ARCHITECTURE 동기화) 에 session 모델 추가. CLI flag 표 (`--session` / `--repl`) README 갱신.(typo)
READE→README. 영구 기록 문서이므로 fix 권장.Why: 도그푸딩 feedback 의 항목 14
**spec 영향**절이§externalAI 통합 절 (READE 와 ARCHITECTURE 동기화)— README 의 R 한 글자 누락. 다른 곳들은 모두 정상README.How to apply:
READE→README한 글자 추가.@@ -0,0 +274,4 @@| [p9-fb-01](p9-fb-01-ingest-progress-callback.md) | Ingest progress callback | – | 1 (backend) || [p9-fb-02](p9-fb-02-cli-progress-display.md) | CLI progress display | 01 | 1 (CLI) || [p9-fb-03](p9-fb-03-tui-ingest-background.md) | TUI ingest background + status | 01 | 1 (TUI) || [p9-fb-04](p9-fb-04-ingest-cancellation.md) | Cooperative cancellation | 01 | 2 |(칭찬)
후속 작업 분리 (분해 결과)표가 task ID + 제목 + 의존 + 출처 항목 4 컬럼으로 정리되어 있어 reviewer 가 한눈에 "어느 도그푸딩 항목이 어느 task 로 분해됐는지" 추적 가능. 특히 마지막 컬럼feedback 항목이 spec 분해의 traceability 를 한 번에 잡아냄. 16 항목 → 20 task 매핑이 1:N 인 케이스 (1 → 01/02/03, 13 → 15/16, 14 → 17/18) 도 표만 보면 즉시 파악.@@ -0,0 +281,4 @@| [p9-fb-08](p9-fb-08-search-debounce.md) | Search debounce + Enter | – | 6 || [p9-fb-09](p9-fb-09-tui-editor-restore.md) | External editor return restore | – | 7 || [p9-fb-10](p9-fb-10-tui-cjk-input.md) | CJK input + wide-char | 12 | 8 || [p9-fb-11](p9-fb-11-ask-markdown-render.md) | Ask markdown render | 14 | 9 |(정합성 / 의존 양방향 불일치) 표는 p9-fb-11 의 의존을
14라고 적었는데 p9-fb-11.md frontmatter 의depends_on은[]비어 있음. 한편 p9-fb-14.md 의unblocks: [p9-fb-11]은 11 → 14 의존을 명시. 두 spec 의 frontmatter 가 양방향 정합 깨짐.Why:
depends_on/unblocks양방향 정합은 task 의존 그래프의 정확성을 결정. 실행 순서 자동 정렬 / 병렬화 가능 task 식별이 모두 이 frontmatter 에 의존. 한쪽만 채우면 grep 으로 의존 추적할 때 누락.How to apply: 표가 source of truth (사람이 표를 보고 판단) 라면
tasks/p9/p9-fb-11-ask-markdown-render.md의depends_on: []→depends_on: [p9-fb-14]. 표가 잘못이라면 표를–로 + 14 의 unblocks 도 비우기. 본 PR 의 plan 흐름 (theme → markdown render) 으로 보면 11 이 14 에 의존하는 게 맞음 — 11.depends_on 채우는 쪽 권장.@@ -0,0 +56,4 @@- progress event 발신은 best-effort. receiver drop 되면 이후 send 무시 (panic 금지).- 이벤트 ordering: `ScanStarted < ScanCompleted < (AssetStarted < AssetFinished)* < Completed|Aborted`. embed batch 는 asset 사이 임의 위치.- `Aborted` 는 cancellation token (p9-fb-04) trigger 시. 혼자 발생 X — 14 번과 wiring.(의도 불명확)
Aborted 는 cancellation token (p9-fb-04) trigger 시. 혼자 발생 X — 14 번과 wiring.의14 번이 무엇 가리키는지 모호. 도그푸딩 피드백의 항목 14 (CLI multi-turn) 와 cancellation 은 무관. 짐작컨대p9-fb-04(cancellation) 와p9-fb-03(TUI background) 두 task 사이의 wiring 의도였던 것으로 보임 — task ID 와 항목 번호 mix-up.Why: spec cross-ref 가 미래 reader 가 의존 / 흐름을 추적하는 핵심 device. 모호한 숫자 (
14 번) 는 0 정보가 아니라 잘못된 정보 — task ID 인지 항목 번호인지 둘 중 하나만 의미.How to apply: 두 가지 fix 가능. (a) 의도가 "cancel 신호 origin 명확화" 이면
Aborted 이벤트는 cancellation token (p9-fb-04) trigger 시에만 발신.정도로 단순화. (b) p9-fb-03 의 IngestState.cancel_tx wiring 을 명시할 의도면... — p9-fb-03 의 IngestState.cancel_tx 와 wiring.로 정정.회차 2 — 회차 1 지적 5건 모두 깔끔히 반영. 추가 nit 2건 (가독성).
tasks/p9/p9-dogfooding-feedback.md권장 실행 순서 7번 항목의5번 debounce가 모호 (5번이 도그푸딩 항목인지 우선순위인지 task ID 끝자리인지). task IDp9-fb-08로 명시 권장.11 prerequisite도 모호.p9-fb-11 의 prerequisite가 명확.회차 1 fix 는 모두 정확히 반영 (READE / 14번과 wiring / HOTFIXES n/a 모순 / let _ = data_only / p9-fb-11.depends_on). 위 nit 2건만 정리하면 종료.
@@ -0,0 +735,4 @@yes,} => {use kebab_app::ResetScope;// `--data-only` explicit OR no scope flag at all → DataOnly.(칭찬)
data_only: _,pattern binding +// The data_only: _ binding above is intentional — clap's group = "reset_scope" already enforces mutual exclusion ...코멘트가 미래 reader 의 "왜 unused 인가" 의문을 코드 옆에서 즉시 차단. 회차 1 의 cosmetic 지적을 단순 변수명 수정으로 끝내지 않고 의도 명시까지 끌어올림.@@ -0,0 +300,4 @@4. **p9-fb-15 / 16** (multi-turn 핵심) — 사용자 의도 (꼬리 물기) 직결.5. **p9-fb-20** (citation) — 출처 보기, 도그푸딩 후속 검증의 prerequisite.6. **p9-fb-07** (title fallback) — Inspect 가 비어있는 문제. 작은 size.7. **p9-fb-19** (search cache) — 5번 debounce 와 함께 응답성.(가독성 nit)
5번 debounce의5번이 모호 — 도그푸딩 항목 5 는 title fallback (debounce 아님), 우선순위 5 는p9-fb-20 citation. 의도는 우선순위 8 (p9-fb-08 search debounce) 또는 도그푸딩 항목 6 (debounce) 였을 것.Why: 같은 문서 안에서
N번이 여러 번호 체계 (도그푸딩 항목 / 우선순위 / task ID 끝자리) 중 무엇을 가리키는지 불명확하면 reader 가 매번 추적해야 함.How to apply:
5번 debounce→p9-fb-08 debounce로 task ID 명시. 같은 패턴이 다른 줄에도 있으면 일괄 정리.@@ -0,0 +304,4 @@8. **p9-fb-08** (debounce) — 작은 size, 즉시 효과.9. **p9-fb-09** (editor restore) — 작은 size.10. **p9-fb-12 → 13** (mode → cheatsheet) — UX 일관성 묶음.11. **p9-fb-14** (theme) — 12 와 같은 batch 가능, 11 prerequisite.(가독성 nit)
11 prerequisite모호 —p9-fb-11 의 prerequisite (= 11 이 14 에 의존)의미인지,priority 11인지 즉시 안 잡힘. 회차 1 fix 로p9-fb-11.depends_on=[p9-fb-14]가 명시되었으므로 그 사실을 그대로 인용하는 게 명확.Why: 직전 항목들은
12 와 같은 batch 가능처럼task ID 끝자리만패턴이라 일관성 떨어짐.How to apply:
12 와 같은 batch 가능, 11 prerequisite→p9-fb-12 와 같은 batch 가능, p9-fb-11 의 prerequisite.@@ -0,0 +4,4 @@task_id: p9-fb-11title: "Ask answer markdown rendering (bold/italic/code/list/table)"status: planneddepends_on: [p9-fb-14](칭찬) 회차 1 지적의
depends_on=[p9-fb-14]한 줄 fix 가 양방향 정합 (p9-fb-14.unblocks=[p9-fb-11] ↔ p9-fb-11.depends_on=[p9-fb-14]) 을 복원. 표 + 두 frontmatter 셋 다 동일한 의존 그래프 — 의존 추적용 grep 이 어느 방향으로도 동작.회차 3 — 회차 2 nit 2건 모두 반영 + 13번 줄 (prerequisite for 18 → p9-fb-18) 까지 일괄 정리. 추가 actionable 없음 — APPROVE.
남은 본문 안의
10번 항목/12번 color role같은 표기는 도그푸딩 피드백 원본 절 안에서 도그푸딩 항목을 가리키는 자연스러운 맥락 (회차 1 의14번과 wiring같은 spec body cross-ref 모호와 다름) — 정정 불필요.총평: 도그푸딩 16 항목 → 20 task spec + 1 plan 분해. 두 차례 회차로 typo 1, 양방향 의존 정합 1, cross-ref 모호 1, 자기모순 1, cosmetic 1, 가독성 nit 2 정리. 머지 후 p9-fb-06 plan 부터 즉시 실행 가능.
@@ -0,0 +300,4 @@4. **p9-fb-15 / 16** (multi-turn 핵심) — 사용자 의도 (꼬리 물기) 직결.5. **p9-fb-20** (citation) — 출처 보기, 도그푸딩 후속 검증의 prerequisite.6. **p9-fb-07** (title fallback) — Inspect 가 비어있는 문제. 작은 size.7. **p9-fb-19** (search cache) — p9-fb-08 debounce 와 함께 응답성.(칭찬)
5번 debounce→p9-fb-08 debounce정정 — 같은 줄에서p9-fb-19(search cache) 와p9-fb-08(debounce) 두 task ID 가 명시적으로 연결되어, reader 가 의존 / 시너지 한 줄로 파악.@@ -0,0 +304,4 @@8. **p9-fb-08** (debounce) — 작은 size, 즉시 효과.9. **p9-fb-09** (editor restore) — 작은 size.10. **p9-fb-12 → 13** (mode → cheatsheet) — UX 일관성 묶음.11. **p9-fb-14** (theme) — p9-fb-12 와 같은 batch 가능, p9-fb-11 의 prerequisite.(칭찬)
11 prerequisite→p9-fb-11 의 prerequisite한국어 어순 + task ID 명시로 양쪽 모호성 동시 해소. 13번 줄prerequisite for 18→prerequisite for p9-fb-18까지 일괄 정리해 우선순위 표 전체에 일관 패턴 (p9-fb-NN풀 ID) 확립.