@revisium/orchestrator 0.1.0-alpha.9 → 0.2.0-alpha.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 (249) hide show
  1. package/README.md +210 -146
  2. package/control-plane/bootstrap.config.json +43 -1
  3. package/control-plane/default-playbook/catalog/pipelines.json +1157 -10
  4. package/control-plane/default-playbook/catalog/roles.json +54 -0
  5. package/control-plane/default-playbook/package.json +1 -1
  6. package/control-plane/default-playbook/prompts/developer.md +1 -0
  7. package/control-plane/default-playbook/prompts/triager.md +3 -0
  8. package/dist/api/graphql-api/graphql-ws/pubsub.module.js +0 -1
  9. package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -1
  10. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js +0 -1
  11. package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js.map +1 -1
  12. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +0 -1
  13. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -1
  14. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -0
  15. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
  16. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
  17. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
  18. package/dist/api/graphql-api/pr/model/pr-readiness.model.js +26 -0
  19. package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -1
  20. package/dist/api/graphql-api/runs/inputs/create-run.input.js +6 -0
  21. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
  22. package/dist/api/graphql-api/runs/model/run.model.js +6 -0
  23. package/dist/api/graphql-api/runs/model/run.model.js.map +1 -1
  24. package/dist/api/graphql-api/share/model/issue-ref.model.js +53 -0
  25. package/dist/api/graphql-api/share/model/issue-ref.model.js.map +1 -0
  26. package/dist/cli/commands/doctor-report.js +0 -18
  27. package/dist/cli/commands/doctor-report.js.map +1 -1
  28. package/dist/cli/commands/lifecycle.js +3 -71
  29. package/dist/cli/commands/lifecycle.js.map +1 -1
  30. package/dist/cli/commands/mcp.js +0 -14
  31. package/dist/cli/commands/mcp.js.map +1 -1
  32. package/dist/cli/commands/process-tree.js +4 -26
  33. package/dist/cli/commands/process-tree.js.map +1 -1
  34. package/dist/cli/commands/revisium-helpers.js +0 -6
  35. package/dist/cli/commands/revisium-helpers.js.map +1 -1
  36. package/dist/cli/commands/rogue-reaper.js +0 -34
  37. package/dist/cli/commands/rogue-reaper.js.map +1 -1
  38. package/dist/cli/index.js +0 -4
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/program.js +0 -5
  41. package/dist/cli/program.js.map +1 -1
  42. package/dist/config.js +0 -25
  43. package/dist/config.js.map +1 -1
  44. package/dist/control-plane/bootstrap.js +12 -27
  45. package/dist/control-plane/bootstrap.js.map +1 -1
  46. package/dist/control-plane/change-notifications.js +0 -1
  47. package/dist/control-plane/change-notifications.js.map +1 -1
  48. package/dist/control-plane/client-transport.js +1 -12
  49. package/dist/control-plane/client-transport.js.map +1 -1
  50. package/dist/control-plane/default-playbook-policy.js +593 -0
  51. package/dist/control-plane/default-playbook-policy.js.map +1 -0
  52. package/dist/control-plane/definitions.js +8 -17
  53. package/dist/control-plane/definitions.js.map +1 -1
  54. package/dist/control-plane/inbox.js +2 -120
  55. package/dist/control-plane/inbox.js.map +1 -1
  56. package/dist/control-plane/resolve-cwd.js +0 -61
  57. package/dist/control-plane/resolve-cwd.js.map +1 -1
  58. package/dist/control-plane/schema-migration.js +0 -9
  59. package/dist/control-plane/schema-migration.js.map +1 -1
  60. package/dist/control-plane/seed-default-playbook.js +50 -46
  61. package/dist/control-plane/seed-default-playbook.js.map +1 -1
  62. package/dist/control-plane/steps.js +0 -15
  63. package/dist/control-plane/steps.js.map +1 -1
  64. package/dist/e2e/kit/agents.js +15 -21
  65. package/dist/e2e/kit/agents.js.map +1 -1
  66. package/dist/e2e/kit/assertions.js +12 -8
  67. package/dist/e2e/kit/assertions.js.map +1 -1
  68. package/dist/e2e/kit/fake-integrator.js +11 -2
  69. package/dist/e2e/kit/fake-integrator.js.map +1 -1
  70. package/dist/e2e/kit/git-target-repo.js +1 -1
  71. package/dist/engine/dbos.service.js +12 -179
  72. package/dist/engine/dbos.service.js.map +1 -1
  73. package/dist/engine/ensure-postgres.js +0 -48
  74. package/dist/engine/ensure-postgres.js.map +1 -1
  75. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
  76. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
  77. package/dist/features/runs/queries/handlers/runs-query.handlers.js +1 -0
  78. package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -1
  79. package/dist/host/daemon.js +2 -21
  80. package/dist/host/daemon.js.map +1 -1
  81. package/dist/host/dbos-identity.js +0 -31
  82. package/dist/host/dbos-identity.js.map +1 -1
  83. package/dist/host/ensure-host.js +1 -37
  84. package/dist/host/ensure-host.js.map +1 -1
  85. package/dist/host/ensure-revisium.js +1 -135
  86. package/dist/host/ensure-revisium.js.map +1 -1
  87. package/dist/host/host-runtime.js +0 -28
  88. package/dist/host/host-runtime.js.map +1 -1
  89. package/dist/host/host.lifecycle.js +0 -27
  90. package/dist/host/host.lifecycle.js.map +1 -1
  91. package/dist/host/queue-ownership.js +0 -42
  92. package/dist/host/queue-ownership.js.map +1 -1
  93. package/dist/host/queue-poller-census.js +1 -28
  94. package/dist/host/queue-poller-census.js.map +1 -1
  95. package/dist/http/graphql-host.module.js +0 -3
  96. package/dist/http/graphql-host.module.js.map +1 -1
  97. package/dist/mcp/mcp-capabilities.js +23 -5
  98. package/dist/mcp/mcp-capabilities.js.map +1 -1
  99. package/dist/mcp/mcp-facade.service.js +335 -22
  100. package/dist/mcp/mcp-facade.service.js.map +1 -1
  101. package/dist/mcp/mcp-http.service.js +0 -18
  102. package/dist/mcp/mcp-http.service.js.map +1 -1
  103. package/dist/mcp/mcp-tools.js +41 -36
  104. package/dist/mcp/mcp-tools.js.map +1 -1
  105. package/dist/observability/activity-signal.js +103 -0
  106. package/dist/observability/activity-signal.js.map +1 -0
  107. package/dist/observability/agent-activity-reporter.js +0 -4
  108. package/dist/observability/agent-activity-reporter.js.map +1 -1
  109. package/dist/observability/index.js +1 -0
  110. package/dist/observability/index.js.map +1 -1
  111. package/dist/pipeline/await-human.js +0 -40
  112. package/dist/pipeline/await-human.js.map +1 -1
  113. package/dist/pipeline/data-driven-task.workflow.js +563 -251
  114. package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
  115. package/dist/pipeline/data-driven-template.js +0 -25
  116. package/dist/pipeline/data-driven-template.js.map +1 -1
  117. package/dist/pipeline/pipeline.module.js +0 -12
  118. package/dist/pipeline/pipeline.module.js.map +1 -1
  119. package/dist/pipeline/pipeline.service.js +194 -189
  120. package/dist/pipeline/pipeline.service.js.map +1 -1
  121. package/dist/pipeline/route-contract.js +4 -3
  122. package/dist/pipeline/route-contract.js.map +1 -1
  123. package/dist/pipeline-core/index.js +1 -13
  124. package/dist/pipeline-core/index.js.map +1 -1
  125. package/dist/pipeline-core/interpret.js +21 -94
  126. package/dist/pipeline-core/interpret.js.map +1 -1
  127. package/dist/pipeline-core/kit/assertions.js +0 -19
  128. package/dist/pipeline-core/kit/assertions.js.map +1 -1
  129. package/dist/pipeline-core/kit/builders.js +1 -21
  130. package/dist/pipeline-core/kit/builders.js.map +1 -1
  131. package/dist/pipeline-core/kit/drive.js +1 -31
  132. package/dist/pipeline-core/kit/drive.js.map +1 -1
  133. package/dist/pipeline-core/kit/fixtures.js +78 -101
  134. package/dist/pipeline-core/kit/fixtures.js.map +1 -1
  135. package/dist/pipeline-core/kit/index.js +0 -8
  136. package/dist/pipeline-core/kit/index.js.map +1 -1
  137. package/dist/pipeline-core/types.js +13 -52
  138. package/dist/pipeline-core/types.js.map +1 -1
  139. package/dist/pipeline-core/validate-capability.js +0 -3
  140. package/dist/pipeline-core/validate-capability.js.map +1 -1
  141. package/dist/pipeline-core/validate-conflicts.js +0 -9
  142. package/dist/pipeline-core/validate-conflicts.js.map +1 -1
  143. package/dist/pipeline-core/validate-dataflow.js +0 -17
  144. package/dist/pipeline-core/validate-dataflow.js.map +1 -1
  145. package/dist/pipeline-core/validate-diff.js +3 -36
  146. package/dist/pipeline-core/validate-diff.js.map +1 -1
  147. package/dist/pipeline-core/validate-edges.js +0 -6
  148. package/dist/pipeline-core/validate-edges.js.map +1 -1
  149. package/dist/pipeline-core/validate-graph.js +0 -11
  150. package/dist/pipeline-core/validate-graph.js.map +1 -1
  151. package/dist/pipeline-core/validate-loops.js +37 -44
  152. package/dist/pipeline-core/validate-loops.js.map +1 -1
  153. package/dist/pipeline-core/validate-parallel.js +9 -15
  154. package/dist/pipeline-core/validate-parallel.js.map +1 -1
  155. package/dist/pipeline-core/validate-sink.js +0 -7
  156. package/dist/pipeline-core/validate-sink.js.map +1 -1
  157. package/dist/pipeline-core/validate-topology.js +1 -20
  158. package/dist/pipeline-core/validate-topology.js.map +1 -1
  159. package/dist/pipeline-core/validate-verdict.js +52 -7
  160. package/dist/pipeline-core/validate-verdict.js.map +1 -1
  161. package/dist/pipeline-core/validate.js +5 -29
  162. package/dist/pipeline-core/validate.js.map +1 -1
  163. package/dist/playbook/catalog-loader.js +8 -3
  164. package/dist/playbook/catalog-loader.js.map +1 -1
  165. package/dist/playbook/import-mapper.js +4 -5
  166. package/dist/playbook/import-mapper.js.map +1 -1
  167. package/dist/poller/pr-readiness-core.js +226 -29
  168. package/dist/poller/pr-readiness-core.js.map +1 -1
  169. package/dist/revisium/inbox.service.js +0 -24
  170. package/dist/revisium/inbox.service.js.map +1 -1
  171. package/dist/revisium/playbooks.service.js +15 -2
  172. package/dist/revisium/playbooks.service.js.map +1 -1
  173. package/dist/revisium/revisium.module.js +0 -12
  174. package/dist/revisium/revisium.module.js.map +1 -1
  175. package/dist/revisium/roles.service.js +0 -6
  176. package/dist/revisium/roles.service.js.map +1 -1
  177. package/dist/revisium/run.service.js +2 -75
  178. package/dist/revisium/run.service.js.map +1 -1
  179. package/dist/revisium/tokens.js +0 -4
  180. package/dist/revisium/tokens.js.map +1 -1
  181. package/dist/run/append-event.js +6 -37
  182. package/dist/run/append-event.js.map +1 -1
  183. package/dist/run/block-run.js.map +1 -1
  184. package/dist/run/cancel-run.js +0 -33
  185. package/dist/run/cancel-run.js.map +1 -1
  186. package/dist/run/complete-run.js.map +1 -1
  187. package/dist/run/create-run.js +5 -8
  188. package/dist/run/create-run.js.map +1 -1
  189. package/dist/run/fail-run.js +0 -3
  190. package/dist/run/fail-run.js.map +1 -1
  191. package/dist/run/inspect-run.js +10 -29
  192. package/dist/run/inspect-run.js.map +1 -1
  193. package/dist/run/issue-ref.js +88 -0
  194. package/dist/run/issue-ref.js.map +1 -0
  195. package/dist/run/run-outputs.js +0 -19
  196. package/dist/run/run-outputs.js.map +1 -1
  197. package/dist/run/terminal-run-status.js +0 -12
  198. package/dist/run/terminal-run-status.js.map +1 -1
  199. package/dist/runners/claude-code.service.js +2 -13
  200. package/dist/runners/claude-code.service.js.map +1 -1
  201. package/dist/runners/codex.service.js +2 -11
  202. package/dist/runners/codex.service.js.map +1 -1
  203. package/dist/runners/gh-identity.js +0 -52
  204. package/dist/runners/gh-identity.js.map +1 -1
  205. package/dist/runners/integrator-branch-naming.js +16 -19
  206. package/dist/runners/integrator-branch-naming.js.map +1 -1
  207. package/dist/runners/integrator-git.js +0 -25
  208. package/dist/runners/integrator-git.js.map +1 -1
  209. package/dist/runners/integrator-remote.js +0 -2
  210. package/dist/runners/integrator-remote.js.map +1 -1
  211. package/dist/runners/integrator-types.js +0 -7
  212. package/dist/runners/integrator-types.js.map +1 -1
  213. package/dist/runners/integrator.js +231 -230
  214. package/dist/runners/integrator.js.map +1 -1
  215. package/dist/runners/runner.module.js +0 -6
  216. package/dist/runners/runner.module.js.map +1 -1
  217. package/dist/runners/tokens.js +0 -4
  218. package/dist/runners/tokens.js.map +1 -1
  219. package/dist/runners/worktree.service.js +3 -19
  220. package/dist/runners/worktree.service.js.map +1 -1
  221. package/dist/task-control-plane/pr-readiness.service.js +15 -13
  222. package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
  223. package/dist/task-control-plane/run-watch.service.js +170 -63
  224. package/dist/task-control-plane/run-watch.service.js.map +1 -1
  225. package/dist/task-control-plane/task-control-plane-api.service.js +285 -40
  226. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  227. package/dist/worker/artifact-store.js +21 -3
  228. package/dist/worker/artifact-store.js.map +1 -1
  229. package/dist/worker/build-context.js +10 -10
  230. package/dist/worker/build-context.js.map +1 -1
  231. package/dist/worker/claude-code-runner.js +76 -48
  232. package/dist/worker/claude-code-runner.js.map +1 -1
  233. package/dist/worker/codex-runner.js +128 -35
  234. package/dist/worker/codex-runner.js.map +1 -1
  235. package/dist/worker/git-worktree-manager.js +20 -67
  236. package/dist/worker/git-worktree-manager.js.map +1 -1
  237. package/dist/worker/process-executor.js +144 -27
  238. package/dist/worker/process-executor.js.map +1 -1
  239. package/dist/worker/result-envelope.js +33 -49
  240. package/dist/worker/result-envelope.js.map +1 -1
  241. package/dist/worker/runner-common.js +29 -0
  242. package/dist/worker/runner-common.js.map +1 -1
  243. package/dist/worker/runner-dispatch.js +0 -3
  244. package/dist/worker/runner-dispatch.js.map +1 -1
  245. package/dist/worker/runner.js +16 -1
  246. package/dist/worker/runner.js.map +1 -1
  247. package/dist/worker/stub-runner.js +0 -7
  248. package/dist/worker/stub-runner.js.map +1 -1
  249. package/package.json +2 -2
