@jjlabsio/claude-crew 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@
11
11
  "name": "claude-crew",
12
12
  "source": "./",
13
13
  "description": "오케스트레이터 + PM, 플래너, 개발, QA, 마케팅 에이전트 팀으로 단일 제품의 개발과 마케팅을 통합 관리",
14
- "version": "0.1.24",
14
+ "version": "0.1.26",
15
15
  "author": {
16
16
  "name": "Jaejin Song",
17
17
  "email": "wowlxx28@gmail.com"
@@ -28,5 +28,5 @@
28
28
  "category": "workflow"
29
29
  }
30
30
  ],
31
- "version": "0.1.24"
31
+ "version": "0.1.26"
32
32
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-crew",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": {
6
6
  "name": "Jaejin Song",
package/agents/dev.md CHANGED
@@ -7,7 +7,7 @@ tools: [Read, Write, Edit, Glob, Grep, Bash]
7
7
 
8
8
  # Dev 에이전트
9
9
 
10
- plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/타입/테스트) 4개를 모두 통과해야 완료를 선언한다.
10
+ plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/타입/테스트/실행 검증) 5개를 모두 통과해야 완료를 선언한다.
11
11
 
12
12
  ## 입력
13
13
 
@@ -39,6 +39,7 @@ plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/
39
39
  - 린트: PASS/FAIL + 명령어 + 출력
40
40
  - 타입: PASS/FAIL + 명령어 + 출력
41
41
  - 테스트: PASS/FAIL + 명령어 + 출력 (통과/실패 수)
42
+ - 실행 검증: PASS/FAIL + 실행 절차 + 실제 결과
42
43
 
43
44
  ## 변경 파일 목록
44
45
  - {파일 경로 + 변경 요약}
@@ -47,7 +48,8 @@ plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/
47
48
  ## 규칙
48
49
 
49
50
  - plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
50
- - 자체 검증 4개(빌드/린트/타입/테스트) 모두 PASS해야 완료를 선언할 수 있다.
51
+ - 자체 검증 5개(빌드/린트/타입/테스트/실행 검증) 모두 PASS해야 완료를 선언할 수 있다.
52
+ - 실행 검증: plan.md의 `## 실행 검증` 절차를 직접 실행하여 기능이 실제로 동작하는지 확인한다. 테스트 파일 실행이 아니라 기능 자체를 사용자 관점에서 실행하는 것이다.
51
53
  - 자체 검증이 실패하면 직접 수정하여 통과시킨다.
52
54
  - 기존 코드베이스의 컨벤션을 따른다.
53
55
  - retry 시 피드백 파일을 먼저 읽고, FAIL 항목만 수정한다. 지적하지 않은 부분을 추가로 변경하지 않는다.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: plan-evaluator
3
3
  model: sonnet
4
- description: 계획 검증 — E1-E6 하드 임계값 판정. Sonnet 사용 (Opus 합리화 방지)
4
+ description: 계획 검증 — E1-E8 하드 임계값 판정. Sonnet 사용 (Opus 합리화 방지)
5
5
  tools: [Read, Agent]
6
6
  ---
7
7
 
@@ -25,7 +25,7 @@ tools: [Read, Agent]
25
25
 
26
26
  ## 검증 항목
27
27
 
28
- 6개 항목, 모두 YES/NO 판정:
28
+ 8개 항목, 모두 YES/NO 판정:
29
29
 
30
30
  | # | 항목 | 확인 방법 |
31
31
  |---|------|----------|
@@ -35,6 +35,8 @@ tools: [Read, Agent]
35
35
  | E4 | **실행 가능성** — 구현자가 바로 시작할 수 있는 수준인가 | 판단 (직접) |
36
36
  | E5 | **테스트 전략 정합성** — analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가 | 문서 대 문서 비교 (직접) |
37
37
  | E6 | **비즈니스 가정 0개** — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가 | 문서 대 문서 비교 (직접) |
38
+ | E7 | **실행 검증 포함** — plan.md에 유닛 테스트와 별개로 기능을 직접 실행하는 검증 절차가 있는가 | 문서 확인 (직접) |
39
+ | E8 | **외부 인터페이스 가정 검증** — 여러 외부 대상을 동일 인터페이스로 처리 시, 각 대상별 검증 상태가 명시되고 미검증 대상에 스파이크 태스크가 있는가 | 문서 확인 (직접) |
38
40
 
39
41
  ## review.md 출력 형식
40
42
 
@@ -52,6 +54,8 @@ tools: [Read, Agent]
52
54
  | E4 | 실행 가능성 | YES/NO | {근거} |
53
55
  | E5 | 테스트 전략 정합성 | YES/NO | {근거} |
54
56
  | E6 | 비즈니스 가정 0개 | YES/NO | {근거} |
57
+ | E7 | 실행 검증 포함 | YES/NO | {근거} |
58
+ | E8 | 외부 인터페이스 가정 검증 | YES/NO | {근거} |
55
59
 
56
60
  ## FAIL 상세 (NO 항목만)
57
61
  ### {항목}: {사유}
@@ -65,7 +69,7 @@ tools: [Read, Agent]
65
69
 
66
70
  ## 판정 규칙
67
71
 
68
- - 6개 항목 모두 YES → PASS
72
+ - 8개 항목 모두 YES → PASS
69
73
  - 하나라도 NO → FAIL
70
74
  - E3 코드 참조 확인은 Explorer 서브에이전트를 호출한다.
71
75
  - "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
package/agents/planner.md CHANGED
@@ -49,6 +49,12 @@ tools: [Read, Write, Agent]
49
49
  ## 위험 요소
50
50
  {위험 요소 목록 또는 "없음"}
51
51
 
52
+ ## 외부 인터페이스 가정 (해당 시)
53
+ | 대상 | 가정하는 인터페이스 | 근거 | 검증 상태 |
54
+ |------|------------------|------|----------|
55
+ | {대상 1} | {인터페이스 설명} | 공식 문서 확인 | 검증됨 |
56
+ | {대상 2} | {대상 1과 동일} | 문서 없음 | 미검증 |
57
+
52
58
  ## 검증 시나리오 (contract.md용)
53
59
  {QA가 독립적으로 검증 가능한 시나리오 — 조건/행위/기대 결과}
54
60
 
@@ -69,5 +75,6 @@ tools: [Read, Write, Agent]
69
75
  - "나중에 결정"은 허용하지 않는다. 모르면 위험 요소에 기록한다.
70
76
  - 테스트 시나리오는 유저 스토리당 최소 2개 (정상 경로 + 에러 경로).
71
77
  - 검증 시나리오 섹션은 contract.md에 그대로 포함된다. QA가 이것만 보고 검증할 수 있어야 한다.
78
+ - analysis.md에 "미검증" 외부 인터페이스가 있으면, 해당 대상에 대한 스파이크 태스크를 구현 태스크 앞에 배치한다.
72
79
  - retry 시 review-{n}.md를 먼저 읽고, "이전 피드백 반영" 섹션을 반드시 포함한다.
73
80
  - 필요시 Explorer 서브에이전트를 호출하여 코드베이스를 확인할 수 있다.
package/agents/qa.md CHANGED
@@ -27,7 +27,9 @@ tools: [Read, Glob, Grep, Bash]
27
27
  2. **린트 검증** — 린트 명령어 실행.
