@walwal-harness/cli 7.1.9 → 7.1.10

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: harness-ceo
3
- description: "CEO/Dispatcher. Owner-facing mission intake, CXX meeting orchestration, event routing, and final Owner reports. Trigger with /goal, /hot-fix, /ceo."
3
+ description: "CEO/Dispatcher. Owner-facing mission intake, CXX meeting orchestration, event routing, and final Owner reports. Trigger with /goal, /submission, /hot-fix, /ceo."
4
4
  model: sonnet
5
5
  disable-model-invocation: false
6
6
  ---
@@ -12,7 +12,7 @@ You are the only direct conversation channel with the Owner.
12
12
  ## Mission Protocol
13
13
 
14
14
  1. Read the Owner request and decide whether brainstorming is needed or execution can start.
15
- 2. Create or update `.harness/documents/{mission_name}/ceo.md`.
15
+ 2. Create or update `.harness/documents/{goal-or-child-mission}/ceo.md`.
16
16
  3. Ask each CXX only mission-relevant questions:
17
17
  - COO: planning, market/reference research, hypothesis validation, mission fit.
18
18
  - CDO: branding, UI/UX direction, mock selection, design review.
@@ -28,8 +28,8 @@ You are the only direct conversation channel with the Owner.
28
28
  - CXX agents do not execute specialist work directly. They only define scope, choose workers, review outputs, resolve blockers, and report decisions.
29
29
  - Every mission must use hired specialist workers for research, planning, design production, implementation, QA, ops checks, or any other domain deliverable. Small scope is not an exemption.
30
30
  - If a suitable hired worker is absent, invoke the `harness-hiring` skill before the CXX proceeds with that deliverable.
31
- - CEO must reject CXX reports that contain completed specialist deliverables without matching worker records under `.harness/documents/{mission_name}/workers/`.
32
- - Every CXX starts from fresh context and records decisions in `.harness/documents/{mission_name}/{cxx}.md`.
31
+ - CEO must reject CXX reports that contain completed specialist deliverables without matching worker records under `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/`.
32
+ - Every CXX starts from fresh context and records decisions in `.harness/documents/{goal-or-child-mission}/{cxx}.md`.
33
33
  - Preserve DDD boundaries: domain decisions, application wiring, infrastructure, and quality policy are separate responsibilities.
34
34
  - Before CTO/CDO/OPS allocate runnable services, agree with the Owner on a `{xx}000` base port and write it to project `.env` as `HARNESS_BASE_PORT={xx}000`. Mentioning the value in `ceo.md` is not sufficient.
35
35
  - After writing `.env`, verify with `grep '^HARNESS_BASE_PORT=' .env` before routing service work.
@@ -12,7 +12,7 @@ Own quality, recurrence prevention, and archive eligibility.
12
12
  ## Workflow
13
13
 
14
14
  1. Read CEO and CTO mission context.
15
- 2. Record decisions in `.harness/documents/{mission_name}/cqo.md`.
15
+ 2. Record decisions in `.harness/documents/{goal-or-child-mission}/cqo.md`.
16
16
  3. Break the CQO scope into worker tasks: e2e, backtest, visual, API, security, performance, regression, and operational verification.
17
17
  4. Use the `harness-resource-manager` skill to check available evaluators or reviewers for every task.
18
18
  5. Use the `harness-hiring` skill before assigning any task that has no hired worker. Do not complete that task yourself.
@@ -28,7 +28,7 @@ CQO must not directly execute QA, visual review, security review, performance te
28
28
 
29
29
  **CQO does not communicate with dev workers.** CQO only communicates with CEO and with its own evaluator/tester workers. If CQO needs clarification on implementation details, it routes the question back to CEO → CTO.
30
30
 
31
- Every evaluator/tester dispatched by CQO must write its report under `.harness/documents/{mission_name}/cqo/workers/{worker-name}.md`.
31
+ Every evaluator/tester dispatched by CQO must write its report under `.harness/documents/{goal-or-child-mission}/cqo/workers/{worker-name}.md`.
32
32
 
33
33
  Required output sections in `cqo.md`:
34
34
 
@@ -40,7 +40,7 @@ Required output sections in `cqo.md`:
40
40
 
41
41
  ## Worker Report Note Requirement
42
42
 
43
- Every CQO evaluator/tester brief must require the worker to append this English block to the bottom of `.harness/documents/{mission_name}/cqo/workers/{worker-name}.md`:
43
+ Every CQO evaluator/tester brief must require the worker to append this English block to the bottom of `.harness/documents/{goal-or-child-mission}/cqo/workers/{worker-name}.md`:
44
44
 
