@walwal-harness/cli 6.1.3 → 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.
Files changed (74) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +43 -74
  3. package/assets/launchd/com.walwal.harness-wake.plist.template +32 -0
  4. package/assets/templates/CONVENTIONS.md +12 -0
  5. package/assets/templates/HARNESS.md +216 -403
  6. package/assets/templates/config.json +27 -29
  7. package/assets/templates/memory.md +16 -2
  8. package/assets/templates/progress.json.template +6 -5
  9. package/bin/init.js +179 -90
  10. package/conventions/README.md +92 -0
  11. package/conventions/conductor.md +24 -0
  12. package/conventions/coo-developer.md +24 -0
  13. package/conventions/cqo.md +24 -0
  14. package/conventions/cto.md +24 -0
  15. package/conventions/dispatcher.md +24 -0
  16. package/conventions/documentationer.md +24 -0
  17. package/conventions/evaluator-architecture.md +24 -0
  18. package/conventions/evaluator-code-quality.md +24 -0
  19. package/conventions/evaluator-functional.md +24 -0
  20. package/conventions/evaluator-security.md +24 -0
  21. package/conventions/evaluator-visual.md +24 -0
  22. package/conventions/generator-backend.md +24 -0
  23. package/conventions/generator-designer.md +24 -0
  24. package/conventions/generator-devops.md +24 -0
  25. package/conventions/generator-frontend.md +24 -0
  26. package/conventions/meeting-manager.md +24 -0
  27. package/conventions/planner.md +24 -0
  28. package/conventions/service-ops.md +24 -0
  29. package/conventions/shared.md +40 -0
  30. package/gotchas/conductor.md +16 -0
  31. package/gotchas/dispatcher.md +16 -0
  32. package/gotchas/meeting-manager.md +8 -0
  33. package/gotchas/service-ops.md +8 -0
  34. package/package.json +5 -4
  35. package/scripts/conductor-tick.sh +61 -53
  36. package/scripts/harness-archive.sh +7 -5
  37. package/scripts/harness-dashboard-up.sh +11 -3
  38. package/scripts/harness-hourly-review.sh +303 -0
  39. package/scripts/harness-meeting-doc.sh +55 -16
  40. package/scripts/harness-next.sh +1 -1
  41. package/scripts/harness-queue-manager.sh +12 -5
  42. package/scripts/harness-service-ops-monitor.sh +228 -0
  43. package/scripts/harness-session-start.sh +60 -31
  44. package/scripts/harness-statusline.sh +8 -12
  45. package/scripts/harness-stop.sh +85 -0
  46. package/scripts/harness-user-prompt-submit.sh +11 -29
  47. package/scripts/harness-wake-install.sh +179 -0
  48. package/scripts/harness-wake.sh +258 -0
  49. package/scripts/harness-worker-dispatch.sh +157 -0
  50. package/scripts/lib/harness-progress-migrate.sh +6 -1
  51. package/scripts/lib/harness-render-progress.sh +3 -3
  52. package/skills/brainstorming/SKILL.md +2 -2
  53. package/skills/conductor/SKILL.md +67 -55
  54. package/skills/cqo/SKILL.md +1 -0
  55. package/skills/cto/SKILL.md +1 -0
  56. package/skills/dispatcher/SKILL.md +33 -14
  57. package/skills/evaluator-code-quality/SKILL.md +4 -4
  58. package/skills/evaluator-functional/SKILL.md +6 -6
  59. package/skills/evaluator-visual/SKILL.md +4 -4
  60. package/skills/generator-backend/SKILL.md +4 -4
  61. package/skills/generator-frontend/SKILL.md +5 -5
  62. package/skills/meeting-manager/SKILL.md +82 -12
  63. package/skills/planner/SKILL.md +3 -3
  64. package/skills/service-ops/SKILL.md +25 -0
  65. package/commands/harness-solo.md +0 -103
  66. package/commands/harness-stop.md +0 -53
  67. package/commands/harness-team.md +0 -530
  68. package/scripts/harness-dashboard.sh +0 -509
  69. package/scripts/harness-goal-init.sh +0 -72
  70. package/scripts/harness-goal-show.sh +0 -37
  71. package/scripts/harness-gotcha-memory.sh +0 -348
  72. package/scripts/harness-monitor.sh +0 -398
  73. package/scripts/harness-prompt-history.sh +0 -164
  74. package/scripts/harness-tmux.sh +0 -372
