@revisium/orchestrator 0.2.0-alpha.3 → 0.2.0-alpha.4

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 (259) hide show
  1. package/README.md +3 -3
  2. package/control-plane/bootstrap.config.json +104 -550
  3. package/control-plane/default-playbook/catalog/pipelines.json +394 -1122
  4. package/control-plane/default-playbook/catalog/run-profiles.json +208 -0
  5. package/control-plane/default-playbook/package.json +1 -1
  6. package/control-plane/default-playbook/playbook.json +2 -1
  7. package/control-plane/default-playbook/prompts/developer.md +6 -6
  8. package/dist/__generated__/client/browser.js +18 -0
  9. package/dist/__generated__/client/browser.js.map +1 -0
  10. package/dist/__generated__/client/client.js +32 -0
  11. package/dist/__generated__/client/client.js.map +1 -0
  12. package/dist/__generated__/client/commonInputTypes.js +11 -0
  13. package/dist/__generated__/client/commonInputTypes.js.map +1 -0
  14. package/dist/__generated__/client/enums.js +19 -0
  15. package/dist/__generated__/client/enums.js.map +1 -0
  16. package/dist/__generated__/client/internal/class.js +53 -0
  17. package/dist/__generated__/client/internal/class.js.map +1 -0
  18. package/dist/__generated__/client/internal/prismaNamespace.js +451 -0
  19. package/dist/__generated__/client/internal/prismaNamespace.js.map +1 -0
  20. package/dist/__generated__/client/internal/prismaNamespaceBrowser.js +422 -0
  21. package/dist/__generated__/client/internal/prismaNamespaceBrowser.js.map +1 -0
  22. package/dist/__generated__/client/models/Branch.js +2 -0
  23. package/dist/__generated__/client/models/Branch.js.map +1 -0
  24. package/dist/__generated__/client/models/CostLedgerEntry.js +2 -0
  25. package/dist/__generated__/client/models/CostLedgerEntry.js.map +1 -0
  26. package/dist/__generated__/client/models/FileBlob.js +2 -0
  27. package/dist/__generated__/client/models/FileBlob.js.map +1 -0
  28. package/dist/__generated__/client/models/InboxItem.js +2 -0
  29. package/dist/__generated__/client/models/InboxItem.js.map +1 -0
  30. package/dist/__generated__/client/models/ProjectFileUsage.js +2 -0
  31. package/dist/__generated__/client/models/ProjectFileUsage.js.map +1 -0
  32. package/dist/__generated__/client/models/Revision.js +2 -0
  33. package/dist/__generated__/client/models/Revision.js.map +1 -0
  34. package/dist/__generated__/client/models/RevoProject.js +2 -0
  35. package/dist/__generated__/client/models/RevoProject.js.map +1 -0
  36. package/dist/__generated__/client/models/Row.js +2 -0
  37. package/dist/__generated__/client/models/Row.js.map +1 -0
  38. package/dist/__generated__/client/models/RunAttempt.js +2 -0
  39. package/dist/__generated__/client/models/RunAttempt.js.map +1 -0
  40. package/dist/__generated__/client/models/RunEvent.js +2 -0
  41. package/dist/__generated__/client/models/RunEvent.js.map +1 -0
  42. package/dist/__generated__/client/models/RunOutput.js +2 -0
  43. package/dist/__generated__/client/models/RunOutput.js.map +1 -0
  44. package/dist/__generated__/client/models/RunTask.js +2 -0
  45. package/dist/__generated__/client/models/RunTask.js.map +1 -0
  46. package/dist/__generated__/client/models/Table.js +2 -0
  47. package/dist/__generated__/client/models/Table.js.map +1 -0
  48. package/dist/__generated__/client/models/TableMigration.js +2 -0
  49. package/dist/__generated__/client/models/TableMigration.js.map +1 -0
  50. package/dist/__generated__/client/models/TaskRun.js +2 -0
  51. package/dist/__generated__/client/models/TaskRun.js.map +1 -0
  52. package/dist/__generated__/client/models.js +2 -0
  53. package/dist/__generated__/client/models.js.map +1 -0
  54. package/dist/api/graphql-api/graphql-ws/pubsub.module.js +2 -1
  55. package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -1
  56. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +110 -28
  57. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -1
  58. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -1
  59. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
  60. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
  61. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
  62. package/dist/api/graphql-api/registerGraphqlEnums.js +2 -0
  63. package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -1
  64. package/dist/api/graphql-api/runs/inputs/create-run.input.js +17 -0
  65. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
  66. package/dist/api/graphql-api/runs/inputs/execution-profile.input.js +85 -0
  67. package/dist/api/graphql-api/runs/inputs/execution-profile.input.js.map +1 -0
  68. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +11 -0
  69. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -1
  70. package/dist/api/graphql-api/runs/model/run-workflow.model.js +5 -0
  71. package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -1
  72. package/dist/api/graphql-api/share/model/issue-action.model.js +7 -0
  73. package/dist/api/graphql-api/share/model/issue-action.model.js.map +1 -0
  74. package/dist/cli/commands/doctor-report.js +1 -13
  75. package/dist/cli/commands/doctor-report.js.map +1 -1
  76. package/dist/cli/commands/lifecycle.js +50 -65
  77. package/dist/cli/commands/lifecycle.js.map +1 -1
  78. package/dist/cli/commands/{revisium-helpers.js → process-helpers.js} +1 -24
  79. package/dist/cli/commands/process-helpers.js.map +1 -0
  80. package/dist/config.js +17 -55
  81. package/dist/config.js.map +1 -1
  82. package/dist/control-plane/bootstrap-json-validator.js +65 -0
  83. package/dist/control-plane/bootstrap-json-validator.js.map +1 -0
  84. package/dist/control-plane/bootstrap.js +25 -38
  85. package/dist/control-plane/bootstrap.js.map +1 -1
  86. package/dist/control-plane/change-notifications.js +45 -14
  87. package/dist/control-plane/change-notifications.js.map +1 -1
  88. package/dist/control-plane/data-access.js +1 -106
  89. package/dist/control-plane/data-access.js.map +1 -1
  90. package/dist/control-plane/default-playbook-policy.js +497 -94
  91. package/dist/control-plane/default-playbook-policy.js.map +1 -1
  92. package/dist/control-plane/definitions.js +4 -5
  93. package/dist/control-plane/definitions.js.map +1 -1
  94. package/dist/control-plane/engine-transport.js +381 -0
  95. package/dist/control-plane/engine-transport.js.map +1 -0
  96. package/dist/control-plane/inbox.js +15 -7
  97. package/dist/control-plane/inbox.js.map +1 -1
  98. package/dist/control-plane/index.js +0 -1
  99. package/dist/control-plane/index.js.map +1 -1
  100. package/dist/control-plane/merge-override-audit.js +2 -2
  101. package/dist/control-plane/merge-override-audit.js.map +1 -1
  102. package/dist/control-plane/pipeline-coverage-registry.js +478 -0
  103. package/dist/control-plane/pipeline-coverage-registry.js.map +1 -0
  104. package/dist/control-plane/query-types.js +2 -0
  105. package/dist/control-plane/query-types.js.map +1 -0
  106. package/dist/control-plane/run-profiles.js +89 -0
  107. package/dist/control-plane/run-profiles.js.map +1 -0
  108. package/dist/control-plane/schema-migration.js +0 -35
  109. package/dist/control-plane/schema-migration.js.map +1 -1
  110. package/dist/control-plane/seed-default-playbook.js +2 -31
  111. package/dist/control-plane/seed-default-playbook.js.map +1 -1
  112. package/dist/control-plane/tables.js +8 -0
  113. package/dist/control-plane/tables.js.map +1 -1
  114. package/dist/control-plane/transport.js +16 -0
  115. package/dist/control-plane/transport.js.map +1 -0
  116. package/dist/control-plane/versioned-meaning.js +56 -14
  117. package/dist/control-plane/versioned-meaning.js.map +1 -1
  118. package/dist/e2e/kit/agents.js +60 -6
  119. package/dist/e2e/kit/agents.js.map +1 -1
  120. package/dist/e2e/kit/assertions.js +13 -1
  121. package/dist/e2e/kit/assertions.js.map +1 -1
  122. package/dist/e2e/kit/drive.js +46 -11
  123. package/dist/e2e/kit/drive.js.map +1 -1
  124. package/dist/e2e/kit/env.js +17 -1
  125. package/dist/e2e/kit/env.js.map +1 -1
  126. package/dist/e2e/kit/fake-integrator.js +25 -5
  127. package/dist/e2e/kit/fake-integrator.js.map +1 -1
  128. package/dist/e2e/kit/gh-emulator.js +158 -24
  129. package/dist/e2e/kit/gh-emulator.js.map +1 -1
  130. package/dist/e2e/kit/harness.js +44 -10
  131. package/dist/e2e/kit/harness.js.map +1 -1
  132. package/dist/e2e/kit/index.js +1 -0
  133. package/dist/e2e/kit/index.js.map +1 -1
  134. package/dist/e2e/kit/scenario.js +165 -0
  135. package/dist/e2e/kit/scenario.js.map +1 -0
  136. package/dist/e2e/kit/scenarios.js +12 -18
  137. package/dist/e2e/kit/scenarios.js.map +1 -1
  138. package/dist/engine/dbos.service.js +8 -1
  139. package/dist/engine/dbos.service.js.map +1 -1
  140. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
  141. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
  142. package/dist/host/daemon.js +32 -8
  143. package/dist/host/daemon.js.map +1 -1
  144. package/dist/host/ensure-host.js +3 -3
  145. package/dist/host/ensure-host.js.map +1 -1
  146. package/dist/host/host-runtime.js.map +1 -1
  147. package/dist/host/host.lifecycle.js +3 -16
  148. package/dist/host/host.lifecycle.js.map +1 -1
  149. package/dist/http/graphql-host.js +17 -8
  150. package/dist/http/graphql-host.js.map +1 -1
  151. package/dist/mcp/mcp-capabilities.js +3 -2
  152. package/dist/mcp/mcp-capabilities.js.map +1 -1
  153. package/dist/mcp/mcp-facade.service.js +21 -0
  154. package/dist/mcp/mcp-facade.service.js.map +1 -1
  155. package/dist/mcp/mcp-tools.js +35 -1
  156. package/dist/mcp/mcp-tools.js.map +1 -1
  157. package/dist/pipeline/data-driven-task.workflow.js +276 -57
  158. package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
  159. package/dist/pipeline/pipeline.service.js +27 -5
  160. package/dist/pipeline/pipeline.service.js.map +1 -1
  161. package/dist/pipeline/route-contract.js +123 -3
  162. package/dist/pipeline/route-contract.js.map +1 -1
  163. package/dist/pipeline-core/condition-scopes.js +15 -0
  164. package/dist/pipeline-core/condition-scopes.js.map +1 -0
  165. package/dist/pipeline-core/index.js +2 -0
  166. package/dist/pipeline-core/index.js.map +1 -1
  167. package/dist/pipeline-core/kit/fixtures.js +81 -44
  168. package/dist/pipeline-core/kit/fixtures.js.map +1 -1
  169. package/dist/pipeline-core/materialize.js +221 -0
  170. package/dist/pipeline-core/materialize.js.map +1 -0
  171. package/dist/pipeline-core/types.js +5 -0
  172. package/dist/pipeline-core/types.js.map +1 -1
  173. package/dist/pipeline-core/validate-loops.js +2 -15
  174. package/dist/pipeline-core/validate-loops.js.map +1 -1
  175. package/dist/pipeline-core/validate-resilience.js +257 -0
  176. package/dist/pipeline-core/validate-resilience.js.map +1 -0
  177. package/dist/pipeline-core/validate.js +2 -0
  178. package/dist/pipeline-core/validate.js.map +1 -1
  179. package/dist/playbook/catalog-loader.js +39 -2
  180. package/dist/playbook/catalog-loader.js.map +1 -1
  181. package/dist/playbook/catalog-schema-validator.js +438 -0
  182. package/dist/playbook/catalog-schema-validator.js.map +1 -0
  183. package/dist/playbook/import-mapper.js +41 -0
  184. package/dist/playbook/import-mapper.js.map +1 -1
  185. package/dist/playbook/manifest.js +5 -0
  186. package/dist/playbook/manifest.js.map +1 -1
  187. package/dist/playbook/playbook-installer.js +17 -1
  188. package/dist/playbook/playbook-installer.js.map +1 -1
  189. package/dist/poller/pr-readiness-core.js +257 -93
  190. package/dist/poller/pr-readiness-core.js.map +1 -1
  191. package/dist/poller/pr-readiness.js +2 -2
  192. package/dist/poller/pr-readiness.js.map +1 -1
  193. package/dist/revisium/inbox.service.js +8 -8
  194. package/dist/revisium/inbox.service.js.map +1 -1
  195. package/dist/revisium/playbooks.service.js +116 -21
  196. package/dist/revisium/playbooks.service.js.map +1 -1
  197. package/dist/revisium/revisium.module.js +8 -8
  198. package/dist/revisium/revisium.module.js.map +1 -1
  199. package/dist/revisium/roles.service.js +3 -1
  200. package/dist/revisium/roles.service.js.map +1 -1
  201. package/dist/revisium/run.service.js +9 -8
  202. package/dist/revisium/run.service.js.map +1 -1
  203. package/dist/revisium/tokens.js +0 -1
  204. package/dist/revisium/tokens.js.map +1 -1
  205. package/dist/run/create-run.js +1 -1
  206. package/dist/run/create-run.js.map +1 -1
  207. package/dist/run/inspect-run.js +32 -28
  208. package/dist/run/inspect-run.js.map +1 -1
  209. package/dist/run/issue-ref.js +97 -2
  210. package/dist/run/issue-ref.js.map +1 -1
  211. package/dist/run/prisma-runtime-data-access.js +619 -0
  212. package/dist/run/prisma-runtime-data-access.js.map +1 -0
  213. package/dist/run/run-outputs.js +39 -14
  214. package/dist/run/run-outputs.js.map +1 -1
  215. package/dist/run/terminal-run-status.js.map +1 -1
  216. package/dist/runners/integrator.js +657 -56
  217. package/dist/runners/integrator.js.map +1 -1
  218. package/dist/runners/worktree.service.js +10 -8
  219. package/dist/runners/worktree.service.js.map +1 -1
  220. package/dist/schema/ajv-errors.js +15 -0
  221. package/dist/schema/ajv-errors.js.map +1 -0
  222. package/dist/smoke/isolation.js +7 -16
  223. package/dist/smoke/isolation.js.map +1 -1
  224. package/dist/storage/ensure-storage.js +117 -0
  225. package/dist/storage/ensure-storage.js.map +1 -0
  226. package/dist/storage/revo-database.js +39 -0
  227. package/dist/storage/revo-database.js.map +1 -0
  228. package/dist/storage/revo-prisma.service.js +31 -0
  229. package/dist/storage/revo-prisma.service.js.map +1 -0
  230. package/dist/storage/revo-storage.module.js +18 -0
  231. package/dist/storage/revo-storage.module.js.map +1 -0
  232. package/dist/task-control-plane/pr-readiness.service.js +5 -2
  233. package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
  234. package/dist/task-control-plane/run-watch.service.js +3 -6
  235. package/dist/task-control-plane/run-watch.service.js.map +1 -1
  236. package/dist/task-control-plane/task-control-plane-api.service.js +225 -43
  237. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  238. package/dist/testing/runtime-data-access.js +175 -0
  239. package/dist/testing/runtime-data-access.js.map +1 -0
  240. package/dist/worker/build-context.js +178 -2
  241. package/dist/worker/build-context.js.map +1 -1
  242. package/dist/worker/claude-code-runner.js +22 -3
  243. package/dist/worker/claude-code-runner.js.map +1 -1
  244. package/dist/worker/codex-runner.js +6 -1
  245. package/dist/worker/codex-runner.js.map +1 -1
  246. package/package.json +20 -7
  247. package/prisma/migrations/20260707080500_initial_schema/migration.sql +259 -0
  248. package/prisma/migrations/20260707103000_prisma_runtime_tables/migration.sql +235 -0
  249. package/prisma/migrations/migration_lock.toml +3 -0
  250. package/prisma/schema.prisma +339 -0
  251. package/prisma.config.ts +11 -0
  252. package/dist/cli/commands/revisium-helpers.js.map +0 -1
  253. package/dist/control-plane/client-transport.js +0 -168
  254. package/dist/control-plane/client-transport.js.map +0 -1
  255. package/dist/engine/ensure-postgres.js +0 -46
  256. package/dist/engine/ensure-postgres.js.map +0 -1
  257. package/dist/host/ensure-revisium.js +0 -135
  258. package/dist/host/ensure-revisium.js.map +0 -1
  259. package/revisium.config.json +0 -10
