@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.
Files changed (55) hide show
  1. package/CHANGELOG.md +28 -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 +8 -8
  6. package/assets/templates/config.json +25 -27
  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/shared.md +16 -0
  11. package/gotchas/conductor.md +16 -0
  12. package/gotchas/dispatcher.md +16 -0
  13. package/gotchas/meeting-manager.md +8 -0
  14. package/gotchas/service-ops.md +8 -0
  15. package/package.json +4 -4
  16. package/scripts/conductor-tick.sh +61 -53
  17. package/scripts/harness-archive.sh +7 -5
  18. package/scripts/harness-dashboard-up.sh +11 -3
  19. package/scripts/harness-hourly-review.sh +303 -0
  20. package/scripts/harness-meeting-doc.sh +55 -16
  21. package/scripts/harness-next.sh +1 -1
  22. package/scripts/harness-queue-manager.sh +12 -5
  23. package/scripts/harness-service-ops-monitor.sh +228 -0
  24. package/scripts/harness-session-start.sh +60 -31
  25. package/scripts/harness-statusline.sh +8 -12
  26. package/scripts/harness-stop.sh +85 -0
  27. package/scripts/harness-user-prompt-submit.sh +11 -29
  28. package/scripts/harness-wake-install.sh +179 -0
  29. package/scripts/harness-wake.sh +258 -0
  30. package/scripts/harness-worker-dispatch.sh +157 -0
  31. package/scripts/lib/harness-progress-migrate.sh +6 -1
  32. package/scripts/lib/harness-render-progress.sh +3 -3
  33. package/skills/brainstorming/SKILL.md +2 -2
  34. package/skills/conductor/SKILL.md +67 -55
  35. package/skills/cqo/SKILL.md +1 -0
  36. package/skills/cto/SKILL.md +1 -0
  37. package/skills/dispatcher/SKILL.md +33 -14
  38. package/skills/evaluator-code-quality/SKILL.md +4 -4
  39. package/skills/evaluator-functional/SKILL.md +6 -6
  40. package/skills/evaluator-visual/SKILL.md +4 -4
  41. package/skills/generator-backend/SKILL.md +4 -4
  42. package/skills/generator-frontend/SKILL.md +5 -5
  43. package/skills/meeting-manager/SKILL.md +82 -12
  44. package/skills/planner/SKILL.md +3 -3
  45. package/skills/service-ops/SKILL.md +25 -0
  46. package/commands/harness-solo.md +0 -103
  47. package/commands/harness-stop.md +0 -53
  48. package/commands/harness-team.md +0 -530
  49. package/scripts/harness-dashboard.sh +0 -509
  50. package/scripts/harness-goal-init.sh +0 -72
  51. package/scripts/harness-goal-show.sh +0 -37
  52. package/scripts/harness-gotcha-memory.sh +0 -348
  53. package/scripts/harness-monitor.sh +0 -398
  54. package/scripts/harness-prompt-history.sh +0 -164
  55. package/scripts/harness-tmux.sh +0 -372
package/CHANGELOG.md CHANGED
@@ -29,6 +29,34 @@ docmeta:
29
29
 
30
30
  # Changelog
31
31
 
