@mobrienv/autoloop-harness 0.7.4 → 0.9.1

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 (154) hide show
  1. package/dist/acceptance.d.ts +31 -0
  2. package/dist/acceptance.js +69 -0
  3. package/dist/acceptance.js.map +1 -0
  4. package/dist/ask.d.ts +16 -0
  5. package/dist/ask.js +47 -0
  6. package/dist/ask.js.map +1 -0
  7. package/dist/backend/types.d.ts +16 -0
  8. package/dist/backend/types.js +17 -0
  9. package/dist/backend/types.js.map +1 -0
  10. package/dist/circuit-breaker.d.ts +27 -0
  11. package/dist/circuit-breaker.js +41 -0
  12. package/dist/circuit-breaker.js.map +1 -0
  13. package/dist/completion-lint.d.ts +29 -0
  14. package/dist/completion-lint.js +51 -0
  15. package/dist/completion-lint.js.map +1 -0
  16. package/dist/config-helpers.d.ts +10 -2
  17. package/dist/config-helpers.js +272 -30
  18. package/dist/config-helpers.js.map +1 -1
  19. package/dist/control/acp-adapter.d.ts +12 -0
  20. package/dist/control/acp-adapter.js +54 -0
  21. package/dist/control/acp-adapter.js.map +1 -0
  22. package/dist/control/adapter.d.ts +12 -0
  23. package/dist/control/adapter.js +2 -0
  24. package/dist/control/adapter.js.map +1 -0
  25. package/dist/control/capabilities.d.ts +9 -0
  26. package/dist/control/capabilities.js +27 -0
  27. package/dist/control/capabilities.js.map +1 -0
  28. package/dist/control/claude-sdk-adapter.d.ts +15 -0
  29. package/dist/control/claude-sdk-adapter.js +79 -0
  30. package/dist/control/claude-sdk-adapter.js.map +1 -0
  31. package/dist/control/command-adapter.d.ts +19 -0
  32. package/dist/control/command-adapter.js +57 -0
  33. package/dist/control/command-adapter.js.map +1 -0
  34. package/dist/control/dispatch.d.ts +14 -0
  35. package/dist/control/dispatch.js +55 -0
  36. package/dist/control/dispatch.js.map +1 -0
  37. package/dist/control/index.d.ts +11 -0
  38. package/dist/control/index.js +9 -0
  39. package/dist/control/index.js.map +1 -0
  40. package/dist/control/kiro-adapter.d.ts +2 -0
  41. package/dist/control/kiro-adapter.js +2 -0
  42. package/dist/control/kiro-adapter.js.map +1 -0
  43. package/dist/control/paths.d.ts +19 -0
  44. package/dist/control/paths.js +40 -0
  45. package/dist/control/paths.js.map +1 -0
  46. package/dist/control/pi-adapter.d.ts +15 -0
  47. package/dist/control/pi-adapter.js +76 -0
  48. package/dist/control/pi-adapter.js.map +1 -0
  49. package/dist/control/queue.d.ts +14 -0
  50. package/dist/control/queue.js +82 -0
  51. package/dist/control/queue.js.map +1 -0
  52. package/dist/control/render.d.ts +10 -0
  53. package/dist/control/render.js +53 -0
  54. package/dist/control/render.js.map +1 -0
  55. package/dist/control/types.d.ts +56 -0
  56. package/dist/control/types.js +9 -0
  57. package/dist/control/types.js.map +1 -0
  58. package/dist/display.d.ts +9 -2
  59. package/dist/display.js +37 -1
  60. package/dist/display.js.map +1 -1
  61. package/dist/emit.d.ts +27 -0
  62. package/dist/emit.js +327 -6
  63. package/dist/emit.js.map +1 -1
  64. package/dist/events.d.ts +36 -3
  65. package/dist/fanout-runner.d.ts +25 -0
  66. package/dist/fanout-runner.js +54 -0
  67. package/dist/fanout-runner.js.map +1 -0
  68. package/dist/file-mod-audit.d.ts +29 -0
  69. package/dist/file-mod-audit.js +63 -0
  70. package/dist/file-mod-audit.js.map +1 -0
  71. package/dist/git-diff.d.ts +19 -0
  72. package/dist/git-diff.js +74 -0
  73. package/dist/git-diff.js.map +1 -0
  74. package/dist/guards.d.ts +37 -0
  75. package/dist/guards.js +78 -0
  76. package/dist/guards.js.map +1 -0
  77. package/dist/hooks.d.ts +78 -0
  78. package/dist/hooks.js +239 -0
  79. package/dist/hooks.js.map +1 -0
  80. package/dist/index.d.ts +15 -2
  81. package/dist/index.js +359 -26
  82. package/dist/index.js.map +1 -1
  83. package/dist/intent.d.ts +45 -0
  84. package/dist/intent.js +127 -0
  85. package/dist/intent.js.map +1 -0
  86. package/dist/iteration-diff.d.ts +32 -0
  87. package/dist/iteration-diff.js +92 -0
  88. package/dist/iteration-diff.js.map +1 -0
  89. package/dist/iteration.d.ts +20 -0
  90. package/dist/iteration.js +551 -30
  91. package/dist/iteration.js.map +1 -1
  92. package/dist/metareview.d.ts +9 -1
  93. package/dist/metareview.js +158 -34
  94. package/dist/metareview.js.map +1 -1
  95. package/dist/notify.d.ts +22 -0
  96. package/dist/notify.js +110 -0
  97. package/dist/notify.js.map +1 -0
  98. package/dist/parallel.d.ts +17 -0
  99. package/dist/parallel.js +38 -6
  100. package/dist/parallel.js.map +1 -1
  101. package/dist/postconditions.d.ts +25 -0
  102. package/dist/postconditions.js +107 -0
  103. package/dist/postconditions.js.map +1 -0
  104. package/dist/postfire-verify.d.ts +31 -0
  105. package/dist/postfire-verify.js +64 -0
  106. package/dist/postfire-verify.js.map +1 -0
  107. package/dist/premature-quit.d.ts +25 -0
  108. package/dist/premature-quit.js +54 -0
  109. package/dist/premature-quit.js.map +1 -0
  110. package/dist/progress.d.ts +20 -0
  111. package/dist/progress.js +56 -0
  112. package/dist/progress.js.map +1 -0
  113. package/dist/prompt.d.ts +4 -0
  114. package/dist/prompt.js +42 -2
  115. package/dist/prompt.js.map +1 -1
  116. package/dist/provisional.d.ts +42 -0
  117. package/dist/provisional.js +92 -0
  118. package/dist/provisional.js.map +1 -0
  119. package/dist/registry-bridge.js +32 -1
  120. package/dist/registry-bridge.js.map +1 -1
  121. package/dist/resume.d.ts +61 -0
  122. package/dist/resume.js +226 -0
  123. package/dist/resume.js.map +1 -0
  124. package/dist/scratchpad.js +27 -8
  125. package/dist/scratchpad.js.map +1 -1
  126. package/dist/stage.d.ts +21 -0
  127. package/dist/stage.js +131 -0
  128. package/dist/stage.js.map +1 -0
  129. package/dist/stop.d.ts +32 -2
  130. package/dist/stop.js +169 -0
  131. package/dist/stop.js.map +1 -1
  132. package/dist/suspend-state.d.ts +32 -0
  133. package/dist/suspend-state.js +104 -0
  134. package/dist/suspend-state.js.map +1 -0
  135. package/dist/tamper.d.ts +21 -0
  136. package/dist/tamper.js +88 -0
  137. package/dist/tamper.js.map +1 -0
  138. package/dist/types.d.ts +294 -3
  139. package/dist/types.js +91 -1
  140. package/dist/types.js.map +1 -1
  141. package/dist/wave/finalize-wave.d.ts +15 -5
  142. package/dist/wave/finalize-wave.js +56 -2
  143. package/dist/wave/finalize-wave.js.map +1 -1
  144. package/dist/wave/launch-branches.d.ts +23 -2
  145. package/dist/wave/launch-branches.js +58 -3
  146. package/dist/wave/launch-branches.js.map +1 -1
  147. package/dist/wave/stage-branch-runner.d.ts +12 -0
  148. package/dist/wave/stage-branch-runner.js +130 -0
  149. package/dist/wave/stage-branch-runner.js.map +1 -0
  150. package/dist/wave/types.d.ts +40 -2
  151. package/dist/wave.d.ts +32 -1
  152. package/dist/wave.js +163 -34
  153. package/dist/wave.js.map +1 -1
  154. package/package.json +131 -3
