@walwal-harness/cli 7.1.17 → 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.
@@ -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 services 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.
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
 
@@ -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. CQO Verdict — PASS, FAIL, or BLOCKED based only on worker evidence. Must reference Worker Evidence Manifest entries.
40
- 4. Recurrence Notes — accepted gotchas, conventions, memories, or none.
41
- 5. Implementation Notes — in English, with `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`.
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
 
@@ -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 two environment classes:
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 service environments declared in `runtime.production.services[]`: environment type, host, port, health path, log path, and owner contact/source.
39
- 6. Write daily logs under `.harness/logs/YYYY-MM-DD/` and mission decisions in `.harness/documents/{mission_name}/ops.md`.
40
- 7. Treat good-case success events as optional noise.
41
- 8. Log all non-good-case results: command failed, port down, health mismatch, log missing, missing parameter, API mismatch, crash, abnormal response shape, and deployment exception.
42
- 9. Classify exceptions as build, backend, frontend, platform, external API, infrastructure, owner-config, or unknown.
43
- 10. Raise emergency events to CEO/CTO/CQO with evidence and the mapped environment record.
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. Implementation Notes — in English, with `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`.
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 an English `## Implementation Notes` section |
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,8 @@ 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 |
226
228
  | 7.1.17 | Dashboard: fix /submission and /hot-fix missions displaying as /goal; runtime strip shows live owner command in mission flow tab |
227
229
  | 7.1.16 | `migrate` now always fully replaces /goal, /submission, /hot-fix commands regardless of current state |
228
230
  | 7.1.15 | Dashboard: reset embedded View Doc state when the selected mission or document target changes |
@@ -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
  });
@@ -1091,7 +1091,15 @@ function readMissions(rootDir: string, progress: RawProgress | null = null, limi
1091
1091
  const cmd = progress?.owner_prompt?.command;
1092
1092
  if (missions.length > 0 && (cmd === "submission" || cmd === "hot-fix")) {
1093
1093
  const top = missions[0];
1094
- if (top.type === "goal") {
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) {
1095
1103
  missions[0] = { ...top, type: cmd === "hot-fix" ? "hotfix" : "submission" };
1096
1104
  }
1097
1105
  }
@@ -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 런타임 증거를 모아 goal이 실제로 완수되었음을 보인 뒤에만 요청한다.
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 an English `## Implementation Notes` section containing `Design Decisions`, `Deviations`, `Tradeoffs`, and `Open Questions`. Use `None` for empty subsections.
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
- c.company_mode = {
1538
- ...tpl.company_mode,
1539
- comment: 'v7 — 회사모드는 CEO/CXX/worker 문서 흐름으로 운영된다.',
1540
- owner: 'ceo',
1541
- };
1542
- c.harness = tpl.harness || c.harness;
1543
- c.agents = tpl.agents || c.agents;
1544
- c.flow = tpl.flow || c.flow;
1545
- c.behavior = c.behavior || {};
1546
- c.behavior.auto_route_ceo = c.behavior.auto_route_ceo ?? c.behavior.auto_route_dispatcher ?? true;
1547
- c.behavior.auto_route_ceo_description = 'true 이면 /goal, /submission, /hot-fix 이후 Owner 입력을 v7 CEO/CXX mission flow 기준으로 안내한다.';
1548
- delete c.behavior.auto_route_dispatcher;
1549
- delete c.behavior.auto_route_dispatcher_description;
1550
- delete c.mode_selection;
1551
- log(' config.json: v7 CEO/CXX routing 섹션 동기화');
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. Bundle version stamp — record which package version was last applied.
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.17",
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를 `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/`에 남겨야 한다
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 업무를 수행하지 않는다