@@ -1,413 +1,226 @@
1
- # 7-Agent Production Harness — 사용 가이드
2
-
3
- > Anthropic 블로그 "Harness Design for Long-Running Application Development" 기반
4
- > Solo: 20min/$9 (broken) → Harness: 6hr/$200 (fully functional)
5
- > Stack: NestJS MSA + React/Next.js + Playwright MCP
1
+ ---
2
+ docmeta:
3
+ id: HARNESS
4
+ title: walwal-harness — NEXUS Company Harness 가이드
5
+ type: output
6
+ createdAt: 2026-05-08T00:00:00Z
7
+ updatedAt: 2026-05-08T00:00:00Z
8
+ source:
9
+ producer: agent
10
+ skillId: harness-release
11
+ inputs:
12
+ - documentId: AGENTS
13
+ uri: ../../AGENTS.md
14
+ relation: output-from
15
+ sections:
16
+ - sourceRange: { startLine: 121, endLine: 126 }
17
+ targetRange: { startLine: 11, endLine: 22 }
18
+ - sourceRange: { startLine: 94, endLine: 120 }
19
+ targetRange: { startLine: 24, endLine: 45 }
20
+ - sourceRange: { startLine: 35, endLine: 81 }
21
+ targetRange: { startLine: 49, endLine: 102 }
22
+ - sourceRange: { startLine: 170, endLine: 195 }
23
+ targetRange: { startLine: 144, endLine: 161 }
24
+ - sourceRange: { startLine: 214, endLine: 237 }
25
+ targetRange: { startLine: 171, endLine: 179 }
26
+ - sourceRange: { startLine: 238, endLine: 243 }
27
+ targetRange: { startLine: 181, endLine: 187 }
28
+ tags: [harness, template, nexus, v6.1.4, doctrine]
29
+ ---
30
+
31
+ # walwal-harness — NEXUS Company Harness 가이드
32
+
33
+ > Anthropic 블로그 "Harness Design for Long-Running Application Development" 기반.
34
+ > v6 NEXUS 도큐트린: 하네스를 **하나의 회사**로 본다. Owner(사용자)는 Dispatcher(CEO)와만 대화하고, 회사 내부 부서가 자율적으로 GOAL 을 실행·검증·운영한다.
35
+ >
36
+ > 이 파일은 **빠른 운영 가이드** 입니다. 프로젝트별 살아있는 컨텍스트는 `AGENTS.md` (CLAUDE.md = AGENTS.md 심볼릭 링크) 를 참조하세요.
37
+
38
+ ## 단일 대화 창구 (Doctrine)
39
+
40
+ ```
41
+ Owner (사용자)
42
+ ↕ (단일 대화 창구)
43
+ Dispatcher = CEO ── 부서 식별 · GOAL 협의 · escalation 보고
44
+ ```
45
+
46
+ - Owner ↔ Dispatcher만 직접 대화. 다른 부서가 Owner와 직접 대화하는 것은 **금지**.
47
+ - 모든 escalation은 Dispatcher 경유.
48
+ - GOAL 작성·수정은 CEO 전용 (`.harness/actions/goals.md`, CTO와 협의로 구체화).
49
+
50
+ ## 조직 구조 (v6 NEXUS)
51
+
52
+ ```
53
+ Owner
54
+ ↕
55
+ Dispatcher (CEO)
56
+ ├─ Conductor # 자율 실행 엔진 (Gen↔Eval↔Ops 루프, escalation 트리거)
57
+ └─ Meeting-Manager # 동기화 엔진 (6종 회의 · 적응형 cadence · parallel-tracks fork-join)
58
+ ↓
59
+ Planner (COO + HR) # Sprint·AC·인선·온보딩
60
+ └─ COO Hypothesis Cell (직영)
61
+ ├─ coo-developer # 가설 검증 spike·백데이터 실험
62
+ └─ documentationer # 웹리서치·보고서·가설 판정
63
+ ↓
64
+ ┌─────┴────────┬──────────────┐
65
+ CTO CQO Service-Ops
66
+ (Gen 총괄) (Eval 총괄) (운용·모니터·인시던트·자율회고)
67
+ ├ Gen-BE ├ Eval-Functional
68
+ ├ Gen-FE ├ Eval-Visual
69
+ ├ Designer ├ Eval-CodeQuality
70
+ └ DevOps ├ Eval-Architecture
71
+ └ Eval-Security
72
+ ```
73
+
74
+ 각 역할의 상세 트리거·산출물·금기는 `.claude/skills/harness-<role>/SKILL.md` 와 `gotchas/<role>.md`, `conventions/<role>.md` 에 명시.
6
75
 
7
76
  ## 디렉토리 구조
8
77
 
