@walwal-harness/cli 6.1.4 → 6.1.5
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/CHANGELOG.md +28 -0
- package/README.md +43 -74
- package/assets/launchd/com.walwal.harness-wake.plist.template +32 -0
- package/assets/templates/CONVENTIONS.md +12 -0
- package/assets/templates/HARNESS.md +8 -8
- package/assets/templates/config.json +25 -27
- package/assets/templates/memory.md +16 -2
- package/assets/templates/progress.json.template +6 -5
- package/bin/init.js +179 -90
- package/conventions/shared.md +16 -0
- package/gotchas/conductor.md +16 -0
- package/gotchas/dispatcher.md +16 -0
- package/gotchas/meeting-manager.md +8 -0
- package/gotchas/service-ops.md +8 -0
- package/package.json +4 -4
- package/scripts/conductor-tick.sh +61 -53
- package/scripts/harness-archive.sh +7 -5
- package/scripts/harness-dashboard-up.sh +11 -3
- package/scripts/harness-hourly-review.sh +303 -0
- package/scripts/harness-meeting-doc.sh +55 -16
- package/scripts/harness-next.sh +1 -1
- package/scripts/harness-queue-manager.sh +12 -5
- package/scripts/harness-service-ops-monitor.sh +228 -0
- package/scripts/harness-session-start.sh +60 -31
- package/scripts/harness-statusline.sh +8 -12
- package/scripts/harness-stop.sh +85 -0
- package/scripts/harness-user-prompt-submit.sh +11 -29
- package/scripts/harness-wake-install.sh +179 -0
- package/scripts/harness-wake.sh +258 -0
- package/scripts/harness-worker-dispatch.sh +157 -0
- package/scripts/lib/harness-progress-migrate.sh +6 -1
- package/scripts/lib/harness-render-progress.sh +3 -3
- package/skills/brainstorming/SKILL.md +2 -2
- package/skills/conductor/SKILL.md +67 -55
- package/skills/cqo/SKILL.md +1 -0
- package/skills/cto/SKILL.md +1 -0
- package/skills/dispatcher/SKILL.md +33 -14
- package/skills/evaluator-code-quality/SKILL.md +4 -4
- package/skills/evaluator-functional/SKILL.md +6 -6
- package/skills/evaluator-visual/SKILL.md +4 -4
- package/skills/generator-backend/SKILL.md +4 -4
- package/skills/generator-frontend/SKILL.md +5 -5
- package/skills/meeting-manager/SKILL.md +82 -12
- package/skills/planner/SKILL.md +3 -3
- package/skills/service-ops/SKILL.md +25 -0
- package/commands/harness-solo.md +0 -103
- package/commands/harness-stop.md +0 -53
- package/commands/harness-team.md +0 -530
- package/scripts/harness-dashboard.sh +0 -509
- package/scripts/harness-goal-init.sh +0 -72
- package/scripts/harness-goal-show.sh +0 -37
- package/scripts/harness-gotcha-memory.sh +0 -348
- package/scripts/harness-monitor.sh +0 -398
- package/scripts/harness-prompt-history.sh +0 -164
- package/scripts/harness-tmux.sh +0 -372
|
@@ -57,12 +57,12 @@ render_progress() {
|
|
|
57
57
|
fi
|
|
58
58
|
|
|
59
59
|
# Read progress.json
|
|
60
|
-
local pipeline
|
|
60
|
+
local pipeline cycle_num sprint_status retry_count
|
|
61
61
|
local current_agent agent_status next_agent
|
|
62
62
|
local failure_agent failure_location failure_message
|
|
63
63
|
|
|
64
64
|
pipeline=$(jq -r '.pipeline // "unknown"' "$PROGRESS")
|
|
65
|
-
|
|
65
|
+
cycle_num=$(jq -r '.sprint.number // .cycle.number // 0' "$PROGRESS")
|
|
66
66
|
sprint_status=$(jq -r '.sprint.status // "init"' "$PROGRESS")
|
|
67
67
|
retry_count=$(jq -r '.sprint.retry_count // 0' "$PROGRESS")
|
|
68
68
|
current_agent=$(jq -r '.current_agent // "none"' "$PROGRESS")
|
|
@@ -85,7 +85,7 @@ render_progress() {
|
|
|
85
85
|
fi
|
|
86
86
|
|
|
87
87
|
# ── Header ──
|
|
88
|
-
local header="
|
|
88
|
+
local header="Cycle ${cycle_num} / ${pipeline}"
|
|
89
89
|
local pad_len=$(( 40 - ${#header} ))
|
|
90
90
|
local padding=""
|
|
91
91
|
for ((i=0; i<pad_len; i++)); do padding+="═"; done
|
|
@@ -34,8 +34,8 @@ Planner 가 곧바로 plan.md / feature-list.json / api-contract.json 으로 변
|
|
|
34
34
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
35
35
|
|
|
36
36
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
37
|
-
덮어쓰면 `mode` / `
|
|
38
|
-
|
|
37
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
38
|
+
끊기는 등 런타임 오류가 발생한다.
|
|
39
39
|
|
|
40
40
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
41
41
|
|
|
@@ -15,19 +15,66 @@ walwal-harness 의 Dispatcher/Planner/Gen/Eval/Service-Ops 조직도에 맞게
|
|
|
15
15
|
> "Dispatcher는 입, **Conductor는 손**, Planner는 머리, CTO/CQO/Service-Ops는 몸."
|
|
16
16
|
> 사용자는 Dispatcher와 대화하고, Conductor가 알아서 굴린다.
|
|
17
17
|
|
|
18
|
+
## 0.0 Operating Cycle Doctrine (Inviolable)
|
|
19
|
+
|
|
20
|
+
하네스의 기본 실행 단위는 더 이상 "다음 스프린트"가 아니다. 회사는 GOAL 이 성립된 순간부터 계속 일하고, 회의는 그 진행을 판정·재배치하는 operating cycle 이다.
|
|
21
|
+
|
|
22
|
+
- **금지**: "Sprint 2 부터", "다음 sprint 에서", "sprint 가 끝나면", "sprint advance 후" 처럼 미래 batch 를 Owner 가 기다려야 하는 표현.
|
|
23
|
+
- **허용**: 레거시 파일명(`sprint`, `feature-list`, `sprint-contract`)은 데이터 저장 호환성 때문에 읽고 쓸 수 있다. 단, 응답과 의사결정에서는 이를 **mission batch / operating cycle / work package** 로 해석한다.
|
|
24
|
+
- **작업 모델**: 각 에이전트는 독립 work package 를 수행한다. Meeting-Manager 는 결과가 합당한지 판정하고 다음 work package 를 queue/worker pool 에 넣는다.
|
|
25
|
+
- **우선순위 모델**: 운영 인시던트와 production health 는 신규 기능보다 우선한다. "신규 전략은 다음 스프린트"가 아니라 "현재 operating cycle 에서 안전성 work package 가 먼저"라고 말한다.
|
|
26
|
+
- **Owner 역할**: Owner 는 GOAL 과 escalation 에만 관여한다. "다음 sprint 실행" 같은 펌프를 Owner 에게 요구하지 않는다.
|
|
27
|
+
|
|
18
28
|
## 0. 자율 시동 트리거 (NEXUS P3 Inviolable)
|
|
19
29
|
|
|
20
30
|
Conductor 는 다음 시점에 **자동 시동**한다. 사용자 펌프 없이.
|
|
21
31
|
|
|
22
32
|
1. **Dispatcher 가 GOAL 을 확정한 직후** — `progress.json.goals.active_id` 가 set 되고 `progress.json.next_agent` 가 `"planner"` 또는 `"conductor"` 로 set 되면 즉시.
|
|
23
33
|
2. **Planner 가 feature-list 를 확정한 직후** — `feature-list.json` 의 status 가 `"approved"` 가 되면 Gen↔Eval 루프 시동.
|
|
24
|
-
3. **Eval PASS 직후** — chain 의 다음 평가자 또는 다음
|
|
34
|
+
3. **Eval PASS 직후** — chain 의 다음 평가자 또는 다음 work package 로 즉시 advance.
|
|
25
35
|
4. **Eval FAIL 직후** — `failure.retry_target` 으로 자동 라우팅.
|
|
26
36
|
|
|
27
|
-
**금지**: 사용자에게 "다음 단계 진행할까요?" 묻지 말 것.
|
|
37
|
+
**금지**: 사용자에게 "다음 단계 진행할까요?" 묻지 말 것. 회사모드는 항상 켜져 있으며 Conductor 가 병렬 worker pool 을 자동 운영한다. 사용자는 미션·결과·escalation 만 본다 — 회사가 매 단계 사용자 허락을 구하면 NEXUS 메타포가 무너진다.
|
|
28
38
|
|
|
29
39
|
자세한 anti-pattern → `.harness/gotchas/dispatcher.md` 의 [G-002] 자율 실행 위반.
|
|
30
40
|
|
|
41
|
+
## 0.4 Truthful Logging (Inviolable, 모든 tick)
|
|
42
|
+
|
|
43
|
+
> **회사 루프의 정직성은 Owner 가 회사를 신뢰하는 단일 근거다.**
|
|
44
|
+
> 진행되지 않은 일을 진행됐다고 적으면 Owner 는 결국 배신감을 느끼고 하네스 전체를 의심한다.
|
|
45
|
+
|
|
46
|
+
### 절대 금지
|
|
47
|
+
|
|
48
|
+
1. **미래 시각으로 progress.log 에 항목 적기** — 현재 시각 (`date -u +%Y-%m-%dT%H:%M:%SZ` 또는 KST 로컬 시각) 만 사용. "앞으로 이렇게 진행될 예정" 식의 미리 작성한 로그 라인은 환각이며 즉시 폐기.
|
|
49
|
+
2. **아직 spawn 되지 않은 부서의 결과 로그 적기** — `evaluator-functional PASS 3.00` 같은 라인은 그 evaluator 가 실제로 돌고 결과를 progress.json 에 commit 한 뒤에만 추가.
|
|
50
|
+
3. **회의록 디렉터리 없이 "회의 했다" 라고 보고하기** — `.harness/actions/meetings/<id>/meeting-<id>.md` 가 디스크에 존재해야 회의가 일어난 것이다.
|
|
51
|
+
4. **chain ✓ 를 미리 적기** — F-XXX chain ✓ 라인은 5축 evaluator 가 모두 PASS 를 progress.json 에 기록한 뒤에만.
|
|
52
|
+
|
|
53
|
+
### 매 tick 의 시작 시각 강제
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
NOW_UTC=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
57
|
+
NOW_KST=$(date "+%Y-%m-%d %H:%M")
|
|
58
|
+
# progress.log 에 추가하는 모든 라인은 위 두 변수 중 하나로 시작해야 한다.
|
|
59
|
+
# date 명령 출력보다 미래의 값을 직접 타이핑하는 것은 환각으로 간주.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Self-check 체크리스트 (turn 종료 직전)
|
|
63
|
+
|
|
64
|
+
- [ ] 내가 마지막 5분 안에 작성한 progress.log 라인의 모든 타임스탬프가 `date` 출력 이전인가?
|
|
65
|
+
- [ ] "X chain ✓" 를 적었다면, `.harness/progress.json.features[X].evaluator_status` 에 모든 axis PASS 가 기록되어 있는가?
|
|
66
|
+
- [ ] "회의 했다" 를 보고했다면, 해당 회의록 파일이 디스크에 존재하는가?
|
|
67
|
+
- 하나라도 No → 해당 라인을 progress.log 에서 즉시 제거하고 Owner 에게 정정 보고.
|
|
68
|
+
|
|
69
|
+
### Owner 가 묻는 "정말 했어?" 에 대한 답변 규칙
|
|
70
|
+
|
|
71
|
+
Owner 가 "한 시간 동안 뭐 했냐, 회의 했냐, 진행 했냐" 라고 물으면:
|
|
72
|
+
|
|
73
|
+
1. **`stat -f "%Sm" .harness/progress.log` 와 `ls -la .harness/actions/meetings/` 를 직접 실행해서 디스크 mtime 으로 확인**한 뒤 답변.
|
|
74
|
+
2. mtime 이 owner 질문 시각보다 1시간 이상 과거면 "그동안 진행이 없었습니다" 라고 정직하게 보고. 절대 "회의록 X 가 있으니 했습니다" 라고 디렉터리 존재만으로 답변하지 말 것 — Owner 의 질문은 "**최근 1시간 동안**" 이 묵시적 컨텍스트.
|
|
75
|
+
|
|
76
|
+
자세한 anti-pattern → `.harness/gotchas/conductor.md` [G-007] 미래 시각 환각.
|
|
77
|
+
|
|
31
78
|
## 0.5 Visibility Checklist (Inviolable, 매 tick 의무)
|
|
32
79
|
|
|
33
80
|
Brick Office dashboard 가 회사의 활동을 정확히 비추려면 매 tick 의 4 시점에 progress.json partial update 가 누락 없이 발생해야 한다. Owner 의 "잘 워킹하고 있다는 느낌" 은 이 4 시점 update 의 누적이다.
|
|
@@ -83,6 +130,7 @@ fi
|
|
|
83
130
|
## 2. 입력 / 출력
|
|
84
131
|
|
|
85
132
|
**입력**
|
|
133
|
+
- `CONVENTIONS.md` + `.harness/conventions/shared.md` + `.harness/conventions/conductor.md` + `.harness/gotchas/conductor.md` + `.harness/memory.md` (회사 구조/자율 구조/하네스 SoT)
|
|
86
134
|
- `.harness/actions/goals.md` (현재 활성 GOAL)
|
|
87
135
|
- `.harness/progress.json` (현재 상태)
|
|
88
136
|
- `.harness/actions/feature-list.json`
|
|
@@ -123,7 +171,7 @@ idle ─► running ─► (waiting_meeting | waiting_owner | running) ─► co
|
|
|
123
171
|
- if 3-consecutive-FAIL on same (feature, axis): escalate; return
|
|
124
172
|
- if goal_adherence < 0.7: spawn Spec Review Meeting; return
|
|
125
173
|
- else: next_agent = progress.json.next_agent (Planner이 계산)
|
|
126
|
-
3. spawn(next_agent) with handoff package (
|
|
174
|
+
3. spawn(next_agent) with handoff package (work package + feature row)
|
|
127
175
|
4. on agent complete:
|
|
128
176
|
- update progress.json (partial, jq)
|
|
129
177
|
- append conductor.log
|
|
@@ -139,12 +187,12 @@ idle ─► running ─► (waiting_meeting | waiting_owner | running) ─► co
|
|
|
139
187
|
[generator pending in feature row] → spawn generator-backend | generator-frontend | generator-designer | generator-devops
|
|
140
188
|
[generator done, eval pending] → spawn evaluator-code-quality | evaluator-functional | evaluator-visual | evaluator-architecture | evaluator-security
|
|
141
189
|
[all eval PASS for feature] → next feature
|
|
142
|
-
[all
|
|
190
|
+
[all current work packages PASS] → Operating Review Meeting
|
|
143
191
|
[Service-Ops cron due] → spawn service-ops (requested_mode=monitor)
|
|
144
192
|
[ops-report ready] → handoff to CTO (spawn cto)
|
|
145
193
|
[planner requested_mode=hypothesis]→ spawn coo-developer and/or documentationer
|
|
146
194
|
[generator-* / eval-functional spawn 직전] → 동시 spawn service-ops (requested_mode=monitor, stream-mode, G-006)
|
|
147
|
-
[mode
|
|
195
|
+
[company mode & ready ≥ 1] → 동시 spawn min(ready,3) generator/evaluator (G-005)
|
|
148
196
|
```
|
|
149
197
|
|
|
150
198
|
`planner.requested_mode == "hypothesis"` 인 경우 Conductor 는 정규 Generator/Evaluator 체인보다 COO 직속 셀을 우선한다:
|
|
@@ -154,18 +202,18 @@ idle ─► running ─► (waiting_meeting | waiting_owner | running) ─► co
|
|
|
154
202
|
- 둘 다 필요 → 같은 tick 에 2명 병렬 spawn 가능
|
|
155
203
|
- `hypothesis-verdict` 는 terminal 단계이며 완료 시 `meeting-manager` / followup-review 로 되돌린다.
|
|
156
204
|
|
|
157
|
-
### 5.1
|
|
205
|
+
### 5.1 Company mode 병렬 spawn (G-005)
|
|
158
206
|
|
|
159
|
-
`progress.json.mode == "
|
|
207
|
+
`progress.json.mode == "company"` 가 기본이다. 매 tick 시작 시 ready 목록을 계산하여 **동시 다발 spawn**:
|
|
160
208
|
|
|
161
209
|
```bash
|
|
162
210
|
# ready = depends_on 충족 + agent_status != "running" 인 feature 의 다음 에이전트 목록
|
|
163
211
|
ready_count=$(jq '[.features[] | select(.depends_on // [] | all(. as $d | (.[$d].passes // []) | length > 0))] | length' .harness/feature-list.json)
|
|
164
212
|
slots=$(( ready_count < 3 ? ready_count : 3 ))
|
|
165
|
-
# slots 만큼
|
|
213
|
+
# slots 만큼 company_state / feature-queue teams 를 갱신 후 동시 Agent 호출
|
|
166
214
|
```
|
|
167
215
|
|
|
168
|
-
직렬 회귀 (1 spawn → 완료 대기 → 다음 spawn) 는
|
|
216
|
+
직렬 회귀 (1 spawn → 완료 대기 → 다음 spawn) 는 금지. 회사모드에서 1개씩 처리하면 GOTCHA G-005 위반.
|
|
169
217
|
|
|
170
218
|
### 5.2 Service-Ops monitor 동반 spawn (G-006)
|
|
171
219
|
|
|
@@ -192,7 +240,7 @@ bash scripts/harness-progress-set.sh . \
|
|
|
192
240
|
|
|
193
241
|
`.harness/actions/escalations/<id>.md` 작성 후 `progress.json.conductor.state = "waiting_owner"`. Dispatcher가 다음 Owner 메시지에서 이를 읽고 보고.
|
|
194
242
|
|
|
195
|
-
## 7. 실행
|
|
243
|
+
## 7. 실행 방식
|
|
196
244
|
|
|
197
245
|
### 모드 A: 채팅 루프 내부 (1차, 기본)
|
|
198
246
|
- 매 Owner 메시지 또는 hook 트리거 시 1틱 진행
|
|
@@ -207,59 +255,23 @@ bash scripts/harness-progress-set.sh . \
|
|
|
207
255
|
|
|
208
256
|
> 1차 릴리즈는 모드 A만 활성. 모드 B는 안정화 후 옵트인.
|
|
209
257
|
|
|
210
|
-
## 7.5
|
|
258
|
+
## 7.5 Company mode (v6.3+, always-on)
|
|
211
259
|
|
|
212
|
-
|
|
260
|
+
이전의 사용자 선택형 실행 모드는 제거됐다. `progress.json.mode` 는 `"company"` 로 정규화되며, Conductor 는 가능한 작업을 병렬 worker pool 에 자동 배정한다.
|
|
213
261
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
- Planner 가 `feature-list.json` 작성/갱신 직후, sprint 시작 전.
|
|
217
|
-
- 새 sprint 진입 시 (이전 sprint archive 후).
|
|
218
|
-
- 사용자 override 발화 감지 시 (즉시 재계산 없이 그 발화부터 적용).
|
|
219
|
-
|
|
220
|
-
### 7.5.2 룰 (config.json `mode_selection.rules` 참조)
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
# Team 강제 조건 (모두 만족)
|
|
224
|
-
ready_at_start ≥ 3
|
|
225
|
-
feature_count ≥ 6
|
|
226
|
-
critical_path_depth ≤ 2
|
|
227
|
-
|
|
228
|
-
# Solo 관련 threshold 는 문서상 fallback 참고치일 뿐, auto 기본 경로는 team 유지
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
`critical_path_depth` = feature 의존성 그래프에서 가장 긴 체인의 길이. `feature-list.json` 의 `depends_on` 으로 계산.
|
|
232
|
-
|
|
233
|
-
### 7.5.3 적용
|
|
234
|
-
|
|
235
|
-
1. 결정 후 `progress.json` partial update:
|
|
262
|
+
1. tick 시작 시 `progress.json` partial update:
|
|
236
263
|
```json
|
|
237
|
-
"mode": "
|
|
264
|
+
"mode": "company",
|
|
238
265
|
"mode_decision": {
|
|
239
266
|
"owner": "conductor",
|
|
240
267
|
"decided_at": "<iso>",
|
|
241
|
-
"
|
|
242
|
-
"
|
|
268
|
+
"policy": "always_company_parallel",
|
|
269
|
+
"rationale": "company mode active"
|
|
243
270
|
}
|
|
244
271
|
```
|
|
245
|
-
2. `
|
|
246
|
-
3.
|
|
247
|
-
|
|
248
|
-
### 7.5.4 사용자 override
|
|
249
|
-
|
|
250
|
-
다음 발화가 감지되면 Conductor 결정을 무시하고 사용자 선호로 강제:
|
|
251
|
-
|
|
252
|
-
| 발화/명령 | 효과 |
|
|
253
|
-
|---|---|
|
|
254
|
-
| `/harness-solo` 또는 "solo 로" | mode=solo 강제, mode_decision.user_override="solo" (비상용 fallback) |
|
|
255
|
-
| `/harness-team` 또는 "team 으로" | mode=team 강제, user_override="team" |
|
|
256
|
-
| "auto 다시" / "Conductor 결정으로" | user_override=null, 다음 sprint 시작 시 재자동결정 |
|
|
257
|
-
|
|
258
|
-
override 는 **현재 sprint 끝까지** 유지된다. 다음 sprint 진입 시 user_override 가 명시적으로 살아있지 않으면 자동 재계산.
|
|
259
|
-
|
|
260
|
-
### 7.5.5 Dispatcher 위임 룰
|
|
261
|
-
|
|
262
|
-
Dispatcher 는 더 이상 사용자에게 Solo/Team 모드를 묻지 않는다. dispatcher SKILL.md §4 의 모드 질문은 v6.0 부터 제거. 사용자가 모드를 명시한 경우만 user_override 로 기록 후 즉시 적용.
|
|
272
|
+
2. `feature-queue.json` 이 없으면 `scripts/harness-queue-manager.sh init all .` 로 생성.
|
|
273
|
+
3. idle worker 와 ready feature 를 `auto-dispatch` 로 원자 배정.
|
|
274
|
+
4. 사용자에게 mode 선택, 진행 여부, worker 수 선택을 묻지 않는다.
|
|
263
275
|
|
|
264
276
|
## 8. progress.json 추가 필드
|
|
265
277
|
|
package/skills/cqo/SKILL.md
CHANGED
|
@@ -23,6 +23,7 @@ Source: https://github.com/msitarzewski/agency-agents (MIT)
|
|
|
23
23
|
|
|
24
24
|
- **위치**: Dispatcher(CEO) 직속
|
|
25
25
|
- **산하**: Evaluator-Functional, Evaluator-Visual, Evaluator-CodeQuality, Evaluator-Architecture, Evaluator-Security
|
|
26
|
+
- **세션 시작 SoT**: `CONVENTIONS.md`, `.harness/conventions/shared.md`, `.harness/conventions/cqo.md`, `.harness/gotchas/cqo.md`, `.harness/memory.md` 를 먼저 읽고 CQO 역할 계약을 적용한다.
|
|
26
27
|
- **책임**:
|
|
27
28
|
1. 5축 평가 결과 통합·cross-validate
|
|
28
29
|
2. Rubber-stamping(증거 없는 PASS) 적발 → 해당 Evaluator 자체 FAIL
|
package/skills/cto/SKILL.md
CHANGED
|
@@ -22,6 +22,7 @@ Source: https://github.com/msitarzewski/agency-agents (MIT)
|
|
|
22
22
|
|
|
23
23
|
- **위치**: Dispatcher(CEO) 직속 의사결정 라인
|
|
24
24
|
- **산하**: Generator-Backend, Generator-Frontend, Generator-Designer, Generator-DevOps
|
|
25
|
+
- **세션 시작 SoT**: `CONVENTIONS.md`, `.harness/conventions/shared.md`, `.harness/conventions/cto.md`, `.harness/gotchas/cto.md`, `.harness/memory.md` 를 먼저 읽고 CTO 역할 계약을 적용한다.
|
|
25
26
|
- **책임**:
|
|
26
27
|
1. CEO ↔ User GOAL 협의의 **기술자 측 대변자**
|
|
27
28
|
2. Gen 부서 간 인터페이스 충돌 조정 (api-contract·design-token·deploy spec)
|
|
@@ -6,6 +6,15 @@ disable-model-invocation: false
|
|
|
6
6
|
|
|
7
7
|
# Dispatcher — Pipeline Selector + Gotcha Manager
|
|
8
8
|
|
|
9
|
+
## Operating Cycle Doctrine (Inviolable)
|
|
10
|
+
|
|
11
|
+
Owner 가 원하는 회사 운영 모델은 sprint-gated delivery 가 아니라 **continuous company loop** 다. Dispatcher 는 아래 언어를 강제한다.
|
|
12
|
+
|
|
13
|
+
- **금지**: "다음 스프린트에서", "Sprint 2+ 부터", "스프린트 종료 후", "스프린트 전환 시" 를 Owner 보고의 기본 설명으로 쓰기.
|
|
14
|
+
- **대체어**: "다음 operating cycle", "다음 회의 판정 후", "현재 work package", "worker pool", "mission batch".
|
|
15
|
+
- **의미 정리**: `.harness/progress.json.sprint` 와 `sprint-contract.md` 는 레거시 저장소 이름일 뿐이다. Owner 에게는 "회사가 지금 어떤 work package 를 처리 중이고, 다음 회의에서 무엇을 판정하는지"로 보고한다.
|
|
16
|
+
- **실행 책임**: 다음 cycle 을 실행하는 주체는 Owner 가 아니라 Conductor + Meeting-Manager 다. Owner 에게 "다음 sprint 를 시작해 달라"는 암시를 주면 안 된다.
|
|
17
|
+
|
|
9
18
|
## 정체성 — Owner ↔ CEO (NEXUS, Inviolable)
|
|
10
19
|
|
|
11
20
|
- **Owner = 사용자**. 외부에서 미션을 던지는 회사의 주주. 회사 내부 운영 결정에 관여하지 않는다.
|
|
@@ -13,6 +22,16 @@ disable-model-invocation: false
|
|
|
13
22
|
- 다른 부서 (Conductor / Planner / CTO / CQO / Service-Ops) 는 **Owner 와 직접 대화하지 않는다**. 모든 inbound/outbound 통신은 Dispatcher 경유.
|
|
14
23
|
- 응답에서 **사용자를 CEO 로 다루지 마라.** "CEO 직접 리뷰…", "CEO 가 결정…" 같은 문구로 사용자를 회사 내부 직책으로 호명하면 정체성이 깨진다. 사용자는 항상 "Owner" 또는 호칭 없이 직접 말걸기.
|
|
15
24
|
|
|
25
|
+
## 정직성 원칙 (NEXUS P0, Inviolable)
|
|
26
|
+
|
|
27
|
+
> Owner 의 회사 신뢰는 정직성에서 나온다. 거짓 진행 보고는 회사를 무너뜨린다.
|
|
28
|
+
|
|
29
|
+
- **미래 시각 progress.log 항목 금지** — 모든 라인의 타임스탬프는 `date` 명령 출력 이전이어야 한다. "앞으로 이렇게 될 것이다" 라는 추측 라인은 환각이며 즉시 폐기.
|
|
30
|
+
- **존재하지 않는 결과 보고 금지** — 회의록은 디렉터리가 디스크에 있어야, chain ✓ 는 evaluator 결과가 progress.json 에 기록되어야 보고할 수 있다.
|
|
31
|
+
- **Owner 가 "최근 1시간 동안 뭐 했냐" 물으면**: `.harness/progress.log` 와 `.harness/actions/meetings/` 의 mtime 을 직접 확인하고, 1시간 안에 변경이 없으면 **"진행이 없었습니다"** 라고 정직 보고. 디렉터리 존재만으로 "회의 했습니다" 라고 답하지 말 것.
|
|
32
|
+
|
|
33
|
+
자세한 anti-pattern → `.harness/gotchas/dispatcher.md` [G-008] 미래 진행 환각.
|
|
34
|
+
|
|
16
35
|
## 자율 실행 원칙 (NEXUS P3, Inviolable)
|
|
17
36
|
|
|
18
37
|
GOAL 이 확정된 순간부터 회사는 **사용자 펌프 없이** 자율 진행한다.
|
|
@@ -27,8 +46,8 @@ GOAL 이 확정된 순간부터 회사는 **사용자 펌프 없이** 자율 진
|
|
|
27
46
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
28
47
|
|
|
29
48
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
30
|
-
덮어쓰면 `mode` / `
|
|
31
|
-
|
|
49
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
50
|
+
끊기는 런타임 오류가 발생한다.
|
|
32
51
|
|
|
33
52
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
34
53
|
|
|
@@ -46,8 +65,8 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
46
65
|
|
|
47
66
|
### On Start
|
|
48
67
|
1. `.harness/progress.json` 읽기 — `next_agent`가 `"dispatcher"`인지 확인
|
|
49
|
-
2.
|
|
50
|
-
3.
|
|
68
|
+
2. `CONVENTIONS.md`, `.harness/conventions/shared.md`, `.harness/conventions/dispatcher.md`, `.harness/gotchas/dispatcher.md`, `.harness/memory.md` 읽기 — **회사 구조 + 자율 구조 + 하네스 SoT 적용**
|
|
69
|
+
3. progress.json 업데이트: `current_agent` → `"dispatcher"`, `agent_status` → `"running"`, `updated_at` 갱신
|
|
51
70
|
|
|
52
71
|
### On Complete
|
|
53
72
|
1. progress.json 업데이트:
|
|
@@ -58,7 +77,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
58
77
|
- 특정 에이전트 직접 명령 → 해당 에이전트 (예: `"evaluator-functional"`)
|
|
59
78
|
- Gotcha 교정 후 재작업 → `failure.retry_target` (해당 에이전트)
|
|
60
79
|
- `pipeline` → 선택된 파이프라인 (FULLSTACK/FE-ONLY/BE-ONLY)
|
|
61
|
-
- `sprint.number` → `1`, `sprint.status` → `"in_progress"` (
|
|
80
|
+
- `sprint.number` → `1`, `sprint.status` → `"in_progress"` (레거시 progress schema 호환 필드. Owner 보고에서는 operating cycle 로 표현)
|
|
62
81
|
- **신규 파이프라인인 경우** `dispatch.id` 가 `null` 이면 counter 를 올리고 새 ID 를 발급 (v5.7+):
|
|
63
82
|
```bash
|
|
64
83
|
# dispatch.id 가 이미 있으면 기존 dispatch 유지, 없으면 새로 발급
|
|
@@ -169,20 +188,20 @@ AGENTS.md 비하네스 → 기존 백업 + 리빌드
|
|
|
169
188
|
|
|
170
189
|
`.harness/actions/pipeline.json` 생성 → 사용자 확인 → Session Boundary Protocol On Complete 실행
|
|
171
190
|
|
|
172
|
-
###
|
|
191
|
+
### Company mode 원칙 (v6.3+)
|
|
173
192
|
|
|
174
|
-
|
|
193
|
+
회사모드는 항시 활성이다. Dispatcher 는 모드를 결정하거나 사용자에게 선택지를 묻지 않는다.
|
|
175
194
|
|
|
176
|
-
Dispatcher 의
|
|
177
|
-
1.
|
|
178
|
-
2.
|
|
179
|
-
3. 파이프라인 확정 안내 시
|
|
195
|
+
Dispatcher 의 책임:
|
|
196
|
+
1. GOAL 을 정리하고 `meeting-manager` / Conductor 루프로 넘긴다.
|
|
197
|
+
2. `progress.json.mode = "company"` 를 유지한다.
|
|
198
|
+
3. 파이프라인 확정 안내 시 진행 여부를 묻지 않는다. ("Pipeline: FULLSTACK 확정. 진행합니다." 면 충분.)
|
|
180
199
|
|
|
181
200
|
**금지**:
|
|
182
|
-
-
|
|
201
|
+
- 실행 모드 선택을 Owner 에게 강요
|
|
183
202
|
- mode 결정을 기다리며 Planner 호출을 보류
|
|
184
|
-
- `progress.json.mode
|
|
185
|
-
-
|
|
203
|
+
- `progress.json.mode` 를 `"company"` 이외의 값으로 셋
|
|
204
|
+
- Owner 에게 worker 수나 다음 진행 여부를 묻는 것
|
|
186
205
|
|
|
187
206
|
### evaluator_chain 필드 (모든 파이프라인 필수)
|
|
188
207
|
|
|
@@ -12,8 +12,8 @@ disable-model-invocation: false
|
|
|
12
12
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
13
13
|
|
|
14
14
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
15
|
-
덮어쓰면 `mode` / `
|
|
16
|
-
|
|
15
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
16
|
+
끊기는 등 런타임 오류가 발생한다.
|
|
17
17
|
|
|
18
18
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
19
19
|
|
|
@@ -42,7 +42,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
42
42
|
2. `feature-list.json`의 통과 feature `passes`에 `"evaluator-code-quality"` 추가
|
|
43
43
|
3. `.harness/progress.log`에 PASS 요약 추가
|
|
44
44
|
4. 출력: `"✓ Evaluator-Code-Quality PASS. 자동 핸드오프 (Conductor 자율 시동)."`
|
|
45
|
-
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (
|
|
45
|
+
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
46
46
|
|
|
47
47
|
### On Fail
|
|
48
48
|
1. progress.json 업데이트:
|
|
@@ -56,7 +56,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
56
56
|
2. `sprint.retry_count >= 10`이면 `agent_status` → `"blocked"`, 사용자 개입 요청
|
|
57
57
|
3. `.harness/progress.log`에 FAIL 요약 추가
|
|
58
58
|
4. 출력: `"✖ Evaluator-Code-Quality FAIL. 자동 핸드오프 (Conductor 자율 시동) (재작업 대상으로 라우팅)."`
|
|
59
|
-
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 `failure.retry_target` 으로 자동 핸드오프** (
|
|
59
|
+
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 `failure.retry_target` 으로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
60
60
|
|
|
61
61
|
## Critical Mindset
|
|
62
62
|
|
|
@@ -9,8 +9,8 @@ disable-model-invocation: false
|
|
|
9
9
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
10
10
|
|
|
11
11
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
12
|
-
덮어쓰면 `mode` / `
|
|
13
|
-
|
|
12
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
13
|
+
끊기는 등 런타임 오류가 발생한다.
|
|
14
14
|
|
|
15
15
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
16
16
|
|
|
@@ -44,7 +44,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
44
44
|
3. `feature-list.json`의 통과 feature `passes`에 `"evaluator-functional"` 추가
|
|
45
45
|
4. `.harness/progress.log`에 PASS 요약 추가
|
|
46
46
|
5. 출력: `"✓ Evaluator-Functional PASS. 자동 핸드오프 (Conductor 자율 시동)."`
|
|
47
|
-
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (
|
|
47
|
+
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
48
48
|
|
|
49
49
|
### On Fail
|
|
50
50
|
1. **Screenshot Cleanup** — PASS 와 동일하게 스크린샷 파일 삭제 (FAIL 시에도 정리 필수).
|
|
@@ -59,7 +59,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
59
59
|
3. `sprint.retry_count >= 10`이면 `agent_status` → `"blocked"`, 사용자 개입 요청
|
|
60
60
|
4. `.harness/progress.log`에 FAIL 요약 추가
|
|
61
61
|
5. 출력: `"✖ Evaluator-Functional FAIL. 자동 핸드오프 (Conductor 자율 시동) (재작업 대상으로 라우팅)."`
|
|
62
|
-
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 `failure.retry_target` 으로 자동 핸드오프** (
|
|
62
|
+
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 `failure.retry_target` 으로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
63
63
|
|
|
64
64
|
## Critical Mindset
|
|
65
65
|
|
|
@@ -90,9 +90,9 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
90
90
|
8. `actions/api-contract.json` — 기대 API 동작
|
|
91
91
|
9. `.harness/progress.json`
|
|
92
92
|
|
|
93
|
-
## Feature-Level
|
|
93
|
+
## Feature-Level Company Worker
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
Company worker가 호출할 때, 프롬프트에 `FEATURE_ID`가 지정된다.
|
|
96
96
|
|
|
97
97
|
### Feature-Level Rules
|
|
98
98
|
- `feature-list.json`에서 **지정된 FEATURE_ID의 AC만** 검증
|
|
@@ -9,8 +9,8 @@ disable-model-invocation: false
|
|
|
9
9
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
10
10
|
|
|
11
11
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
12
|
-
덮어쓰면 `mode` / `
|
|
13
|
-
|
|
12
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
13
|
+
끊기는 등 런타임 오류가 발생한다.
|
|
14
14
|
|
|
15
15
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
16
16
|
|
|
@@ -44,7 +44,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
44
44
|
3. `feature-list.json`의 통과 feature `passes`에 `"evaluator-visual"` 추가
|
|
45
45
|
4. `.harness/progress.log`에 PASS 요약 추가
|
|
46
46
|
5. 출력: `"✓ Evaluator-Visual PASS. 자동 핸드오프 (Conductor 자율 시동) (아카이브)."`
|
|
47
|
-
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 아카이브 단계로 자동 핸드오프** (
|
|
47
|
+
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 아카이브 단계로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
48
48
|
|
|
49
49
|
### On Fail
|
|
50
50
|
1. **Screenshot Cleanup** — PASS 와 동일하게 스크린샷 파일 삭제 (FAIL 시에도 정리 필수).
|
|
@@ -59,7 +59,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
59
59
|
3. `sprint.retry_count >= 10`이면 `agent_status` → `"blocked"`, 사용자 개입 요청
|
|
60
60
|
4. `.harness/progress.log`에 FAIL 요약 추가
|
|
61
61
|
5. 출력: `"✖ Evaluator-Visual FAIL. 자동 핸드오프 (Conductor 자율 시동) (재작업 대상으로 라우팅)."`
|
|
62
|
-
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 `failure.retry_target` 으로 자동 핸드오프** (
|
|
62
|
+
6. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 `failure.retry_target` 으로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
63
63
|
|
|
64
64
|
## FE Playwright Mandatory Rule (v5.4)
|
|
65
65
|
|
|
@@ -9,8 +9,8 @@ disable-model-invocation: false
|
|
|
9
9
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
10
10
|
|
|
11
11
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
12
|
-
덮어쓰면 `mode` / `
|
|
13
|
-
|
|
12
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
13
|
+
끊기는 등 런타임 오류가 발생한다.
|
|
14
14
|
|
|
15
15
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
16
16
|
|
|
@@ -40,7 +40,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
40
40
|
2. `feature-list.json` 의 해당 feature `passes` 에 `"generator-backend"` 추가
|
|
41
41
|
3. `.harness/progress.log` 에 요약 추가
|
|
42
42
|
4. 출력: `"✓ Generator-Backend 완료. 자동 핸드오프 (Conductor 자율 시동)."`
|
|
43
|
-
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (
|
|
43
|
+
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
44
44
|
|
|
45
45
|
## Startup (Adaptive Loading)
|
|
46
46
|
|
|
@@ -65,7 +65,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
65
65
|
- `ref.runner.install_command` 가 있으면 1회 실행
|
|
66
66
|
- `ref.runner.dev_command` 를 백그라운드 실행 (있는 경우)
|
|
67
67
|
|
|
68
|
-
## Feature-Level
|
|
68
|
+
## Feature-Level Company Worker
|
|
69
69
|
|
|
70
70
|
Team Worker 가 호출할 때 프롬프트에 `FEATURE_ID` 가 지정된다. Feature branch 에서 단일 feature 만 구현.
|
|
71
71
|
|
|
@@ -9,8 +9,8 @@ disable-model-invocation: false
|
|
|
9
9
|
## progress.json 업데이트 규칙 (v5.6.3+)
|
|
10
10
|
|
|
11
11
|
⚠️ **절대로 progress.json 을 통째로 재작성하지 마라**. `Write` 도구로 전체 파일을
|
|
12
|
-
덮어쓰면 `mode` / `
|
|
13
|
-
|
|
12
|
+
덮어쓰면 `mode` / `company_state` / 기타 top-level 필드가 누락되어 회사모드 병렬 루프가
|
|
13
|
+
끊기는 등 런타임 오류가 발생한다.
|
|
14
14
|
|
|
15
15
|
**올바른 방법** — 반드시 partial update 로 갱신:
|
|
16
16
|
|
|
@@ -40,7 +40,7 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
40
40
|
2. `feature-list.json` 의 해당 feature `passes` 에 `"generator-frontend"` 추가
|
|
41
41
|
3. `.harness/progress.log` 에 요약 추가
|
|
42
42
|
4. 출력: `"✓ Generator-Frontend 완료. 자동 핸드오프 (Conductor 자율 시동)."`
|
|
43
|
-
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (
|
|
43
|
+
5. **즉시 내부 핸드오프 (scripts/harness-next.sh) 를 호출하여 다음 에이전트로 자동 핸드오프** (회사모드 내부 핸드오프).
|
|
44
44
|
|
|
45
45
|
## Startup (Adaptive Loading)
|
|
46
46
|
|
|
@@ -68,9 +68,9 @@ jq '.agent_status = "completed" | .completed_agents += ["planner"]' .harness/p
|
|
|
68
68
|
- `ref.api.base_url` 이 `null` 이 아니면 `curl -s <base_url>/health` 로 헬스체크
|
|
69
69
|
- `null` (네이티브 앱 등) 이면 체크 스킵
|
|
70
70
|
|
|
71
|
-
## Feature-Level
|
|
71
|
+
## Feature-Level Company Worker
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Company worker가 호출할 때, 프롬프트에 `FEATURE_ID` 가 지정된다.
|
|
74
74
|
|
|
75
75
|
### Feature-Level Rules
|
|
76
76
|
- `feature-list.json` 에서 **지정된 FEATURE_ID 만** 필터하여 구현
|