@@ -25,7 +25,7 @@
25
25
  "platform_invocation": "canonical-only",
26
26
  "execution_policy": {
27
27
  "raw": [
28
- "Built-in default (slice 5, plan 0015): the pipeline graph is DATA \u2014 see template_json.",
28
+ "Built-in default (slice 5, plan 0015): the pipeline graph is DATA see template_json.",
29
29
  "analyst -> reviewer[plan gate] -> developer -> reviewer[code] (bounded rework, cap 3) -> integrator(script) -> watcher[post-integrator] -> merge gate."
30
30
  ],
31
31
  "template_json": {
@@ -49,7 +49,9 @@
49
49
  "cancel",
50
50
  "address_review_threads",
51
51
  "return_to_development",
52
- "override_merge"
52
+ "override_merge",
53
+ "merged",
54
+ "closed"
53
55
  ]
54
56
  },
55
57
  "nodes": {
@@ -398,11 +400,11 @@
398
400
  "catch": [
399
401
  {
400
402
  "onError": "revo.ScriptBlocked",
401
- "goto": "blockedEnd"
403
+ "goto": "classifyRecovery"
402
404
  },
403
405
  {
404
406
  "onError": "revo.ScriptFailed",
405
- "goto": "failedEnd"
407
+ "goto": "classifyRecovery"
406
408
  }
407
409
  ],
408
410
  "onFailure": "route",
@@ -443,13 +445,16 @@
443
445
  "override_merge",
444
446
  "cancel"
445
447
  ],
