@tea-agent/loop-agent 0.26.5-beta.1 → 0.27.0

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.
Files changed (71) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +29 -0
  3. package/README.md +13 -23
  4. package/dist/application/dag/args.js +7 -7
  5. package/dist/application/dag/generate-task-dag.js +2 -2
  6. package/dist/application/dag/run-dag.js +3 -4
  7. package/dist/application/dag/validate-dag.js +1 -1
  8. package/dist/application/task-lifecycle/advance.js +845 -0
  9. package/dist/application/task-lifecycle/gates.js +80 -0
  10. package/dist/application/task-lifecycle/index.js +7 -0
  11. package/dist/application/task-lifecycle/observe.js +395 -0
  12. package/dist/application/task-lifecycle/plan-transitions.js +224 -0
  13. package/dist/application/task-lifecycle/recommendations.js +180 -0
  14. package/dist/application/task-lifecycle/record.js +73 -0
  15. package/dist/application/task-lifecycle/types.js +1 -0
  16. package/dist/cli/command-definitions.js +14 -111
  17. package/dist/cli/help.js +6 -7
  18. package/dist/cli/program.js +26 -90
  19. package/dist/cli/update/policy.js +0 -1
  20. package/dist/commands/dag-final-verification.js +1 -1
  21. package/dist/commands/dag-init-hybrid.js +1 -1
  22. package/dist/commands/delegate.js +2 -2
  23. package/dist/commands/init.js +21 -19
  24. package/dist/commands/run-dag-progress.js +1 -1
  25. package/dist/commands/status.js +18 -17
  26. package/dist/commands/study-init.js +2 -2
  27. package/dist/commands/task-advance.js +335 -0
  28. package/dist/commands/task-contract.js +3 -5
  29. package/dist/commands/task-source-prepare.js +9 -4
  30. package/dist/commands/task-status.js +133 -0
  31. package/dist/governance/manifest-types.js +2 -2
  32. package/dist/shared/operator/capabilities.js +1358 -243
  33. package/dist/task/contract/adopt.js +1 -1
  34. package/dist/task/contract/apply.js +1 -1
  35. package/dist/task/contract/import-revision.js +1 -1
  36. package/dist/task/contract/recover.js +2 -2
  37. package/dist/task/read-model.js +18 -23
  38. package/dist/task/runtime.js +1 -1
  39. package/dist/task/source-prepare/completeness.js +1 -1
  40. package/dist/task/source-prepare/parse-intent.js +6 -1
  41. package/dist/task/source-prepare/prepare.js +23 -20
  42. package/dist/worker/console/operator-actions.js +288 -95
  43. package/dist/worker/console/recovery-cta.js +4 -4
  44. package/dist/worker/console/static/assets/{index-CSRIhuzh.js → index-CNO7n6qB.js} +1 -1
  45. package/dist/worker/console/static/index.html +1 -1
  46. package/dist/worker/materialize/harness-task-materializer.js +6 -5
  47. package/dist/worker/run-task/run-task.js +204 -112
  48. package/dist/worker/runner/run-ready.js +1 -1
  49. package/dist/workflows/dag/frontend-implementation-contract.js +5 -57
  50. package/dist/workflows/dag/frontend-prewrite-gate.js +1 -6
  51. package/dist/workflows/dag/init-hybrid.js +11 -42
  52. package/docs/templates/evaluation/agents-map-slim-v1.md +1 -1
  53. package/docs/templates/evaluation/agents-map-verbose-v0.md +3 -3
  54. package/docs/templates/harness.schema.json +2 -2
  55. package/docs/templates/init-managed-agents.md +13 -16
  56. package/docs/templates/production-readiness-checklist.md +3 -3
  57. package/harness.json +4 -4
  58. package/package.json +1 -1
  59. package/scripts/kb-bootstrap-init-skeleton.sh +2 -1
  60. package/scripts/kb-graph-incremental-prepare.mjs +2 -2
  61. package/skills/loop-agent/SKILL.md +18 -13
  62. package/skills/loop-agent/references/README.md +1 -1
  63. package/skills/loop-agent/references/command-reference.md +55 -84
  64. package/skills/loop-agent/references/harness-policy.md +19 -23
  65. package/skills/loop-agent/references/hybrid-dag.md +31 -33
  66. package/skills/loop-agent/references/long-running-loop.md +2 -2
  67. package/skills/loop-agent/references/one-shot-runs.md +4 -5
  68. package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
  69. package/skills/loop-agent/references/post-implementation-and-patterns.md +4 -4
  70. package/skills/loop-agent/references/source-and-plan-practice.md +45 -51
  71. package/skills/loop-agent/references/task-workflow.md +14 -15