9
- ```
10
- CONVENTIONS.md # 프로젝트 컨벤션 (사용자 작성, 에이전트 읽기 전용)
11
- .harness/
12
- ├── HARNESS.md # 이 파일
13
- ├── config.json # 하네스 설정
14
- ├── progress.json # 기계 판독 상태 (세션 오케스트레이션)
15
- ├── progress.log # 사람 판독 히스토리 (append-only)
16
- ├── handoff.json # 세션 전환 문서 (prompt, model, artifacts, regression 등)
17
- ├── actions/ # 현재 활성 문서
18
- │ ├── pipeline.json # Dispatcher 결정 (어떤 파이프라인인지)
19
- │ ├── plan.md # 제품 사양
20
- │ ├── feature-list.json # 기능 추적 (layer + service 필드)
21
- │ ├── api-contract.json # API 계약서
22
- │ ├── sprint-contract.md # 현재 스프린트 계약
23
- │ ├── evaluation-functional.md
24
- │ └── evaluation-visual.md
25
- └── archive/ # 완료 스프린트 보관 (불변)
26
- └── sprint-NNN/
27
- ```
28
-
29
- ## 실행 흐름
30
-
31
- ```
32
- 사용자: 프로젝트 요청 (자유 형식)
33
- │
34
- ▼
35
- ┌──────────────────┐
36
- │ 0. DISPATCHER │ 요청 분석 → pipeline.json 생성
37
- │ (파이프라인 선택) │ 사용자 확인
38
- └────────┬─────────┘
39
- │
40
- ┌────┴────┬──────────┐
41
- ▼ ▼ ▼
42
- FULLSTACK FE-ONLY BE-ONLY
43
- ```
44
-
45
- ### Evaluator Chain (공통)
46
-
47
- Generator 이후는 **3-Evaluator 직렬 체인 + 조기 종료**:
48
-
49
- ```
50
- Generator
51
- → Eval-Code-Quality (정적 · 저비용 · 브라우저 없음)
52
- → Eval-Functional (동작 · 중비용 · Playwright/curl)
53
- → Eval-Visual (렌더 · 고비용 · 스크린샷)
54
- → Archive
55
- ```
56
-
57
- 앞단 FAIL 시 뒤 평가자는 실행하지 않고 즉시 Generator 재작업으로 리라우팅.
58
- 구조가 깨진 코드에 동작/렌더 테스트를 낭비하지 않기 위함.
59
-
60
- | 평가자 | 관심사 | 도구 |
61
- |--------|--------|------|
62
- | evaluator-code-quality | 유지보수성·레이어·타입 안정성·테스트 품질 (BE/FE/libs 공통) | Read/Grep + tsc/eslint |
63
- | evaluator-functional | 엔드포인트·E2E 사용자 플로우·API 계약 준수 | Playwright(browser_*) 또는 curl(api-only) |
64
- | evaluator-visual | 레이아웃·반응형·접근성·AI슬롭 | Playwright(screenshot/resize/snapshot) |
65
-
66
- ### FULLSTACK — 신규 PRD 기반 풀스택
67
-
68
- ```
69
- Planner → Gen-BE → Gen-FE → Eval-Code-Quality → Eval-Func → Eval-Visual → Archive
70
- ```
71
-
72
- ### FE-ONLY — 기존 API + 프론트엔드 연동
73
-
74
- ```
75
- Planner(light) → Gen-FE → Eval-Code-Quality → Eval-Func → Eval-Visual → Archive
76
- │
77
- └─ OpenAPI spec → api-contract.json 변환
78
- Gen-BE SKIP (외부 서버 사용)
79
- ```
80
-
81
- ### BE-ONLY — 기존 서버 + 백엔드 기능 추가
82
-
83
- ```
84
- Planner → Gen-BE → Eval-Code-Quality → Eval-Func(API-only) → Archive
85
- │
86
- └─ 기존 코드 분석 후 확장 설계
87
- Gen-FE SKIP, Eval-Visual SKIP
88
- Eval-Func: Playwright 대신 curl/httpie API 테스트
89
- ```
90
-
91
- ### 공통 — 실패 시 루프
92
-
93
- ```
94
- Eval-Code-Quality FAIL → failure.location 에 따라 Gen-BE 또는 Gen-FE 재작업 (뒤 평가자 실행 없음)
95
- Eval-Func FAIL → 동일 규칙으로 재작업
96
- Eval-Visual FAIL → Gen-FE 재작업
97
- 3회 실패 → Planner 에스컬레이션 (scope 축소/접근 변경)
98
- 5회 초과 → 사용자 개입 요청
99
- ```
100
-
101
- ### Pre-Eval Gate (Deterministic Checks)
102
-
103
- Generator → Evaluator 전환 전, 결정론적 검증을 자동 실행합니다:
104
-
105
- ```
106
- Generator 완료 → [tsc --noEmit] → [eslint] → [jest/vitest --bail] → Evaluator
107
- ↓ FAIL
108
- Generator로 리라우팅 (Evaluator 세션 미개설)
109
- ```
110
-
111
- - Backend: `tsc --noEmit`, `eslint . --max-warnings=0`, `jest --bail`
112
- - Frontend: `tsc --noEmit`, `eslint . --max-warnings=0`, `vitest run --bail 1`
113
- - `config.json`의 `flow.pre_eval_gate`에서 커스터마이징 가능
114
-
115
- ### Runtime Guardrail (파일 소유권 검증)
116
-
117
- 에이전트 전환 시 `git diff`로 이전 에이전트가 권한 밖 파일을 수정했는지 검증합니다.
118
- 위반 발견 시 경고를 출력하고 리뷰를 요청합니다.
119
-
120
- ### Context Isolation Guard (컨텍스트 분리 가드레일)
121
-
122
- 한 세션에서 여러 에이전트를 실행하면 컨텍스트가 오염됩니다.
123
- `UserPromptSubmit` 훅이 다음 위반을 실시간 감지합니다:
124
-
125
- - `current_agent`가 running인데 다른 `/harness-*` 스킬 호출 시 경고 주입
126
- - `agent_status`를 completed로 변경하지 않고 다음 에이전트 호출 시 경고
127
-
128
- ### Statusline (상시 상태 표시)
129
-
130
- 터미널 하단에 항상 고정되는 1줄 compact 상태:
131
-
132
- ```
133
- [S1] FULL | >backend | 2/5 feat | ctx 45% | $1.23
134
- ```
135
-
136
- - `scripts/harness-statusline.sh`가 3초 간격으로 `progress.json`을 읽어 갱신
137
- - `.claude/settings.json`의 `statusLine` 설정으로 활성화
138
- - 세션 시작 시 장황한 프로그래스 출력 대신 statusline으로 대체
139
-
140
- ### Artifact State Machine
141
-
142
- 주요 아티팩트는 상태를 추적합니다:
143
-
144
- ```
145
- pending → draft → reviewed → approved
146
- ```
147
-
148
- | 아티팩트 | 생성 에이전트 | 필수 상태 (다음 에이전트 진행 조건) |
149
- |----------|-------------|----------------------------------|
150
- | plan.md | Planner | draft 이상 → Generator |
151
- | api-contract.json | Planner | draft 이상 → Generator |
152
- | feature-list.json | Planner | draft 이상 → Generator |
153
- | sprint-contract.md | Generator | draft 이상 → Evaluator |
154
-
155
- 상태는 `progress.json.artifacts`에서 추적됩니다.
156
-
157
- ## 세션 오케스트레이션
158
-
159
- ### 핵심: 한 세션에 1 에이전트 단계
160
-
161
- 각 에이전트는 독립 Claude Code 세션에서 실행됩니다. 컨텍스트 소진을 방지하고 품질을 유지합니다.
162
-
163
- ### 상태 관리
164
-
165
- | 파일 | 역할 |
166
- |------|------|
167
- | `.harness/progress.json` | 기계 판독 상태 (현재 에이전트, 파이프라인, 실패 정보) |
168
- | `.harness/progress.log` | 사람 판독 히스토리 (append-only, 전체) |
169
- | `.harness/handoff.json` | 세션 전환 문서 (prompt, model, thinking_mode, artifacts) |
170
- | `.harness/actions/audit.log` | Sprint cycle 단위 실행 추적 (Planner→Eval 통과) |
171
-
172
- ### Audit Log
173
-
174
- 1 sprint cycle(Planner/Dispatcher 시작 → Eval 통과) 단위의 상세 실행 추적입니다.
78
+ ### 프로젝트 루트 (개발자가 직접 보는 파일)
175
79
 