448
+ "produces": {
449
+ "name": "gateResolution"
450
+ },
446
451
  "branches": [
447
452
  {
448
453
  "when": {
449
454
  "op": "verdict.eq",
450
455
  "value": "approved"
451
456
  },
452
- "goto": "confirmMerge"
457
+ "goto": "mergeApproveReverify"
453
458
  },
454
459
  {
455
460
  "when": {
@@ -477,7 +482,7 @@
477
482
  "op": "verdict.eq",
478
483
  "value": "override_merge"
479
484
  },
480
- "goto": "confirmMerge"
485
+ "goto": "overrideMerge"
481
486
  },
482
487
  {
483
488
  "when": {
@@ -508,11 +513,11 @@
508
513
  "catch": [
509
514
  {
510
515
  "onError": "revo.ScriptBlocked",
511
- "goto": "blockedEnd"
516
+ "goto": "classifyRecovery"
512
517
  },
513
518
  {
514
519
  "onError": "revo.ScriptFailed",
515
- "goto": "failedEnd"
520
+ "goto": "classifyRecovery"
516
521
  }
517
522
  ]
518
523
  },
@@ -525,7 +530,21 @@
525
530
  "op": "verdict.eq",
526
531
  "value": "clean"
527
532
  },
528
- "goto": "blockedEnd"
533
+ "goto": "mergeGate"
534
+ },
535
+ {
536
+ "when": {
537
+ "op": "verdict.eq",
538
+ "value": "merged"
539
+ },
540
+ "goto": "cleanupWorktree"
541
+ },
542
+ {
543
+ "when": {
544
+ "op": "verdict.eq",
545
+ "value": "closed"
546
+ },
547
+ "goto": "recoveryGate"
529
548
  },
530
549
  {
531
550
  "when": {
@@ -559,7 +578,7 @@
559
578
  "goto": "mergeReadiness"
560
579
  },
561
580
  {
562
- "default": "blockedEnd"
581
+ "default": "recoveryGate"
563
582
  }
564
583
  ]
565
584
  },
@@ -571,18 +590,100 @@
571
590
  "catch": [
572
591
  {
573
592
  "onError": "revo.ScriptBlocked",
574
- "goto": "blockedEnd"
593
+ "goto": "classifyRecovery"
575
594
  },
576
595
  {
577
596
  "onError": "revo.ScriptFailed",
578
- "goto": "failedEnd"
597
+ "goto": "classifyRecovery"
579
598
  }
580
599
  ],
581
600
  "onFailure": "route",
582
601
  "resultSchema": "schema:integration",
583
602
  "consumes": [
584
603
  {
585
- "node": "mergeReadiness",
604
+ "node": "mergeApproveReverify",
605
+ "as": "mergeReadiness"
606
+ }
607
+ ]
608
+ },
609
+ "overrideMerge": {
610
+ "id": "overrideMerge",
611
+ "kind": "script",
612
+ "scriptRef": "script:overrideMerge",
613
+ "next": "overrideMergeRouter",
614
+ "onFailure": "route",
615
+ "resultSchema": "schema:prFeedback",
616
+ "produces": {
617
+ "name": "prFeedback"
618
+ },
619
+ "consumes": [
620
+ {
621
+ "node": "mergeGate",
622
+ "as": "gateResolution",
623
+ "iteration": "latest"
624
+ }
625
+ ],
626
+ "catch": [
627
+ {
628
+ "onError": "revo.ScriptBlocked",
629
+ "goto": "classifyRecovery"
630
+ },
631
+ {
632
+ "onError": "revo.ScriptFailed",
633
+ "goto": "classifyRecovery"
634
+ }
635
+ ]
636
+ },
637
+ "overrideMergeRouter": {
638
+ "id": "overrideMergeRouter",
639
+ "kind": "choice",
640
+ "branches": [
641
+ {
642
+ "when": {
643
+ "op": "verdict.eq",
644
+ "value": "clean"
645
+ },
646
+ "goto": "overrideConfirmMerge"
647
+ },
648
+ {
649
+ "when": {
650
+ "op": "verdict.eq",
651
+ "value": "merged"
652
+ },
653
+ "goto": "cleanupWorktree"
654
+ },
655
+ {
656
+ "when": {
657
+ "op": "verdict.eq",
658
+ "value": "closed"
659
+ },
660
+ "goto": "recoveryGate"
661
+ },
662
+ {
663
+ "default": "classifyRecovery"
664
+ }
665
+ ]
666
+ },
667
+ "overrideConfirmMerge": {
668
+ "id": "overrideConfirmMerge",
669
+ "kind": "script",
670
+ "scriptRef": "script:confirmMerge",
671
+ "next": "cleanupWorktree",
672
+ "catch": [
673
+ {
674
+ "onError": "revo.ScriptBlocked",
675
+ "goto": "classifyRecovery"
676
+ },
677
+ {
678
+ "onError": "revo.ScriptFailed",
679
+ "goto": "classifyRecovery"
680
+ }
681
+ ],
682
+ "onFailure": "route",
683
+ "resultSchema": "schema:integration",
684
+ "consumes": [
685
+ {
686
+ "node": "overrideMerge",
586
687
  "as": "mergeReadiness"
587
688
  }
588
689
  ]
@@ -592,6 +693,16 @@
592
693
  "kind": "script",
593
694
  "scriptRef": "script:cleanupWorktree",
594
695
  "next": "mergedEnd",
696
+ "catch": [
697
+ {
698
+ "onError": "revo.ScriptBlocked",
699
+ "goto": "mergedEnd"
700
+ },
701
+ {
702
+ "onError": "revo.ScriptFailed",
703
+ "goto": "mergedEnd"
704
+ }
705
+ ],
595
706
  "resultSchema": "schema:integration"
596
707
  },
597
708
  "mergedEnd": {
@@ -599,11 +710,6 @@
599
710
  "kind": "terminal",
600
711
  "status": "succeeded"
601
712
  },
602
- "failedEnd": {
603
- "id": "failedEnd",
604
- "kind": "terminal",
605
- "status": "failed"
606
- },
607
713
  "blockedEnd": {
608
714
  "id": "blockedEnd",
609
715
  "kind": "terminal",
@@ -619,14 +725,17 @@
619
725
  "produces": {
620
726
  "name": "prFeedback"
621
727
  },
728
+ "incrementCounters": [
729
+ "pollLoop"
730
+ ],
622
731
  "catch": [
623
732
  {
624
733
  "onError": "revo.ScriptBlocked",
625
- "goto": "blockedEnd"
734
+ "goto": "classifyRecovery"
626
735
  },
627
736
  {
628
737
  "onError": "revo.ScriptFailed",
629
- "goto": "failedEnd"
738
+ "goto": "classifyRecovery"
630
739
  }
631
740
  ]
632
741
  },
@@ -644,7 +753,31 @@
644
753
  {
645
754
  "when": {
646
755
  "op": "verdict.eq",
647
- "value": "recheck"
756
+ "value": "merged"
757
+ },
758
+ "goto": "cleanupWorktree"
759
+ },
760
+ {
761
+ "when": {
762
+ "op": "verdict.eq",
763
+ "value": "closed"
764
+ },
765
+ "goto": "recoveryGate"
766
+ },
767
+ {
768
+ "when": {
769
+ "op": "all",
770
+ "of": [
771
+ {
772
+ "op": "verdict.eq",
773
+ "value": "recheck"
774
+ },
775
+ {
776
+ "op": "counter.lt",
777
+ "scope": "pollLoop",
778
+ "value": 8
779
+ }
780
+ ]
648
781
  },
649
782
  "goto": "pollPr"
650
783
  },
@@ -673,7 +806,7 @@
673
806
  "goto": "ciRework"
674
807
  },
675
808
  {
676
- "default": "blockedEnd"
809
+ "default": "recoveryGate"
677
810
  }
678
811
  ]
679
812
  },
@@ -687,14 +820,17 @@
687
820
  "produces": {
688
821
  "name": "prFeedback"
689
822
  },
823
+ "incrementCounters": [
824
+ "pollLoop"
825
+ ],
690
826
  "catch": [
691
827
  {
692
828
  "onError": "revo.ScriptBlocked",
693
- "goto": "blockedEnd"
829
+ "goto": "classifyRecovery"
694
830
  },
695
831
  {
696
832
  "onError": "revo.ScriptFailed",
697
- "goto": "failedEnd"
833
+ "goto": "classifyRecovery"
698
834
  }
699
835
  ]