32
+ ## 6.2.0 — Always-on company runtime + legacy purge (2026-05-08)
33
+
34
+ ### Why
35
+ 회사모드 only 정렬. 솔로/팀 모드의 잔재 스크립트와 분기 로직이 SKILL/문서 곳곳에 남아 있어 Owner 가 "지금 어떤 모드인지" 혼동하고, 한 시간이 지나도 자율 활동이 일어나지 않는 (스케줄러 부재) 문제 발생. 추가로 Claude 가 미래 시각으로 progress.log 라인을 미리 적어 가짜 진행을 보고하는 환각이 관찰됨.
36
+
37
+ ### Added
38
+ - **Stop 훅** (`scripts/harness-stop.sh`) — Claude turn 종료 시 conductor 가 running 이면 자동으로 다음 tick 으로 연쇄. `behavior.auto_chain_on_stop=false` 로 비활성, `behavior.auto_chain_max_per_sprint` 로 상한 (기본 200).
39
+ - **launchd hourly wake** (`scripts/harness-wake.sh`, `scripts/harness-wake-install.sh`, `assets/launchd/com.walwal.harness-wake.plist.template`) — 1시간마다 idle ≥ 55분 프로젝트의 tmux 에 wake prompt 송출.
40
+ - **Truthful Logging Heal** — `harness-session-start.sh` 가 `progress.log` 의 미래 시각 라인을 자동으로 `progress.log.future-quarantine.<ts>` 로 격리 + 메인 로그에서 제거.
41
+ - **conductor / dispatcher SKILL 의 정직성 룰** — "미래 시각 progress.log 항목 금지" Inviolable 섹션 추가, Owner "최근 1시간 뭐 했냐" 질문 시 디스크 mtime 으로 정직 답변하도록 명시.
42
+ - **meeting-manager SKILL 의 라이브 가시화 계약** — `meetings.active` 가 평탄한 agent ID 배열이라는 데이터 계약을 명시. convene 시 active=[참석자], dispatch 시 active=[] 로 갱신해야 미니피규어가 회의실로 텔레포트.
43
+
44
+ ### Removed (legacy purge)
45
+ - `scripts/harness-dashboard.sh` — tmux ASCII 대시보드 pane (3D Brick Office 가 대체).
46
+ - `scripts/harness-monitor.sh` — 3-team worker pane (회사모드는 동적 worker pool).
47
+ - `scripts/harness-prompt-history.sh` — tmux Studio 전용 pane.
48
+ - `scripts/harness-gotcha-memory.sh` — tmux Studio 전용 pane.
49
+ - `scripts/harness-tmux.sh` — tmux Studio launcher (회사모드는 단일 Claude CLI + 브라우저 대시보드).
50
+ - `scripts/harness-goal-init.sh`, `scripts/harness-goal-show.sh` — 외부 호출 0 건의 고아.
51
+ - `commands/harness-company.md` — Studio launch 명령 (런타임 자동화로 불필요).
52
+ - `bin/init.js`: `runTeamStudio()` + `company` / `studio` / `studio-v4` / `v4` subcommand 제거.
53
+
54
+ ### Migration
55
+ 기존 프로젝트는 `npx walwal-harness --force` 또는 다음만 수동 적용:
56
+ 1. `.claude/settings.json` 에 Stop 훅 추가 (matcher: "", command: `bash scripts/harness-stop.sh`).
57
+ 2. `bash scripts/harness-wake-install.sh install <project-root>` 로 1시간 안전망 등록 (선택).
58
+ 3. `~/<project>/scripts/` 에서 위 7개 legacy 스크립트 제거.
59
+
32
60
  ## 6.1.4 — Template + package files alignment with v6 NEXUS (2026-05-08)
33
61
 
34
62
  ### Why
package/README.md CHANGED
@@ -224,74 +224,27 @@ bash scripts/harness-token-limit.sh . mark 300
224
224
 
225
225
  핵심은 운영 품질이 아니라 빠른 사실 확인입니다.
226
226
 
227
- ## 런타임 모드
227
+ ## 런타임 (회사모드 always-on)
228
228
 
229
- `progress.mode` 는 회사 실행 상태를 뜻합니다. 회의 결정의 `tracks[]` 와는 별개이며, fork-join 은 `tracks.length` 로만 판단합니다.
229
+ 회사모드는 유일한 런타임이며 항상 켜져 있습니다. `progress.mode == "company"` 가 항상 참이고, 별도 모드 전환 명령은 없습니다.
230
230
 
231
- ### Company / Team
231
+ 자율 진행은 두 메커니즘으로 유지됩니다:
232
232
 