45
45
  ```
46
46
  ## Implementation Notes
@@ -12,7 +12,7 @@ Own engineering execution for the mission.
12
12
  ## Workflow
13
13
 
14
14
  1. Read CEO, COO, and CDO mission documents.
15
- 2. Record decisions in `.harness/documents/{mission_name}/cto.md`. **This file must be created before any worker is dispatched.**
15
+ 2. Record decisions in `.harness/documents/{goal-or-child-mission}/cto.md`. **This file must be created before any worker is dispatched.**
16
16
  3. Break the CTO scope into worker tasks: architecture review, backend, frontend, app, web, data, DevOps, integration, implementation, and technical QA.
17
17
  4. Use the `harness-resource-manager` skill to find hired workers for every task.
18
18
  5. Use the `harness-hiring` skill before assigning any missing specialty. Do not complete that task yourself.
@@ -26,9 +26,9 @@ Own engineering execution for the mission.
26
26
 
27
27
  CTO must not directly write code, create build scripts, choose detailed implementation content, run technical QA as the evaluator, or produce final implementation artifacts. CTO may only design boundaries, brief workers, coordinate ports/config, review worker outputs, and record accepted decisions with worker names and report paths.
28
28
 
29
- **cto.md is a prerequisite gate.** No worker may be dispatched before `cto.md` exists. A mission where workers appear in `.harness/documents/{mission_name}/workers/` but no `cto.md` exists is a protocol violation — CEO bypassed CTO.
29
+ **cto.md is a prerequisite gate.** No worker may be dispatched before `cto.md` exists. A mission where workers appear in `.harness/documents/{goal-or-child-mission}/cto/workers/` but no `cto.md` exists is a protocol violation — CEO bypassed CTO.
30
30
 
31
- Every worker dispatched by CTO must be listed in the Worker Evidence Manifest section of `cto.md` with their report path and status. The report path must be `.harness/documents/{mission_name}/cto/workers/{worker-name}.md`. Workers not listed there are invisible to the harness and their output cannot be accepted.
31
+ Every worker dispatched by CTO must be listed in the Worker Evidence Manifest section of `cto.md` with their report path and status. The report path must be `.harness/documents/{goal-or-child-mission}/cto/workers/{worker-name}.md`. Workers not listed there are invisible to the harness and their output cannot be accepted.
32
32
 
33
33
  Required output sections in `cto.md`:
34
34
 
@@ -41,7 +41,7 @@ Required output sections in `cto.md`:
41
41
 
42
42
  ## Worker Report Note Requirement
43
43
 
44
- Every CTO worker brief must require the worker to append this English block to the bottom of `.harness/documents/{mission_name}/cto/workers/{worker-name}.md`:
44
+ Every CTO worker brief must require the worker to append this English block to the bottom of `.harness/documents/{goal-or-child-mission}/cto/workers/{worker-name}.md`:
45
45
 
46
46
  ```
47
47
  ## Implementation Notes
package/README.md CHANGED
@@ -10,7 +10,7 @@ One project = one company. The Owner speaks only to the CEO. The CEO speaks only
10
10
 
11
11
  ```
12
12
  Owner
13
- └─ /goal · /hot-fix
13
+ └─ /goal · /submission · /hot-fix
14
14
  └─ harness-ceo orchestrator — Owner's only contact
15
15
  ├─ harness-coo research, hypothesis, service direction
16
16
  ├─ harness-cdo branding, UI/UX, design review
@@ -48,6 +48,7 @@ What `init` installs:
48
48
  | Path | Contents |
49
49
  |---|---|
50
50
  | `.claude/commands/goal.md` | `/goal` Owner command |
51
+ | `.claude/commands/submission.md` | `/submission` Owner command |
51
52
  | `.claude/commands/hot-fix.md` | `/hot-fix` Owner command |
52
53
  | `.claude/skills/harness-{ceo,coo,cdo,cto,cqo,ops}/` | CXX agent skills |
53
54
  | `.harness/shared/HR-Resource/` | Hireable worker skill pool |
@@ -79,6 +80,16 @@ Owner /hot-fix → CEO → CTO → [dev workers] → CQO → [evaluator workers]
79
80
 
80
81
  **Complete when:** `cto.md` + `cqo.md` + at least one `.harness/gotchas/` or `.harness/conventions/` entry exist.
81
82
 
83
+ ### Submission
84
+
85
+ ```
86
+ Owner /submission → CEO → [relevant CXX] → [workers] → [convention updates]
87
+ ```
88
+
89
+ 1. CEO locates the active `.harness/documents/goal-{index}-{name}/`.
90
+ 2. CEO creates `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/`.
91
+ 3. Relevant CXX update `.harness/conventions/` when the new requirement changes durable project rules.
92
+
82
93
  ---
83
94
 
84
95
  ## Hard Rules
@@ -93,7 +104,7 @@ Owner /hot-fix → CEO → CTO → [dev workers] → CQO → [evaluator workers]
93
104
  | 6 | CEO routes only to CXX — never directly to workers |
94
105
  | 7 | No CXX self-execution — deliverables without matching worker records are rejected |
95
106
  | 8 | No verdict without worker evidence — CQO self-inspection is not valid |
96
- | 9 | Hierarchical worker ownership — worker reports live under `.harness/documents/{mission}/{owning-cxx}/workers/` |
107
+ | 9 | Hierarchical worker ownership — worker reports live under `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/` |
97
108
  | 10 | Implementation Notes required — `ceo.md`, every `{cxx}.md`, and every worker report must end with an English `## Implementation Notes` section |