@@ -42,7 +42,8 @@
42
42
  "ci_changes",
43
43
  "fix",
44
44
  "wontfix",
45
- "question"
45
+ "question",
46
+ "recheck"
46
47
  ]
47
48
  },
48
49
  "nodes": {
@@ -173,7 +174,10 @@
173
174
  "node": "analyst",
174
175
  "as": "plan"
175
176
  }
176
- ]
177
+ ],
178
+ "produces": {
179
+ "name": "change"
180
+ }
177
181
  },
178
182
  "codeReview": {
179
183
  "id": "codeReview",
@@ -181,7 +185,19 @@
181
185
  "roleRef": "role:reviewer",
182
186
  "next": "codeReviewRouter",
183
187
  "onFailure": "abort",
184
- "resultSchema": "schema:reviewVerdict"
188
+ "resultSchema": "schema:reviewVerdict",
189
+ "consumes": [
190
+ {
191
+ "node": "developer",
192
+ "as": "developerChange",
193
+ "staleOk": true
194
+ },
195
+ {
196
+ "node": "reworkDeveloper",
197
+ "as": "reworkChange",
198
+ "optional": true
199
+ }
200
+ ]
185
201
  },
186
202
  "codeReviewRouter": {
187
203
  "id": "codeReviewRouter",
@@ -242,8 +258,8 @@
242
258
  }
