@jjlabsio/claude-crew 0.1.25 → 0.1.27

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.25",
14
+ "version": "0.1.27",
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.25"
31
+ "version": "0.1.27"
32
32
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-crew",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlabsio/claude-crew",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": "Jaejin Song <wowlxx28@gmail.com>",
6
6
  "license": "MIT",
@@ -80,12 +80,16 @@ 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 시 리셋)
91
+ .dev_crash_count # US별 구현 crash 카운터 (US PASS 시 리셋)
92
+ .dev_crash_provider # crash 발생 시 현재 사용 중인 provider ("codex" 또는 "claude")
89
93
  ```
90
94
 
91
95
  ---
@@ -134,9 +138,20 @@ contract.md 유효성 검사에 실패했습니다.
134
138
  [3] 이 태스크를 보류
135
139
  ```
136
140
 
137
- **1c. 워크트리 생성**
141
+ **1c. 워크트리 결정**
138
142
 
139
- Claude Code의 `EnterWorktree` 도구를 사용한다:
143
+ 기존 워크트리를 이어쓸지, 새로 만들지 판단한다.
144
+
145
+ **판단 순서** (위가 우선):
146
+
147
+ 1. contract.md에 `## 워크트리` 섹션이 있으면 그 값을 따른다:
148
+ - `mode: continue` + `branch: {브랜치명}` → 경로 B (이어가기)
149
+ - `mode: new` 또는 섹션 없음 → 경로 A (신규)
150
+ 2. `## 워크트리` 섹션이 없으면, 현재 호출 위치를 확인한다:
151
+ - 현재 디렉토리가 `.claude/worktrees/` 하위이고 해당 워크트리의 task-id가 일치하면 → 경로 B
152
+ - 그 외 → 경로 A
153
+
154
+ **경로 A — 신규 워크트리**
140
155
 
141
156
  ```
142
157
  EnterWorktree(name="feat/{task-id}")
@@ -149,9 +164,23 @@ git fetch origin main
149
164
  git reset --hard origin/main
150
165
  ```
151
166
 
152
- 이후 모든 작업은 워크트리에서 수행한다.
153
167
  환경 파일(`.env*` 등)이 원본 프로젝트에 있으면 복사한다.
154
168
 
169
+ **경로 B — 기존 워크트리 이어가기**
170
+
171
+ - `EnterWorktree` 호출하지 않는다 (이미 진입 상태이거나, contract.md 지정 브랜치의 워크트리가 존재).
172
+ - `git reset --hard` 하지 않는다 — 기존 커밋을 보존한다.
173
+ - 현재 상태만 확인한다:
174
+
175
+ ```bash
176
+ git log --oneline -5
177
+ git diff --stat
178
+ ```
179
+
180
+ - "기존 워크트리에서 작업을 이어갑니다" 로그를 출력한다.
181
+
182
+ 이후 모든 작업은 워크트리에서 수행한다.
183
+
155
184
  **1d. 상태 갱신**
156
185
 
157
186
  contract.md의 `## 상태` 섹션을 갱신한다:
@@ -163,41 +192,60 @@ IN_PROGRESS — Dev 에이전트가 구현 중이다.
163
192
 
164
193
  ---
165
194
 
166
- ### Phase 2 — 구현 (Dev 에이전트)
195
+ ### Phase 2 — US 단위 증분 개발 루프
167
196
 
168
- Phase 1a에서 해석된 dev 설정에 따라 디스패치한다.
197
+ plan.md의 유저 스토리(US)를 하나씩 순차적으로 구현하고, 각 US마다 검증을 통과해야 다음 US로 진행한다.
169
198
 
170
- #### Phase 2 claude provider인 경우
199
+ #### 2a. US 목록 파싱 (오케스트레이터 직접)
171
200
 
172
- 호출:
201
+ plan.md에서 `### US-{N}: {제목}` 패턴을 파싱하여 순서 목록을 만든다.
173
202
 
174
203
  ```
175
- Agent(subagent_type="dev", model="{설정된 모델}", description="Dev: {task-id} 구현", prompt="...")
204
+ US 목록: [US-1, US-2, ..., US-N]
205
+ 현재 US 인덱스: k = 1
206
+ ```
207
+
208
+ #### 2b. US-k 구현 → 검증 → 커밋 루프
209
+
210
+ 각 US-k에 대해 아래 순서를 반복한다.
211
+
212
+ ##### Step 1 — Dev 에이전트 호출 (US-k만 구현)
213
+
214
+ Phase 1a에서 해석된 dev 설정에 따라 디스패치한다.
215
+
216
+ **claude provider 호출:**
217
+
218
+ ```
219
+ Agent(subagent_type="dev", model="{설정된 모델}", description="Dev: {task-id} US-{k}", prompt="...")
176
220
  ```
177
221
 
178
222
  **첫 번째 실행 시 에이전트 프롬프트**:
179
223
 