98
109
 
99
110
  ### Implementation Notes Format
@@ -170,7 +181,7 @@ npx walwal-harness init --force --project-root /path/to/project
170
181
  Features:
171
182
 
172
183
  - **Org Tree** — live status of Owner → CEO → CXX → Workers hierarchy
173
- - **Mission Timeline** — clickable history of goal/hot-fix missions showing the full dispatch chain
184
+ - **Mission Timeline** — clickable history of goal/submission/hot-fix missions showing the full dispatch chain
174
185
  - **Mission Flow tab** — per-mission flow: Owner prompt → CEO routing → CXX → worker files changed → CQO verdict
175
186
  - **History tab** — mission-specific Owner request (from CEO summary + closest progress.log match)
176
187
  - **Gotchas tab** — searchable `.harness/gotchas/*.md` knowledge base, click to read full markdown
@@ -182,8 +193,10 @@ Features:
182
193
 
183
194
  | Path | Role |
184
195
  |---|---|
185
- | `.harness/documents/{mission}/` | CXX decisions and worker reports per mission |
186
- | `.harness/documents/{mission}/{cxx}/workers/` | Worker reports owned by that CXX |
196
+ | `.harness/documents/goal-{index}-{name}/` | Goal-level CXX decisions and worker reports |
197
+ | `.harness/documents/goal-{index}-{name}/submission-{index}-{name}/` | Additional requirement under the active goal |
198
+ | `.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/` | Emergency fix under the active goal |
199
+ | `.harness/documents/{goal-or-child-mission}/{cxx}/workers/` | Worker reports owned by that CXX |
187
200
  | `.harness/conventions/` | Durable rules (CQO writes, survives missions) |
188
201
  | `.harness/gotchas/` | Recurrence-prevention records (CQO registers per hot-fix) |
189
202
  | `.harness/shared/HR-Resource/` | Hireable worker skill pool |
@@ -153,7 +153,9 @@ export function MissionTimeline({
153
153
  const typeBadge =
154
154
  mission.type === "hotfix"
155
155
  ? "[🔥 hot-fix]"
156
- : mission.type === "feature"
156
+ : mission.type === "submission"
157
+ ? "[+ submission]"
158
+ : mission.type === "goal" || mission.type === "feature"
157
159
  ? "[✦ goal]"
158
160
  : "[— unknown]";
159
161
  const shortId =
@@ -188,6 +190,8 @@ export function MissionTimeline({
188
190
  className={`shrink-0 font-mono text-[9px] rounded px-1.5 py-0.5 border ${
189
191
  mission.type === "hotfix"
190
192
  ? "bg-rose-500/15 text-rose-300 border-rose-500/30"
193
+ : mission.type === "submission"
194
+ ? "bg-sky-500/15 text-sky-300 border-sky-500/30"
191
195
  : "bg-emerald-500/15 text-emerald-300 border-emerald-500/30"
192
196
  }`}
193
197
  >
@@ -129,7 +129,7 @@ export function OrgTree({ snapshot, activeNodeId, onNodeClick }: OrgTreeProps) {
129
129
  id: "owner",
130
130
  role: "owner",
131
131
  label: "Owner",
132
- sublabel: "/goal · /hot-fix",
132
+ sublabel: "/goal · /submission · /hot-fix",
133
133
  status: "idle",
134
134
  activity: snapshot.ownerHistory?.[0]?.content.slice(0, 80) ?? null,
135
135
  agentIds: [],
@@ -120,7 +120,7 @@ export function Scene({ snapshot: initial, lang = "ko" }: SceneProps) {
120
120
  <section className="mt-4">
121
121
  <div className="mb-2">
122
122
  <p className="font-mono text-[10px] uppercase tracking-[0.2em] text-cyan-300/60">Mission History</p>
123
- <p className="text-[11px] text-gray-500 mt-0.5">goal · hot-fix 명령별 파생 작업 흐름</p>
123
+ <p className="text-[11px] text-gray-500 mt-0.5">goal · submission · hot-fix 명령별 파생 작업 흐름</p>
124
124
  </div>
125
125
  <MissionTimeline
126
126
  missions={snapshot.missions ?? []}
@@ -288,7 +288,8 @@ export function MissionFlowTab({ mission, ownerHistory }: Props) {
288
288
 
289
289
  const typeBadge =
290
290
  mission.type === "hotfix" ? "[🔥 hot-fix]"
291
- : mission.type === "feature" ? "[✦ goal]"
291
+ : mission.type === "submission" ? "[+ submission]"
292
+ : mission.type === "goal" || mission.type === "feature" ? "[✦ goal]"
292
293
  : "[— unknown]";
293
294
 
294
295
  let dateStr = "—";
@@ -341,6 +342,8 @@ export function MissionFlowTab({ mission, ownerHistory }: Props) {
341
342
  className={`font-mono text-[9px] rounded border px-1.5 py-0.5 ${
342
343
  mission.type === "hotfix"
343
344
  ? "bg-rose-500/15 text-rose-300 border-rose-500/30"
345
+ : mission.type === "submission"
346
+ ? "bg-sky-500/15 text-sky-300 border-sky-500/30"
344
347
  : "bg-emerald-500/15 text-emerald-300 border-emerald-500/30"
345
348
  }`}
346
349
  >
@@ -92,6 +92,8 @@ export function OwnerHistoryTab({ ownerHistory, mission, onEntryClick }: Props)
92
92
  className={`font-mono text-[9px] px-1.5 py-0.5 rounded ${
93
93
  closestEntry.type === "goal"
94
94
  ? "bg-emerald-500/15 text-emerald-300"
95
+ : closestEntry.type === "submission"
96
+ ? "bg-sky-500/15 text-sky-300"
95
97
  : closestEntry.type === "hot-fix"
96
98
  ? "bg-rose-500/15 text-rose-300"
97
99
  : "bg-gray-500/15 text-gray-400"
@@ -140,6 +142,8 @@ export function OwnerHistoryTab({ ownerHistory, mission, onEntryClick }: Props)
140
142
  className={`font-mono text-[9px] px-1.5 py-0.5 rounded ${
141
143
  entry.type === "goal"
142
144
  ? "bg-emerald-500/15 text-emerald-300"
145
+ : entry.type === "submission"
146
+ ? "bg-sky-500/15 text-sky-300"
143
147
  : entry.type === "hot-fix"
144
148
  ? "bg-rose-500/15 text-rose-300"
145
149
  : "bg-gray-500/15 text-gray-400"
@@ -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
- let entries: Dirent[];
961
- try {
962
- entries = readdirSync(docsDir, { withFileTypes: true });
963
- } catch { return []; }
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 = entries
966
- .filter(d => d.isDirectory() && !d.name.startsWith("."))
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 = d.name;
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: id.startsWith("hotfix") ? "hotfix" : id.match(/^F\d+/) ? "feature" : "unknown",
1012
- label: id,
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 = content.startsWith("/goal") ? "goal" :
1046
- (content.startsWith("/hot-fix") || lc.includes("/hot-fix")) ? "hot-fix" : "other";
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
- | `/hot-fix` | 활성 goal과 독립된 긴급 수정 |
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/{mission_name}/{cxx}.md`에 기록한다
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/{mission_name}/ceo.md`에 최종 Owner 보고가 존재한다.
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/{mission}/` | 미션별 CXX 결정 기록 및 worker 보고서 |
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
- Two Owner-facing commands. Nothing else reaches the company.
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
- | `/hot-fix` | Emergency fix independent of the active goal |
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/{mission_name}/{cxx}.md`
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/{mission_name}/ceo.md` contains a final Owner report.
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/{mission}/` | CXX decisions and worker reports per mission |
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
  ---