package/dist/emit.js CHANGED
@@ -1,10 +1,15 @@
1
+ import { spawnSync } from "node:child_process";
1
2
  import { mkdirSync } from "node:fs";
2
3
  import { dirname } from "node:path";
3
4
  import { joinCsv, jsonField, listText, splitCsv, } from "@mobrienv/autoloop-core";
4
5
  import * as config from "@mobrienv/autoloop-core/config";
6
+ import { classifyGateOutcome, validateEvidenceRequirement, } from "@mobrienv/autoloop-core/evidence";
5
7
  import { appendAgentEvent, appendEvent, latestIterationForRun, latestRunId, } from "@mobrienv/autoloop-core/journal";
6
- import { materializeOpenFrom } from "@mobrienv/autoloop-core/tasks";
8
+ import { materializeOpenFrom, resolveFile, } from "@mobrienv/autoloop-core/tasks";
7
9
  import * as topology from "@mobrienv/autoloop-core/topology";
10
+ import { printHookOutput } from "./display.js";
11
+ import { parseMutationDirective } from "./hooks.js";
12
+ import { writeSuspendState } from "./suspend-state.js";
8
13
  const COORDINATION_TOPICS = new Set([
9
14
  "issue.discovered",
10
15
  "issue.resolved",
@@ -34,6 +39,7 @@ const CORE_SYSTEM_TOPICS = new Set([
34
39
  "review.finish",
35
40
  "backend.start",
36
41
  "backend.finish",
42
+ "backend.usage",
37
43
  "event.invalid",
38
44
  ]);
39
45
  export function coreSystemTopic(topic) {
@@ -60,22 +66,173 @@ function dispatchParallelTopic(topic) {
60
66
  export function reservedParallelJoinedTopic(topic) {
61
67
  return topic.endsWith(".parallel.joined");
62
68
  }
69
+ /**
70
+ * Run pre_emit/post_emit hooks. `emit()` runs out-of-process (the agent
71
+ * invokes the `autoloops emit` tool script, which spawns a fresh CLI process
72
+ * calling `harness.emit()`) so there is no live `LoopContext` to drive
73
+ * `runPhaseHooks` through — this is a disk/config-driven parallel
74
+ * implementation reading `HookSpec`s straight from the project's raw TOML.
75
+ *
76
+ * `on_error = "suspend"` is honored as `block` here (see design note: the
77
+ * emit subprocess cannot itself block the harness's iteration loop) but ALSO
78
+ * writes durable suspend state, so the harness detects it at the next
79
+ * iteration boundary (`runIteration` start) and halts there instead of
80
+ * silently continuing.
81
+ */
82
+ function runEmitPhaseHooks(projectDir, journalFile, phase, runId, iteration, topic, payload) {
83
+ const specs = config
84
+ .loadHookSpecs(projectDir)
85
+ .filter((s) => s.phase === phase);
86
+ const outcome = { blocked: false };
87
+ for (const spec of specs) {
88
+ if (!spec.command)
89
+ continue;
90
+ const env = {
91
+ ...process.env,
92
+ AUTOLOOP_PROJECT_DIR: projectDir,
93
+ AUTOLOOP_RUN_ID: runId,
94
+ AUTOLOOP_ITERATION: iteration,
95
+ AUTOLOOP_EMIT_TOPIC: outcome.mutatedTopic ?? topic,
96
+ AUTOLOOP_EMIT_PAYLOAD: outcome.mutatedPayload ?? payload,
97
+ };
98
+ const result = spawnSync(spec.command, {
99
+ shell: true,
100
+ cwd: projectDir,
101
+ encoding: "utf-8",
102
+ env,
103
+ });
104
+ const combined = (result.stdout ?? "") +
105
+ (result.stderr ? `\n[stderr]\n${result.stderr}` : "");
106
+ const status = result.status ?? -1;
107
+ const failed = status !== 0 || Boolean(result.error);
108
+ appendEvent(journalFile, runId, iteration, "hook.output", `"hook": ${JSON.stringify(phase)}, "exit_code": ${status}, "output": ${JSON.stringify(combined.trim())}`);
109
+ printHookOutput(phase, status, combined.trim(), failed);
110
+ if (!failed && spec.mutate === "event") {
111
+ const directive = parseMutationDirective(combined.split("\n[stderr]\n")[0], "event");
112
+ if (directive) {
113
+ if (directive.topic !== undefined)
114
+ outcome.mutatedTopic = directive.topic;
115
+ if (directive.payload !== undefined)
116
+ outcome.mutatedPayload = directive.payload;
117
+ }
118
+ }
119
+ if (!failed)
120
+ continue;
121
+ const detail = (result.stderr ?? "").trim() || (result.stdout ?? "").trim() || "";
122
+ const msg = `hook ${phase} failed (exit ${status}): ${detail.split("\n")[0] ?? ""}`;
123
+ if (spec.onError === "warn")
124
+ continue;
125
+ outcome.blocked = true;
126
+ outcome.blockedMessage = msg;
127
+ if (spec.onError === "suspend") {
128
+ const stateDir = process.env.AUTOLOOP_STATE_DIR || config.stateDirPath(projectDir);
129
+ writeSuspendState(stateDir, {
130
+ runId,
131
+ phase,
132
+ iteration: Number(iteration) || 0,
133
+ reason: msg,
134
+ hookCommand: spec.command,
135
+ createdAt: new Date().toISOString(),
136
+ resumeIteration: Number(iteration) || 0,
137
+ }, journalFile);
138
+ }
139
+ return outcome;
140
+ }
141
+ return outcome;
142
+ }
63
143
  export function emit(projectDir, topic, payload) {
144
+ const result = emitCore(projectDir, topic, payload);
145
+ if (!result.ok)
146
+ return result;
147
+ // post_emit hooks run after a successful accept. They cannot un-journal the
148
+ // already-accepted event, but a `block` policy still surfaces as a failed
149
+ // result (visible to the agent/CLI caller) and a `suspend` policy writes
150
+ // durable suspend state for the harness to catch at the next iteration
151
+ // boundary.
152
+ const journalFile = resolveEmitJournalFile(projectDir);
153
+ const validation = emitValidationContext(projectDir, journalFile);
154
+ const postEmit = runEmitPhaseHooks(projectDir, journalFile, "post_emit", validation.runId, validation.iteration, result.topic ?? topic, payload);
155
+ if (postEmit.blocked) {
156
+ return {
157
+ ok: false,
158
+ topic: result.topic,
159
+ error: postEmit.blockedMessage ?? "post_emit hook blocked this event",
160
+ };
161
+ }
162
+ return result;
163
+ }
164
+ function emitCore(projectDir, topic, payload) {
64
165
  const journalFile = resolveEmitJournalFile(projectDir);
65
166
  mkdirSync(dirname(journalFile), { recursive: true });
66
167
  const validation = emitValidationContext(projectDir, journalFile);
168
+ // pre_emit hooks: run before any gating so a configured mutation can steer
169
+ // routing/gate decisions too. Runs disk/config-driven (see
170
+ // `runEmitPhaseHooks`) since this call is out-of-process from the harness.
171
+ const preEmit = runEmitPhaseHooks(projectDir, journalFile, "pre_emit", validation.runId, validation.iteration, topic, payload);
172
+ if (preEmit.mutatedTopic !== undefined)
173
+ topic = preEmit.mutatedTopic;
174
+ if (preEmit.mutatedPayload !== undefined)
175
+ payload = preEmit.mutatedPayload;
176
+ if (preEmit.blocked) {
177
+ return {
178
+ ok: false,
179
+ topic,
180
+ error: preEmit.blockedMessage ?? "pre_emit hook blocked this event",
181
+ };
182
+ }
183
+ // Evidence gate (opt-in): applies to ANY configured event, BEFORE routing /
184
+ // coordination / completion handling, so a declared gate is never silently
185
+ // bypassed (e.g. on a coordination/operator topic). A success event must
186
+ // carry its required evidence in the payload, else it is rejected and the
187
+ // typed `blocked` event is journaled instead — preserving an evidence-bearing
188
+ // quality gate over a topology that otherwise only checks routing. No
189
+ // `[[gate]]` for this topic => no-op.
190
+ const gate = topology.gateForEvent(validation.topo, topic);
191
+ if (gate && gate.requires.length > 0) {
192
+ const missing = missingEvidence(gate.requires, payload);
193
+ if (missing.length > 0) {
194
+ return rejectEvidenceGate(journalFile, topic, gate, missing, payload, validation);
195
+ }
196
+ }
197
+ // Typed evidence gate (opt-in, additive to `requires` above): each
198
+ // `evidence` rule is validated for presence plus (per-type) a status/
199
+ // threshold check. Any shortfall rejects the emit and journals the routed
200
+ // typed event — `blocked` for missing evidence (soft retry), `failed` (or
201
+ // `blocked` as a fallback) for evidence that was supplied but did not pass.
202
+ if (gate && gate.evidence.length > 0) {
203
+ const shortfalls = gate.evidence
204
+ .map((req) => validateEvidenceRequirement(req, payload))
205
+ .filter((s) => s !== null);
206
+ if (shortfalls.length > 0) {
207
+ return rejectTypedEvidenceGate(journalFile, topic, gate, shortfalls, payload, validation);
208
+ }
209
+ }
210
+ // The human-ask event is always accepted regardless of routing — it pauses
211
+ // the loop for a human answer; the harness owns the block, not `[handoff]`.
212
+ if (validation.askEvent !== "" && topic === validation.askEvent) {
213
+ return acceptEmit(journalFile, topic, payload, validation);
214
+ }
67
215
  if (coordinationTopic(topic)) {
68
216
  return acceptEmit(journalFile, topic, payload, validation);
69
217
  }
70
218
  if (operatorTopic(topic)) {
71
219
  return acceptEmit(journalFile, topic, payload, validation);
72
220
  }
73
- // Task completion gate: block completion if open tasks remain
221
+ // Task completion gate: block completion if open blocking tasks remain.
222
+ // Soft tasks (soft === true) are advisory and never block completion.
223
+ //
224
+ // Resolve via tasks.resolveFile (NOT config.resolveTasksFile) so the gate
225
+ // honors the AUTOLOOP_TASKS_FILE env override — the same resolver the task
226
+ // CLI and the agent's `task add`/`task complete` use (tools.ts exports
227
+ // AUTOLOOP_TASKS_FILE into the agent env). This keeps the gate reading the
228
+ // exact store the tasks are written to, including when an external parent
229
+ // (e.g. ralph) points autoloop at a canonical store. Using the config path
230
+ // here would silently read a different file and miss open tasks.
74
231
  if (topic === validation.completionEvent) {
75
- const tasksFile = config.resolveTasksFile(projectDir);
76
- const openTasks = materializeOpenFrom(tasksFile);
77
- if (openTasks.length > 0) {
78
- return rejectTaskGate(journalFile, topic, openTasks, validation);
232
+ const tasksFile = resolveFile(projectDir);
233
+ const blockingTasks = materializeOpenFrom(tasksFile).filter((t) => t.soft !== true);
234
+ if (blockingTasks.length > 0) {
235
+ return rejectTaskGate(journalFile, topic, blockingTasks, validation);
79
236
  }
80
237
  }
81
238
  if (invalidEvent(topic, validation.allowedEvents, validation.parallelEnabled, validation.completionEvent)) {
@@ -83,6 +240,91 @@ export function emit(projectDir, topic, payload) {
83
240
  }
84
241
  return acceptEmit(journalFile, topic, payload, validation);
85
242
  }
243
+ /**
244
+ * Whether a JSON value counts as evidence: a non-empty string, a finite number
245
+ * (incl. 0, e.g. `errors=0`), or `true`. Empty strings, `false`, `null`,
246
+ * objects, and arrays do NOT count — they are vacuous and must not satisfy a
247
+ * gate.
248
+ */
249
+ function isEvidenceValue(v) {
250
+ if (typeof v === "string")
251
+ return v.trim() !== "";
252
+ if (typeof v === "number")
253
+ return Number.isFinite(v);
254
+ if (typeof v === "boolean")
255
+ return v === true;
256
+ return false;
257
+ }
258
+ /**
259
+ * Parse `payload` as a JSON object, returning its fields if (and only if) the
260
+ * whole payload is a well-formed JSON object literal. This is the ONE
261
+ * definition of "structured branch output": the evidence-gate keys check
262
+ * (`payloadEvidenceKeys`) and the fan-out stage branch runner both parse
263
+ * through this function, so "a branch emitted structured data" means the same
264
+ * thing everywhere. A branch whose payload does not parse as a JSON object
265
+ * (free prose, a bare string, an array, ...) is not structured — callers treat
266
+ * that as a dead/schema-invalid branch rather than guessing at fields.
267
+ */
268
+ export function parseJsonObjectPayload(payload) {
269
+ if (!payload)
270
+ return undefined;
271
+ const trimmed = payload.trim();
272
+ if (!trimmed.startsWith("{"))
273
+ return undefined;
274
+ try {
275
+ const obj = JSON.parse(trimmed);
276
+ if (obj === null || typeof obj !== "object" || Array.isArray(obj)) {
277
+ return undefined;
278
+ }
279
+ return obj;
280
+ }
281
+ catch {
282
+ return undefined;
283
+ }
284
+ }
285
+ /**
286
+ * Evidence keys present in a payload. A key is "present" only when it carries a
287
+ * *machine-checkable* value:
288
+ *
289
+ * - a `key=value` token (the value must immediately follow `=`), or
290
+ * - a top-level key in a JSON object payload with a non-empty scalar value.
291
+ *
292
+ * The `=` (or JSON) requirement is deliberate: a free-prose `key: value` form
293
+ * would let ordinary English that merely mentions a required word satisfy the
294
+ * gate (e.g. "tests: all green, coverage: looks good"), defeating the point of
295
+ * requiring proof. So colon-prose does NOT count — agents must emit structured
296
+ * `key=value` pairs or a JSON object. Matching is case-sensitive on the key.
297
+ */
298
+ export function payloadEvidenceKeys(payload) {
299
+ const present = new Set();
300
+ if (!payload)
301
+ return present;
302
+ // JSON object payloads: top-level keys with a non-empty scalar value.
303
+ const obj = parseJsonObjectPayload(payload);
304
+ if (obj) {
305
+ for (const [k, v] of Object.entries(obj)) {
306
+ if (isEvidenceValue(v))
307
+ present.add(k);
308
+ }
309
+ }
310
+ // Structured `key=value` tokens. The value must immediately follow `=` (no
311
+ // space skip), so a trailing `key=` with no value is absent, and free prose
312
+ // is not matched. Values may be quoted.
313
+ const re = /([A-Za-z_][\w.-]*)=("[^"]*"|'[^']*'|[^\s,;]+)/g;
314
+ let m = re.exec(payload);
315
+ while (m !== null) {
316
+ const value = m[2].replace(/^["']|["']$/g, "").trim();
317
+ if (value !== "")
318
+ present.add(m[1]);
319
+ m = re.exec(payload);
320
+ }
321
+ return present;
322
+ }
323
+ /** Required evidence keys absent from the payload, in declaration order. */
324
+ export function missingEvidence(requires, payload) {
325
+ const present = payloadEvidenceKeys(payload);
326
+ return requires.filter((key) => !present.has(key));
327
+ }
86
328
  export function invalidEvent(emittedTopic, allowedEvents, parallelEnabled, completionEvent) {
87
329
  if (!emittedTopic)
88
330
  return false;
@@ -150,9 +392,25 @@ export function routingTopic(topic) {
150
392
  "review.finish",
151
393
  "backend.start",
152
394
  "backend.finish",
395
+ // Telemetry/observability emits, NOT routing. Without these the per-iteration
396
+ // `backend.usage` (and any `hook.output`) would clobber the routing position every
397
+ // cycle, collapsing topology backpressure to all-roles freedom after iteration 1 —
398
+ // letting the agent self-route and skip required intermediate steps.
399
+ "backend.usage",
400
+ "hook.output",
401
+ "hook.suspend",
153
402
  "event.invalid",
154
403
  "operator.guidance",
155
404
  "operator.guidance.consumed",
405
+ // Human-in-the-loop topics are not routing: a `human.ask` pause must not
406
+ // move the routing position, or the iteration after an ask would have an
407
+ // empty allowed-event set (no topology transition) and the agent would be
408
+ // unconstrained for that cycle. The ask.* topics are harness-written with
409
+ // fixed names; `human.ask` is the default ask event.
410
+ "human.ask",
411
+ "ask.pending",
412
+ "ask.answered",
413
+ "ask.timeout",
156
414
  "",
157
415
  ]);
158
416
  if (nonRouting.has(topic))
@@ -173,6 +431,8 @@ function emitValidationContext(projectDir, journalFile) {
173
431
  allowedEvents: envCsvList("AUTOLOOP_ALLOWED_EVENTS"),
174
432
  parallelEnabled,
175
433
  completionEvent: compEvent,
434
+ topo,
435
+ askEvent: config.get(cfg, "event_loop.ask_event", "human.ask"),
176
436
  };
177
437
  }
178
438
  function resolveEmitRunId(journalFile) {
@@ -229,6 +489,67 @@ export function resolveEmitJournalFile(projectDir) {
229
489
  return envEvents;
230
490
  return config.resolveJournalFile(projectDir);
231
491
  }
492
+ function rejectEvidenceGate(journalFile, topic, gate, missing, payload, validation) {
493
+ // Journal the typed blocked event with the evidence shortfall + the original
494
+ // summary, so an observer (and the next iteration's prompt) sees why it was
495
+ // blocked and what is still needed.
496
+ appendEvent(journalFile, validation.runId, validation.iteration, gate.blocked, jsonField("gated_event", topic) +
497
+ ", " +
498
+ jsonField("missing_evidence", joinCsv(missing)) +
499
+ ", " +
500
+ jsonField("required_evidence", joinCsv(gate.requires)) +
501
+ ", " +
502
+ jsonField("summary", payload));
503
+ return {
504
+ ok: false,
505
+ topic,
506
+ error: "`" +
507
+ topic +
508
+ "` requires evidence " +
509
+ listText(gate.requires) +
510
+ "; missing: " +
511
+ listText(missing) +
512
+ ". Emitted `" +
513
+ gate.blocked +
514
+ "` instead. Include the evidence in the payload (e.g. `key=value`) and emit `" +
515
+ topic +
516
+ "` again.",
517
+ };
518
+ }
519
+ function rejectTypedEvidenceGate(journalFile, topic, gate, shortfalls, payload, validation) {
520
+ const target = classifyGateOutcome(shortfalls, gate);
521
+ const missingKeys = shortfalls
522
+ .filter((s) => s.reason === "missing")
523
+ .map((s) => s.key);
524
+ const thresholdShortfalls = shortfalls.filter((s) => s.reason === "threshold" || s.reason === "status");
525
+ const evidenceTypes = joinCsv(Array.from(new Set(shortfalls.map((s) => s.type))));
526
+ const requiredEvidence = joinCsv(gate.evidence.map((e) => e.key));
527
+ const fields = [
528
+ jsonField("gated_event", topic),
529
+ jsonField("missing_evidence", joinCsv(missingKeys)),
530
+ jsonField("evidence_type", evidenceTypes),
531
+ jsonField("required_evidence", requiredEvidence),
532
+ ];
533
+ if (thresholdShortfalls.length > 0) {
534
+ fields.push(jsonField("threshold_failure", joinCsv(thresholdShortfalls.map((s) => `${s.key}:${s.detail}`))));
535
+ }
536
+ fields.push(jsonField("summary", payload));
537
+ appendEvent(journalFile, validation.runId, validation.iteration, target, fields.join(", "));
538
+ const shortfallText = shortfalls
539
+ .map((s) => `${s.key} (${s.reason}: ${s.detail})`)
540
+ .join("; ");
541
+ return {
542
+ ok: false,
543
+ topic,
544
+ error: "`" +
545
+ topic +
546
+ "` failed typed evidence validation: " +
547
+ shortfallText +
548
+ ". Emitted `" +
549
+ target +
550
+ "` instead.",
551
+ };
552
+ }
232
553
  function rejectTaskGate(journalFile, topic, openTasks, validation) {
233
554
  appendEvent(journalFile, validation.runId, validation.iteration, "task.gate", jsonField("blocked_topic", topic) +
234
555
  ", " +
package/dist/emit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,GACT,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,WAAW,GACZ,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,QAAQ,MAAM,kCAAkC,CAAC;AAE7D,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,mBAAmB;IACnB,4BAA4B;CAC7B,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;IACZ,eAAe;IACf,WAAW;IACX,cAAc;IACd,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,KAAK,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,IAAI,KAAK,KAAK,kBAAkB;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,OAAO,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC5C,CAAC;AAQD,MAAM,UAAU,IAAI,CAClB,UAAkB,EAClB,KAAa,EACb,OAAe;IAEf,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACvD,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAElE,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,8DAA8D;IAC9D,IAAI,KAAK,KAAK,UAAU,CAAC,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IACE,YAAY,CACV,KAAK,EACL,UAAU,CAAC,aAAa,EACxB,UAAU,CAAC,eAAe,EAC1B,UAAU,CAAC,eAAe,CAC3B,EACD,CAAC;QACD,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,YAAoB,EACpB,aAAuB,EACvB,eAAwB,EACxB,eAAuB;IAEvB,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,2BAA2B,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,IAAI,aAAa,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,OAAO,8BAA8B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,yBAAyB,CAC/B,YAAY,EACZ,aAAa,EACb,eAAe,CAChB,CAAC;IACJ,CAAC;IAED,OAAO,8BAA8B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,8BAA8B,CACrC,YAAoB,EACpB,aAAuB;IAEvB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,yBAAyB,CAChC,YAAoB,EACpB,aAAuB,EACvB,eAAuB;IAEvB,IAAI,YAAY,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,SAAS,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,SAAS,KAAK,eAAe;QAAE,OAAO,KAAK,CAAC;IAChD,IACE,iBAAiB,CAAC,SAAS,CAAC;QAC5B,eAAe,CAAC,SAAS,CAAC;QAC1B,aAAa,CAAC,SAAS,CAAC;QAExB,OAAO,KAAK,CAAC;IACf,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,GAAG,KAAK,SAAS,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,IAAI,KAAK,KAAK,yBAAyB;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,IAAI,KAAK,KAAK,yBAAyB;QAAE,OAAO,YAAY,CAAC;IAC7D,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;QACzB,iBAAiB;QACjB,kBAAkB;QAClB,eAAe;QACf,WAAW;QACX,cAAc;QACd,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,eAAe;QACf,mBAAmB;QACnB,4BAA4B;QAC5B,EAAE;KACH,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAYD,SAAS,qBAAqB,CAC5B,UAAkB,EAClB,WAAmB;IAEnB,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CACxC,IAAI,EACJ,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,6BAA6B,EAAE,eAAe,CAAC,CAChE,CAAC;IACF,MAAM,eAAe,GAAG,aAAa,CACnC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAC7C,CAAC;IAEF,OAAO;QACL,KAAK;QACL,SAAS,EAAE,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC;QACnD,WAAW,EAAE,eAAe,EAAE;QAC9B,YAAY,EAAE,UAAU,CAAC,wBAAwB,CAAC;QAClD,aAAa,EAAE,UAAU,CAAC,yBAAyB,CAAC;QACpD,eAAe;QACf,eAAe,EAAE,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC7C,OAAO,QAAQ,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAmB,EAAE,KAAa;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,OAAO,QAAQ,IAAI,qBAAqB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,YAAY,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,UAAU,CACjB,WAAmB,EACnB,KAAa,EACb,OAAe,EACf,UAA0B;IAE1B,gBAAgB,CACd,WAAW,EACX,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,SAAS,EACpB,KAAK,EACL,OAAO,CACR,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CACjB,WAAmB,EACnB,KAAa,EACb,UAA0B;IAE1B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACtD,kBAAkB,CAChB,WAAW,EACX,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,WAAW,EACtB,KAAK,EACL,UAAU,CAAC,YAAY,EACvB,UAAU,CAAC,aAAa,CACzB,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,UAA0B;IACnE,OAAO,CACL,iBAAiB;QACjB,KAAK;QACL,oBAAoB;QACpB,UAAU,CAAC,WAAW;QACtB,sBAAsB;QACtB,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC;QACjC,yBAAyB;QACzB,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAmB,EACnB,KAAa,EACb,SAAiB,EACjB,WAAmB,EACnB,YAAoB,EACpB,YAAsB,EACtB,aAAuB;IAEvB,WAAW,CACT,WAAW,EACX,KAAK,EACL,SAAS,EACT,eAAe,EACf,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC;QACpC,IAAI;QACJ,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC;QAClC,IAAI;QACJ,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI;QACJ,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACrD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACnD,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CACrB,WAAmB,EACnB,KAAa,EACb,SAAsB,EACtB,UAA0B;IAE1B,WAAW,CACT,WAAW,EACX,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,SAAS,EACpB,WAAW,EACX,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC;QAC/B,IAAI;QACJ,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAChE,CAAC;IAEF,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,oBAAoB,SAAS,CAAC,MAAM,wBAAwB,SAAS,oDAAoD,KAAK,GAAG,CAAC;IAClJ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"}
package/dist/events.d.ts CHANGED
@@ -1,7 +1,19 @@
1
+ import type { StopReason } from "./types.js";
1
2
  export type LoopEvent = {
2
3
  type: "log";
3
4
  level: string;
4
5
  message: string;
6
+ } | {
7
+ type: "loop.start";
8
+ runId: string;
9
+ prompt: string;
10
+ workDir: string;
11
+ projectDir: string;
12
+ preset: string;
13
+ backend: string;
14
+ maxIterations: number;
15
+ completionEvent: string;
16
+ completionPromise: string;
5
17
  } | {
6
18
  type: "iteration.start";
7
19
  iteration: number;
@@ -10,8 +22,9 @@ export type LoopEvent = {
10
22
  } | {
11
23
  type: "loop.finish";
12
24
  iterations: number;
13
- stopReason: string;
25
+ stopReason: StopReason;
14
26
  runId: string;
27
+ costUsd: number;
15
28
  } | {
16
29
  type: "iteration.banner";
17
30
  iteration: number;
@@ -35,6 +48,18 @@ export type LoopEvent = {
35
48
  } | {
36
49
  type: "review.banner";
37
50
  iteration: number;
51
+ } | {
52
+ type: "ask.pending";
53
+ runId: string;
54
+ iteration: number;
55
+ questionId: string;
56
+ question: string;
57
+ } | {
58
+ type: "ask.answered";
59
+ runId: string;
60
+ iteration: number;
61
+ questionId: string;
62
+ answer: string;
38
63
  } | {
39
64
  type: "backend.output";
40
65
  output: string;
@@ -42,12 +67,20 @@ export type LoopEvent = {
42
67
  } | {
43
68
  type: "failure.diagnostic";
44
69
  output: string;
45
- stopReason: string;
70
+ stopReason: StopReason;
71
+ } | {
72
+ type: "policy.file_modification_violation";
73
+ runId: string;
74
+ iteration: number;
75
+ role: string;
76
+ files: string[];
77
+ reason: "disallowed_tools" | "read_only";
46
78
  } | {
47
79
  type: "summary";
48
80
  runId: string;
49
81
  iterations: number;
50
- stopReason: string;
82
+ stopReason: StopReason;
83
+ costUsd: number;
51
84
  journalFile: string;
52
85
  memoryFile: string;
53
86
  reviewEvery: number;
@@ -0,0 +1,25 @@
1
+ import { type BranchResult, type FanoutStage, type StageOutcome } from "@mobrienv/autoloop-core/fanout";
2
+ /** One branch to run: which role/prompt, with which objective, at which index. */
3
+ export interface BranchSpec {
4
+ branchId: string;
5
+ stageId: string;
6
+ /** The role this branch runs (for K-identical) or the distinct sub-role. */
7
+ role: string;
8
+ /** Per-branch objective/lens (distinct panels vary this). */
9
+ objective: string;
10
+ index: number;
11
+ }
12
+ /**
13
+ * Expand a stage into branch specs. A K-identical panel (`role` + `branches`)
14
+ * produces N copies of the same role; an N-distinct panel (`roles`) produces one
15
+ * branch per sub-role. Distinct wins when both are set.
16
+ */
17
+ export declare function expandStageBranches(stage: FanoutStage): BranchSpec[];
18
+ export type BranchRunner = (spec: BranchSpec) => Promise<BranchResult>;
19
+ /**
20
+ * Run a fan-out stage: expand branches, execute up to `concurrency` at once,
21
+ * convert a thrown/rejected branch into a dead branch (so one failure never
22
+ * sinks the wave), then reduce to a routing decision. `reduceStage` applies the
23
+ * branch schema, quorum, and vote/dedup.
24
+ */
25
+ export declare function runFanoutStage(stage: FanoutStage, runBranch: BranchRunner, concurrency: number): Promise<StageOutcome>;
@@ -0,0 +1,54 @@
1
+ // Fan-out stage orchestrator.
2
+ //
3
+ // Expands a FanoutStage into its branch specs, runs them concurrency-bounded
4
+ // (run-wide semaphore via mapLimit), isolates per-branch failure to a dead
5
+ // branch, and reduces the results with reduceStage. The actual branch executor
6
+ // (`runBranch`) is INJECTED: the orchestration here is pure and deterministically
7
+ // testable, while the real executor — spawning a backend CLI subprocess per
8
+ // branch — is a single seam wired into the iteration loop separately.
9
+ import { mapLimit } from "@mobrienv/autoloop-core/concurrency";
10
+ import { reduceStage, } from "@mobrienv/autoloop-core/fanout";
11
+ /**
12
+ * Expand a stage into branch specs. A K-identical panel (`role` + `branches`)
13
+ * produces N copies of the same role; an N-distinct panel (`roles`) produces one
14
+ * branch per sub-role. Distinct wins when both are set.
15
+ */
16
+ export function expandStageBranches(stage) {
17
+ if (stage.roles.length > 0) {
18
+ return stage.roles.map((role, index) => ({
19
+ branchId: `${stage.id}.${index}`,
20
+ stageId: stage.id,
21
+ role,
22
+ objective: role,
23
+ index,
24
+ }));
25
+ }
26
+ const n = Math.max(0, stage.branches);
27
+ return Array.from({ length: n }, (_, index) => ({
28
+ branchId: `${stage.id}.${index}`,
29
+ stageId: stage.id,
30
+ role: stage.role,
31
+ objective: stage.role,
32
+ index,
33
+ }));
34
+ }
35
+ /**
36
+ * Run a fan-out stage: expand branches, execute up to `concurrency` at once,
37
+ * convert a thrown/rejected branch into a dead branch (so one failure never
38
+ * sinks the wave), then reduce to a routing decision. `reduceStage` applies the
39
+ * branch schema, quorum, and vote/dedup.
40
+ */
41
+ export async function runFanoutStage(stage, runBranch, concurrency) {
42
+ const specs = expandStageBranches(stage);
43
+ const results = await mapLimit(specs, concurrency, async (spec) => {
44
+ try {
45
+ return await runBranch(spec);
46
+ }
47
+ catch (err) {
48
+ const msg = err instanceof Error ? err.message : String(err);
49
+ return { branchId: spec.branchId, ok: false, error: msg };
50
+ }
51
+ });
52
+ return reduceStage(stage, results);
53
+ }
54
+ //# sourceMappingURL=fanout-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fanout-runner.js","sourceRoot":"","sources":["../src/fanout-runner.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,kFAAkF;AAClF,4EAA4E;AAC5E,sEAAsE;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAGL,WAAW,GAEZ,MAAM,gCAAgC,CAAC;AAaxC;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACvC,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE;YAChC,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,IAAI;YACJ,SAAS,EAAE,IAAI;YACf,KAAK;SACN,CAAC,CAAC,CAAC;IACN,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE;QAChC,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,KAAK;KACN,CAAC,CAAC,CAAC;AACN,CAAC;AAID;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAkB,EAClB,SAAuB,EACvB,WAAmB;IAEnB,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { IterationContext } from "./prompt.js";
2
+ import type { LoopContext } from "./types.js";
3
+ export type FileModViolationReason = "disallowed_tools" | "read_only";
4
+ export interface FileModViolation {
5
+ role: string;
6
+ files: string[];
7
+ reason: FileModViolationReason;
8
+ }
9
+ export interface FileModAuditResult {
10
+ ran: boolean;
11
+ violated: boolean;
12
+ violations: FileModViolation[];
13
+ }
14
+ /**
15
+ * Ralph-parity emit-boundary audit (opt-in via `event_loop.audit_file_mods`).
16
+ * Compares the working tree against HEAD after every iteration; if the
17
+ * single acting role (`iter.allowedRoles[0]`, the same convention used for
18
+ * per-role backend overrides) declares `disallowedTools`/`readOnly` and
19
+ * files changed during the iteration, journals + emits a typed
20
+ * `policy.file_modification_violation` event carrying the role and file
21
+ * list. Purely observational: the harness itself never stops or rejects
22
+ * completion on this result — it exists for parent orchestrators to react to.
23
+ *
24
+ * No-ops (returns `{ ran: false, ... }`) when the policy is disabled, and
25
+ * `{ ran: true, violated: false, ... }` outside a git work tree, when no
26
+ * files changed, when the acting role is ambiguous/unknown, or when the
27
+ * acting role has no file-mutation restriction.
28
+ */
29
+ export declare function runFileModAudit(loop: LoopContext, iter: IterationContext, iteration: number): FileModAuditResult;