233
- 기본 경로입니다. Conductor 가 `progress.mode=auto` 에서 선택합니다.
233
+ - **Stop 훅** — Claude 가 한 turn 을 끝내려는 시점에 발화. `conductor.state == "running"` 이고 다음 부서가 있으면 자동으로 turn 을 한 번 더 굴려 끊김 없이 연쇄.
234
+ - **launchd hourly wake (선택)** — 1시간마다 macOS 가 `scripts/harness-wake.sh` 를 호출. idle ≥ 55분이고 `paused/completed/escalated` 가 아닌 프로젝트만 깨움.
234
235
 
235
- 특징:
236
-
237
- - 회사형 루프 유지
238
- - control-plane 과 worker-plane 분리
239
- - feature queue 기반 병렬 처리
240
- - tmux studio 사용 가능
241
-
242
- 강제 전환:
243
-
244
- ```text
245
- /harness-team
246
- ```
247
-
248
- ### Solo
249
-
250
- 비상용 fallback 입니다.
251
-
252
- 사용 시점:
253
-
254
- - 디버깅
255
- - 스크립트 장애
256
- - 짧은 수동 복구
257
-
258
- 강제 전환:
259
-
260
- ```text
261
- /harness-solo
262
- ```
263
-
264
- ### Stop
265
-
266
- Team 모드를 안전하게 멈추고 진행 중이던 feature 를 ready 로 복구합니다.
267
-
268
- ```text
269
- /harness-stop
270
- ```
271
-
272
- ## Team Studio
273
-
274
- Team 모드에서는 tmux 기반 Studio 레이아웃을 사용합니다.
275
-
276
- 시작:
277
-
278
- ```text
279
- /harness-team
280
- ```
236
+ ```bash
237
+ # 1시간 안전망 wake 등록
238
+ bash scripts/harness-wake-install.sh install .
281
239
 
282
- 또는:
240
+ # 상태 확인
241
+ bash scripts/harness-wake-install.sh status
283
242
 
284
- ```bash
285
- npx walwal-harness team
243
+ # 즉시 한 번 발화 (테스트)
244
+ bash scripts/harness-wake-install.sh run-now
286
245
  ```
287
246
 
288
- Team Studio 는 보통 다음을 보여줍니다.
289
-
290
- - Dashboard
291
- - Gotchas
292
- - Conventions
293
- - Memory
294
- - Team 1~3 worker pane
247
+ 회의 결정의 `tracks[]` 는 진행 흐름의 fork-join 단위이며 런타임 모드와는 별개입니다 (`tracks.length ≥ 2` 일 때 parallel).
295
248
  - Archive prompt
296
249
 
297
250
  Queue 관련 유용한 명령:
@@ -345,15 +298,22 @@ bash scripts/harness-queue-manager.sh idle-slots .
345
298
 
346
299
  | 스크립트 | 역할 |
347
300
  |---|---|
348
- | `scripts/harness-next.sh` | handoff 생성과 다음 agent 결정 |
349
- | `scripts/conductor-tick.sh` | company loop 라우팅 |
350
- | `scripts/harness-session-start.sh` | 새 세션 시작 시 자동 안내 |
351
- | `scripts/harness-user-prompt-submit.sh` | prompt 훅 주입/차단 |
352
- | `scripts/harness-task-session.sh` | agent 별 task session 생성 |
353
- | `scripts/harness-token-limit.sh` | TokenLimit hold/resume 마킹 |
354
- | `scripts/harness-queue-manager.sh` | team queue 관리 |
355
- | `scripts/harness-dashboard.sh` | dashboard 렌더 |
301
+ | `scripts/conductor-tick.sh` | 회사 루프 라우터 — 다음 부서 결정 |
302
+ | `scripts/harness-next.sh` | turn 종료 후 handoff 생성 + gotcha/convention 자동 등록 + audit gate |
303
+ | `scripts/harness-progress-set.sh` | progress.json partial update 헬퍼 |
304
+ | `scripts/harness-session-start.sh` | SessionStart 훅 (+ future-dated 라인 자동 격리) |
305
+ | `scripts/harness-user-prompt-submit.sh` | UserPromptSubmit 훅 |
306
+ | `scripts/harness-stop.sh` | Stop 훅 — turn 종료 시 자동 연쇄 |
307
+ | `scripts/harness-wake.sh` | 1시간 안전망 wake (launchd 가 호출) |
308
+ | `scripts/harness-wake-install.sh` | launchd 등록/관리 CLI |
309
+ | `scripts/harness-statusline.sh` | 1줄 statusLine 렌더 |
310
+ | `scripts/harness-queue-manager.sh` | feature queue 관리 |
356
311
  | `scripts/harness-meeting-doc.sh` | 회의 문서 skeleton / decision 처리 |
312
+ | `scripts/harness-task-session.sh` | agent 별 task session (TokenLimit) |
313
+ | `scripts/harness-token-limit.sh` | TokenLimit hold/resume 마킹 |
314
+ | `scripts/harness-archive.sh` | sprint 종료 archive |
315
+ | `scripts/harness-gotcha-register.sh` | evaluator output 의 gotcha_candidates 자동 등록 |
316
+ | `scripts/harness-dashboard-up.sh` | Brick Office (브라우저 3D 대시보드) 기동 |
357
317
 
358
318
  ## 디렉토리 구조
359
319
 
@@ -414,17 +374,26 @@ cat .harness/progress.json | jq '.task_stop'
414
374
  bash scripts/harness-queue-manager.sh status .
415
375
  ```