180
224
  ```
181
- 당신은 Dev 에이전트다. plan.md 기반으로 코드를 구현한다.
225
+ 당신은 Dev 에이전트다. plan.md 유저 스토리 US-{k}만 구현한다.
182
226
 
183
227
  ## 입력
184
228
  .crew/plans/{task-id}/plan.md 를 읽어라.
185
229
  .crew/plans/{task-id}/contract.md 를 읽어라 (수용 기준 = 완료 기준).
186
230
  brief.md, spec.md, analysis.md는 읽지 않는다.
187
231
 
232
+ ## 작업 범위
233
+ plan.md의 유저 스토리 중 **US-{k}: {제목}** 의 구현 태스크만 수행한다.
234
+ 다른 US의 태스크는 절대 수행하지 않는다.
235
+
188
236
  ## 작업 순서
189
- 1. plan.md의 유저 스토리와 태스크 목록을 확인한다.
237
+ 1. plan.md에서 US-{k}구현 태스크와 테스트 시나리오를 확인한다.
190
238
  2. plan.md의 `## 테스트 전략` 섹션을 확인한다.
191
239
  3. 코드베이스를 탐색한다 (Glob, Grep, Read로 관련 파일 파악).
192
- 4. 유저 스토리 단위로 순차 구현한다.
240
+ 4. US-{k}의 태스크를 구현한다.
193
241
  - **TDD인 경우**: 각 태스크에서 반드시 RED→GREEN→REFACTOR 순서를 따른다.
194
242
  1. RED: 실패하는 테스트를 먼저 작성하고 실행하여 FAIL을 확인한다.
195
243
  2. GREEN: 테스트를 통과하는 최소한의 코드를 작성한다.
196
244
  3. REFACTOR: 코드 품질을 개선한다 (필요시).
197
245
  - **Tests-after인 경우**: 구현을 먼저 완료한 후, plan.md에 명시된 테스트 태스크를 수행한다.
198
- - **None인 경우**: 현재와 동일하게 구현한다.
199
- 5. 각 유저 스토리 완료 후 dev-log.md에 진행상황을 기록한다.
200
- 6. 모든 구현 완료 후 자체 검증을 실행한다:
246
+ - **None인 경우**: 구현만 수행한다.
247
+ 5. dev-log.md에 US-{k} 진행상황을 기록한다 (기존 내용 뒤에 추가).
248
+ 6. 자체 검증을 실행한다:
201
249
  - 빌드 성공 확인
202
250
  - 린트 통과 확인
203
251
  - 타입 체크 통과 확인
@@ -207,10 +255,10 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
207
255
  자체 검증이 실패하면 직접 수정하여 통과시킨다.
208
256
 
209
257
  ## 출력
210
- .crew/plans/{task-id}/dev-log.md 작성하라.
258
+ .crew/plans/{task-id}/dev-log.md US-{k} 섹션을 추가하라.
211
259
 
212
260
  ## 규칙
213
- - plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
261
+ - US-{k}의 태스크만 구현한다 (다른 US 금지).
214
262
  - 자체 검증 5개(빌드/린트/타입/테스트/lint-staged) 모두 PASS 해야 완료를 선언할 수 있다.
215
263
  - 기존 코드베이스의 컨벤션을 따른다.
216
264
  - TDD 전략인 경우, 테스트를 먼저 작성하지 않고 프로덕션 코드를 작성하지 않는다.
@@ -219,7 +267,7 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
219
267
  **retry 시 에이전트 프롬프트**:
220
268
 
221
269
  ```
222
- 이번은 이전 구현이 검증에서 FAIL을 받은 후 수정하는 것이다.
270
+ 이전 US-{k} 구현이 검증에서 FAIL을 받았다. 수정한다.
223
271
 
224
272
  ## 입력
225
273
  .crew/plans/{task-id}/plan.md 를 읽어라.
@@ -228,115 +276,138 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
228
276
  .crew/plans/{task-id}/qa-report-{n}.md 를 읽어라. (QA 피드백)
229
277
  brief.md, spec.md, analysis.md는 읽지 않는다.
230
278
 
231
- ## 필수 선행 작업
232
- 피드백 파일을 먼저 읽어라. 어떤 항목이 FAIL인지 확인하고 해당 부분을 수정하라.
279
+ ## 작업 범위
280
+ US-{k}에 해당하는 피드백만 수정한다. 다른 US의 코드를 변경하지 않는다.
233
281
 
234
282
  ## 작업 순서
235
283
  1. 피드백에서 FAIL 항목을 모두 파악한다.
236
284
  2. 각 FAIL 항목에 대해 수정을 수행한다.
237
- 3. dev-log.md를 갱신한다 (최상단에 "수정 이력 (retry {n})" 섹션 추가).
238
- 4. 자체 검증 5개를 모두 다시 실행한다.
285
+ 3. dev-log.md를 갱신한다 (US-{k} 섹션 최상단에 "수정 이력 (retry {n})" 추가).
286
+ 4. 자체 검증 5개를 모두 다시 실행한다 (빌드/린트/타입/테스트/lint-staged).
239
287
 
240
288
  ## 규칙
241
289
  - 피드백에서 지적하지 않은 부분을 추가로 변경하지 않는다.
242
290
  - 자체 검증 5개 모두 PASS 해야 완료를 선언할 수 있다.
243
291
  ```