@@ -8,11 +8,34 @@ const officialAction = (action, cli, kind, coverage) => ({
8
8
  envelopeSchemaVersion: 1,
9
9
  requiredErrorCodes: kind === "read"
10
10
  ? ["INVALID_INPUT", "NOT_FOUND"]
11
- : ["INVALID_INPUT", "REQUEST_ID_REUSE_CONFLICT", "REVISION_CONFLICT", "OBSERVED_HASH_CONFLICT", "LEASE_HELD", "TRANSACTION_INCOMPLETE", "NOT_FOUND"],
11
+ : [
12
+ "INVALID_INPUT",
13
+ "REQUEST_ID_REUSE_CONFLICT",
14
+ "REVISION_CONFLICT",
15
+ "OBSERVED_HASH_CONFLICT",
16
+ "LEASE_HELD",
17
+ "TRANSACTION_INCOMPLETE",
18
+ "NOT_FOUND",
19
+ ],
12
20
  description: `Official CLI action coverage for ${cli}.`,
13
21
  inputParams: [
14
- { name: "args", type: "array", itemsType: "string", required: false, description: "validated trailing CLI arguments" },
15
- ...(coverage === "human-gated-required" ? [{ name: "confirmationId", type: "string", required: true, description: "human confirmation receipt id" }] : []),
22
+ {
23
+ name: "args",
24
+ type: "array",
25
+ itemsType: "string",
26
+ required: false,
27
+ description: "validated trailing CLI arguments",
28
+ },
29
+ ...(coverage === "human-gated-required"
30
+ ? [
31
+ {
32
+ name: "confirmationId",
33
+ type: "string",
34
+ required: true,
35
+ description: "human confirmation receipt id",
36
+ },
37
+ ]
38
+ : []),
16
39
  ],
17
40
  modelCallable: coverage === "human-gated-required"
18
41
  ? "prepare-only"
@@ -25,19 +48,69 @@ const OFFICIAL_ACTIONS = [
25
48
  ...[
26
49
  ["dagDoctor", "loop-agent dag doctor", "read", "model-callable"],
27
50
  ["dagStatus", "loop-agent dag status", "read", "model-callable"],
28
- ["dagDecisionInspect", "loop-agent dag decision inspect", "read", "model-callable"],
29
- ["dagDecisionValidate", "loop-agent dag decision validate", "read", "model-callable"],
30
- ["dagCloseoutDraft", "loop-agent dag closeout-draft", "read", "model-callable"],
31
- ["dagApprove", "loop-agent dag approve", "mutation", "human-gated-required"],
51
+ [
52
+ "dagDecisionInspect",
53
+ "loop-agent dag decision inspect",
54
+ "read",
55
+ "model-callable",
56
+ ],
57
+ [
58
+ "dagDecisionValidate",
59
+ "loop-agent dag decision validate",
60
+ "read",
61
+ "model-callable",
62
+ ],
63
+ [
64
+ "dagCloseoutDraft",
65
+ "loop-agent dag closeout-draft",
66
+ "read",
67
+ "model-callable",
68
+ ],
69
+ [
70
+ "dagApprove",
71
+ "loop-agent dag approve",
72
+ "mutation",
73
+ "human-gated-required",
74
+ ],
32
75
  ["dagReject", "loop-agent dag reject", "mutation", "human-gated-required"],
33
- ["dagResume", "loop-agent dag resume", "long-running", "human-gated-required"],
34
- ["dagReconcileRun", "loop-agent dag reconcile-run", "mutation", "human-gated-required"],
35
- ["dagReconcileTasks", "loop-agent dag reconcile-tasks", "mutation", "human-gated-required"],
36
- ["dagFinalVerification", "loop-agent dag final-verification", "long-running", "human-gated-required"],
76
+ [
77
+ "dagResume",
78
+ "loop-agent dag resume",
79
+ "long-running",
80
+ "human-gated-required",
81
+ ],
82
+ [
83
+ "dagReconcileRun",
84
+ "loop-agent dag reconcile-run",
85
+ "mutation",
86
+ "human-gated-required",
87
+ ],
88
+ [
89
+ "dagReconcileTasks",
90
+ "loop-agent dag reconcile-tasks",
91
+ "mutation",
92
+ "human-gated-required",
93
+ ],
94
+ [
95
+ "dagFinalVerification",
96
+ "loop-agent dag final-verification",
97
+ "long-running",
98
+ "human-gated-required",
99
+ ],
37
100
  ["dagInitHybrid", "loop-agent dag init-hybrid", "mutation", "advanced"],
38
101
  ["dagWorkflowPlan", "loop-agent dag workflow-plan", "read", "advanced"],
39
- ["dagWorkflowValidate", "loop-agent dag workflow-validate", "read", "advanced"],
40
- ["dagWorkflowCompile", "loop-agent dag workflow-compile", "mutation", "advanced"],
102
+ [
103
+ "dagWorkflowValidate",
104
+ "loop-agent dag workflow-validate",
105
+ "read",
106
+ "advanced",
107
+ ],
108
+ [
109
+ "dagWorkflowCompile",
110
+ "loop-agent dag workflow-compile",
111
+ "mutation",
112
+ "advanced",
113
+ ],
41
114
  ["planList", "loop-agent plan list", "read", "model-callable"],
42
115
  ["planCreate", "loop-agent plan create", "mutation", "model-callable"],
43
116
  ["planComplete", "loop-agent plan complete", "mutation", "model-callable"],
@@ -45,40 +118,175 @@ const OFFICIAL_ACTIONS = [
45
118
  ["docsAudit", "loop-agent docs audit", "read", "model-callable"],
46
119
  ["docsArchive", "loop-agent docs archive", "mutation", "advanced"],
47
120
  ["handoffCheck", "loop-agent handoff check", "read", "model-callable"],
48
- ["handoffCoverage", "loop-agent handoff coverage", "read", "model-callable"],
121
+ [
122
+ "handoffCoverage",
123
+ "loop-agent handoff coverage",
124
+ "read",
125
+ "model-callable",
126
+ ],
49
127
  ["coverageReport", "loop-agent coverage report", "read", "model-callable"],
50
128
  ["stats", "loop-agent stats", "read", "model-callable"],
51
- ["promoteRun", "loop-agent promote-run", "mutation", "model-callable"],
52
- ["closeoutTask", "loop-agent closeout task", "mutation", "model-callable"],
129
+ [
130
+ "promoteRun",
131
+ "loop-agent task advance <id> --json",
132
+ "mutation",
133
+ "model-callable",
134
+ ],
135
+ [
136
+ "closeoutTask",
137
+ "loop-agent task advance <id> --json",
138
+ "mutation",
139
+ "model-callable",
140
+ ],
53
141
  ["piReuseBenchmark", "loop-agent pi-reuse-benchmark", "read", "advanced"],
54
142
  ["loopBenchmark", "loop-agent loop-benchmark", "read", "advanced"],
55
- ["knowledgeCurate", "loop-agent knowledge curate", "read", "model-callable"],
143
+ [
144
+ "knowledgeCurate",
145
+ "loop-agent knowledge curate",
146
+ "read",
147
+ "model-callable",
148
+ ],
56
149
  ["knowledgeQuery", "loop-agent knowledge query", "read", "model-callable"],
57
- ["knowledgeGraphInit", "loop-agent knowledge graph-init", "mutation", "advanced"],
58
- ["knowledgeGraphMaterialize", "loop-agent knowledge graph-materialize", "mutation", "advanced"],
59
- ["knowledgeGraphPromote", "loop-agent knowledge graph-promote", "mutation", "advanced"],
60
- ["knowledgeGraphIncrementalPrepare", "loop-agent knowledge graph-incremental-prepare", "mutation", "advanced"],
61
- ...["init", "status", "run", "record-round", "add-signal", "closeout"].map((leaf) => [`loop${leaf.replace(/(^|-)(.)/g, (_m, _d, c) => c.toUpperCase())}`, `loop-agent loop ${leaf}`, leaf === "status" ? "read" : "mutation", "advanced"]),
62
- ...["list", "inspect", "save", "run", "diff", "replay"].map((leaf) => [`workflow${leaf[0].toUpperCase()}${leaf.slice(1)}`, `loop-agent workflow ${leaf}`, ["list", "inspect", "diff"].includes(leaf) ? "read" : "mutation", "advanced"]),
63
- ["workerFeatureReview", "agent-worker feature review", "read", "model-callable"],
64
- ["workerFeatureScaffold", "agent-worker feature scaffold", "mutation", "advanced"],
65
- ["workerFeatureRun", "agent-worker feature run", "long-running", "human-gated-required"],
66
- ["workerFeatureAdvance", "agent-worker feature advance", "long-running", "human-gated-required"],
67
- ["workerFeatureDoctor", "agent-worker feature doctor", "read", "model-callable"],
68
- ["workerFeatureVerifyFinal", "agent-worker feature verify-final", "long-running", "human-gated-required"],
69
- ["workerFeatureDelivery", "agent-worker feature delivery", "mutation", "human-gated-required"],
70
- ["workerFeatureCloseout", "agent-worker feature closeout", "mutation", "human-gated-required"],
71
- ["workerTaskValidate", "agent-worker task validate", "read", "model-callable"],
72
- ["workerTaskReconcile", "agent-worker task reconcile", "mutation", "human-gated-required"],
73
- ["workerTaskDraftFollowup", "agent-worker task draft-followup", "mutation", "advanced"],
74
- ["workerFeatureApproveFollowup", "agent-worker feature approve-followup", "mutation", "advanced"],
75
- ["workerBatchPlanReady", "agent-worker batch plan-ready", "read", "model-callable"],
76
- ["workerBatchRunReady", "agent-worker batch run-ready", "long-running", "advanced"],
150
+ [
151
+ "knowledgeGraphInit",
152
+ "loop-agent knowledge graph-init",
153
+ "mutation",
154
+ "advanced",
155
+ ],
156
+ [
157
+ "knowledgeGraphMaterialize",
158
+ "loop-agent knowledge graph-materialize",
159
+ "mutation",
160
+ "advanced",
161
+ ],
162
+ [
163
+ "knowledgeGraphPromote",
164
+ "loop-agent knowledge graph-promote",
165
+ "mutation",
166
+ "advanced",
167
+ ],
168
+ [
169
+ "knowledgeGraphIncrementalPrepare",
170
+ "loop-agent knowledge graph-incremental-prepare",
171
+ "mutation",
172
+ "advanced",
173
+ ],
174
+ ...["init", "status", "run", "record-round", "add-signal", "closeout"].map((leaf) => [
175
+ `loop${leaf.replace(/(^|-)(.)/g, (_m, _d, c) => c.toUpperCase())}`,
176
+ `loop-agent loop ${leaf}`,
177
+ leaf === "status" ? "read" : "mutation",
178
+ "advanced",
179
+ ]),
180
+ ...["list", "inspect", "save", "run", "diff", "replay"].map((leaf) => [
181
+ `workflow${leaf[0].toUpperCase()}${leaf.slice(1)}`,
182
+ `loop-agent workflow ${leaf}`,
183
+ ["list", "inspect", "diff"].includes(leaf) ? "read" : "mutation",
184
+ "advanced",
185
+ ]),
186
+ [
187
+ "workerFeatureReview",
188
+ "agent-worker feature review",
189
+ "read",
190
+ "model-callable",
191
+ ],
192
+ [
193
+ "workerFeatureScaffold",
194
+ "agent-worker feature scaffold",
195
+ "mutation",
196
+ "advanced",
197
+ ],
198
+ [
199
+ "workerFeatureRun",
200
+ "agent-worker feature run",
201
+ "long-running",
202
+ "human-gated-required",
203
+ ],
204
+ [
205
+ "workerFeatureAdvance",
206
+ "agent-worker feature advance",
207
+ "long-running",
208
+ "human-gated-required",
209
+ ],
210
+ [
211
+ "workerFeatureDoctor",
212
+ "agent-worker feature doctor",
213
+ "read",
214
+ "model-callable",
215
+ ],
216
+ [
217
+ "workerFeatureVerifyFinal",
218
+ "agent-worker feature verify-final",
219
+ "long-running",
220
+ "human-gated-required",
221
+ ],
222
+ [
223
+ "workerFeatureDelivery",
224
+ "agent-worker feature delivery",
225
+ "mutation",
226
+ "human-gated-required",
227
+ ],
228
+ [
229
+ "workerFeatureCloseout",
230
+ "agent-worker feature closeout",
231
+ "mutation",
232
+ "human-gated-required",
233
+ ],
234
+ [
235
+ "workerTaskValidate",
236
+ "agent-worker task validate",
237
+ "read",
238
+ "model-callable",
239
+ ],
240
+ [
241
+ "workerTaskReconcile",
242
+ "agent-worker task reconcile",
243
+ "mutation",
244
+ "human-gated-required",
245
+ ],
246
+ [
247
+ "workerTaskDraftFollowup",
248
+ "agent-worker task draft-followup",
249
+ "mutation",
250
+ "advanced",
251
+ ],
252
+ [
253
+ "workerFeatureApproveFollowup",
254
+ "agent-worker feature approve-followup",
255
+ "mutation",
256
+ "advanced",
257
+ ],
258
+ [
259
+ "workerBatchPlanReady",
260
+ "agent-worker batch plan-ready",
261
+ "read",
262
+ "model-callable",
263
+ ],
264
+ [
265
+ "workerBatchRunReady",
266
+ "agent-worker batch run-ready",
267
+ "long-running",
268
+ "advanced",
269
+ ],
77
270
  ["workerPoolDoctor", "agent-worker pool doctor", "read", "model-callable"],
78
- ["workerPoolMarkFailed", "agent-worker pool mark-failed", "mutation", "human-gated-required"],
79
- ["workerReportMorning", "agent-worker report morning", "read", "model-callable"],
80
- ["workerReportMetrics", "agent-worker report metrics", "read", "model-callable"],
81
- ]
271
+ [
272
+ "workerPoolMarkFailed",
273
+ "agent-worker pool mark-failed",
274
+ "mutation",
275
+ "human-gated-required",
276
+ ],
277
+ [
278
+ "workerReportMorning",
279
+ "agent-worker report morning",
280
+ "read",
281
+ "model-callable",
282
+ ],
283
+ [
284
+ "workerReportMetrics",
285
+ "agent-worker report metrics",
286
+ "read",
287
+ "model-callable",
288
+ ],
289
+ ],
82
290
  ].map(([action, cli, kind, coverage]) => officialAction(action, cli, kind, coverage));
83
291
  /** Shared constants so dag + dagSpecVersions cannot diverge. */
84
292
  const DAG_SPEC_SUPPORTED_PARSE = [1, 2, 3, 4];
@@ -121,7 +329,12 @@ export function buildOperatorCapabilitiesDocument() {
121
329
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
122
330
  description: "Read one canonical Console operation as a bounded redacted projection.",
123
331
  inputParams: [
124
- { name: "operationId", type: "string", required: true, description: "canonical operation id" },
332
+ {
333
+ name: "operationId",
334
+ type: "string",
335
+ required: true,
336
+ description: "canonical operation id",
337
+ },
125
338
  ],
126
339
  modelCallable: "always",
127
340
  humanConfirmation: "none",
@@ -137,9 +350,24 @@ export function buildOperatorCapabilitiesDocument() {
137
350
  requiredErrorCodes: ["INVALID_INPUT"],
138
351
  description: "List canonical Console operations using bounded read-only filters.",
139
352
  inputParams: [
140
- { name: "limit", type: "number", required: false, description: "maximum results (1-50, default 20)" },
141
- { name: "state", type: "string", required: false, description: "optional operation state filter" },
142
- { name: "action", type: "string", required: false, description: "optional exact action filter" },
353
+ {
354
+ name: "limit",
355
+ type: "number",
356
+ required: false,
357
+ description: "maximum results (1-50, default 20)",
358
+ },
359
+ {
360
+ name: "state",
361
+ type: "string",
362
+ required: false,
363
+ description: "optional operation state filter",
364
+ },
365
+ {
366
+ name: "action",
367
+ type: "string",
368
+ required: false,
369
+ description: "optional exact action filter",
370
+ },
143
371
  ],
144
372
  modelCallable: "always",
145
373
  humanConfirmation: "none",
@@ -155,15 +383,25 @@ export function buildOperatorCapabilitiesDocument() {
155
383
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
156
384
  description: "Read a bounded redacted summary from the canonical operation event ring.",
157
385
  inputParams: [
158
- { name: "operationId", type: "string", required: true, description: "canonical operation id" },
159
- { name: "limit", type: "number", required: false, description: "maximum newest events (1-100, default 20)" },
386
+ {
387
+ name: "operationId",
388
+ type: "string",
389
+ required: true,
390
+ description: "canonical operation id",
391
+ },
392
+ {
393
+ name: "limit",
394
+ type: "number",
395
+ required: false,
396
+ description: "maximum newest events (1-100, default 20)",
397
+ },
160
398
  ],
161
399
  modelCallable: "always",
162
400
  humanConfirmation: "none",
163
401
  },
164
402
  {
165
403
  action: "contractShow",
166
- cli: "loop-agent task contract show <taskId> --json",
404
+ cli: "loop-agent task status <taskId> --json",
167
405
  kind: "read",
168
406
  inputSchemaVersion: 1,
169
407
  resultSchemaVersion: 1,
@@ -171,14 +409,19 @@ export function buildOperatorCapabilitiesDocument() {
171
409
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
172
410
  description: "Return TaskContractStateV1 + observed hashes.",
173
411
  inputParams: [
174
- { name: "taskId", type: "string", required: true, description: "task id" },
412
+ {
413
+ name: "taskId",
414
+ type: "string",
415
+ required: true,
416
+ description: "task id",
417
+ },
175
418
  ],
176
419
  modelCallable: "always",
177
420
  humanConfirmation: "none",
178
421
  },
179
422
  {
180
423
  action: "contractValidate",
181
- cli: "loop-agent task contract validate --task <id> --input <path> --json",
424
+ cli: "loop-agent task status --task <id> --input <path> --json",
182
425
  kind: "read",
183
426
  inputSchemaVersion: 1,
184
427
  resultSchemaVersion: 1,
@@ -189,7 +432,12 @@ export function buildOperatorCapabilitiesDocument() {
189
432
  // NOT a `draft` object. draftJson is optional — dispatcher falls back to
190
433
  // the saved draft.
191
434
  inputParams: [
192
- { name: "taskId", type: "string", required: true, description: "task id" },
435
+ {
436
+ name: "taskId",
437
+ type: "string",
438
+ required: true,
439
+ description: "task id",
440
+ },
193
441
  {
194
442
  name: "draftJson",
195
443
  type: "string",
@@ -202,7 +450,7 @@ export function buildOperatorCapabilitiesDocument() {
202
450
  },
203
451
  {
204
452
  action: "contractDiff",
205
- cli: "loop-agent task contract diff --task <id> --input <path> --json",
453
+ cli: "loop-agent task status --task <id> --input <path> --json",
206
454
  kind: "read",
207
455
  inputSchemaVersion: 1,
208
456
  resultSchemaVersion: 1,
@@ -210,7 +458,12 @@ export function buildOperatorCapabilitiesDocument() {
210
458
  requiredErrorCodes: ["INVALID_INPUT", "NOT_FOUND", "PATH_OUTSIDE_REPO"],
211
459
  description: "Risk-classified diff against current managed/legacy state.",
212
460
  inputParams: [
213
- { name: "taskId", type: "string", required: true, description: "task id" },
461
+ {
462
+ name: "taskId",
463
+ type: "string",
464
+ required: true,
465
+ description: "task id",
466
+ },
214
467
  {
215
468
  name: "draftJson",
216
469
  type: "string",
@@ -223,7 +476,7 @@ export function buildOperatorCapabilitiesDocument() {
223
476
  },
224
477
  {
225
478
  action: "contractApply",
226
- cli: "loop-agent task contract apply --task <id> --input <path> --expected-revision <n> --expected-observed-hash <sha256> --request-id <id> --request-payload-sha256 <sha256> --json",
479
+ cli: "loop-agent task advance <id> --from-draft <path> --json",
227
480
  kind: "mutation",
228
481
  inputSchemaVersion: 1,
229
482
  resultSchemaVersion: 1,
@@ -231,42 +484,82 @@ export function buildOperatorCapabilitiesDocument() {
231
484
  requiredErrorCodes: [...COMMON_MUTATION_ERRORS, "EXTERNALLY_MODIFIED"],
232
485
  description: "Journaled apply of Draft to canonical task facts.",
233
486
  inputParams: [
234
- { name: "taskId", type: "string", required: true, description: "task id" },
235
- { name: "assessmentId", type: "string", required: false, description: "assessment id binding (defaults to the draft's bound assessment)" },
236
- { name: "expectedRevision", type: "string", required: false, description: "expected contract revision (defaults to live observed)" },
237
- { name: "expectedObservedHash", type: "string", required: false, description: "expected observed hash (defaults to live observed)" },
487
+ {
488
+ name: "taskId",
489
+ type: "string",
490
+ required: true,
491
+ description: "task id",
492
+ },
493
+ {
494
+ name: "assessmentId",
495
+ type: "string",
496
+ required: false,
497
+ description: "assessment id binding (defaults to the draft's bound assessment)",
498
+ },
499
+ {
500
+ name: "expectedRevision",
501
+ type: "string",
502
+ required: false,
503
+ description: "expected contract revision (defaults to live observed)",
504
+ },
505
+ {
506
+ name: "expectedObservedHash",
507
+ type: "string",
508
+ required: false,
509
+ description: "expected observed hash (defaults to live observed)",
510
+ },
238
511
  ],
239
512
  modelCallable: "always",
240
513
  humanConfirmation: "conditional",
241
514
  },
242
515
  {
243
516
  action: "newTask",
244
- cli: "loop-agent new-task <id> <title> --json",
517
+ cli: "loop-agent task advance <id> <title> --json",
245
518
  kind: "mutation",
246
519
  inputSchemaVersion: 1,
247
520
  resultSchemaVersion: 1,
248
521
  envelopeSchemaVersion: 1,
249
522
  requiredErrorCodes: [...COMMON_MUTATION_ERRORS],
250
- description: "Create a new task harness skeleton via sibling CLI.",
523
+ description: "Create or advance a task via the single lifecycle mutation entry.",
251
524
  inputParams: [
252
- { name: "taskId", type: "string", required: true, description: "task id" },
253
- { name: "title", type: "string", required: false, description: "task title (defaults to taskId)" },
525
+ {
526
+ name: "taskId",
527
+ type: "string",
528
+ required: true,
529
+ description: "task id",
530
+ },
531
+ {
532
+ name: "title",
533
+ type: "string",
534
+ required: false,
535
+ description: "task title (defaults to taskId)",
536
+ },
254
537
  ],
255
538
  modelCallable: "always",
256
539
  humanConfirmation: "none",
257
540
  },
258
541
  {
259
542
  action: "importPrd",
260
- cli: "loop-agent import-prd <id> --file <server-staged-path> --json",
543
+ cli: "loop-agent task advance <id> --prd <server-staged-path> --json",
261
544
  kind: "mutation",
262
545
  inputSchemaVersion: 1,
263
546
  resultSchemaVersion: 1,
264
547
  envelopeSchemaVersion: 1,
265
548
  requiredErrorCodes: [...COMMON_MUTATION_ERRORS, "PATH_OUTSIDE_REPO"],
266
- description: "Import immutable PRD/source reference via sibling CLI (server-staged file).",
549
+ description: "Archive immutable PRD via task advance (server-staged file).",
267
550
  inputParams: [
268
- { name: "taskId", type: "string", required: true, description: "task id" },
269
- { name: "content", type: "string", required: true, description: "PRD markdown content" },
551
+ {
552
+ name: "taskId",
553
+ type: "string",
554
+ required: true,
555
+ description: "task id",
556
+ },
557
+ {
558
+ name: "content",
559
+ type: "string",
560
+ required: true,
561
+ description: "PRD markdown content",
562
+ },
270
563
  ],
271
564
  modelCallable: "always",
272
565
  humanConfirmation: "none",
@@ -281,7 +574,12 @@ export function buildOperatorCapabilitiesDocument() {
281
574
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
282
575
  description: "Read source instruction contract for a task.",
283
576
  inputParams: [
284
- { name: "taskId", type: "string", required: true, description: "task id" },
577
+ {
578
+ name: "taskId",
579
+ type: "string",
580
+ required: true,
581
+ description: "task id",
582
+ },
285
583
  ],
286
584
  modelCallable: "always",
287
585
  humanConfirmation: "none",
@@ -296,7 +594,12 @@ export function buildOperatorCapabilitiesDocument() {
296
594
  requiredErrorCodes: ["INVALID_INPUT"],
297
595
  description: "Save TaskContractDraftV1 to Console application data only (not repo .harness).",
298
596
  inputParams: [
299
- { name: "taskId", type: "string", required: false, description: "task id (defaults to draft.taskId)" },
597
+ {
598
+ name: "taskId",
599
+ type: "string",
600
+ required: false,
601
+ description: "task id (defaults to draft.taskId)",
602
+ },
300
603
  {
301
604
  name: "draft",
302
605
  type: "object",
@@ -321,10 +624,31 @@ export function buildOperatorCapabilitiesDocument() {
321
624
  ],
322
625
  description: "Prepare server-side DagConfirmationV1 receipt for human challenge.",
323
626
  inputParams: [
324
- { name: "taskId", type: "string", required: true, description: "task id" },
325
- { name: "dagPath", type: "string", required: false, description: "staged DAG path (optional; resolved from the last dagRunTask result)" },
326
- { name: "operatorAction", type: "string", required: false, description: "required official action to bind to this single-use human confirmation receipt" },
327
- { name: "operatorActionArgs", type: "array", itemsType: "string", required: false, description: "exact trailing CLI arguments bound to the official action receipt" },
627
+ {
628
+ name: "taskId",
629
+ type: "string",
630
+ required: true,
631
+ description: "task id",
632
+ },
633
+ {
634
+ name: "dagPath",
635
+ type: "string",
636
+ required: false,
637
+ description: "staged DAG path (optional; resolved from the last dagRunTask result)",
638
+ },
639
+ {
640
+ name: "operatorAction",
641
+ type: "string",
642
+ required: false,
643
+ description: "required official action to bind to this single-use human confirmation receipt",
644
+ },
645
+ {
646
+ name: "operatorActionArgs",
647
+ type: "array",
648
+ itemsType: "string",
649
+ required: false,
650
+ description: "exact trailing CLI arguments bound to the official action receipt",
651
+ },
328
652
  ],
329
653
  modelCallable: "always",
330
654
  humanConfirmation: "none",
@@ -350,7 +674,12 @@ export function buildOperatorCapabilitiesDocument() {
350
674
  // only prepares via prepareDagConfirmation; the browser mutation gate
351
675
  // executes the confirm with a server-signed confirmationToken.
352
676
  inputParams: [
353
- { name: "confirmationId", type: "string", required: true, description: "confirmation id from prepareDagConfirmation" },
677
+ {
678
+ name: "confirmationId",
679
+ type: "string",
680
+ required: true,
681
+ description: "confirmation id from prepareDagConfirmation",
682
+ },
354
683
  ],
355
684
  modelCallable: "never",
356
685
  humanConfirmation: "required",
@@ -417,22 +746,32 @@ export function buildOperatorCapabilitiesDocument() {
417
746
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
418
747
  description: "DAG run handoff report by run id.",
419
748
  inputParams: [
420
- { name: "runId", type: "string", required: true, description: "dag run id" },
749
+ {
750
+ name: "runId",
751
+ type: "string",
752
+ required: true,
753
+ description: "dag run id",
754
+ },
421
755
  ],
422
756
  modelCallable: "always",
423
757
  humanConfirmation: "none",
424
758
  },
425
759
  {
426
760
  action: "status",
427
- cli: "loop-agent status <taskId> --json",
761
+ cli: "loop-agent task status <taskId> --json",
428
762
  kind: "read",
429
763
  inputSchemaVersion: 1,
430
764
  resultSchemaVersion: 1,
431
765
  envelopeSchemaVersion: 1,
432
766
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
433
- description: "Task status (registry entry).",
767
+ description: "Task lifecycle status (read-only).",
434
768
  inputParams: [
435
- { name: "taskId", type: "string", required: true, description: "task id" },
769
+ {
770
+ name: "taskId",
771
+ type: "string",
772
+ required: true,
773
+ description: "task id",
774
+ },
436
775
  ],
437
776
  modelCallable: "always",
438
777
  humanConfirmation: "none",
@@ -447,14 +786,19 @@ export function buildOperatorCapabilitiesDocument() {
447
786
  requiredErrorCodes: ["NOT_FOUND", "INVALID_INPUT"],
448
787
  description: "Spine audit (registry entry).",
449
788
  inputParams: [
450
- { name: "taskId", type: "string", required: true, description: "task id" },
789
+ {
790
+ name: "taskId",
791
+ type: "string",
792
+ required: true,
793
+ description: "task id",
794
+ },
451
795
  ],
452
796
  modelCallable: "always",
453
797
  humanConfirmation: "none",
454
798
  },
455
799
  {
456
800
  action: "dagRunTask",
457
- cli: "loop-agent dag run-task <taskId> --profile auto",
801
+ cli: "loop-agent task advance <taskId> --profile auto --dag-output <path> --json",
458
802
  kind: "long-running",
459
803
  inputSchemaVersion: 1,
460
804
  resultSchemaVersion: 1,
@@ -465,10 +809,20 @@ export function buildOperatorCapabilitiesDocument() {
465
809
  "EXTERNALLY_MODIFIED",
466
810
  "INVALID_INPUT",
467
811
  ],
468
- description: "Generate DagSpec v4 with taskContractBinding (managed required).",
812
+ description: "Generate + strict-validate DAG via task advance (stops at writeSet gate).",
469
813
  inputParams: [
470
- { name: "taskId", type: "string", required: true, description: "task id to run as a DAG" },
471
- { name: "profile", type: "string", required: false, description: "DAG profile (defaults to auto)" },
814
+ {
815
+ name: "taskId",
816
+ type: "string",
817
+ required: true,
818
+ description: "task id to run as a DAG",
819
+ },
820
+ {
821
+ name: "profile",
822
+ type: "string",
823
+ required: false,
824
+ description: "DAG profile (defaults to auto)",
825
+ },
472
826
  ],
473
827
  modelCallable: "always",
474
828
  humanConfirmation: "none",
@@ -483,15 +837,25 @@ export function buildOperatorCapabilitiesDocument() {
483
837
  requiredErrorCodes: ["INVALID_INPUT", "BINDING_DRIFT"],
484
838
  description: "Validate DAG including taskContractBinding drift checks.",
485
839
  inputParams: [
486
- { name: "dagPath", type: "string", required: true, description: "DAG file path to validate" },
487
- { name: "taskId", type: "string", required: false, description: "spine task id (optional, for strict-governance spine check)" },
840
+ {
841
+ name: "dagPath",
842
+ type: "string",
843
+ required: true,
844
+ description: "DAG file path to validate",
845
+ },
846
+ {
847
+ name: "taskId",
848
+ type: "string",
849
+ required: false,
850
+ description: "spine task id (optional, for strict-governance spine check)",
851
+ },
488
852
  ],
489
853
  modelCallable: "always",
490
854
  humanConfirmation: "none",
491
855
  },
492
856
  {
493
857
  action: "runDag",
494
- cli: "loop-agent run-dag --dag <path>",
858
+ cli: "loop-agent task advance <taskId> --approve-gate <id:digest> --json | dag execute --dag <path>",
495
859
  kind: "long-running",
496
860
  inputSchemaVersion: 1,
497
861
  resultSchemaVersion: 1,
@@ -501,9 +865,14 @@ export function buildOperatorCapabilitiesDocument() {
501
865
  "CONTROLLER_MISMATCH",
502
866
  "INVALID_INPUT",
503
867
  ],
504
- description: "Execute reviewed DAG; revalidate binding before writer start.",
868
+ description: "Execute reviewed DAG after human confirmation (prefer task advance --approve-gate when gate token present).",
505
869
  inputParams: [
506
- { name: "confirmationId", type: "string", required: true, description: "confirmation id (from prepareDagConfirmation) — raw dag path is never accepted from the model" },
870
+ {
871
+ name: "confirmationId",
872
+ type: "string",
873
+ required: true,
874
+ description: "confirmation id (from prepareDagConfirmation) — raw dag path is never accepted from the model",
875
+ },
507
876
  ],
508
877
  // prepare-only: the model can invoke runDag but it MUST carry a
509
878
  // confirmationId that was consumed by a human-origin confirm (M0-B).
@@ -520,8 +889,18 @@ export function buildOperatorCapabilitiesDocument() {
520
889
  requiredErrorCodes: ["INVALID_INPUT", "NOT_FOUND"],
521
890
  description: "Read-only subgraph rerun plan for confirmation (no mutation).",
522
891
  inputParams: [
523
- { name: "runId", type: "string", required: true, description: "dag run id" },
524
- { name: "fromNode", type: "string", required: true, description: "node id to rerun from" },
892
+ {
893
+ name: "runId",
894
+ type: "string",
895
+ required: true,
896
+ description: "dag run id",
897
+ },
898
+ {
899
+ name: "fromNode",
900
+ type: "string",
901
+ required: true,
902
+ description: "node id to rerun from",
903
+ },
525
904
  ],
526
905
  modelCallable: "always",
527
906
  humanConfirmation: "none",
@@ -540,10 +919,30 @@ export function buildOperatorCapabilitiesDocument() {
540
919
  ],
541
920
  description: "Execute continuation run from effective node with confirmed plan hash.",
542
921
  inputParams: [
543
- { name: "runId", type: "string", required: true, description: "dag run id" },
544
- { name: "fromNode", type: "string", required: true, description: "node id to rerun from" },
545
- { name: "planHash", type: "string", required: true, description: "rerun plan hash" },
546
- { name: "reason", type: "string", required: true, description: "rerun reason" },
922
+ {
923
+ name: "runId",
924
+ type: "string",
925
+ required: true,
926
+ description: "dag run id",
927
+ },
928
+ {
929
+ name: "fromNode",
930
+ type: "string",
931
+ required: true,
932
+ description: "node id to rerun from",
933
+ },
934
+ {
935
+ name: "planHash",
936
+ type: "string",
937
+ required: true,
938
+ description: "rerun plan hash",
939
+ },
940
+ {
941
+ name: "reason",
942
+ type: "string",
943
+ required: true,
944
+ description: "rerun reason",
945
+ },
547
946
  ],
548
947
  modelCallable: "prepare-only",
549
948
  humanConfirmation: "required",
@@ -558,8 +957,18 @@ export function buildOperatorCapabilitiesDocument() {
558
957
  requiredErrorCodes: ["INVALID_INPUT", "NOT_FOUND"],
559
958
  description: "Prepare a one-shot Human Gate receipt for standaloneTaskRerun / workerTaskRetry. Model may prepare; only the browser mutation gate may consume.",
560
959
  inputParams: [
561
- { name: "action", type: "string", required: true, description: "target action: standaloneTaskRerun | workerTaskRetry" },
562
- { name: "actionParams", type: "object", required: true, description: "params that will be bound into the receipt hash" },
960
+ {
961
+ name: "action",
962
+ type: "string",
963
+ required: true,
964
+ description: "target action: standaloneTaskRerun | workerTaskRetry",
965
+ },
966
+ {
967
+ name: "actionParams",
968
+ type: "object",
969
+ required: true,
970
+ description: "params that will be bound into the receipt hash",
971
+ },
563
972
  ],
564
973
  modelCallable: "always",
565
974
  humanConfirmation: "none",
@@ -571,13 +980,37 @@ export function buildOperatorCapabilitiesDocument() {
571
980
  inputSchemaVersion: 1,
572
981
  resultSchemaVersion: 1,
573
982
  envelopeSchemaVersion: 1,
574
- requiredErrorCodes: [...COMMON_MUTATION_ERRORS, "INVALID_INPUT", "HUMAN_CONFIRMATION_REQUIRED"],
983
+ requiredErrorCodes: [
984
+ ...COMMON_MUTATION_ERRORS,
985
+ "INVALID_INPUT",
986
+ "HUMAN_CONFIRMATION_REQUIRED",
987
+ ],
575
988
  description: "Full standalone task regenerate → validate → execute with parent lineage.",
576
989
  inputParams: [
577
- { name: "runId", type: "string", required: true, description: "dag run id" },
578
- { name: "reason", type: "string", required: true, description: "rerun reason" },
579
- { name: "confirmationId", type: "string", required: true, description: "mutation-gate receipt id from prepareMutationGate" },
580
- { name: "humanGateToken", type: "object", required: true, description: "server-signed human-gate token from prepareMutationGate" },
990
+ {
991
+ name: "runId",
992
+ type: "string",
993
+ required: true,
994
+ description: "dag run id",
995
+ },
996
+ {
997
+ name: "reason",
998
+ type: "string",
999
+ required: true,
1000
+ description: "rerun reason",
1001
+ },
1002
+ {
1003
+ name: "confirmationId",
1004
+ type: "string",
1005
+ required: true,
1006
+ description: "mutation-gate receipt id from prepareMutationGate",
1007
+ },
1008
+ {
1009
+ name: "humanGateToken",
1010
+ type: "object",
1011
+ required: true,
1012
+ description: "server-signed human-gate token from prepareMutationGate",
1013
+ },
581
1014
  ],
582
1015
  modelCallable: "prepare-only",
583
1016
  humanConfirmation: "required",
@@ -589,14 +1022,43 @@ export function buildOperatorCapabilitiesDocument() {
589
1022
  inputSchemaVersion: 1,
590
1023
  resultSchemaVersion: 1,
591
1024
  envelopeSchemaVersion: 1,
592
- requiredErrorCodes: [...COMMON_MUTATION_ERRORS, "INVALID_INPUT", "HUMAN_CONFIRMATION_REQUIRED"],
1025
+ requiredErrorCodes: [
1026
+ ...COMMON_MUTATION_ERRORS,
1027
+ "INVALID_INPUT",
1028
+ "HUMAN_CONFIRMATION_REQUIRED",
1029
+ ],
593
1030
  description: "Requeue failed Task Pool task (Failed → Ready) via in-package pool store.",
594
1031
  inputParams: [
595
- { name: "taskId", type: "string", required: true, description: "task id" },
596
- { name: "featureId", type: "string", required: false, description: "feature id (canonical retry carries Feature identity; passed to the CLI as --feature-id when present)" },
597
- { name: "reason", type: "string", required: true, description: "retry reason" },
598
- { name: "confirmationId", type: "string", required: true, description: "mutation-gate receipt id from prepareMutationGate" },
599
- { name: "humanGateToken", type: "object", required: true, description: "server-signed human-gate token from prepareMutationGate" },
1032
+ {
1033
+ name: "taskId",
1034
+ type: "string",
1035
+ required: true,
1036
+ description: "task id",
1037
+ },
1038
+ {
1039
+ name: "featureId",
1040
+ type: "string",
1041
+ required: false,
1042
+ description: "feature id (canonical retry carries Feature identity; passed to the CLI as --feature-id when present)",
1043
+ },
1044
+ {
1045
+ name: "reason",
1046
+ type: "string",
1047
+ required: true,
1048
+ description: "retry reason",
1049
+ },
1050
+ {
1051
+ name: "confirmationId",
1052
+ type: "string",
1053
+ required: true,
1054
+ description: "mutation-gate receipt id from prepareMutationGate",
1055
+ },
1056
+ {
1057
+ name: "humanGateToken",
1058
+ type: "object",
1059
+ required: true,
1060
+ description: "server-signed human-gate token from prepareMutationGate",
1061
+ },
600
1062
  ],
601
1063
  modelCallable: "prepare-only",
602
1064
  humanConfirmation: "required",
@@ -630,142 +1092,789 @@ export function buildOperatorCapabilitiesDocument() {
630
1092
  };
631
1093
  }
632
1094
  export const OPERATOR_COMMAND_COVERAGE = Object.freeze([
633
- { command: "loop-agent inspect", coverage: "model-callable", action: "inspect", source: "loop-agent" },
634
- { command: "loop-agent doctor", coverage: "model-callable", action: "doctor", source: "loop-agent" },
635
- { command: "loop-agent new-task", coverage: "model-callable", action: "newTask", source: "loop-agent" },
636
- { command: "loop-agent import-prd", coverage: "model-callable", action: "importPrd", source: "loop-agent" },
637
- { command: "loop-agent status", coverage: "model-callable", action: "status", source: "loop-agent" },
638
- { command: "loop-agent promote-run", coverage: "model-callable", action: "promoteRun", source: "loop-agent" },
639
- { command: "loop-agent pi-reuse-benchmark", coverage: "advanced", action: "piReuseBenchmark", source: "loop-agent" },
640
- { command: "loop-agent loop-benchmark", coverage: "advanced", action: "loopBenchmark", source: "loop-agent" },
641
- { command: "loop-agent run-dag", coverage: "human-gated-required", action: "runDag", source: "loop-agent" },
642
- { command: "loop-agent cursor-prompt", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
643
- { command: "loop-agent pi-prompt", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
644
- { command: "loop-agent delegate", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
645
- { command: "loop-agent harvest", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
646
- { command: "loop-agent goal", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
647
- { command: "loop-agent docs audit", coverage: "model-callable", action: "docsAudit", source: "loop-agent" },
648
- { command: "loop-agent docs archive", coverage: "advanced", action: "docsArchive", source: "loop-agent" },
649
- { command: "loop-agent init instructions", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
650
- { command: "loop-agent init doctor", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
651
- { command: "loop-agent init check-update", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
652
- { command: "loop-agent init update", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
653
- { command: "loop-agent init reconcile", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
654
- { command: "loop-agent examples list", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
655
- { command: "loop-agent examples show", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
656
- { command: "loop-agent examples copy", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
657
- { command: "loop-agent eval replay", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
658
- { command: "loop-agent eval report", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
659
- { command: "loop-agent eval candidate", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
660
- { command: "loop-agent eval alias", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
661
- { command: "loop-agent eval promote", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
662
- { command: "loop-agent eval rollback", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
663
- { command: "loop-agent eval corpus", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
664
- { command: "loop-agent eval context-policy", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
665
- { command: "loop-agent eval budget", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
666
- { command: "loop-agent eval private-verifier", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
667
- { command: "loop-agent eval campaign", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
668
- { command: "loop-agent eval experiment", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
669
- { command: "loop-agent eval propose", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
670
- { command: "loop-agent eval outer-loop", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
671
- { command: "loop-agent eval ignition", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
672
- { command: "loop-agent closeout task", coverage: "model-callable", action: "closeoutTask", source: "loop-agent" },
673
- { command: "loop-agent plan list", coverage: "model-callable", action: "planList", source: "loop-agent" },
674
- { command: "loop-agent plan create", coverage: "model-callable", action: "planCreate", source: "loop-agent" },
675
- { command: "loop-agent plan complete", coverage: "model-callable", action: "planComplete", source: "loop-agent" },
676
- { command: "loop-agent plan check", coverage: "model-callable", action: "planCheck", source: "loop-agent" },
677
- { command: "loop-agent spine audit", coverage: "model-callable", action: "spineCheck", source: "loop-agent" },
678
- { command: "loop-agent handoff check", coverage: "model-callable", action: "handoffCheck", source: "loop-agent" },
679
- { command: "loop-agent handoff coverage", coverage: "model-callable", action: "handoffCoverage", source: "loop-agent" },
680
- { command: "loop-agent coverage report", coverage: "model-callable", action: "coverageReport", source: "loop-agent" },
681
- { command: "loop-agent reference index", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
682
- { command: "loop-agent study init", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
683
- { command: "loop-agent worktree create", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
684
- { command: "loop-agent worktree list", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
685
- { command: "loop-agent worktree remove", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
686
- { command: "loop-agent knowledge curate", coverage: "model-callable", action: "knowledgeCurate", source: "loop-agent" },
687
- { command: "loop-agent knowledge query", coverage: "model-callable", action: "knowledgeQuery", source: "loop-agent" },
688
- { command: "loop-agent knowledge graph-init", coverage: "advanced", action: "knowledgeGraphInit", source: "loop-agent" },
689
- { command: "loop-agent knowledge graph-materialize", coverage: "advanced", action: "knowledgeGraphMaterialize", source: "loop-agent" },
690
- { command: "loop-agent knowledge graph-promote", coverage: "advanced", action: "knowledgeGraphPromote", source: "loop-agent" },
691
- { command: "loop-agent knowledge graph-incremental-prepare", coverage: "advanced", action: "knowledgeGraphIncrementalPrepare", source: "loop-agent" },
692
- { command: "loop-agent dag init-hybrid", coverage: "advanced", action: "dagInitHybrid", source: "loop-agent" },
693
- { command: "loop-agent dag run-task", coverage: "model-callable", action: "dagRunTask", source: "loop-agent" },
694
- { command: "loop-agent dag validate", coverage: "model-callable", action: "dagValidate", source: "loop-agent" },
695
- { command: "loop-agent dag workflow-plan", coverage: "advanced", action: "dagWorkflowPlan", source: "loop-agent" },
696
- { command: "loop-agent dag workflow-validate", coverage: "advanced", action: "dagWorkflowValidate", source: "loop-agent" },
697
- { command: "loop-agent dag workflow-compile", coverage: "advanced", action: "dagWorkflowCompile", source: "loop-agent" },
698
- { command: "loop-agent dag approve", coverage: "human-gated-required", action: "dagApprove", source: "loop-agent" },
699
- { command: "loop-agent dag reject", coverage: "human-gated-required", action: "dagReject", source: "loop-agent" },
700
- { command: "loop-agent dag resume", coverage: "human-gated-required", action: "dagResume", source: "loop-agent" },
701
- { command: "loop-agent dag status", coverage: "model-callable", action: "dagStatus", source: "loop-agent" },
702
- { command: "loop-agent dag doctor", coverage: "model-callable", action: "dagDoctor", source: "loop-agent" },
703
- { command: "loop-agent dag report", coverage: "model-callable", action: "dagReport", source: "loop-agent" },
704
- { command: "loop-agent dag closeout-draft", coverage: "model-callable", action: "dagCloseoutDraft", source: "loop-agent" },
705
- { command: "loop-agent dag reconcile-run", coverage: "human-gated-required", action: "dagReconcileRun", source: "loop-agent" },
706
- { command: "loop-agent dag rerun", coverage: "human-gated-required", action: "dagRerun", source: "loop-agent" },
707
- { command: "loop-agent dag rerun-task", coverage: "human-gated-required", action: "standaloneTaskRerun", source: "loop-agent" },
708
- { command: "loop-agent dag reconcile-tasks", coverage: "human-gated-required", action: "dagReconcileTasks", source: "loop-agent" },
709
- { command: "loop-agent dag final-verification", coverage: "human-gated-required", action: "dagFinalVerification", source: "loop-agent" },
710
- { command: "loop-agent workflow list", coverage: "advanced", action: "workflowList", source: "loop-agent" },
711
- { command: "loop-agent workflow inspect", coverage: "advanced", action: "workflowInspect", source: "loop-agent" },
712
- { command: "loop-agent workflow save", coverage: "advanced", action: "workflowSave", source: "loop-agent" },
713
- { command: "loop-agent workflow run", coverage: "advanced", action: "workflowRun", source: "loop-agent" },
714
- { command: "loop-agent workflow diff", coverage: "advanced", action: "workflowDiff", source: "loop-agent" },
715
- { command: "loop-agent workflow replay", coverage: "advanced", action: "workflowReplay", source: "loop-agent" },
716
- { command: "loop-agent loop init", coverage: "advanced", action: "loopInit", source: "loop-agent" },
717
- { command: "loop-agent loop status", coverage: "advanced", action: "loopStatus", source: "loop-agent" },
718
- { command: "loop-agent loop run", coverage: "advanced", action: "loopRun", source: "loop-agent" },
719
- { command: "loop-agent loop record-round", coverage: "advanced", action: "loopRecordRound", source: "loop-agent" },
720
- { command: "loop-agent loop add-signal", coverage: "advanced", action: "loopAddSignal", source: "loop-agent" },
721
- { command: "loop-agent loop closeout", coverage: "advanced", action: "loopCloseout", source: "loop-agent" },
722
- { command: "loop-agent dag decision inspect", coverage: "model-callable", action: "dagDecisionInspect", source: "loop-agent" },
723
- { command: "loop-agent dag decision validate", coverage: "model-callable", action: "dagDecisionValidate", source: "loop-agent" },
724
- { command: "loop-agent task contract show", coverage: "model-callable", action: "contractShow", source: "loop-agent" },
725
- { command: "loop-agent task contract validate", coverage: "model-callable", action: "contractValidate", source: "loop-agent" },
726
- { command: "loop-agent task contract diff", coverage: "model-callable", action: "contractDiff", source: "loop-agent" },
727
- { command: "loop-agent task contract apply", coverage: "human-gated-conditional", action: "contractApply", source: "loop-agent" },
728
- { command: "loop-agent task contract adopt", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Managed recovery face remains outside Chat in M5." },
729
- { command: "loop-agent task contract doctor", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Managed recovery face remains outside Chat in M5." },
730
- { command: "loop-agent task contract recover", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Managed recovery face remains outside Chat in M5." },
731
- { command: "loop-agent operator capabilities", coverage: "model-callable", action: "operatorCapabilities", source: "loop-agent" },
732
- { command: "loop-agent instructions source", coverage: "model-callable", action: "sourceInstructions", source: "loop-agent" },
733
- { command: "loop-agent instructions dag-draft", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
734
- { command: "loop-agent instructions task-artifacts", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
735
- { command: "loop-agent instructions promotion", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
736
- { command: "loop-agent instructions closeout", coverage: "excluded", action: null, source: "loop-agent", exclusionReason: "Not exposed to Operator Chat in M5." },
737
- { command: "loop-agent stats", coverage: "model-callable", action: "stats", source: "loop-agent" },
738
- { command: "loop-agent stats context", coverage: "model-callable", action: "statsContext", source: "loop-agent" },
739
- { command: "agent-worker feature review", coverage: "model-callable", action: "workerFeatureReview", source: "agent-worker" },
740
- { command: "agent-worker feature scaffold", coverage: "advanced", action: "workerFeatureScaffold", source: "agent-worker" },
741
- { command: "agent-worker feature run", coverage: "human-gated-required", action: "workerFeatureRun", source: "agent-worker" },
742
- { command: "agent-worker feature advance", coverage: "human-gated-required", action: "workerFeatureAdvance", source: "agent-worker" },
743
- { command: "agent-worker feature doctor", coverage: "model-callable", action: "workerFeatureDoctor", source: "agent-worker" },
744
- { command: "agent-worker feature verify-final", coverage: "human-gated-required", action: "workerFeatureVerifyFinal", source: "agent-worker" },
745
- { command: "agent-worker feature delivery", coverage: "human-gated-required", action: "workerFeatureDelivery", source: "agent-worker" },
746
- { command: "agent-worker feature closeout", coverage: "human-gated-required", action: "workerFeatureCloseout", source: "agent-worker" },
747
- { command: "agent-worker feature approve-followup", coverage: "advanced", action: "workerFeatureApproveFollowup", source: "agent-worker" },
748
- { command: "agent-worker task validate", coverage: "model-callable", action: "workerTaskValidate", source: "agent-worker" },
749
- { command: "agent-worker task explain-profile", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
750
- { command: "agent-worker task validate-feature", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
751
- { command: "agent-worker task reconcile", coverage: "human-gated-required", action: "workerTaskReconcile", source: "agent-worker" },
752
- { command: "agent-worker task retry", coverage: "human-gated-required", action: "workerTaskRetry", source: "agent-worker" },
753
- { command: "agent-worker task draft-followup", coverage: "advanced", action: "workerTaskDraftFollowup", source: "agent-worker" },
754
- { command: "agent-worker batch plan-ready", coverage: "model-callable", action: "workerBatchPlanReady", source: "agent-worker" },
755
- { command: "agent-worker batch run-ready", coverage: "advanced", action: "workerBatchRunReady", source: "agent-worker" },
756
- { command: "agent-worker pool mark-failed", coverage: "human-gated-required", action: "workerPoolMarkFailed", source: "agent-worker" },
757
- { command: "agent-worker pool doctor", coverage: "model-callable", action: "workerPoolDoctor", source: "agent-worker" },
758
- { command: "agent-worker pool migrate-state", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
759
- { command: "agent-worker feature git advance-checkpoint", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
760
- { command: "agent-worker report morning", coverage: "model-callable", action: "workerReportMorning", source: "agent-worker" },
761
- { command: "agent-worker report metrics", coverage: "model-callable", action: "workerReportMetrics", source: "agent-worker" },
762
- { command: "agent-worker observe serve", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
763
- { command: "agent-worker observe snapshot", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
764
- { command: "agent-worker console serve", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
765
- { command: "agent-worker console doctor", coverage: "excluded", action: null, source: "agent-worker", exclusionReason: "Not exposed to Operator Chat in M5." },
1095
+ {
1096
+ command: "loop-agent inspect",
1097
+ coverage: "model-callable",
1098
+ action: "inspect",
1099
+ source: "loop-agent",
1100
+ },
1101
+ {
1102
+ command: "loop-agent doctor",
1103
+ coverage: "model-callable",
1104
+ action: "doctor",
1105
+ source: "loop-agent",
1106
+ },
1107
+ {
1108
+ command: "loop-agent task advance",
1109
+ coverage: "model-callable",
1110
+ action: "newTask",
1111
+ source: "loop-agent",
1112
+ },
1113
+ {
1114
+ command: "loop-agent task status",
1115
+ coverage: "model-callable",
1116
+ action: "status",
1117
+ source: "loop-agent",
1118
+ },
1119
+ {
1120
+ command: "loop-agent pi-reuse-benchmark",
1121
+ coverage: "advanced",
1122
+ action: "piReuseBenchmark",
1123
+ source: "loop-agent",
1124
+ },
1125
+ {
1126
+ command: "loop-agent loop-benchmark",
1127
+ coverage: "advanced",
1128
+ action: "loopBenchmark",
1129
+ source: "loop-agent",
1130
+ },
1131
+ {
1132
+ command: "loop-agent dag execute",
1133
+ coverage: "human-gated-required",
1134
+ action: "runDag",
1135
+ source: "loop-agent",
1136
+ },
1137
+ {
1138
+ command: "loop-agent cursor-prompt",
1139
+ coverage: "excluded",
1140
+ action: null,
1141
+ source: "loop-agent",
1142
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1143
+ },
1144
+ {
1145
+ command: "loop-agent pi-prompt",
1146
+ coverage: "excluded",
1147
+ action: null,
1148
+ source: "loop-agent",
1149
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1150
+ },
1151
+ {
1152
+ command: "loop-agent delegate",
1153
+ coverage: "excluded",
1154
+ action: null,
1155
+ source: "loop-agent",
1156
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1157
+ },
1158
+ {
1159
+ command: "loop-agent harvest",
1160
+ coverage: "excluded",
1161
+ action: null,
1162
+ source: "loop-agent",
1163
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1164
+ },
1165
+ {
1166
+ command: "loop-agent goal",
1167
+ coverage: "excluded",
1168
+ action: null,
1169
+ source: "loop-agent",
1170
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1171
+ },
1172
+ {
1173
+ command: "loop-agent docs audit",
1174
+ coverage: "model-callable",
1175
+ action: "docsAudit",
1176
+ source: "loop-agent",
1177
+ },
1178
+ {
1179
+ command: "loop-agent docs archive",
1180
+ coverage: "advanced",
1181
+ action: "docsArchive",
1182
+ source: "loop-agent",
1183
+ },
1184
+ {
1185
+ command: "loop-agent init instructions",
1186
+ coverage: "excluded",
1187
+ action: null,
1188
+ source: "loop-agent",
1189
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1190
+ },
1191
+ {
1192
+ command: "loop-agent init doctor",
1193
+ coverage: "excluded",
1194
+ action: null,
1195
+ source: "loop-agent",
1196
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1197
+ },
1198
+ {
1199
+ command: "loop-agent init check-update",
1200
+ coverage: "excluded",
1201
+ action: null,
1202
+ source: "loop-agent",
1203
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1204
+ },
1205
+ {
1206
+ command: "loop-agent init update",
1207
+ coverage: "excluded",
1208
+ action: null,
1209
+ source: "loop-agent",
1210
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1211
+ },
1212
+ {
1213
+ command: "loop-agent init reconcile",
1214
+ coverage: "excluded",
1215
+ action: null,
1216
+ source: "loop-agent",
1217
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1218
+ },
1219
+ {
1220
+ command: "loop-agent examples list",
1221
+ coverage: "excluded",
1222
+ action: null,
1223
+ source: "loop-agent",
1224
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1225
+ },
1226
+ {
1227
+ command: "loop-agent examples show",
1228
+ coverage: "excluded",
1229
+ action: null,
1230
+ source: "loop-agent",
1231
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1232
+ },
1233
+ {
1234
+ command: "loop-agent examples copy",
1235
+ coverage: "excluded",
1236
+ action: null,
1237
+ source: "loop-agent",
1238
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1239
+ },
1240
+ {
1241
+ command: "loop-agent eval replay",
1242
+ coverage: "excluded",
1243
+ action: null,
1244
+ source: "loop-agent",
1245
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1246
+ },
1247
+ {
1248
+ command: "loop-agent eval report",
1249
+ coverage: "excluded",
1250
+ action: null,
1251
+ source: "loop-agent",
1252
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1253
+ },
1254
+ {
1255
+ command: "loop-agent eval candidate",
1256
+ coverage: "excluded",
1257
+ action: null,
1258
+ source: "loop-agent",
1259
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1260
+ },
1261
+ {
1262
+ command: "loop-agent eval alias",
1263
+ coverage: "excluded",
1264
+ action: null,
1265
+ source: "loop-agent",
1266
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1267
+ },
1268
+ {
1269
+ command: "loop-agent eval promote",
1270
+ coverage: "excluded",
1271
+ action: null,
1272
+ source: "loop-agent",
1273
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1274
+ },
1275
+ {
1276
+ command: "loop-agent eval rollback",
1277
+ coverage: "excluded",
1278
+ action: null,
1279
+ source: "loop-agent",
1280
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1281
+ },
1282
+ {
1283
+ command: "loop-agent eval corpus",
1284
+ coverage: "excluded",
1285
+ action: null,
1286
+ source: "loop-agent",
1287
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1288
+ },
1289
+ {
1290
+ command: "loop-agent eval context-policy",
1291
+ coverage: "excluded",
1292
+ action: null,
1293
+ source: "loop-agent",
1294
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1295
+ },
1296
+ {
1297
+ command: "loop-agent eval budget",
1298
+ coverage: "excluded",
1299
+ action: null,
1300
+ source: "loop-agent",
1301
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1302
+ },
1303
+ {
1304
+ command: "loop-agent eval private-verifier",
1305
+ coverage: "excluded",
1306
+ action: null,
1307
+ source: "loop-agent",
1308
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1309
+ },
1310
+ {
1311
+ command: "loop-agent eval campaign",
1312
+ coverage: "excluded",
1313
+ action: null,
1314
+ source: "loop-agent",
1315
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1316
+ },
1317
+ {
1318
+ command: "loop-agent eval experiment",
1319
+ coverage: "excluded",
1320
+ action: null,
1321
+ source: "loop-agent",
1322
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1323
+ },
1324
+ {
1325
+ command: "loop-agent eval propose",
1326
+ coverage: "excluded",
1327
+ action: null,
1328
+ source: "loop-agent",
1329
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1330
+ },
1331
+ {
1332
+ command: "loop-agent eval outer-loop",
1333
+ coverage: "excluded",
1334
+ action: null,
1335
+ source: "loop-agent",
1336
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1337
+ },
1338
+ {
1339
+ command: "loop-agent eval ignition",
1340
+ coverage: "excluded",
1341
+ action: null,
1342
+ source: "loop-agent",
1343
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1344
+ },
1345
+ {
1346
+ command: "loop-agent plan list",
1347
+ coverage: "model-callable",
1348
+ action: "planList",
1349
+ source: "loop-agent",
1350
+ },
1351
+ {
1352
+ command: "loop-agent plan create",
1353
+ coverage: "model-callable",
1354
+ action: "planCreate",
1355
+ source: "loop-agent",
1356
+ },
1357
+ {
1358
+ command: "loop-agent plan complete",
1359
+ coverage: "model-callable",
1360
+ action: "planComplete",
1361
+ source: "loop-agent",
1362
+ },
1363
+ {
1364
+ command: "loop-agent plan check",
1365
+ coverage: "model-callable",
1366
+ action: "planCheck",
1367
+ source: "loop-agent",
1368
+ },
1369
+ {
1370
+ command: "loop-agent spine audit",
1371
+ coverage: "model-callable",
1372
+ action: "spineCheck",
1373
+ source: "loop-agent",
1374
+ },
1375
+ {
1376
+ command: "loop-agent handoff check",
1377
+ coverage: "model-callable",
1378
+ action: "handoffCheck",
1379
+ source: "loop-agent",
1380
+ },
1381
+ {
1382
+ command: "loop-agent handoff coverage",
1383
+ coverage: "model-callable",
1384
+ action: "handoffCoverage",
1385
+ source: "loop-agent",
1386
+ },
1387
+ {
1388
+ command: "loop-agent coverage report",
1389
+ coverage: "model-callable",
1390
+ action: "coverageReport",
1391
+ source: "loop-agent",
1392
+ },
1393
+ {
1394
+ command: "loop-agent reference index",
1395
+ coverage: "excluded",
1396
+ action: null,
1397
+ source: "loop-agent",
1398
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1399
+ },
1400
+ {
1401
+ command: "loop-agent study init",
1402
+ coverage: "excluded",
1403
+ action: null,
1404
+ source: "loop-agent",
1405
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1406
+ },
1407
+ {
1408
+ command: "loop-agent worktree create",
1409
+ coverage: "excluded",
1410
+ action: null,
1411
+ source: "loop-agent",
1412
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1413
+ },
1414
+ {
1415
+ command: "loop-agent worktree list",
1416
+ coverage: "excluded",
1417
+ action: null,
1418
+ source: "loop-agent",
1419
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1420
+ },
1421
+ {
1422
+ command: "loop-agent worktree remove",
1423
+ coverage: "excluded",
1424
+ action: null,
1425
+ source: "loop-agent",
1426
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1427
+ },
1428
+ {
1429
+ command: "loop-agent knowledge curate",
1430
+ coverage: "model-callable",
1431
+ action: "knowledgeCurate",
1432
+ source: "loop-agent",
1433
+ },
1434
+ {
1435
+ command: "loop-agent knowledge query",
1436
+ coverage: "model-callable",
1437
+ action: "knowledgeQuery",
1438
+ source: "loop-agent",
1439
+ },
1440
+ {
1441
+ command: "loop-agent knowledge graph-init",
1442
+ coverage: "advanced",
1443
+ action: "knowledgeGraphInit",
1444
+ source: "loop-agent",
1445
+ },
1446
+ {
1447
+ command: "loop-agent knowledge graph-materialize",
1448
+ coverage: "advanced",
1449
+ action: "knowledgeGraphMaterialize",
1450
+ source: "loop-agent",
1451
+ },
1452
+ {
1453
+ command: "loop-agent knowledge graph-promote",
1454
+ coverage: "advanced",
1455
+ action: "knowledgeGraphPromote",
1456
+ source: "loop-agent",
1457
+ },
1458
+ {
1459
+ command: "loop-agent knowledge graph-incremental-prepare",
1460
+ coverage: "advanced",
1461
+ action: "knowledgeGraphIncrementalPrepare",
1462
+ source: "loop-agent",
1463
+ },
1464
+ {
1465
+ command: "loop-agent dag init-hybrid",
1466
+ coverage: "advanced",
1467
+ action: "dagInitHybrid",
1468
+ source: "loop-agent",
1469
+ },
1470
+ {
1471
+ command: "loop-agent dag validate",
1472
+ coverage: "model-callable",
1473
+ action: "dagValidate",
1474
+ source: "loop-agent",
1475
+ },
1476
+ {
1477
+ command: "loop-agent dag workflow-plan",
1478
+ coverage: "advanced",
1479
+ action: "dagWorkflowPlan",
1480
+ source: "loop-agent",
1481
+ },
1482
+ {
1483
+ command: "loop-agent dag workflow-validate",
1484
+ coverage: "advanced",
1485
+ action: "dagWorkflowValidate",
1486
+ source: "loop-agent",
1487
+ },
1488
+ {
1489
+ command: "loop-agent dag workflow-compile",
1490
+ coverage: "advanced",
1491
+ action: "dagWorkflowCompile",
1492
+ source: "loop-agent",
1493
+ },
1494
+ {
1495
+ command: "loop-agent dag approve",
1496
+ coverage: "human-gated-required",
1497
+ action: "dagApprove",
1498
+ source: "loop-agent",
1499
+ },
1500
+ {
1501
+ command: "loop-agent dag reject",
1502
+ coverage: "human-gated-required",
1503
+ action: "dagReject",
1504
+ source: "loop-agent",
1505
+ },
1506
+ {
1507
+ command: "loop-agent dag resume",
1508
+ coverage: "human-gated-required",
1509
+ action: "dagResume",
1510
+ source: "loop-agent",
1511
+ },
1512
+ {
1513
+ command: "loop-agent dag status",
1514
+ coverage: "model-callable",
1515
+ action: "dagStatus",
1516
+ source: "loop-agent",
1517
+ },
1518
+ {
1519
+ command: "loop-agent dag doctor",
1520
+ coverage: "model-callable",
1521
+ action: "dagDoctor",
1522
+ source: "loop-agent",
1523
+ },
1524
+ {
1525
+ command: "loop-agent dag report",
1526
+ coverage: "model-callable",
1527
+ action: "dagReport",
1528
+ source: "loop-agent",
1529
+ },
1530
+ {
1531
+ command: "loop-agent dag closeout-draft",
1532
+ coverage: "model-callable",
1533
+ action: "dagCloseoutDraft",
1534
+ source: "loop-agent",
1535
+ },
1536
+ {
1537
+ command: "loop-agent dag reconcile-run",
1538
+ coverage: "human-gated-required",
1539
+ action: "dagReconcileRun",
1540
+ source: "loop-agent",
1541
+ },
1542
+ {
1543
+ command: "loop-agent dag rerun",
1544
+ coverage: "human-gated-required",
1545
+ action: "dagRerun",
1546
+ source: "loop-agent",
1547
+ },
1548
+ {
1549
+ command: "loop-agent dag rerun-task",
1550
+ coverage: "human-gated-required",
1551
+ action: "standaloneTaskRerun",
1552
+ source: "loop-agent",
1553
+ },
1554
+ {
1555
+ command: "loop-agent dag reconcile-tasks",
1556
+ coverage: "human-gated-required",
1557
+ action: "dagReconcileTasks",
1558
+ source: "loop-agent",
1559
+ },
1560
+ {
1561
+ command: "loop-agent dag final-verification",
1562
+ coverage: "human-gated-required",
1563
+ action: "dagFinalVerification",
1564
+ source: "loop-agent",
1565
+ },
1566
+ {
1567
+ command: "loop-agent workflow list",
1568
+ coverage: "advanced",
1569
+ action: "workflowList",
1570
+ source: "loop-agent",
1571
+ },
1572
+ {
1573
+ command: "loop-agent workflow inspect",
1574
+ coverage: "advanced",
1575
+ action: "workflowInspect",
1576
+ source: "loop-agent",
1577
+ },
1578
+ {
1579
+ command: "loop-agent workflow save",
1580
+ coverage: "advanced",
1581
+ action: "workflowSave",
1582
+ source: "loop-agent",
1583
+ },
1584
+ {
1585
+ command: "loop-agent workflow run",
1586
+ coverage: "advanced",
1587
+ action: "workflowRun",
1588
+ source: "loop-agent",
1589
+ },
1590
+ {
1591
+ command: "loop-agent workflow diff",
1592
+ coverage: "advanced",
1593
+ action: "workflowDiff",
1594
+ source: "loop-agent",
1595
+ },
1596
+ {
1597
+ command: "loop-agent workflow replay",
1598
+ coverage: "advanced",
1599
+ action: "workflowReplay",
1600
+ source: "loop-agent",
1601
+ },
1602
+ {
1603
+ command: "loop-agent loop init",
1604
+ coverage: "advanced",
1605
+ action: "loopInit",
1606
+ source: "loop-agent",
1607
+ },
1608
+ {
1609
+ command: "loop-agent loop status",
1610
+ coverage: "advanced",
1611
+ action: "loopStatus",
1612
+ source: "loop-agent",
1613
+ },
1614
+ {
1615
+ command: "loop-agent loop run",
1616
+ coverage: "advanced",
1617
+ action: "loopRun",
1618
+ source: "loop-agent",
1619
+ },
1620
+ {
1621
+ command: "loop-agent loop record-round",
1622
+ coverage: "advanced",
1623
+ action: "loopRecordRound",
1624
+ source: "loop-agent",
1625
+ },
1626
+ {
1627
+ command: "loop-agent loop add-signal",
1628
+ coverage: "advanced",
1629
+ action: "loopAddSignal",
1630
+ source: "loop-agent",
1631
+ },
1632
+ {
1633
+ command: "loop-agent loop closeout",
1634
+ coverage: "advanced",
1635
+ action: "loopCloseout",
1636
+ source: "loop-agent",
1637
+ },
1638
+ {
1639
+ command: "loop-agent dag decision inspect",
1640
+ coverage: "model-callable",
1641
+ action: "dagDecisionInspect",
1642
+ source: "loop-agent",
1643
+ },
1644
+ {
1645
+ command: "loop-agent dag decision validate",
1646
+ coverage: "model-callable",
1647
+ action: "dagDecisionValidate",
1648
+ source: "loop-agent",
1649
+ },
1650
+ {
1651
+ command: "loop-agent operator capabilities",
1652
+ coverage: "model-callable",
1653
+ action: "operatorCapabilities",
1654
+ source: "loop-agent",
1655
+ },
1656
+ {
1657
+ command: "loop-agent instructions source",
1658
+ coverage: "model-callable",
1659
+ action: "sourceInstructions",
1660
+ source: "loop-agent",
1661
+ },
1662
+ {
1663
+ command: "loop-agent instructions dag-draft",
1664
+ coverage: "excluded",
1665
+ action: null,
1666
+ source: "loop-agent",
1667
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1668
+ },
1669
+ {
1670
+ command: "loop-agent instructions task-artifacts",
1671
+ coverage: "excluded",
1672
+ action: null,
1673
+ source: "loop-agent",
1674
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1675
+ },
1676
+ {
1677
+ command: "loop-agent instructions promotion",
1678
+ coverage: "excluded",
1679
+ action: null,
1680
+ source: "loop-agent",
1681
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1682
+ },
1683
+ {
1684
+ command: "loop-agent instructions closeout",
1685
+ coverage: "excluded",
1686
+ action: null,
1687
+ source: "loop-agent",
1688
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1689
+ },
1690
+ {
1691
+ command: "loop-agent stats",
1692
+ coverage: "model-callable",
1693
+ action: "stats",
1694
+ source: "loop-agent",
1695
+ },
1696
+ {
1697
+ command: "loop-agent stats context",
1698
+ coverage: "model-callable",
1699
+ action: "statsContext",
1700
+ source: "loop-agent",
1701
+ },
1702
+ {
1703
+ command: "agent-worker feature review",
1704
+ coverage: "model-callable",
1705
+ action: "workerFeatureReview",
1706
+ source: "agent-worker",
1707
+ },
1708
+ {
1709
+ command: "agent-worker feature scaffold",
1710
+ coverage: "advanced",
1711
+ action: "workerFeatureScaffold",
1712
+ source: "agent-worker",
1713
+ },
1714
+ {
1715
+ command: "agent-worker feature run",
1716
+ coverage: "human-gated-required",
1717
+ action: "workerFeatureRun",
1718
+ source: "agent-worker",
1719
+ },
1720
+ {
1721
+ command: "agent-worker feature advance",
1722
+ coverage: "human-gated-required",
1723
+ action: "workerFeatureAdvance",
1724
+ source: "agent-worker",
1725
+ },
1726
+ {
1727
+ command: "agent-worker feature doctor",
1728
+ coverage: "model-callable",
1729
+ action: "workerFeatureDoctor",
1730
+ source: "agent-worker",
1731
+ },
1732
+ {
1733
+ command: "agent-worker feature verify-final",
1734
+ coverage: "human-gated-required",
1735
+ action: "workerFeatureVerifyFinal",
1736
+ source: "agent-worker",
1737
+ },
1738
+ {
1739
+ command: "agent-worker feature delivery",
1740
+ coverage: "human-gated-required",
1741
+ action: "workerFeatureDelivery",
1742
+ source: "agent-worker",
1743
+ },
1744
+ {
1745
+ command: "agent-worker feature closeout",
1746
+ coverage: "human-gated-required",
1747
+ action: "workerFeatureCloseout",
1748
+ source: "agent-worker",
1749
+ },
1750
+ {
1751
+ command: "agent-worker feature approve-followup",
1752
+ coverage: "advanced",
1753
+ action: "workerFeatureApproveFollowup",
1754
+ source: "agent-worker",
1755
+ },
1756
+ {
1757
+ command: "agent-worker task validate",
1758
+ coverage: "model-callable",
1759
+ action: "workerTaskValidate",
1760
+ source: "agent-worker",
1761
+ },
1762
+ {
1763
+ command: "agent-worker task explain-profile",
1764
+ coverage: "excluded",
1765
+ action: null,
1766
+ source: "agent-worker",
1767
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1768
+ },
1769
+ {
1770
+ command: "agent-worker task validate-feature",
1771
+ coverage: "excluded",
1772
+ action: null,
1773
+ source: "agent-worker",
1774
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1775
+ },
1776
+ {
1777
+ command: "agent-worker task reconcile",
1778
+ coverage: "human-gated-required",
1779
+ action: "workerTaskReconcile",
1780
+ source: "agent-worker",
1781
+ },
1782
+ {
1783
+ command: "agent-worker task retry",
1784
+ coverage: "human-gated-required",
1785
+ action: "workerTaskRetry",
1786
+ source: "agent-worker",
1787
+ },
1788
+ {
1789
+ command: "agent-worker task draft-followup",
1790
+ coverage: "advanced",
1791
+ action: "workerTaskDraftFollowup",
1792
+ source: "agent-worker",
1793
+ },
1794
+ {
1795
+ command: "agent-worker batch plan-ready",
1796
+ coverage: "model-callable",
1797
+ action: "workerBatchPlanReady",
1798
+ source: "agent-worker",
1799
+ },
1800
+ {
1801
+ command: "agent-worker batch run-ready",
1802
+ coverage: "advanced",
1803
+ action: "workerBatchRunReady",
1804
+ source: "agent-worker",
1805
+ },
1806
+ {
1807
+ command: "agent-worker pool mark-failed",
1808
+ coverage: "human-gated-required",
1809
+ action: "workerPoolMarkFailed",
1810
+ source: "agent-worker",
1811
+ },
1812
+ {
1813
+ command: "agent-worker pool doctor",
1814
+ coverage: "model-callable",
1815
+ action: "workerPoolDoctor",
1816
+ source: "agent-worker",
1817
+ },
1818
+ {
1819
+ command: "agent-worker pool migrate-state",
1820
+ coverage: "excluded",
1821
+ action: null,
1822
+ source: "agent-worker",
1823
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1824
+ },
1825
+ {
1826
+ command: "agent-worker feature git advance-checkpoint",
1827
+ coverage: "excluded",
1828
+ action: null,
1829
+ source: "agent-worker",
1830
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1831
+ },
1832
+ {
1833
+ command: "agent-worker report morning",
1834
+ coverage: "model-callable",
1835
+ action: "workerReportMorning",
1836
+ source: "agent-worker",
1837
+ },
1838
+ {
1839
+ command: "agent-worker report metrics",
1840
+ coverage: "model-callable",
1841
+ action: "workerReportMetrics",
1842
+ source: "agent-worker",
1843
+ },
1844
+ {
1845
+ command: "agent-worker observe serve",
1846
+ coverage: "excluded",
1847
+ action: null,
1848
+ source: "agent-worker",
1849
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1850
+ },
1851
+ {
1852
+ command: "agent-worker observe snapshot",
1853
+ coverage: "excluded",
1854
+ action: null,
1855
+ source: "agent-worker",
1856
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1857
+ },
1858
+ {
1859
+ command: "agent-worker console serve",
1860
+ coverage: "excluded",
1861
+ action: null,
1862
+ source: "agent-worker",
1863
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1864
+ },
1865
+ {
1866
+ command: "agent-worker console doctor",
1867
+ coverage: "excluded",
1868
+ action: null,
1869
+ source: "agent-worker",
1870
+ exclusionReason: "Not exposed to Operator Chat in M5.",
1871
+ },
766
1872
  ]);
767
1873
  export function assertCoverageManifestConsistent() {
768
- const actions = new Map(buildOperatorCapabilitiesDocument().actions.map((entry) => [entry.action, entry]));
1874
+ const actions = new Map(buildOperatorCapabilitiesDocument().actions.map((entry) => [
1875
+ entry.action,
1876
+ entry,
1877
+ ]));
769
1878
  const seen = new Set();
770
1879
  for (const entry of OPERATOR_COMMAND_COVERAGE) {
771
1880
  if (seen.has(entry.command))
@@ -781,11 +1890,17 @@ export function assertCoverageManifestConsistent() {
781
1890
  throw new Error(`coverage references unknown action: ${entry.action}`);
782
1891
  if (entry.coverage === "excluded" && capability.modelCallable !== "never")
783
1892
  throw new Error(`excluded action is model-callable: ${entry.action}`);
784
- if (entry.coverage === "model-callable" && (capability.modelCallable !== "always" || capability.humanConfirmation !== "none"))
1893
+ if (entry.coverage === "model-callable" &&
1894
+ (capability.modelCallable !== "always" ||
1895
+ capability.humanConfirmation !== "none"))
785
1896
  throw new Error(`invalid model-callable classification: ${entry.action}`);
786
- if (entry.coverage === "human-gated-conditional" && (capability.modelCallable !== "always" || capability.humanConfirmation !== "conditional"))
1897
+ if (entry.coverage === "human-gated-conditional" &&
1898
+ (capability.modelCallable !== "always" ||
1899
+ capability.humanConfirmation !== "conditional"))
787
1900
  throw new Error(`invalid conditional gate classification: ${entry.action}`);
788
- if (entry.coverage === "human-gated-required" && (capability.modelCallable !== "prepare-only" || capability.humanConfirmation !== "required"))
1901
+ if (entry.coverage === "human-gated-required" &&
1902
+ (capability.modelCallable !== "prepare-only" ||
1903
+ capability.humanConfirmation !== "required"))
789
1904
  throw new Error(`invalid required gate classification: ${entry.action}`);
790
1905
  if (entry.coverage === "advanced") {
791
1906
  const expected = capability.kind === "read" ? "always" : "never";