176
80
  ```
177
- # 예시:
178
- TIMESTAMP | AGENT | ACTION | STATUS | TARGET | DETAIL
179
- 2026-04-09T14:30:00Z | planner | plan | start | plan.md | Sprint 1 설계 시작
180
- 2026-04-09T14:35:00Z | planner | plan | complete | api-contract.json | 3 endpoints, 2 services
181
- 2026-04-09T14:35:01Z | planner | handoff | complete | →gen-backend |
182
- 2026-04-09T14:36:00Z | system | gate | pass | pre-eval | gen-backend
183
- 2026-04-09T14:40:00Z | gen-backend | develop | start | apps/service-user/ | User CRUD 구현
184
- 2026-04-09T14:50:00Z | gen-backend | develop | complete | apps/service-user/ | 4 endpoints
185
- 2026-04-09T14:50:01Z | gen-backend | handoff | complete | →eval-functional |
186
- 2026-04-09T14:55:00Z | eval-func | review | start | POST /api/auth/register | AC-001~003 검증
187
- 2026-04-09T14:58:00Z | eval-func | review | fail | POST /api/auth/register | 409→400 contract 불일치
188
- 2026-04-09T14:58:01Z | eval-func | handoff | complete | →gen-backend | Re-Generate
81
+ AGENTS.md # 프로젝트 컨텍스트 (Planner 가 유지) · v6 IA-MAP·조직도·권한 매트릭스
82
+ CLAUDE.md # → AGENTS.md 심볼릭 링크 (Claude Code 진입점)
83
+ CONVENTIONS.md # 프로젝트 최상위 규칙 (사용자 작성, 에이전트 읽기 전용)
84
+ gotchas/<role>.md # 부서별 부정형 규칙 (G-NNN entry append)
85
+ conventions/<role>.md # 부서별 긍정형 규칙 (C-NNN entry append)
86
+ scripts/ # 하네스 스크립트 (init.js 가 동기화)
87
+ .claude/skills/harness-<role>/ # Claude Code 가 로드하는 스킬 정의 (init.js 가 동기화)
189
88
  ```
190
89
 
191
- **라이프사이클**: 새 Planner/Dispatcher 사이클 시작 시 이전 로그는 archive로 이동, 새 로그 시작.
192
-
193
- **에이전트 기록 의무**: 모든 에이전트는 세션 중 주요 작업의 시작/완료를 audit에 기록해야 합니다.
90
+ ### `.harness/` 런타임 (회사가 작동하면서 만드는 산출물)
194
91
 
195
- ```bash
196
- # 에이전트 스킬에서 호출:
197
- source scripts/lib/harness-audit.sh && init_audit .
198
- audit_log "gen-backend" "develop" "start" "apps/service-user/" "User CRUD 구현"
199
- audit_log "gen-backend" "develop" "complete" "apps/service-user/" "4 endpoints 완료"
200
92
  ```