244
292
 
245
- #### Phase 2 — codex provider인 경우
293
+ **codex provider인 경우:**
246
294
 
247
- 오케스트레이터가 다음을 수행한다:
248
-
249
- 1. plan.md와 contract.md의 내용을 읽어 프롬프트에 인라인으로 주입한다.
250
- 2. Codex를 실행한다:
295
+ 오케스트레이터가 plan.md에서 US-{k} 섹션과 contract.md의 수용 기준을 추출하여 프롬프트에 인라인으로 주입한다.
251
296
 
252
297
  ```bash
253
298
  codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "$(cat <<'PROMPT'
254
- 당신은 Dev 에이전트다. 아래 plan.md를 기반으로 코드를 구현한다.
299
+ 당신은 Dev 에이전트다. 아래 유저 스토리 US-{k}만 구현한다.
300
+
301
+ ## US-{k} (plan.md에서 추출)
302
+ {오케스트레이터가 US-{k} 섹션만 인라인 삽입}
255
303
 
256
- ## plan.md
257
- {오케스트레이터가 plan.md 내용을 여기에 인라인 삽입}
304
+ ## 테스트 전략
305
+ {오케스트레이터가 테스트 전략 섹션 인라인 삽입}
258
306
 
259
307
  ## contract.md (수용 기준)
260
- {오케스트레이터가 contract.md의 수용 기준 섹션을 여기에 인라인 삽입}
308
+ {오케스트레이터가 수용 기준 섹션 인라인 삽입}
261
309
 
262
310
  ## 작업 순서
263
311
  1. 코드베이스를 탐색하여 관련 파일을 파악한다.
264
- 2. 유저 스토리 단위로 순차 구현한다.
265
- 3. 모든 구현 완료 후 자체 검증을 실행한다:
266
- - 빌드 성공 확인
267
- - 린트 통과 확인
268
- - 타입 체크 통과 확인
269
- - 기존 테스트 스위트 통과 확인
312
+ 2. US-{k}의 태스크만 구현한다.
313
+ 3. 자체 검증을 실행한다 (빌드/린트/타입/테스트).
270
314
  4. 자체 검증이 실패하면 직접 수정하여 통과시킨다.
271
315
 
272
316
  ## 규칙
273
- - plan.md에 없는 것을 구현하지 않는다.
317
+ - US-{k}의 태스크만 구현한다 (다른 US 금지).
274
318
  - 자체 검증 모두 PASS 해야 완료를 선언할 수 있다.
275
319
  - 기존 코드베이스의 컨벤션을 따른다.
276
320
 
277
321
  ## 완료 시 출력
278
- 구현 요약을 마지막에 출력하라:
322
+ 구현 요약을 출력하라:
279
323
  - 변경한 파일 목록
280
- - 유저 스토리별 구현 내용 1줄 요약
324
+ - US-{k} 구현 내용 1줄 요약
281
325
  - 자체 검증 결과 (각 항목별 PASS/FAIL + 명령어 + 출력)
282
326
  PROMPT
283
327
  )"
284
328
  ```
285
329
 
286
- 3. Codex stdout을 캡처하여 `.crew/plans/{task-id}/dev-log.md`를 생성한다.
330
+ Codex stdout을 캡처하여 dev-log.md US-{k} 섹션으로 추가한다.
287
331
 
288
- **retry 시 (codex provider)**:
332
+ **retry 시 (codex provider)**: 프롬프트에 review-report-{n}.md와 qa-report-{n}.md 내용을 인라인 삽입한다.
289
333
 
290
- 동일한 패턴으로, 프롬프트에 review-report-{n}.md와 qa-report-{n}.md 내용을 인라인 삽입한다.
334
+ ##### Step 1a Dev 에이전트 crash 감지 및 복구
291
335
 
292
- **Phase 2 실패 조건**: Dev 에이전트가 자체 검증을 통과하지 못한 완료를 선언하면 에스컬레이션.
336
+ Dev 에이전트(claude 또는 codex)가 정상 완료하지 못한 경우를 처리한다.
293
337
 
294
- ---
338
+ **crash 판정 기준:**
295
339
 
296
- ### Phase 3 병렬 검증 (CodeReviewer + QA)
340
+ | Provider | crash 신호 |
341
+ |----------|-----------|
342
+ | codex | Bash exit code != 0, timeout |
343
+ | claude | Agent 결과에 자체 검증 결과(PASS/FAIL) 미선언, 비정상 종료 |
297
344
 
298
- CodeReviewer와 QA를 **동시에** Agent tool 2개로 호출한다.
345
+ **crash가 아닌 경우** (정상 완료): Step 2 진행한다.
299
346
 
