@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.
- package/CHANGELOG.md +38 -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 +216 -403
- package/assets/templates/config.json +27 -29
- package/assets/templates/memory.md +16 -2
- package/assets/templates/progress.json.template +6 -5
- package/bin/init.js +179 -90
- package/conventions/README.md +92 -0
- package/conventions/conductor.md +24 -0
- package/conventions/coo-developer.md +24 -0
- package/conventions/cqo.md +24 -0
- package/conventions/cto.md +24 -0
- package/conventions/dispatcher.md +24 -0
- package/conventions/documentationer.md +24 -0
- package/conventions/evaluator-architecture.md +24 -0
- package/conventions/evaluator-code-quality.md +24 -0
- package/conventions/evaluator-functional.md +24 -0
- package/conventions/evaluator-security.md +24 -0
- package/conventions/evaluator-visual.md +24 -0
- package/conventions/generator-backend.md +24 -0
- package/conventions/generator-designer.md +24 -0
- package/conventions/generator-devops.md +24 -0
- package/conventions/generator-frontend.md +24 -0
- package/conventions/meeting-manager.md +24 -0
- package/conventions/planner.md +24 -0
- package/conventions/service-ops.md +24 -0
- package/conventions/shared.md +40 -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 +5 -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
|
@@ -1,413 +1,226 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
#
|
|
220
|
-
#
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
##
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
|
304
|
-
|
|
305
|
-
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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|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
|
-
|
|
|
396
|
-
|
|
|
397
|
-
|
|
|
398
|
-
|
|
|
399
|
-
|
|
|
400
|
-
|
|
|
401
|
-
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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 가 이어받는다.
|