@walwal-harness/cli 7.1.9 → 7.1.13
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/HR-Resource/ceo/SKILL.md +4 -4
- package/HR-Resource/cqo/SKILL.md +3 -3
- package/HR-Resource/cto/SKILL.md +4 -4
- package/README.md +25 -7
- package/apps/harness-dashboard/app/globals.css +9 -0
- package/apps/harness-dashboard/components/Drawer.tsx +52 -5
- package/apps/harness-dashboard/components/MissionTimeline.tsx +5 -1
- package/apps/harness-dashboard/components/OrgTree.tsx +7 -4
- package/apps/harness-dashboard/components/Scene.tsx +108 -100
- package/apps/harness-dashboard/components/drawer/MissionFlowTab.tsx +4 -1
- package/apps/harness-dashboard/components/drawer/OwnerHistoryTab.tsx +4 -0
- package/apps/harness-dashboard/lib/harness-state.ts +44 -13
- package/apps/harness-dashboard/lib/types.ts +2 -2
- package/assets/templates/AGENTS-ko.md.template +19 -6
- package/assets/templates/AGENTS.md.template +20 -7
- package/assets/templates/HARNESS.md +75 -199
- package/assets/templates/config.json +2 -2
- package/bin/init.js +11 -11
- package/commands/goal.md +6 -4
- package/commands/hot-fix.md +16 -13
- package/commands/submission.md +28 -0
- package/conventions/ceo.md +3 -3
- package/conventions/shared.md +4 -3
- package/package.json +1 -1
- package/scripts/harness-session-start.sh +1 -1
- package/scripts/harness-stop.sh +1 -1
- package/scripts/harness-user-prompt-submit.sh +12 -4
- package/scripts/harness-worker-evidence-validate.sh +8 -3
- package/scripts/import-agency-agents.js +1 -1
- package/scripts/init-agents-md.sh +17 -2
- package/assets/templates/AGENTS-ko /341/204/207/341/205/251/341/206/250/341/204/211/341/205/241/341/204/207/341/205/251/341/206/253.md" +0 -114
|
@@ -957,15 +957,41 @@ function readMissions(rootDir: string, limit = 15): MissionDoc[] {
|
|
|
957
957
|
const docsDir = path.join(rootDir, ".harness", "documents");
|
|
958
958
|
if (!existsSync(docsDir)) return [];
|
|
959
959
|
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
960
|
+
const missionDirs: Array<{ rel: string; abs: string }> = [];
|
|
961
|
+
const cxxDocNames = new Set(["ceo.md", "cto.md", "cqo.md", "coo.md", "cdo.md", "ops.md"]);
|
|
962
|
+
|
|
963
|
+
const collectMissionDirs = (baseDir: string, relPrefix = "") => {
|
|
964
|
+
let entries: Dirent[];
|
|
965
|
+
try {
|
|
966
|
+
entries = readdirSync(baseDir, { withFileTypes: true });
|
|
967
|
+
} catch { return; }
|
|
968
|
+
|
|
969
|
+
const hasMissionDoc = entries.some((entry) => entry.isFile() && cxxDocNames.has(entry.name));
|
|
970
|
+
if (hasMissionDoc && relPrefix) {
|
|
971
|
+
missionDirs.push({ rel: relPrefix, abs: baseDir });
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
for (const entry of entries) {
|
|
975
|
+
if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
|
|
976
|
+
if (["workers", "coo", "cdo", "cto", "cqo", "ops"].includes(entry.name)) continue;
|
|
977
|
+
const childRel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
|
|
978
|
+
collectMissionDirs(path.join(baseDir, entry.name), childRel);
|
|
979
|
+
}
|
|
980
|
+
};
|
|
981
|
+
|
|
982
|
+
collectMissionDirs(docsDir);
|
|
983
|
+
|
|
984
|
+
const typeFromId = (id: string): MissionDoc["type"] => {
|
|
985
|
+
const base = id.split("/").pop() ?? id;
|
|
986
|
+
if (/^goal[-_]/i.test(base)) return "goal";
|
|
987
|
+
if (/^submission[-_]/i.test(base)) return "submission";
|
|
988
|
+
if (/^hot[-_]?fix[-_]/i.test(base) || /^hotfix[-_]/i.test(base)) return "hotfix";
|
|
989
|
+
if (/^F\d+/i.test(base)) return "feature";
|
|
990
|
+
return "unknown";
|
|
991
|
+
};
|
|
964
992
|
|
|
965
|
-
const missions =
|
|
966
|
-
.
|
|
967
|
-
.map(d => {
|
|
968
|
-
const missionPath = path.join(docsDir, d.name);
|
|
993
|
+
const missions = missionDirs
|
|
994
|
+
.map(({ rel, abs: missionPath }) => {
|
|
969
995
|
let mtime: Date;
|
|
970
996
|
try { mtime = statSync(missionPath).mtime; } catch { mtime = new Date(0); }
|
|
971
997
|
|
|
@@ -1004,12 +1030,13 @@ function readMissions(rootDir: string, limit = 15): MissionDoc[] {
|
|
|
1004
1030
|
const cxxRoles = ["ceo", "cto", "cqo", "coo", "cdo", "ops"] as const;
|
|
1005
1031
|
const cxxPresent = cxxRoles.filter(role => existsSync(path.join(missionPath, `${role}.md`)));
|
|
1006
1032
|
|
|
1007
|
-
const id =
|
|
1033
|
+
const id = rel;
|
|
1034
|
+
const label = rel.split("/").pop() ?? rel;
|
|
1008
1035
|
return {
|
|
1009
1036
|
missionId: id,
|
|
1010
1037
|
ts: mtime.toISOString(),
|
|
1011
|
-
type:
|
|
1012
|
-
label
|
|
1038
|
+
type: typeFromId(id),
|
|
1039
|
+
label,
|
|
1013
1040
|
ceo: readMd("ceo.md"),
|
|
1014
1041
|
cto: readMd("cto.md"),
|
|
1015
1042
|
cqo: readMd("cqo.md"),
|
|
@@ -1039,11 +1066,15 @@ function readOwnerHistory(rootDir: string, limit = 30): OwnerPromptEntry[] {
|
|
|
1039
1066
|
const parts = line.split(" | ");
|
|
1040
1067
|
if (parts.length < 4) continue;
|
|
1041
1068
|
const ts = parts[0]?.trim() ?? "";
|
|
1069
|
+
const eventType = parts[2]?.trim() ?? "input";
|
|
1042
1070
|
const content = parts.slice(3).join(" | ").trim();
|
|
1043
1071
|
if (!content) continue;
|
|
1044
1072
|
const lc = content.toLowerCase();
|
|
1045
|
-
const type =
|
|
1046
|
-
|
|
1073
|
+
const type =
|
|
1074
|
+
eventType === "goal" || content.startsWith("/goal") ? "goal" :
|
|
1075
|
+
eventType === "submission" || content.startsWith("/submission") || lc.includes("/submission") ? "submission" :
|
|
1076
|
+
eventType === "hot-fix" || content.startsWith("/hot-fix") || lc.includes("/hot-fix") ? "hot-fix" :
|
|
1077
|
+
"other";
|
|
1047
1078
|
entries.push({ ts, content, type });
|
|
1048
1079
|
}
|
|
1049
1080
|
return entries.reverse().slice(0, limit);
|
|
@@ -291,7 +291,7 @@ export interface WorkerDocEntry {
|
|
|
291
291
|
export interface MissionDoc {
|
|
292
292
|
missionId: string;
|
|
293
293
|
ts: string;
|
|
294
|
-
type: "hotfix" | "feature" | "unknown";
|
|
294
|
+
type: "goal" | "submission" | "hotfix" | "feature" | "unknown";
|
|
295
295
|
label: string;
|
|
296
296
|
ceo: string | null;
|
|
297
297
|
cto: string | null;
|
|
@@ -306,7 +306,7 @@ export interface MissionDoc {
|
|
|
306
306
|
export interface OwnerPromptEntry {
|
|
307
307
|
ts: string;
|
|
308
308
|
content: string;
|
|
309
|
-
type: "goal" | "hot-fix" | "other";
|
|
309
|
+
type: "goal" | "submission" | "hot-fix" | "other";
|
|
310
310
|
}
|
|
311
311
|
|
|
312
312
|
export interface GotchaEntry {
|
|
@@ -74,12 +74,13 @@
|
|
|
74
74
|
|
|
75
75
|
## 5. 진입점
|
|
76
76
|
|
|
77
|
-
Owner가 회사에 접근하는 명령은
|
|
77
|
+
Owner가 회사에 접근하는 명령은 세 개뿐이다. 그 외의 경로는 없다.
|
|
78
78
|
|
|
79
79
|
| 명령 | 사용 시점 |
|
|
80
80
|
|---|---|
|
|
81
81
|
| `/goal` | 미션 설정, 수정, 추가 |
|
|
82
|
-
| `/
|
|
82
|
+
| `/submission` | 활성 goal 하위의 추가 요구사항 |
|
|
83
|
+
| `/hot-fix` | 활성 goal 하위의 긴급 수정 |
|
|
83
84
|
|
|
84
85
|
`/ceo`, `/cto`, `/cqo`, `/coo`, `/cdo`, `/ops`, `/hiring`은 slash command가 아니다.
|
|
85
86
|
내부 라우팅은 agent/skill wiring으로만 처리한다.
|
|
@@ -88,7 +89,7 @@ Owner가 회사에 접근하는 명령은 두 개뿐이다. 그 외의 경로는
|
|
|
88
89
|
|
|
89
90
|
```
|
|
90
91
|
Owner
|
|
91
|
-
└─ /goal 또는 /hot-fix
|
|
92
|
+
└─ /goal, /submission, 또는 /hot-fix
|
|
92
93
|
└─ harness-ceo 오케스트레이터 — Owner의 유일한 접점
|
|
93
94
|
├─ harness-coo 리서치, 가설, 서비스 방향
|
|
94
95
|
├─ harness-cdo 브랜딩, UI/UX, 디자인 리뷰
|
|
@@ -99,7 +100,7 @@ Owner
|
|
|
99
100
|
|
|
100
101
|
각 CXX는:
|
|
101
102
|
- **독립된 fresh session 컨텍스트**에서 실행된다 — CEO 세션과 메모리를 공유하지 않는다
|
|
102
|
-
- 결정을 `.harness/documents/{
|
|
103
|
+
- 결정을 `.harness/documents/{goal-or-child-mission}/{cxx}.md`에 기록한다
|
|
103
104
|
- 모든 전문 작업을 hired worker에게 위임한다 — 직접 실행하지 않는다
|
|
104
105
|
- 필요한 worker가 없으면 `harness-hiring`을 먼저 호출한다
|
|
105
106
|
|
|
@@ -114,7 +115,17 @@ CEO는 worker 기록 없이 완료된 산출물을 포함한 CXX 보고서를
|
|
|
114
115
|
3. 각 CXX가 worker를 고용하고, 위임하고, 결과를 수집하여 `{cxx}.md`에 기록한다.
|
|
115
116
|
4. CEO가 CXX 산출물을 종합하여 다음 CXX에 라우팅하거나 Owner에게 보고한다.
|
|
116
117
|
|
|
117
|
-
**완료 기준:** `.harness/documents/{
|
|
118
|
+
**완료 기준:** `.harness/documents/goal-{index}-{name}/ceo.md`에 최종 Owner 보고가 존재한다.
|
|
119
|
+
|
|
120
|
+
### Submission
|
|
121
|
+
|
|
122
|
+
1. CEO가 활성 goal을 `.harness/documents/goal-{index}-{name}/`에서 찾는다.
|
|
123
|
+
2. CEO가 `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/ceo.md`를 만든다.
|
|
124
|
+
3. CEO는 추가 요구사항에 필요한 CXX만 라우팅한다.
|
|
125
|
+
4. 추가 요구사항이 지속 규칙을 바꾸면 관련 CXX가 `.harness/conventions/`를 갱신한다.
|
|
126
|
+
5. Worker는 `{owning-cxx}/workers/` 아래에 보고하고, CXX는 선택과 위험을 `{cxx}.md`에 요약한다.
|
|
127
|
+
|
|
128
|
+
**완료 기준:** submission 하위 디렉터리에 CEO/CXX 기록, 필요한 worker evidence, 필요한 convention 업데이트가 존재한다.
|
|
118
129
|
|
|
119
130
|
### Hot Fix
|
|
120
131
|
|
|
@@ -132,7 +143,9 @@ CEO는 worker 기록 없이 완료된 산출물을 포함한 CXX 보고서를
|
|
|
132
143
|
|
|
133
144
|
| 경로 | 역할 |
|
|
134
145
|
|---|---|
|
|
135
|
-
| `.harness/documents/{
|
|
146
|
+
| `.harness/documents/goal-{index}-{name}/` | goal 레벨 CXX 결정 기록 및 worker 보고서 |
|
|
147
|
+
| `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/` | 활성 goal 하위의 추가 요구사항 |
|
|
148
|
+
| `.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/` | 활성 goal 하위의 긴급 수정 |
|
|
136
149
|
| `.harness/conventions/` | 지속 규칙 (CQO가 작성, 미션을 넘어 유지) |
|
|
137
150
|
| `.harness/gotchas/` | 재발 방지 기록 (CQO가 hot-fix마다 작성) |
|
|
138
151
|
| `.harness/memories/` | 장기 공유 컨텍스트 |
|
|
@@ -6,12 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
## 1. Entry Points
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Three Owner-facing commands. Nothing else reaches the company.
|
|
10
10
|
|
|
11
11
|
| Command | When |
|
|
12
12
|
|---|---|
|
|
13
13
|
| `/goal` | Set, update, or extend a mission |
|
|
14
|
-
| `/
|
|
14
|
+
| `/submission` | Add a requirement under the active goal |
|
|
15
|
+
| `/hot-fix` | Emergency fix under the active goal |
|
|
15
16
|
|
|
16
17
|
`/ceo`, `/cto`, `/cqo`, `/coo`, `/cdo`, `/ops`, `/hiring` are not slash commands.
|
|
17
18
|
Internal routing uses agent/skill wiring only.
|
|
@@ -36,7 +37,7 @@ For goal: define verifiable success criteria before CEO routes to CXX.
|
|
|
36
37
|
|
|
37
38
|
```
|
|
38
39
|
Owner
|
|
39
|
-
└─ /goal or /hot-fix
|
|
40
|
+
└─ /goal, /submission, or /hot-fix
|
|
40
41
|
└─ harness-ceo orchestrator — Owner's only contact
|
|
41
42
|
├─ harness-coo research, hypothesis, service direction
|
|
42
43
|
├─ harness-cdo branding, UI/UX, design review
|
|
@@ -47,7 +48,7 @@ Owner
|
|
|
47
48
|
|
|
48
49
|
Each CXX:
|
|
49
50
|
- Runs in a **fresh session context** — no shared memory with CEO's session
|
|
50
|
-
- Records decisions in `.harness/documents/{
|
|
51
|
+
- Records decisions in `.harness/documents/{goal-or-child-mission}/{cxx}.md`
|
|
51
52
|
- Delegates all specialist work to hired workers — never executes directly
|
|
52
53
|
- If a required worker is absent, invokes `harness-hiring` before assigning
|
|
53
54
|
|
|
@@ -64,7 +65,17 @@ CEO rejects any CXX report that contains completed deliverables without matching
|
|
|
64
65
|
3. Each CXX hires workers, collects reports, records decisions in `{cxx}.md`.
|
|
65
66
|
4. CEO aggregates CXX outputs, routes to next CXX or reports to Owner.
|
|
66
67
|
|
|
67
|
-
**Complete when:** `.harness/documents/{
|
|
68
|
+
**Complete when:** `.harness/documents/goal-{index}-{name}/ceo.md` contains a final Owner report.
|
|
69
|
+
|
|
70
|
+
### Submission
|
|
71
|
+
|
|
72
|
+
1. CEO locates the active goal under `.harness/documents/goal-{index}-{name}/`.
|
|
73
|
+
2. CEO creates `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/ceo.md`.
|
|
74
|
+
3. CEO routes only the CXX needed for the added requirement.
|
|
75
|
+
4. Relevant CXX update `.harness/conventions/` when the new requirement changes durable project rules.
|
|
76
|
+
5. Workers report under `{owning-cxx}/workers/`; CXX summarize choices in `{cxx}.md`.
|
|
77
|
+
|
|
78
|
+
**Complete when:** the submission child directory has CEO/CXX records, required worker evidence, and any convention updates required by the new requirement.
|
|
68
79
|
|
|
69
80
|
### Hot Fix
|
|
70
81
|
|
|
@@ -84,7 +95,9 @@ Note: A docmeta skip decision on harness documents (ceo.md, cto.md, cqo.md, work
|
|
|
84
95
|
|
|
85
96
|
| Path | Role |
|
|
86
97
|
|---|---|
|
|
87
|
-
| `.harness/documents/{
|
|
98
|
+
| `.harness/documents/goal-{index}-{name}/` | Goal-level CXX decisions and worker reports |
|
|
99
|
+
| `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/` | Additional requirement under the active goal |
|
|
100
|
+
| `.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/` | Emergency fix under the active goal |
|
|
88
101
|
| `.harness/conventions/` | Durable rules (CQO writes, survives missions) |
|
|
89
102
|
| `.harness/gotchas/` | Recurrence-prevention records (CQO writes per hot-fix) |
|
|
90
103
|
| `.harness/memories/` | Long-term shared context |
|
|
@@ -107,7 +120,7 @@ Note: A docmeta skip decision on harness documents (ceo.md, cto.md, cqo.md, work
|
|
|
107
120
|
7. **CEO routes only to CXX — never to workers** — CEO must not dispatch, hire, or brief specialist workers directly. Implementation workers are hired by CTO. Evaluator/tester workers are hired by CQO.
|
|
108
121
|
8. **No CXX self-execution** — CXX agents coordinate and manage only. A CXX that produces deliverables without matching worker records has violated its scope. CEO must reject such reports.
|
|
109
122
|
9. **No verdict without worker evidence** — CQO cannot issue ACCEPTED/REJECTED without a Worker Evidence Manifest referencing at least one evaluator worker. Self-inspection by CQO is not valid evidence.
|
|
110
|
-
10. **Hierarchical worker ownership** — Hired workers are installed under `.claude/skills/{owning-cxx}/{worker}/` and `.codex/skills/{owning-cxx}/{worker}/`; mission worker reports live under `.harness/documents/{mission}/{owning-cxx}/workers/`. Flat `{mission}/workers/` reports are legacy and signal an ownership violation unless explicitly migrated.
|
|
123
|
+
10. **Hierarchical worker ownership** — Hired workers are installed under `.claude/skills/{owning-cxx}/{worker}/` and `.codex/skills/{owning-cxx}/{worker}/`; mission worker reports live under `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/`. Flat `{mission}/workers/` reports are legacy and signal an ownership violation unless explicitly migrated.
|
|
111
124
|
11. **Implementation Notes required** — `ceo.md`, every `{cxx}.md`, and every worker report must end with an English `## Implementation Notes` section containing `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`. Use `None` for empty subsections.
|
|
112
125
|
|
|
113
126
|
---
|
|
@@ -1,226 +1,102 @@
|
|
|
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)
|
|
1
|
+
# walwal-harness Runtime Reference
|
|
39
2
|
|
|
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)
|
|
3
|
+
This project runs in company mode.
|
|
51
4
|
|
|
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
|
-
```
|
|
5
|
+
Owner-facing commands are limited to:
|
|
73
6
|
|
|
74
|
-
|
|
7
|
+
| Command | Purpose | Document root |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `/goal` | Set or change the company goal | `.harness/documents/goal-{index}-{name}/` |
|
|
10
|
+
| `/submission` | Add a requirement under the active goal | `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/` |
|
|
11
|
+
| `/hot-fix` | Fix an urgent issue under the active goal | `.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/` |
|
|
75
12
|
|
|
76
|
-
|
|
13
|
+
No CXX role is a slash command. `/ceo`, `/coo`, `/cdo`, `/cto`, `/cqo`, `/ops`, `/hiring`, and `/resource-manager` are invalid Owner commands.
|
|
77
14
|
|
|
78
|
-
|
|
15
|
+
## Company Structure
|
|
79
16
|
|
|
80
17
|
```
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
18
|
+
Owner
|
|
19
|
+
└─ /goal, /submission, or /hot-fix
|
|
20
|
+
└─ harness-ceo
|
|
21
|
+
├─ harness-coo
|
|
22
|
+
├─ harness-cdo
|
|
23
|
+
├─ harness-cto
|
|
24
|
+
├─ harness-cqo
|
|
25
|
+
└─ harness-ops
|
|
88
26
|
```
|
|
89
27
|
|
|
90
|
-
|
|
28
|
+
CEO is the Owner's only internal contact. CEO talks only to CXX agents. CXX agents coordinate, hire, review, and decide; they do not directly produce specialist deliverables.
|
|
91
29
|
|
|
92
|
-
|
|
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
|
-
```
|
|
30
|
+
## Runtime Paths
|
|
125
31
|
|
|
126
|
-
|
|
32
|
+
| Path | Role |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `.harness/documents/goal-{index}-{name}/ceo.md` | Goal framing and CEO routing |
|
|
35
|
+
| `.harness/documents/goal-{index}-{name}/{cxx}.md` | Goal-level CXX decision record |
|
|
36
|
+
| `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/` | Additional requirement under the active goal |
|
|
37
|
+
| `.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/` | Emergency fix under the active goal |
|
|
38
|
+
| `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/{worker-name}.md` | Worker evidence owned by a CXX |
|
|
39
|
+
| `.harness/conventions/` | Durable rules, including requirement conventions from submissions |
|
|
40
|
+
| `.harness/gotchas/` | Recurrence-prevention records from hot-fixes |
|
|
41
|
+
| `.harness/memories/` | Long-term shared context |
|
|
42
|
+
| `.harness/shared/HR-Resource/` | Hireable worker skill pool |
|
|
43
|
+
| `.harness/shared/hr-roster.json` | Hired worker roster |
|
|
44
|
+
| `.harness/archive/` | CQO-approved completed mission records |
|
|
45
|
+
| `.harness/progress.log` | Append-only command and status history |
|
|
46
|
+
| `.harness/progress.json` | Machine-readable current runtime state |
|
|
127
47
|
|
|
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.
|
|
48
|
+
Flat `.harness/documents/{mission}/workers/` reports are legacy. New worker evidence must be under `{owning-cxx}/workers/`.
|
|
165
49
|
|
|
166
|
-
##
|
|
50
|
+
## Required Flow
|
|
167
51
|
|
|
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) |
|
|
52
|
+
### Goal
|
|
176
53
|
|
|
177
|
-
|
|
54
|
+
1. CEO creates or updates `.harness/documents/goal-{index}-{name}/ceo.md`.
|
|
55
|
+
2. CEO routes only needed CXX agents.
|
|
56
|
+
3. Each CXX writes its own `{cxx}.md`.
|
|
57
|
+
4. CXX agents use `harness-resource-manager` and `harness-hiring` before assigning specialist work.
|
|
58
|
+
5. Workers write evidence under `{owning-cxx}/workers/`.
|
|
59
|
+
6. CEO reports only after CXX records and required worker evidence exist.
|
|
178
60
|
|
|
179
|
-
|
|
61
|
+
### Submission
|
|
180
62
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
63
|
+
1. CEO locates the active goal directory.
|
|
64
|
+
2. CEO creates `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/ceo.md`.
|
|
65
|
+
3. CEO routes only the CXX needed for the additional requirement.
|
|
66
|
+
4. CXX agents update `.harness/conventions/` when the new requirement creates or changes durable project rules.
|
|
67
|
+
5. Worker reports and CXX notes stay inside the submission directory.
|
|
185
68
|
|
|
186
|
-
|
|
69
|
+
### Hot Fix
|
|
187
70
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
71
|
+
1. CEO locates the active goal directory.
|
|
72
|
+
2. CEO creates `.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/ceo.md`.
|
|
73
|
+
3. CEO routes CTO and CQO first.
|
|
74
|
+
4. CTO hires implementation workers and records the patch plan in `cto.md`.
|
|
75
|
+
5. CQO hires evaluator/tester workers and records the verdict in `cqo.md`.
|
|
76
|
+
6. CQO registers at least one durable lesson in `.harness/gotchas/`, `.harness/conventions/`, or `.harness/memories/`.
|
|
192
77
|
|
|
193
|
-
##
|
|
78
|
+
## Hard Gates
|
|
194
79
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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 금지 |
|
|
80
|
+
- CEO must not dispatch, hire, or brief workers directly.
|
|
81
|
+
- CXX agents must not directly execute specialist deliverables.
|
|
82
|
+
- CTO worker dispatch requires `cto.md` first.
|
|
83
|
+
- CQO verdicts require evaluator/tester worker evidence.
|
|
84
|
+
- Every `ceo.md`, `{cxx}.md`, and worker report must end with:
|
|
202
85
|
|
|
203
|
-
|
|
86
|
+
```markdown
|
|
87
|
+
## Implementation Notes
|
|
204
88
|
|
|
205
|
-
|
|
206
|
-
-
|
|
207
|
-
- **메모리 오염 방어**: 신규 entry 는 `unverified` 로 시작 → Planner 리뷰 시 `verified` 승격. TTL 만료 항목은 sprint 전환 시 갱신/삭제.
|
|
208
|
-
- **검증 불가능 항목 즉시 삭제**.
|
|
89
|
+
### Design Decisions
|
|
90
|
+
- None
|
|
209
91
|
|
|
210
|
-
|
|
92
|
+
### Deviations
|
|
93
|
+
- None
|
|
211
94
|
|
|
212
|
-
|
|
213
|
-
|
|
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 상태 / 등록 프로젝트 확인 |
|
|
95
|
+
### Tradeoffs
|
|
96
|
+
- None
|
|
221
97
|
|
|
222
|
-
|
|
98
|
+
### Open Questions
|
|
99
|
+
- None
|
|
100
|
+
```
|
|
223
101
|
|
|
224
|
-
|
|
225
|
-
2. `gotchas/<role>.md`, `conventions/<role>.md` 의 Preserved Rules 섹션 정리.
|
|
226
|
-
3. Owner 는 "하네스 엔지니어링 시작" 또는 자유 형식 지시로 Dispatcher 를 깨운다 — 이후는 Conductor 가 이어받는다.
|
|
102
|
+
The notes must be written in English. Use `None` when a subsection has no entries.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"harness": {
|
|
3
3
|
"name": "walwal-harness — NEXUS company harness",
|
|
4
4
|
"version": "7.1.1",
|
|
5
|
-
"description": "v7 company harness. Owner uses /goal or /hot-fix, CEO coordinates CXX agents, CXX agents use resource-manager/hiring, and hired workers produce mission evidence under .harness/documents/{mission}/workers/.",
|
|
5
|
+
"description": "v7 company harness. Owner uses /goal, /submission, or /hot-fix, CEO coordinates CXX agents, CXX agents use resource-manager/hiring, and hired workers produce mission evidence under .harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/.",
|
|
6
6
|
"source": "https://www.anthropic.com/engineering/harness-design-long-running-apps"
|
|
7
7
|
},
|
|
8
8
|
"agents": {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"flow": {
|
|
20
20
|
"sequence": ["ceo", "coo", "cdo", "cto", "cqo", "ops"],
|
|
21
21
|
"worker_gate": "CXX agents must use harness-resource-manager and harness-hiring before specialist deliverables.",
|
|
22
|
-
"worker_reports_required": ".harness/documents/{mission}/workers/{worker-name}.md",
|
|
22
|
+
"worker_reports_required": ".harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/{worker-name}.md",
|
|
23
23
|
"retry_on_fail": true,
|
|
24
24
|
"max_retries_per_sprint": 5,
|
|
25
25
|
"escalate_to_ceo_after": 3,
|