300
- #### Phase 3a — CodeReviewer
347
+ **crash인 경우**:
301
348
 
302
- Phase 1a에서 해석된 code-reviewer 설정에 따라 디스패치한다.
349
+ **1a-1. 부분 변경 롤백**
303
350
 
304
- **claude provider 호출:**
351
+ ```bash
352
+ git reset --hard HEAD
353
+ ```
354
+
355
+ 마지막 체크포인트 커밋(이전 US의 커밋 또는 워크트리 초기 상태)으로 복귀한다. 부분 구현을 이어받지 않는다 — 컨텍스트 손실로 인한 코드 불일치 리스크를 제거하기 위함이다.
356
+
357
+ **1a-2. crash 카운터 읽기**
358
+
359
+ `.crew/plans/{task-id}/.dev_crash_count` 파일을 읽는다.
360
+ - 파일이 없으면 카운터 = 0
361
+ - 파일이 있으면 파일 내용(정수)이 카운터 값
362
+
363
+ `.crew/plans/{task-id}/.dev_crash_provider` 파일을 읽는다.
364
+ - 파일이 없으면 현재 provider 설정값
365
+
366
+ **1a-3. 재시도 또는 provider 전환 판단**
305
367
 
306
368
  ```
307
- Agent(subagent_type="code-reviewer", model="{설정된 모델}", description="CodeReviewer: {task-id} 코드 리뷰", prompt="...")
369
+ crash 카운터 < 2 같은 provider로 재시도 (Step 1로)
370
+ crash 카운터 >= 2 AND 현재 provider가 codex → claude로 전환, 카운터 리셋 (Step 1로)
371
+ crash 카운터 >= 2 AND 현재 provider가 claude → 유저 에스컬레이션
308
372
  ```
309
373
 
310
- **codex provider 호출:**
374
+ **provider 전환 시:**
375
+ - `.dev_crash_count`를 0으로 리셋한다.
376
+ - `.dev_crash_provider`를 전환된 provider로 갱신한다.
377
+ - 이후 Step 1에서 전환된 provider로 디스패치한다.
311
378
 
312
- 오케스트레이터가 `git diff main...HEAD`를 실행하여 diff를 캡처한 뒤, diff와 가드레일을 프롬프트에 인라인 삽입하여 Codex를 실행한다.
379
+ **에스컬레이션 메시지:**
313
380
 
314
- ```bash
315
- codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "$(cat <<'PROMPT'
316
- 당신은 CodeReviewer다. 아래 코드 변경 사항의 품질을 판단하라.
381
+ ```
382
+ US-{k} 구현이 반복 실패합니다.
383
+ - 원래 provider: {원래 provider} (2회 crash)
384
+ - 전환 provider: {전환 provider} (2회 crash)
385
+ [1] plan.md에서 US-{k}를 더 작게 분할
386
+ [2] 수동으로 구현
387
+ [3] 이 태스크를 보류
388
+ ```
317
389
 
318
- ## 변경 사항 (git diff)
319
- {오케스트레이터가 git diff 결과를 인라인 삽입}
390
+ 에스컬레이션 시:
391
+ - `.dev_crash_count`, `.dev_crash_provider` 파일을 삭제한다.
392
+ - contract.md 상태를 `BLOCKED — US-{k} 구현 crash`로 갱신한다.
393
+ - `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
320
394
 
321
- ## 가드레일
322
- ### Must
323
- {contract.md에서 추출한 Must 항목}
324
- ### Must NOT
325
- {contract.md에서 추출한 Must NOT 항목}
395
+ **1a-4. crash 카운터 증가 저장**
326
396
 
327
- ## 검토 항목 / 판정 규칙 / 출력 형식
328
- (claude provider 프롬프트와 동일)
329
- PROMPT
330
- )"
331
- ```
397
+ `카운터 + 1`을 `.dev_crash_count` 파일에 저장한다.
398
+ 현재 provider `.dev_crash_provider` 파일에 저장한다.
399
+
400
+ Step 1로 돌아간다.
332
401
 
333
- Codex stdout을 캡처하여 review-report.md 내용으로 사용한다.
402
+ ##### Step 2 — US-k 검증 (CodeReviewer + QA 병렬)
334
403
 
335
- **공통 사전 작업 (provider 무관):**
404
+ CodeReviewer와 QA를 **동시에** 호출한다. US-k의 변경분만 검증한다.
336
405
 
337
- 오케스트레이터가 해야 할 사전 작업:
406
+ **CodeReviewer (US-k)**
407
+
408
+ 오케스트레이터 사전 작업:
338
409
  1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
339
- 2. 가드레일을 CodeReviewer 프롬프트에 인라인으로 주입한다.
410
+ 2. 가드레일을 프롬프트에 인라인 주입한다.
340
411
 
341
412
  에이전트 프롬프트:
342
413
 
@@ -344,7 +415,7 @@ Codex stdout을 캡처하여 review-report.md 내용으로 사용한다.
344
415
  당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
345
416
 
346
417
  ## 입력
347
- `git diff main...HEAD`를 직접 실행하여 변경 사항을 확인하라.
418
+ `git diff HEAD`를 직접 실행하여 마지막 커밋 이후 변경 사항을 확인하라.
348
419
  contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
349
420
  코드만 보고 판단한다.
350
421
 
@@ -373,44 +444,28 @@ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
373
444
  - minor만 있거나 지적 없음 → PASS
374
445
  ```