243
259
  ],
244
260
  "gatedArtifact": {
245
- "node": "analyst",
246
- "as": "plan"
261
+ "node": "reworkDeveloper",
262
+ "as": "change"
247
263
  }
248
264
  },
249
265
  "reworkDeveloper": {
@@ -255,7 +271,10 @@
255
271
  "resultSchema": "schema:change",
256
272
  "incrementCounters": [
257
273
  "codeReviewLoop"
258
- ]
274
+ ],
275
+ "produces": {
276
+ "name": "change"
277
+ }
259
278
  },
260
279
  "integrator": {
261
280
  "id": "integrator",
@@ -273,14 +292,33 @@
273
292
  }
274
293
  ],
275
294
  "onFailure": "route",
276
- "resultSchema": "schema:integration"
295
+ "resultSchema": "schema:integration",
296
+ "consumes": [
297
+ {
298
+ "node": "developer",
299
+ "as": "developerChange",
300
+ "staleOk": true
301
+ },
302
+ {
303
+ "node": "reworkDeveloper",
304
+ "as": "reworkChange",
305
+ "optional": true
306
+ },
307
+ {
308
+ "node": "ciRework",
309
+ "as": "ciChange",
310
+ "optional": true,
311
+ "staleOk": true
312
+ }
313
+ ]
277
314
  },
278
315
  "mergeGate": {
279
316
  "id": "mergeGate",
280
317
  "kind": "humanGate",
281
318
  "reason": "merge-review",
282
319
  "outcomes": [
283
- "approved"
320
+ "approved",
321
+ "recheck"
284
322
  ],
285
323
  "branches": [
286
324
  {
@@ -290,20 +328,88 @@
290
328
  },
291
329
  "goto": "confirmMerge"
292
330
  },
331
+ {
332
+ "when": {
333
+ "op": "verdict.eq",
334
+ "value": "recheck"
335
+ },
336
+ "goto": "mergeRecheck"
337
+ },
293
338
  {
294
339
  "default": "blockedEnd"
295
340
  }
296
341
  ],
297
342
  "gatedArtifact": {
298
- "node": "pollPr",
343
+ "node": "mergeReadiness",
299
344
  "as": "prFeedback"
300
345
  }
301
346
  },
