agentic-orchestrator 0.1.6 → 0.1.7

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 (426) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +47 -46
  5. package/agentic/orchestrator/defaults/policy.defaults.yaml +1 -1
  6. package/agentic/orchestrator/prompts/planner.system.md +1 -0
  7. package/agentic/orchestrator/schemas/agents.schema.json +4 -21
  8. package/agentic/orchestrator/schemas/gates.schema.json +4 -19
  9. package/agentic/orchestrator/schemas/index.schema.json +3 -14
  10. package/agentic/orchestrator/schemas/multi-project.schema.json +2 -8
  11. package/agentic/orchestrator/schemas/plan.schema.json +6 -26
  12. package/agentic/orchestrator/schemas/policy.schema.json +19 -81
  13. package/agentic/orchestrator/schemas/policy.user.schema.json +1 -5
  14. package/agentic/orchestrator/schemas/qa_test_index.schema.json +5 -29
  15. package/agentic/orchestrator/schemas/state.schema.json +11 -61
  16. package/agentic/orchestrator/tools/catalog.json +33 -164
  17. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +1 -3
  18. package/agentic/orchestrator/tools/schemas/input/feature.delete.input.schema.json +1 -5
  19. package/agentic/orchestrator/tools/schemas/input/feature.get_context.input.schema.json +1 -3
  20. package/agentic/orchestrator/tools/schemas/input/feature.init.input.schema.json +1 -4
  21. package/agentic/orchestrator/tools/schemas/input/feature.log_append.input.schema.json +1 -5
  22. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +1 -6
  23. package/agentic/orchestrator/tools/schemas/input/feature.state_get.input.schema.json +1 -3
  24. package/agentic/orchestrator/tools/schemas/input/feature.state_patch.input.schema.json +1 -5
  25. package/agentic/orchestrator/tools/schemas/input/gates.run.input.schema.json +1 -5
  26. package/agentic/orchestrator/tools/schemas/input/locks.acquire.input.schema.json +1 -5
  27. package/agentic/orchestrator/tools/schemas/input/locks.release.input.schema.json +1 -5
  28. package/agentic/orchestrator/tools/schemas/input/performance.record_outcome.input.schema.json +10 -1
  29. package/agentic/orchestrator/tools/schemas/input/plan.get.input.schema.json +1 -3
  30. package/agentic/orchestrator/tools/schemas/input/plan.submit.input.schema.json +1 -5
  31. package/agentic/orchestrator/tools/schemas/input/plan.update.input.schema.json +1 -6
  32. package/agentic/orchestrator/tools/schemas/input/qa.test_index_get.input.schema.json +1 -3
  33. package/agentic/orchestrator/tools/schemas/input/qa.test_index_update.input.schema.json +1 -6
  34. package/agentic/orchestrator/tools/schemas/input/repo.apply_patch.input.schema.json +1 -5
  35. package/agentic/orchestrator/tools/schemas/input/repo.diff.input.schema.json +1 -3
  36. package/agentic/orchestrator/tools/schemas/input/repo.diff_bundle.input.schema.json +1 -3
  37. package/agentic/orchestrator/tools/schemas/input/repo.ensure_worktree.input.schema.json +1 -4
  38. package/agentic/orchestrator/tools/schemas/input/repo.read_file.input.schema.json +1 -4
  39. package/agentic/orchestrator/tools/schemas/input/repo.search.input.schema.json +1 -4
  40. package/agentic/orchestrator/tools/schemas/input/repo.status.input.schema.json +1 -3
  41. package/agentic/orchestrator/tools/schemas/input/report.feature_summary.input.schema.json +1 -3
  42. package/agentic/orchestrator/tools/schemas/output/collisions.scan.output.schema.json +1 -3
  43. package/agentic/orchestrator/tools/schemas/output/evidence.latest.output.schema.json +1 -4
  44. package/agentic/orchestrator/tools/schemas/output/feature.delete.output.schema.json +4 -20
  45. package/agentic/orchestrator/tools/schemas/output/feature.discover_specs.output.schema.json +2 -7
  46. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +1 -8
  47. package/agentic/orchestrator/tools/schemas/output/feature.init.output.schema.json +1 -5
  48. package/agentic/orchestrator/tools/schemas/output/feature.log_append.output.schema.json +1 -5
  49. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +1 -6
  50. package/agentic/orchestrator/tools/schemas/output/feature.state_get.output.schema.json +1 -4
  51. package/agentic/orchestrator/tools/schemas/output/feature.state_patch.output.schema.json +1 -5
  52. package/agentic/orchestrator/tools/schemas/output/gates.list.output.schema.json +2 -7
  53. package/agentic/orchestrator/tools/schemas/output/gates.run.output.schema.json +1 -8
  54. package/agentic/orchestrator/tools/schemas/output/locks.acquire.output.schema.json +1 -7
  55. package/agentic/orchestrator/tools/schemas/output/locks.release.output.schema.json +1 -5
  56. package/agentic/orchestrator/tools/schemas/output/performance.get_analytics.output.schema.json +22 -2
  57. package/agentic/orchestrator/tools/schemas/output/plan.get.output.schema.json +1 -4
  58. package/agentic/orchestrator/tools/schemas/output/plan.submit.output.schema.json +1 -5
  59. package/agentic/orchestrator/tools/schemas/output/plan.update.output.schema.json +1 -5
  60. package/agentic/orchestrator/tools/schemas/output/qa.test_index_get.output.schema.json +1 -5
  61. package/agentic/orchestrator/tools/schemas/output/qa.test_index_update.output.schema.json +1 -4
  62. package/agentic/orchestrator/tools/schemas/output/repo.apply_patch.output.schema.json +1 -6
  63. package/agentic/orchestrator/tools/schemas/output/repo.diff.output.schema.json +1 -4
  64. package/agentic/orchestrator/tools/schemas/output/repo.diff_bundle.output.schema.json +1 -7
  65. package/agentic/orchestrator/tools/schemas/output/repo.ensure_worktree.output.schema.json +1 -6
  66. package/agentic/orchestrator/tools/schemas/output/repo.read_file.output.schema.json +1 -5
  67. package/agentic/orchestrator/tools/schemas/output/repo.search.output.schema.json +1 -5
  68. package/agentic/orchestrator/tools/schemas/output/repo.status.output.schema.json +1 -5
  69. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +1 -4
  70. package/apps/control-plane/scripts/validate-architecture-rules.mjs +16 -5
  71. package/apps/control-plane/scripts/validate-docker-mcp-contract.mjs +30 -8
  72. package/apps/control-plane/scripts/validate-mcp-contracts.ts +13 -7
  73. package/apps/control-plane/src/application/adapters/adapter-registry.ts +35 -15
  74. package/apps/control-plane/src/application/multi-project-loader.ts +27 -10
  75. package/apps/control-plane/src/application/services/activity-monitor-service.ts +26 -14
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +31 -17
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +23 -16
  78. package/apps/control-plane/src/application/services/dependency-scheduler-service.ts +12 -4
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +94 -58
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +19 -13
  81. package/apps/control-plane/src/application/services/feature-state-service.ts +29 -19
  82. package/apps/control-plane/src/application/services/gate-interpolation-service.ts +7 -2
  83. package/apps/control-plane/src/application/services/gate-service.ts +64 -41
  84. package/apps/control-plane/src/application/services/instance-isolation-service.ts +1 -1
  85. package/apps/control-plane/src/application/services/issue-tracker-service.ts +49 -38
  86. package/apps/control-plane/src/application/services/lock-service.ts +75 -49
  87. package/apps/control-plane/src/application/services/merge-service.ts +91 -50
  88. package/apps/control-plane/src/application/services/notifier-service.ts +42 -20
  89. package/apps/control-plane/src/application/services/patch-service.ts +73 -44
  90. package/apps/control-plane/src/application/services/performance-analytics-service.ts +8 -6
  91. package/apps/control-plane/src/application/services/plan-service.ts +148 -89
  92. package/apps/control-plane/src/application/services/policy-loader-service.ts +10 -4
  93. package/apps/control-plane/src/application/services/pr-monitor-service.ts +33 -14
  94. package/apps/control-plane/src/application/services/qa-index-service.ts +20 -16
  95. package/apps/control-plane/src/application/services/reactions-service.ts +30 -15
  96. package/apps/control-plane/src/application/services/reporting-service.ts +16 -12
  97. package/apps/control-plane/src/application/services/run-lease-service.ts +138 -81
  98. package/apps/control-plane/src/application/tools/tool-metadata.ts +5 -5
  99. package/apps/control-plane/src/application/tools/tool-router.ts +6 -3
  100. package/apps/control-plane/src/cli/aop.ts +2 -2
  101. package/apps/control-plane/src/cli/attach-command-handler.ts +9 -9
  102. package/apps/control-plane/src/cli/cleanup-command-handler.ts +16 -11
  103. package/apps/control-plane/src/cli/cli-argument-parser.ts +6 -3
  104. package/apps/control-plane/src/cli/dashboard-command-handler.ts +28 -8
  105. package/apps/control-plane/src/cli/delete-command-handler.ts +7 -7
  106. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  107. package/apps/control-plane/src/cli/init-command-handler.ts +110 -54
  108. package/apps/control-plane/src/cli/io.ts +7 -3
  109. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  110. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  111. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  112. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  113. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  114. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  115. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  116. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  117. package/apps/control-plane/src/cli/tooling.ts +3 -3
  118. package/apps/control-plane/src/cli/types.ts +1 -1
  119. package/apps/control-plane/src/core/collisions.ts +27 -10
  120. package/apps/control-plane/src/core/constants.ts +13 -7
  121. package/apps/control-plane/src/core/error-codes.ts +1 -1
  122. package/apps/control-plane/src/core/fs.ts +11 -5
  123. package/apps/control-plane/src/core/gates.ts +53 -27
  124. package/apps/control-plane/src/core/git.ts +18 -6
  125. package/apps/control-plane/src/core/kernel.ts +515 -227
  126. package/apps/control-plane/src/core/patch.ts +7 -3
  127. package/apps/control-plane/src/core/path-layout.ts +5 -1
  128. package/apps/control-plane/src/core/path-rules.ts +19 -5
  129. package/apps/control-plane/src/core/qa-index.ts +26 -12
  130. package/apps/control-plane/src/core/response.ts +9 -6
  131. package/apps/control-plane/src/core/schemas.ts +29 -10
  132. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  133. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  134. package/apps/control-plane/src/index.ts +3 -9
  135. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +69 -32
  136. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  137. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  138. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  139. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  140. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  141. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  142. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  143. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  144. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  145. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  146. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  147. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  148. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  149. package/apps/control-plane/src/providers/providers.ts +72 -48
  150. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  151. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  152. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  153. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  154. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  155. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  156. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  157. package/apps/control-plane/src/supervisor/types.ts +22 -7
  158. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  159. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  160. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  161. package/apps/control-plane/test/aop.spec.ts +4 -4
  162. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  163. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  164. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  165. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  166. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  167. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  168. package/apps/control-plane/test/cli.spec.ts +1 -1
  169. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  170. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  171. package/apps/control-plane/test/collisions.spec.ts +30 -30
  172. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  173. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  174. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  175. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  176. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  177. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  178. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  179. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  180. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  181. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  182. package/apps/control-plane/test/gates.spec.ts +101 -81
  183. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  184. package/apps/control-plane/test/helpers.ts +10 -6
  185. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  186. package/apps/control-plane/test/init-wizard.spec.ts +162 -67
  187. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  188. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  189. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  190. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  191. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  192. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  193. package/apps/control-plane/test/kernel.spec.ts +134 -51
  194. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  195. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  196. package/apps/control-plane/test/mcp.spec.ts +231 -115
  197. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  198. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  199. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  200. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  201. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  202. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  203. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  204. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  205. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  206. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  207. package/apps/control-plane/test/providers.spec.ts +133 -102
  208. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  209. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  210. package/apps/control-plane/test/reactions.spec.ts +88 -45
  211. package/apps/control-plane/test/response.spec.ts +5 -5
  212. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  213. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  214. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  215. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  216. package/apps/control-plane/test/services.spec.ts +147 -129
  217. package/apps/control-plane/test/session-management.spec.ts +136 -74
  218. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  219. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  220. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  221. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  222. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  223. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  224. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  225. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  226. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  227. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  228. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  229. package/apps/control-plane/tsconfig.build.json +2 -7
  230. package/apps/control-plane/tsconfig.json +1 -5
  231. package/apps/control-plane/vitest.config.ts +7 -7
  232. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  233. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  234. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  235. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  236. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  237. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  238. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  239. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  240. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  241. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  242. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  243. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  244. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  245. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  246. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  247. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  248. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  249. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  250. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  252. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  254. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  256. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  258. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  260. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  262. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  264. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  266. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  268. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  270. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  271. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  272. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  273. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  274. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  275. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  276. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  277. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  279. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  281. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  282. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  283. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  284. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  285. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  286. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  287. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  288. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  289. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  290. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  291. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  292. package/dist/apps/control-plane/cli/init-command-handler.js +44 -33
  293. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  294. package/dist/apps/control-plane/cli/io.js +2 -2
  295. package/dist/apps/control-plane/cli/io.js.map +1 -1
  296. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  297. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  298. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  299. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  300. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  301. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  302. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  303. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  304. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  305. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  306. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  307. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  308. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/tooling.js +1 -1
  310. package/dist/apps/control-plane/core/collisions.js +11 -8
  311. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  312. package/dist/apps/control-plane/core/constants.js +13 -7
  313. package/dist/apps/control-plane/core/constants.js.map +1 -1
  314. package/dist/apps/control-plane/core/error-codes.js +1 -1
  315. package/dist/apps/control-plane/core/fs.js.map +1 -1
  316. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  317. package/dist/apps/control-plane/core/gates.js +26 -19
  318. package/dist/apps/control-plane/core/gates.js.map +1 -1
  319. package/dist/apps/control-plane/core/git.js +3 -3
  320. package/dist/apps/control-plane/core/git.js.map +1 -1
  321. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  322. package/dist/apps/control-plane/core/kernel.js +134 -81
  323. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  324. package/dist/apps/control-plane/core/patch.js +7 -3
  325. package/dist/apps/control-plane/core/patch.js.map +1 -1
  326. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  327. package/dist/apps/control-plane/core/path-layout.js +4 -1
  328. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  329. package/dist/apps/control-plane/core/path-rules.js +3 -1
  330. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  331. package/dist/apps/control-plane/core/qa-index.js +5 -5
  332. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  333. package/dist/apps/control-plane/core/response.js +3 -3
  334. package/dist/apps/control-plane/core/response.js.map +1 -1
  335. package/dist/apps/control-plane/core/schemas.js +10 -6
  336. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  337. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  338. package/dist/apps/control-plane/index.d.ts +1 -1
  339. package/dist/apps/control-plane/index.js +1 -1
  340. package/dist/apps/control-plane/index.js.map +1 -1
  341. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +31 -20
  342. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  343. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  344. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  345. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  346. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  347. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  348. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  349. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  350. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  351. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  352. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  353. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  355. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  357. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  359. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  361. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  362. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  363. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  364. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  365. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  366. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  367. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  368. package/dist/apps/control-plane/providers/providers.d.ts +1 -1
  369. package/dist/apps/control-plane/providers/providers.js +31 -34
  370. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  371. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  372. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  373. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  374. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  375. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  376. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  377. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  378. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  379. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  380. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  381. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  383. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  385. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  387. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  388. package/eslint.config.mjs +20 -20
  389. package/example-configurations/README.md +1 -1
  390. package/example-configurations/java/agents.yaml +3 -3
  391. package/example-configurations/java/policy.yaml +1 -1
  392. package/example-configurations/node/agents.yaml +3 -3
  393. package/example-configurations/node/policy.yaml +1 -1
  394. package/package.json +10 -5
  395. package/packages/web-dashboard/next.config.js +2 -2
  396. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  397. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  398. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  399. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  400. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  401. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  402. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  403. package/packages/web-dashboard/src/app/globals.css +10 -2
  404. package/packages/web-dashboard/src/app/page.tsx +100 -37
  405. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  406. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  407. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  408. package/packages/web-dashboard/tsconfig.json +3 -11
  409. package/scripts/nx-safe.mjs +10 -10
  410. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  411. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +187 -90
  412. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  413. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  414. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  415. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  416. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  417. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  418. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  419. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  420. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  421. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  422. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  423. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  424. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  425. package/spec-files/progress.md +186 -175
  426. package/tsconfig.json +2 -8