700
836
  },
@@ -712,7 +848,31 @@
712
848
  {
713
849
  "when": {
714
850
  "op": "verdict.eq",
715
- "value": "recheck"
851
+ "value": "merged"
852
+ },
853
+ "goto": "cleanupWorktree"
854
+ },
855
+ {
856
+ "when": {
857
+ "op": "verdict.eq",
858
+ "value": "closed"
859
+ },
860
+ "goto": "recoveryGate"
861
+ },
862
+ {
863
+ "when": {
864
+ "op": "all",
865
+ "of": [
866
+ {
867
+ "op": "counter.lt",
868
+ "scope": "pollLoop",
869
+ "value": 8
870
+ },
871
+ {
872
+ "op": "verdict.eq",
873
+ "value": "recheck"
874
+ }
875
+ ]
716
876
  },
717
877
  "goto": "mergeReadiness"
718
878
  },
@@ -741,7 +901,7 @@
741
901
  "goto": "ciRework"
742
902
  },
743
903
  {
744
- "default": "blockedEnd"
904
+ "default": "recoveryGate"
745
905
  }
746
906
  ]
747
907
  },
@@ -857,7 +1017,7 @@
857
1017
  "goto": "respondThreads"
858
1018
  },
859
1019
  {
860
- "default": "blockedEnd"
1020
+ "default": "recoveryGate"
861
1021
  }
862
1022
  ]
863
1023
  },
@@ -866,22 +1026,40 @@
866
1026
  "kind": "humanGate",
867
1027
  "reason": "review-question",
868
1028
  "outcomes": [
869
- "approved",
870
- "changes_requested"
1029
+ "fix",
1030
+ "wontfix",
1031
+ "cancel"
871
1032
  ],
872
1033
  "incrementCounters": [
873
1034
  "questionLoop"
874
1035
  ],
1036
+ "produces": {
1037
+ "name": "gateResolution"
1038
+ },
875
1039
  "branches": [
876
1040
  {
877
1041
  "when": {
878
1042
  "op": "verdict.eq",
879
- "value": "approved"
1043
+ "value": "fix"
880
1044
  },
881
- "goto": "triage"
1045
+ "goto": "questionReviewRework"
882
1046
  },
883
1047
  {
884
- "default": "blockedEnd"
1048
+ "when": {
1049
+ "op": "verdict.eq",
1050
+ "value": "wontfix"
1051
+ },
1052
+ "goto": "respondThreads"
1053
+ },
1054
+ {
1055
+ "when": {
1056
+ "op": "verdict.eq",
1057
+ "value": "cancel"
1058
+ },
1059
+ "goto": "cancelledEnd"
1060
+ },
1061
+ {
1062
+ "default": "recoveryGate"
885
1063
  }
886
1064
  ],
887
1065
  "gatedArtifact": {
@@ -889,6 +1067,54 @@
889
1067
  "as": "triage"
890
1068
  }
891
1069
  },
1070
+ "questionReviewRework": {
1071
+ "id": "questionReviewRework",
1072
+ "kind": "agent",
1073
+ "roleRef": "role:developer",
1074
+ "next": "questionReviewIntegrator",
1075
+ "onFailure": "abort",
1076
+ "resultSchema": "schema:change",
1077
+ "incrementCounters": [
1078
+ "reviewLoop"
1079
+ ],
1080
+ "produces": {
1081
+ "name": "change"
1082
+ },
1083
+ "consumes": [
1084
+ {
1085
+ "node": "triage",
1086
+ "as": "triage"
1087
+ },
1088
+ {
1089
+ "node": "questionGate",
1090
+ "as": "gateResolution"
1091
+ }
1092
+ ]
1093
+ },
1094
+ "questionReviewIntegrator": {
1095
+ "id": "questionReviewIntegrator",
1096
+ "kind": "script",
1097
+ "scriptRef": "script:integrator",
1098
+ "next": "respondThreads",
1099
+ "onFailure": "route",
1100
+ "resultSchema": "schema:integration",
1101
+ "consumes": [
1102
+ {
1103
+ "node": "questionReviewRework",
1104
+ "as": "reviewChange"
1105
+ }
1106
+ ],
1107
+ "catch": [
1108
+ {
1109
+ "onError": "revo.ScriptBlocked",
1110
+ "goto": "classifyRecovery"
1111
+ },
1112
+ {
1113
+ "onError": "revo.ScriptFailed",
1114
+ "goto": "classifyRecovery"
1115
+ }
1116
+ ]
1117
+ },
892
1118
  "reviewRework": {
893
1119
  "id": "reviewRework",
894
1120
  "kind": "agent",
@@ -925,11 +1151,11 @@
925
1151
  "catch": [
926
1152
  {
927
1153
  "onError": "revo.ScriptBlocked",
928
- "goto": "blockedEnd"
1154
+ "goto": "classifyRecovery"
929
1155
  },
930
1156
  {
931
1157
  "onError": "revo.ScriptFailed",
932
- "goto": "failedEnd"
1158
+ "goto": "classifyRecovery"
933
1159
  }
934
1160
  ]
935
1161
  },
@@ -944,16 +1170,22 @@
944
1170
  {
945
1171
  "node": "triage",
946
1172
  "as": "triage"
1173
+ },
1174
+ {
1175
+ "node": "questionGate",
1176
+ "as": "gateResolution",
1177
+ "optional": true,
1178
+ "staleOk": true
947
1179
  }
948
1180
  ],
949
1181
  "catch": [
950
1182
  {
951
1183
  "onError": "revo.ScriptBlocked",
952
- "goto": "blockedEnd"
1184
+ "goto": "classifyRecovery"
953
1185
  },
954
1186
  {
955
1187
  "onError": "revo.ScriptFailed",
956
- "goto": "failedEnd"
1188
+ "goto": "classifyRecovery"
957
1189
  }
958
1190
  ]
959
1191
  },
@@ -1003,1143 +1235,175 @@
1003
1235
  "id": "cancelledEnd",
1004
1236
  "kind": "terminal",
1005
1237
  "status": "cancelled"