347
+ "mergeRecheck": {
348
+ "id": "mergeRecheck",
349
+ "kind": "script",
350
+ "scriptRef": "script:pollPr",
351
+ "next": "mergeRecheckRouter",
352
+ "onFailure": "route",
353
+ "resultSchema": "schema:prFeedback",
354
+ "produces": {
355
+ "name": "prFeedback"
356
+ },
357
+ "catch": [
358
+ {
359
+ "onError": "revo.ScriptBlocked",
360
+ "goto": "blockedEnd"
361
+ },
362
+ {
363
+ "onError": "revo.ScriptFailed",
364
+ "goto": "failedEnd"
365
+ }
366
+ ]
367
+ },
368
+ "mergeRecheckRouter": {
369
+ "id": "mergeRecheckRouter",
370
+ "kind": "choice",
371
+ "branches": [
372
+ {
373
+ "when": {
374
+ "op": "verdict.eq",
375
+ "value": "clean"
376
+ },
377
+ "goto": "blockedEnd"
378
+ },
379
+ {
380
+ "when": {
381
+ "op": "verdict.eq",
382
+ "value": "review_changes"
383
+ },
384
+ "goto": "triage"
385
+ },
386
+ {
387
+ "when": {
388
+ "op": "all",
389
+ "of": [
390
+ {
391
+ "op": "verdict.eq",
392
+ "value": "ci_changes"
393
+ },
394
+ {
395
+ "op": "counter.lt",
396
+ "scope": "ciLoop",
397
+ "value": 3
398
+ }
399
+ ]
400
+ },
401
+ "goto": "ciRework"
402
+ },
403
+ {
404
+ "default": "blockedEnd"
405
+ }
406
+ ]
407
+ },
302
408
  "confirmMerge": {
303
409
  "id": "confirmMerge",
304
410
  "kind": "script",
305
411
  "scriptRef": "script:confirmMerge",
306
- "next": "mergedEnd",
412
+ "next": "cleanupWorktree",
307
413
  "catch": [
308
414
  {
309
415
  "onError": "revo.ScriptBlocked",
@@ -315,6 +421,19 @@
315
421
  }
316
422
  ],
317
423
  "onFailure": "route",
424
+ "resultSchema": "schema:integration",
425
+ "consumes": [
426
+ {
427
+ "node": "mergeReadiness",
428
+ "as": "mergeReadiness"
429
+ }
430
+ ]
431
+ },
432
+ "cleanupWorktree": {
433
+ "id": "cleanupWorktree",
434
+ "kind": "script",
435
+ "scriptRef": "script:cleanupWorktree",
436
+ "next": "mergedEnd",
318
437
  "resultSchema": "schema:integration"
319
438
  },
