@walwal-harness/cli 6.1.0 → 6.1.2

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.
@@ -342,6 +342,13 @@
342
342
  "auto_route_dispatcher": true,
343
343
  "auto_route_dispatcher_description": "true 이면 사용자의 모든 프롬프트가 harness-dispatcher 경유로 분류/라우팅 된다. 사용자가 'harness skip' 등을 말하면 단일 메시지 한정으로 건너뛴다."
344
344
  },
345
+ "token_limit": {
346
+ "comment": "모델 토큰 제한으로 작업이 중단됐을 때의 저비용 재개 정책. 별도 probe 호출 없이 시간 기반으로만 재개 알림을 계산한다.",
347
+ "stop_reason_flag": "TokenLimit",
348
+ "retry_after_seconds": 3600,
349
+ "re_notify_every_seconds": 3600,
350
+ "owner": "session-start"
351
+ },
345
352
  "mode_selection": {
346
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 에 기록된다.",
347
354
  "default_mode": "auto",
@@ -28,6 +28,19 @@
28
28
  "message": null,
29
29
  "retry_target": null
30
30
  },
31
+ "task_stop": {
32
+ "active": false,
33
+ "reason": null,
34
+ "stopped_at": null,
35
+ "resume_after": null,
36
+ "resume_ready": false,
37
+ "resume_notified_at": null,
38
+ "wake_target": null,
39
+ "stopped_agent": null,
40
+ "stopped_next_agent": null,
41
+ "task_session_path": null,
42
+ "hold_count": 0
43
+ },
31
44
  "artifacts": {
32
45
  "plan.md": { "status": "pending", "updated_by": null, "updated_at": null },
33
46
  "feature-list.json": { "status": "pending", "updated_by": null, "updated_at": null },
@@ -0,0 +1,13 @@
1
+ # Gotchas — COO Developer
2
+
3
+ ### [G-001] 운영코드와 실험코드 혼동 <!-- rule_id: coo-developer-experiment-vs-production -->
4
+ - **Status**: unverified
5
+ - **Date**: 2026-05-08
6
+ - **Source**: planner:manual
7
+ - **Trigger**: COO 직속 가설검증 셀 신설
8
+ - **Wrong**: spike 코드를 운영 경로의 정본처럼 다룸
9
+ - **Right**: 실험 코드는 실험으로 남기고, 정규화가 필요하면 Planner가 다시 Sprint artifact로 승격
10
+ - **Why**: 이 셀의 목적은 빠른 사실 확인이지 운영 품질 보장이 아니다
11
+ - **Scope**: `coo-developer`의 모든 실험 작업
12
+ - **Occurrences**: 1
13
+ - **Last-Seen**: 2026-05-08
@@ -0,0 +1,13 @@
1
+ # Gotchas — Documentationer
2
+
3
+ ### [G-001] 보고서가 근거를 앞서감 <!-- rule_id: documentationer-claim-without-evidence -->
4
+ - **Status**: unverified
5
+ - **Date**: 2026-05-08
6
+ - **Source**: planner:manual
7
+ - **Trigger**: COO 직속 가설검증 셀 신설
8
+ - **Wrong**: 리서치나 실험 근거보다 해석을 먼저 확정함
9
+ - **Right**: evidence를 명시하고, 판정은 유효/무효/보류 중 하나로 제한
10
+ - **Why**: Documentationer의 산출물은 COO 의사결정의 입력이며, 환상적 확신을 만들면 안 된다
11
+ - **Scope**: `documentationer`의 모든 보고서와 브리프
12
+ - **Occurrences**: 1
13
+ - **Last-Seen**: 2026-05-08
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@walwal-harness/cli",
3
- "version": "6.1.0",
3
+ "version": "6.1.2",
4
4
  "description": "Production harness for AI agent engineering — NEXUS-adapted company metaphor (Dispatcher/CEO + Conductor + Meeting-Manager + COO/Planner + CTO + CQO + Service-Ops). Solo/Team mode, Brainstormer, Planner, Generator(BE/FE/Designer/DevOps), Evaluator chain (Code-Quality → Functional → Visual + Architecture/Security). Supports React, Next.js, and Flutter FE stacks.",
5
5
  "bin": {
6
6
  "walwal-harness": "bin/init.js"
@@ -25,6 +25,8 @@ pipeline=$(jq -r '.pipeline // "null"' "$PROGRESS")
25
25
  mode=$(jq -r '.mode // "auto"' "$PROGRESS")
26
26
  user_override=$(jq -r '.mode_decision.user_override // "null"' "$PROGRESS")
27
27
  requested_mode=$(jq -r '.service_ops.requested_mode // "null"' "$PROGRESS")
28
+ planner_requested_mode=$(jq -r '.planner.requested_mode // "null"' "$PROGRESS")
29
+ planner_last_brief=$(jq -r '.planner.last_brief // "null"' "$PROGRESS")
28
30
  goal_adherence=$(jq -r '.goals.current_adherence // "null"' "$PROGRESS")
29
31
  meetings_active_count=$(jq -r '(.meetings.active | length) // 0' "$PROGRESS")
30
32
  cqo_verdict=$(jq -r '.cqo.sprint_verdict // "pending"' "$PROGRESS")
@@ -258,12 +260,44 @@ elif [ "$current_agent" = "meeting-manager" ] && [ "$agent_status" = "completed"
258
260
  }"
259
261
 
260
262
  elif [ "$current_agent" = "planner" ] && [ "$agent_status" = "completed" ]; then
261
- next="cto"
262
- action="handoff:cto:plan-ready"
263
- new_workflow_stage="cto-review"
264
- planner_filter='
265
- .planner.last_brief = (.planner.requested_mode // "goal-alignment") |
266
- .planner.requested_mode = null'
263
+ if [ "$planner_requested_mode" = "hypothesis" ]; then
264
+ next="documentationer"
265
+ action="dispatch:hypothesis:documentationer"
266
+ new_workflow_stage="coo-hypothesis-research"
267
+ planner_filter='
268
+ .planner.last_brief = "hypothesis:research" |
269
+ .planner.requested_mode = null'
270
+ else
271
+ next="cto"
272
+ action="handoff:cto:plan-ready"
273
+ new_workflow_stage="cto-review"
274
+ planner_filter='
275
+ .planner.last_brief = (.planner.requested_mode // "goal-alignment") |
276
+ .planner.requested_mode = null'
277
+ fi
278
+
279
+ elif [ "$current_agent" = "documentationer" ] && [ "$agent_status" = "completed" ]; then
280
+ if [ "$planner_last_brief" = "hypothesis:research" ]; then
281
+ next="coo-developer"
282
+ action="dispatch:hypothesis:experiment"
283
+ new_workflow_stage="coo-hypothesis-experiment"
284
+ planner_filter='.planner.last_brief = "hypothesis:experiment"'
285
+ elif [ "$planner_last_brief" = "hypothesis:report" ]; then
286
+ next="planner"
287
+ action="dispatch:planner:hypothesis-verdict"
288
+ new_workflow_stage="coo-hypothesis-verdict"
289
+ planner_filter='
290
+ .planner.last_brief = "hypothesis:done" |
291
+ .planner.requested_mode = "hypothesis-verdict"'
292
+ fi
293
+
294
+ elif [ "$current_agent" = "coo-developer" ] && [ "$agent_status" = "completed" ]; then
295
+ if [ "$planner_last_brief" = "hypothesis:experiment" ]; then
296
+ next="documentationer"
297
+ action="dispatch:hypothesis:report"
298
+ new_workflow_stage="coo-hypothesis-report"
299
+ planner_filter='.planner.last_brief = "hypothesis:report"'
300
+ fi
267
301
 
268
302
  elif [ "$current_agent" = "cto" ]; then
269
303
  if [ "${cto_hotfixes:-0}" -gt 0 ] || [ "${ops_recommendations:-0}" -gt 0 ]; then
@@ -27,6 +27,23 @@ next_agent=$(jq -r '.next_agent // "none"' "$PROGRESS" 2>/dev/null)
27
27
  agent_status=$(jq -r '.agent_status // "pending"' "$PROGRESS" 2>/dev/null)
28
28
  mode=$(jq -r '.mode // "team"' "$PROGRESS" 2>/dev/null)
29
29
  conductor_state=$(jq -r '.conductor.state // "idle"' "$PROGRESS" 2>/dev/null)
30
+ task_stop_active=$(jq -r '.task_stop.active // false' "$PROGRESS" 2>/dev/null)
31
+ task_stop_reason=$(jq -r '.task_stop.reason // "null"' "$PROGRESS" 2>/dev/null)
32
+ task_stop_resume_after=$(jq -r '.task_stop.resume_after // "null"' "$PROGRESS" 2>/dev/null)
33
+ task_stop_notified_at=$(jq -r '.task_stop.resume_notified_at // "null"' "$PROGRESS" 2>/dev/null)
34
+ task_stop_wake_target=$(jq -r '.task_stop.wake_target // .next_agent // "none"' "$PROGRESS" 2>/dev/null)
35
+ task_stop_task_session=$(jq -r '.task_stop.task_session_path // "null"' "$PROGRESS" 2>/dev/null)
36
+
37
+ parse_iso_epoch() {
38
+ local iso="${1:-}"
39
+ [ -n "$iso" ] && [ "$iso" != "null" ] || return 1
40
+ date -u -j -f "%Y-%m-%dT%H:%M:%SZ" "$iso" "+%s" 2>/dev/null \
41
+ || date -u -d "$iso" "+%s" 2>/dev/null
42
+ }
43
+
44
+ now_epoch() {
45
+ date -u "+%s"
46
+ }
30
47
 
31
48
  # ─────────────────────────────────────────
32
49
  # Auto-heal mode drift — Team 상태 유실 복구
@@ -79,6 +96,43 @@ if [ "$mode" = "paused" ]; then
79
96
  exit 0
80
97
  fi
81
98
 
99
+ # ─────────────────────────────────────────
100
+ # TokenLimit hold — zero-token resume reminder
101
+ # ─────────────────────────────────────────
102
+ if [ "$task_stop_active" = "true" ] && [ "$task_stop_reason" = "TokenLimit" ]; then
103
+ retry_interval=$(jq -r '.token_limit.re_notify_every_seconds // 3600' "$CONFIG" 2>/dev/null || echo 3600)
104
+ resume_after_epoch=$(parse_iso_epoch "$task_stop_resume_after" || echo 0)
105
+ now_ts=$(now_epoch)
106
+ notified_epoch=$(parse_iso_epoch "$task_stop_notified_at" || echo 0)
107
+
108
+ if [ "$now_ts" -lt "$resume_after_epoch" ]; then
109
+ echo "# Harness paused — TokenLimit hold"
110
+ echo "# Wake target: /harness-${task_stop_wake_target}"
111
+ echo "# Retry after: ${task_stop_resume_after}"
112
+ if [ "$task_stop_task_session" != "null" ] && [ -n "$task_stop_task_session" ]; then
113
+ echo "# Task session: ${task_stop_task_session}"
114
+ fi
115
+ exit 0
116
+ fi
117
+
118
+ if [ "$notified_epoch" -eq 0 ] || [ $((now_ts - notified_epoch)) -ge "$retry_interval" ]; then
119
+ bash "$SCRIPT_DIR/harness-progress-set.sh" "$PROJECT_ROOT" \
120
+ ".agent_status = \"pending\" |
121
+ .current_agent = null |
122
+ .next_agent = \"${task_stop_wake_target}\" |
123
+ .task_stop.active = false |
124
+ .task_stop.resume_ready = true |
125
+ .task_stop.resume_notified_at = (now | todate)" \
126
+ >/dev/null 2>&1 || true
127
+ echo "# Harness resume ready — TokenLimit hold expired"
128
+ echo "# Resume target: /harness-${task_stop_wake_target}"
129
+ if [ "$task_stop_task_session" != "null" ] && [ -n "$task_stop_task_session" ]; then
130
+ echo "# Resume with task session: ${task_stop_task_session}"
131
+ fi
132
+ exit 0
133
+ fi
134
+ fi
135
+
82
136
  # ─────────────────────────────────────────
83
137
  # init 상태: 첫 안내
84
138
  # ─────────────────────────────────────────
@@ -0,0 +1,99 @@
1
+ #!/bin/bash
2
+ # harness-token-limit.sh — mark/resume token-limit interruptions
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
6
+ source "$SCRIPT_DIR/lib/harness-render-progress.sh"
7
+
8
+ PROJECT_ROOT="$(resolve_harness_root "${1:-.}")" || exit 1
9
+ CMD="${2:-mark}"
10
+
11
+ PROGRESS="$PROJECT_ROOT/.harness/progress.json"
12
+ CONFIG="$PROJECT_ROOT/.harness/config.json"
13
+
14
+ [ -f "$PROGRESS" ] || exit 1
15
+ command -v jq >/dev/null 2>&1 || exit 1
16
+
17
+ parse_iso_epoch() {
18
+ local iso="${1:-}"
19
+ [ -n "$iso" ] && [ "$iso" != "null" ] || return 1
20
+ date -u -j -f "%Y-%m-%dT%H:%M:%SZ" "$iso" "+%s" 2>/dev/null \
21
+ || date -u -d "$iso" "+%s" 2>/dev/null
22
+ }
23
+
24
+ mark_token_limit() {
25
+ local retry_secs current next task_path target stop_reason
26
+ retry_secs="${3:-$(jq -r '.token_limit.retry_after_seconds // 3600' "$CONFIG" 2>/dev/null || echo 3600)}"
27
+ stop_reason=$(jq -r '.token_limit.stop_reason_flag // "TokenLimit"' "$CONFIG" 2>/dev/null || echo "TokenLimit")
28
+ current=$(jq -r '.current_agent // "null"' "$PROGRESS")
29
+ next=$(jq -r '.next_agent // "null"' "$PROGRESS")
30
+ task_path=$(jq -r '.task_sessions.current.path // "null"' "$PROGRESS")
31
+ target="$current"
32
+ if [ "$target" = "null" ] || [ -z "$target" ]; then
33
+ target="$next"
34
+ fi
35
+ [ "$target" != "null" ] || target="dispatcher"
36
+
37
+ local stopped_at resume_after
38
+ stopped_at="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
39
+ resume_after="$(date -u -v+"${retry_secs}"S +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \
40
+ || date -u -d "+${retry_secs} seconds" +%Y-%m-%dT%H:%M:%SZ)"
41
+
42
+ bash "$SCRIPT_DIR/harness-progress-set.sh" "$PROJECT_ROOT" "
43
+ .agent_status = \"paused\" |
44
+ .next_agent = \"$target\" |
45
+ .task_stop.active = true |
46
+ .task_stop.reason = \"$stop_reason\" |
47
+ .task_stop.stopped_at = \"$stopped_at\" |
48
+ .task_stop.resume_after = \"$resume_after\" |
49
+ .task_stop.resume_ready = false |
50
+ .task_stop.resume_notified_at = null |
51
+ .task_stop.wake_target = \"$target\" |
52
+ .task_stop.stopped_agent = $(jq -Rn --arg v "$current" '$v') |
53
+ .task_stop.stopped_next_agent = $(jq -Rn --arg v "$next" '$v') |
54
+ .task_stop.task_session_path = $(jq -Rn --arg v "$task_path" '$v') |
55
+ .task_stop.hold_count = ((.task_stop.hold_count // 0) + 1)
56
+ " >/dev/null
57
+
58
+ echo "[token-limit] marked: target=$target resume_after=$resume_after"
59
+ }
60
+
61
+ resume_probe() {
62
+ local active reason resume_after wake_target
63
+ active=$(jq -r '.task_stop.active // false' "$PROGRESS")
64
+ reason=$(jq -r '.task_stop.reason // "null"' "$PROGRESS")
65
+ resume_after=$(jq -r '.task_stop.resume_after // "null"' "$PROGRESS")
66
+ wake_target=$(jq -r '.task_stop.wake_target // .next_agent // "null"' "$PROGRESS")
67
+
68
+ if [ "$active" != "true" ] || [ "$reason" != "TokenLimit" ]; then
69
+ echo "[token-limit] no active TokenLimit hold"
70
+ exit 0
71
+ fi
72
+
73
+ local resume_epoch now_ts
74
+ resume_epoch=$(parse_iso_epoch "$resume_after" || echo 0)
75
+ now_ts=$(date -u "+%s")
76
+ if [ "$now_ts" -lt "$resume_epoch" ]; then
77
+ echo "[token-limit] still held until $resume_after"
78
+ exit 1
79
+ fi
80
+
81
+ bash "$SCRIPT_DIR/harness-progress-set.sh" "$PROJECT_ROOT" "
82
+ .agent_status = \"pending\" |
83
+ .current_agent = null |
84
+ .next_agent = \"$wake_target\" |
85
+ .task_stop.active = false |
86
+ .task_stop.resume_ready = true |
87
+ .task_stop.resume_notified_at = (now | todate)
88
+ " >/dev/null
89
+ echo "[token-limit] resume ready: wake_target=$wake_target"
90
+ }
91
+
92
+ case "$CMD" in
93
+ mark) mark_token_limit "$@" ;;
94
+ resume-probe) resume_probe ;;
95
+ *)
96
+ echo "usage: $0 <project-root> <mark|resume-probe> [retry_seconds]" >&2
97
+ exit 2
98
+ ;;
99
+ esac
@@ -42,6 +42,17 @@ if [ -f "$CWD/.harness/progress.json" ] && command -v jq >/dev/null 2>&1; then
42
42
  AGENT_STATUS=$(jq -r '.agent_status // "pending"' "$CWD/.harness/progress.json" 2>/dev/null || echo "pending")
43
43
  fi
44
44
 
45
+ TASK_STOP_ACTIVE="false"
46
+ TASK_STOP_REASON="null"
47
+ TASK_STOP_RESUME_AFTER="null"
48
+ TASK_STOP_WAKE_TARGET="none"
49
+ if [ -f "$CWD/.harness/progress.json" ] && command -v jq >/dev/null 2>&1; then
50
+ TASK_STOP_ACTIVE=$(jq -r '.task_stop.active // false' "$CWD/.harness/progress.json" 2>/dev/null || echo "false")
51
+ TASK_STOP_REASON=$(jq -r '.task_stop.reason // "null"' "$CWD/.harness/progress.json" 2>/dev/null || echo "null")
52
+ TASK_STOP_RESUME_AFTER=$(jq -r '.task_stop.resume_after // "null"' "$CWD/.harness/progress.json" 2>/dev/null || echo "null")
53
+ TASK_STOP_WAKE_TARGET=$(jq -r '.task_stop.wake_target // .next_agent // "none"' "$CWD/.harness/progress.json" 2>/dev/null || echo "none")
54
+ fi
55
+
45
56
  # ── 명령 히스토리 기록 (모든 모드 공통) ──
46
57
  PROGRESS_LOG="$CWD/.harness/progress.log"
47
58
  if [ -n "$PROMPT" ] && [ -d "$CWD/.harness" ]; then
@@ -79,6 +90,18 @@ EOF
79
90
  exit 0
80
91
  fi
81
92
 
93
+ if [ "$TASK_STOP_ACTIVE" = "true" ] && [ "$TASK_STOP_REASON" = "TokenLimit" ]; then
94
+ cat <<EOF
95
+ [harness] token-limit hold | wake_target=${TASK_STOP_WAKE_TARGET}
96
+ ## TokenLimit Hold
97
+ - 모든 작업은 일시중지 상태입니다.
98
+ - 재개 대상: /harness-${TASK_STOP_WAKE_TARGET}
99
+ - retry_after: ${TASK_STOP_RESUME_AFTER}
100
+ - 이 상태는 문서 기반으로만 복구되며, 별도 모델 probe는 수행하지 않습니다.
101
+ EOF
102
+ exit 0
103
+ fi
104
+
82
105
  # ── Mode 기반 분기 ──
83
106
  MODE="team"
84
107
  if [ -f "$CWD/.harness/progress.json" ] && command -v jq >/dev/null 2>&1; then
@@ -142,10 +142,17 @@ idle ─► running ─► (waiting_meeting | waiting_owner | running) ─► co
142
142
  [all features PASS] → Phase Gate Meeting
143
143
  [Service-Ops cron due] → spawn service-ops (requested_mode=monitor)
144
144
  [ops-report ready] → handoff to CTO (spawn cto)
145
+ [planner requested_mode=hypothesis]→ spawn coo-developer and/or documentationer
145
146
  [generator-* / eval-functional spawn 직전] → 동시 spawn service-ops (requested_mode=monitor, stream-mode, G-006)
146
147
  [mode=team & ready ≥ 2] → 동시 spawn min(ready,3) generator/evaluator (G-005)
147
148
  ```
148
149
 
150
+ `planner.requested_mode == "hypothesis"` 인 경우 Conductor 는 정규 Generator/Evaluator 체인보다 COO 직속 셀을 우선한다:
151
+
152
+ - 리서치·정리 중심 → `documentationer`
153
+ - 빠른 실험·백데이터 코드 중심 → `coo-developer`
154
+ - 둘 다 필요 → 같은 tick 에 2명 병렬 spawn 가능
155
+
149
156
  ### 5.1 Team mode 병렬 spawn (G-005)
150
157
 
151
158
  `progress.json.mode == "team"` 이면 매 tick 시작 시 ready 목록을 계산하여 **동시 다발 spawn**:
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: harness-coo-developer
3
+ description: "COO 직속 가설검증 개발자. 빠른 spike, 백데이터 활용 실험, throwaway prototype 을 통해 가설을 사실로 검증한다. 아키텍처·코드퀄리티·테스트 완결성보다 속도와 의사결정용 evidence를 우선한다. 트리거: '가설 검증 개발', 'spike', 'backdata experiment'."
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # COO Developer
8
+
9
+ > 목적은 운영용 코드를 만드는 것이 아니라, COO가 다음 결정을 내릴 수 있게 충분한 사실을 빠르게 확보하는 것이다.
10
+
11
+ ## 1. 책임
12
+
13
+ - 가설을 검증하기 위한 최소 코드 작성
14
+ - 백데이터/로그/덤프를 활용한 검증 스크립트 작성
15
+ - 프로덕션 품질보다 속도 우선의 throwaway prototype 제작
16
+ - 결과와 한계를 `documentationer` 또는 Planner에 넘길 수 있는 형태로 정리
17
+
18
+ ## 2. 입력
19
+
20
+ - CEO 또는 Service-Ops에서 전달된 가설/질문
21
+ - Planner의 `requested_mode = "hypothesis"`
22
+ - 기존 코드베이스, 로컬 데이터, 백데이터, 샘플 CSV/JSON/DB dump
23
+
24
+ ## 3. 출력
25
+
26
+ - 실험 코드 또는 스크립트
27
+ - 재현 절차
28
+ - 관찰 결과와 한계
29
+ - "가설 지지 / 반박 / 추가 데이터 필요" 3분류 결론
30
+
31
+ ## 4. 작업 원칙
32
+
33
+ - 빠르게 버릴 수 있는 코드를 두려워하지 말 것
34
+ - 운영 아키텍처에 맞추려다 속도를 잃지 말 것
35
+ - 단, 데이터 훼손이나 destructive action은 금지
36
+ - 결과가 정규화 가치가 있으면 Planner에게 Sprint artifact 승격을 요청
37
+
38
+ ## 5. 금지
39
+
40
+ - 실험 결과만으로 운영 가능 판정
41
+ - 정규 팀 평가 없이 배포 코드로 승격
42
+ - 근거 없는 직감성 결론
@@ -83,6 +83,7 @@ Source: https://github.com/msitarzewski/agency-agents (MIT)
83
83
  | Enterprise Feature | "기존 시스템", "엔터프라이즈", "통합" | + Eval-Arch·Eval-Security·Service-Ops |
84
84
  | Marketing/Content | "랜딩", "캠페인", "콘텐츠" | Designer·Marketing(옵트인)·Eval-Visual |
85
85
  | Incident Response | "장애", "다운", "긴급", "롤백" | Incident-Responder·Service-Ops·관련 Gen |
86
+ | Hypothesis Validation | "가설", "리서치", "실험", "백데이터", "빠르게 검증" | Planner·coo-developer·documentationer·Service-Ops(옵트인) |
86
87
 
87
88
  매칭 실패 시 → "추가 정보가 필요합니다" 1회 질문 → 그래도 모호하면 **Startup MVP** 기본값.
88
89
 
@@ -96,7 +97,7 @@ Source: https://github.com/msitarzewski/agency-agents (MIT)
96
97
  "runbook": "startup-mvp",
97
98
  "departments": {
98
99
  "must": ["planner","cto","cqo","conductor","meeting-manager","generator-backend","generator-frontend","generator-designer","evaluator-functional","evaluator-visual","evaluator-code-quality","generator-devops"],
99
- "should":["evaluator-architecture","service-ops"],
100
+ "should":["evaluator-architecture","service-ops","coo-developer","documentationer"],
100
101
  "may": ["evaluator-security","marketing","sales"],
101
102
  "off": ["finance","legal-compliance","spatial-computing"]
102
103
  },
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: harness-documentationer
3
+ description: "COO 직속 Documentationer. 웹 리서치, 실험 로그 정리, 보고서 작성, 가설 유효/무효 판정을 담당한다. 운영 문서보다는 의사결정 문서에 초점을 둔다. 트리거: 'report', 'documentation', 'research brief', 'hypothesis verdict'."
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # Documentationer
8
+
9
+ > 리서치와 실험을 문장으로 묶어 COO가 즉시 판단할 수 있는 보고서로 바꾼다.
10
+
11
+ ## 1. 책임
12
+
13
+ - 웹 리서치 기반 가설 보강
14
+ - `coo-developer` 실험 결과 정리
15
+ - 가설 검증 보고서 작성
16
+ - 가설의 유효/무효/보류 판정 및 근거 명시
17
+
18
+ ## 2. 입력
19
+
20
+ - Planner의 가설 브리프
21
+ - Service-Ops의 드리프트 신호 또는 신규 기획 방향
22
+ - `coo-developer`의 실험 결과
23
+ - 필요 시 외부 리서치 소스
24
+
25
+ ## 3. 출력
26
+
27
+ - `hypothesis-brief`
28
+ - `validation-report`
29
+ - `evidence-summary`
30
+ - 다음 액션 제안:
31
+ - 정규 Sprint로 승격
32
+ - 추가 실험 필요
33
+ - 폐기
34
+
35
+ ## 4. 보고서 규칙
36
+
37
+ - 결론 먼저, 근거 다음
38
+ - 주장마다 evidence 출처 명시
39
+ - 운영팀/CTO/CQO가 바로 이어받을 수 있게 열린 질문을 분리
40
+ - "왜 아직 확실하지 않은가"도 반드시 적을 것
41
+
42
+ ## 5. 금지
43
+
44
+ - evidence 없는 유효 판정
45
+ - CTO/CQO 검증을 대신했다고 표현
46
+ - 실험 로그를 정제 없이 그대로 보고서로 제출
@@ -152,6 +152,7 @@ Meeting-Manager는 단순히 "토론해 주세요"라고 말하지 않는다.
152
152
 
153
153
  - `Dispatcher/CEO`: Goal 자체가 흔들렸는가, Owner escalation 이 필요한가
154
154
  - `Planner/COO`: 기획/가설/웹리서치/레퍼런스 재검토가 필요한가
155
+ - `COO Hypothesis Cell`: 실험으로 바로 검증 가능한가, 어떤 백데이터/리서치가 필요한가
155
156
  - `CTO`: 구현/아키텍처/기술선택 문제가 원인인가
156
157
  - `CQO`: 품질/회귀/검증 부족이 원인인가
157
158
  - `Service-Ops`: KPI/로그/incident 기준으로 어떤 drift 가 발생했는가
@@ -140,6 +140,23 @@ hr_roster:
140
140
  ---
141
141
  ```
142
142
 
143
+ ### B-5. COO Direct Hypothesis Cell
144
+
145
+ Planner는 정규 Sprint 라인과 별도로 다음 2개 직속 역할을 운영할 수 있다:
146
+
147
+ - `coo-developer`: 빠른 spike, 백데이터 스크립트, throwaway prototype
148
+ - `documentationer`: 웹 리서치, 실험 로그 정리, 보고서, 가설 유효/무효 판정
149
+
150
+ 활성화 조건:
151
+ 1. CEO가 기획안 탐색 또는 미검증 아이디어 검토를 지시
152
+ 2. Service-Ops가 새 기획 방향 또는 drift 신호를 보고
153
+ 3. CTO/CQO 정규 라인에 넣기 전에 빠른 사실 확인이 필요
154
+
155
+ 운영 원칙:
156
+ - 산출물은 정규 구현물이 아니라 `hypothesis brief`, `experiment note`, `validation report`
157
+ - 코드 품질/테스트 완성도보다 의사결정 속도를 우선
158
+ - 결과가 유효하면 Planner가 이를 정규 Sprint artifact로 재작성해 CTO 라인에 넘긴다
159
+
143
160
  ## C. 권한 (보강)
144
161
 
145
162
  기존 권한에 추가: