@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.
- 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 +18 -5
- package/apps/harness-dashboard/components/MissionTimeline.tsx +5 -1
- package/apps/harness-dashboard/components/OrgTree.tsx +1 -1
- package/apps/harness-dashboard/components/Scene.tsx +1 -1
- 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
package/HR-Resource/ceo/SKILL.md
CHANGED
|
@@ -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/{
|
|
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/{
|
|
32
|
-
- Every CXX starts from fresh context and records decisions in `.harness/documents/{
|
|
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.
|
package/HR-Resource/cqo/SKILL.md
CHANGED
|
@@ -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/{
|
|
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/{
|
|
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/{
|
|
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
|
package/HR-Resource/cto/SKILL.md
CHANGED
|
@@ -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/{
|
|
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/{
|
|
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/{
|
|
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/{
|
|
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/{
|
|
186
|
-
| `.harness/documents/{
|
|
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 === "
|
|
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 === "
|
|
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
|
-
|
|
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
|
---
|