201
-
202
- ### 실행 방법
203
-
204
- #### 1. 첫 세션: Dispatcher
205
- ```
206
- "하네스 엔지니어링 시작" 또는 /harness-dispatcher
207
- ```
208
-
209
- #### 2. 이후 세션: 새 세션만 열면 자동 진행
210
-
211
- 에이전트가 완료 후 STOP하면, **새 세션을 시작하기만 하면 됩니다**.
212
- SessionStart 훅이 자동으로:
213
- 1. 이전 에이전트의 완료 상태 감지
214
- 2. 게이트 체크 실행 (Pre-Eval Gate, 파일 소유권, 아티팩트 선행조건)
215
- 3. `handoff.json` 생성 (prompt, model, thinking_mode, regression 등)
216
- 4. 다음 에이전트 안내 출력
217
-
218
- ```
219
- # 새 세션 시작 시 자동 출력 예시:
220
- # Harness: next → /harness-generator-backend (sonnet)
221
- ```
222
-
223
- 사용자는 안내에 따라 스킬을 호출하면 됩니다.
224
-
225
- #### 자동 CLI 실행 (옵션)
226
-
227
- 완전 자동화를 원하면 아래 명령으로 다음 에이전트를 즉시 시작할 수 있습니다:
228
-
229
- ```bash
230
- claude --model $(jq -r .model .harness/handoff.json) --prompt "$(jq -r .prompt .harness/handoff.json)"
231
- ```
232
-
233
- #### 디버깅 (수동)
234
-
235
- 문제가 생겼을 때만 수동으로 상태를 확인합니다:
236
-
237
- ```bash
238
- bash scripts/harness-next.sh # 게이트 체크 + 프로그래스 출력
239
- jq . .harness/handoff.json # handoff 내용 확인
240
- jq . .harness/progress.json # 현재 상태 확인
241
- ```
242
-
243
- ### Session Boundary Protocol
244
-
245
- 모든 에이전트 스킬에 내장된 프로토콜:
246
-
247
- - **On Start**: `progress.json` 읽기 → `agent_status: "running"` 설정 → `handoff.json` 참조 → `CONVENTIONS.md` 읽기 (존재 시)
248
- - **On Complete**: `progress.json` 업데이트 → 아티팩트 상태 갱신 → `next_agent` 계산 → **STOP**
249
- - **On Fail** (Evaluator): `failure` 정보 기록 → `retry_target` 설정 → **STOP**
250
- - **On Transition**: 파일 소유권 검증 → Pre-Eval Gate (해당 시) → 아티팩트 선행조건 검증
251
-
252
- 에이전트는 절대 다음 에이전트를 직접 호출하지 않습니다.
253
-
254
- ### Handoff Document
255
-
256
- 에이전트 전환 시 `.harness/handoff.json`이 자동 생성됩니다:
257
-
258
- ```json
259
- {
260
- "from": "planner",
261
- "to": "generator-backend",
262
- "sprint": 1,
263
- "retry_count": 0,
264
- "sprint_status": "running",
265
- "failure_context": null,
266
- "artifacts_ready": ["plan.md", "api-contract.json", "feature-list.json"],
267
- "focus_features": ["F-001", "F-002"],
268
- "warnings": [],
269
- "timestamp": "2026-04-09T12:00:00Z"
270
- }
271
- ```
272
-
273
- 각 에이전트는 세션 시작 시 이 파일을 읽어 컨텍스트를 확보합니다.
274
-
275
- ### Escalation Protocol
276
-
277
- ```
278
- 1-2회 실패: 동일 에이전트 재시도 (실패 원인 요약 포함)
279
- 3회 실패: Planner 에스컬레이션 (scope 축소 또는 접근 변경)
280
- 5회 실패: BLOCKED — 사용자 개입 요청
281
- ```
282
-
283
- ## 핵심 원칙
284
-
285
- 1. **Backend First** — API가 안정된 후 Frontend 연동 (없는 API 호출 방지)
286
- 2. **api-contract.json이 진실의 원천** — FE↔Gateway↔Services 간 유일한 계약
287
- 3. **한 세션에 1 에이전트 단계** — 컨텍스트 소진 방지, Session Boundary Protocol 준수
288
- 4. **feature-list.json의 passes만 수정** — 기능 정의는 Planner만 변경
289
- 5. **테스트 삭제/약화 금지** — 테스트는 계약이다
290
- 6. **Evaluator는 적대적** — Rubber-stamping 금지, 2.80/3.00 미만 = FAIL, Evidence 없는 Score = 0
291
- 7. **아카이브 불변** — 완료 문서 수정 금지
292
- 8. **MSA 경계 존수** — 서비스 간 직접 DB 접근 금지, 반드시 메시지 패턴
293
-
294
- ## Evaluation System (v3.2)
295
-
296
- ### 정량 채점 (Rubric Scoring)
297
-
298
- 모든 Evaluator는 구조화된 Rubric으로 채점합니다:
299
-
300
- | 설정 | 값 |
301
- |------|------|
302
- | 척도 | 0-3 (항목별) |
303
- | PASS 기준 | **2.80 / 3.00 이상** |
304
- | FAIL 기준 | 2.79 이하 (예외 없음) |
305
- | Evidence 없는 항목 | Score = 0으로 강제 재계산 |
306
-
307
- ### Evaluator-Code-Quality 채점 항목 (C1-C5)
308
-
309
- | # | Criterion | Weight |
310
- |---|-----------|--------|
311
- | C1 | Layer & Boundary (IA-MAP/MSA/FE VM 경계) | 25% |
312
- | C2 | Readability & Complexity | 15% |
313
- | C3 | Reuse & DRY | 20% |
314
- | C4 | Type Safety & Error Handling | 25% |
315
- | C5 | Test Quality | 15% |
316
-
317
- ### Evaluator-Functional 채점 항목 (R1-R5)
318
-
319
- | # | Criterion | Weight |
320
- |---|-----------|--------|
321
- | R1 | API Contract 준수 | 25% |
322
- | R2 | Acceptance Criteria 전수 통과 | 25% |
323
- | R3 | 부정 테스트 (엔드포인트당 2개+) | 20% |
324
- | R4 | E2E 시나리오 (Playwright) | 15% |
325
- | R5 | 에러 핸들링 & 엣지케이스 | 15% |
326
-
327
- ### Evaluator-Visual 채점 항목 (V1-V5)
328
-
329
- | # | Criterion | Weight |
330
- |---|-----------|--------|
331
- | V1 | 레이아웃 정확성 | 20% |
332
- | V2 | 반응형 (375/768/1280px) | 20% |
333
- | V3 | 접근성 WCAG 2.1 AA | 20% |
334
- | V4 | 시각적 일관성 + AI슬롭 감지 | 20% |
335
- | V5 | 인터랙션 상태 (로딩/에러/빈/호버/포커스) | 20% |
336
-
337
- ### 자동 FAIL 조건 (Verdict Rules)
338
-
339
- 어떤 상황에서도 아래 조건 충족 시 FAIL:
340
-
341
- 1. Weighted Score < 2.80
342
- 2. AC 100% 미통과 (부분 통과 불인정)
343
- 3. Regression 실패 1건 이상 (신규 점수 무관)
344
- 4. Evidence 누락 항목 존재 → 해당 Score = 0 재계산
345
- 5. Cross-Validation 불일치 1건 이상 → CONDITIONAL FAIL
346
- 6. (Visual) a11y Critical/Serious 위반 1건 이상 → V3 = 0
347
- 7. (Visual) AI Slop 2건 이상 → V4 최대 1점
348
-
349
- ### Executable Acceptance Criteria
350
-
351
- Planner는 feature-list.json에 기능을 정의할 때 **실행 가능한 검증 조건(AC)**을 반드시 작성합니다:
352
-
353
- ```json
354
- {
355
- "id": "AC-001",
356
- "description": "유효한 이메일로 가입 시 201 응답",
357
- "type": "api",
358
- "verify": {
359
- "method": "POST",
360
- "path": "/api/auth/register",
361
- "body": { "email": "test@test.com", "password": "Test1234!" },
362
- "expect": { "status": 201 }
363
- }
364
- }
365
- ```
366
-
367
- AC 타입: `api` (HTTP 요청), `visual` (UI 요소 존재), `e2e` (사용자 플로우)
368
-
369
- ### Regression Checkpoint
370
-
371
- Sprint N의 Evaluator는 이전 Sprint에서 PASS된 AC를 재검증합니다:
372
- - archive에서 이전 feature-list.json의 passed AC를 로드
373
- - handoff.json의 `regression` 필드로 전달
374
- - **1건이라도 회귀 실패하면 전체 FAIL**
375
-
376
- ### Cross-Validation
377
-
378
- Eval-Functional의 결과를 Eval-Visual이 교차 검증합니다:
379
- - evaluation-functional.md 내 JSON 블록 → handoff.json의 `cross_validation_from_functional`
380
- - API 성공인데 UI에 에러 표시 = 불일치 = FAIL 사유
381
-
382
- ### Adversarial Rules (적대적 행동 규칙)
383
-
384
- Evaluator 에이전트에게 강제되는 행동 규칙:
385
- - Generator의 '완료' 주장을 신뢰하지 않고 직접 검증
386
- - 정상 1개당 비정상 2개 이상 테스트
387
- - PASS 전 자문: "내가 이 코드로 PR을 올리겠는가?"
388
- - '전반적으로 잘 되었습니다' 류의 모호한 긍정 평가 **금지**
389
- - '시간 제약상 일부만 테스트' **금지** — 전수 불가 시 FAIL 처리
390
-
391
- ## Tech Stack
392
-
393
- | 영역 | 기술 |
93
+ .harness/
94
+ ├── HARNESS.md # 이 파일
95
+ ├── config.json # 하네스 설정 (company_mode, behavior, flow gates)
96
+ ├── progress.json # 기계 판독 상태 (세션 오케스트레이션 SoT)
97
+ ├── progress.log # 사람 판독 히스토리 (append-only)
98
+ ├── handoff.json # 세션 전환 문서 (prompt, model, artifacts, regression)
99
+ ├── memory.md # 시스템 entry (예: M-NEXUS-P3) + 사용자 메모
100
+ ├── doctrine/nexus.md # NEXUS 도큐트린 본문
101
+ ├── ref/<role>-<stack>.md # 스택별 best-practice (FE/BE/Designer/DevOps)
102
+ ├── prompts/ # 에이전트 프롬프트
103
+ ├── baselines/ # Eval baseline (의존 그래프, 시각 baseline 등)
104
+ ├── ops/metrics.jsonl # 운영 메트릭 (DevOps append / Service-Ops read)
105
+ ├── actions/ # 활성 스프린트 산출물 (각 부서 쓰기)
106
+ │ ├── pipeline.json # Dispatcher 결정 (FULLSTACK / FE-ONLY / BE-ONLY)
107
+ │ ├── plan.md # Planner — 제품 사양
108
+ │ ├── feature-list.json # Planner — Executable AC
109
+ │ ├── api-contract.json # Planner — API 계약 (BE/FE 공유)
110
+ │ ├── sprint-contract.md # Planner → BE/FE 가 섹션별로 채움
111
+ │ ├── evaluation-*.md # Evaluator-* 별 결과
112
+ │ ├── goals.md # CEO (Dispatcher) 전용
113
+ │ ├── meetings/ # Meeting-Manager — 회의록·prep (followup-review 포함)
114
+ │ ├── incidents/ # Service-Ops — 사고 타임라인·RCA
115
+ │ ├── escalations/ # Conductor — Owner 보고용
116
+ │ ├── onboarding/ # Planner(HR) — 부서 온보딩 패키지
117
+ │ ├── hypothesis/<id>/ # COO Hypothesis Cell (spike/, brief.md, report.md, verdict.json)
118
+ │ ├── hr-roster.md # Planner(HR) — 활성 부서 명단
119
+ │ ├── cto-review-*.md # CTO 전용
120
+ │ ├── cqo-audit-*.md # CQO 전용
121
+ │ └── ops-report-*.md # Service-Ops 전용
122
+ └── archive/ # 완료 스프린트 (불변, Evaluator 가 archive)
123
+ └── D-NNN/S-NNN/ # design-NNN / sprint-NNN
124
+ ```
125
+
126
+ ## 실행 흐름 (Conductor-driven)
127
+
128
+ ```
129
+ Owner: "X 만들어줘" (자유 형식)
130
+ │
131
+ ▼
132
+ Dispatcher (CEO)
133
+ ├─ Goal 협의 (모호하면 1회 짧게 명료화)
134
+ └─ pipeline.json 결정 → Conductor 핸드오프
135
+ │
136
+ ▼
137
+ Conductor (자율 실행 엔진)
138
+ │
139
+ ▼
140
+ Planner ─ ┐
141
+ │ ├─ light → 기존 PRD 만 보강
142
+ │ └─ full → plan.md + feature-list + api-contract 확정
143
+ ▼
144
+ CTO ── 실행 분할 ── ┐
145
+ ▼ ▼
146
+ Gen-BE ⇄ Gen-FE (회사모드 병렬 worker pool)
147
+ │
148
+ ▼
149
+ CQO 적대적 검증 (early-exit chain)
150
+ ├─ Eval-CodeQuality (정적 · 저비용)
151
+ ├─ Eval-Functional (동작 · 중비용 · Playwright/curl)
152
+ ├─ Eval-Visual (렌더 · 고비용 · screenshot)
153
+ ├─ Eval-Architecture (IA-MAP·계층 위반·의존 그래프)
154
+ └─ Eval-Security (OWASP·SAST·시크릿·CVE)
155
+ │
156
+ ▼
157
+ Service-Ops (상시) ── monitor · auto-retro · incident
158
+ │
159
+ ▼
160
+ Archive (sprint advance)
161
+ ```
162
+
163
+ 앞단 FAIL 시 뒤 단계는 실행하지 않고 즉시 재작업으로 리라우팅.
164
+ 3회 연속 FAIL · GOAL 위반 · 인시던트 → Conductor 가 Dispatcher 통해 Owner에게 escalation.
165
+
166
+ ## 6종 회의 (Meeting-Manager)
167
+
168
+ | 회의 | 시점 | 결정자 |
169
+ |------|------|--------|
170
+ | **standup** | 적응형 cadence (light 30m / normal 1h / heavy 4h) | 부서 발신 |
171
+ | **sprint-review** | sprint advance 직전 | CTO |
172
+ | **spec-review** | Planner 산출물 변경 | CTO |
173
+ | **incident-war-room** | Service-Ops 인시던트 발신 | CEO + CTO |
174
+ | **all-hands** | 분기/대형 결정 | CEO |
175
+ | **followup-review** | parallel-tracks fork 종료 후 | CTO (goal-* fork 면 CEO) |
176
+
177
+ ### Parallel Tracks (Fork-Join, v6.2)
178
+
179
+ 회의 결정의 `tracks[]` 길이 ≥ 2 면 fork. Conductor 가 트랙 dispatch 와 rendezvous join 을 자동 처리.
180
+
181
+ - 대표 패턴: `track-1: cto/bugfix` + `track-2: planner/hypothesis-validation` → followup-review 에서 통합 결정.
182
+ - followup-review 에서 결정자가 `apply-now / backlog / more-validation` 중 하나로 마무리.
183
+ - followup-review 자체에서 또 fork 금지 (무한 fork 방지).
184
+ - 한 sprint 내 parallel fork ≥ 3 회면 다음 fork 는 single 강제.
185
+
186
+ ## Company / Hypothesis 실행
187
+
188
+ | 실행 | 트리거 | 동작 |
189
+ |------|--------|------|
190
+ | **Company** | 기본값 | Conductor 가 매 tick `min(ready, 3)` 병렬 worker 를 자동 배정 |
191
+ | **Hypothesis** | Planner `requested_mode = "hypothesis"` | `documentationer → coo-developer → documentationer → planner` 가설 검증 루프 |
192
+
193
+ ## 품질 게이트
194
+
195
+ | 게이트 | 시점 | 동작 |
196
+ |--------|------|------|
197
+ | **Pre-Eval Gate** | Generator → Evaluator 전환 | tsc / eslint / jest&#124;vitest 자동 실행. 실패 시 Generator 리라우팅 |
198
+ | **파일 소유권 검증** | 에이전트 전환 시 | git diff 로 권한 밖 파일 수정 감지 |
199
+ | **아티팩트 선행조건** | 에이전트 시작 전 | progress.json.artifacts 상태 확인 |
200
+ | **Evaluation PASS 기준** | Evaluator 결과 | 2.80 / 3.00 이상. Evidence 없는 score = 0. AC 부분 통과 = FAIL. Regression 1건 = FAIL |
201
+ | **Known-Bug Hard Gate** | sprint advance | 알려진 런타임 버그 보유 시 PASS / sprint advance 금지 |
202
+
203
+ ## Conventions / Gotchas (Hierarchical)
204
+
205
+ - **gotchas/**: 부서별 부정형 규칙. Dispatcher 가 Owner 의 실수 지적을 받아 `### [G-NNN]` 으로 append.
206
+ - **conventions/**: 부서별 긍정형 규칙. 같은 메커니즘으로 `### [C-NNN]` append.
207
+ - **메모리 오염 방어**: 신규 entry 는 `unverified` 로 시작 → Planner 리뷰 시 `verified` 승격. TTL 만료 항목은 sprint 전환 시 갱신/삭제.
208
+ - **검증 불가능 항목 즉시 삭제**.
209
+
210
+ ## 자주 쓰는 명령
211
+
212
+ | 명령 | 설명 |
394
213
  |------|------|
395
- | Backend Framework | NestJS (TypeScript) |
396
- | Architecture | MSA (Microservice Architecture) |
397
- | Monorepo | NestJS 내장 monorepo (nest-cli.json) |
398
- | Runner | 통합 러너 (`npm run dev` = concurrently) |
399
- | Transport | TCP (dev) / RabbitMQ·NATS (prod) |
400
- | Frontend | React 또는 Next.js (TypeScript) |
401
- | Styling | Tailwind CSS |
402
- | State | TanStack Query + Zustand |
403
- | E2E Testing | Playwright MCP |
404
- | Unit Testing | Jest (backend) + Vitest (frontend) |
405
- | Database | PostgreSQL (dev: SQLite 가능) |
406
-
407
- ## MCP 도구
408
-
409
- Playwright MCP (`@playwright/mcp`) — headless + vision 모드:
410
- - `browser_navigate`, `browser_click`, `browser_fill`
411
- - `browser_take_screenshot`, `browser_snapshot`
412
- - `browser_console_messages`, `browser_network_requests`
413
- - `browser_resize`, `browser_press_key`, `browser_wait`
214
+ | `npx walwal-harness` | 첫 설치 / 안전 init (G-NNN, C-NNN 보존) |
215
+ | `npx walwal-harness --force` | 시스템 파일 강제 갱신 (G/C entry 는 여전히 보존) |
216
+ | `npx walwal-harness migrate` | 구버전 progress.json / config.json schema 정상화 |
217
+ | `npx walwal-harness verify` | 설치 정합성 검증 |
218
+ | `bash scripts/harness-dashboard-up.sh` | Brick Office 라이브 대시보드 (http://localhost:3001) |
219
+ | `bash scripts/harness-wake-install.sh install .` | 1시간 안전망 wake 등록 (launchd) |
220
+ | `bash scripts/harness-wake-install.sh status` | wake 상태 / 등록 프로젝트 확인 |
221
+
222
+ ## 다음 단계
223
+
224
+ 1. `AGENTS.md` 의 `[?]` 태그를 Planner 가 분류하도록 요청.
225
+ 2. `gotchas/<role>.md`, `conventions/<role>.md` 의 Preserved Rules 섹션 정리.
226
+ 3. Owner 는 "하네스 엔지니어링 시작" 또는 자유 형식 지시로 Dispatcher 를 깨운다 — 이후는 Conductor 가 이어받는다.