@walwal-harness/cli 7.1.40 → 7.1.42
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/cdo/SKILL.md +9 -1
- package/HR-Resource/ceo/SKILL.md +33 -2
- package/HR-Resource/coo/SKILL.md +9 -1
- package/HR-Resource/cqo/SKILL.md +9 -1
- package/HR-Resource/cto/SKILL.md +10 -2
- package/HR-Resource/ops/SKILL.md +12 -4
- package/HR-Resource/ops-prompt-inspector/SKILL.md +11 -6
- package/HR-Resource/ops-prompt-inspector/assets/prompt-inspector-static.js +180 -0
- package/HR-Resource/ops-prompt-inspector/scripts/setup.py +66 -3
- package/apps/harness-dashboard/app/api/metrics/route.ts +17 -0
- package/apps/harness-dashboard/app/api/wake/route.ts +41 -0
- package/apps/harness-dashboard/app/brick.css +482 -0
- package/apps/harness-dashboard/app/layout.tsx +13 -0
- package/apps/harness-dashboard/app/page.tsx +2 -2
- package/apps/harness-dashboard/components/Scene.tsx +690 -36
- package/apps/harness-dashboard/components/brick/BrickDashboard.tsx +149 -0
- package/apps/harness-dashboard/components/brick/reports.tsx +291 -0
- package/apps/harness-dashboard/components/brick/tweaks.tsx +738 -0
- package/apps/harness-dashboard/components/brick/ui.tsx +463 -0
- package/apps/harness-dashboard/components/brick/views-graph.tsx +305 -0
- package/apps/harness-dashboard/components/brick/views-grid.tsx +543 -0
- package/apps/harness-dashboard/components/brick/views-timeline.tsx +238 -0
- package/apps/harness-dashboard/lib/__tests__/harness-state.test.ts +1 -202
- package/apps/harness-dashboard/lib/__tests__/sandbox-e2e.test.ts +490 -0
- package/apps/harness-dashboard/lib/brick/adapter.ts +423 -0
- package/apps/harness-dashboard/lib/brick/contract.ts +247 -0
- package/apps/harness-dashboard/lib/harness-state.ts +107 -796
- package/apps/harness-dashboard/lib/metrics/sampler.ts +545 -0
- package/apps/harness-dashboard/lib/types.ts +22 -222
- package/apps/harness-dashboard/playwright.config.ts +26 -7
- package/assets/templates/AGENTS-ko.md.template +1 -1
- package/assets/templates/AGENTS.md.template +12 -2
- package/assets/templates/HARNESS.md +2 -0
- package/assets/templates/company-pipeline-manifest.json +5 -14
- package/assets/templates/worker-report.md.template +38 -0
- package/bin/init.js +2 -1
- package/commands/goal.md +4 -2
- package/commands/hot-fix.md +1 -1
- package/commands/submission.md +1 -1
- package/package.json +1 -1
- package/scripts/conductor-tick.sh +12 -0
- package/scripts/harness-agenda.sh +105 -0
- package/scripts/harness-company-block.sh +89 -0
- package/scripts/harness-company-complete.sh +17 -8
- package/scripts/harness-company-cycle.sh +54 -0
- package/scripts/harness-progress-set.sh +8 -2
- package/scripts/harness-stop.sh +76 -0
- package/scripts/harness-wake-control.sh +151 -0
- package/scripts/harness-wake.sh +5 -0
- package/scripts/harness-worker-dispatch.sh +31 -7
- package/apps/harness-dashboard/components/Drawer.tsx +0 -146
- package/apps/harness-dashboard/components/Header.tsx +0 -40
- package/apps/harness-dashboard/components/MissionTimeline.tsx +0 -214
- package/apps/harness-dashboard/components/OrgTree.tsx +0 -459
- package/apps/harness-dashboard/components/drawer/AgentLogTab.tsx +0 -56
- package/apps/harness-dashboard/components/drawer/DesignPreviewTab.tsx +0 -160
- package/apps/harness-dashboard/components/drawer/GotchasTab.tsx +0 -89
- package/apps/harness-dashboard/components/drawer/HypothesisTab.tsx +0 -42
- package/apps/harness-dashboard/components/drawer/IncidentsTab.tsx +0 -50
- package/apps/harness-dashboard/components/drawer/MissionDocTab.tsx +0 -96
- package/apps/harness-dashboard/components/drawer/MissionFlowTab.tsx +0 -576
- package/apps/harness-dashboard/components/drawer/OwnerHistoryTab.tsx +0 -160
- package/apps/harness-dashboard/components/drawer/RoomMetricsTab.tsx +0 -90
- package/apps/harness-dashboard/components/drawer/TracksTab.tsx +0 -47
- package/apps/harness-dashboard/components/three/ArchiveBoxes.tsx +0 -95
- package/apps/harness-dashboard/components/three/DeptBoard.tsx +0 -175
- package/apps/harness-dashboard/components/three/Floor3D.tsx +0 -404
- package/apps/harness-dashboard/components/three/GoalCard3D.tsx +0 -123
- package/apps/harness-dashboard/components/three/HypothesisCards.tsx +0 -71
- package/apps/harness-dashboard/components/three/MeetingWhiteboard.tsx +0 -98
- package/apps/harness-dashboard/components/three/Minifig3D.tsx +0 -391
- package/apps/harness-dashboard/components/three/OpsSiren.tsx +0 -99
- package/apps/harness-dashboard/components/three/Stage3D.tsx +0 -104
- package/apps/harness-dashboard/components/three/TrackRibbons.tsx +0 -81
- package/apps/harness-dashboard/lib/__tests__/i18n.test.ts +0 -16
- package/apps/harness-dashboard/lib/__tests__/iso.test.ts +0 -42
- package/apps/harness-dashboard/lib/__tests__/state-mapping.test.ts +0 -183
- package/apps/harness-dashboard/lib/agent-roster.ts +0 -42
- package/apps/harness-dashboard/lib/furniture.ts +0 -165
- package/apps/harness-dashboard/lib/i18n.ts +0 -26
- package/apps/harness-dashboard/lib/iso.ts +0 -150
- package/apps/harness-dashboard/lib/markdown.tsx +0 -306
- package/apps/harness-dashboard/lib/path-planning.ts +0 -72
- package/apps/harness-dashboard/lib/state-mapping.ts +0 -146
|
@@ -30,110 +30,10 @@ export type RoomId =
|
|
|
30
30
|
|
|
31
31
|
export type Dept = "CEO" | "Meeting" | "Planner" | "CTO" | "CQO" | "Operations";
|
|
32
32
|
|
|
33
|
-
export type MinifigState = "idle" | "queued" | "typing" | "talking" | "red-alert";
|
|
34
|
-
|
|
35
|
-
export interface AgentState {
|
|
36
|
-
id: AgentId;
|
|
37
|
-
name: string;
|
|
38
|
-
dept: Dept;
|
|
39
|
-
/** The agent's *current* room (after meeting teleport). */
|
|
40
|
-
room: RoomId;
|
|
41
|
-
/** The agent's home room — never changes. */
|
|
42
|
-
homeRoom: RoomId;
|
|
43
|
-
minifigState: MinifigState;
|
|
44
|
-
lastActivity: string | null;
|
|
45
|
-
talkingPreview?: string;
|
|
46
|
-
alertReason?: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface RoomMetrics {
|
|
50
|
-
sprint_number?: number;
|
|
51
|
-
last_review?: string | null;
|
|
52
|
-
last_audit?: string | null;
|
|
53
|
-
last_check?: string | null;
|
|
54
|
-
sprint_verdict?: "pending" | "PASS" | "FAIL";
|
|
55
|
-
open_alerts?: number;
|
|
56
|
-
open_arch_risks?: number;
|
|
57
|
-
open_regressions?: number;
|
|
58
|
-
cadence?: MeetingCadence;
|
|
59
|
-
next_scheduled?: string | null;
|
|
60
|
-
active_tracks?: number;
|
|
61
|
-
active_hypothesis?: number;
|
|
62
|
-
active_workers?: number;
|
|
63
|
-
open_incidents?: number;
|
|
64
|
-
pass_rate?: number | null;
|
|
65
|
-
contract_signed?: { be?: boolean; fe?: boolean };
|
|
66
|
-
eval_scores?: EvalScores | null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export interface SeatLayout {
|
|
70
|
-
seats: number;
|
|
71
|
-
occupants: AgentId[];
|
|
72
|
-
overflow: number;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export interface RoomState {
|
|
76
|
-
id: RoomId;
|
|
77
|
-
label_ko: string;
|
|
78
|
-
label_en: string;
|
|
79
|
-
dept: Dept | "Archive";
|
|
80
|
-
metrics?: RoomMetrics;
|
|
81
|
-
seatLayout?: SeatLayout;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export interface GoalCard {
|
|
85
|
-
id: string;
|
|
86
|
-
title: string;
|
|
87
|
-
description_truncated?: string;
|
|
88
|
-
adherence: number | null;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export interface ArchiveEntry {
|
|
92
|
-
dir: string;
|
|
93
|
-
label: string;
|
|
94
|
-
result: "PASS" | "FAIL" | "unknown";
|
|
95
|
-
ts: string | null;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export interface ArchiveStat {
|
|
99
|
-
sprintCount: number;
|
|
100
|
-
recent: ArchiveEntry[];
|
|
101
|
-
all: ArchiveEntry[];
|
|
102
|
-
}
|
|
103
|
-
|
|
104
33
|
export type MeetingCadence = "light" | "normal" | "heavy";
|
|
105
|
-
export type MeetingType =
|
|
106
|
-
| "standup"
|
|
107
|
-
| "sprint-review"
|
|
108
|
-
| "spec-review"
|
|
109
|
-
| "incident-war-room"
|
|
110
|
-
| "all-hands"
|
|
111
|
-
| "followup-review";
|
|
112
|
-
|
|
113
|
-
export interface CurrentMeeting {
|
|
114
|
-
type: MeetingType;
|
|
115
|
-
topic?: string;
|
|
116
|
-
convened_at?: string | null;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export interface MeetingsState {
|
|
120
|
-
active: AgentId[];
|
|
121
|
-
cadence: MeetingCadence;
|
|
122
|
-
next_scheduled: string | null;
|
|
123
|
-
current: CurrentMeeting | null;
|
|
124
|
-
}
|
|
125
34
|
|
|
126
35
|
export type TrackStatus = "dispatched" | "in_progress" | "joined" | "blocked";
|
|
127
36
|
|
|
128
|
-
export interface ParallelTrack {
|
|
129
|
-
id: string;
|
|
130
|
-
from_meeting: string;
|
|
131
|
-
to_dept: Dept | "Operations" | "Multi";
|
|
132
|
-
to_room: RoomId;
|
|
133
|
-
status: TrackStatus;
|
|
134
|
-
label?: string;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
37
|
export type IncidentSeverity = "low" | "medium" | "high" | "critical";
|
|
138
38
|
|
|
139
39
|
export interface IncidentEntry {
|
|
@@ -144,48 +44,8 @@ export interface IncidentEntry {
|
|
|
144
44
|
ts?: string | null;
|
|
145
45
|
}
|
|
146
46
|
|
|
147
|
-
export type HypothesisVerdict = "pending" | "valid" | "invalid";
|
|
148
|
-
|
|
149
|
-
export interface HypothesisEntry {
|
|
150
|
-
id: string;
|
|
151
|
-
brief: string;
|
|
152
|
-
verdict: HypothesisVerdict;
|
|
153
|
-
ts?: string | null;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export type EscalationReason =
|
|
157
|
-
| "three-fail"
|
|
158
|
-
| "incident"
|
|
159
|
-
| "goal-violation"
|
|
160
|
-
| "budget"
|
|
161
|
-
| "other";
|
|
162
|
-
|
|
163
|
-
export interface EscalationEntry {
|
|
164
|
-
id: string;
|
|
165
|
-
reason: EscalationReason | string;
|
|
166
|
-
message?: string;
|
|
167
|
-
ts?: string | null;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
47
|
export type Pipeline = "FULLSTACK" | "FE-ONLY" | "BE-ONLY" | "META_REFACTOR" | null;
|
|
171
48
|
|
|
172
|
-
export interface ContractSnapshot {
|
|
173
|
-
sprint_number: number | null;
|
|
174
|
-
pipeline: Pipeline;
|
|
175
|
-
api_version: string | null;
|
|
176
|
-
feature_total: number;
|
|
177
|
-
feature_passed: number;
|
|
178
|
-
feature_failed: number;
|
|
179
|
-
contract_signed: { be: boolean; fe: boolean };
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export interface FeatureSummary {
|
|
183
|
-
id: string;
|
|
184
|
-
title: string;
|
|
185
|
-
status: "ready" | "blocked" | "in_progress" | "passed" | "failed" | "unknown";
|
|
186
|
-
passes: string[];
|
|
187
|
-
}
|
|
188
|
-
|
|
189
49
|
export interface EvalScores {
|
|
190
50
|
functional?: number | null;
|
|
191
51
|
visual?: number | null;
|
|
@@ -200,68 +60,16 @@ export interface ErrorBanner {
|
|
|
200
60
|
message_en: string;
|
|
201
61
|
}
|
|
202
62
|
|
|
203
|
-
export interface WorkerSnapshot {
|
|
204
|
-
team: number | string;
|
|
205
|
-
feature: string;
|
|
206
|
-
title?: string;
|
|
207
|
-
agent: AgentId | string;
|
|
208
|
-
phase?: string;
|
|
209
|
-
status: "spawned" | "recorded" | "running" | "idle" | "blocked" | "unknown";
|
|
210
|
-
pid?: number | null;
|
|
211
|
-
prompt?: string | null;
|
|
212
|
-
log?: string | null;
|
|
213
|
-
progress: number | null;
|
|
214
|
-
summary: string;
|
|
215
|
-
next_material?: string | null;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
export interface MeetingRecord {
|
|
219
|
-
id: string;
|
|
220
|
-
path: string;
|
|
221
|
-
ts: string | null;
|
|
222
|
-
title: string;
|
|
223
|
-
verdict?: string | null;
|
|
224
|
-
summary: string;
|
|
225
|
-
content: string;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export interface OpsServiceHealth {
|
|
229
|
-
name: string;
|
|
230
|
-
host: string;
|
|
231
|
-
port: number;
|
|
232
|
-
status: "ok" | "degraded" | "down" | "unknown";
|
|
233
|
-
port_state?: string | null;
|
|
234
|
-
health_status?: number | null;
|
|
235
|
-
health_path?: string | null;
|
|
236
|
-
recent_errors?: number | null;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export interface EnvKeySummary {
|
|
240
|
-
key: string;
|
|
241
|
-
category: "secret" | "endpoint" | "port" | "mode" | "other";
|
|
242
|
-
masked: string;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export interface EnvFileSummary {
|
|
246
|
-
path: string;
|
|
247
|
-
updated_at: string | null;
|
|
248
|
-
key_count: number;
|
|
249
|
-
keys: EnvKeySummary[];
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export interface OperationsDashboard {
|
|
253
|
-
workers: WorkerSnapshot[];
|
|
254
|
-
features: FeatureSummary[];
|
|
255
|
-
recentMeetings: MeetingRecord[];
|
|
256
|
-
opsHealth: OpsServiceHealth[];
|
|
257
|
-
envFiles: EnvFileSummary[];
|
|
258
|
-
}
|
|
259
|
-
|
|
260
63
|
export interface RuntimeSnapshot {
|
|
261
64
|
currentAgent: string | null;
|
|
262
65
|
agentStatus: string;
|
|
263
66
|
nextAgent: string | null;
|
|
264
67
|
updatedAt: string | null;
|
|
68
|
+
conductorState?: string | null;
|
|
69
|
+
currentAction?: string | null;
|
|
70
|
+
companyState?: string | null;
|
|
71
|
+
activeWorkers?: number;
|
|
72
|
+
lastDispatchAt?: string | null;
|
|
265
73
|
ownerPrompt: {
|
|
266
74
|
command: string;
|
|
267
75
|
summary: string;
|
|
@@ -275,20 +83,9 @@ export interface HarnessSnapshot {
|
|
|
275
83
|
ts: string;
|
|
276
84
|
projectName: string;
|
|
277
85
|
projectPath: string;
|
|
278
|
-
agents: AgentState[];
|
|
279
|
-
rooms: RoomState[];
|
|
280
|
-
goal: GoalCard | null;
|
|
281
|
-
archive: ArchiveStat;
|
|
282
|
-
meetings: MeetingsState;
|
|
283
|
-
tracks: ParallelTrack[];
|
|
284
|
-
incidents: IncidentEntry[];
|
|
285
|
-
hypothesis: HypothesisEntry[];
|
|
286
|
-
escalations: EscalationEntry[];
|
|
287
|
-
contract: ContractSnapshot;
|
|
288
|
-
evalScores: EvalScores | null;
|
|
289
86
|
errorBanner: ErrorBanner | null;
|
|
290
|
-
dashboard: OperationsDashboard;
|
|
291
87
|
runtime: RuntimeSnapshot;
|
|
88
|
+
incidents: IncidentEntry[];
|
|
292
89
|
missions: MissionDoc[];
|
|
293
90
|
ownerHistory: OwnerPromptEntry[];
|
|
294
91
|
gotchas: GotchaEntry[];
|
|
@@ -296,6 +93,7 @@ export interface HarnessSnapshot {
|
|
|
296
93
|
todos: CxxTodo[];
|
|
297
94
|
events: HarnessEvent[];
|
|
298
95
|
activitySamples: ActivitySample[];
|
|
96
|
+
files: HarnessFileEntry[];
|
|
299
97
|
}
|
|
300
98
|
|
|
301
99
|
export interface ActivitySample {
|
|
@@ -306,6 +104,16 @@ export interface ActivitySample {
|
|
|
306
104
|
missionId: string | null;
|
|
307
105
|
}
|
|
308
106
|
|
|
107
|
+
export interface HarnessFileEntry {
|
|
108
|
+
path: string;
|
|
109
|
+
name: string;
|
|
110
|
+
kind: "file" | "dir";
|
|
111
|
+
depth: number;
|
|
112
|
+
size: number | null;
|
|
113
|
+
updatedAt: string | null;
|
|
114
|
+
category: "documents" | "todos" | "activity" | "knowledge" | "runtime" | "config" | "other";
|
|
115
|
+
}
|
|
116
|
+
|
|
309
117
|
export interface CxxTodo {
|
|
310
118
|
id: string;
|
|
311
119
|
owner: "ceo" | "coo" | "cdo" | "cto" | "cqo" | "ops" | string;
|
|
@@ -349,7 +157,7 @@ export interface MissionDoc {
|
|
|
349
157
|
missionId: string;
|
|
350
158
|
ts: string;
|
|
351
159
|
type: "goal" | "submission" | "hotfix" | "feature" | "unknown";
|
|
352
|
-
lifecycle: "active" | "closed" | "cancelled" | "superseded" | "complete" | "blocked" | "unknown";
|
|
160
|
+
lifecycle: "active" | "operating" | "closed" | "cancelled" | "superseded" | "complete" | "blocked" | "unknown";
|
|
353
161
|
active: boolean;
|
|
354
162
|
protocolViolations: string[];
|
|
355
163
|
label: string;
|
|
@@ -362,6 +170,10 @@ export interface MissionDoc {
|
|
|
362
170
|
ops: string | null;
|
|
363
171
|
workers: WorkerDocEntry[];
|
|
364
172
|
cxxPresent: string[];
|
|
173
|
+
/** Perpetual (operating) goals: count of agenda items not yet done. */
|
|
174
|
+
agendaOpen?: number;
|
|
175
|
+
/** Perpetual (operating) goals: completed operating cycles. */
|
|
176
|
+
operatingCycles?: number;
|
|
365
177
|
}
|
|
366
178
|
|
|
367
179
|
export interface OwnerPromptEntry {
|
|
@@ -387,15 +199,3 @@ export interface ConventionEntry {
|
|
|
387
199
|
sourcePath?: string | null;
|
|
388
200
|
updatedAt?: string | null;
|
|
389
201
|
}
|
|
390
|
-
|
|
391
|
-
export type OrgRole = "owner" | "ceo" | "coo" | "cdo" | "cto" | "cqo" | "ops";
|
|
392
|
-
|
|
393
|
-
export interface OrgNodeDef {
|
|
394
|
-
id: string;
|
|
395
|
-
role: OrgRole;
|
|
396
|
-
label: string;
|
|
397
|
-
sublabel?: string;
|
|
398
|
-
status: MinifigState;
|
|
399
|
-
activity: string | null;
|
|
400
|
-
agentIds: AgentId[];
|
|
401
|
-
}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { defineConfig, devices } from "@playwright/test";
|
|
2
2
|
|
|
3
|
+
// Target is env-overridable so the suite can run against an already-running
|
|
4
|
+
// dashboard on any port (e.g. one started with a specific HARNESS_ROOT):
|
|
5
|
+
// PW_BASE_URL=http://localhost:3097 PW_NO_WEBSERVER=1 npx playwright test
|
|
6
|
+
const baseURL = process.env.PW_BASE_URL ?? "http://localhost:3001";
|
|
7
|
+
const skipWebServer = process.env.PW_NO_WEBSERVER === "1";
|
|
8
|
+
// AGENTS.md §8: Playwright must run in a visible real browser. Headed by default;
|
|
9
|
+
// headless is only an explicit CI exception via PW_HEADLESS=1.
|
|
10
|
+
const headless = process.env.PW_HEADLESS === "1";
|
|
11
|
+
|
|
3
12
|
export default defineConfig({
|
|
4
13
|
testDir: "./e2e",
|
|
5
14
|
timeout: 30_000,
|
|
@@ -8,15 +17,25 @@ export default defineConfig({
|
|
|
8
17
|
retries: 0,
|
|
9
18
|
reporter: [["list"]],
|
|
10
19
|
use: {
|
|
11
|
-
baseURL
|
|
20
|
+
baseURL,
|
|
12
21
|
trace: "off",
|
|
22
|
+
headless,
|
|
23
|
+
// AGENTS.md §8: prefer installed Chrome stable *when available*. Fall back to
|
|
24
|
+
// bundled Chromium via PW_CHROMIUM=1 on hosts without Chrome stable (CI/containers),
|
|
25
|
+
// so the suite stays portable instead of hard-failing at launch.
|
|
26
|
+
channel: process.env.PW_CHROMIUM === "1" ? undefined : "chrome",
|
|
27
|
+
launchOptions: { slowMo: headless ? 0 : 120 },
|
|
13
28
|
},
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
29
|
+
...(skipWebServer
|
|
30
|
+
? {}
|
|
31
|
+
: {
|
|
32
|
+
webServer: {
|
|
33
|
+
command: "npm run dev:dashboard",
|
|
34
|
+
url: baseURL,
|
|
35
|
+
reuseExistingServer: true,
|
|
36
|
+
timeout: 60_000,
|
|
37
|
+
},
|
|
38
|
+
}),
|
|
20
39
|
projects: [
|
|
21
40
|
{ name: "chromium", use: { ...devices["Desktop Chrome"] } },
|
|
22
41
|
],
|
|
@@ -181,7 +181,7 @@ CEO, CXX, hired worker의 모든 Playwright 사용은 실제로 보이는 브라
|
|
|
181
181
|
- 설치된 Chrome을 사용할 수 있으면 `channel: 'chrome'`을 우선한다.
|
|
182
182
|
- Owner가 명시적으로 예외를 승인하지 않는 한 headless Playwright 실행을 추가, 권장, 의존하지 않는다.
|
|
183
183
|
- CTO와 OPS는 Playwright, browser automation, E2E, visual check, browser-based monitoring이 포함될 수 있는 모든 worker brief에 `headless: false` 요구사항을 명시적으로 주입한다.
|
|
184
|
-
- 브라우저 동작을 사람이 관찰해야 할 때는
|
|
184
|
+
- 브라우저 동작을 사람이 관찰해야 할 때는 middle-fast로 둔다: 기본값 `slowMo: 120`(ms) — 관찰 가능하되 경쾌하게. `slowMo: 300` 이상은 너무 느리므로 쓰지 말고, Owner가 데모를 일부러 느리게 보길 원할 때만 올린다.
|
|
185
185
|
- CQO evaluator evidence에는 Playwright/browser 실행이 headed 또는 visible이었다는 사실을 기록한다.
|
|
186
186
|
|
|
187
187
|
## 11. 금지 규칙
|
|
@@ -94,7 +94,16 @@ The Owner is the final acceptance reviewer, not a tester, QA worker, debugger, o
|
|
|
94
94
|
4. CEO aggregates CXX outputs, routes to next CXX or reports to Owner.
|
|
95
95
|
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.
|
|
96
96
|
|
|
97
|
-
**Complete when:** `.harness/documents/goal-{index}-{name}/ceo.md` contains a final Owner report
|
|
97
|
+
**Complete when:** `.harness/documents/goal-{index}-{name}/ceo.md` contains a final Owner report, `mission-state.json` is terminal (`complete`, `closed`, `cancelled`, or `superseded`) with `active:false`, **and** CEO has fired the runtime transition `bash scripts/harness-company-complete.sh . <reason>` (or `harness-company-block.sh` for an external-authority block) so `progress.json` leaves the `running` state. Document state alone does not end the loop — the Stop loop and dashboard read `progress.json`.
|
|
98
|
+
|
|
99
|
+
### Operating (perpetual) goal
|
|
100
|
+
|
|
101
|
+
If the goal is to **operate/monitor/keep growing** something indefinitely (e.g. "run a trading system and keep it profitable forever"), CEO sets `mission-state.json` to `{"lifecycle":"operating","active":true}` and runs it as an **agenda-driven standing loop** that NEVER completes:
|
|
102
|
+
|
|
103
|
+
- The shared agenda `.harness/documents/{goal}/agenda.json` (managed by `scripts/harness-agenda.sh`) is co-written by the CXX. While it has active items the loop runs and the CEO must adjudicate every item; when it is empty the CEO orders each CXX a 현황 보고 (confirm live deliverables still operate toward the goal) which surfaces new agenda items.
|
|
104
|
+
- When a briefing round surfaces nothing, CEO runs `scripts/harness-company-cycle.sh . {goal}` (operating heartbeat) and ends the turn; the hourly wake resumes the next cycle.
|
|
105
|
+
- Canonical cycle: OPS monitor → COO research+backtest new strategy → CTO apply → CQO verify → OPS operate → repeat. A loss is an agenda item, not a stop.
|
|
106
|
+
- An operating goal ends only on explicit Owner stop (then `harness-company-complete.sh`) or a true external-authority block (`harness-company-block.sh`). The dashboard shows it as `⟳ OPERATING`, never "complete".
|
|
98
107
|
|
|
99
108
|
### Submission
|
|
100
109
|
|
|
@@ -150,7 +159,7 @@ All Playwright usage by CEO, CXX, and hired workers must run with a visible real
|
|
|
150
159
|
- Prefer `channel: 'chrome'` when the installed Chrome browser is available.
|
|
151
160
|
- Do not add, recommend, or rely on headless Playwright execution unless the Owner explicitly approves an exception.
|
|
152
161
|
- CTO and OPS must explicitly inject the `headless: false` requirement into every worker brief that may involve Playwright, browser automation, E2E, visual checks, or browser-based monitoring.
|
|
153
|
-
- When browser actions should be observable,
|
|
162
|
+
- When browser actions should be observable, pace them middle-fast: use `slowMo: 120` (ms) by default — brisk but watchable. Do not use `slowMo: 300`+, which is sluggish; only raise it when the Owner explicitly asks to slow a demo down.
|
|
154
163
|
- CQO evaluator evidence must note that the Playwright/browser run was headed or visible.
|
|
155
164
|
|
|
156
165
|
---
|
|
@@ -175,6 +184,7 @@ All Playwright usage by CEO, CXX, and hired workers must run with a visible real
|
|
|
175
184
|
16. **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.
|
|
176
185
|
17. **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.
|
|
177
186
|
18. **Playwright is visible by default** — All Playwright/browser automation must use headed/visible mode (`headless: false` or equivalent). Headless Playwright requires explicit Owner approval recorded in the mission.
|
|
187
|
+
19. **The loop ends only via a runtime transition** — There are exactly two legitimate stop conditions: COMPLETE and BLOCKED-on-external-authority. The autonomous Stop loop and the dashboard read `progress.json` runtime state, not mission documents. After the final Owner report and terminal `mission-state.json`, CEO's last action MUST be `scripts/harness-company-complete.sh` (complete) or `scripts/harness-company-block.sh "<missing authority>"` (blocked). Never end a turn in the `running` state with no queued action, and never fire a terminal transition while real CXX/worker/verification work remains. Between these two endpoints the company keeps progressing autonomously — the Owner is not the pump.
|
|
178
188
|
|
|
179
189
|
---
|
|
180
190
|
|
|
@@ -97,6 +97,8 @@ Runtime state that the harness must parse belongs in JSON or JSONL, not Markdown
|
|
|
97
97
|
- CDO completion requires `.harness/documents/{mission}/cdo/preview.html`; CEO/Owner can view it from the dashboard by clicking `harness-cdo`.
|
|
98
98
|
- CQO verdicts require evaluator/tester worker evidence.
|
|
99
99
|
- Owner is final acceptance only. Do not report "done, please check" until worker-backed verification proves the goal is complete.
|
|
100
|
+
- The company loop ends only via a runtime transition, never by document state alone. After the final Owner report and terminal `mission-state.json`, CEO runs `bash scripts/harness-company-complete.sh . <reason>` (complete) or `bash scripts/harness-company-block.sh . "<missing authority>"` (external-authority block). These flip `progress.json` out of `running` so the autonomous Stop loop ends cleanly and the dashboard shows idle/done. Until then the company keeps progressing autonomously — the Owner is not the pump.
|
|
101
|
+
- Every worker report must open with a `## Status` line whose body is `IN_PROGRESS` while running and `COMPLETE` when final, so the dashboard reflects true worker liveness.
|
|
100
102
|
- Every `ceo.md`, `{cxx}.md`, and worker report must end with:
|
|
101
103
|
|
|
102
104
|
```markdown
|
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
"scripts/harness-hourly-review.sh",
|
|
7
7
|
"scripts/harness-service-ops-monitor.sh",
|
|
8
8
|
"scripts/harness-wake.sh",
|
|
9
|
+
"scripts/harness-wake-control.sh",
|
|
9
10
|
"scripts/harness-meeting-doc.sh",
|
|
10
11
|
"scripts/harness-next.sh",
|
|
11
12
|
"scripts/harness-worker-dispatch.sh",
|
|
12
13
|
"scripts/harness-company-complete.sh",
|
|
14
|
+
"scripts/harness-company-block.sh",
|
|
15
|
+
"scripts/harness-company-cycle.sh",
|
|
16
|
+
"scripts/harness-agenda.sh",
|
|
13
17
|
"scripts/harness-stop.sh",
|
|
14
18
|
"scripts/harness-session-start.sh",
|
|
15
19
|
"scripts/harness-progress-set.sh",
|
|
@@ -18,20 +22,7 @@
|
|
|
18
22
|
"scripts/lib/harness-progress-migrate.sh",
|
|
19
23
|
"scripts/lib/harness-guardrail.sh",
|
|
20
24
|
"scripts/lib/harness-audit.sh",
|
|
21
|
-
"scripts/lib/harness-keywait.sh"
|
|
22
|
-
"conventions/conductor.md",
|
|
23
|
-
"conventions/meeting-manager.md",
|
|
24
|
-
"conventions/planner.md",
|
|
25
|
-
"conventions/cto.md",
|
|
26
|
-
"conventions/cqo.md",
|
|
27
|
-
"conventions/service-ops.md",
|
|
28
|
-
"conventions/dispatcher.md",
|
|
29
|
-
"gotchas/conductor.md",
|
|
30
|
-
"gotchas/meeting-manager.md",
|
|
31
|
-
"gotchas/planner.md",
|
|
32
|
-
"gotchas/cto.md",
|
|
33
|
-
"gotchas/cqo.md",
|
|
34
|
-
"gotchas/service-ops.md"
|
|
25
|
+
"scripts/lib/harness-keywait.sh"
|
|
35
26
|
],
|
|
36
27
|
"template_mappings": [
|
|
37
28
|
{
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# {{WORKER_TITLE}} — Worker Report
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
IN_PROGRESS
|
|
5
|
+
|
|
6
|
+
<!--
|
|
7
|
+
Worker liveness contract (read by the dashboard):
|
|
8
|
+
- Set the body of this `## Status` section to `IN_PROGRESS` while you are still working.
|
|
9
|
+
- Change it to `COMPLETE` only when this report is final and the deliverable is done.
|
|
10
|
+
The dashboard uses this line (not file timestamps) to show whether the worker is live.
|
|
11
|
+
-->
|
|
12
|
+
|
|
13
|
+
## Task
|
|
14
|
+
- Mission: {{MISSION_ID}}
|
|
15
|
+
- Owning CXX: {{OWNING_CXX}}
|
|
16
|
+
- Assigned task: {{TASK}}
|
|
17
|
+
- Acceptance criteria: {{ACCEPTANCE_CRITERIA}}
|
|
18
|
+
|
|
19
|
+
## Evidence
|
|
20
|
+
- Commands run / artifacts produced / changed files:
|
|
21
|
+
- Test or verification output:
|
|
22
|
+
|
|
23
|
+
## Result
|
|
24
|
+
- Outcome and how it meets the acceptance criteria.
|
|
25
|
+
|
|
26
|
+
## Implementation Notes
|
|
27
|
+
|
|
28
|
+
### Design Decisions
|
|
29
|
+
- None
|
|
30
|
+
|
|
31
|
+
### Deviations
|
|
32
|
+
- None
|
|
33
|
+
|
|
34
|
+
### Tradeoffs
|
|
35
|
+
- None
|
|
36
|
+
|
|
37
|
+
### Open Questions
|
|
38
|
+
- None
|
package/bin/init.js
CHANGED
|
@@ -1403,13 +1403,14 @@ function checkPlaywrightMcp() {
|
|
|
1403
1403
|
log('');
|
|
1404
1404
|
log('NOTE: Playwright MCP is not configured.');
|
|
1405
1405
|
log('Evaluator agents require Playwright MCP for browser testing.');
|
|
1406
|
+
log('AGENTS.md §8: run headed (no --headless). Add headless only as an explicit Owner exception.');
|
|
1406
1407
|
log('Add to ~/.mcp.json:');
|
|
1407
1408
|
log('');
|
|
1408
1409
|
log(' {');
|
|
1409
1410
|
log(' "mcpServers": {');
|
|
1410
1411
|
log(' "playwright": {');
|
|
1411
1412
|
log(' "command": "npx",');
|
|
1412
|
-
log(' "args": ["-y", "@playwright/mcp@latest", "--
|
|
1413
|
+
log(' "args": ["-y", "@playwright/mcp@latest", "--caps", "vision"]');
|
|
1413
1414
|
log(' }');
|
|
1414
1415
|
log(' }');
|
|
1415
1416
|
log(' }');
|
package/commands/goal.md
CHANGED
|
@@ -14,7 +14,9 @@ Codex adapter:
|
|
|
14
14
|
|
|
15
15
|
Required flow:
|
|
16
16
|
1. Create or update a goal under `.harness/documents/goal-{goal_index}-{goal_name}/`.
|
|
17
|
-
2.
|
|
17
|
+
2. Classify the goal, then write `.harness/documents/goal-{goal_index}-{goal_name}/mission-state.json` before routing CXX:
|
|
18
|
+
- **Finite** goal (build/add/fix something with a definite done state) → `{"lifecycle":"active","active":true}`.
|
|
19
|
+
- **Operating/perpetual** goal (operate/monitor/keep growing/지속·영구 운영, e.g. "run a trading bot and keep it profitable forever") → `{"lifecycle":"operating","active":true}`. An operating goal NEVER completes: drive it as the agenda-driven standing loop in the CEO skill ("Operating (Perpetual) Goals"), and never run `harness-company-complete.sh` for it. It ends only on explicit Owner stop or a true external-authority block.
|
|
18
20
|
3. Record CEO decisions in `.harness/documents/goal-{goal_index}-{goal_name}/ceo.md`.
|
|
19
21
|
4. CEO decides whether brainstorming is needed or whether CXX questions can be issued immediately. CEO must not ask the Owner which path to take.
|
|
20
22
|
5. CEO asks COO, CDO, CTO, and CQO only the questions needed for this goal.
|
|
@@ -22,7 +24,7 @@ Required flow:
|
|
|
22
24
|
7. CXX roles must not directly execute specialist deliverables. They must use hired workers for research, planning, design, implementation, QA, ops checks, and documentation.
|
|
23
25
|
8. If a required CXX or worker skill is missing, CEO must invoke the installed `harness-hiring` skill before assigning the work.
|
|
24
26
|
9. CEO must require a Worker Evidence Manifest and worker report paths under `.harness/documents/goal-{goal_index}-{goal_name}/{owning-cxx}/workers/` before accepting CXX completion.
|
|
25
|
-
10. When the goal is accepted, cancelled, superseded, blocked, or closed, update `mission-state.json` to `complete`, `cancelled`, `superseded`, `blocked`, or `closed` and set `active:false`.
|
|
27
|
+
10. When the goal is accepted, cancelled, superseded, blocked, or closed, update `mission-state.json` to `complete`, `cancelled`, `superseded`, `blocked`, or `closed` and set `active:false`. Then fire the matching runtime transition as the literal final action of the turn so the documented terminal state matches the `progress.json` flag the harness actually reads: a finished/closed goal → `bash scripts/harness-company-complete.sh . goal-complete`; an external-authority block → `bash scripts/harness-company-block.sh . "<exact missing authority>"`. This clears `progress.json` out of `running`, lets the autonomous loop stop cleanly, and makes the dashboard show the company as idle/done. Omitting this step leaves the loop perpetually "running".
|
|
26
28
|
11. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
|
|
27
29
|
12. Do not ask the Owner whether to continue, hire workers, choose internal options, or start the next step. If CEO cannot decide alone, convene the relevant CXX agents and decide from their written recommendations. CEO may approve reversible routine operations such as local cron/launchd/wake automation, dashboard refresh, monitoring cadence, Telegram briefing format using existing credentials, and mission consolidation/supersede cleanup. Stop only for external authority such as new credentials/secrets, payment approval, legal/business acceptance, unavailable production access, destructive data action, or direct conflict with stated Owner direction.
|
|
28
30
|
|
package/commands/hot-fix.md
CHANGED
|
@@ -24,7 +24,7 @@ Required flow:
|
|
|
24
24
|
9. If a required worker is missing, CEO or the responsible CXX must invoke the installed `harness-hiring` skill before assigning the work.
|
|
25
25
|
10. CEO must require a Worker Evidence Manifest and worker report paths under `.harness/documents/{goal_name}/hotfix-{hotfix_index}-{hotfix_name}/{owning-cxx}/workers/` before accepting CXX completion.
|
|
26
26
|
11. CQO must register durable lessons in `.harness/gotchas/`, `.harness/conventions/`, or `.harness/memories/`. This step is mandatory, not optional, even for small fixes.
|
|
27
|
-
12. Archive only after CQO has accepted the fix, then update `mission-state.json` to `complete` with `active:false`.
|
|
27
|
+
12. Archive only after CQO has accepted the fix, then update `mission-state.json` to `complete` with `active:false`. Then fire the runtime transition as the literal final action of the turn so the terminal document state matches the `progress.json` flag the harness reads: completed → `bash scripts/harness-company-complete.sh . hotfix-complete`; external-authority block → `bash scripts/harness-company-block.sh . "<exact missing authority>"`. This clears `progress.json` out of `running` so the autonomous loop stops cleanly and the dashboard shows idle/done.
|
|
28
28
|
13. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
|
|
29
29
|
14. Do not ask the Owner whether to continue, hire workers, choose internal options, or start the next step. If CEO cannot decide alone, convene the relevant CXX agents and decide from their written recommendations. CEO may approve reversible routine operations such as local cron/launchd/wake automation, dashboard refresh, monitoring cadence, Telegram briefing format using existing credentials, and mission consolidation/supersede cleanup. Stop only for external authority such as new credentials/secrets, payment approval, legal/business acceptance, unavailable production access, destructive data action, or direct conflict with stated Owner direction.
|
|
30
30
|
|
package/commands/submission.md
CHANGED
|
@@ -24,7 +24,7 @@ Required flow:
|
|
|
24
24
|
9. If a required worker is missing, the responsible CXX must invoke the installed `harness-hiring` skill before assigning the work.
|
|
25
25
|
10. CXX must manage conventions for new requirements. Durable changes in behavior, architecture, UI, process, or policy must be reflected in `.harness/conventions/` when accepted.
|
|
26
26
|
11. CEO must require a Worker Evidence Manifest and worker report paths under `.harness/documents/{goal_name}/submission-{submission_index}-{submission_name}/{owning-cxx}/workers/` before accepting CXX completion.
|
|
27
|
-
12. When the submission is accepted, cancelled, superseded, blocked, or closed, update `mission-state.json` to `complete`, `cancelled`, `superseded`, `blocked`, or `closed` and set `active:false`.
|
|
27
|
+
12. When the submission is accepted, cancelled, superseded, blocked, or closed, update `mission-state.json` to `complete`, `cancelled`, `superseded`, `blocked`, or `closed` and set `active:false`. Then fire the matching runtime transition as the literal final action of the turn so the terminal document state matches the `progress.json` flag the harness reads: finished/closed → `bash scripts/harness-company-complete.sh . submission-complete`; external-authority block → `bash scripts/harness-company-block.sh . "<exact missing authority>"`. This clears `progress.json` out of `running` so the autonomous loop stops cleanly and the dashboard shows idle/done.
|
|
28
28
|
13. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
|
|
29
29
|
14. Do not ask the Owner whether to continue, hire workers, choose internal options, or start the next step. If CEO cannot decide alone, convene the relevant CXX agents and decide from their written recommendations. CEO may approve reversible routine operations such as local cron/launchd/wake automation, dashboard refresh, monitoring cadence, Telegram briefing format using existing credentials, and mission consolidation/supersede cleanup. Stop only for external authority such as new credentials/secrets, payment approval, legal/business acceptance, unavailable production access, destructive data action, or direct conflict with stated Owner direction.
|
|
30
30
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walwal-harness/cli",
|
|
3
|
-
"version": "7.1.
|
|
3
|
+
"version": "7.1.42",
|
|
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"
|
|
@@ -24,6 +24,18 @@ current_agent=$(jq -r '.current_agent // "null"' "$PROGRESS")
|
|
|
24
24
|
agent_status=$(jq -r '.agent_status // "pending"' "$PROGRESS")
|
|
25
25
|
pipeline=$(jq -r '.pipeline // "null"' "$PROGRESS")
|
|
26
26
|
mode=$(jq -r '.mode // "company"' "$PROGRESS")
|
|
27
|
+
|
|
28
|
+
# v7 company mode: the CEO/CXX skills own the current_agent / next_agent /
|
|
29
|
+
# conductor.state transitions through the document-driven flow. conductor-tick
|
|
30
|
+
# has no current_agent="ceo" routing branch (its vocabulary is the legacy v6
|
|
31
|
+
# pipeline: dispatcher/planner/cto/cqo/service-ops/meeting-manager/...), so on a
|
|
32
|
+
# CEO state it would fall through and re-assert conductor.state="running" /
|
|
33
|
+
# next_agent="ceo" at the end, cementing the stuck runtime and clobbering any
|
|
34
|
+
# clean completion. Hand the turn back without touching state.
|
|
35
|
+
if [ "$current_agent" = "ceo" ]; then
|
|
36
|
+
echo "ceo"
|
|
37
|
+
exit 0
|
|
38
|
+
fi
|
|
27
39
|
# v6.2 — parallel tracks (fork-join) state
|
|
28
40
|
parallel_tracks=$(jq -c '.conductor.tracks // []' "$PROGRESS")
|
|
29
41
|
parallel_rendezvous=$(jq -c '.conductor.rendezvous // null' "$PROGRESS")
|