1006
- }
1007
- },
1008
- "title": "Feature development \u2014 plan + merge gates, bounded code-review rework, and a PR review-feedback loop (plan 0018)",
1009
- "policy": {
1010
- "conflicts": [
1011
- [
1012
- "developer",
1013
- "reviewer"
1238
+ },
1239
+ "mergeApproveReverify": {
1240
+ "id": "mergeApproveReverify",
1241
+ "kind": "script",
1242
+ "scriptRef": "script:pollPr",
1243
+ "next": "mergeApproveReverifyRouter",
1244
+ "onFailure": "route",
1245
+ "resultSchema": "schema:prFeedback",
1246
+ "produces": {
1247
+ "name": "prFeedback"
1248
+ },
1249
+ "catch": [
1250
+ {
1251
+ "onError": "revo.ScriptBlocked",
1252
+ "goto": "classifyRecovery"
1253
+ },
1254
+ {
1255
+ "onError": "revo.ScriptFailed",
1256
+ "goto": "classifyRecovery"
1257
+ }
1014
1258
  ]
1015
- ],
1016
- "enforcement": "strict"
1017
- },
1018
- "scopes": {
1019
- "planReviewLoop": {
1020
- "cap": 4,
1021
- "parent": null
1022
1259
  },
1023
- "codeReviewLoop": {
1024
- "cap": 3,
1025
- "parent": "codeStuckRecoveryLoop"
1260
+ "mergeApproveReverifyRouter": {
1261
+ "id": "mergeApproveReverifyRouter",
1262
+ "kind": "choice",
1263
+ "branches": [
1264
+ {
1265
+ "when": {
1266
+ "op": "verdict.eq",
1267
+ "value": "clean"
1268
+ },
1269
+ "goto": "confirmMerge"
1270
+ },
1271
+ {
1272
+ "when": {
1273
+ "op": "verdict.eq",
1274
+ "value": "merged"
1275
+ },
1276
+ "goto": "cleanupWorktree"
1277
+ },
1278
+ {
1279
+ "when": {
1280
+ "op": "verdict.eq",
1281
+ "value": "closed"
1282
+ },
1283
+ "goto": "recoveryGate"
1284
+ },
1285
+ {
1286
+ "default": "classifyRecovery"
1287
+ }
1288
+ ]
1026
1289
  },
1027
- "ciLoop": {
1028
- "cap": 3,
1029
- "parent": null
1030
- },
1031
- "reviewLoop": {
1032
- "cap": 3,
1033
- "parent": null
1034
- },
1035
- "questionLoop": {
1036
- "cap": 3,
1037
- "parent": null
1038
- },
1039
- "codeStuckRecoveryLoop": {
1040
- "cap": 3,
1041
- "parent": null
1042
- }
1043
- }
1044
- }
1045
- }
1046
- },
1047
- {
1048
- "id": "feature-development-codex-consensus",
1049
- "path": "prompts/orchestrator.md",
1050
- "triggers": [
1051
- "codex feature",
1052
- "codex consensus feature",
1053
- "codex task-to-PR work"
1054
- ],
1055
- "required_roles": [
1056
- "orchestrator-codex",
1057
- "analyst-codex",
1058
- "reviewer-codex",
1059
- "triager-codex",
1060
- "developer-codex",
1061
- "integrator",
1062
- "watcher-codex"
1063
- ],
1064
- "alternative_roles": [],
1065
- "optional_roles": [],
1066
- "route_gates": [
1067
- "task spec approval",
1068
- "merge approval"
1069
- ],
1070
- "platform_invocation": "canonical-only",
1071
- "execution_policy": {
1072
- "raw": [
1073
- "Built-in Codex default: same feature-development control flow, but Codex-bound plan/development roles and parallel reviewer consensus for plan + code review.",
1074
- "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."
1075
- ],
1076
- "template_json": {
1077
- "specVersion": "1.0",
1078
- "pipelineId": "feature-development-codex-consensus",
1079
- "entry": "analyst",
1080
- "verdicts": {
1081
- "domain": [
1082
- "approved",
1083
- "clean",
1084
- "blocker",
1085
- "changes_requested",
1086
- "review_changes",
1087
- "ci_changes",
1088
- "fix",
1089
- "wontfix",
1090
- "question",
1091
- "recheck",
1092
- "approve_anyway",
1093
- "rework",
1094
- "abort",
1095
- "address_review_threads",
1096
- "return_to_development",
1097
- "override_merge",
1098
- "cancel"
1099
- ]
1100
- },
1101
- "nodes": {
1102
- "analyst": {
1103
- "id": "analyst",
1104
- "kind": "agent",
1105
- "roleRef": "role:analyst-codex",
1106
- "next": "planReviewFanout",
1107
- "onFailure": "abort",
1108
- "resultSchema": "schema:plan",
1109
- "produces": {
1110
- "name": "plan"
1111
- }
1112
- },
1113
- "planReviewRouter": {
1114
- "id": "planReviewRouter",
1115
- "kind": "choice",
1116
- "branches": [
1117
- {
1118
- "when": {
1119
- "op": "verdict.in",
1120
- "value": [
1121
- "approved",
1122
- "clean"
1123
- ]
1124
- },
1125
- "goto": "planGate"
1126
- },
1127
- {
1128
- "when": {
1129
- "op": "all",
1130
- "of": [
1131
- {
1132
- "op": "verdict.in",
1133
- "value": [
1134
- "blocker",
1135
- "changes_requested"
1136
- ]
1137
- },
1138
- {
1139
- "op": "counter.lt",
1140
- "scope": "planReviewLoop",
1141
- "value": 4
1142
- }
1143
- ]
1144
- },
1145
- "goto": "analyst"
1146
- },
1147
- {
1148
- "default": "planStuckGate"
1149
- }
1150
- ],
1151
- "incrementCounters": [
1152
- "planReviewLoop"
1153
- ]
1154
- },
1155
- "planStuckGate": {
1156
- "id": "planStuckGate",
1157
- "kind": "humanGate",
1158
- "reason": "plan-stuck",
1159
- "outcomes": [
1160
- "approved"
1161
- ],
1162
- "branches": [
1163
- {
1164
- "when": {
1165
- "op": "verdict.eq",
1166
- "value": "approved"
1167
- },
1168
- "goto": "developer"
1169
- },
1170
- {
1171
- "default": "blockedEnd"
1172
- }
1173
- ],
1174
- "gatedArtifact": {
1175
- "node": "analyst",
1176
- "as": "plan"
1177
- }
1178
- },
1179
- "planGate": {
1180
- "id": "planGate",
1181
- "kind": "humanGate",
1182
- "reason": "plan-review",
1183
- "outcomes": [
1184
- "approved"
1185
- ],
1186
- "branches": [
1187
- {
1188
- "when": {
1189
- "op": "verdict.eq",
1190
- "value": "approved"
1191
- },
1192
- "goto": "developer"
1193
- },
1194
- {
1195
- "default": "blockedEnd"
1196
- }
1197
- ],
1198
- "gatedArtifact": {
1199
- "node": "analyst",
1200
- "as": "plan"
1201
- }
1202
- },
1203
- "developer": {
1204
- "id": "developer",
1205
- "kind": "agent",
1206
- "roleRef": "role:developer-codex",
1207
- "next": "codeReviewFanout",
1208
- "onFailure": "abort",
1209
- "resultSchema": "schema:change",
1210
- "consumes": [
1211
- {
1212
- "node": "analyst",
1213
- "as": "plan"
1214
- }
1215
- ],
1216
- "produces": {
1217
- "name": "change"
1218
- }
1219
- },
1220
- "codeReviewRouter": {
1221
- "id": "codeReviewRouter",
1222
- "kind": "choice",
1223
- "branches": [
1224
- {
1225
- "when": {
1226
- "op": "verdict.in",
1227
- "value": [
1228
- "approved",
1229
- "clean"
1230
- ]
1231
- },
1232
- "goto": "integrator"
1233
- },
1234
- {
1235
- "when": {
1236
- "op": "all",
1237
- "of": [
1238
- {
1239
- "op": "verdict.in",
1240
- "value": [
1241
- "blocker",
1242
- "changes_requested"
1243
- ]
1244
- },
1245
- {
1246
- "op": "counter.lt",
1247
- "scope": "codeReviewLoop",
1248
- "value": 4
1249
- }
1250
- ]
1251
- },
1252
- "goto": "reworkDeveloper"
1253
- },
1254
- {
1255
- "when": {
1256
- "op": "counter.gte",
1257
- "scope": "codeStuckRecoveryLoop",
1258
- "value": 1
1259
- },
1260
- "goto": "codeFinalStuckGate"
1261
- },
1262
- {
1263
- "default": "codeStuckGate"
1264
- }
1265
- ],
1266
- "incrementCounters": [
1267
- "codeReviewLoop"
1268
- ]
1269
- },
1270
- "codeStuckGate": {
1271
- "id": "codeStuckGate",
1272
- "kind": "humanGate",
1273
- "reason": "code-review-stuck",
1274
- "outcomes": [
1275
- "approve_anyway",
1276
- "rework",
1277
- "abort"
1278
- ],
1279
- "branches": [
1280
- {
1281
- "when": {
1282
- "op": "verdict.eq",
1283
- "value": "approve_anyway"
1284
- },
1285
- "goto": "integrator"
1286
- },
1287
- {
1288
- "when": {
1289
- "op": "all",
1290
- "of": [
1291
- {
1292
- "op": "verdict.eq",
1293
- "value": "rework"
1294
- },
1295
- {
1296
- "op": "counter.lt",
1297
- "scope": "codeStuckRecoveryLoop",
1298
- "value": 1
1299
- }
1300
- ]
1301
- },
1302
- "goto": "stuckReworkDeveloper"
1303
- },
1304
- {
1305
- "when": {
1306
- "op": "verdict.eq",
1307
- "value": "rework"
1308
- },
1309
- "goto": "codeFinalStuckGate"
1310
- },
1311
- {
1312
- "default": "blockedEnd"
1313
- }
1314
- ],
1315
- "gatedArtifact": {
1316
- "node": "reworkDeveloper",
1317
- "as": "change"
1318
- },
1319
- "produces": {
1320
- "name": "gateResolution"
1321
- }
1322
- },
1323
- "reworkDeveloper": {
1324
- "id": "reworkDeveloper",
1325
- "kind": "agent",
1326
- "roleRef": "role:developer-codex",
1327
- "next": "codeReviewFanout",
1328
- "onFailure": "abort",
1329
- "resultSchema": "schema:change",
1330
- "produces": {
1331
- "name": "change"
1332
- }
1333
- },
1334
- "integrator": {
1335
- "id": "integrator",
1336
- "kind": "script",
1337
- "scriptRef": "script:integrator",
1338
- "next": "pollPr",
1339
- "catch": [
1340
- {
1341
- "onError": "revo.ScriptBlocked",
1342
- "goto": "blockedEnd"
1343
- },
1344
- {
1345
- "onError": "revo.ScriptFailed",
1346
- "goto": "failedEnd"
1347
- }
1348
- ],
1349
- "onFailure": "route",
1350
- "resultSchema": "schema:integration",
1351
- "consumes": [
1352
- {
1353
- "node": "developer",
1354
- "as": "developerChange",
1355
- "staleOk": true
1356
- },
1357
- {
1358
- "node": "reworkDeveloper",
1359
- "as": "reworkChange",
1360
- "optional": true
1361
- },
1362
- {
1363
- "node": "stuckReworkDeveloper",
1364
- "as": "stuckReworkChange",
1365
- "optional": true
1366
- },
1367
- {
1368
- "node": "ciRework",
1369
- "as": "ciChange",
1370
- "optional": true,
1371
- "staleOk": true
1372
- }
1373
- ]
1374
- },
1375
- "mergeGate": {
1376
- "id": "mergeGate",
1377
- "kind": "humanGate",
1378
- "reason": "merge-review",
1379
- "outcomes": [
1380
- "approved",
1381
- "recheck",
1382
- "address_review_threads",
1383
- "return_to_development",
1384
- "override_merge",
1385
- "cancel"
1386
- ],
1387
- "branches": [
1388
- {
1389
- "when": {
1390
- "op": "verdict.eq",
1391
- "value": "approved"
1392
- },
1393
- "goto": "confirmMerge"
1394
- },
1395
- {
1396
- "when": {
1397
- "op": "verdict.eq",
1398
- "value": "recheck"
1399
- },
1400
- "goto": "mergeRecheck"
1401
- },
1402
- {
1403
- "when": {
1404
- "op": "verdict.eq",
1405
- "value": "address_review_threads"
1406
- },
1407
- "goto": "triage"
1408
- },
1409
- {
1410
- "when": {
1411
- "op": "verdict.eq",
1412
- "value": "return_to_development"
1413
- },
1414
- "goto": "triage"
1415
- },
1416
- {
1417
- "when": {
1418
- "op": "verdict.eq",
1419
- "value": "override_merge"
1420
- },
1421
- "goto": "confirmMerge"
1422
- },
1423
- {
1424
- "when": {
1425
- "op": "verdict.eq",
1426
- "value": "cancel"
1427
- },
1428
- "goto": "cancelledEnd"
1429
- },
1430
- {
1431
- "default": "blockedEnd"
1432
- }
1433
- ],
1434
- "gatedArtifact": {
1435
- "node": "mergeReadiness",
1436
- "as": "prFeedback"
1437
- }
1438
- },
1439
- "mergeRecheck": {
1440
- "id": "mergeRecheck",
1441
- "kind": "script",
1442
- "scriptRef": "script:pollPr",
1443
- "next": "mergeRecheckRouter",
1444
- "onFailure": "route",
1445
- "resultSchema": "schema:prFeedback",
1446
- "produces": {
1447
- "name": "prFeedback"
1448
- },
1449
- "catch": [
1450
- {
1451
- "onError": "revo.ScriptBlocked",
1452
- "goto": "blockedEnd"
1453
- },
1454
- {
1455
- "onError": "revo.ScriptFailed",
1456
- "goto": "failedEnd"
1457
- }
1458
- ]
1459
- },
1460
- "mergeRecheckRouter": {
1461
- "id": "mergeRecheckRouter",
1462
- "kind": "choice",
1463
- "branches": [
1464
- {
1465
- "when": {
1466
- "op": "verdict.eq",
1467
- "value": "clean"
1468
- },
1469
- "goto": "blockedEnd"
1470
- },
1471
- {
1472
- "when": {
1473
- "op": "verdict.eq",
1474
- "value": "review_changes"
1475
- },
1476
- "goto": "triage"
1477
- },
1478
- {
1479
- "when": {
1480
- "op": "all",
1481
- "of": [
1482
- {
1483
- "op": "verdict.eq",
1484
- "value": "ci_changes"
1485
- },
1486
- {
1487
- "op": "counter.lt",
1488
- "scope": "ciLoop",
1489
- "value": 3
1490
- }
1491
- ]
1492
- },
1493
- "goto": "ciRework"
1494
- },
1495
- {
1496
- "when": {
1497
- "op": "verdict.eq",
1498
- "value": "recheck"
1499
- },
1500
- "goto": "mergeReadiness"
1501
- },
1502
- {
1503
- "default": "blockedEnd"
1504
- }
1505
- ]
1506
- },
1507
- "confirmMerge": {
1508
- "id": "confirmMerge",
1509
- "kind": "script",
1510
- "scriptRef": "script:confirmMerge",
1511
- "next": "mergedEnd",
1512
- "catch": [
1513
- {
1514
- "onError": "revo.ScriptBlocked",
1515
- "goto": "blockedEnd"
1516
- },
1517
- {
1518
- "onError": "revo.ScriptFailed",
1519
- "goto": "failedEnd"
1520
- }
1521
- ],
1522
- "onFailure": "route",
1523
- "resultSchema": "schema:integration",
1524
- "consumes": [
1525
- {
1526
- "node": "mergeReadiness",
1527
- "as": "mergeReadiness"
1528
- }
1529
- ]
1530
- },
1531
- "mergedEnd": {
1532
- "id": "mergedEnd",
1533
- "kind": "terminal",
1534
- "status": "succeeded"
1535
- },
1536
- "failedEnd": {
1537
- "id": "failedEnd",
1538
- "kind": "terminal",
1539
- "status": "failed"
1540
- },
1541
- "blockedEnd": {
1542
- "id": "blockedEnd",
1543
- "kind": "terminal",
1544
- "status": "blocked"
1545
- },
1546
- "pollPr": {
1547
- "id": "pollPr",
1548
- "kind": "script",
1549
- "scriptRef": "script:pollPr",
1550
- "next": "prRouter",
1551
- "onFailure": "route",
1552
- "resultSchema": "schema:prFeedback",
1553
- "produces": {
1554
- "name": "prFeedback"
1555
- },
1556
- "catch": [
1557
- {
1558
- "onError": "revo.ScriptBlocked",
1559
- "goto": "blockedEnd"
1560
- },
1561
- {
1562
- "onError": "revo.ScriptFailed",
1563
- "goto": "failedEnd"
1564
- }
1565
- ]
1566
- },
1567
- "prRouter": {
1568
- "id": "prRouter",
1569
- "kind": "choice",
1570
- "branches": [
1571
- {
1572
- "when": {
1573
- "op": "verdict.eq",
1574
- "value": "clean"
1575
- },
1576
- "goto": "mergeReadiness"
1577
- },
1578
- {
1579
- "when": {
1580
- "op": "verdict.eq",
1581
- "value": "recheck"
1582
- },
1583
- "goto": "pollPr"
1584
- },
1585
- {
1586
- "when": {
1587
- "op": "verdict.eq",
1588
- "value": "review_changes"
1589
- },
1590
- "goto": "triage"
1591
- },
1592
- {
1593
- "when": {
1594
- "op": "all",
1595
- "of": [
1596
- {
1597
- "op": "verdict.eq",
1598
- "value": "ci_changes"
1599
- },
1600
- {
1601
- "op": "counter.lt",
1602
- "scope": "ciLoop",
1603
- "value": 3
1604
- }
1605
- ]
1606
- },
1607
- "goto": "ciRework"
1608
- },
1609
- {
1610
- "default": "blockedEnd"
1611
- }
1612
- ]
1613
- },
1614
- "mergeReadiness": {
1615
- "id": "mergeReadiness",
1616
- "kind": "script",
1617
- "scriptRef": "script:pollPr",
1618
- "next": "mergeReadinessRouter",
1619
- "onFailure": "route",
1620
- "resultSchema": "schema:prFeedback",
1621
- "produces": {
1622
- "name": "prFeedback"
1623
- },
1624
- "catch": [
1625
- {
1626
- "onError": "revo.ScriptBlocked",
1627
- "goto": "blockedEnd"
1628
- },
1629
- {
1630
- "onError": "revo.ScriptFailed",
1631
- "goto": "failedEnd"
1632
- }
1633
- ]
1634
- },
1635
- "mergeReadinessRouter": {
1636
- "id": "mergeReadinessRouter",
1637
- "kind": "choice",
1638
- "branches": [
1639
- {
1640
- "when": {
1641
- "op": "verdict.eq",
1642
- "value": "clean"
1643
- },
1644
- "goto": "mergeGate"
1645
- },
1646
- {
1647
- "when": {
1648
- "op": "verdict.eq",
1649
- "value": "recheck"
1650
- },
1651
- "goto": "mergeReadiness"
1652
- },
1653
- {
1654
- "when": {
1655
- "op": "verdict.eq",
1656
- "value": "review_changes"
1657
- },
1658
- "goto": "triage"
1659
- },
1660
- {
1661
- "when": {
1662
- "op": "all",
1663
- "of": [
1664
- {
1665
- "op": "verdict.eq",
1666
- "value": "ci_changes"
1667
- },
1668
- {
1669
- "op": "counter.lt",
1670
- "scope": "ciLoop",
1671
- "value": 3
1672
- }
1673
- ]
1674
- },
1675
- "goto": "ciRework"
1676
- },
1677
- {
1678
- "default": "blockedEnd"
1679
- }
1680
- ]
1681
- },
1682
- "ciRework": {
1683
- "id": "ciRework",
1684
- "kind": "agent",
1685
- "roleRef": "role:developer-codex",
1686
- "next": "integrator",
1687
- "onFailure": "abort",
1688
- "resultSchema": "schema:change",
1689
- "incrementCounters": [
1690
- "ciLoop"
1691
- ],
1692
- "produces": {
1693
- "name": "change"
1694
- },
1695
- "consumes": [
1696
- {
1697
- "node": "pollPr",
1698
- "as": "feedback"
1699
- },
1700
- {
1701
- "node": "mergeReadiness",
1702
- "as": "mergeFeedback",
1703
- "optional": true,
1704
- "staleOk": true
1705
- },
1706
- {
1707
- "node": "mergeRecheck",
1708
- "as": "recheckFeedback",
1709
- "optional": true,
1710
- "staleOk": true
1711
- }
1712
- ]
1713
- },
1714
- "triage": {
1715
- "id": "triage",
1716
- "kind": "agent",
1717
- "roleRef": "role:triager-codex",
1718
- "next": "triageRouter",
1719
- "onFailure": "abort",
1720
- "resultSchema": "schema:triage",
1721
- "produces": {
1722
- "name": "triage"
1723
- },
1724
- "consumes": [
1725
- {
1726
- "node": "analyst",
1727
- "as": "plan",
1728
- "staleOk": true
1729
- },
1730
- {
1731
- "node": "pollPr",
1732
- "as": "feedback"
1733
- },
1734
- {
1735
- "node": "mergeReadiness",
1736
- "as": "mergeFeedback",
1737
- "optional": true,
1738
- "staleOk": true
1739
- },
1740
- {
1741
- "node": "mergeRecheck",
1742
- "as": "recheckFeedback",
1743
- "optional": true,
1744
- "staleOk": true
1745
- }
1746
- ]
1747
- },
1748
- "triageRouter": {
1749
- "id": "triageRouter",
1750
- "kind": "choice",
1751
- "branches": [
1752
- {
1753
- "when": {
1754
- "op": "all",
1755
- "of": [
1756
- {
1757
- "op": "verdict.eq",
1758
- "value": "question"
1759
- },
1760
- {
1761
- "op": "counter.lt",
1762
- "scope": "questionLoop",
1763
- "value": 3
1764
- }
1765
- ]
1766
- },
1767
- "goto": "questionGate"
1768
- },
1769
- {
1770
- "when": {
1771
- "op": "all",
1772
- "of": [
1773
- {
1774
- "op": "verdict.eq",
1775
- "value": "fix"
1776
- },
1777
- {
1778
- "op": "counter.lt",
1779
- "scope": "reviewLoop",
1780
- "value": 3
1781
- }
1782
- ]
1783
- },
1784
- "goto": "reviewRework"
1785
- },
1786
- {
1787
- "when": {
1788
- "op": "verdict.eq",
1789
- "value": "wontfix"
1790
- },
1791
- "goto": "respondThreads"
1792
- },
1793
- {
1794
- "default": "blockedEnd"
1795
- }
1796
- ]
1797
- },
1798
- "questionGate": {
1799
- "id": "questionGate",
1800
- "kind": "humanGate",
1801
- "reason": "review-question",
1802
- "outcomes": [
1803
- "approved",
1804
- "changes_requested"
1805
- ],
1806
- "incrementCounters": [
1807
- "questionLoop"
1808
- ],
1809
- "branches": [
1810
- {
1811
- "when": {
1812
- "op": "verdict.eq",
1813
- "value": "approved"
1814
- },
1815
- "goto": "triage"
1816
- },
1817
- {
1818
- "default": "blockedEnd"
1819
- }
1820
- ],
1821
- "gatedArtifact": {
1822
- "node": "triage",
1823
- "as": "triage"
1824
- }
1825
- },
1826
- "reviewRework": {
1827
- "id": "reviewRework",
1290
+ "classifyRecovery": {
1291
+ "id": "classifyRecovery",
1828
1292
  "kind": "agent",
1829
- "roleRef": "role:developer-codex",
1830
- "next": "reviewIntegrator",
1293
+ "roleRef": "role:triager",
1294
+ "next": "recoveryRouter",
1831
1295
  "onFailure": "abort",
1832
- "resultSchema": "schema:change",
1833
- "incrementCounters": [
1834
- "reviewLoop"
1835
- ],
1296
+ "resultSchema": "schema:triage",
1836
1297
  "produces": {
1837
- "name": "change"
1298
+ "name": "recoveryTriage"
1838
1299
  },
1839
- "consumes": [
1840
- {
1841
- "node": "triage",
1842
- "as": "triage"
1843
- }
1844
- ]
1845
- },
1846
- "reviewIntegrator": {
1847
- "id": "reviewIntegrator",
1848
- "kind": "script",
1849
- "scriptRef": "script:integrator",
1850
- "next": "respondThreads",
1851
- "onFailure": "route",
1852
- "resultSchema": "schema:integration",
1853
- "consumes": [
1854
- {
1855
- "node": "reviewRework",
1856
- "as": "reviewChange"
1857
- }
1858
- ],
1859
- "catch": [
1860
- {
1861
- "onError": "revo.ScriptBlocked",
1862
- "goto": "blockedEnd"
1863
- },
1864
- {
1865
- "onError": "revo.ScriptFailed",
1866
- "goto": "failedEnd"
1867
- }
1868
- ]
1869
- },
1870
- "respondThreads": {
1871
- "id": "respondThreads",
1872
- "kind": "script",
1873
- "scriptRef": "script:respondThreads",
1874
- "next": "pollPr",
1875
- "onFailure": "route",
1876
- "resultSchema": "schema:respond",
1877
- "consumes": [
1878
- {
1879
- "node": "triage",
1880
- "as": "triage"
1881
- }
1882
- ],
1883
- "catch": [
1884
- {
1885
- "onError": "revo.ScriptBlocked",
1886
- "goto": "blockedEnd"
1887
- },
1888
- {
1889
- "onError": "revo.ScriptFailed",
1890
- "goto": "failedEnd"
1891
- }
1892
- ]
1893
- },
1894
- "planReviewFanout": {
1895
- "id": "planReviewFanout",
1896
- "kind": "parallel",
1897
- "branches": [
1898
- {
1899
- "id": "primary",
1900
- "entry": "planReviewPrimary"
1901
- },
1902
- {
1903
- "id": "secondary",
1904
- "entry": "planReviewSecondary"
1905
- }
1906
- ],
1907
- "join": "planReviewJoin"
1908
- },
1909
- "planReviewPrimary": {
1910
- "id": "planReviewPrimary",
1911
- "kind": "agent",
1912
- "roleRef": "role:reviewer-codex",
1913
- "next": "planReviewJoin",
1914
- "onFailure": "abort",
1915
- "resultSchema": "schema:reviewVerdict",
1916
- "consumes": [
1917
- {
1918
- "node": "analyst",
1919
- "as": "plan"
1920
- }
1300
+ "incrementCounters": [
1301
+ "recoveryLoop"
1921
1302
  ],
1922
- "produces": {
1923
- "name": "review"
1924
- }
1925
- },
1926
- "planReviewSecondary": {
1927
- "id": "planReviewSecondary",
1928
- "kind": "agent",
1929
- "roleRef": "role:reviewer-codex",
1930
- "next": "planReviewJoin",
1931
- "onFailure": "abort",
1932
- "resultSchema": "schema:reviewVerdict",
1933
1303
  "consumes": [
1934
1304
  {
1935
1305
  "node": "analyst",
1936
- "as": "plan"
1937
- }
1938
- ],
1939
- "produces": {
1940
- "name": "review"
1941
- }
1942
- },
1943
- "planReviewJoin": {
1944
- "id": "planReviewJoin",
1945
- "kind": "join",
1946
- "joinMode": {
1947
- "kind": "all"
1948
- },
1949
- "verdictReducer": {
1950
- "kind": "allIn",
1951
- "pass": [
1952
- "approved",
1953
- "clean"
1954
- ],
1955
- "passVerdict": "approved",
1956
- "failVerdict": "changes_requested"
1957
- },
1958
- "merge": {
1959
- "reviews": "appendByBranchOrder"
1960
- },
1961
- "next": "planReviewRouter"
1962
- },
1963
- "codeReviewFanout": {
1964
- "id": "codeReviewFanout",
1965
- "kind": "parallel",
1966
- "branches": [
1967
- {
1968
- "id": "primary",
1969
- "entry": "codeReviewPrimary"
1970
- },
1971
- {
1972
- "id": "secondary",
1973
- "entry": "codeReviewSecondary"
1974
- }
1975
- ],
1976
- "join": "codeReviewJoin"
1977
- },
1978
- "codeReviewPrimary": {
1979
- "id": "codeReviewPrimary",
1980
- "kind": "agent",
1981
- "roleRef": "role:reviewer-codex",
1982
- "next": "codeReviewJoin",
1983
- "onFailure": "abort",
1984
- "resultSchema": "schema:reviewVerdict",
1985
- "consumes": [
1986
- {
1987
- "node": "developer",
1988
- "as": "developerChange",
1306
+ "as": "plan",
1307
+ "optional": true,
1989
1308
  "staleOk": true
1990
1309
  },
1991
1310
  {
1992
- "node": "reworkDeveloper",
1993
- "as": "reworkChange",
1994
- "optional": true
1995
- },
1996
- {
1997
- "node": "stuckReworkDeveloper",
1998
- "as": "stuckReworkChange",
1999
- "optional": true
2000
- }
2001
- ],
2002
- "produces": {
2003
- "name": "review"
2004
- }
2005
- },
2006
- "codeReviewSecondary": {
2007
- "id": "codeReviewSecondary",
2008
- "kind": "agent",
2009
- "roleRef": "role:reviewer-codex",
2010
- "next": "codeReviewJoin",
2011
- "onFailure": "abort",
2012
- "resultSchema": "schema:reviewVerdict",
2013
- "consumes": [
2014
- {
2015
- "node": "developer",
2016
- "as": "developerChange",
1311
+ "node": "pollPr",
1312
+ "as": "feedback",
1313
+ "optional": true,
2017
1314
  "staleOk": true
2018
1315
  },
2019
1316
  {
2020
- "node": "reworkDeveloper",
2021
- "as": "reworkChange",
2022
- "optional": true
2023
- },
2024
- {
2025
- "node": "stuckReworkDeveloper",
2026
- "as": "stuckReworkChange",
2027
- "optional": true
2028
- }
2029
- ],
2030
- "produces": {
2031
- "name": "review"
2032
- }
2033
- },
2034
- "codeReviewJoin": {
2035
- "id": "codeReviewJoin",
2036
- "kind": "join",
2037
- "joinMode": {
2038
- "kind": "all"
2039
- },
2040
- "verdictReducer": {
2041
- "kind": "allIn",
2042
- "pass": [
2043
- "approved",
2044
- "clean"
2045
- ],
2046
- "passVerdict": "approved",
2047
- "failVerdict": "changes_requested"
2048
- },
2049
- "merge": {
2050
- "reviews": "appendByBranchOrder"
2051
- },
2052
- "next": "codeReviewRouter"
2053
- },
2054
- "stuckReworkDeveloper": {
2055
- "id": "stuckReworkDeveloper",
2056
- "kind": "agent",
2057
- "roleRef": "role:developer-codex",
2058
- "next": "codeReviewFanout",
2059
- "onFailure": "abort",
2060
- "resultSchema": "schema:change",
2061
- "incrementCounters": [
2062
- "codeStuckRecoveryLoop"
2063
- ],
2064
- "produces": {
2065
- "name": "change"
2066
- },
2067
- "consumes": [
2068
- {
2069
- "node": "developer",
2070
- "as": "initialChange",
2071
- "iteration": "latest",
1317
+ "node": "mergeReadiness",
1318
+ "as": "mergeFeedback",
2072
1319
  "optional": true,
2073
1320
  "staleOk": true
2074
1321
  },
2075
1322
  {
2076
- "node": "reworkDeveloper",
2077
- "as": "latestRework",
2078
- "iteration": "latest",
1323
+ "node": "mergeApproveReverify",
1324
+ "as": "approveFeedback",
2079
1325
  "optional": true,
2080
1326
  "staleOk": true
2081
1327
  },
2082
1328
  {
2083
- "node": "codeReviewPrimary",
2084
- "as": "primaryReview",
2085
- "iteration": "latest",
1329
+ "node": "overrideMerge",
1330
+ "as": "overrideFeedback",
2086
1331
  "optional": true,
2087
1332
  "staleOk": true
2088
1333
  },
2089
1334
  {
2090
- "node": "codeReviewSecondary",
2091
- "as": "secondaryReview",
2092
- "iteration": "latest",
1335
+ "node": "mergeRecheck",
1336
+ "as": "recheckFeedback",
2093
1337
  "optional": true,
2094
1338
  "staleOk": true
1339
+ }
1340
+ ]
1341
+ },
1342
+ "recoveryRouter": {
1343
+ "id": "recoveryRouter",
1344
+ "kind": "choice",
1345
+ "branches": [
1346
+ {
1347
+ "when": {
1348
+ "op": "all",
1349
+ "of": [
1350
+ {
1351
+ "op": "verdict.eq",
1352
+ "value": "fix"
1353
+ },
1354
+ {
1355
+ "op": "counter.lt",
1356
+ "scope": "recoveryLoop",
1357
+ "value": 3
1358
+ }
1359
+ ]
1360
+ },
1361
+ "goto": "pollPr"
2095
1362
  },
2096
1363
  {
2097
- "node": "codeStuckGate",
2098
- "as": "gateResolution",
2099
- "iteration": "latest"
1364
+ "default": "recoveryGate"
2100
1365
  }
2101
1366
  ]
2102
1367
  },
2103
- "codeFinalStuckGate": {
2104
- "id": "codeFinalStuckGate",
1368
+ "recoveryGate": {
1369
+ "id": "recoveryGate",
2105
1370
  "kind": "humanGate",
2106
- "reason": "code-review-final-stuck",
1371
+ "reason": "merge-recovery",
2107
1372
  "outcomes": [
2108
- "approve_anyway",
2109
- "abort"
1373
+ "recheck",
1374
+ "cancel"
2110
1375
  ],
2111
1376
  "branches": [
2112
1377
  {
2113
1378
  "when": {
2114
1379
  "op": "verdict.eq",
2115
- "value": "approve_anyway"
1380
+ "value": "recheck"
2116
1381
  },
2117
- "goto": "integrator"
1382
+ "goto": "pollPr"
1383
+ },
1384
+ {
1385
+ "when": {
1386
+ "op": "verdict.eq",
1387
+ "value": "cancel"
1388
+ },
1389
+ "goto": "cancelledEnd"
2118
1390
  },
2119
1391
  {
2120
1392
  "default": "blockedEnd"
2121
1393
  }
2122
1394
  ],
2123
1395
  "gatedArtifact": {
2124
- "node": "stuckReworkDeveloper",
2125
- "as": "change"
2126
- },
2127
- "produces": {
2128
- "name": "gateResolution"
1396
+ "node": "pollPr",
1397
+ "as": "prFeedback"
2129
1398
  }
2130
- },
2131
- "cancelledEnd": {
2132
- "id": "cancelledEnd",
2133
- "kind": "terminal",
2134
- "status": "cancelled"
2135
1399
  }
2136
1400
  },
2137
- "title": "Codex feature development with parallel review consensus",
1401
+ "title": "Feature development plan + merge gates, bounded code-review rework, and a PR review-feedback loop (plan 0018)",
2138
1402
  "policy": {
2139
1403
  "conflicts": [
2140
1404
  [
2141
- "developer-codex",
2142
- "reviewer-codex"
1405
+ "developer",
1406
+ "reviewer"
2143
1407
  ]
2144
1408
  ],
2145
1409
  "enforcement": "strict"
@@ -2150,13 +1414,17 @@
2150
1414
  "parent": null
2151
1415
  },
2152
1416
  "codeReviewLoop": {
2153
- "cap": 4,
2154
- "parent": null
1417
+ "cap": 3,
1418
+ "parent": "codeStuckRecoveryLoop"
2155
1419
  },
2156
1420
  "ciLoop": {
2157
1421
  "cap": 3,
2158
1422
  "parent": null
2159
1423
  },
1424
+ "pollLoop": {
1425
+ "cap": 8,
1426
+ "parent": null
1427
+ },
2160
1428
  "reviewLoop": {
2161
1429
  "cap": 3,
2162
1430
  "parent": null
@@ -2166,7 +1434,11 @@
2166
1434
  "parent": null
2167
1435
  },
2168
1436
  "codeStuckRecoveryLoop": {
2169
- "cap": 1,
1437
+ "cap": 3,
1438
+ "parent": null
1439
+ },
1440
+ "recoveryLoop": {
1441
+ "cap": 3,
2170
1442
  "parent": null
2171
1443
  }
2172
1444
  }
@@ -2191,7 +1463,7 @@
2191
1463
  "platform_invocation": "canonical-only",
2192
1464
  "execution_policy": {
2193
1465
  "raw": [
2194
- "Built-in default (slice 5, plan 0015): the pipeline graph is DATA \u2014 see template_json.",
1466
+ "Built-in default (slice 5, plan 0015): the pipeline graph is DATA see template_json.",
2195
1467
  "orchestrator routes; the graph runs developer -> done with no gate."
2196
1468
  ],
2197
1469
  "template_json": {
@@ -2218,7 +1490,7 @@
2218
1490
  "status": "succeeded"
2219
1491
  }
2220
1492
  },
2221
- "title": "Local change \u2014 developer only, no gate"
1493
+ "title": "Local change developer only, no gate"
2222
1494
  }
2223
1495
  }
2224
1496
  }