28
28
  3. **타입 체크 검증** — 타입 체크 명령어 실행.
29
29
  4. **테스트 스위트 검증** — 전체 테스트 실행. 회귀 + 새 테스트.
30
- 5. **E2E / 통합 검증** — plan.md 테스트 시나리오 기반.
30
+ 5. **테스트 전략 준수 검증** (TDD 또는 Tests-after인 경우) — plan.md 명시된 테스트 파일 존재 및 통과 확인. None이면 PASS.
31
+ 6. **E2E / 통합 검증** — plan.md의 테스트 시나리오 기반.
32
+ 7. **실행 검증** — plan.md의 `## 실행 검증` 절차를 직접 실행. 자동화 테스트와 별개로 구현된 기능을 사용자 관점에서 실행하여 동작을 확인. 실행 검증 섹션이 plan.md에 없으면 즉시 FAIL.
31
33
 
32
34
  ## qa-report.md 출력 형식
33
35
 
@@ -43,17 +45,24 @@ tools: [Read, Glob, Grep, Bash]
43
45
  | 2 | 린트 | PASS/FAIL | `{cmd}` | {output} |
44
46
  | 3 | 타입 | PASS/FAIL | `{cmd}` | {output} |
45
47
  | 4 | 테스트 | PASS/FAIL | `{cmd}` | {output} |
46
- | 5 | E2E | PASS/FAIL | `{cmd}` | {시나리오별 결과} |
48
+ | 5 | 테스트 전략 준수 | PASS/FAIL | `{cmd}` | {output} |
49
+ | 6 | E2E | PASS/FAIL | `{cmd}` | {시나리오별 결과} |
50
+ | 7 | 실행 검증 | PASS/FAIL | `{cmd/절차}` | {실행 결과} |
47
51
 
48
52
  ## E2E 시나리오 상세
49
53
  | # | 시나리오 (plan.md 참조) | 결과 | 증거 |
50
54
  |---|----------------------|------|------|
51
55
  | 1 | {시나리오 설명} | PASS/FAIL | {실행 출력} |
56
+
57
+ ## 실행 검증 상세
58
+ | # | 검증 항목 (plan.md 실행 검증 참조) | 실행 방법 | 기대 결과 | 실제 결과 | 판정 |
59
+ |---|----------------------------------|----------|----------|----------|------|
60
+ | 1 | {검증 설명} | {명령어/절차} | {기대} | {실제} | PASS/FAIL |
52
61
  ```
53
62
 
54
63
  ## 판정 규칙
55
64
 
56
- - 항목 1-5 중 하나라도 FAIL → 전체 FAIL
65
+ - 항목 1-7 중 하나라도 FAIL → 전체 FAIL
57
66
  - 모든 항목 PASS → 전체 PASS
58
67
 
59
68
  ## 규칙
@@ -25,7 +25,7 @@ tools: [AskUserQuestion, Read, Agent]
25
25
  ## 서브에이전트 호출
26
26
 
27
27
  - **Explorer** (Haiku): 항상 호출. 병렬 2-3개. 코드베이스 탐색.
28
- - **Researcher** (Sonnet): 필요시만 호출. 외부 문서/라이브러리 리서치.
28
+ - **Researcher** (Sonnet): 필요시만 호출. 외부 문서/라이브러리 리서치. 외부 API/서비스가 관련된 경우, 각 대상별로 개별 조사하여 문서가 확인되지 않는 대상은 "미검증 인터페이스"로 명시한다.
29
29
 
30
30
  ## analysis.md 필수 구조
31
31
 
@@ -55,6 +55,12 @@ tools: [AskUserQuestion, Read, Agent]
55
55
  ### Must NOT
56
56
  - {절대 하면 안 되는 것}
57
57
 
58
+ ## 외부 인터페이스 검증 (해당 시)
59
+ | 대상 | 인터페이스 | 문서 근거 | 검증 상태 |
60
+ |------|----------|----------|----------|
61
+ | {대상 1} | {확인된 인터페이스} | {문서 URL/출처} | 검증됨 |
62
+ | {대상 2} | {대상 1과 동일 가정} | 문서 없음 | 미검증 |
63
+
58
64
  ## 외부 리서치 (해당 시)
59
65
  - {라이브러리/API 관련 발견 사항}
60
66
  ```
