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