@walwal-harness/cli 5.0.7 → 5.0.9
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.
- package/commands/harness-team.md +159 -165
- package/package.json +1 -1
package/commands/harness-team.md
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
# /harness-team — Team Mode 시작/재개
|
|
2
2
|
|
|
3
|
-
Planner가 완료한 feature-list.json의 피처들을 3개 팀이 병렬로 Gen→Eval 사이클을 수행합니다.
|
|
3
|
+
Planner가 완료한 feature-list.json의 피처들을 최대 3개 팀이 병렬로 Gen→Eval 사이클을 수행합니다.
|
|
4
|
+
|
|
5
|
+
## 프로세스 설계 원칙
|
|
6
|
+
|
|
7
|
+
1. **Worker = 1 Feature Only**: 각 Worker는 단일 피처만 처리하고 반환. 자동 다음 피처 획득하지 않음.
|
|
8
|
+
2. **Lead = Orchestration Loop**: Lead가 Worker 완료 알림을 받고, merge → unblock 확인 → 새 Worker 생성을 반복.
|
|
9
|
+
3. **Background Agent**: Worker를 `run_in_background: true`로 생성하여 Lead가 개별 완료에 즉시 반응.
|
|
10
|
+
4. **Merge 후 재투입**: Worker PASS → Lead가 worktree merge → queue pass (unblock) → 새 Worker 생성.
|
|
4
11
|
|
|
5
12
|
## 실행 절차
|
|
6
13
|
|
|
7
14
|
### Step 0: 선행 조건 확인
|
|
8
15
|
|
|
9
16
|
```bash
|
|
10
|
-
# Planner 아티팩트 확인
|
|
11
17
|
[ -f .harness/actions/feature-list.json ] && [ -f .harness/actions/api-contract.json ] && echo "READY" || echo "NOT_READY"
|
|
12
18
|
```
|
|
13
19
|
|
|
14
|
-
- **NOT_READY** → "Planner가 먼저 완료되어야 합니다.
|
|
20
|
+
- **NOT_READY** → "Planner가 먼저 완료되어야 합니다." 안내 후 중단.
|
|
15
21
|
- **READY** → Step 1로 진행.
|
|
16
22
|
|
|
17
23
|
### Step 1: 모드 전환 + Queue 초기화
|
|
@@ -37,44 +43,110 @@ bash scripts/harness-queue-manager.sh status .
|
|
|
37
43
|
bash scripts/harness-tmux.sh --team
|
|
38
44
|
```
|
|
39
45
|
|
|
40
|
-
|
|
41
|
-
- **`Layout ready`** → tmux 레이아웃 구축 완료. Step 3로.
|
|
42
|
-
- **`OPENED_TERMINAL=true`** → 새 Terminal.app 창에 Studio 레이아웃이 자동 구축됨. Step 3로.
|
|
43
|
-
- **`already set up`** → 이미 구축됨. Step 3로.
|
|
44
|
-
|
|
45
|
-
### Step 3: Feature 할당 (dequeue)
|
|
46
|
+
### Step 3: 초기 Worker 생성
|
|
46
47
|
|
|
47
|
-
Queue
|
|
48
|
-
ready feature 수와 설정된 concurrency(기본 3) 중 작은 값만큼 팀을 생성합니다.
|
|
49
|
-
|
|
50
|
-
**각 팀마다** dequeue 명령으로 feature를 원자적으로 할당합니다:
|
|
48
|
+
Queue에서 ready 피처를 최대 3개 dequeue하고, **각각 background Agent로 생성**합니다.
|
|
51
49
|
|
|
52
50
|
```bash
|
|
53
|
-
|
|
51
|
+
# 각 팀마다 dequeue
|
|
52
|
+
bash scripts/harness-queue-manager.sh dequeue 1 .
|
|
53
|
+
bash scripts/harness-queue-manager.sh dequeue 2 .
|
|
54
|
+
bash scripts/harness-queue-manager.sh dequeue 3 .
|
|
54
55
|
```
|
|
55
56
|
|
|
56
|
-
dequeue
|
|
57
|
-
|
|
58
|
-
### Step 4: Agent 도구로 팀 생성 (Gen↔Eval 분리 사이클)
|
|
59
|
-
|
|
60
|
-
dequeue로 할당받은 feature마다 **Agent 도구**를 호출합니다.
|
|
61
|
-
**반드시 `isolation: "worktree"`를 사용**하여 각 팀이 독립된 코드 복사본에서 작업합니다.
|
|
62
|
-
|
|
63
|
-
**독립적인 팀들은 단일 메시지에서 병렬로 호출**하세요 (한 번의 응답에 여러 Agent 도구 호출).
|
|
57
|
+
dequeue 성공한 피처마다 **background Agent**를 생성합니다:
|
|
64
58
|
|
|
65
59
|
```
|
|
66
60
|
Agent({
|
|
67
61
|
description: "Team-{N}: {FEATURE_ID}",
|
|
68
62
|
isolation: "worktree",
|
|
63
|
+
run_in_background: true,
|
|
69
64
|
prompt: "<아래 Team Worker 프롬프트>"
|
|
70
65
|
})
|
|
71
66
|
```
|
|
72
67
|
|
|
73
|
-
|
|
68
|
+
**중요: `run_in_background: true`로 생성**하면 Lead가 블록되지 않고, 각 Worker 완료 시 알림을 받습니다.
|
|
69
|
+
|
|
70
|
+
초기 생성 후 **Step 4 (Orchestration Loop)**로 진입합니다.
|
|
71
|
+
|
|
72
|
+
### Step 4: Orchestration Loop (Lead 핵심 루프)
|
|
73
|
+
|
|
74
|
+
**이 루프가 Team Mode의 핵심입니다. 모든 Sprint가 완료될 때까지 반복합니다.**
|
|
74
75
|
|
|
75
76
|
```
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
ORCHESTRATION LOOP:
|
|
78
|
+
|
|
79
|
+
Background Agent 완료 알림을 받으면:
|
|
80
|
+
|
|
81
|
+
1. Worker 결과 분석:
|
|
82
|
+
- PASS인 경우 → Step 4a (Merge + Unblock)
|
|
83
|
+
- FAIL (재시도 가능)인 경우 → Step 4b (Retry)
|
|
84
|
+
- ESCALATED인 경우 → 사용자에게 알림, 해당 팀 유휴
|
|
85
|
+
|
|
86
|
+
2. Queue 상태 확인:
|
|
87
|
+
bash scripts/harness-queue-manager.sh status .
|
|
88
|
+
|
|
89
|
+
3. ready > 0 이면:
|
|
90
|
+
→ 새 Worker를 background Agent로 생성 (Step 3과 동일)
|
|
91
|
+
→ LOOP 계속
|
|
92
|
+
|
|
93
|
+
4. ready = 0 AND in_progress > 0 이면:
|
|
94
|
+
→ 다른 Worker 완료를 대기
|
|
95
|
+
→ LOOP 계속
|
|
96
|
+
|
|
97
|
+
5. ready = 0 AND in_progress = 0 이면:
|
|
98
|
+
→ Sprint 전환 시도:
|
|
99
|
+
bash scripts/harness-queue-manager.sh next-sprint .
|
|
100
|
+
- "Advancing" → Step 3으로 (새 Sprint 피처 dequeue + Worker 생성)
|
|
101
|
+
- "ALL SPRINTS COMPLETE" → 최종 보고. LOOP 종료.
|
|
102
|
+
- "Cannot advance" → 실패 피처 사용자 개입 요청. LOOP 종료.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### Step 4a: Merge + Unblock (PASS 처리)
|
|
106
|
+
|
|
107
|
+
Worker가 PASS로 반환되면:
|
|
108
|
+
|
|
109
|
+
1. **Worktree branch 확인**: Agent 반환 결과에서 worktree path와 branch 확인
|
|
110
|
+
2. **Main에 merge**:
|
|
111
|
+
```bash
|
|
112
|
+
git merge {BRANCH_NAME} --no-edit
|
|
113
|
+
```
|
|
114
|
+
- 충돌 시: 자동 해결 시도 → 실패 시 사용자 개입 요청
|
|
115
|
+
3. **Queue 업데이트** (unblock 포함):
|
|
116
|
+
```bash
|
|
117
|
+
bash scripts/harness-queue-manager.sh pass {FEATURE_ID} .
|
|
118
|
+
```
|
|
119
|
+
→ 의존 피처가 자동으로 blocked → ready로 전이
|
|
120
|
+
4. **진행 로그**:
|
|
121
|
+
```bash
|
|
122
|
+
echo "$(date +'%Y-%m-%d %H:%M') | lead | pass | {FEATURE_ID} merged + unblocked deps" >> .harness/progress.log
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Step 4b: Retry (FAIL 처리)
|
|
126
|
+
|
|
127
|
+
Worker가 FAIL (재시도 가능)로 반환되면:
|
|
128
|
+
|
|
129
|
+
1. 시도 횟수 확인 (최대 5회)
|
|
130
|
+
2. 5회 미만:
|
|
131
|
+
```bash
|
|
132
|
+
bash scripts/harness-queue-manager.sh requeue {FEATURE_ID} .
|
|
133
|
+
bash scripts/harness-queue-manager.sh dequeue {TEAM_NUMBER} .
|
|
134
|
+
```
|
|
135
|
+
→ 새 background Agent Worker 생성 (이전 Eval feedback 포함)
|
|
136
|
+
3. 5회 도달:
|
|
137
|
+
```bash
|
|
138
|
+
bash scripts/harness-queue-manager.sh fail {FEATURE_ID} .
|
|
139
|
+
echo "$(date +'%Y-%m-%d %H:%M') | lead | escalate | {FEATURE_ID} ESCALATED after 5 attempts" >> .harness/progress.log
|
|
140
|
+
```
|
|
141
|
+
→ 사용자 개입 요청
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Team Worker 프롬프트
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
당신은 Harness Team-{N} 워커입니다. **단일 Feature**에 대해 Gen→Eval 사이클을 수행합니다.
|
|
149
|
+
완료 후 결과를 반환합니다. 다음 Feature는 Lead가 할당합니다.
|
|
78
150
|
|
|
79
151
|
## 할당된 Feature
|
|
80
152
|
- Feature ID: {FEATURE_ID}
|
|
@@ -83,207 +155,129 @@ Agent({
|
|
|
83
155
|
|
|
84
156
|
## 실시간 로깅 (필수)
|
|
85
157
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- ACTION 토큰은 아래 표에서 선택 (Monitor가 아이콘/색을 매핑)
|
|
93
|
-
- DETAIL은 구체적으로 — 파일명, AC 번호, 에러 메시지 요약, 결정 사유
|
|
158
|
+
**로깅 설정:**
|
|
159
|
+
```bash
|
|
160
|
+
HARNESS_ROOT=$(git worktree list | head -1 | awk '{print $1}')
|
|
161
|
+
LOG="$HARNESS_ROOT/.harness/progress.log"
|
|
162
|
+
logev() { echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | $1 | $2" >> "$LOG"; }
|
|
163
|
+
```
|
|
94
164
|
|
|
95
165
|
| ACTION | 사용 시점 | DETAIL 예시 |
|
|
96
166
|
|--------|-----------|-------------|
|
|
97
167
|
| `gen-start` | Gen Phase 시작 | `F-001 start — 6 AC` |
|
|
98
168
|
| `gen-read` | 소스/계약 읽기 | `read api-contract.json (POST /users)` |
|
|
99
169
|
| `gen-write` | 파일 생성/수정 | `write apps/service-user/src/user.controller.ts` |
|
|
100
|
-
| `gen-test` | 자체 게이트
|
|
170
|
+
| `gen-test` | 자체 게이트 | `tsc OK · eslint 0 · jest 12/12` |
|
|
101
171
|
| `gen-done` | Gen Phase 종료 | `F-001 done — 5 files, 142 LOC` |
|
|
102
|
-
| `eval-start` | Evaluator
|
|
103
|
-
| `eval-check` | AC
|
|
104
|
-
| `eval-done` | Eval 결과
|
|
105
|
-
| `result`
|
|
106
|
-
| `fail` | FAIL 확정
|
|
107
|
-
| `escalate` | 5회 초과 실패 | `F-001 ESCALATED — user intervention required` |
|
|
108
|
-
|
|
109
|
-
**progress.log 기록** (하네스 루트의 progress.log에 append):
|
|
110
|
-
```bash
|
|
111
|
-
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | {ACTION} | {DETAIL}" >> {HARNESS_ROOT}/.harness/progress.log
|
|
112
|
-
```
|
|
172
|
+
| `eval-start` | Evaluator 시작 | `F-001 spawning evaluator` |
|
|
173
|
+
| `eval-check` | AC 검증 | `AC-3 — verify POST /users returns 201` |
|
|
174
|
+
| `eval-done` | Eval 결과 | `verdict=PASS score=2.95` |
|
|
175
|
+
| `result` | PASS 확정 | `F-001 PASS` |
|
|
176
|
+
| `fail` | FAIL 확정 | `FAIL #1 — AC-2 missing` |
|
|
113
177
|
|
|
114
|
-
**queue phase
|
|
178
|
+
**queue phase 업데이트:**
|
|
115
179
|
```bash
|
|
116
|
-
bash
|
|
180
|
+
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" update_phase {FEATURE_ID} {PHASE} "$HARNESS_ROOT"
|
|
117
181
|
```
|
|
118
182
|
|
|
119
|
-
> {HARNESS_ROOT}는 worktree의 원본 프로젝트 경로입니다. `git worktree list` 첫 줄에서 확인 가능합니다.
|
|
120
|
-
> 워커 시작 시 먼저 실행: `HARNESS_ROOT=$(git worktree list | head -1 | awk '{print $1}')`
|
|
121
|
-
|
|
122
183
|
## Phase 1: Generator (코드 생성)
|
|
123
184
|
|
|
124
|
-
**시작 시 로깅:**
|
|
125
185
|
```bash
|
|
126
|
-
HARNESS_ROOT=$(git worktree list | head -1 | awk '{print $1}')
|
|
127
|
-
LOG="$HARNESS_ROOT/.harness/progress.log"
|
|
128
|
-
logev() { echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | $1 | $2" >> "$LOG"; }
|
|
129
|
-
|
|
130
186
|
logev gen-start "{FEATURE_ID} start"
|
|
131
187
|
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" update_phase {FEATURE_ID} gen "$HARNESS_ROOT"
|
|
132
188
|
```
|
|
133
189
|
|
|
134
|
-
1. Feature 정보 확인
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
logev gen-read "api-contract.json → {관련 엔드포인트}"
|
|
138
|
-
```
|
|
139
|
-
- `jq '.features[] | select(.id == "{FEATURE_ID}")' .harness/actions/feature-list.json`
|
|
140
|
-
- `.harness/actions/api-contract.json`에서 관련 엔드포인트 확인
|
|
141
|
-
- AC(Acceptance Criteria) 목록을 정확히 파악
|
|
142
|
-
|
|
143
|
-
2. 코드 생성 — **파일 쓰기마다 로그**:
|
|
144
|
-
```bash
|
|
145
|
-
logev gen-write "apps/service-user/src/user.controller.ts"
|
|
146
|
-
logev gen-write "libs/shared-dto/src/user.dto.ts"
|
|
147
|
-
```
|
|
148
|
-
- AGENTS.md의 IA-MAP에 따라 올바른 디렉토리에 코드 작성
|
|
149
|
-
- AC의 모든 항목을 충족하도록 구현
|
|
150
|
-
|
|
151
|
-
3. Pre-eval 게이트 (자체) — **결과 로그**:
|
|
152
|
-
```bash
|
|
153
|
-
logev gen-test "tsc OK · eslint 0w 0e · jest 12/12"
|
|
154
|
-
```
|
|
155
|
-
- tsc (타입 체크) 실행
|
|
156
|
-
- eslint (린트) 실행
|
|
157
|
-
- 컴파일 에러가 있으면 직접 수정 (Eval에 넘기지 않음)
|
|
190
|
+
1. Feature 정보 확인 (feature-list.json, api-contract.json)
|
|
191
|
+
2. 코드 생성 (AGENTS.md IA-MAP 준수, AC 전체 충족)
|
|
192
|
+
3. Pre-eval 게이트 (tsc, eslint — 에러 있으면 직접 수정)
|
|
158
193
|
|
|
159
|
-
**Gen 완료 로깅:**
|
|
160
194
|
```bash
|
|
161
|
-
logev gen-done "{FEATURE_ID} done — {
|
|
195
|
+
logev gen-done "{FEATURE_ID} done — {파일수} files"
|
|
162
196
|
```
|
|
163
197
|
|
|
164
|
-
## Phase 2: Evaluator (독립 평가
|
|
198
|
+
## Phase 2: Evaluator (독립 평가)
|
|
165
199
|
|
|
166
|
-
**Eval 시작 로깅:**
|
|
167
200
|
```bash
|
|
168
201
|
logev eval-start "{FEATURE_ID} spawning evaluator"
|
|
169
202
|
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" update_phase {FEATURE_ID} eval "$HARNESS_ROOT"
|
|
170
203
|
```
|
|
171
204
|
|
|
172
|
-
|
|
173
|
-
이 Evaluator Agent는 당신(Generator)의 추론 과정을 모릅니다.
|
|
174
|
-
오직 코드와 AC만 보고 판단합니다.
|
|
205
|
+
**별도 Agent 생성** (Generator의 추론 과정을 모르는 독립 평가):
|
|
175
206
|
|
|
176
207
|
```
|
|
177
208
|
Agent({
|
|
178
209
|
description: "Eval: {FEATURE_ID}",
|
|
179
|
-
prompt: "
|
|
180
|
-
})
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
#### Evaluator 프롬프트
|
|
184
|
-
|
|
185
|
-
```
|
|
186
|
-
당신은 독립 Evaluator입니다. Generator가 작성한 코드를 AC 기준으로 냉정하게 평가합니다.
|
|
210
|
+
prompt: "당신은 독립 Evaluator입니다. Generator가 작성한 코드를 AC 기준으로 냉정하게 평가합니다.
|
|
187
211
|
Generator의 의도나 추론 과정은 알 수 없습니다. 오직 코드와 결과만 봅니다.
|
|
188
212
|
|
|
189
213
|
## 평가 대상
|
|
190
214
|
- Feature ID: {FEATURE_ID}
|
|
191
|
-
- AC
|
|
215
|
+
- AC: jq '.features[] | select(.id == \"{FEATURE_ID}\").acceptance_criteria' .harness/actions/feature-list.json
|
|
192
216
|
|
|
193
217
|
## 평가 기준
|
|
194
|
-
1. AC 100% 충족
|
|
195
|
-
2. api-contract.json
|
|
196
|
-
3. tsc
|
|
197
|
-
4.
|
|
198
|
-
5.
|
|
218
|
+
1. AC 100% 충족 (부분 통과 = FAIL)
|
|
219
|
+
2. api-contract.json 일치
|
|
220
|
+
3. tsc/eslint 통과
|
|
221
|
+
4. OWASP Top 10 보안
|
|
222
|
+
5. Regression 여부
|
|
199
223
|
|
|
200
224
|
## 출력 형식
|
|
201
|
-
반드시 아래 형식으로 결과를 반환하세요:
|
|
202
|
-
|
|
203
225
|
VERDICT: PASS 또는 FAIL
|
|
204
226
|
SCORE: X.XX / 3.00
|
|
205
227
|
EVIDENCE:
|
|
206
228
|
- AC-1: [PASS/FAIL] 근거
|
|
207
|
-
- AC-2: [PASS/FAIL] 근거
|
|
208
229
|
- ...
|
|
209
|
-
FEEDBACK: (FAIL
|
|
230
|
+
FEEDBACK: (FAIL만) 구체적 수정 지시"
|
|
231
|
+
})
|
|
210
232
|
```
|
|
211
233
|
|
|
212
|
-
## Phase 3: 결과 처리
|
|
213
|
-
|
|
214
|
-
Evaluator Agent 결과를 확인합니다:
|
|
234
|
+
## Phase 3: 결과 처리 + 반환
|
|
215
235
|
|
|
216
|
-
### PASS
|
|
236
|
+
### PASS (SCORE >= 2.80):
|
|
217
237
|
```bash
|
|
218
|
-
logev result "{FEATURE_ID} PASS score={SCORE}
|
|
219
|
-
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" pass {FEATURE_ID} "$HARNESS_ROOT"
|
|
238
|
+
logev result "{FEATURE_ID} PASS score={SCORE}"
|
|
220
239
|
```
|
|
221
|
-
|
|
240
|
+
Lead에게 반환: `PASS | {FEATURE_ID} | score={SCORE} | files={변경파일목록}`
|
|
222
241
|
|
|
223
|
-
### FAIL
|
|
242
|
+
### FAIL (재시도 가능):
|
|
224
243
|
```bash
|
|
225
|
-
logev fail "{FEATURE_ID} FAIL #{ATTEMPT} — {
|
|
244
|
+
logev fail "{FEATURE_ID} FAIL #{ATTEMPT} — {사유}"
|
|
226
245
|
```
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
logev escalate "{FEATURE_ID} ESCALATED after 5 attempts — user intervention required"
|
|
232
|
-
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" fail {FEATURE_ID} "$HARNESS_ROOT"
|
|
233
|
-
```
|
|
234
|
-
실패 사유와 마지막 Eval 결과를 Lead에게 반환. **사용자 개입을 요청**합니다.
|
|
235
|
-
|
|
236
|
-
## Phase 4: 자동 업무 획득
|
|
246
|
+
시도 횟수가 5회 미만이면:
|
|
247
|
+
- Evaluator FEEDBACK으로 코드 수정 → Phase 1로 돌아감 (같은 Worker 내에서 재시도)
|
|
248
|
+
- 새 Evaluator Agent 생성 (이전 Eval 기억 없음)
|
|
237
249
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
logev gen-start "$NEW_FEATURE auto-acquired"
|
|
244
|
-
```
|
|
245
|
-
3. `ready=0`이면 → next-sprint 시도:
|
|
246
|
-
```bash
|
|
247
|
-
NEXT=$(bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" next-sprint "$HARNESS_ROOT" 2>&1)
|
|
248
|
-
if echo "$NEXT" | grep -q "Advancing"; then
|
|
249
|
-
NEW_FEATURE=$(bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" dequeue {N} "$HARNESS_ROOT")
|
|
250
|
-
logev gen-start "$NEW_FEATURE auto-acquired (next sprint)"
|
|
251
|
-
else
|
|
252
|
-
logev result "Team-{N} 완료 — 모든 Sprint 처리됨"
|
|
253
|
-
fi
|
|
254
|
-
```
|
|
250
|
+
5회 모두 FAIL:
|
|
251
|
+
```bash
|
|
252
|
+
logev fail "{FEATURE_ID} FINAL FAIL after 5 attempts"
|
|
253
|
+
```
|
|
254
|
+
Lead에게 반환: `ESCALATED | {FEATURE_ID} | attempts=5 | last_feedback={마지막_피드백}`
|
|
255
255
|
```
|
|
256
256
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
모든 Team Agent가 완료되면:
|
|
260
|
-
1. 각 Agent 반환 메시지에서 PASS/FAIL 확인
|
|
261
|
-
2. Queue 상태 재확인: `bash scripts/harness-queue-manager.sh status .`
|
|
262
|
-
3. ready 큐에 새로 unblock된 feature가 있으면 → **Step 3으로 돌아가서** 추가 팀 생성
|
|
263
|
-
4. ready=0, in_progress=0이면 → **자동 Sprint 전환 시도**:
|
|
264
|
-
```bash
|
|
265
|
-
bash scripts/harness-queue-manager.sh next-sprint .
|
|
266
|
-
```
|
|
267
|
-
- `"Advancing to Sprint N"` → 새 Sprint 피처가 queue에 로드됨 → **Step 3으로 돌아가서** 팀 생성
|
|
268
|
-
- `"ALL SPRINTS COMPLETE"` → 전체 프로젝트 완료 보고
|
|
269
|
-
- `"Cannot advance: N failed"` → 실패 피처 해결 필요, 사용자 개입 요청
|
|
257
|
+
---
|
|
270
258
|
|
|
271
259
|
## 핵심 원칙
|
|
272
260
|
|
|
273
|
-
###
|
|
274
|
-
-
|
|
275
|
-
-
|
|
276
|
-
-
|
|
261
|
+
### Worker = 1 Feature Only
|
|
262
|
+
- Worker는 할당된 단일 피처만 처리하고 반환
|
|
263
|
+
- 다음 피처 dequeue, next-sprint 시도는 **Lead만** 수행
|
|
264
|
+
- Worktree는 해당 피처 전용 — 다른 피처 작업 금지
|
|
277
265
|
|
|
278
|
-
###
|
|
279
|
-
-
|
|
280
|
-
- ready
|
|
266
|
+
### Lead = Merge + Orchestrate
|
|
267
|
+
- Worker PASS 시 Lead가 branch merge → queue pass → unblock
|
|
268
|
+
- 새로 ready된 피처에 즉시 Worker 재생성
|
|
269
|
+
- Sprint 전환도 Lead가 판단
|
|
281
270
|
|
|
282
|
-
###
|
|
283
|
-
-
|
|
284
|
-
-
|
|
271
|
+
### Background Agent로 비차단 실행
|
|
272
|
+
- `run_in_background: true`로 Worker 생성
|
|
273
|
+
- Lead가 각 Worker 완료에 즉시 반응
|
|
274
|
+
- 3팀이 서로 다른 속도로 작업해도 유휴 팀 즉시 재활용
|
|
275
|
+
|
|
276
|
+
### 자기 의식 편향 차단
|
|
277
|
+
- Evaluator는 항상 새 Agent (Generator의 추론 과정 모름)
|
|
278
|
+
- FAIL 후 재시도 시에도 새 Evaluator 생성
|
|
285
279
|
|
|
286
280
|
### 에스컬레이션 (5회 초과)
|
|
287
281
|
- 5회 연속 FAIL 시 사용자 개입 요청
|
|
288
|
-
-
|
|
289
|
-
-
|
|
282
|
+
- 해당 피처는 failed 상태로 남음
|
|
283
|
+
- 다른 피처는 계속 진행 (의존하지 않는 경우)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walwal-harness/cli",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.9",
|
|
4
4
|
"description": "Production harness for AI agent engineering — Solo/Team mode, Planner, Generator(BE/FE), Evaluator(Func/Visual), optional Brainstormer. Supports React, Next.js, and Flutter FE stacks.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"walwal-harness": "bin/init.js"
|