416
376
 
417
- ### mode 강제 전환
377
+ ### Stop 훅 자동 연쇄가 안 도는지 점검
418
378
 
419
- ```text
420
- /harness-team
421
- /harness-solo
422
- /harness-stop
379
+ ```bash
380
+ # config 확인 — auto_chain_on_stop 이 true 여야 함
381
+ jq '.behavior.auto_chain_on_stop // true' .harness/config.json
382
+
383
+ # stop_chain_count 와 sprint 상한 확인
384
+ jq '{count: .conductor.stop_chain_count, max: 200}' .harness/progress.json
385
+ ```
386
+
387
+ ### 1시간 wake 가 발화 안 하는지 점검
388
+
389
+ ```bash
390
+ bash scripts/harness-wake-install.sh status
391
+ tail -30 ~/.walwal-harness/logs/wake.log
423
392
  ```
424
393
 
425
394
  ## 버전 호환성
426
395
 
427
- README 는 v6.1 계열 회사형 하네스를 기준으로 작성되었습니다.
396
+ README 는 v6.x 계열 always-on 회사모드 기준입니다 (solo/team 모드 영구 제거).
428
397
 
429
398
  이 문서에서 전제하는 기능:
430
399
 
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>com.walwal.harness-wake</string>
7
+
8
+ <key>ProgramArguments</key>
9
+ <array>
10
+ <string>/bin/bash</string>
11
+ <string>{{WAKE_SCRIPT}}</string>
12
+ </array>
13
+
14
+ <key>StartInterval</key>
15
+ <integer>3600</integer>
16
+
17
+ <key>RunAtLoad</key>
18
+ <false/>
19
+
20
+ <key>StandardOutPath</key>
21
+ <string>{{LOG_DIR}}/wake.stdout.log</string>
22
+
23
+ <key>StandardErrorPath</key>
24
+ <string>{{LOG_DIR}}/wake.stderr.log</string>
25
+
26
+ <key>EnvironmentVariables</key>
27
+ <dict>
28
+ <key>PATH</key>
29
+ <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
30
+ </dict>
31
+ </dict>
32
+ </plist>
@@ -14,6 +14,18 @@
14
14
  - 모노리스보다 모듈러 아키텍처 선호
15
15
  -->
16
16
 
17
+ ### Walwal-Harness Company Contract
18
+
19
+ walwal-harness는 단순 작업 파이프라인이 아니라 "회사 구조 + 자율 구조 + 하네스"다.
20
+
21
+ - Owner는 최초 GOAL과 escalation에만 관여한다. 최초 GOAL 이후 Owner 입력은 interrupt/additional request이며 회사가 대기하는 이유가 아니다.
22
+ - Dispatcher/CEO는 Owner와의 유일한 외부 창구다.
23
+ - Planner/COO는 GOAL을 work package, queue, 가설, plan으로 바꾼다.
24
+ - CTO는 구현, 아키텍처, 기술선택, runtime recovery 책임자다.
25
+ - CQO는 품질, 회귀, evidence, PASS/FAIL 책임자다.
26
+ - Service-Ops는 운영 신호, KPI, incident, monitor cadence 책임자다.
27
+ - Meeting-Manager는 상태표가 아니라 임원 회의록을 남긴다. 회의록에는 CEO/COO/CTO/CQO/Service-Ops의 Position, Evidence, Action이 있어야 한다.
28
+
17
29
  ## Code Style
18
30
 
19
31
  <!-- 코드 스타일 규칙을 여기에 작성하세요 -->
@@ -92,7 +92,7 @@ scripts/ # 하네스 스크립트 (init.js 가 동기화)
92
92
  ```