375
446
 
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
- ```
447
+ **QA (US-k)**
393
448
 
394
449
  에이전트 프롬프트:
395
450
 
396
451
  ```
397
- 당신은 QA 에이전트다. 구현이 실제로 동작하는지 검증한다.
452
+ 당신은 QA 에이전트다. US-{k}의 구현이 실제로 동작하는지 검증한다.
398
453
 
399
454
  ## 입력
400
455
  .crew/plans/{task-id}/plan.md 를 읽어라.
401
- plan.md의 유저 스토리와 테스트 시나리오를 확인하라.
456
+ plan.md의 US-{k} 테스트 시나리오를 확인하라.
402
457
  contract.md, brief.md, spec.md는 읽지 않는다.
403
458
 
404
459
  ## 검증 항목 (순서대로 실행)
405
460
  1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
406
461
  2. 린트 검증
407
462
  3. 타입 체크 검증
408
- 4. 테스트 스위트 검증
463
+ 4. 테스트 스위트 검증 (전체 테스트 실행 — 기존 테스트 회귀 방지)
409
464
  5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
410
- - plan.md에 명시된 테스트 파일이 실제로 존재하는가?
465
+ - plan.md의 US-{k}에 명시된 테스트 파일이 실제로 존재하는가?
411
466
  - 해당 테스트가 실행되고 통과하는가?
412
467
  - None인 경우 이 항목을 PASS로 처리한다.
413
- 6. E2E / 통합 검증 — plan.md의 테스트 시나리오 기반
468
+ 6. US-{k} 시나리오 검증 — plan.md의 US-{k} 테스트 시나리오 기반
414
469
 
415
470
  ## 출력
416
471
  아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
@@ -425,149 +480,270 @@ contract.md, brief.md, spec.md는 읽지 않는다.
425
480
  - 코드를 수정하지 않는다. 검증만 한다.
426
481
  ```
427
482
 
428
- **Phase 3 결과 저장 (오케스트레이터 직접)**:
483
+ **병렬 실행 방법**: Phase 3 동일 (provider 조합에 따라 Agent/Bash 병렬 호출).
429
484
 
430
- CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
431
- 오케스트레이터가 각 에이전트의 반환 텍스트를 파일로 저장한다:
485
+ **결과 저장 (오케스트레이터 직접)**:
432
486
  - CodeReviewer 결과 → `.crew/plans/{task-id}/review-report.md`
433
487
  - QA 결과 → `.crew/plans/{task-id}/qa-report.md`
434
488
 
435
- **Phase 3 병렬 실행 방법**:
489
+ ##### Step 3 US-k 판정
436
490
 
437
- 오케스트레이터는 CodeReviewer와 QA를 **동시에** 호출한다. provider 조합에 따라:
491
+ 오케스트레이터가 직접 판정한다:
492
+ - CodeReviewer PASS + QA PASS → **US-k PASS** → Step 4로
493
+ - 하나라도 FAIL → **US-k FAIL** → Step 5로
438
494
 
439
- - claude Agent tool 2개를 한 번에 호출
440
- - 둘 다 codex → Bash tool 2개를 한 번에 호출
441
- - 혼합 → Agent + Bash를 한 번에 호출
495
+ ##### Step 4 US-k 체크포인트 커밋
442
496
 
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 프롬프트}'")
497
+ US-k가 PASS하면 즉시 커밋하여 체크포인트를 만든다:
498
+
499
+ ```bash
500
+ git add -A
501
+ git commit --no-verify -m "feat({task-id}): US-{k} {US 제목}"
447
502
  ```
448
503
 
449
- ---
504
+ > `--no-verify`: 검증 단계에서 이미 빌드/린트/타입/테스트를 통과했으므로 pre-commit hook을 중복 실행하지 않는다.
450
505
 
451
- ### Phase 4 오케스트레이터 직접 판정
506
+ `.dev_loop_count` 파일이 존재하면 삭제한다 (US-k 루프 카운터 리셋).
507
+ `.dev_crash_count`, `.dev_crash_provider` 파일이 존재하면 삭제한다 (crash 카운터 리셋).
452
508
 
453
- **Critic(DevAuditor)을 사용하지 않는다.** 오케스트레이터가 CodeReviewer + QA 결과로 직접 판정한다.
509
+ **다음 US 진행**: k를 증가시키고 Step 1로 돌아간다.
510
+ **모든 US 완료**: Phase 3으로 진행한다.
454
511
 
455
- 판정 규칙:
456
- - CodeReviewer PASS + QA PASS → **PASS** → Phase 5로
457
- - 하나라도 FAIL → **FAIL** → Step 6으로
512
+ ##### Step 5 — US-k FAIL 처리
458
513
 
459
- ---
514
+ **5a. 루프 카운터 읽기**
460
515
 
461
- ### Phase 5 — 완료 (오케스트레이터 직접)
516
+ `.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
517
+ - 파일이 없으면 카운터 = 0
518
+ - 파일이 있으면 파일 내용(정수)이 카운터 값
462
519
 