package/hud/index.mjs CHANGED
@@ -664,18 +664,21 @@ async function main() {
664
664
 
665
665
  const transcript = parseTranscript(stdin.transcript_path);
666
666
 
667
- // In worktrees, merge todos from the original project transcript.
667
+ // In worktrees, merge data from the original project transcript.
668
668
  // The worktree transcript only has events after EnterWorktree, so todos
669
- // created before are missing. The original transcript has the full history.
670
- // If the worktree transcript also has todos (created after worktree entry),
671
- // use the worktree's todos since they are more up-to-date for that session.
672
- if (transcript.todos.length === 0) {
669
+ // and agents created before are missing. The original transcript has the
670
+ // full history. If the worktree transcript already has its own data
671
+ // (created after worktree entry), prefer the worktree's version.
672
+ if (transcript.todos.length === 0 || transcript.agents.length === 0) {
673
673
  const originalPath = resolveOriginalTranscriptPath(stdin.transcript_path, cwd);
674
674
  if (originalPath) {
675
675
  const originalTranscript = parseTranscript(originalPath);
676
- if (originalTranscript.todos.length > 0) {
676
+ if (transcript.todos.length === 0 && originalTranscript.todos.length > 0) {
677
677
  transcript.todos = originalTranscript.todos;
678
678
  }
679
+ if (transcript.agents.length === 0 && originalTranscript.agents.length > 0) {
680
+ transcript.agents = originalTranscript.agents;
681
+ }
679
682
  }
680
683
  }
681
684
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlabsio/claude-crew",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": "Jaejin Song <wowlxx28@gmail.com>",
6
6
  "license": "MIT",
@@ -80,12 +80,14 @@ Bash("codex exec --model {model} -c model_reasoning_effort=\"{reasoning}\" --dan
80
80
  contract.md # 스프린트 계약
81
81
 
82
82
  # crew-dev 산출물 (신규 생성)
83
- dev-log.md # Dev: 구현 진행 로그
84
- review-report.md # CodeReviewer: 코드 리뷰 결과 (최신)
85
- qa-report.md # QA: 실행 검증 결과 (최신)
86
- review-report-{n}.md # FAIL 시 아카이브
87
- qa-report-{n}.md # FAIL 시 아카이브
88
- .dev_loop_count # 개발 루프 카운터
83
+ dev-log.md # Dev: 구현 진행 로그 (US별 섹션 누적)
84
+ review-report.md # CodeReviewer: US 단위 리뷰 결과 (최신)
85
+ qa-report.md # QA: US 단위 검증 결과 (최신)
86
+ review-report-{n}.md # US 단위 FAIL 시 아카이브
87
+ qa-report-{n}.md # US 단위 FAIL 시 아카이브
88
+ final-review-report.md # CodeReviewer: 최종 전체 리뷰 결과
89
+ final-qa-report.md # QA: 최종 전체 검증 결과
90
+ .dev_loop_count # US별 개발 루프 카운터 (US PASS 시 리셋)
89
91
  ```
90
92
 
91
93
  ---
@@ -134,9 +136,20 @@ contract.md 유효성 검사에 실패했습니다.
134
136
  [3] 이 태스크를 보류
135
137
  ```
136
138
 
137
- **1c. 워크트리 생성**
139
+ **1c. 워크트리 결정**
138
140
 
139
- Claude Code의 `EnterWorktree` 도구를 사용한다:
141
+ 기존 워크트리를 이어쓸지, 새로 만들지 판단한다.
142
+
143
+ **판단 순서** (위가 우선):
144
+
145
+ 1. contract.md에 `## 워크트리` 섹션이 있으면 그 값을 따른다:
146
+ - `mode: continue` + `branch: {브랜치명}` → 경로 B (이어가기)
147
+ - `mode: new` 또는 섹션 없음 → 경로 A (신규)
148
+ 2. `## 워크트리` 섹션이 없으면, 현재 호출 위치를 확인한다:
149
+ - 현재 디렉토리가 `.claude/worktrees/` 하위이고 해당 워크트리의 task-id가 일치하면 → 경로 B
150
+ - 그 외 → 경로 A
151
+
152
+ **경로 A — 신규 워크트리**
140
153
 
141
154
  ```
142
155
  EnterWorktree(name="feat/{task-id}")
@@ -149,9 +162,23 @@ git fetch origin main
149
162
  git reset --hard origin/main
150
163
  ```
151
164
 
152
- 이후 모든 작업은 워크트리에서 수행한다.
153
165
  환경 파일(`.env*` 등)이 원본 프로젝트에 있으면 복사한다.
154
166
 
167
+ **경로 B — 기존 워크트리 이어가기**
168
+
169
+ - `EnterWorktree` 호출하지 않는다 (이미 진입 상태이거나, contract.md 지정 브랜치의 워크트리가 존재).
170
+ - `git reset --hard` 하지 않는다 — 기존 커밋을 보존한다.
171
+ - 현재 상태만 확인한다:
172
+
173
+ ```bash
174
+ git log --oneline -5
175
+ git diff --stat
176
+ ```
177
+
178
+ - "기존 워크트리에서 작업을 이어갑니다" 로그를 출력한다.
179
+
180
+ 이후 모든 작업은 워크트리에서 수행한다.
181
+
155
182
  **1d. 상태 갱신**
156
183
 
157
184
  contract.md의 `## 상태` 섹션을 갱신한다:
@@ -163,41 +190,60 @@ IN_PROGRESS — Dev 에이전트가 구현 중이다.
163
190
 
164
191
  ---
165
192
 
166
- ### Phase 2 — 구현 (Dev 에이전트)
193
+ ### Phase 2 — US 단위 증분 개발 루프
167
194
 
168
- Phase 1a에서 해석된 dev 설정에 따라 디스패치한다.
195
+ plan.md의 유저 스토리(US)를 하나씩 순차적으로 구현하고, 각 US마다 검증을 통과해야 다음 US로 진행한다.
169
196
 
170
- #### Phase 2 claude provider인 경우
197
+ #### 2a. US 목록 파싱 (오케스트레이터 직접)
171
198
 
172
- 호출:
199
+ plan.md에서 `### US-{N}: {제목}` 패턴을 파싱하여 순서 목록을 만든다.
173
200
 
174
201
  ```
175
- Agent(subagent_type="dev", model="{설정된 모델}", description="Dev: {task-id} 구현", prompt="...")
202
+ US 목록: [US-1, US-2, ..., US-N]
203
+ 현재 US 인덱스: k = 1
204
+ ```
205
+
206
+ #### 2b. US-k 구현 → 검증 → 커밋 루프
207
+
208
+ 각 US-k에 대해 아래 순서를 반복한다.
209
+
210
+ ##### Step 1 — Dev 에이전트 호출 (US-k만 구현)
211
+
212
+ Phase 1a에서 해석된 dev 설정에 따라 디스패치한다.
213
+
214
+ **claude provider 호출:**
215
+
216
+ ```
217
+ Agent(subagent_type="dev", model="{설정된 모델}", description="Dev: {task-id} US-{k}", prompt="...")
176
218
  ```
177
219
 
178
220
  **첫 번째 실행 시 에이전트 프롬프트**:
179
221
 
180
222
  ```
181
- 당신은 Dev 에이전트다. plan.md 기반으로 코드를 구현한다.
223
+ 당신은 Dev 에이전트다. plan.md 유저 스토리 US-{k}만 구현한다.
182
224
 
183
225
  ## 입력
184
226
  .crew/plans/{task-id}/plan.md 를 읽어라.
185
227
  .crew/plans/{task-id}/contract.md 를 읽어라 (수용 기준 = 완료 기준).
186
228
  brief.md, spec.md, analysis.md는 읽지 않는다.
187
229
 
230
+ ## 작업 범위
231
+ plan.md의 유저 스토리 중 **US-{k}: {제목}** 의 구현 태스크만 수행한다.
232
+ 다른 US의 태스크는 절대 수행하지 않는다.
233
+
188
234
  ## 작업 순서
189
- 1. plan.md의 유저 스토리와 태스크 목록을 확인한다.
235
+ 1. plan.md에서 US-{k}구현 태스크와 테스트 시나리오를 확인한다.
190
236
  2. plan.md의 `## 테스트 전략` 섹션을 확인한다.
191
237
  3. 코드베이스를 탐색한다 (Glob, Grep, Read로 관련 파일 파악).
192
- 4. 유저 스토리 단위로 순차 구현한다.
238
+ 4. US-{k}의 태스크를 구현한다.
193
239
  - **TDD인 경우**: 각 태스크에서 반드시 RED→GREEN→REFACTOR 순서를 따른다.
194
240
  1. RED: 실패하는 테스트를 먼저 작성하고 실행하여 FAIL을 확인한다.
195
241
  2. GREEN: 테스트를 통과하는 최소한의 코드를 작성한다.
196
242
  3. REFACTOR: 코드 품질을 개선한다 (필요시).
197
243
  - **Tests-after인 경우**: 구현을 먼저 완료한 후, plan.md에 명시된 테스트 태스크를 수행한다.
198
- - **None인 경우**: 현재와 동일하게 구현한다.
199
- 5. 각 유저 스토리 완료 후 dev-log.md에 진행상황을 기록한다.
200
- 6. 모든 구현 완료 후 자체 검증을 실행한다:
244
+ - **None인 경우**: 구현만 수행한다.
245
+ 5. dev-log.md에 US-{k} 진행상황을 기록한다 (기존 내용 뒤에 추가).
246
+ 6. 자체 검증을 실행한다:
201
247
  - 빌드 성공 확인
202
248
  - 린트 통과 확인
203
249
  - 타입 체크 통과 확인
@@ -207,10 +253,10 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
207
253
  자체 검증이 실패하면 직접 수정하여 통과시킨다.
208
254
 
209
255
  ## 출력
210
- .crew/plans/{task-id}/dev-log.md 작성하라.
256
+ .crew/plans/{task-id}/dev-log.md US-{k} 섹션을 추가하라.
211
257
 
212
258
  ## 규칙
213
- - plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
259
+ - US-{k}의 태스크만 구현한다 (다른 US 금지).
214
260
  - 자체 검증 5개(빌드/린트/타입/테스트/lint-staged) 모두 PASS 해야 완료를 선언할 수 있다.
215
261
  - 기존 코드베이스의 컨벤션을 따른다.
216
262
  - TDD 전략인 경우, 테스트를 먼저 작성하지 않고 프로덕션 코드를 작성하지 않는다.
@@ -219,7 +265,7 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
219
265
  **retry 시 에이전트 프롬프트**:
220
266
 
221
267
  ```
222
- 이번은 이전 구현이 검증에서 FAIL을 받은 후 수정하는 것이다.
268
+ 이전 US-{k} 구현이 검증에서 FAIL을 받았다. 수정한다.
223
269
 
224
270
  ## 입력
225
271
  .crew/plans/{task-id}/plan.md 를 읽어라.
@@ -228,123 +274,253 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
228
274
  .crew/plans/{task-id}/qa-report-{n}.md 를 읽어라. (QA 피드백)
229
275
  brief.md, spec.md, analysis.md는 읽지 않는다.
230
276
 
231
- ## 필수 선행 작업
232
- 피드백 파일을 먼저 읽어라. 어떤 항목이 FAIL인지 확인하고 해당 부분을 수정하라.
277
+ ## 작업 범위
278
+ US-{k}에 해당하는 피드백만 수정한다. 다른 US의 코드를 변경하지 않는다.
233
279
 
234
280
  ## 작업 순서
235
281
  1. 피드백에서 FAIL 항목을 모두 파악한다.
236
282
  2. 각 FAIL 항목에 대해 수정을 수행한다.
237
- 3. dev-log.md를 갱신한다 (최상단에 "수정 이력 (retry {n})" 섹션 추가).
238
- 4. 자체 검증 5개를 모두 다시 실행한다.
283
+ 3. dev-log.md를 갱신한다 (US-{k} 섹션 최상단에 "수정 이력 (retry {n})" 추가).
284
+ 4. 자체 검증 5개를 모두 다시 실행한다 (빌드/린트/타입/테스트/lint-staged).
239
285
 
240
286
  ## 규칙
241
287
  - 피드백에서 지적하지 않은 부분을 추가로 변경하지 않는다.
242
288
  - 자체 검증 5개 모두 PASS 해야 완료를 선언할 수 있다.
243
289
  ```
244
290
 
245
- #### Phase 2 — codex provider인 경우
291
+ **codex provider인 경우:**
246
292
 
247
- 오케스트레이터가 다음을 수행한다:
248
-
249
- 1. plan.md와 contract.md의 내용을 읽어 프롬프트에 인라인으로 주입한다.
250
- 2. Codex를 실행한다:
293
+ 오케스트레이터가 plan.md에서 US-{k} 섹션과 contract.md의 수용 기준을 추출하여 프롬프트에 인라인으로 주입한다.
251
294
 
252
295
  ```bash
253
296
  codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "$(cat <<'PROMPT'
254
- 당신은 Dev 에이전트다. 아래 plan.md를 기반으로 코드를 구현한다.
297
+ 당신은 Dev 에이전트다. 아래 유저 스토리 US-{k}만 구현한다.
298
+
299
+ ## US-{k} (plan.md에서 추출)
300
+ {오케스트레이터가 US-{k} 섹션만 인라인 삽입}
255
301
 
256
- ## plan.md
257
- {오케스트레이터가 plan.md 내용을 여기에 인라인 삽입}
302
+ ## 테스트 전략
303
+ {오케스트레이터가 테스트 전략 섹션 인라인 삽입}
258
304
 
259
305
  ## contract.md (수용 기준)
260
- {오케스트레이터가 contract.md의 수용 기준 섹션을 여기에 인라인 삽입}
306
+ {오케스트레이터가 수용 기준 섹션 인라인 삽입}
261
307
 
262
308
  ## 작업 순서
263
309
  1. 코드베이스를 탐색하여 관련 파일을 파악한다.
264
- 2. 유저 스토리 단위로 순차 구현한다.
265
- 3. 모든 구현 완료 후 자체 검증을 실행한다:
266
- - 빌드 성공 확인
267
- - 린트 통과 확인
268
- - 타입 체크 통과 확인
269
- - 기존 테스트 스위트 통과 확인
310
+ 2. US-{k}의 태스크만 구현한다.
311
+ 3. 자체 검증을 실행한다 (빌드/린트/타입/테스트).
270
312
  4. 자체 검증이 실패하면 직접 수정하여 통과시킨다.
271
313
 
272
314
  ## 규칙
273
- - plan.md에 없는 것을 구현하지 않는다.
315
+ - US-{k}의 태스크만 구현한다 (다른 US 금지).
274
316
  - 자체 검증 모두 PASS 해야 완료를 선언할 수 있다.
275
317
  - 기존 코드베이스의 컨벤션을 따른다.
276
318
 
277
319
  ## 완료 시 출력
278
- 구현 요약을 마지막에 출력하라:
320
+ 구현 요약을 출력하라:
279
321
  - 변경한 파일 목록
280
- - 유저 스토리별 구현 내용 1줄 요약
322
+ - US-{k} 구현 내용 1줄 요약
281
323
  - 자체 검증 결과 (각 항목별 PASS/FAIL + 명령어 + 출력)
282
324
  PROMPT
283
325
  )"
284
326
  ```
285
327
 
286
- 3. Codex stdout을 캡처하여 `.crew/plans/{task-id}/dev-log.md`를 생성한다.
328
+ Codex stdout을 캡처하여 dev-log.md US-{k} 섹션으로 추가한다.
287
329
 
288
- **retry 시 (codex provider)**:
330
+ **retry 시 (codex provider)**: 프롬프트에 review-report-{n}.md와 qa-report-{n}.md 내용을 인라인 삽입한다.
289
331
 
290
- 동일한 패턴으로, 프롬프트에 review-report-{n}.md와 qa-report-{n}.md 내용을 인라인 삽입한다.
332
+ ##### Step 2 US-k 검증 (CodeReviewer + QA 병렬)
291
333
 
292
- **Phase 2 실패 조건**: Dev 에이전트가 자체 검증을 통과하지 못한 채 완료를 선언하면 에스컬레이션.
334
+ CodeReviewer와 QA를 **동시에** 호출한다. US-k의 변경분만 검증한다.
293
335
 
294
- ---
336
+ **CodeReviewer (US-k)**
295
337
 
296
- ### Phase 3 — 병렬 검증 (CodeReviewer + QA)
338
+ 오케스트레이터 사전 작업:
339
+ 1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
340
+ 2. 가드레일을 프롬프트에 인라인 주입한다.
297
341
 
298
- CodeReviewer와 QA를 **동시에** Agent tool 2개로 호출한다.
342
+ 에이전트 프롬프트:
299
343
 
300
- #### Phase 3a — CodeReviewer
344
+ ```
345
+ 당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
301
346
 
302
- Phase 1a에서 해석된 code-reviewer 설정에 따라 디스패치한다.
347
+ ## 입력
348
+ `git diff HEAD`를 직접 실행하여 마지막 커밋 이후 변경 사항을 확인하라.
349
+ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
350
+ 코드만 보고 판단한다.
303
351
 
304
- **claude provider 호출:**
352
+ ### 가드레일 (contract.md에서 추출)
353
+ #### Must
354
+ - {오케스트레이터가 contract.md에서 복사한 내용}
355
+ #### Must NOT
356
+ - {오케스트레이터가 contract.md에서 복사한 내용}
357
+
358
+ 위 가드레일을 위반하는 변경이 있으면 critical로 지적하라.
359
+
360
+ ## 검토 항목
361
+ 1. 가드레일 위반 (위반 시 critical)
362
+ 2. 코드베이스 컨벤션 준수 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
363
+ 3. 보안 취약점
364
+ 4. 불필요한 복잡도
365
+ 5. 잠재적 버그
366
+ 6. 에러 처리 적절성
367
+
368
+ ## 출력
369
+ 아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
370
+
371
+ ## 판정 규칙
372
+ - 가드레일 위반 → critical
373
+ - critical 또는 major가 1개 이상 → FAIL
374
+ - minor만 있거나 지적 없음 → PASS
375
+ ```
376
+
377
+ **QA (US-k)**
378
+
379
+ 에이전트 프롬프트:
305
380
 
306
381
  ```
307
- Agent(subagent_type="code-reviewer", model="{설정된 모델}", description="CodeReviewer: {task-id} 코드 리뷰", prompt="...")
382
+ 당신은 QA 에이전트다. US-{k} 구현이 실제로 동작하는지 검증한다.
383
+
384
+ ## 입력
385
+ .crew/plans/{task-id}/plan.md 를 읽어라.
386
+ plan.md의 US-{k} 테스트 시나리오를 확인하라.
387
+ contract.md, brief.md, spec.md는 읽지 않는다.
388
+
389
+ ## 검증 항목 (순서대로 실행)
390
+ 1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
391
+ 2. 린트 검증
392
+ 3. 타입 체크 검증
393
+ 4. 테스트 스위트 검증 (전체 테스트 실행 — 기존 테스트 회귀 방지)
394
+ 5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
395
+ - plan.md의 US-{k}에 명시된 테스트 파일이 실제로 존재하는가?
396
+ - 해당 테스트가 실행되고 통과하는가?
397
+ - None인 경우 이 항목을 PASS로 처리한다.
398
+ 6. US-{k} 시나리오 검증 — plan.md의 US-{k} 테스트 시나리오 기반
399
+
400
+ ## 출력
401
+ 아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
402
+
403
+ ## 판정 규칙
404
+ - 항목 1-6 중 하나라도 FAIL → 전체 FAIL
405
+ - 모든 항목 PASS → 전체 PASS
406
+
407
+ ## 규칙
408
+ - 모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
409
+ - 실행 출력을 반드시 캡처하여 기록한다.
410
+ - 코드를 수정하지 않는다. 검증만 한다.
308
411
  ```
309
412
 
310
- **codex provider 호출:**
413
+ **병렬 실행 방법**: Phase 3과 동일 (provider 조합에 따라 Agent/Bash 병렬 호출).
414
+
415
+ **결과 저장 (오케스트레이터 직접)**:
416
+ - CodeReviewer 결과 → `.crew/plans/{task-id}/review-report.md`
417
+ - QA 결과 → `.crew/plans/{task-id}/qa-report.md`
418
+
419
+ ##### Step 3 — US-k 판정
420
+
421
+ 오케스트레이터가 직접 판정한다:
422
+ - CodeReviewer PASS + QA PASS → **US-k PASS** → Step 4로
423
+ - 하나라도 FAIL → **US-k FAIL** → Step 5로
424
+
425
+ ##### Step 4 — US-k 체크포인트 커밋
311
426
 
312
- 오케스트레이터가 `git diff main...HEAD`를 실행하여 diff를 캡처한 뒤, diff와 가드레일을 프롬프트에 인라인 삽입하여 Codex를 실행한다.
427
+ US-k가 PASS하면 즉시 커밋하여 체크포인트를 만든다:
313
428
 
314
429
  ```bash
315
- codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "$(cat <<'PROMPT'
316
- 당신은 CodeReviewer다. 아래 코드 변경 사항의 품질을 판단하라.
430
+ git add -A
431
+ git commit --no-verify -m "feat({task-id}): US-{k} {US 제목}"
432
+ ```
317
433
 
318
- ## 변경 사항 (git diff)
319
- {오케스트레이터가 git diff 결과를 인라인 삽입}
434
+ > `--no-verify`: 검증 단계에서 이미 빌드/린트/타입/테스트를 통과했으므로 pre-commit hook을 중복 실행하지 않는다.
320
435
 
321
- ## 가드레일
322
- ### Must
323
- {contract.md에서 추출한 Must 항목}
324
- ### Must NOT
325
- {contract.md에서 추출한 Must NOT 항목}
436
+ `.dev_loop_count` 파일이 존재하면 삭제한다 (US-k 루프 카운터 리셋).
326
437
 
327
- ## 검토 항목 / 판정 규칙 / 출력 형식
328
- (claude provider 프롬프트와 동일)
329
- PROMPT
330
- )"
438
+ **다음 US 진행**: k를 증가시키고 Step 1로 돌아간다.
439
+ **모든 US 완료**: Phase 3으로 진행한다.
440
+
441
+ ##### Step 5 — US-k FAIL 처리
442
+
443
+ **5a. 루프 카운터 읽기**
444
+
445
+ `.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
446
+ - 파일이 없으면 카운터 = 0
447
+ - 파일이 있으면 파일 내용(정수)이 카운터 값
448
+
449
+ **5b. 에스컬레이션 판단**
450
+
451
+ 두 가지 에스컬레이션 조건:
452
+
453
+ **조건 1 — 루프 상한 초과**:
454
+
455
+ 카운터 값 >= 4이면 즉시 에스컬레이션:
456
+
457
+ ```
458
+ US-{k}이 5회 반복 후에도 검증을 통과하지 못했습니다.
459
+ 최종 FAIL 사유를 첨부합니다.
460
+ [1] US-{k}의 범위를 좁혀서 재시도
461
+ [2] plan.md를 수정
462
+ [3] 이 태스크를 보류
463
+ ```
464
+
465
+ 에스컬레이션 시:
466
+ - `.dev_loop_count` 파일을 삭제한다.
467
+ - contract.md 상태를 `BLOCKED — US-{k}에서 중단`으로 갱신한다.
468
+ - `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
469
+
470
+ **조건 2 — 같은 기준 3회 연속 실패**:
471
+
472
+ review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
473
+ 이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
474
+
475
+ ```
476
+ US-{k}의 {항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
477
+ [1] plan.md를 수정 (구현 전략의 문제)
478
+ [2] contract.md를 수정 (기준 자체의 문제)
479
+ [3] 이 태스크를 보류
480
+ ```
481
+
482
+ 에스컬레이션 시 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
483
+
484
+ **5c. 피드백 아카이브**
485
+
486
+ `n = 카운터 + 1`
487
+
488
+ ```
489
+ review-report.md → review-report-{n}.md
490
+ qa-report.md → qa-report-{n}.md
331
491
  ```
332
492
 
333
- Codex stdout을 캡처하여 review-report.md 내용으로 사용한다.
493
+ **5d. 루프 카운터 증가 저장**
334
494
 
335
- **공통 사전 작업 (provider 무관):**
495
+ `카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
496
+
497
+ **5e. Step 1로 돌아감 (US-k retry)**
498
+
499
+ Step 1(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
500
+ Dev 수정 완료 후 Step 2(CodeReviewer + QA)를 재실행한다.
501
+
502
+ ---
503
+
504
+ ### Phase 3 — 최종 전체 검증 (CodeReviewer + QA)
505
+
506
+ 모든 US가 개별 검증을 통과한 후, 전체 변경 사항에 대해 통합 검증을 수행한다.
507
+ US 간 상호작용에서 발생할 수 있는 문제를 잡기 위한 단계다.
336
508
 
337
- 오케스트레이터가 해야 사전 작업:
509
+ CodeReviewer와 QA를 **동시에** 호출한다.
510
+
511
+ #### Phase 3a — CodeReviewer (전체)
512
+
513
+ 오케스트레이터 사전 작업:
338
514
  1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
339
- 2. 가드레일을 CodeReviewer 프롬프트에 인라인으로 주입한다.
515
+ 2. 가드레일을 프롬프트에 인라인 주입한다.
340
516
 
341
517
  에이전트 프롬프트:
342
518
 
343
519
  ```
344
- 당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
520
+ 당신은 CodeReviewer 에이전트다. 전체 코드 변경 사항의 품질을 판단한다.
345
521
 
346
522
  ## 입력
347
- `git diff main...HEAD`를 직접 실행하여 변경 사항을 확인하라.
523
+ `git diff main...HEAD`를 직접 실행하여 전체 변경 사항을 확인하라.
348
524
  contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
349
525
  코드만 보고 판단한다.
350
526
 
@@ -363,6 +539,7 @@ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
363
539
  4. 불필요한 복잡도
364
540
  5. 잠재적 버그
365
541
  6. 에러 처리 적절성
542
+ 7. **모듈 간 정합성** — 변경된 파일들 사이의 인터페이스, 타입, import가 일관적인가
366
543
 
367
544
  ## 출력
368
545
  아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
@@ -373,50 +550,40 @@ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
373
550
  - minor만 있거나 지적 없음 → PASS
374
551
  ```
375
552
 
376
- #### Phase 3b — QA
377
-
378
- Phase 1a에서 해석된 qa 설정에 따라 디스패치한다.
379
-
380
- **claude provider 호출:**
381
-
382
- ```
383
- Agent(subagent_type="qa", model="{설정된 모델}", description="QA: {task-id} 검증", prompt="...")
384
- ```
385
-
386
- **codex provider 호출:**
387
-
388
- 오케스트레이터가 plan.md 내용을 읽어 프롬프트에 인라인 삽입하여 Codex를 실행한다. Codex stdout을 캡처하여 qa-report.md 내용으로 사용한다.
389
-
390
- ```bash
391
- codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "{QA 프롬프트 + plan.md 인라인}"
392
- ```
553
+ #### Phase 3b — QA (전체)
393
554
 
394
555
  에이전트 프롬프트:
395
556
 
396
557
  ```
397
- 당신은 QA 에이전트다. 구현이 실제로 동작하는지 검증한다.
558
+ 당신은 QA 에이전트다. 전체 구현이 실제로 동작하는지 최종 검증한다.
398
559
 
399
560
  ## 입력
400
561
  .crew/plans/{task-id}/plan.md 를 읽어라.
401
- plan.md의 유저 스토리와 테스트 시나리오를 확인하라.
562
+ plan.md의 모든 유저 스토리, 테스트 시나리오, 검증 시나리오를 확인하라.
402
563
  contract.md, brief.md, spec.md는 읽지 않는다.
403
564
 
404
565
  ## 검증 항목 (순서대로 실행)
405
566
  1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
406
567
  2. 린트 검증
407
568
  3. 타입 체크 검증
408
- 4. 테스트 스위트 검증
569
+ 4. 테스트 스위트 검증 (전체 테스트)
409
570
  5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
410
- - plan.md에 명시된 테스트 파일이 실제로 존재하는가?
571
+ - plan.md에 명시된 모든 테스트 파일이 실제로 존재하는가?
411
572
  - 해당 테스트가 실행되고 통과하는가?
412
573
  - None인 경우 이 항목을 PASS로 처리한다.
413
- 6. E2E / 통합 검증 — plan.md의 테스트 시나리오 기반
574
+ 6. 전체 E2E / 통합 검증 — plan.md의 모든 테스트 시나리오 기반
575
+ 7. 실행 검증 — plan.md의 `## 실행 검증` 절차를 직접 실행한다.
576
+ - 자동화 테스트와 별개로, 구현된 기능을 사용자 관점에서 직접 실행한다.
577
+ - 백엔드: 실제 API 호출, 스크립트 실행 등
578
+ - UI: 개발 서버에서 브라우저 조작
579
+ - 각 항목의 기대 결과와 실제 결과를 비교하여 판정한다.
580
+ - 실행 검증 섹션이 plan.md에 없으면 즉시 FAIL.
414
581
 
415
582
  ## 출력
416
583
  아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
417
584
 
418
585
  ## 판정 규칙
419
- - 항목 1-6 중 하나라도 FAIL → 전체 FAIL
586
+ - 항목 1-7 중 하나라도 FAIL → 전체 FAIL
420
587
  - 모든 항목 PASS → 전체 PASS
421
588
 
422
589
  ## 규칙
@@ -429,8 +596,8 @@ contract.md, brief.md, spec.md는 읽지 않는다.
429
596
 
430
597
  CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
431
598
  오케스트레이터가 각 에이전트의 반환 텍스트를 파일로 저장한다:
432
- - CodeReviewer 결과 → `.crew/plans/{task-id}/review-report.md`
433
- - QA 결과 → `.crew/plans/{task-id}/qa-report.md`
599
+ - CodeReviewer 결과 → `.crew/plans/{task-id}/final-review-report.md`
600
+ - QA 결과 → `.crew/plans/{task-id}/final-qa-report.md`
434
601
 
435
602
  **Phase 3 병렬 실행 방법**:
436
603
 
@@ -440,39 +607,42 @@ CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하
440
607
  - 둘 다 codex → Bash tool 2개를 한 번에 호출
441
608
  - 혼합 → Agent + Bash를 한 번에 호출
442
609
 
443
- ```
444
- # 예: code-reviewer=claude, qa=codex
445
- Agent(subagent_type="code-reviewer", model="opus", description="CodeReviewer: {task-id}", prompt="...")
446
- Bash("codex exec --model gpt-5.4 ... '{QA 프롬프트}'")
447
- ```
448
-
449
610
  ---
450
611
 
451
- ### Phase 4 — 오케스트레이터 직접 판정
612
+ ### Phase 4 — 최종 판정 + 완료
452
613
 
453
- **Critic(DevAuditor)을 사용하지 않는다.** 오케스트레이터가 CodeReviewer + QA 결과로 직접 판정한다.
614
+ **4a. 오케스트레이터 직접 판정**
454
615
 
455
616
  판정 규칙:
456
- - CodeReviewer PASS + QA PASS → **PASS** → Phase 5
457
- - 하나라도 FAIL → **FAIL** → Step 6으로
617
+ - CodeReviewer PASS + QA PASS → **PASS** → 4b
618
+ - 하나라도 FAIL → **FAIL** → 에스컬레이션
458
619
 
459
- ---
620
+ 최종 전체 검증 FAIL 시 자동 retry하지 않는다. US 간 상호작용 문제는 어떤 US를 수정해야 하는지 자동 판단이 어렵기 때문이다.
460
621
 
461
- ### Phase 5 — 완료 (오케스트레이터 직접)
622
+ ```
623
+ 최종 전체 검증에서 FAIL이 발생했습니다.
624
+ 개별 US는 모두 통과했으나 통합 단계에서 문제가 발견되었습니다.
625
+ final-review-report.md, final-qa-report.md를 확인하세요.
626
+ [1] 문제 원인을 특정하여 해당 US를 수동 수정 후 재실행
627
+ [2] plan.md를 수정하여 US 간 의존성을 재설계
628
+ [3] 이 태스크를 보류
629
+ ```
462
630
 
463
- **5a. 커밋 + PR**
631
+ 에스컬레이션 시:
632
+ - contract.md 상태를 `BLOCKED — 최종 전체 검증 FAIL`로 갱신한다.
633
+ - `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
634
+
635
+ **4b. PR 생성**
464
636
 
465
637
  ```bash
466
- git add -A
467
- git commit --no-verify -m "feat({task-id}): {contract.md 목표 1줄 요약}"
468
638
  git push -u origin feat/{task-id}
469
639
  ```
470
640
 
471
- > `--no-verify`: crew-dev가 이미 빌드/린트/타입/테스트 + lint-staged 검증을 완료했으므로 호스트 프로젝트의 pre-commit hook을 중복 실행하지 않는다.
641
+ > US 단위 커밋은 Phase 2에서 이미 완료되었으므로 추가 커밋은 불필요하다.
472
642
 
473
643
  PR을 생성한다 (머지하지 않는다).
474
644
 
475
- **5b. 상태 갱신**
645
+ **4c. 상태 갱신**
476
646
 
477
647
  contract.md의 `## 수용 기준` 섹션에서 모든 `- [ ]`를 `- [x]`로 변경한다.
478
648
 
@@ -484,11 +654,11 @@ COMPLETED — 모든 수용 기준이 검증을 통과했다.
484
654
  PR: {PR URL}
485
655
  ```
486
656
 
487
- **5c. .dev_loop_count 정리**
657
+ **4d. 정리**
488
658
 
489
659
  `.dev_loop_count` 파일이 존재하면 삭제한다.
490
660
 
491
- **5d. 워크트리 종료**
661
+ **4e. 워크트리 종료**
492
662
 
493
663
  ```
494
664
  ExitWorktree(action="remove")
@@ -496,7 +666,7 @@ ExitWorktree(action="remove")
496
666
 
497
667
  PR push가 완료되었으므로 로컬 워크트리를 제거하고 원본 프로젝트 디렉토리로 복귀한다.
498
668
 
499
- **5e. 완료 반환**
669
+ **4f. 완료 반환**
500
670
 
501
671
  ```
502
672
  상태: COMPLETE
@@ -506,81 +676,16 @@ PR: {PR URL}
506
676
 
507
677
  ---
508
678
 
509
- ### Step 6 — FAIL 처리 (검증 루프)
510
-
511
- Phase 4에서 FAIL이면:
512
-
513
- **6a. 루프 카운터 읽기**
514
-
515
- `.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
516
- - 파일이 없으면 카운터 = 0
517
- - 파일이 있으면 파일 내용(정수)이 카운터 값
518
-
519
- **6b. 에스컬레이션 판단**
520
-
521
- 두 가지 에스컬레이션 조건:
522
-
523
- **조건 1 — 루프 상한 초과**:
524
-
525
- 카운터 값 >= 4이면 즉시 에스컬레이션:
526
-
527
- ```
528
- 검증 루프가 5회 반복 후에도 통과하지 못했습니다.
529
- 최종 FAIL 사유를 첨부합니다.
530
- [1] 수용 기준을 좁혀서 재시도
531
- [2] contract.md를 수정
532
- [3] 이 태스크를 보류
533
- ```
534
-
535
- 에스컬레이션 시:
536
- - `.dev_loop_count` 파일을 삭제한다.
537
- - contract.md 상태를 `BLOCKED`으로 갱신한다.
538
- - `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
539
-
540
- **조건 2 — 같은 기준 3회 연속 실패**:
541
-
542
- review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
543
- 이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
544
-
545
- ```
546
- {항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
547
- [1] contract.md를 수정 (기준 자체의 문제)
548
- [2] plan.md를 수정 (구현 전략의 문제)
549
- [3] 이 태스크를 보류
550
- ```
551
-
552
- 에스컬레이션 시 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
553
-
554
- **6c. 피드백 아카이브**
555
-
556
- `n = 카운터 + 1`
557
-
558
- ```
559
- review-report.md → review-report-{n}.md
560
- qa-report.md → qa-report-{n}.md
561
- ```
562
-
563
- **6d. 루프 카운터 증가 저장**
564
-
565
- `카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
566
-
567
- **6e. Phase 2로 돌아감 (retry)**
568
-
569
- Phase 2(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
570
- Dev 수정 완료 후 Phase 3(CodeReviewer + QA)을 **둘 다** 재실행한다.
571
-
572
- ---
573
-
574
679
  ## 루프 카운터 (.dev_loop_count) 생명주기
575
680
 
576
681
  | 이벤트 | 동작 |
577
682
  |--------|------|
578
- | 첫 번째 진입 | 파일 없음 (카운터 = 0) |
579
- | n번째 FAIL 처리 후 | 파일 갱신, 내용: `n` |
580
- | PASS (Phase 5) | 파일 삭제 |
683
+ | US-k 첫 진입 | 파일 없음 (카운터 = 0) |
684
+ | US-k n번째 FAIL 후 | 파일 갱신, 내용: `n` |
685
+ | US-k PASS (Step 4) | 파일 삭제 |
581
686
  | 에스컬레이션 | 파일 삭제 |
582
687
 
583
- 검증 사이클은 최대 5회 (초기 1회 + retry 최대 4회).
688
+ US당 최대 5회 검증 사이클 (초기 1회 + retry 최대 4회).
584
689
 
585
690
  ---
586
691
 
@@ -87,11 +87,12 @@ WHAT(무엇을 만드는가)은 이미 정의되어 있으므로, HOW(어떻게
87
87
  - 테스트 실행 스크립트 (package.json scripts 등)
88
88
  - Researcher (Sonnet): 외부 리서치. 필요시만 호출.
89
89
  Agent(subagent_type="researcher", description="외부 리서치: {리서치 대상}", prompt="...")
90
+ **외부 API/서비스가 관련된 경우**: spec.md에 언급된 각 외부 대상(엔드포인트, 서비스, 플랫폼)에 대해 **개별적으로** 문서/인터페이스를 조사하라. 하나의 대상에 대한 문서를 다른 대상에 일반화하지 않는다. 문서가 확인되지 않는 대상은 "미검증 인터페이스"로 명시한다.
90
91
 
91
92
  ## 출력
92
93
  아래 필수 섹션을 포함한 분석 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
93
94
 
94
- 필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라(프레임워크/패턴/유무), 외부 리서치(해당 시).
95
+ 필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라(프레임워크/패턴/유무), 외부 인터페이스 검증(해당 시), 외부 리서치(해당 시).
95
96
 
96
97
  ## 규칙
97
98
  - 요구사항에 빈틈이 있으면 AskUserQuestion으로 유저에게 직접 질문하라.
@@ -172,7 +173,7 @@ brief.md는 읽지 않는다.
172
173
  ## 출력
173
174
  .crew/plans/{task-id}/plan.md 를 작성하라.
174
175
 
175
- plan.md 필수 구조: 유저 스토리(US-N) 단위. 각 유저 스토리에 구현 태스크 + 테스트 시나리오(최소 2개: 정상+에러). 위험 요소 섹션. 검증 시나리오 섹션(조건/행위/기대 결과 — contract.md에 그대로 포함됨).
176
+ plan.md 필수 구조: 유저 스토리(US-N) 단위. 각 유저 스토리에 구현 태스크 + 테스트 시나리오(최소 2개: 정상+에러). 위험 요소 섹션. 검증 시나리오 섹션(조건/행위/기대 결과 — contract.md에 그대로 포함됨). 실행 검증 섹션(필수 — contract.md에 그대로 포함됨).
176
177
 
177
178
  ## 테스트 전략
178
179
  analysis.md의 `## 테스트 전략` 섹션을 확인하고, 결정에 따라 태스크 구조를 달리한다.
@@ -195,6 +196,29 @@ analysis.md의 `## 테스트 전략` 섹션을 확인하고, 결정에 따라
195
196
 
196
197
  plan.md 최상단에 `## 테스트 전략` 섹션을 두어 결정 사항을 명시한다.
197
198
 
199
+ ### 외부 인터페이스 가정 (외부 API/서비스가 관련된 경우 필수)
200
+ analysis.md에 `## 외부 인터페이스 검증` 섹션이 있으면, plan.md에 `## 외부 인터페이스 가정` 섹션을 반드시 작성한다.
201
+ 각 외부 대상에 대해 가정하는 인터페이스와 검증 상태를 명시한다:
202
+
203
+ | 대상 | 가정하는 인터페이스 | 근거 | 검증 상태 |
204
+ |------|------------------|------|----------|
205
+ | {대상 1} | {인터페이스 설명} | 공식 문서 확인 | 검증됨 |
206
+ | {대상 2} | {대상 1과 동일} | 문서 없음, 유추 | 미검증 |
207
+
208
+ **"미검증" 대상이 있으면**: 해당 대상에 대한 **스파이크 태스크**를 구현 태스크 앞에 배치한다.
209
+ 스파이크 태스크는 실제 API를 호출하여 인터페이스를 확인하고, 검증된 대상과의 차이점을 기록한다.
210
+ 차이가 발견되면 이후 구현 태스크의 접근 방식을 스파이크 결과에 따라 분기하도록 계획한다.
211
+
212
+ ### 실행 검증 (필수, 테스트 전략과 무관하게 항상 포함)
213
+ 유닛 테스트/자동화 테스트와 별개로, 구현된 기능을 실제로 실행하여 동작을 확인하는 절차를 `## 실행 검증` 섹션에 반드시 작성한다.
214
+ - 백엔드/API: 실제 API 호출 명령어(curl/httpie), 스크립트 실행, DB 쿼리 등
215
+ - UI/프론트엔드: 개발 서버 실행 후 브라우저에서 직접 조작하는 절차
216
+ - CLI/라이브러리: 실제 사용 예시 실행
217
+ "테스트 파일 실행"은 실행 검증이 아니다. 실제 기능을 사용자 관점에서 동작시키는 것이 실행 검증이다.
218
+ 각 실행 검증 항목은 다음 형식으로 작성한다:
219
+ - 실행 방법: {구체적 명령어 또는 절차}
220
+ - 기대 결과: {확인할 출력 또는 동작}
221
+
198
222
  ## 규칙
199
223
  - 코드를 작성하지 않는다.
200
224
  - analysis.md의 아키텍처 방향과 가드레일을 따른다.
@@ -263,9 +287,17 @@ Agent(subagent_type="plan-evaluator", description="PlanEvaluator: {task-id} 계
263
287
  - Tests-after: 구현 태스크 뒤에 테스트 작성 태스크가 있는가? 테스트 파일 경로가 명시되어 있는가?
264
288
  - None: 이 항목을 YES로 처리한다.
265
289
  [ ] E6. 비즈니스 가정 0개 — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가? plan에 "~로 가정", "~로 판단" 등 spec에 근거 없는 비즈니스 결정이 있으면 NO.
290
+ [ ] E7. 실행 검증 포함 — plan.md에 `## 실행 검증` 섹션이 있고, 유닛 테스트와 별개로 구현된 기능을 실제로 실행하여 동작을 확인하는 절차가 구체적으로 명시되어 있는가?
291
+ - 각 항목에 실행 방법(명령어/절차)과 기대 결과가 있는가?
292
+ - "테스트 파일 실행"만으로 구성되어 있으면 NO.
293
+ - 백엔드라면 실제 API 호출/스크립트 실행, UI라면 브라우저 조작 절차가 있어야 YES.
294
+ [ ] E8. 외부 인터페이스 가정 검증 — plan.md에서 여러 외부 서비스/엔드포인트를 동일한 인터페이스로 처리하는 태스크가 있는가? 있다면:
295
+ - `## 외부 인터페이스 가정` 섹션에 각 대상별 검증 상태가 명시되어 있는가?
296
+ - "미검증" 대상에 대해 스파이크 태스크가 구현 태스크 앞에 배치되어 있는가?
297
+ - 외부 API가 관련되지 않은 경우 이 항목을 YES로 처리한다.
266
298
 
267
299
  ## 판정 규칙
268
- - 6개 항목 모두 YES → PASS
300
+ - 8개 항목 모두 YES → PASS
269
301
  - 하나라도 NO → FAIL
270
302
  - "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
271
303
 
@@ -279,7 +311,7 @@ Agent(subagent_type="explorer", description="코드 참조 확인: {파일 목
279
311
 
280
312
  ## 출력
281
313
  아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
282
- 형식: 판정(PASS/FAIL), 항목별 결과(E1-E6 YES/NO + 근거), FAIL 상세(NO 항목의 문제+수정 방향), 근본 원인 분류(FAIL 시).
314
+ 형식: 판정(PASS/FAIL), 항목별 결과(E1-E8 YES/NO + 근거), FAIL 상세(NO 항목의 문제+수정 방향), 근본 원인 분류(FAIL 시).
283
315
  ```
284
316
 
285
317
  **Step 4 결과 저장 (오케스트레이터 직접)**:
@@ -339,6 +371,13 @@ review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
339
371
  - 행위: {실행할 것}
340
372
  - 기대 결과: {검증할 것}
341
373
 
374
+ ## 실행 검증
375
+ {plan.md의 실행 검증 섹션을 그대로 복사}
376
+
377
+ ### {검증 1 제목}
378
+ - 실행 방법: {구체적 명령어 또는 절차}
379
+ - 기대 결과: {확인할 출력 또는 동작}
380
+
342
381
  ## 참조 문서
343
382
  - 요구사항: .crew/plans/{task-id}/spec.md
344
383
  - 사전 분석: .crew/plans/{task-id}/analysis.md
@@ -347,6 +386,9 @@ review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
347
386
  ## 검증 이력
348
387
  PlanEvaluator PASS — review.md 참조
349
388
 
389
+ ## 워크트리
390
+ mode: new
391
+
350
392
  ## 상태
351
393
  ACTIVE
352
394
  ```