93
93
  .harness/
94
94
  ├── HARNESS.md # 이 파일
95
- ├── config.json # 하네스 설정 (mode_selection, behavior, flow gates)
95
+ ├── config.json # 하네스 설정 (company_mode, behavior, flow gates)
96
96
  ├── progress.json # 기계 판독 상태 (세션 오케스트레이션 SoT)
97
97
  ├── progress.log # 사람 판독 히스토리 (append-only)
98
98
  ├── handoff.json # 세션 전환 문서 (prompt, model, artifacts, regression)
@@ -143,7 +143,7 @@ Planner ─ ┐
143
143
  ▼
144
144
  CTO ── 실행 분할 ── ┐
145
145
  ▼ ▼
146
- Gen-BE ⇄ Gen-FE (병렬 / Team 모드)
146
+ Gen-BE ⇄ Gen-FE (회사모드 병렬 worker pool)
147
147
  │
148
148
  ▼
149
149
  CQO 적대적 검증 (early-exit chain)
@@ -183,12 +183,11 @@ Archive (sprint advance)
183
183
  - followup-review 자체에서 또 fork 금지 (무한 fork 방지).
184
184
  - 한 sprint 내 parallel fork ≥ 3 회면 다음 fork 는 single 강제.
185
185
 
186
- ## Solo / Team / Hypothesis 모드
186
+ ## Company / Hypothesis 실행
187
187
 
188
- | 모드 | 트리거 | 실행 |
188
+ | 실행 | 트리거 | 동작 |
189
189
  |------|--------|------|
190
- | **Solo** | 기본 | 한 번에 한 에이전트 spawn (1개 슬롯 유지) |
191
- | **Team** | `progress.json.mode = "team"` (Owner 또는 Conductor 결정) | 매 tick `min(ready, 3)` 동시 spawn, parallel evaluator |
190
+ | **Company** | 기본값 | Conductor 가 매 tick `min(ready, 3)` 병렬 worker 를 자동 배정 |
192
191
  | **Hypothesis** | Planner `requested_mode = "hypothesis"` | `documentationer → coo-developer → documentationer → planner` 가설 검증 루프 |
193
192
 
194
193
  ## 품질 게이트
@@ -215,9 +214,10 @@ Archive (sprint advance)
215
214
  | `npx walwal-harness` | 첫 설치 / 안전 init (G-NNN, C-NNN 보존) |