463
- **5a. 커밋 + PR**
520
+ **5b. 에스컬레이션 판단**
521
+
522
+ 두 가지 에스컬레이션 조건:
523
+
524
+ **조건 1 — 루프 상한 초과**:
525
+
526
+ 카운터 값 >= 4이면 즉시 에스컬레이션:
464
527
 
465
- ```bash
466
- git add -A
467
- git commit --no-verify -m "feat({task-id}): {contract.md 목표 1줄 요약}"
468
- git push -u origin feat/{task-id}
528
+ ```
529
+ US-{k}이 5회 반복 후에도 검증을 통과하지 못했습니다.
530
+ 최종 FAIL 사유를 첨부합니다.
531
+ [1] US-{k}의 범위를 좁혀서 재시도
532
+ [2] plan.md를 수정
533
+ [3] 이 태스크를 보류
469
534
  ```
470
535
 
471
- > `--no-verify`: crew-dev가 이미 빌드/린트/타입/테스트 + lint-staged 검증을 완료했으므로 호스트 프로젝트의 pre-commit hook을 중복 실행하지 않는다.
536
+ 에스컬레이션 시:
537
+ - `.dev_loop_count` 파일을 삭제한다.
538
+ - contract.md 상태를 `BLOCKED — US-{k}에서 중단`으로 갱신한다.
539
+ - `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
472
540
 
473
- PR을 생성한다 (머지하지 않는다).
541
+ **조건 2 같은 기준 3회 연속 실패**:
474
542
 
475
- **5b. 상태 갱신**
543
+ review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
544
+ 이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
476
545
 
477
- contract.md의 `## 수용 기준` 섹션에서 모든 `- [ ]`를 `- [x]`로 변경한다.
546
+ ```
547
+ US-{k}의 {항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
548
+ [1] plan.md를 수정 (구현 전략의 문제)
549
+ [2] contract.md를 수정 (기준 자체의 문제)
550
+ [3] 이 태스크를 보류
551
+ ```
478
552
 
479
- contract.md의 `## 상태` 섹션을 갱신한다:
553
+ 에스컬레이션 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
554
+
555
+ **5c. 피드백 아카이브**
556
+
557
+ `n = 카운터 + 1`
480
558
 
481
- ```markdown
482
- ## 상태
483
- COMPLETED 모든 수용 기준이 검증을 통과했다.
484
- PR: {PR URL}
559
+ ```
560
+ review-report.md → review-report-{n}.md
561
+ qa-report.md qa-report-{n}.md
485
562
  ```
486
563
 
487
- **5c. .dev_loop_count 정리**
564
+ **5d. 루프 카운터 증가 저장**
488
565
 
489
- `.dev_loop_count` 파일이 존재하면 삭제한다.
566
+ `카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
567
+
568
+ **5e. Step 1로 돌아감 (US-k retry)**
490
569
 