320
439
  "mergedEnd": {
@@ -356,6 +475,67 @@
356
475
  "prRouter": {
357
476
  "id": "prRouter",
358
477
  "kind": "choice",
478
+ "branches": [
479
+ {
480
+ "when": {
481
+ "op": "verdict.eq",
482
+ "value": "clean"
483
+ },
484
+ "goto": "mergeReadiness"
485
+ },
486
+ {
487
+ "when": {
488
+ "op": "verdict.eq",
489
+ "value": "review_changes"
490
+ },
491
+ "goto": "triage"
492
+ },
493
+ {
494
+ "when": {
495
+ "op": "all",
496
+ "of": [
497
+ {
498
+ "op": "verdict.eq",
499
+ "value": "ci_changes"
500
+ },
501
+ {
502
+ "op": "counter.lt",
503
+ "scope": "ciLoop",
504
+ "value": 3
505
+ }
506
+ ]
507
+ },
508
+ "goto": "ciRework"
509
+ },
510
+ {
511
+ "default": "blockedEnd"
512
+ }
513
+ ]
514
+ },
515
+ "mergeReadiness": {
516
+ "id": "mergeReadiness",
517
+ "kind": "script",
518
+ "scriptRef": "script:pollPr",
519
+ "next": "mergeReadinessRouter",
520
+ "onFailure": "route",
521
+ "resultSchema": "schema:prFeedback",
522
+ "produces": {
523
+ "name": "prFeedback"
524
+ },
525
+ "catch": [
526
+ {
527
+ "onError": "revo.ScriptBlocked",
528
+ "goto": "blockedEnd"
529
+ },
530
+ {
531
+ "onError": "revo.ScriptFailed",
532
+ "goto": "failedEnd"
533
+ }
534
+ ]
535
+ },
536
+ "mergeReadinessRouter": {
537
+ "id": "mergeReadinessRouter",
538
+ "kind": "choice",
359
539
  "branches": [
360
540
  {
361
541
  "when": {
@@ -403,10 +583,25 @@
403
583
  "incrementCounters": [
404
584
  "ciLoop"
405
585
  ],
586
+ "produces": {
587
+ "name": "change"
588
+ },
406
589
  "consumes": [
407
590
  {
408
591
  "node": "pollPr",
409
592
  "as": "feedback"
593
+ },
594
+ {
595
+ "node": "mergeReadiness",
596
+ "as": "mergeFeedback",
597
+ "optional": true,
598
+ "staleOk": true
599
+ },
600
+ {
601
+ "node": "mergeRecheck",
602
+ "as": "recheckFeedback",
603
+ "optional": true,
604
+ "staleOk": true
410
605
  }
411
606
  ]
412
607
  },
@@ -429,6 +624,18 @@
429
624
  {
430
625
  "node": "pollPr",
431
626
  "as": "feedback"
627
+ },
628
+ {
629
+ "node": "mergeReadiness",
630
+ "as": "mergeFeedback",
631
+ "optional": true,
632
+ "staleOk": true
633
+ },
634
+ {
635
+ "node": "mergeRecheck",
636
+ "as": "recheckFeedback",
637
+ "optional": true,
638
+ "staleOk": true
432
639
  }
433
640
  ]
434
641
  },
@@ -520,6 +727,9 @@
520
727
  "incrementCounters": [
521
728
  "reviewLoop"
522
729
  ],
730
+ "produces": {
731
+ "name": "change"
732
+ },
523
733
  "consumes": [
524
734
  {
525
735
  "node": "triage",
@@ -534,6 +744,12 @@
534
744
  "next": "respondThreads",
535
745
  "onFailure": "route",
536
746
  "resultSchema": "schema:integration",
747
+ "consumes": [
748
+ {
749
+ "node": "reviewRework",
750
+ "as": "reviewChange"
751
+ }
752
+ ],
537
753
  "catch": [
538
754
  {
539
755
  "onError": "revo.ScriptBlocked",
@@ -605,6 +821,937 @@
605
821
  }
606
822
  }
607
823
  },
824
+ {
825
+ "id": "feature-development-codex-consensus",
826
+ "path": "prompts/orchestrator.md",
827
+ "triggers": [
828
+ "codex feature",
829
+ "codex consensus feature",
830
+ "codex task-to-PR work"
831
+ ],
832
+ "required_roles": [
833
+ "orchestrator-codex",
834
+ "analyst-codex",
835
+ "reviewer-codex",
836
+ "triager-codex",
837
+ "developer-codex",
838
+ "integrator",
839
+ "watcher-codex"
840
+ ],
841
+ "alternative_roles": [],
842
+ "optional_roles": [],
843
+ "route_gates": [
844
+ "task spec approval",
845
+ "merge approval"
846
+ ],
847
+ "platform_invocation": "canonical-only",
848
+ "execution_policy": {
849
+ "raw": [
850
+ "Built-in Codex default: same feature-development control flow, but Codex-bound plan/development roles and parallel reviewer consensus for plan + code review.",
851
+ "analyst-codex -> reviewer-codex[plan fanout x2] -> developer-codex -> reviewer-codex[code fanout x2] (bounded rework, cap 3) -> integrator(script) -> watcher-codex[post-integrator] -> merge gate."
852
+ ],
853
+ "template_json": {
854
+ "specVersion": "1.0",
855
+ "pipelineId": "feature-development-codex-consensus",
856
+ "entry": "analyst",
857
+ "verdicts": {
858
+ "domain": [
859
+ "approved",
860
+ "clean",
861
+ "blocker",
862
+ "changes_requested",
863
+ "review_changes",
864
+ "ci_changes",
865
+ "fix",
866
+ "wontfix",
867
+ "question",
868
+ "recheck"
869
+ ]
870
+ },
871
+ "nodes": {
872
+ "analyst": {
873
+ "id": "analyst",
874
+ "kind": "agent",
875
+ "roleRef": "role:analyst-codex",
876
+ "next": "planReviewFanout",
877
+ "onFailure": "abort",
878
+ "resultSchema": "schema:plan",
879
+ "produces": {
880
+ "name": "plan"
881
+ }
882
+ },
883
+ "planReviewRouter": {
884
+ "id": "planReviewRouter",
885
+ "kind": "choice",
886
+ "branches": [
887
+ {
888
+ "when": {
889
+ "op": "verdict.in",
890
+ "value": [
891
+ "approved",
892
+ "clean"
893
+ ]
894
+ },
895
+ "goto": "planGate"
896
+ },
897
+ {
898
+ "when": {
899
+ "op": "all",
900
+ "of": [
901
+ {
902
+ "op": "verdict.in",
903
+ "value": [
904
+ "blocker",
905
+ "changes_requested"
906
+ ]
907
+ },
908
+ {
909
+ "op": "counter.lt",
910
+ "scope": "planReviewLoop",
911
+ "value": 4
912
+ }
913
+ ]
914
+ },
915
+ "goto": "analyst"
916
+ },
917
+ {
918
+ "default": "planStuckGate"
919
+ }
920
+ ],
921
+ "incrementCounters": [
922
+ "planReviewLoop"
923
+ ]
924
+ },
925
+ "planStuckGate": {
926
+ "id": "planStuckGate",
927
+ "kind": "humanGate",
928
+ "reason": "plan-stuck",
929
+ "outcomes": [
930
+ "approved"
931
+ ],
932
+ "branches": [
933
+ {
934
+ "when": {
935
+ "op": "verdict.eq",
936
+ "value": "approved"
937
+ },
938
+ "goto": "developer"
939
+ },
940
+ {
941
+ "default": "blockedEnd"
942
+ }
943
+ ],
944
+ "gatedArtifact": {
945
+ "node": "analyst",
946
+ "as": "plan"
947
+ }
948
+ },
949
+ "planGate": {
950
+ "id": "planGate",
951
+ "kind": "humanGate",
952
+ "reason": "plan-review",
953
+ "outcomes": [
954
+ "approved"
955
+ ],
956
+ "branches": [
957
+ {
958
+ "when": {
959
+ "op": "verdict.eq",
960
+ "value": "approved"
961
+ },
962
+ "goto": "developer"
963
+ },
964
+ {
965
+ "default": "blockedEnd"
966
+ }
967
+ ],
968
+ "gatedArtifact": {
969
+ "node": "analyst",
970
+ "as": "plan"
971
+ }
972
+ },
973
+ "developer": {
974
+ "id": "developer",
975
+ "kind": "agent",
976
+ "roleRef": "role:developer-codex",
977
+ "next": "codeReviewFanout",
978
+ "onFailure": "abort",
979
+ "resultSchema": "schema:change",
980
+ "consumes": [
981
+ {
982
+ "node": "analyst",
983
+ "as": "plan"
984
+ }
985
+ ],
986
+ "produces": {
987
+ "name": "change"
988
+ }
989
+ },
990
+ "codeReviewRouter": {
991
+ "id": "codeReviewRouter",
992
+ "kind": "choice",
993
+ "branches": [
994
+ {
995
+ "when": {
996
+ "op": "verdict.in",
997
+ "value": [
998
+ "approved",
999
+ "clean"
1000
+ ]
1001
+ },
1002
+ "goto": "integrator"
1003
+ },
1004
+ {
1005
+ "when": {
1006
+ "op": "all",
1007
+ "of": [
1008
+ {
1009
+ "op": "verdict.in",
1010
+ "value": [
1011
+ "blocker",
1012
+ "changes_requested"
1013
+ ]
1014
+ },
1015
+ {
1016
+ "op": "counter.lt",
1017
+ "scope": "codeReviewLoop",
1018
+ "value": 4
1019
+ }
1020
+ ]
1021
+ },
1022
+ "goto": "reworkDeveloper"
1023
+ },
1024
+ {
1025
+ "default": "codeStuckGate"
1026
+ }
1027
+ ],
1028
+ "incrementCounters": [
1029
+ "codeReviewLoop"
1030
+ ]
1031
+ },
1032
+ "codeStuckGate": {
1033
+ "id": "codeStuckGate",
1034
+ "kind": "humanGate",
1035
+ "reason": "code-review-stuck",
1036
+ "outcomes": [
1037
+ "approved"
1038
+ ],
1039
+ "branches": [
1040
+ {
1041
+ "when": {
1042
+ "op": "verdict.eq",
1043
+ "value": "approved"
1044
+ },
1045
+ "goto": "integrator"
1046
+ },
1047
+ {
1048
+ "default": "blockedEnd"
1049
+ }
1050
+ ],
1051
+ "gatedArtifact": {
1052
+ "node": "reworkDeveloper",
1053
+ "as": "change"
1054
+ }
1055
+ },
1056
+ "reworkDeveloper": {
1057
+ "id": "reworkDeveloper",
1058
+ "kind": "agent",
1059
+ "roleRef": "role:developer-codex",
1060
+ "next": "codeReviewFanout",
1061
+ "onFailure": "abort",
1062
+ "resultSchema": "schema:change",
1063
+ "produces": {
1064
+ "name": "change"
1065
+ }
1066
+ },
1067
+ "integrator": {
1068
+ "id": "integrator",
1069
+ "kind": "script",
1070
+ "scriptRef": "script:integrator",
1071
+ "next": "pollPr",
1072
+ "catch": [
1073
+ {
1074
+ "onError": "revo.ScriptBlocked",
1075
+ "goto": "blockedEnd"
1076
+ },
1077
+ {
1078
+ "onError": "revo.ScriptFailed",
1079
+ "goto": "failedEnd"
1080
+ }
1081
+ ],
1082
+ "onFailure": "route",
1083
+ "resultSchema": "schema:integration",
1084
+ "consumes": [
1085
+ {
1086
+ "node": "developer",
1087
+ "as": "developerChange",
1088
+ "staleOk": true
1089
+ },
1090
+ {
1091
+ "node": "reworkDeveloper",
1092
+ "as": "reworkChange",
1093
+ "optional": true
1094
+ },
1095
+ {
1096
+ "node": "ciRework",
1097
+ "as": "ciChange",
1098
+ "optional": true,
1099
+ "staleOk": true
1100
+ }
1101
+ ]
1102
+ },
1103
+ "mergeGate": {
1104
+ "id": "mergeGate",
1105
+ "kind": "humanGate",
1106
+ "reason": "merge-review",
1107
+ "outcomes": [
1108
+ "approved",
1109
+ "recheck"
1110
+ ],
1111
+ "branches": [
1112
+ {
1113
+ "when": {
1114
+ "op": "verdict.eq",
1115
+ "value": "approved"
1116
+ },
1117
+ "goto": "confirmMerge"
1118
+ },
1119
+ {
1120
+ "when": {
1121
+ "op": "verdict.eq",
1122
+ "value": "recheck"
1123
+ },
1124
+ "goto": "mergeRecheck"
1125
+ },
1126
+ {
1127
+ "default": "blockedEnd"
1128
+ }
1129
+ ],
1130
+ "gatedArtifact": {
1131
+ "node": "mergeReadiness",
1132
+ "as": "prFeedback"
1133
+ }
1134
+ },
1135
+ "mergeRecheck": {
1136
+ "id": "mergeRecheck",
1137
+ "kind": "script",
1138
+ "scriptRef": "script:pollPr",
1139
+ "next": "mergeRecheckRouter",
1140
+ "onFailure": "route",
1141
+ "resultSchema": "schema:prFeedback",
1142
+ "produces": {
1143
+ "name": "prFeedback"
1144
+ },
1145
+ "catch": [
1146
+ {
1147
+ "onError": "revo.ScriptBlocked",
1148
+ "goto": "blockedEnd"
1149
+ },
1150
+ {
1151
+ "onError": "revo.ScriptFailed",
1152
+ "goto": "failedEnd"
1153
+ }
1154
+ ]
1155
+ },
1156
+ "mergeRecheckRouter": {
1157
+ "id": "mergeRecheckRouter",
1158
+ "kind": "choice",
1159
+ "branches": [
1160
+ {
1161
+ "when": {
1162
+ "op": "verdict.eq",
1163
+ "value": "clean"
1164
+ },
1165
+ "goto": "blockedEnd"
1166
+ },
1167
+ {
1168
+ "when": {
1169
+ "op": "verdict.eq",
1170
+ "value": "review_changes"
1171
+ },
1172
+ "goto": "triage"
1173
+ },
1174
+ {
1175
+ "when": {
1176
+ "op": "all",
1177
+ "of": [
1178
+ {
1179
+ "op": "verdict.eq",
1180
+ "value": "ci_changes"
1181
+ },
1182
+ {
1183
+ "op": "counter.lt",
1184
+ "scope": "ciLoop",
1185
+ "value": 3
1186
+ }
1187
+ ]
1188
+ },
1189
+ "goto": "ciRework"
1190
+ },
1191
+ {
1192
+ "default": "blockedEnd"
1193
+ }
1194
+ ]
1195
+ },
1196
+ "confirmMerge": {
1197
+ "id": "confirmMerge",
1198
+ "kind": "script",
1199
+ "scriptRef": "script:confirmMerge",
1200
+ "next": "mergedEnd",
1201
+ "catch": [
1202
+ {
1203
+ "onError": "revo.ScriptBlocked",
1204
+ "goto": "blockedEnd"
1205
+ },
1206
+ {
1207
+ "onError": "revo.ScriptFailed",
1208
+ "goto": "failedEnd"
1209
+ }
1210
+ ],
1211
+ "onFailure": "route",
1212
+ "resultSchema": "schema:integration",
1213
+ "consumes": [
1214
+ {
1215
+ "node": "mergeReadiness",
1216
+ "as": "mergeReadiness"
1217
+ }
1218
+ ]
1219
+ },
1220
+ "mergedEnd": {
1221
+ "id": "mergedEnd",
1222
+ "kind": "terminal",
1223
+ "status": "succeeded"
1224
+ },
1225
+ "failedEnd": {
1226
+ "id": "failedEnd",
1227
+ "kind": "terminal",
1228
+ "status": "failed"
1229
+ },
1230
+ "blockedEnd": {
1231
+ "id": "blockedEnd",
1232
+ "kind": "terminal",
1233
+ "status": "blocked"
1234
+ },
1235
+ "pollPr": {
1236
+ "id": "pollPr",
1237
+ "kind": "script",
1238
+ "scriptRef": "script:pollPr",
1239
+ "next": "prRouter",
1240
+ "onFailure": "route",
1241
+ "resultSchema": "schema:prFeedback",
1242
+ "produces": {
1243
+ "name": "prFeedback"
1244
+ },
1245
+ "catch": [
1246
+ {
1247
+ "onError": "revo.ScriptBlocked",
1248
+ "goto": "blockedEnd"
1249
+ },
1250
+ {
1251
+ "onError": "revo.ScriptFailed",
1252
+ "goto": "failedEnd"
1253
+ }
1254
+ ]
1255
+ },
1256
+ "prRouter": {
1257
+ "id": "prRouter",
1258
+ "kind": "choice",
1259
+ "branches": [
1260
+ {
1261
+ "when": {
1262
+ "op": "verdict.eq",
1263
+ "value": "clean"
1264
+ },
1265
+ "goto": "mergeReadiness"
1266
+ },
1267
+ {
1268
+ "when": {
1269
+ "op": "verdict.eq",
1270
+ "value": "review_changes"
1271
+ },
1272
+ "goto": "triage"
1273
+ },
1274
+ {
1275
+ "when": {
1276
+ "op": "all",
1277
+ "of": [
1278
+ {
1279
+ "op": "verdict.eq",
1280
+ "value": "ci_changes"
1281
+ },
1282
+ {
1283
+ "op": "counter.lt",
1284
+ "scope": "ciLoop",
1285
+ "value": 3
1286
+ }
1287
+ ]
1288
+ },
1289
+ "goto": "ciRework"
1290
+ },
1291
+ {
1292
+ "default": "blockedEnd"
1293
+ }
1294
+ ]
1295
+ },
1296
+ "mergeReadiness": {
1297
+ "id": "mergeReadiness",
1298
+ "kind": "script",
1299
+ "scriptRef": "script:pollPr",
1300
+ "next": "mergeReadinessRouter",
1301
+ "onFailure": "route",
1302
+ "resultSchema": "schema:prFeedback",
1303
+ "produces": {
1304
+ "name": "prFeedback"
1305
+ },
1306
+ "catch": [
1307
+ {
1308
+ "onError": "revo.ScriptBlocked",
1309
+ "goto": "blockedEnd"
1310
+ },
1311
+ {
1312
+ "onError": "revo.ScriptFailed",
1313
+ "goto": "failedEnd"
1314
+ }
1315
+ ]
1316
+ },
1317
+ "mergeReadinessRouter": {
1318
+ "id": "mergeReadinessRouter",
1319
+ "kind": "choice",
1320
+ "branches": [
1321
+ {
1322
+ "when": {
1323
+ "op": "verdict.eq",
1324
+ "value": "clean"
1325
+ },
1326
+ "goto": "mergeGate"
1327
+ },
1328
+ {
1329
+ "when": {
1330
+ "op": "verdict.eq",
1331
+ "value": "review_changes"
1332
+ },
1333
+ "goto": "triage"
1334
+ },
1335
+ {
1336
+ "when": {
1337
+ "op": "all",
1338
+ "of": [
1339
+ {
1340
+ "op": "verdict.eq",
1341
+ "value": "ci_changes"
1342
+ },
1343
+ {
1344
+ "op": "counter.lt",
1345
+ "scope": "ciLoop",
1346
+ "value": 3
1347
+ }
1348
+ ]
1349
+ },
1350
+ "goto": "ciRework"
1351
+ },
1352
+ {
1353
+ "default": "blockedEnd"
1354
+ }
1355
+ ]
1356
+ },
1357
+ "ciRework": {
1358
+ "id": "ciRework",
1359
+ "kind": "agent",
1360
+ "roleRef": "role:developer-codex",
1361
+ "next": "integrator",
1362
+ "onFailure": "abort",
1363
+ "resultSchema": "schema:change",
1364
+ "incrementCounters": [
1365
+ "ciLoop"
1366
+ ],
1367
+ "produces": {
1368
+ "name": "change"
1369
+ },
1370
+ "consumes": [
1371
+ {
1372
+ "node": "pollPr",
1373
+ "as": "feedback"
1374
+ },
1375
+ {
1376
+ "node": "mergeReadiness",
1377
+ "as": "mergeFeedback",
1378
+ "optional": true,
1379
+ "staleOk": true
1380
+ },
1381
+ {
1382
+ "node": "mergeRecheck",
1383
+ "as": "recheckFeedback",
1384
+ "optional": true,
1385
+ "staleOk": true
1386
+ }
1387
+ ]
1388
+ },
1389
+ "triage": {
1390
+ "id": "triage",
1391
+ "kind": "agent",
1392
+ "roleRef": "role:triager-codex",
1393
+ "next": "triageRouter",
1394
+ "onFailure": "abort",
1395
+ "resultSchema": "schema:triage",
1396
+ "produces": {
1397
+ "name": "triage"
1398
+ },
1399
+ "consumes": [
1400
+ {
1401
+ "node": "analyst",
1402
+ "as": "plan",
1403
+ "staleOk": true
1404
+ },
1405
+ {
1406
+ "node": "pollPr",
1407
+ "as": "feedback"
1408
+ },
1409
+ {
1410
+ "node": "mergeReadiness",
1411
+ "as": "mergeFeedback",
1412
+ "optional": true,
1413
+ "staleOk": true
1414
+ },
1415
+ {
1416
+ "node": "mergeRecheck",
1417
+ "as": "recheckFeedback",
1418
+ "optional": true,
1419
+ "staleOk": true
1420
+ }
1421
+ ]
1422
+ },
1423
+ "triageRouter": {
1424
+ "id": "triageRouter",
1425
+ "kind": "choice",
1426
+ "branches": [
1427
+ {
1428
+ "when": {
1429
+ "op": "all",
1430
+ "of": [
1431
+ {
1432
+ "op": "verdict.eq",
1433
+ "value": "question"
1434
+ },
1435
+ {
1436
+ "op": "counter.lt",
1437
+ "scope": "questionLoop",
1438
+ "value": 3
1439
+ }
1440
+ ]
1441
+ },
1442
+ "goto": "questionGate"
1443
+ },
1444
+ {
1445
+ "when": {
1446
+ "op": "all",
1447
+ "of": [
1448
+ {
1449
+ "op": "verdict.eq",
1450
+ "value": "fix"
1451
+ },
1452
+ {
1453
+ "op": "counter.lt",
1454
+ "scope": "reviewLoop",
1455
+ "value": 3
1456
+ }
1457
+ ]
1458
+ },
1459
+ "goto": "reviewRework"
1460
+ },
1461
+ {
1462
+ "when": {
1463
+ "op": "verdict.eq",
1464
+ "value": "wontfix"
1465
+ },
1466
+ "goto": "respondThreads"
1467
+ },
1468
+ {
1469
+ "default": "blockedEnd"
1470
+ }
1471
+ ]
1472
+ },
1473
+ "questionGate": {
1474
+ "id": "questionGate",
1475
+ "kind": "humanGate",
1476
+ "reason": "review-question",
1477
+ "outcomes": [
1478
+ "approved",
1479
+ "changes_requested"
1480
+ ],
1481
+ "incrementCounters": [
1482
+ "questionLoop"
1483
+ ],
1484
+ "branches": [
1485
+ {
1486
+ "when": {
1487
+ "op": "verdict.eq",
1488
+ "value": "approved"
1489
+ },
1490
+ "goto": "triage"
1491
+ },
1492
+ {
1493
+ "default": "blockedEnd"
1494
+ }
1495
+ ],
1496
+ "gatedArtifact": {
1497
+ "node": "triage",
1498
+ "as": "triage"
1499
+ }
1500
+ },
1501
+ "reviewRework": {
1502
+ "id": "reviewRework",
1503
+ "kind": "agent",
1504
+ "roleRef": "role:developer-codex",
1505
+ "next": "reviewIntegrator",
1506
+ "onFailure": "abort",
1507
+ "resultSchema": "schema:change",
1508
+ "incrementCounters": [
1509
+ "reviewLoop"
1510
+ ],
1511
+ "produces": {
1512
+ "name": "change"
1513
+ },
1514
+ "consumes": [
1515
+ {
1516
+ "node": "triage",
1517
+ "as": "triage"
1518
+ }
1519
+ ]
1520
+ },
1521
+ "reviewIntegrator": {
1522
+ "id": "reviewIntegrator",
1523
+ "kind": "script",
1524
+ "scriptRef": "script:integrator",
1525
+ "next": "respondThreads",
1526
+ "onFailure": "route",
1527
+ "resultSchema": "schema:integration",
1528
+ "consumes": [
1529
+ {
1530
+ "node": "reviewRework",
1531
+ "as": "reviewChange"
1532
+ }
1533
+ ],
1534
+ "catch": [
1535
+ {
1536
+ "onError": "revo.ScriptBlocked",
1537
+ "goto": "blockedEnd"
1538
+ },
1539
+ {
1540
+ "onError": "revo.ScriptFailed",
1541
+ "goto": "failedEnd"
1542
+ }
1543
+ ]
1544
+ },
1545
+ "respondThreads": {
1546
+ "id": "respondThreads",
1547
+ "kind": "script",
1548
+ "scriptRef": "script:respondThreads",
1549
+ "next": "pollPr",
1550
+ "onFailure": "route",
1551
+ "resultSchema": "schema:respond",
1552
+ "consumes": [
1553
+ {
1554
+ "node": "triage",
1555
+ "as": "triage"
1556
+ }
1557
+ ],
1558
+ "catch": [
1559
+ {
1560
+ "onError": "revo.ScriptBlocked",
1561
+ "goto": "blockedEnd"
1562
+ },
1563
+ {
1564
+ "onError": "revo.ScriptFailed",
1565
+ "goto": "failedEnd"
1566
+ }
1567
+ ]
1568
+ },
1569
+ "planReviewFanout": {
1570
+ "id": "planReviewFanout",
1571
+ "kind": "parallel",
1572
+ "branches": [
1573
+ {
1574
+ "id": "primary",
1575
+ "entry": "planReviewPrimary"
1576
+ },
1577
+ {
1578
+ "id": "secondary",
1579
+ "entry": "planReviewSecondary"
1580
+ }
1581
+ ],
1582
+ "join": "planReviewJoin"
1583
+ },
1584
+ "planReviewPrimary": {
1585
+ "id": "planReviewPrimary",
1586
+ "kind": "agent",
1587
+ "roleRef": "role:reviewer-codex",
1588
+ "next": "planReviewJoin",
1589
+ "onFailure": "abort",
1590
+ "resultSchema": "schema:reviewVerdict",
1591
+ "consumes": [
1592
+ {
1593
+ "node": "analyst",
1594
+ "as": "plan"
1595
+ }
1596
+ ],
1597
+ "produces": {
1598
+ "name": "review"
1599
+ }
1600
+ },
1601
+ "planReviewSecondary": {
1602
+ "id": "planReviewSecondary",
1603
+ "kind": "agent",
1604
+ "roleRef": "role:reviewer-codex",
1605
+ "next": "planReviewJoin",
1606
+ "onFailure": "abort",
1607
+ "resultSchema": "schema:reviewVerdict",
1608
+ "consumes": [
1609
+ {
1610
+ "node": "analyst",
1611
+ "as": "plan"
1612
+ }
1613
+ ],
1614
+ "produces": {
1615
+ "name": "review"
1616
+ }
1617
+ },
1618
+ "planReviewJoin": {
1619
+ "id": "planReviewJoin",
1620
+ "kind": "join",
1621
+ "joinMode": {
1622
+ "kind": "all"
1623
+ },
1624
+ "verdictReducer": {
1625
+ "kind": "allIn",
1626
+ "pass": [
1627
+ "approved",
1628
+ "clean"
1629
+ ],
1630
+ "passVerdict": "approved",
1631
+ "failVerdict": "changes_requested"
1632
+ },
1633
+ "merge": {
1634
+ "reviews": "appendByBranchOrder"
1635
+ },
1636
+ "next": "planReviewRouter"
1637
+ },
1638
+ "codeReviewFanout": {
1639
+ "id": "codeReviewFanout",
1640
+ "kind": "parallel",
1641
+ "branches": [
1642
+ {
1643
+ "id": "primary",
1644
+ "entry": "codeReviewPrimary"
1645
+ },
1646
+ {
1647
+ "id": "secondary",
1648
+ "entry": "codeReviewSecondary"
1649
+ }
1650
+ ],
1651
+ "join": "codeReviewJoin"
1652
+ },
1653
+ "codeReviewPrimary": {
1654
+ "id": "codeReviewPrimary",
1655
+ "kind": "agent",
1656
+ "roleRef": "role:reviewer-codex",
1657
+ "next": "codeReviewJoin",
1658
+ "onFailure": "abort",
1659
+ "resultSchema": "schema:reviewVerdict",
1660
+ "consumes": [
1661
+ {
1662
+ "node": "developer",
1663
+ "as": "developerChange",
1664
+ "staleOk": true
1665
+ },
1666
+ {
1667
+ "node": "reworkDeveloper",
1668
+ "as": "reworkChange",
1669
+ "optional": true
1670
+ }
1671
+ ],
1672
+ "produces": {
1673
+ "name": "review"
1674
+ }
1675
+ },
1676
+ "codeReviewSecondary": {
1677
+ "id": "codeReviewSecondary",
1678
+ "kind": "agent",
1679
+ "roleRef": "role:reviewer-codex",
1680
+ "next": "codeReviewJoin",
1681
+ "onFailure": "abort",
1682
+ "resultSchema": "schema:reviewVerdict",
1683
+ "consumes": [
1684
+ {
1685
+ "node": "developer",
1686
+ "as": "developerChange",
1687
+ "staleOk": true
1688
+ },
1689
+ {
1690
+ "node": "reworkDeveloper",
1691
+ "as": "reworkChange",
1692
+ "optional": true
1693
+ }
1694
+ ],
1695
+ "produces": {
1696
+ "name": "review"
1697
+ }
1698
+ },
1699
+ "codeReviewJoin": {
1700
+ "id": "codeReviewJoin",
1701
+ "kind": "join",
1702
+ "joinMode": {
1703
+ "kind": "all"
1704
+ },
1705
+ "verdictReducer": {
1706
+ "kind": "allIn",
1707
+ "pass": [
1708
+ "approved",
1709
+ "clean"
1710
+ ],
1711
+ "passVerdict": "approved",
1712
+ "failVerdict": "changes_requested"
1713
+ },
1714
+ "merge": {
1715
+ "reviews": "appendByBranchOrder"
1716
+ },
1717
+ "next": "codeReviewRouter"
1718
+ }
1719
+ },
1720
+ "title": "Codex feature development with parallel review consensus",
1721
+ "policy": {
1722
+ "conflicts": [
1723
+ [
1724
+ "developer-codex",
1725
+ "reviewer-codex"
1726
+ ]
1727
+ ],
1728
+ "enforcement": "strict"
1729
+ },
1730
+ "scopes": {
1731
+ "planReviewLoop": {
1732
+ "cap": 4,
1733
+ "parent": null
1734
+ },
1735
+ "codeReviewLoop": {
1736
+ "cap": 4,
1737
+ "parent": null
1738
+ },
1739
+ "ciLoop": {
1740
+ "cap": 3,
1741
+ "parent": null
1742
+ },
1743
+ "reviewLoop": {
1744
+ "cap": 3,
1745
+ "parent": null
1746
+ },
1747
+ "questionLoop": {
1748
+ "cap": 3,
1749
+ "parent": null
1750
+ }
1751
+ }
1752
+ }
1753
+ }
1754
+ },
608
1755
  {
609
1756
  "id": "local-change",
610
1757
  "path": "prompts/orchestrator.md",