216
215
  | `npx walwal-harness --force` | 시스템 파일 강제 갱신 (G/C entry 는 여전히 보존) |
217
216
  | `npx walwal-harness migrate` | 구버전 progress.json / config.json schema 정상화 |
218
- | `npx walwal-harness team` | tmux/iTerm Team 스튜디오 기동 |
217
+ | `npx walwal-harness verify` | 설치 정합성 검증 |
219
218
  | `bash scripts/harness-dashboard-up.sh` | Brick Office 라이브 대시보드 (http://localhost:3001) |
220
- | `bash scripts/harness-session-start.sh` | SessionStart 훅 (자동 호출) |
219
+ | `bash scripts/harness-wake-install.sh install .` | 1시간 안전망 wake 등록 (launchd) |
220
+ | `bash scripts/harness-wake-install.sh status` | wake 상태 / 등록 프로젝트 확인 |
221
221
 
222
222
  ## 다음 단계
223
223
 
@@ -2,7 +2,7 @@
2
2
  "harness": {
3
3
  "name": "walwal-harness — NEXUS company harness",
4
4
  "version": "6.1.4",
5
- "description": "NEXUS-adapted company metaphor for AI-agent engineering. Owner ↔ Dispatcher(CEO) ↔ Conductor + Meeting-Manager ↔ Planner(COO/HR) + CTO + CQO + Service-Ops. Generators (BE/FE/Designer/DevOps) + Evaluators (Functional/Visual/Code-Quality/Architecture/Security) + COO Hypothesis Cell. Solo/Team modes, parallel-tracks fork-join meetings, hierarchical Conventions/Gotchas. React/Next.js/Flutter FE, NestJS/Laravel BE.",
5
+ "description": "NEXUS-adapted company metaphor for AI-agent engineering. Owner ↔ Dispatcher(CEO) ↔ Conductor + Meeting-Manager ↔ Planner(COO/HR) + CTO + CQO + Service-Ops. Generators (BE/FE/Designer/DevOps) + Evaluators (Functional/Visual/Code-Quality/Architecture/Security) + COO Hypothesis Cell. Always-on company mode, parallel worker pool, parallel-tracks fork-join meetings, hierarchical Conventions/Gotchas. React/Next.js/Flutter FE, NestJS/Laravel BE.",
6
6
  "source": "https://www.anthropic.com/engineering/harness-design-long-running-apps"
7
7
  },
8
8
  "agents": {
@@ -207,7 +207,7 @@
207
207
  "on_fail": "reroute_to_generator"
208
208
  },
209
209
  "team": {
210
- "comment": "Team Mode 설정. /harness-team 커맨드로 실행.",
210
+ "comment": "Company worker pool 설정. 회사모드에서 항상 사용.",
211
211
  "concurrency": 3,
212
212
  "max_retries_per_feature": 5,
213
213
  "escalate_after": 3,
@@ -349,32 +349,30 @@
349
349
  "re_notify_every_seconds": 3600,
350
350
  "owner": "session-start"
351
351
  },
352
- "mode_selection": {
353
- "comment": "v6.0 — Solo/Team 모드를 사용자가 아닌 Conductor 가 결정. progress.json.mode='auto' 일 때 Conductor 가 feature-list 의 ready_count + 의존성 깊이 + sprint feature 수를 보고 룰을 적용. 사용자는 /harness-solo 또는 /harness-team 으로 override 가능하며 그 결정은 progress.json.mode_decision.user_override 에 기록된다.",
354
- "default_mode": "auto",
352
+ "company_mode": {
353
+ "comment": "v6.3 — 회사모드는 항시 활성이다. 사용자 모드 선택과 tie-breaker 는 제거됐다. Conductor 는 feature-list/queue 를 기반으로 매 tick 가능한 병렬 작업을 자동 배정한다.",
354
+ "default_mode": "company",
355
355
  "owner": "conductor",
356
- "rules": {
357
- "force_team_when": {
358
- "ready_at_start_gte": 3,
359
- "feature_count_gte": 6,
360
- "critical_path_depth_lte": 2,
361
- "rationale": "ready≥3 + 작은 critical path = 3팀 동시 가동의 P4 Parallel Workstreams 효과 충족 (NEXUS 40~60% 단축)"
362
- },
363
- "force_solo_when": {
364
- "ready_at_start_lte": 2,
365
- "or_feature_count_lte": 3,
366
- "or_critical_path_depth_gte": 4,
367
- "rationale": "직렬 의존 우세 → Team 으로 띄워도 2팀이 유휴. tmux 운영 비용·토큰 3x 정당화 안 됨."
368
- },
369
- "tie_breaker": "solo",
370
- "tie_breaker_rationale": "동률 시 비용 안전한 Solo 선호. 사용자가 명시적으로 team 선택 시만 force."
371
- },
372
- "user_override": {
373
- "comment": "사용자가 명시적으로 모드 강제하면 Conductor 결정 무시. progress.json.mode_decision.user_override 에 기록.",
374
- "channels": [
375
- "/harness-solo (force solo)",
376
- "/harness-team (force team)",
377
- "사용자 발화: 'solo 로', 'team 으로', 'auto 다시' (auto 복귀)"
356
+ "worker_concurrency": 3,
357
+ "worker_spawn": "claude",
358
+ "worker_spawn_description": "claude 이면 idle worker 배정 시 `claude -p` 백그라운드 프로세스를 띄운다. record 로 두면 prompt/log만 생성한다.",
359
+ "autonomous": true,
360
+ "parallel_by_default": true
361
+ },
362
+ "runtime": {
363
+ "production": {
364
+ "comment": "Owner+CEO+CTO 합의로만 services[] 를 수정한다. live=true 이고 services[] 가 있으면 Service-Ops 는 매 hourly review 마다 port/health/log 상태를 운영보고서에 남긴다.",
365
+ "live": false,
366
+ "services": [
367
+ {
368
+ "name": "example-api",
369
+ "host": "127.0.0.1",
370
+ "port": 3000,
371
+ "health_path": "/health",
372
+ "expected_status": 200,
373
+ "log_path": null,
374
+ "cadence_seconds": 3600
375
+ }
378
376
  ]
379
377
  }
380
378
  },
@@ -65,7 +65,7 @@ docmeta:
65
65
  5. `result PASS`는 **SCORE ≥ 2.80**인 경우에만 기록. score=1.00을 PASS로 기록 금지.
66
66
  6. 각 단계마다 **어떤 도구/방법으로 검증했는지**(tsc/eslint/curl/playwright 등) 명시.
67
67
  - **Context**: 사용자가 대시보드 로그만 보고 진행 상황을 파악해야 하는데, 기존 축약 로그로는 4대 질문에 답이 안 보인다는 피드백.
68
- - **Applies to**: Team Worker(Generator + Evaluator), Solo Mode Generator/Evaluator, 모든 `logev` 호출 지점.
68
+ - **Applies to**: Company Worker(Generator + Evaluator), 모든 `logev` 호출 지점.
69
69
 
70
70
  ### [M-NEXUS-P3] Owner ↔ CEO 단일 창구 + 자율 실행 (Inviolable)
71
71
  - **Date**: 2026-05-07
@@ -77,10 +77,24 @@ docmeta:
77
77
  - **Context**: v6.0.0 publish 직후 dispatcher 응답이 사용자를 "CEO 직접 리뷰…" 로 호명하고 "/harness-next 자동 진행하시겠습니까?" 로 사용자 펌프를 요구함. Owner 의 명시적 교정.
78
78
  - **Applies to**:
79
79
  - **Dispatcher**: 사용자 호칭/응답 문구, GOAL 정립, 모든 inbound/outbound owner 통신. → anti-pattern: `.harness/gotchas/dispatcher.md` [G-001]~[G-004].
80
- - **Conductor**: GOAL 확정 직후 자동 시동 (사용자 허락 X), Eval PASS/FAIL 직후 자동 advance/retry, mode 결정 (config.json `mode_selection.rules`).
80
+ - **Conductor**: GOAL 확정 직후 자동 시동 (사용자 허락 X), Eval PASS/FAIL 직후 자동 advance/retry, 회사모드 병렬 worker pool 관리.
81
81
  - **Planner / CTO / CQO / Generator / Evaluator / Service-Ops**: Owner 와 직접 대화 X. 모든 통신은 Dispatcher 경유.
82
82
  - **Why this matters**: 회사가 매 단계 사용자 허락을 구하면 NEXUS 메타포 자체가 무너진다. P3 "Continuous Loop > End-of-Pipeline" 가 약속하는 95% 결함 차단·40~60% 단축은 자율 루프에서만 성립한다.
83
83
 
84
+ ### [M-SYS-EXEC-ROLE-CONTRACT] 회사 역할 계약은 하네스 SoT에서 자동 적용되어야 한다
85
+ - **Date**: 2026-05-10
86
+ - **Status**: verified
87
+ - **TTL**: 영구
88
+ - **Lesson**: CEO/COO/CTO/CQO/Service-Ops가 무엇을 해야 하고 무엇을 하면 안 되는지는 일회성 wake prompt나 개별 회의 문구가 아니라 하네스의 convention/gotcha/memory SoT에 있어야 한다. 모든 에이전트는 세션 시작 시 `CONVENTIONS.md`, `.harness/conventions/shared.md`, 자기 role convention, 자기 gotcha, `.harness/memory.md` 순서로 읽고 이 계약을 적용한다.
89
+ - **Context**: Owner가 Paperclip과 비교하며 현재 하네스는 각 임원이 자기 역할을 명확히 이해하고 일한다는 느낌이 없다고 지적했다. 원인은 역할 계약이 문서에는 있었지만 hourly/review 실행 경로와 worker prompt가 이를 자동 적용하지 않고 상태 리포트만 만든 데 있었다.
90
+ - **Applies to**:
91
+ - **Dispatcher/CEO**: Owner-facing 창구와 GOAL/escalation 책임.
92
+ - **Planner/COO**: GOAL → work package/queue/가설 변환 책임.
93
+ - **CTO**: 구현/아키텍처/runtime recovery 책임.
94
+ - **CQO**: evidence/PASS/FAIL/회귀 검증 책임.
95
+ - **Service-Ops**: 운영 신호를 회의 evidence와 CTO/CQO action으로 연결.
96
+ - **Meeting-Manager**: 상태표가 아니라 임원 회의록을 남김.
97
+
84
98
  ### [M-002] FE Evaluation은 Playwright 필수
85
99
  - **Date**: 2026-04-20
86
100
  - **Status**: verified
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "version": 4,
3
- "mode": "auto",
3
+ "mode": "company",
4
4
  "mode_decision": {
5
5
  "owner": "conductor",
6
6
  "decided_at": null,
7
- "rationale": null,
8
- "user_override": null
7
+ "rationale": "company mode is always-on",
8
+ "policy": "always_company_parallel"
9
9
  },
10
10
  "project_name": "",
11
11
  "pipeline": null,
@@ -47,8 +47,9 @@
47
47
  "api-contract.json": { "status": "pending", "updated_by": null, "updated_at": null },
48
48
  "sprint-contract.md": { "status": "pending", "updated_by": null, "updated_at": null }
49
49
  },
50
- "team_state": {
51
- "active_teams": 0,
50
+ "company_state": {
51
+ "active_workers": 0,
52
+ "concurrency": 3,
52
53
  "paused_at": null,
53
54
  "resume_from": null
54
55
  },