@walwal-harness/cli 7.1.16 → 7.1.19
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 +5 -2
- package/HR-Resource/cqo/SKILL.md +14 -4
- package/HR-Resource/ops/SKILL.md +31 -9
- package/README.md +5 -2
- package/apps/harness-dashboard/lib/__tests__/harness-state.test.ts +57 -1
- package/apps/harness-dashboard/lib/harness-state.ts +24 -3
- package/assets/templates/AGENTS-ko.md.template +5 -1
- package/assets/templates/AGENTS.md.template +5 -2
- package/assets/templates/HARNESS.md +1 -1
- package/assets/templates/config.json +14 -0
- package/bin/init.js +107 -18
- package/package.json +1 -1
- package/scripts/harness-user-prompt-submit.sh +1 -1
package/HR-Resource/ceo/SKILL.md
CHANGED
|
@@ -18,7 +18,7 @@ You are the only direct conversation channel with the Owner.
|
|
|
18
18
|
- CDO: branding, UI/UX direction, mock selection, design review.
|
|
19
19
|
- CTO: architecture, platform, API, account, web/app/backend/frontend wiring.
|
|
20
20
|
- CQO: quality gates, e2e/backtest strategy, regression and archive criteria.
|
|
21
|
-
- OPS: build/service environment monitoring, port map checks, launch observation, and exception monitoring.
|
|
21
|
+
- OPS: build/service environment monitoring, CQO verification watch, port map checks, launch observation, production watch, and exception monitoring.
|
|
22
22
|
4. Route completed outputs to the next responsible CXX.
|
|
23
23
|
5. Report outcomes and escalations to the Owner.
|
|
24
24
|
|
|
@@ -34,9 +34,12 @@ You are the only direct conversation channel with the Owner.
|
|
|
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.
|
|
36
36
|
- For service monitoring, collect the Owner's server mapping first: local PC, Docker, VM, AWS/cloud, host, port, health path, log path, and contact/source.
|
|
37
|
+
- For runnable verification, collect or require CTO to record the test runtime mapping before CQO starts evaluator work: command/service name, cwd, host, port, health path if any, log path if any, and owner. OPS must watch that runtime during CQO Playwright/E2E/API/visual/performance/regression checks.
|
|
38
|
+
- CEO must not accept CQO PASS for a runnable product unless OPS has supplied clean verification-watch evidence or an explicit not-applicable reason. Open OPS incidents, missing runtime mapping, missing required logs, service down, or health mismatch block Owner acceptance.
|
|
39
|
+
- After launch, CEO treats OPS production incidents as company events. CEO convenes CTO/CQO/OPS when user-impacting production signals appear; CTO owns recovery, CQO owns regression confirmation, and OPS owns evidence and close criteria.
|
|
37
40
|
- Every CEO and CXX mission document must include an English `## Implementation Notes` section with the required subsections below. CEO must reject CXX reports that omit it.
|
|
38
41
|
- Owner is the final acceptance reviewer, not a tester, QA substitute, debugger, or deployment verifier. CEO must not send "done, please check" reports while core functionality, regression, account setup, browser flows, logs, or runtime health remain unverified by workers.
|
|
39
|
-
- Before requesting Owner acceptance, CEO must collect and summarize CXX-backed completion evidence: CTO implementation evidence, CQO evaluator/tester evidence, and OPS runtime evidence when
|
|
42
|
+
- Before requesting Owner acceptance, CEO must collect and summarize CXX-backed completion evidence: CTO implementation evidence, CQO evaluator/tester evidence, and OPS verification-watch/runtime evidence when runnable environments are involved. The final Owner report may request acceptance review or business/product judgment, but must not ask the Owner to discover whether the software works.
|
|
40
43
|
|
|
41
44
|
## Required Mission Note Format
|
|
42
45
|
|
package/HR-Resource/cqo/SKILL.md
CHANGED
|
@@ -18,7 +18,7 @@ Own quality, recurrence prevention, and archive eligibility.
|
|
|
18
18
|
5. Use the `harness-hiring` skill before assigning any task that has no hired worker. Do not complete that task yourself.
|
|
19
19
|
6. Define quality gates and delegate evidence collection to hired workers in fresh sessions.
|
|
20
20
|
7. Monitor repeated issues and promote verified lessons to `.harness/conventions`, `.harness/gotchas`, `.harness/memories`, or `.harness/shared`.
|
|
21
|
-
8. Approve or reject archive based solely on worker-provided evidence.
|
|
21
|
+
8. Approve or reject archive based solely on worker-provided evidence and OPS runtime/watch evidence when the mission uses a runnable environment.
|
|
22
22
|
|
|
23
23
|
## Hard Rules
|
|
24
24
|
|
|
@@ -32,13 +32,23 @@ Every evaluator/tester dispatched by CQO must write its report under `.harness/d
|
|
|
32
32
|
|
|
33
33
|
**Owner is not the QA tester.** CQO must not approve a handoff that asks the Owner to verify basic functionality, regression safety, browser behavior, account setup, logs, or runtime health. CQO must use evaluator/tester workers to collect the evidence, including E2E/Playwright/browser checks, regression commands, test-account or seeded-data validation, screenshots, logs, and risk notes when relevant. If evidence is missing, CQO verdict is BLOCKED or FAIL, not "ask Owner to check."
|
|
34
34
|
|
|
35
|
+
**OPS must watch runnable verification.** When CQO evaluator workers run Playwright, E2E, API, visual, accessibility, performance, or regression checks against a local/dev/preview/Docker/cloud runtime, CQO must request OPS monitoring before issuing PASS. CQO must include OPS evidence in `cqo.md` or mark the verdict BLOCKED. A CQO PASS is invalid if OPS reports an open INCIDENT, missing runtime mapping, required log missing, service down, health mismatch, or unmonitored runtime that is part of the tested scenario.
|
|
36
|
+
|
|
37
|
+
If OPS reports an incident during verification:
|
|
38
|
+
|
|
39
|
+
1. CQO pauses PASS/Archive judgment.
|
|
40
|
+
2. CQO records which evaluator scenario was affected.
|
|
41
|
+
3. CQO routes impact back to CEO, who convenes CTO/CQO/OPS.
|
|
42
|
+
4. After CTO recovery, CQO reruns affected evaluator scenarios and requires OPS to confirm the runtime is clean.
|
|
43
|
+
|
|
35
44
|
Required output sections in `cqo.md`:
|
|
36
45
|
|
|
37
46
|
1. Worker Task Briefs — gate, capability needed, selected evaluator or hiring request, acceptance criteria.
|
|
38
47
|
2. Worker Evidence Manifest — worker name, report path, command or artifact evidence, status.
|
|
39
|
-
3.
|
|
40
|
-
4.
|
|
41
|
-
5.
|
|
48
|
+
3. OPS Watch Evidence — ops report path, monitored runtime mapping, incidents/warnings, and whether runtime evidence permits PASS.
|
|
49
|
+
4. CQO Verdict — PASS, FAIL, or BLOCKED based only on worker evidence plus required OPS watch evidence. Must reference Worker Evidence Manifest entries.
|
|
50
|
+
5. Recurrence Notes — accepted gotchas, conventions, memories, or none.
|
|
51
|
+
6. Implementation Notes — in English, with `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`.
|
|
42
52
|
|
|
43
53
|
## Worker Report Note Requirement
|
|
44
54
|
|
package/HR-Resource/ops/SKILL.md
CHANGED
|
@@ -9,9 +9,10 @@ disable-model-invocation: false
|
|
|
9
9
|
|
|
10
10
|
Monitor the environments that make the mission runnable.
|
|
11
11
|
|
|
12
|
-
OPS owns
|
|
12
|
+
OPS owns three environment classes:
|
|
13
13
|
|
|
14
14
|
- Build environment: command-based local execution such as `flutter run`, `npm run dev`, test watchers, local build scripts, and other foreground/background commands used by CXX workers.
|
|
15
|
+
- Verification environment: the runnable local, preview, Docker, or cloud target used while CQO evaluator workers run Playwright, E2E, API, visual, accessibility, performance, or regression checks.
|
|
15
16
|
- Service environment: an actual server endpoint that can be monitored. The server may be the Owner's local PC, Docker, a VM, AWS, or another cloud/server target. OPS does not invent this mapping; CEO must collect it from the Owner and record it before OPS treats it as live.
|
|
16
17
|
|
|
17
18
|
OPS is not the implementation owner. CTO/DevOps workers start or change systems; OPS observes whether the declared build/service environments are healthy and raises evidence-backed events.
|
|
@@ -21,6 +22,24 @@ OPS must not directly perform DevOps implementation, service fixes, config rewri
|
|
|
21
22
|
|
|
22
23
|
Owner is the final acceptance reviewer, not the runtime monitor. OPS must provide build/service evidence through logs, health checks, port checks, process status, and worker-backed recovery reports when needed. Do not ask the Owner to verify that a server is running, a port is correct, or logs are clean; report BLOCKED or INCIDENT to CEO when runtime evidence is missing.
|
|
23
24
|
|
|
25
|
+
## CQO Verification Watch
|
|
26
|
+
|
|
27
|
+
OPS must actively watch the runtime while CQO evaluator workers test the product. This is a pre-acceptance gate, not a post-launch nicety.
|
|
28
|
+
|
|
29
|
+
- Before CQO starts Playwright, E2E, API, visual, accessibility, performance, or regression checks, OPS must confirm the verification environment mapping: command/service name, cwd, host, port, health path if any, log path if any, and owning CXX.
|
|
30
|
+
- During CQO verification, OPS monitors declared build commands and service endpoints for crashes, port drops, health mismatches, log errors, API shape errors, abnormal response codes, and unmapped runtime drift.
|
|
31
|
+
- If OPS finds a non-good-case signal during CQO verification, OPS must record an INCIDENT or WARNING and immediately route the event to CEO with recommended participants: CTO for fix ownership, CQO for test impact, and OPS for evidence.
|
|
32
|
+
- CQO cannot issue PASS for a runnable product while OPS reports an open INCIDENT, missing runtime mapping, missing logs required by the mission, or an unmonitored service that is part of the tested scenario.
|
|
33
|
+
- OPS does not wait for the Owner to notice defects. Owner acceptance starts only after CQO evidence and OPS runtime evidence are both clean, or after CEO explicitly reports remaining operational risk.
|
|
34
|
+
|
|
35
|
+
## Post-Launch Watch
|
|
36
|
+
|
|
37
|
+
After service launch, OPS continues the same monitoring duty against `runtime.production.services[]`.
|
|
38
|
+
|
|
39
|
+
- User-impacting production signals are INCIDENT by default: service down, health check failure, repeated log errors, authentication/API breakage, payment/data-loss risk, severe latency, or critical user journey failure.
|
|
40
|
+
- Repeated incidents must trigger recovery coordination through CEO -> CTO/CQO/OPS. OPS supplies evidence and recovery criteria; CTO owns fixes; CQO owns regression confirmation.
|
|
41
|
+
- OPS may classify resolved events as close candidates only after the monitored endpoint is healthy and logs no longer show the triggering error pattern.
|
|
42
|
+
|
|
24
43
|
## Port Policy
|
|
25
44
|
|
|
26
45
|
- CEO must agree on a `{xx}000` base port with the Owner before CXX services are allocated.
|
|
@@ -31,16 +50,17 @@ Owner is the final acceptance reviewer, not the runtime monitor. OPS must provid
|
|
|
31
50
|
|
|
32
51
|
## Workflow
|
|
33
52
|
|
|
34
|
-
1. Read `.env` and `.harness/config.json runtime.ports`, `runtime.build`, and `runtime.production`.
|
|
53
|
+
1. Read `.env` and `.harness/config.json runtime.ports`, `runtime.build`, `runtime.verification`, and `runtime.production`.
|
|
35
54
|
2. Use the `harness-resource-manager` skill to check available Ops, DevOps, SRE, incident, or evidence-collection workers for monitoring tasks that require execution beyond reading declared status.
|
|
36
55
|
3. Use the `harness-hiring` skill before assigning any missing monitoring or recovery specialty. Do not complete that task yourself.
|
|
37
56
|
4. Monitor build environments declared in `runtime.build.commands[]`: command, cwd, expected port, log path, and owner.
|
|
38
|
-
5. Monitor
|
|
39
|
-
6.
|
|
40
|
-
7.
|
|
41
|
-
8.
|
|
42
|
-
9.
|
|
43
|
-
10.
|
|
57
|
+
5. Monitor verification environments declared in `runtime.verification` or reused from `runtime.build`/`runtime.production` while CQO evaluator workers run tests.
|
|
58
|
+
6. Monitor service environments declared in `runtime.production.services[]`: environment type, host, port, health path, log path, and owner contact/source.
|
|
59
|
+
7. Write daily logs under `.harness/logs/YYYY-MM-DD/` and mission decisions in `.harness/documents/{mission_name}/ops.md`.
|
|
60
|
+
8. Treat good-case success events as optional noise.
|
|
61
|
+
9. Log all non-good-case results: command failed, port down, health mismatch, log missing, missing parameter, API mismatch, crash, abnormal response shape, test-time runtime exception, user-impacting production exception, and deployment exception.
|
|
62
|
+
10. Classify exceptions as verification, build, backend, frontend, platform, external API, infrastructure, owner-config, production, or unknown.
|
|
63
|
+
11. Raise emergency events to CEO/CTO/CQO with evidence and the mapped environment record.
|
|
44
64
|
|
|
45
65
|
## Required Output Sections
|
|
46
66
|
|
|
@@ -48,6 +68,8 @@ Owner is the final acceptance reviewer, not the runtime monitor. OPS must provid
|
|
|
48
68
|
2. Environment Evidence — config path, command/service checked, observed status.
|
|
49
69
|
3. Worker Evidence Manifest — worker name, report path, status for delegated monitoring or recovery tasks.
|
|
50
70
|
4. OPS Event Decision — good-case silence, warning, incident, or emergency escalation.
|
|
51
|
-
5.
|
|
71
|
+
5. CQO Verification Watch — whether CQO testing was monitored, runtime mapping used, open incidents, and PASS/BLOCKED implication.
|
|
72
|
+
6. Post-Launch Watch — production services monitored, open incidents, recovery status, or not applicable.
|
|
73
|
+
7. Implementation Notes — in English, with `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`.
|
|
52
74
|
|
|
53
75
|
Every OPS worker brief must require the worker to append the same English `## Implementation Notes` block to the bottom of `.harness/documents/{mission_name}/ops/workers/{worker-name}.md`, covering risks, self-corrections, chosen direction, and unresolved questions. Use `None` for empty subsections.
|
package/README.md
CHANGED
|
@@ -105,7 +105,7 @@ Owner /submission → CEO → [relevant CXX] → [workers] → [convention updat
|
|
|
105
105
|
| 7 | No CXX self-execution — deliverables without matching worker records are rejected |
|
|
106
106
|
| 8 | No verdict without worker evidence — CQO self-inspection is not valid |
|
|
107
107
|
| 9 | Hierarchical worker ownership — worker reports live under `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/` |
|
|
108
|
-
| 10 | Implementation Notes required — `ceo.md`, every `{cxx}.md`, and every worker report must end with
|
|
108
|
+
| 10 | Implementation Notes required — `ceo.md`, every `{cxx}.md`, and every worker report must end with one English `## Implementation Notes` section in the same file |
|
|
109
109
|
|
|
110
110
|
### Implementation Notes Format
|
|
111
111
|
|
|
@@ -127,7 +127,7 @@ Every `ceo.md`, `{cxx}.md`, and worker report must end with:
|
|
|
127
127
|
- What still needs Owner or CXX confirmation
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
-
Use `None` when a subsection has no entries. This section is mandatory even for small or emergency work. CEO must reject any CXX report that omits it. CTO and CQO must not accept worker output that omits it.
|
|
130
|
+
Use `None` when a subsection has no entries. This section is mandatory even for small or emergency work. Do not create a separate sidecar notes file; the notes belong at the bottom of the same role or worker report that produced the decision/evidence. CEO must reject any CXX report that omits it. CTO and CQO must not accept worker output that omits it.
|
|
131
131
|
|
|
132
132
|
---
|
|
133
133
|
|
|
@@ -223,6 +223,9 @@ harness-hiring → register and onboard worker
|
|
|
223
223
|
|
|
224
224
|
| Version | Summary |
|
|
225
225
|
|---|---|
|
|
226
|
+
| 7.1.19 | `migrate` now carries OPS verification rules into existing installs: runtime.verification merge, HARNESS refresh, and AGENTS migration block |
|
|
227
|
+
| 7.1.18 | OPS watches CQO runnable verification and production incidents; Implementation Notes stay in the same role/worker report |
|
|
228
|
+
| 7.1.17 | Dashboard: fix /submission and /hot-fix missions displaying as /goal; runtime strip shows live owner command in mission flow tab |
|
|
226
229
|
| 7.1.16 | `migrate` now always fully replaces /goal, /submission, /hot-fix commands regardless of current state |
|
|
227
230
|
| 7.1.15 | Dashboard: reset embedded View Doc state when the selected mission or document target changes |
|
|
228
231
|
| 7.1.14 | Owner acceptance gate: Owner is final reviewer, not tester; dashboard org-node clicks initialize the detail pane |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { mkdtempSync, mkdirSync, rmSync, utimesSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { readHarnessState } from "../harness-state";
|
|
@@ -191,4 +191,60 @@ describe("readHarnessState", () => {
|
|
|
191
191
|
const snap = readHarnessState(dir);
|
|
192
192
|
expect(snap.archive.all.find((e) => e.dir === "sprint-1")?.result).toBe("PASS");
|
|
193
193
|
});
|
|
194
|
+
|
|
195
|
+
it("marks in-place goal document updates as submission only after the owner prompt", () => {
|
|
196
|
+
const harnessDir = path.join(dir, ".harness");
|
|
197
|
+
const missionDir = path.join(harnessDir, "documents", "goal-1-auth-system");
|
|
198
|
+
mkdirSync(missionDir, { recursive: true });
|
|
199
|
+
writeFileSync(path.join(missionDir, "ceo.md"), "# Auth system\n");
|
|
200
|
+
const beforePrompt = new Date("2026-05-20T01:00:00Z");
|
|
201
|
+
utimesSync(missionDir, beforePrompt, beforePrompt);
|
|
202
|
+
|
|
203
|
+
writeFileSync(
|
|
204
|
+
path.join(harnessDir, "progress.json"),
|
|
205
|
+
JSON.stringify({
|
|
206
|
+
owner_prompt: {
|
|
207
|
+
command: "submission",
|
|
208
|
+
summary: "/submission add SSO",
|
|
209
|
+
received_at: "2026-05-20T01:05:00Z",
|
|
210
|
+
status: "routing",
|
|
211
|
+
},
|
|
212
|
+
})
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
expect(readHarnessState(dir).missions[0].type).toBe("goal");
|
|
216
|
+
|
|
217
|
+
const afterPrompt = new Date("2026-05-20T01:06:00Z");
|
|
218
|
+
utimesSync(missionDir, afterPrompt, afterPrompt);
|
|
219
|
+
|
|
220
|
+
expect(readHarnessState(dir).missions[0].type).toBe("submission");
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("keeps explicit submission subdirectories as submission without relabeling the parent goal", () => {
|
|
224
|
+
const harnessDir = path.join(dir, ".harness");
|
|
225
|
+
const goalDir = path.join(harnessDir, "documents", "goal-1-auth-system");
|
|
226
|
+
const submissionDir = path.join(goalDir, "submission-1-add-sso");
|
|
227
|
+
mkdirSync(submissionDir, { recursive: true });
|
|
228
|
+
writeFileSync(path.join(goalDir, "ceo.md"), "# Auth system\n");
|
|
229
|
+
writeFileSync(path.join(submissionDir, "ceo.md"), "# Add SSO\n");
|
|
230
|
+
utimesSync(goalDir, new Date("2026-05-20T01:00:00Z"), new Date("2026-05-20T01:00:00Z"));
|
|
231
|
+
utimesSync(submissionDir, new Date("2026-05-20T01:06:00Z"), new Date("2026-05-20T01:06:00Z"));
|
|
232
|
+
|
|
233
|
+
writeFileSync(
|
|
234
|
+
path.join(harnessDir, "progress.json"),
|
|
235
|
+
JSON.stringify({
|
|
236
|
+
owner_prompt: {
|
|
237
|
+
command: "submission",
|
|
238
|
+
summary: "/submission add SSO",
|
|
239
|
+
received_at: "2026-05-20T01:05:00Z",
|
|
240
|
+
status: "routing",
|
|
241
|
+
},
|
|
242
|
+
})
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
const missions = readHarnessState(dir).missions;
|
|
246
|
+
expect(missions[0].missionId).toBe("goal-1-auth-system/submission-1-add-sso");
|
|
247
|
+
expect(missions[0].type).toBe("submission");
|
|
248
|
+
expect(missions.find((mission) => mission.missionId === "goal-1-auth-system")?.type).toBe("goal");
|
|
249
|
+
});
|
|
194
250
|
});
|
|
@@ -986,7 +986,7 @@ function buildRuntime(progress: RawProgress | null): RuntimeSnapshot {
|
|
|
986
986
|
};
|
|
987
987
|
}
|
|
988
988
|
|
|
989
|
-
function readMissions(rootDir: string, limit = 15): MissionDoc[] {
|
|
989
|
+
function readMissions(rootDir: string, progress: RawProgress | null = null, limit = 15): MissionDoc[] {
|
|
990
990
|
const docsDir = path.join(rootDir, ".harness", "documents");
|
|
991
991
|
if (!existsSync(docsDir)) return [];
|
|
992
992
|
|
|
@@ -1083,6 +1083,27 @@ function readMissions(rootDir: string, limit = 15): MissionDoc[] {
|
|
|
1083
1083
|
.sort((a, b) => new Date(b.ts).getTime() - new Date(a.ts).getTime())
|
|
1084
1084
|
.slice(0, limit);
|
|
1085
1085
|
|
|
1086
|
+
// When the CEO updates a goal directory in-place for a submission or hot-fix
|
|
1087
|
+
// (instead of creating a submission-* or hotfix-* subdirectory), the most
|
|
1088
|
+
// recently modified mission still has type "goal" from its directory name.
|
|
1089
|
+
// Override it using owner_prompt.command so the display reflects the actual
|
|
1090
|
+
// command the Owner issued, not just the directory prefix.
|
|
1091
|
+
const cmd = progress?.owner_prompt?.command;
|
|
1092
|
+
if (missions.length > 0 && (cmd === "submission" || cmd === "hot-fix")) {
|
|
1093
|
+
const top = missions[0];
|
|
1094
|
+
const ownerPromptReceivedAt = progress?.owner_prompt?.received_at
|
|
1095
|
+
? new Date(progress.owner_prompt.received_at).getTime()
|
|
1096
|
+
: null;
|
|
1097
|
+
const missionUpdatedAt = new Date(top.ts).getTime();
|
|
1098
|
+
const missionUpdatedAfterPrompt =
|
|
1099
|
+
ownerPromptReceivedAt === null ||
|
|
1100
|
+
Number.isNaN(ownerPromptReceivedAt) ||
|
|
1101
|
+
missionUpdatedAt >= ownerPromptReceivedAt;
|
|
1102
|
+
if (top.type === "goal" && missionUpdatedAfterPrompt) {
|
|
1103
|
+
missions[0] = { ...top, type: cmd === "hot-fix" ? "hotfix" : "submission" };
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1086
1107
|
return missions;
|
|
1087
1108
|
}
|
|
1088
1109
|
|
|
@@ -1165,7 +1186,7 @@ export function readHarnessState(rootDir: string): HarnessSnapshot {
|
|
|
1165
1186
|
};
|
|
1166
1187
|
const snapshot = emptySnapshot(banner, rootDir);
|
|
1167
1188
|
snapshot.archive = buildArchive(rootDir);
|
|
1168
|
-
snapshot.missions = readMissions(rootDir);
|
|
1189
|
+
snapshot.missions = readMissions(rootDir, null);
|
|
1169
1190
|
snapshot.ownerHistory = readOwnerHistory(rootDir);
|
|
1170
1191
|
snapshot.gotchas = readGotchas(rootDir);
|
|
1171
1192
|
return snapshot;
|
|
@@ -1217,7 +1238,7 @@ export function readHarnessState(rootDir: string): HarnessSnapshot {
|
|
|
1217
1238
|
errorBanner: null,
|
|
1218
1239
|
dashboard,
|
|
1219
1240
|
runtime: buildRuntime(progress),
|
|
1220
|
-
missions: readMissions(rootDir),
|
|
1241
|
+
missions: readMissions(rootDir, progress),
|
|
1221
1242
|
ownerHistory: readOwnerHistory(rootDir),
|
|
1222
1243
|
gotchas: readGotchas(rootDir),
|
|
1223
1244
|
};
|
|
@@ -113,7 +113,7 @@ Owner는 최종 검수자다. Tester, QA worker, debugger, 배포 확인 담당
|
|
|
113
113
|
- 동작하지 않거나 검증되지 않았거나 부분적으로만 실행되는 소프트웨어를 Owner에게 전달하며 "확인해 주세요"를 다음 액션으로 삼지 않는다.
|
|
114
114
|
- Owner에게 개발자 테스트, 회귀 확인, 계정 생성/로그인 확인, Playwright 확인, E2E 순회, 로그 점검, 기본 기능 검증을 요구하지 않는다.
|
|
115
115
|
- CEO와 CXX는 worker를 통해 자체 검증을 계획하고 실행한다: unit test, E2E test, Playwright/browser check, test account, seed data, build/run check, log evidence.
|
|
116
|
-
- Owner 검수는 CEO가 CXX 완료 기록, CTO 구현 증거, CQO evaluator 증거, 필요한 OPS
|
|
116
|
+
- Owner 검수는 CEO가 CXX 완료 기록, CTO 구현 증거, CQO evaluator 증거, 필요한 OPS 검수관제/런타임 증거를 모아 goal이 실제로 완수되었음을 보인 뒤에만 요청한다.
|
|
117
117
|
- 최종 Owner 보고는 acceptance review, 제품 판단, 비즈니스 승인을 요청할 수 있다. 소프트웨어가 동작하는지 발견해 달라고 요청해서는 안 된다.
|
|
118
118
|
|
|
119
119
|
## 8. 미션 플로우
|
|
@@ -124,6 +124,7 @@ Owner는 최종 검수자다. Tester, QA worker, debugger, 배포 확인 담당
|
|
|
124
124
|
2. CEO가 관련 CXX에게만 범위를 한정한 질문을 전달한다.
|
|
125
125
|
3. 각 CXX가 worker를 고용하고, 위임하고, 결과를 수집하여 `{cxx}.md`에 기록한다.
|
|
126
126
|
4. CEO가 CXX 산출물을 종합하여 다음 CXX에 라우팅하거나 Owner에게 보고한다.
|
|
127
|
+
5. 실행 가능한 local, preview, Docker, production-like 환경이 포함된 mission이면, CQO evaluator worker가 Playwright/E2E/API/visual/performance/regression 검수를 수행하는 동안 OPS가 해당 runtime을 관제한다.
|
|
127
128
|
|
|
128
129
|
**완료 기준:** `.harness/documents/goal-{index}-{name}/ceo.md`에 최종 Owner 보고가 존재한다.
|
|
129
130
|
|
|
@@ -174,6 +175,9 @@ Owner는 최종 검수자다. Tester, QA worker, debugger, 배포 확인 담당
|
|
|
174
175
|
5. **gotcha 등록 생략 금지** — 모든 hot-fix는 `.harness/gotchas/` 또는 `.harness/conventions/`에 최소 하나의 항목을 만든다.
|
|
175
176
|
6. **미션 중 이 파일 편집 금지** — AGENTS.md를 수정하려면 별도 `/goal`을 제출한다.
|
|
176
177
|
7. **Owner는 최종 검수만 수행** — Owner는 tester나 QA 대체자가 아니다. CEO/CXX는 worker-backed verification으로 goal 완료 가능성을 증명하기 전까지 "완료했습니다, 확인해 주세요"라고 보고하지 않는다.
|
|
178
|
+
8. **OPS는 CQO 검수 중 관제한다** — 실행 가능한 제품에서 CQO PASS는 OPS가 검수 runtime을 관제했거나 OPS watch가 불필요한 이유를 기록했을 때만 유효하다. 열린 OPS incident, runtime mapping 누락, 필수 로그 누락, service down, health mismatch, 검수 대상 service 미관제는 Owner acceptance를 막는다.
|
|
179
|
+
9. **Production incident는 회사 이벤트다** — 오픈 후 사용자 영향 OPS signal은 CEO를 통해 CTO/CQO/OPS로 라우팅된다. CTO는 복구, CQO는 회귀 검증, OPS는 증거와 close criteria를 책임진다.
|
|
180
|
+
10. **Implementation Notes는 같은 보고서 하단에 작성** — `ceo.md`, 모든 `{cxx}.md`, 모든 worker report는 하나의 English `## Implementation Notes` 섹션으로 끝나야 한다. 별도 sidecar notes 파일을 만들지 않는다. 결정/증거를 만든 동일한 role 또는 worker report 하단에 `Design Decisions`, `Deviations`, `Tradeoffs`, `Open Questions`를 작성하고 빈 항목은 `None`을 사용한다.
|
|
177
181
|
|
|
178
182
|
---
|
|
179
183
|
|
|
@@ -61,7 +61,7 @@ The Owner is the final acceptance reviewer, not a tester, QA worker, debugger, o
|
|
|
61
61
|
- Do not hand the Owner broken, unverified, or partially runnable software with "please check this" as the next action.
|
|
62
62
|
- Do not ask the Owner to perform developer testing, regression checks, account setup checks, Playwright review, E2E traversal, log inspection, or basic functionality verification.
|
|
63
63
|
- CEO and CXX must plan and execute self-verification through workers: unit tests, E2E tests, Playwright/browser checks, test accounts, seeded data, build/run checks, logs, and documented evidence.
|
|
64
|
-
- Owner inspection happens only after CEO has collected CXX completion records, CTO implementation evidence, CQO evaluator evidence, and any OPS runtime evidence needed to show the goal is genuinely complete.
|
|
64
|
+
- Owner inspection happens only after CEO has collected CXX completion records, CTO implementation evidence, CQO evaluator evidence, and any OPS verification-watch/runtime evidence needed to show the goal is genuinely complete.
|
|
65
65
|
- A final Owner report may ask for acceptance review, product judgment, or business approval. It must not ask the Owner to discover whether the software works.
|
|
66
66
|
|
|
67
67
|
---
|
|
@@ -74,6 +74,7 @@ The Owner is the final acceptance reviewer, not a tester, QA worker, debugger, o
|
|
|
74
74
|
2. CEO sends scoped questions to relevant CXX only.
|
|
75
75
|
3. Each CXX hires workers, collects reports, records decisions in `{cxx}.md`.
|
|
76
76
|
4. CEO aggregates CXX outputs, routes to next CXX or reports to Owner.
|
|
77
|
+
5. If the mission uses a runnable local, preview, Docker, or production-like environment, OPS watches the runtime while CQO evaluator workers run Playwright/E2E/API/visual/performance/regression checks.
|
|
77
78
|
|
|
78
79
|
**Complete when:** `.harness/documents/goal-{index}-{name}/ceo.md` contains a final Owner report.
|
|
79
80
|
|
|
@@ -131,8 +132,10 @@ Note: A docmeta skip decision on harness documents (ceo.md, cto.md, cqo.md, work
|
|
|
131
132
|
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.
|
|
132
133
|
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.
|
|
133
134
|
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.
|
|
134
|
-
11. **Implementation Notes required** — `ceo.md`, every `{cxx}.md`, and every worker report must end with
|
|
135
|
+
11. **Implementation Notes required** — `ceo.md`, every `{cxx}.md`, and every worker report must end with one English `## Implementation Notes` section containing `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`. Use `None` for empty subsections. Do not create a separate sidecar notes file; the notes belong at the bottom of the same role or worker report that produced the decision/evidence.
|
|
135
136
|
12. **Owner is final acceptance only** — Owner is not a tester or QA substitute. CEO/CXX must not report "done, please check" until worker-backed verification proves the goal can be completed. Use unit tests, E2E, Playwright, test accounts, seeded data, build/run checks, logs, and CQO evidence before requesting Owner acceptance.
|
|
137
|
+
13. **OPS watches CQO verification** — For runnable products, CQO PASS is invalid unless OPS has monitored the verification runtime or documented why OPS watch is not applicable. Open OPS incidents, missing runtime mapping, required log gaps, service down, health mismatch, or an unmonitored tested service block Owner acceptance.
|
|
138
|
+
14. **Production incidents are company events** — After launch, user-impacting OPS signals route through CEO to CTO/CQO/OPS. CTO owns recovery, CQO owns regression confirmation, and OPS owns evidence plus close criteria.
|
|
136
139
|
|
|
137
140
|
---
|
|
138
141
|
|
|
@@ -109,4 +109,4 @@ Flat `.harness/documents/{mission}/workers/` reports are legacy. New worker evid
|
|
|
109
109
|
- None
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
The notes must be written in English. Use `None` when a subsection has no entries.
|
|
112
|
+
The notes must be written in English. Use `None` when a subsection has no entries. Do not create a separate sidecar notes file; keep the notes at the bottom of the same role or worker report that produced the decision/evidence.
|
|
@@ -213,6 +213,20 @@
|
|
|
213
213
|
}
|
|
214
214
|
]
|
|
215
215
|
},
|
|
216
|
+
"verification": {
|
|
217
|
+
"comment": "CQO evaluator 가 Playwright/E2E/API/visual/performance/regression 검수를 수행하는 동안 OPS 가 관제할 runtime mapping. 기본값은 build/production mapping 을 재사용하되, 검수 전 CTO/CQO/OPS 가 실제 command/service, port, health_path, log_path 를 확정해야 한다.",
|
|
218
|
+
"watch_during_cqo": true,
|
|
219
|
+
"require_ops_evidence_for_pass": true,
|
|
220
|
+
"reuse": "build_or_production",
|
|
221
|
+
"block_pass_on": [
|
|
222
|
+
"open_incident",
|
|
223
|
+
"missing_runtime_mapping",
|
|
224
|
+
"missing_required_log",
|
|
225
|
+
"service_down",
|
|
226
|
+
"health_mismatch",
|
|
227
|
+
"unmonitored_tested_service"
|
|
228
|
+
]
|
|
229
|
+
},
|
|
216
230
|
"play": {
|
|
217
231
|
"comment": "/play-harness 가 실행하는 play mode command. release mode 와 공존할 수 없으며, scripts/play.sh 가 상호 배타 상태를 강제한다.",
|
|
218
232
|
"cwd": ".",
|
package/bin/init.js
CHANGED
|
@@ -1204,8 +1204,11 @@ function detectMigrationNeeded() {
|
|
|
1204
1204
|
progressLegacyRouting: false,
|
|
1205
1205
|
configMissingCompanyMode: false,
|
|
1206
1206
|
configLegacyRouting: false,
|
|
1207
|
+
configRuntimeVerificationMissing: false,
|
|
1207
1208
|
coreSkillsStale: false,
|
|
1208
1209
|
hrResourcePoolStale: false,
|
|
1210
|
+
harnessMdStale: false,
|
|
1211
|
+
agentsMissingOpsVerificationRules: false,
|
|
1209
1212
|
rosterCodexPathsMissing: false,
|
|
1210
1213
|
resourceIndexCodexWordingMissing: false,
|
|
1211
1214
|
memoryMissingSystemEntries: [],
|
|
@@ -1231,6 +1234,12 @@ function detectMigrationNeeded() {
|
|
|
1231
1234
|
}
|
|
1232
1235
|
}
|
|
1233
1236
|
|
|
1237
|
+
const harnessMdPath = path.join(HARNESS_DIR, 'HARNESS.md');
|
|
1238
|
+
const harnessMdTplPath = path.join(PKG_ROOT, 'assets', 'templates', 'HARNESS.md');
|
|
1239
|
+
if (fs.existsSync(harnessMdTplPath) && (!fs.existsSync(harnessMdPath) || fs.readFileSync(harnessMdPath, 'utf8') !== fs.readFileSync(harnessMdTplPath, 'utf8'))) {
|
|
1240
|
+
flags.harnessMdStale = true;
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1234
1243
|
// Gotcha entry-level diff: for each bundled gotcha file, compare entry IDs.
|
|
1235
1244
|
// 사용자가 직접 추가한 [G-NNN] 은 절대 건드리지 않으며, 패키지에서 새로
|
|
1236
1245
|
// 도입된 시스템 entry 만 append 대상.
|
|
@@ -1295,6 +1304,9 @@ function detectMigrationNeeded() {
|
|
|
1295
1304
|
try {
|
|
1296
1305
|
const c = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
1297
1306
|
if (!c.company_mode || c.mode_selection) flags.configMissingCompanyMode = true;
|
|
1307
|
+
if (!c.runtime?.verification?.watch_during_cqo || !c.runtime?.verification?.require_ops_evidence_for_pass) {
|
|
1308
|
+
flags.configRuntimeVerificationMissing = true;
|
|
1309
|
+
}
|
|
1298
1310
|
if (
|
|
1299
1311
|
c.behavior?.auto_route_dispatcher !== undefined ||
|
|
1300
1312
|
c.behavior?.auto_route_dispatcher_description ||
|
|
@@ -1303,6 +1315,19 @@ function detectMigrationNeeded() {
|
|
|
1303
1315
|
) flags.configLegacyRouting = true;
|
|
1304
1316
|
} catch {}
|
|
1305
1317
|
}
|
|
1318
|
+
const agentsPath = path.join(PROJECT_ROOT, 'AGENTS.md');
|
|
1319
|
+
if (fs.existsSync(agentsPath)) {
|
|
1320
|
+
try {
|
|
1321
|
+
const agentsBody = fs.readFileSync(agentsPath, 'utf8');
|
|
1322
|
+
if (
|
|
1323
|
+
!agentsBody.includes('OPS watches CQO verification') &&
|
|
1324
|
+
!agentsBody.includes('OPS는 CQO 검수 중 관제한다') &&
|
|
1325
|
+
!agentsBody.includes('runtime.verification')
|
|
1326
|
+
) {
|
|
1327
|
+
flags.agentsMissingOpsVerificationRules = true;
|
|
1328
|
+
}
|
|
1329
|
+
} catch {}
|
|
1330
|
+
}
|
|
1306
1331
|
if (fs.existsSync(rosterPath)) {
|
|
1307
1332
|
try {
|
|
1308
1333
|
const roster = JSON.parse(fs.readFileSync(rosterPath, 'utf8'));
|
|
@@ -1410,9 +1435,20 @@ function showMigrationProposal(flags) {
|
|
|
1410
1435
|
console.log(' • config.json: company_mode 섹션 동기화 가능');
|
|
1411
1436
|
console.log(' Owner /goal, /submission, /hot-fix → CEO/CXX/worker 흐름으로 고정합니다.');
|
|
1412
1437
|
}
|
|
1438
|
+
if (flags.configRuntimeVerificationMissing) {
|
|
1439
|
+
console.log(' • config.json: runtime.verification 섹션 추가 가능');
|
|
1440
|
+
console.log(' CQO 검수 중 OPS runtime watch 와 PASS 차단 조건을 설정합니다.');
|
|
1441
|
+
}
|
|
1413
1442
|
if (flags.configLegacyRouting) {
|
|
1414
1443
|
console.log(' • config.json: legacy dispatcher/conductor wording → v7 CEO/CXX wording');
|
|
1415
1444
|
}
|
|
1445
|
+
if (flags.harnessMdStale) {
|
|
1446
|
+
console.log(' • .harness/HARNESS.md: 최신 패키지 reference 문서로 refresh 가능');
|
|
1447
|
+
}
|
|
1448
|
+
if (flags.agentsMissingOpsVerificationRules) {
|
|
1449
|
+
console.log(' • AGENTS.md: OPS/CQO 검수관제 시스템 규칙 append 가능');
|
|
1450
|
+
console.log(' 사용자 규칙은 보존하고 하네스 migration block 만 끝에 추가합니다.');
|
|
1451
|
+
}
|
|
1416
1452
|
if (flags.coreSkillsStale) {
|
|
1417
1453
|
console.log(' • .claude/.codex skills: harness-* core skills 최신 패키지로 refresh');
|
|
1418
1454
|
}
|
|
@@ -1475,8 +1511,11 @@ function runMigrate(opts = {}) {
|
|
|
1475
1511
|
!flags.progressLegacyRouting &&
|
|
1476
1512
|
!flags.configMissingCompanyMode &&
|
|
1477
1513
|
!flags.configLegacyRouting &&
|
|
1514
|
+
!flags.configRuntimeVerificationMissing &&
|
|
1478
1515
|
!flags.coreSkillsStale &&
|
|
1479
1516
|
!flags.hrResourcePoolStale &&
|
|
1517
|
+
!flags.harnessMdStale &&
|
|
1518
|
+
!flags.agentsMissingOpsVerificationRules &&
|
|
1480
1519
|
!flags.rosterCodexPathsMissing &&
|
|
1481
1520
|
!flags.resourceIndexCodexWordingMissing &&
|
|
1482
1521
|
(!flags.memoryMissingSystemEntries || flags.memoryMissingSystemEntries.length === 0) &&
|
|
@@ -1526,29 +1565,36 @@ function runMigrate(opts = {}) {
|
|
|
1526
1565
|
}
|
|
1527
1566
|
}
|
|
1528
1567
|
|
|
1529
|
-
// 2. config.json — inject company_mode from template if missing
|
|
1568
|
+
// 2. config.json — inject company_mode/runtime verification from template if missing
|
|
1530
1569
|
const configPath = path.join(HARNESS_DIR, 'config.json');
|
|
1531
1570
|
const tplPath = path.join(PKG_ROOT, 'assets', 'templates', 'config.json');
|
|
1532
|
-
if ((flags.configMissingCompanyMode || flags.configLegacyRouting) && fs.existsSync(configPath) && fs.existsSync(tplPath)) {
|
|
1571
|
+
if ((flags.configMissingCompanyMode || flags.configLegacyRouting || flags.configRuntimeVerificationMissing) && fs.existsSync(configPath) && fs.existsSync(tplPath)) {
|
|
1533
1572
|
const original = fs.readFileSync(configPath, 'utf8');
|
|
1534
1573
|
const c = JSON.parse(original);
|
|
1535
1574
|
const tpl = JSON.parse(fs.readFileSync(tplPath, 'utf8'));
|
|
1536
1575
|
if (tpl.company_mode) {
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1576
|
+
if (flags.configMissingCompanyMode || flags.configLegacyRouting) {
|
|
1577
|
+
c.company_mode = {
|
|
1578
|
+
...tpl.company_mode,
|
|
1579
|
+
comment: 'v7 — 회사모드는 CEO/CXX/worker 문서 흐름으로 운영된다.',
|
|
1580
|
+
owner: 'ceo',
|
|
1581
|
+
};
|
|
1582
|
+
c.harness = tpl.harness || c.harness;
|
|
1583
|
+
c.agents = tpl.agents || c.agents;
|
|
1584
|
+
c.flow = tpl.flow || c.flow;
|
|
1585
|
+
c.behavior = c.behavior || {};
|
|
1586
|
+
c.behavior.auto_route_ceo = c.behavior.auto_route_ceo ?? c.behavior.auto_route_dispatcher ?? true;
|
|
1587
|
+
c.behavior.auto_route_ceo_description = 'true 이면 /goal, /submission, /hot-fix 이후 Owner 입력을 v7 CEO/CXX mission flow 기준으로 안내한다.';
|
|
1588
|
+
delete c.behavior.auto_route_dispatcher;
|
|
1589
|
+
delete c.behavior.auto_route_dispatcher_description;
|
|
1590
|
+
delete c.mode_selection;
|
|
1591
|
+
log(' config.json: v7 CEO/CXX routing 섹션 동기화');
|
|
1592
|
+
}
|
|
1593
|
+
if (flags.configRuntimeVerificationMissing && tpl.runtime?.verification) {
|
|
1594
|
+
c.runtime = c.runtime || {};
|
|
1595
|
+
c.runtime.verification = deepMerge(tpl.runtime.verification, c.runtime.verification || {});
|
|
1596
|
+
log(' config.json: runtime.verification 섹션 동기화');
|
|
1597
|
+
}
|
|
1552
1598
|
if (!dryRun) {
|
|
1553
1599
|
fs.writeFileSync(path.join(backupDir, 'config.json'), original);
|
|
1554
1600
|
fs.writeFileSync(configPath, JSON.stringify(c, null, 2) + '\n');
|
|
@@ -1720,7 +1766,50 @@ function runMigrate(opts = {}) {
|
|
|
1720
1766
|
}
|
|
1721
1767
|
}
|
|
1722
1768
|
|
|
1723
|
-
// 5.
|
|
1769
|
+
// 5. Refresh package-owned reference doc. This is not user-authored mission state.
|
|
1770
|
+
if (flags.harnessMdStale) {
|
|
1771
|
+
const harnessMdSrc = path.join(PKG_ROOT, 'assets', 'templates', 'HARNESS.md');
|
|
1772
|
+
const harnessMdDest = path.join(HARNESS_DIR, 'HARNESS.md');
|
|
1773
|
+
if (fs.existsSync(harnessMdSrc)) {
|
|
1774
|
+
log(' .harness/HARNESS.md: 최신 reference 문서로 refresh');
|
|
1775
|
+
if (!dryRun) {
|
|
1776
|
+
if (fs.existsSync(harnessMdDest)) {
|
|
1777
|
+
fs.writeFileSync(path.join(backupDir, 'HARNESS.md'), fs.readFileSync(harnessMdDest, 'utf8'));
|
|
1778
|
+
}
|
|
1779
|
+
copyFile(harnessMdSrc, harnessMdDest);
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
// 6. AGENTS.md is user/project-facing, so never replace it during migrate.
|
|
1785
|
+
// Append only a small system migration block when the OPS verification
|
|
1786
|
+
// rules are absent.
|
|
1787
|
+
if (flags.agentsMissingOpsVerificationRules) {
|
|
1788
|
+
const agentsPath = path.join(PROJECT_ROOT, 'AGENTS.md');
|
|
1789
|
+
if (fs.existsSync(agentsPath)) {
|
|
1790
|
+
const original = fs.readFileSync(agentsPath, 'utf8');
|
|
1791
|
+
const block = [
|
|
1792
|
+
'',
|
|
1793
|
+
'---',
|
|
1794
|
+
'',
|
|
1795
|
+
'## walwal-harness Migration Rules — v7.1.19',
|
|
1796
|
+
'',
|
|
1797
|
+
'- OPS watches CQO verification for runnable local, preview, Docker, or production-like environments.',
|
|
1798
|
+
'- CQO PASS is blocked when OPS reports an open incident, missing runtime mapping, missing required log, service down, health mismatch, or unmonitored tested service.',
|
|
1799
|
+
'- Production incidents are company events routed by CEO to CTO/CQO/OPS: CTO owns recovery, CQO owns regression confirmation, and OPS owns evidence plus close criteria.',
|
|
1800
|
+
'- `ceo.md`, every `{cxx}.md`, and every worker report must keep the English `## Implementation Notes` section in the same file. Do not create a sidecar notes file.',
|
|
1801
|
+
''
|
|
1802
|
+
].join('\n');
|
|
1803
|
+
log(' AGENTS.md: OPS/CQO 검수관제 시스템 규칙 append');
|
|
1804
|
+
if (!dryRun) {
|
|
1805
|
+
fs.writeFileSync(path.join(backupDir, 'AGENTS.md'), original);
|
|
1806
|
+
const sep = original.endsWith('\n') ? '' : '\n';
|
|
1807
|
+
fs.writeFileSync(agentsPath, original + sep + block);
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
// 7. Bundle version stamp — record which package version was last applied.
|
|
1724
1813
|
if (flags.bundleVersionStale) {
|
|
1725
1814
|
const { current, installed } = flags.bundleVersionStale;
|
|
1726
1815
|
log(` .bundle-version: ${installed ?? '(none)'} → ${current}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walwal-harness/cli",
|
|
3
|
-
"version": "7.1.
|
|
3
|
+
"version": "7.1.19",
|
|
4
4
|
"description": "Company-style AI agent harness for Claude and Codex. Installs commands, CXX agents, skills, HR-Resource hiring pool, and project-local .harness runtime state.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"walwal-harness": "bin/init.js"
|
|
@@ -146,7 +146,7 @@ ${CONTEXT_WARNING}
|
|
|
146
146
|
## Route
|
|
147
147
|
- pipeline=none/init → harness-ceo 스킬로 Owner /goal, /submission, /hot-fix를 접수하고 mission 문서를 생성
|
|
148
148
|
- 기본 경로는 v7 CXX 회사 루프다: CEO -> COO/CDO/CTO/CQO/OPS -> harness-resource-manager -> harness-hiring -> hired workers -> CXX review -> CEO report
|
|
149
|
-
- CXX는 직접 전문 산출물을 만들지 않고 worker report를
|
|
149
|
+
- CXX는 직접 전문 산출물을 만들지 않고 worker report를 \`.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/\`에 남겨야 한다
|
|
150
150
|
- Owner에게 "계속 진행", "진행할까요?", "다음 명령을 입력하세요"를 요구하지 않는다. GOAL이 있고 escalation이 아니면 즉시 next_agent/current_agent 업무를 수행한다
|
|
151
151
|
- Owner 입력은 목표 변경·사고·결과 확인용이지 회사 진행을 펌프하는 신호가 아니다
|
|
152
152
|
- CEO는 필요한 CXX만 호출하고, CXX는 resource-manager/hiring 없이 worker 업무를 수행하지 않는다
|