491
- **5d. 워크트리 종료**
570
+ Step 1(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
571
+ Dev 수정 완료 후 Step 2(CodeReviewer + QA)를 재실행한다.
572
+
573
+ ---
574
+
575
+ ### Phase 3 — 최종 전체 검증 (CodeReviewer + QA)
576
+
577
+ 모든 US가 개별 검증을 통과한 후, 전체 변경 사항에 대해 통합 검증을 수행한다.
578
+ US 간 상호작용에서 발생할 수 있는 문제를 잡기 위한 단계다.
579
+
580
+ CodeReviewer와 QA를 **동시에** 호출한다.
581
+
582
+ #### Phase 3a — CodeReviewer (전체)
583
+
584
+ 오케스트레이터 사전 작업:
585
+ 1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
586
+ 2. 가드레일을 프롬프트에 인라인 주입한다.
587
+
588
+ 에이전트 프롬프트:
492
589
 
493
590
  ```
494
- ExitWorktree(action="remove")
591
+ 당신은 CodeReviewer 에이전트다. 전체 코드 변경 사항의 품질을 판단한다.
592
+
593
+ ## 입력
594
+ `git diff main...HEAD`를 직접 실행하여 전체 변경 사항을 확인하라.
595
+ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
596
+ 코드만 보고 판단한다.
597
+
598
+ ### 가드레일 (contract.md에서 추출)
599
+ #### Must
600
+ - {오케스트레이터가 contract.md에서 복사한 내용}
601
+ #### Must NOT
602
+ - {오케스트레이터가 contract.md에서 복사한 내용}
603
+
604
+ 위 가드레일을 위반하는 변경이 있으면 critical로 지적하라.
605
+
606
+ ## 검토 항목
607
+ 1. 가드레일 위반 (위반 시 critical)
608
+ 2. 코드베이스 컨벤션 준수 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
609
+ 3. 보안 취약점
610
+ 4. 불필요한 복잡도
611
+ 5. 잠재적 버그
612
+ 6. 에러 처리 적절성
613
+ 7. **모듈 간 정합성** — 변경된 파일들 사이의 인터페이스, 타입, import가 일관적인가
614
+
615
+ ## 출력
616
+ 아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
617
+
618
+ ## 판정 규칙
619
+ - 가드레일 위반 → critical
620
+ - critical 또는 major가 1개 이상 → FAIL
621
+ - minor만 있거나 지적 없음 → PASS
495
622
  ```
496
623
 
497
- PR push가 완료되었으므로 로컬 워크트리를 제거하고 원본 프로젝트 디렉토리로 복귀한다.
624
+ #### Phase 3b QA (전체)
498
625
 
499
- **5e. 완료 반환**
626
+ 에이전트 프롬프트:
500
627
 
501
628
  ```
502
- 상태: COMPLETE
503
- task-id: {task-id}
504
- PR: {PR URL}
629
+ 당신은 QA 에이전트다. 전체 구현이 실제로 동작하는지 최종 검증한다.
630
+
631
+ ## 입력
632
+ .crew/plans/{task-id}/plan.md 를 읽어라.
633
+ plan.md의 모든 유저 스토리, 테스트 시나리오, 검증 시나리오를 확인하라.
634
+ contract.md, brief.md, spec.md는 읽지 않는다.
635
+
636
+ ## 검증 항목 (순서대로 실행)
637
+ 1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
638
+ 2. 린트 검증
639
+ 3. 타입 체크 검증
640
+ 4. 테스트 스위트 검증 (전체 테스트)
641
+ 5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
642
+ - plan.md에 명시된 모든 테스트 파일이 실제로 존재하는가?
643
+ - 해당 테스트가 실행되고 통과하는가?
644
+ - None인 경우 이 항목을 PASS로 처리한다.
645
+ 6. 전체 E2E / 통합 검증 — plan.md의 모든 테스트 시나리오 기반
646
+ 7. 실행 검증 — plan.md의 `## 실행 검증` 절차를 직접 실행한다.
647
+ - 자동화 테스트와 별개로, 구현된 기능을 사용자 관점에서 직접 실행한다.
648
+ - 백엔드: 실제 API 호출, 스크립트 실행 등
649
+ - UI: 개발 서버에서 브라우저 조작
650
+ - 각 항목의 기대 결과와 실제 결과를 비교하여 판정한다.
651
+ - 실행 검증 섹션이 plan.md에 없으면 즉시 FAIL.
652
+
653
+ ## 출력
654
+ 아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
655
+
656
+ ## 판정 규칙
657
+ - 항목 1-7 중 하나라도 FAIL → 전체 FAIL
658
+ - 모든 항목 PASS → 전체 PASS
659
+
660
+ ## 규칙
661
+ - 모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
662
+ - 실행 출력을 반드시 캡처하여 기록한다.
663
+ - 코드를 수정하지 않는다. 검증만 한다.
505
664
  ```
506
665
 
507
- ---
666
+ **Phase 3 결과 저장 (오케스트레이터 직접)**:
508
667
 
509
- ### Step 6 FAIL 처리 (검증 루프)
668
+ CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
669
+ 오케스트레이터가 각 에이전트의 반환 텍스트를 파일로 저장한다:
670
+ - CodeReviewer 결과 → `.crew/plans/{task-id}/final-review-report.md`
671
+ - QA 결과 → `.crew/plans/{task-id}/final-qa-report.md`
510
672
 
511
- Phase 4에서 FAIL이면:
673
+ **Phase 3 병렬 실행 방법**:
512
674
 
513
- **6a. 루프 카운터 읽기**
675
+ 오케스트레이터는 CodeReviewer와 QA를 **동시에** 호출한다. provider 조합에 따라:
514
676
 
515
- `.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
516
- - 파일이 없으면 카운터 = 0
517
- - 파일이 있으면 파일 내용(정수)이 카운터
677
+ - 다 claude → Agent tool 2개를 한 번에 호출
678
+ - codex Bash tool 2개를 한 번에 호출
679
+ - 혼합 Agent + Bash를 한 번에 호출
518
680
 
519
- **6b. 에스컬레이션 판단**
681
+ ---
520
682
 
521
- 가지 에스컬레이션 조건:
683
+ ### Phase 4 — 최종 판정 + 완료
522
684
 
523
- **조건 1 루프 상한 초과**:
685
+ **4a. 오케스트레이터 직접 판정**
524
686
 
525
- 카운터 값 >= 4이면 즉시 에스컬레이션:
687
+ 판정 규칙:
688
+ - CodeReviewer PASS + QA PASS → **PASS** → 4b로
689
+ - 하나라도 FAIL → **FAIL** → 에스컬레이션
690
+
691
+ 최종 전체 검증 FAIL 시 자동 retry하지 않는다. US 간 상호작용 문제는 어떤 US를 수정해야 하는지 자동 판단이 어렵기 때문이다.
526
692
 
527
693
  ```
528
- 검증 루프가 5회 반복 후에도 통과하지 못했습니다.
529
- 최종 FAIL 사유를 첨부합니다.
530
- [1] 수용 기준을 좁혀서 재시도
531
- [2] contract.md를 수정
694
+ 최종 전체 검증에서 FAIL이 발생했습니다.
695
+ 개별 US는 모두 통과했으나 통합 단계에서 문제가 발견되었습니다.
696
+ final-review-report.md, final-qa-report.md를 확인하세요.
697
+ [1] 문제 원인을 특정하여 해당 US수동 수정 후 재실행
698
+ [2] plan.md를 수정하여 US 간 의존성을 재설계
532
699
  [3] 이 태스크를 보류
533
700
  ```
534
701
 
535
702
  에스컬레이션 시:
536
- - `.dev_loop_count` 파일을 삭제한다.
537
- - contract.md 상태를 `BLOCKED`으로 갱신한다.
703
+ - contract.md 상태를 `BLOCKED 최종 전체 검증 FAIL`로 갱신한다.
538
704
  - `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
539
705
 
540
- **조건 2 — 같은 기준 3회 연속 실패**:
541
-
542
- review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
543
- 이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
706
+ **4b. PR 생성**
544
707
 
708
+ ```bash
709
+ git push -u origin feat/{task-id}
545
710
  ```
546
- {항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
547
- [1] contract.md를 수정 (기준 자체의 문제)
548
- [2] plan.md를 수정 (구현 전략의 문제)
549
- [3] 태스크를 보류
711
+
712
+ > US 단위 커밋은 Phase 2에서 이미 완료되었으므로 추가 커밋은 불필요하다.
713
+
714
+ PR을 생성한다 (머지하지 않는다).
715
+
716
+ **4c. 상태 갱신**
717
+
718
+ contract.md의 `## 수용 기준` 섹션에서 모든 `- [ ]`를 `- [x]`로 변경한다.
719
+
720
+ contract.md의 `## 상태` 섹션을 갱신한다:
721
+
722
+ ```markdown
723
+ ## 상태
724
+ COMPLETED — 모든 수용 기준이 검증을 통과했다.
725
+ PR: {PR URL}
550
726
  ```
551
727
 
552
- 에스컬레이션 시 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
728
+ **4d. 정리**
553
729
 
554
- **6c. 피드백 아카이브**
730
+ `.dev_loop_count` 파일이 존재하면 삭제한다.
555
731
 
556
- `n = 카운터 + 1`
732
+ **4e. 워크트리 종료**
557
733
 
558
734
  ```
559
- review-report.md → review-report-{n}.md
560
- qa-report.md → qa-report-{n}.md
735
+ ExitWorktree(action="remove")
561
736
  ```
562
737
 
563
- **6d. 루프 카운터 증가 저장**
564
-
565
- `카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
738
+ PR push가 완료되었으므로 로컬 워크트리를 제거하고 원본 프로젝트 디렉토리로 복귀한다.
566
739
 
567
- **6e. Phase 2로 돌아감 (retry)**
740
+ **4f. 완료 반환**
568
741
 
569
- Phase 2(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
570
- Dev 수정 완료 후 Phase 3(CodeReviewer + QA)을 **둘 다** 재실행한다.
742
+ ```
743
+ 상태: COMPLETE
744
+ task-id: {task-id}
745
+ PR: {PR URL}
746
+ ```
571
747
 
572
748
  ---
573
749
 
@@ -575,12 +751,12 @@ Dev 수정 완료 후 Phase 3(CodeReviewer + QA)을 **둘 다** 재실행한다.
575
751
 
576
752
  | 이벤트 | 동작 |
577
753
  |--------|------|
578
- | 첫 번째 진입 | 파일 없음 (카운터 = 0) |
579
- | n번째 FAIL 처리 후 | 파일 갱신, 내용: `n` |
580
- | PASS (Phase 5) | 파일 삭제 |
754
+ | US-k 첫 진입 | 파일 없음 (카운터 = 0) |
755
+ | US-k n번째 FAIL 후 | 파일 갱신, 내용: `n` |
756
+ | US-k PASS (Step 4) | 파일 삭제 |
581
757
  | 에스컬레이션 | 파일 삭제 |
582
758
 
583
- 검증 사이클은 최대 5회 (초기 1회 + retry 최대 4회).
759
+ US당 최대 5회 검증 사이클 (초기 1회 + retry 최대 4회).
584
760
 
585
761
  ---
586
762
 
@@ -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
  ```