@@ -6,11 +6,14 @@ import type {
6
6
  FeatureOrchestrationPort,
7
7
  FeatureStatePayload,
8
8
  SupervisorRuntimeState,
9
- SupervisorToolCaller
9
+ SupervisorToolCaller,
10
10
  } from './types.js';
11
11
  import { UNASSIGNED_SESSION_ID } from './types.js';
12
12
  import { NOOP_WORKER_DECISION_RUNNER, type WorkerDecisionRunner } from './worker-decision-loop.js';
13
- import type { GateRepairContext, ReactionsService } from '../application/services/reactions-service.js';
13
+ import type {
14
+ GateRepairContext,
15
+ ReactionsService,
16
+ } from '../application/services/reactions-service.js';
14
17
 
15
18
  interface GatesRunData {
16
19
  overall?: string;
@@ -52,9 +55,13 @@ export class QaWaveExecutor {
52
55
  async run(featureIds: string[], maxParallelGateRuns: number): Promise<void> {
53
56
  const batch: string[] = [];
54
57
  for (const featureId of featureIds) {
55
- const state = await this.toolCaller.callTool<FeatureStatePayload>('qa', TOOLS.FEATURE_STATE_GET, {
56
- feature_id: featureId
57
- });
58
+ const state = await this.toolCaller.callTool<FeatureStatePayload>(
59
+ 'qa',
60
+ TOOLS.FEATURE_STATE_GET,
61
+ {
62
+ feature_id: featureId,
63
+ },
64
+ );
58
65
 
59
66
  if (state.data.front_matter.status === STATUS.QA) {
60
67
  batch.push(featureId);
@@ -63,19 +70,23 @@ export class QaWaveExecutor {
63
70
 
64
71
  for (const featureId of batch.slice(0, maxParallelGateRuns)) {
65
72
  const context = await this.toolCaller.callTool('qa', TOOLS.FEATURE_GET_CONTEXT, {
66
- feature_id: featureId
73
+ feature_id: featureId,
67
74
  });
68
75
  await this.workerDecisionRunner.execute({
69
76
  role: 'qa',
70
77
  featureId,
71
78
  contextBundle: context.data,
72
79
  instructions:
73
- 'Emit PATCH outputs for deterministic QA remediations, NOTE outputs for findings, and REQUEST outputs for lock/context needs.'
80
+ 'Emit PATCH outputs for deterministic QA remediations, NOTE outputs for findings, and REQUEST outputs for lock/context needs.',
74
81
  });
75
82
 
76
- const stateForRetry = await this.toolCaller.callTool<FeatureStatePayload>('qa', TOOLS.FEATURE_STATE_GET, {
77
- feature_id: featureId
78
- });
83
+ const stateForRetry = await this.toolCaller.callTool<FeatureStatePayload>(
84
+ 'qa',
85
+ TOOLS.FEATURE_STATE_GET,
86
+ {
87
+ feature_id: featureId,
88
+ },
89
+ );
79
90
  const initialRetryCount = stateForRetry.data.front_matter.gate_retry_count ?? 0;
80
91
 
81
92
  let gateOverall: string;
@@ -88,7 +99,7 @@ export class QaWaveExecutor {
88
99
  const gateResult = await this.toolCaller.callTool<GatesRunData>('qa', TOOLS.GATES_RUN, {
89
100
  feature_id: featureId,
90
101
  profile: null,
91
- mode: 'full'
102
+ mode: 'full',
92
103
  });
93
104
  gateOverall = gateResult.data.overall ?? GATE_RESULT.PASS;
94
105
  gateExitCode = gateOverall === GATE_RESULT.FAIL ? 1 : 0;
@@ -108,7 +119,7 @@ export class QaWaveExecutor {
108
119
  evidence_summary: gateEvidencePath,
109
120
  logs_excerpt: gateLogs.slice(0, 800),
110
121
  failed_at: new Date().toISOString(),
111
- retry_delay_ms: this.reactionsService?.retryDelayMs()
122
+ retry_delay_ms: this.reactionsService?.retryDelayMs(),
112
123
  });
113
124
  }
114
125
 
@@ -127,22 +138,26 @@ export class QaWaveExecutor {
127
138
  logs: gateLogs,
128
139
  evidenceSummary: gateEvidencePath,
129
140
  retryCount,
130
- failureHistory
141
+ failureHistory,
131
142
  };
132
143
  const repairPrompt = this.reactionsService.buildRepairPrompt(ctx);
133
144
  await this.workerDecisionRunner.execute({
134
145
  role: 'qa',
135
146
  featureId,
136
147
  contextBundle: context.data,
137
- instructions: repairPrompt
148
+ instructions: repairPrompt,
138
149
  });
139
150
 
140
151
  try {
141
- const retryResult = await this.toolCaller.callTool<GatesRunData>('qa', TOOLS.GATES_RUN, {
142
- feature_id: featureId,
143
- profile: null,
144
- mode: 'full'
145
- });
152
+ const retryResult = await this.toolCaller.callTool<GatesRunData>(
153
+ 'qa',
154
+ TOOLS.GATES_RUN,
155
+ {
156
+ feature_id: featureId,
157
+ profile: null,
158
+ mode: 'full',
159
+ },
160
+ );
146
161
  gateOverall = retryResult.data.overall ?? GATE_RESULT.PASS;
147
162
  gateExitCode = gateOverall === GATE_RESULT.FAIL ? 1 : 0;
148
163
  gateEvidencePath = retryResult.data.evidence_path ?? gateEvidencePath;
@@ -165,7 +180,7 @@ export class QaWaveExecutor {
165
180
  evidence_summary: gateEvidencePath,
166
181
  logs_excerpt: gateLogs.slice(0, 800),
167
182
  failed_at: new Date().toISOString(),
168
- retry_delay_ms: retryDelayMs
183
+ retry_delay_ms: retryDelayMs,
169
184
  });
170
185
  }
171
186
 
@@ -182,7 +197,7 @@ export class QaWaveExecutor {
182
197
  logs: gateLogs,
183
198
  evidenceSummary: gateEvidencePath,
184
199
  retryCount,
185
- failureHistory
200
+ failureHistory,
186
201
  };
187
202
  await this.reactionsService.notifyEscalation(featureId, escalateCtx);
188
203
  }
@@ -205,12 +220,12 @@ export class QaWaveExecutor {
205
220
  feature_id: featureId,
206
221
  planner_session_id: sessions?.planner ?? UNASSIGNED_SESSION_ID,
207
222
  builder_session_id: sessions?.builder ?? UNASSIGNED_SESSION_ID,
208
- qa_session_id: newQa.session_id
223
+ qa_session_id: newQa.session_id,
209
224
  });
210
225
 
211
226
  await this.featureClusterPatcher.patchFeatureCluster(featureId, {
212
227
  orchestrator_session_id: this.state.orchestratorSessionId ?? 'unknown',
213
- qa_session_id: newQa.session_id
228
+ qa_session_id: newQa.session_id,
214
229
  });
215
230
  }
216
231
  }
@@ -6,7 +6,7 @@ import type {
6
6
  FeatureOrchestrationPort,
7
7
  RuntimeStateReader,
8
8
  SupervisorRuntimeState,
9
- SupervisorToolCaller
9
+ SupervisorToolCaller,
10
10
  } from './types.js';
11
11
  import { type SessionOrchestrator } from './session-orchestrator.js';
12
12
  import { type PlanningWaveExecutor } from './planning-wave-executor.js';
@@ -59,7 +59,11 @@ export class RunCoordinator {
59
59
  private readonly prMonitor: PrMonitorService | undefined;
60
60
  private readonly issueTracker: IssueTracker | undefined;
61
61
  private readonly statusCache: Map<string, string>;
62
- private static readonly TERMINAL_STATUSES = new Set<string>([STATUS.MERGED, STATUS.FAILED, STATUS.PAUSED_BUDGET]);
62
+ private static readonly TERMINAL_STATUSES = new Set<string>([
63
+ STATUS.MERGED,
64
+ STATUS.FAILED,
65
+ STATUS.PAUSED_BUDGET,
66
+ ]);
63
67
 
64
68
  constructor(dependencies: RunCoordinatorDependencies) {
65
69
  this.kernel = dependencies.kernel;
@@ -93,7 +97,7 @@ export class RunCoordinator {
93
97
  provider: this.provider.selection.provider,
94
98
  model: this.provider.selection.model,
95
99
  provider_config_ref_hash: this.providerConfigRefHash(),
96
- takeover_stale_run: this.takeoverStaleRun
100
+ takeover_stale_run: this.takeoverStaleRun,
97
101
  });
98
102
 
99
103
  this.state.runMetadata.took_over_stale = Boolean(leaseResult.data.took_over_stale);
@@ -109,7 +113,7 @@ export class RunCoordinator {
109
113
  await this.kernel.pruneFeatureSessionAssignments({
110
114
  run_id: this.state.runId,
111
115
  owner_instance_id: this.state.ownerInstanceId,
112
- active_feature_ids: scopedFeatureIds
116
+ active_feature_ids: scopedFeatureIds,
113
117
  });
114
118
 
115
119
  activeFeatureIds = await this.rebalanceActiveFeatures(activeFeatureIds);
@@ -119,7 +123,10 @@ export class RunCoordinator {
119
123
  break;
120
124
  }
121
125
  await this.leaseHeartbeatService.renew();
122
- activeFeatureIds = await this.applyOrchestratorPrioritization(activeFeatureIds, iteration + 1);
126
+ activeFeatureIds = await this.applyOrchestratorPrioritization(
127
+ activeFeatureIds,
128
+ iteration + 1,
129
+ );
123
130
  // N3: Check budget before waves; pause over-budget features
124
131
  activeFeatureIds = await this.pauseOverBudgetFeatures(activeFeatureIds);
125
132
  await this.planningWaveExecutor.run(activeFeatureIds);
@@ -139,8 +146,8 @@ export class RunCoordinator {
139
146
  queue_depth: this.state.queue.length,
140
147
  run_metadata: {
141
148
  ...this.state.runMetadata,
142
- runtime_sessions: runtimeSessions
143
- }
149
+ runtime_sessions: runtimeSessions,
150
+ },
144
151
  };
145
152
  }
146
153
 
@@ -149,17 +156,22 @@ export class RunCoordinator {
149
156
  for (const featureId of activeFeatureIds) {
150
157
  const budgetCheck = await this.kernel.checkBudget(featureId);
151
158
  if (budgetCheck.over_budget) {
152
- await this.kernel.updateState(featureId, null, (_fm) => Promise.resolve({
153
- frontMatter: {
154
- status: STATUS.PAUSED_BUDGET,
155
- status_reason: `Feature paused: estimated cost $${budgetCheck.current_cost_usd.toFixed(4)} exceeds budget limit $${budgetCheck.limit_usd.toFixed(2)}`
156
- }
157
- }));
159
+ await this.kernel.updateState(featureId, null, (_fm) =>
160
+ Promise.resolve({
161
+ frontMatter: {
162
+ status: STATUS.PAUSED_BUDGET,
163
+ status_reason: `Feature paused: estimated cost $${budgetCheck.current_cost_usd.toFixed(4)} exceeds budget limit $${budgetCheck.limit_usd.toFixed(2)}`,
164
+ },
165
+ }),
166
+ );
158
167
  if (this.notifier) {
159
168
  await this.notifier.notify('budget_exceeded', {
160
169
  feature_id: featureId,
161
170
  message: `Budget exceeded for ${featureId}: $${budgetCheck.current_cost_usd.toFixed(4)} >= $${budgetCheck.limit_usd.toFixed(2)}`,
162
- details: { current_cost_usd: budgetCheck.current_cost_usd, limit_usd: budgetCheck.limit_usd }
171
+ details: {
172
+ current_cost_usd: budgetCheck.current_cost_usd,
173
+ limit_usd: budgetCheck.limit_usd,
174
+ },
163
175
  });
164
176
  }
165
177
  await this.sessionOrchestrator.closeFeatureCluster(featureId);
@@ -169,7 +181,11 @@ export class RunCoordinator {
169
181
  await this.notifier.notify('budget_alert', {
170
182
  feature_id: featureId,
171
183
  message: `Budget alert for ${featureId}: $${budgetCheck.current_cost_usd.toFixed(4)} (${Math.round(budgetCheck.alert_threshold * 100)}% of $${budgetCheck.limit_usd.toFixed(2)})`,
172
- details: { current_cost_usd: budgetCheck.current_cost_usd, limit_usd: budgetCheck.limit_usd, alert_threshold: budgetCheck.alert_threshold }
184
+ details: {
185
+ current_cost_usd: budgetCheck.current_cost_usd,
186
+ limit_usd: budgetCheck.limit_usd,
187
+ alert_threshold: budgetCheck.alert_threshold,
188
+ },
173
189
  });
174
190
  }
175
191
  }
@@ -190,7 +206,10 @@ export class RunCoordinator {
190
206
  survivingActiveFeatureIds.push(featureId);
191
207
  }
192
208
 
193
- while (survivingActiveFeatureIds.length < this.maxActiveFeatures && this.state.queue.length > 0) {
209
+ while (
210
+ survivingActiveFeatureIds.length < this.maxActiveFeatures &&
211
+ this.state.queue.length > 0
212
+ ) {
194
213
  const nextFeature = this.state.queue.shift();
195
214
  if (!nextFeature) {
196
215
  break;
@@ -206,17 +225,20 @@ export class RunCoordinator {
206
225
  survivingActiveFeatureIds.push(nextFeature.feature_id);
207
226
  }
208
227
 
209
- const activeFeatureIds = [...new Set(survivingActiveFeatureIds)].sort((a, b) => a.localeCompare(b));
210
- const scopedFeatureIds = [...activeFeatureIds, ...this.state.queue.map((item) => item.feature_id)].sort((a, b) =>
211
- a.localeCompare(b)
228
+ const activeFeatureIds = [...new Set(survivingActiveFeatureIds)].sort((a, b) =>
229
+ a.localeCompare(b),
212
230
  );
231
+ const scopedFeatureIds = [
232
+ ...activeFeatureIds,
233
+ ...this.state.queue.map((item) => item.feature_id),
234
+ ].sort((a, b) => a.localeCompare(b));
213
235
 
214
236
  await this.sessionOrchestrator.reconcileQueuedFeatures(this.state.queue);
215
237
  await this.sessionOrchestrator.enforceActiveFeatureInvariant(activeFeatureIds);
216
238
  await this.kernel.pruneFeatureSessionAssignments({
217
239
  run_id: this.state.runId,
218
240
  owner_instance_id: this.state.ownerInstanceId,
219
- active_feature_ids: scopedFeatureIds
241
+ active_feature_ids: scopedFeatureIds,
220
242
  });
221
243
 
222
244
  return activeFeatureIds;
@@ -227,12 +249,16 @@ export class RunCoordinator {
227
249
  }
228
250
 
229
251
  private async readFeatureStateSnapshot(
230
- featureId: string
252
+ featureId: string,
231
253
  ): Promise<{ status: string | null; branch: string; hasPr: boolean }> {
232
254
  try {
233
- const state = await this.toolCaller.callTool<FeatureStatePayload>('orchestrator', TOOLS.FEATURE_STATE_GET, {
234
- feature_id: featureId
235
- });
255
+ const state = await this.toolCaller.callTool<FeatureStatePayload>(
256
+ 'orchestrator',
257
+ TOOLS.FEATURE_STATE_GET,
258
+ {
259
+ feature_id: featureId,
260
+ },
261
+ );
236
262
  const frontMatter = RunCoordinator.asRecord(state.data.front_matter);
237
263
  const status = typeof frontMatter.status === 'string' ? frontMatter.status : null;
238
264
  const prValue = frontMatter.pr;
@@ -262,7 +288,8 @@ export class RunCoordinator {
262
288
  continue;
263
289
  }
264
290
  const prevStatus = this.statusCache.get(featureId);
265
- const shouldPollPr = this.prMonitor && (newStatus === STATUS.READY_TO_MERGE || snapshot.hasPr);
291
+ const shouldPollPr =
292
+ this.prMonitor && (newStatus === STATUS.READY_TO_MERGE || snapshot.hasPr);
266
293
  if (prevStatus === newStatus && shouldPollPr) {
267
294
  await this.prMonitor.checkAndUpdate(featureId, snapshot.branch);
268
295
  }
@@ -275,12 +302,12 @@ export class RunCoordinator {
275
302
  const event = prevStatus === STATUS.PLANNING ? 'collision_detected' : 'gate_failed';
276
303
  await this.notifier.notify(event, {
277
304
  feature_id: featureId,
278
- message: `Feature ${featureId} blocked (event: ${event})`
305
+ message: `Feature ${featureId} blocked (event: ${event})`,
279
306
  });
280
307
  } else if (newStatus === STATUS.READY_TO_MERGE) {
281
308
  await this.notifier.notify('ready_to_merge', {
282
309
  feature_id: featureId,
283
- message: `Feature ${featureId} is ready to merge`
310
+ message: `Feature ${featureId} is ready to merge`,
284
311
  });
285
312
  if (shouldPollPr) {
286
313
  await this.prMonitor.checkAndUpdate(featureId, snapshot.branch);
@@ -288,7 +315,7 @@ export class RunCoordinator {
288
315
  } else if (newStatus === STATUS.MERGED) {
289
316
  await this.notifier.notify('feature_merged', {
290
317
  feature_id: featureId,
291
- message: `Feature ${featureId} was merged`
318
+ message: `Feature ${featureId} was merged`,
292
319
  });
293
320
  }
294
321
  }
@@ -298,8 +325,14 @@ export class RunCoordinator {
298
325
  }
299
326
  }
300
327
 
301
- private async syncIssueTrackerStatus(featureId: string, status: string, prevStatus: string | undefined): Promise<void> {
302
- if (!this.issueTracker) {return;}
328
+ private async syncIssueTrackerStatus(
329
+ featureId: string,
330
+ status: string,
331
+ prevStatus: string | undefined,
332
+ ): Promise<void> {
333
+ if (!this.issueTracker) {
334
+ return;
335
+ }
303
336
  const issueId = featureId.replace(/^feature[/_]/, '');
304
337
  if (status === STATUS.PLANNING && prevStatus === undefined) {
305
338
  // Spec enrichment: fetch issue context when planning starts, store in frontmatter
@@ -310,20 +343,22 @@ export class RunCoordinator {
310
343
  title: issue.title,
311
344
  body: issue.body,
312
345
  status: issue.status,
313
- url: issue.url
346
+ url: issue.url,
314
347
  };
315
348
  await this.kernel.updateState(featureId, null, (fm) =>
316
- Promise.resolve({ frontMatter: { ...fm, issue_context: issueCtx } })
349
+ Promise.resolve({ frontMatter: { ...fm, issue_context: issueCtx } }),
317
350
  );
318
351
  }
319
352
  }
320
- await this.issueTracker.addComment(issueId, `AOP: feature status changed to \`${status}\``).catch(() => undefined);
353
+ await this.issueTracker
354
+ .addComment(issueId, `AOP: feature status changed to \`${status}\``)
355
+ .catch(() => undefined);
321
356
  await this.issueTracker.updateIssueStatus(issueId, status).catch(() => undefined);
322
357
  }
323
358
 
324
359
  private async applyOrchestratorPrioritization(
325
360
  activeFeatureIds: string[],
326
- iteration: number
361
+ iteration: number,
327
362
  ): Promise<string[]> {
328
363
  if (activeFeatureIds.length < 2) {
329
364
  return activeFeatureIds;
@@ -335,10 +370,10 @@ export class RunCoordinator {
335
370
  contextBundle: {
336
371
  iteration,
337
372
  active_feature_ids: activeFeatureIds,
338
- queued_feature_ids: this.state.queue.map((item) => item.feature_id)
373
+ queued_feature_ids: this.state.queue.map((item) => item.feature_id),
339
374
  },
340
375
  instructions:
341
- 'Decide per-iteration prioritization. Emit REQUEST action=prioritize with feature_order to reprioritize active features.'
376
+ 'Decide per-iteration prioritization. Emit REQUEST action=prioritize with feature_order to reprioritize active features.',
342
377
  });
343
378
 
344
379
  if (decision.priorityOrder.length === 0) {
@@ -21,7 +21,7 @@ import {
21
21
  NOTIFICATION_CHANNEL_SLOT,
22
22
  ACTIVITY_DETECTOR_SLOT,
23
23
  SCM_PROVIDER_SLOT,
24
- type AdapterSlot
24
+ type AdapterSlot,
25
25
  } from '../application/adapters/adapter-registry.js';
26
26
  import type { ReactionsPolicy } from '../application/services/reactions-service.js';
27
27
  import type {
@@ -36,7 +36,7 @@ import type {
36
36
  SupervisorOptions,
37
37
  SupervisorRuntimeState,
38
38
  SupervisorToolCaller,
39
- WorkerSessions
39
+ WorkerSessions,
40
40
  } from './types.js';
41
41
 
42
42
  type NamedContract = { name: string };
@@ -44,9 +44,10 @@ type NamedContract = { name: string };
44
44
  function resolveAdapterName(
45
45
  slot: AdapterSlot<NamedContract>,
46
46
  configuredValue: unknown,
47
- fallback: string | null
47
+ fallback: string | null,
48
48
  ): string | null {
49
- const configured = typeof configuredValue === 'string' && configuredValue.length > 0 ? configuredValue : null;
49
+ const configured =
50
+ typeof configuredValue === 'string' && configuredValue.length > 0 ? configuredValue : null;
50
51
  const candidate = configured ?? fallback;
51
52
  if (!candidate) {
52
53
  return null;
@@ -91,24 +92,40 @@ export class SupervisorRuntime
91
92
  kernel: SupervisorKernelPort,
92
93
  provider: WorkerProvider,
93
94
  toolClient: ToolClient,
94
- options: SupervisorOptions = {}
95
+ options: SupervisorOptions = {},
95
96
  ) {
96
97
  this.kernel = kernel;
97
98
  this.provider = provider;
98
99
  this.toolClient = toolClient;
99
100
  this.maxActiveFeatures = options.max_active_features ?? 5;
100
101
  this.maxParallelGateRuns = this.resolveMaxParallelGateRuns(options.max_parallel_gate_runs);
101
- this.maxIterationsPerPhase = this.resolveMaxIterationsPerPhase(options.max_iterations_per_phase);
102
+ this.maxIterationsPerPhase = this.resolveMaxIterationsPerPhase(
103
+ options.max_iterations_per_phase,
104
+ );
102
105
  this.takeoverStaleRun = Boolean(options.takeover_stale_run);
103
106
  const runId = options.run_id ?? `run:${Date.now()}`;
104
- const ownerInstanceId = options.owner_instance_id ?? `supervisor:${process.pid}:${crypto.randomUUID()}`;
107
+ const ownerInstanceId =
108
+ options.owner_instance_id ?? `supervisor:${process.pid}:${crypto.randomUUID()}`;
105
109
  const adaptersConfig =
106
- typeof (this.kernel as { getAdaptersConfig?: () => Record<string, unknown> }).getAdaptersConfig === 'function'
110
+ typeof (this.kernel as { getAdaptersConfig?: () => Record<string, unknown> })
111
+ .getAdaptersConfig === 'function'
107
112
  ? this.kernel.getAdaptersConfig()
108
113
  : {};
109
- const notificationChannel = resolveAdapterName(NOTIFICATION_CHANNEL_SLOT, adaptersConfig['notification-channel'], null);
110
- const activityDetector = resolveAdapterName(ACTIVITY_DETECTOR_SLOT, adaptersConfig['activity-detector'], 'claude-jsonl');
111
- const scmProvider = resolveAdapterName(SCM_PROVIDER_SLOT, adaptersConfig['scm-provider'], 'github');
114
+ const notificationChannel = resolveAdapterName(
115
+ NOTIFICATION_CHANNEL_SLOT,
116
+ adaptersConfig['notification-channel'],
117
+ null,
118
+ );
119
+ const activityDetector = resolveAdapterName(
120
+ ACTIVITY_DETECTOR_SLOT,
121
+ adaptersConfig['activity-detector'],
122
+ 'claude-jsonl',
123
+ );
124
+ const scmProvider = resolveAdapterName(
125
+ SCM_PROVIDER_SLOT,
126
+ adaptersConfig['scm-provider'],
127
+ 'github',
128
+ );
112
129
 
113
130
  this.state = {
114
131
  runId,
@@ -124,9 +141,9 @@ export class SupervisorRuntime
124
141
  adapters: {
125
142
  notification_channel: notificationChannel,
126
143
  activity_detector: activityDetector,
127
- scm_provider: scmProvider
128
- }
129
- }
144
+ scm_provider: scmProvider,
145
+ },
146
+ },
130
147
  };
131
148
 
132
149
  this.promptBundleLoader = new PromptBundleLoader(this.kernel);
@@ -136,7 +153,7 @@ export class SupervisorRuntime
136
153
  provider: this.provider,
137
154
  promptProvider: this,
138
155
  toolCaller: this,
139
- state: this.state
156
+ state: this.state,
140
157
  });
141
158
 
142
159
  const notifier = createNotifierService(this.kernel.getPolicySnapshot(), notificationChannel);
@@ -144,7 +161,7 @@ export class SupervisorRuntime
144
161
  const reactionsService = new ReactionsService({
145
162
  toolCaller: this,
146
163
  notifier,
147
- policy: reactionsPolicy
164
+ policy: reactionsPolicy,
148
165
  });
149
166
 
150
167
  const activityMonitor = new ActivityMonitorService({
@@ -152,7 +169,7 @@ export class SupervisorRuntime
152
169
  notifier,
153
170
  reactionsPolicy,
154
171
  idleThresholdMs: this.resolveActivityIdleThresholdMs(),
155
- detectorName: activityDetector ?? 'claude-jsonl'
172
+ detectorName: activityDetector ?? 'claude-jsonl',
156
173
  });
157
174
 
158
175
  const prMonitor =
@@ -161,33 +178,34 @@ export class SupervisorRuntime
161
178
  toolCaller: this,
162
179
  notifier,
163
180
  reactionsPolicy,
164
- ghRunner: createGhRunner()
181
+ ghRunner: createGhRunner(),
165
182
  })
166
183
  : undefined;
167
184
 
168
185
  const policy = this.kernel.getPolicySnapshot();
169
186
  const rawIssueTrackerConfig = policy['issue_tracker'];
170
- const issueTrackerConfig = typeof rawIssueTrackerConfig === 'object' && rawIssueTrackerConfig !== null
171
- ? (rawIssueTrackerConfig as { type: string; config?: Record<string, string> })
172
- : undefined;
187
+ const issueTrackerConfig =
188
+ typeof rawIssueTrackerConfig === 'object' && rawIssueTrackerConfig !== null
189
+ ? (rawIssueTrackerConfig as { type: string; config?: Record<string, string> })
190
+ : undefined;
173
191
  const issueTracker = createIssueTracker(issueTrackerConfig);
174
192
 
175
193
  this.workerDecisionLoop = new WorkerDecisionLoop({
176
194
  provider: this.provider,
177
195
  toolCaller: this,
178
- activityMonitor
196
+ activityMonitor,
179
197
  });
180
198
 
181
199
  this.planningWaveExecutor = new PlanningWaveExecutor({
182
200
  toolCaller: this,
183
201
  planGenerator: this,
184
- workerDecisionRunner: this.workerDecisionLoop
202
+ workerDecisionRunner: this.workerDecisionLoop,
185
203
  });
186
204
 
187
205
  this.buildWaveExecutor = new BuildWaveExecutor({
188
206
  toolCaller: this,
189
207
  workerDecisionRunner: this.workerDecisionLoop,
190
- reactionsService
208
+ reactionsService,
191
209
  });
192
210
 
193
211
  this.qaWaveExecutor = new QaWaveExecutor({
@@ -198,12 +216,12 @@ export class SupervisorRuntime
198
216
  featureClusterPatcher: this,
199
217
  state: this.state,
200
218
  workerDecisionRunner: this.workerDecisionLoop,
201
- reactionsService
219
+ reactionsService,
202
220
  });
203
221
 
204
222
  this.leaseHeartbeatService = new LeaseHeartbeatService({
205
223
  kernel: this.kernel,
206
- state: this.state
224
+ state: this.state,
207
225
  });
208
226
 
209
227
  this.runCoordinator = new RunCoordinator({
@@ -224,7 +242,7 @@ export class SupervisorRuntime
224
242
  workerDecisionRunner: this.workerDecisionLoop,
225
243
  notifier,
226
244
  prMonitor,
227
- issueTracker
245
+ issueTracker,
228
246
  });
229
247
  }
230
248
 
@@ -369,7 +387,10 @@ export class SupervisorRuntime
369
387
  await this.sessionOrchestrator.enforceActiveFeatureInvariant(activeFeatureIds);
370
388
  }
371
389
 
372
- async patchFeatureCluster(featureId: string, clusterPatch: Record<string, string>): Promise<void> {
390
+ async patchFeatureCluster(
391
+ featureId: string,
392
+ clusterPatch: Record<string, string>,
393
+ ): Promise<void> {
373
394
  await this.sessionOrchestrator.patchFeatureCluster(featureId, clusterPatch);
374
395
  }
375
396
 
@@ -398,7 +419,10 @@ export class SupervisorRuntime
398
419
  }
399
420
 
400
421
  async generateInitialPlan(featureId: string): Promise<Record<string, unknown>> {
401
- const baseRef = await this.kernel.repoDiff(featureId, ['--stat']).then(() => 'HEAD').catch(() => 'HEAD');
422
+ const baseRef = await this.kernel
423
+ .repoDiff(featureId, ['--stat'])
424
+ .then(() => 'HEAD')
425
+ .catch(() => 'HEAD');
402
426
  return {
403
427
  feature_id: featureId,
404
428
  plan_version: 1,
@@ -409,15 +433,15 @@ export class SupervisorRuntime
409
433
  files: {
410
434
  create: [],
411
435
  modify: [],
412
- delete: []
436
+ delete: [],
413
437
  },
414
438
  contracts: {
415
439
  openapi: 'none',
416
440
  events: 'none',
417
- db: 'none'
441
+ db: 'none',
418
442
  },
419
443
  acceptance_criteria: ['Feature has deterministic plan and passes configured gate profile.'],
420
- gate_profile: 'default'
444
+ gate_profile: 'default',
421
445
  };
422
446
  }
423
447
 
@@ -451,7 +475,7 @@ export class SupervisorRuntime
451
475
  async callTool<TData = Record<string, unknown>>(
452
476
  role: RuntimeRole,
453
477
  toolName: string,
454
- args: Record<string, unknown>
478
+ args: Record<string, unknown>,
455
479
  ): Promise<{ ok: true; data: TData }> {
456
480
  const payload = withOperationIdIfRequired(toolName, args, createOperationId);
457
481
  const roleSessionId = this.resolveRoleSessionId(role, payload);
@@ -460,11 +484,11 @@ export class SupervisorRuntime
460
484
  run_id: this.state.runId,
461
485
  session_id: roleSessionId ?? `bootstrap:${role}`,
462
486
  actor_type: role,
463
- actor_id: `supervisor:${role}`
487
+ actor_id: `supervisor:${role}`,
464
488
  });
465
489
 
466
490
  if (response.ok === false) {
467
- const normalized = (response).error;
491
+ const normalized = response.error;
468
492
  const error = new Error(normalized.message) as AppError;
469
493
  error.code = normalized.code;
470
494
  error.details = normalized.details;