agentic-orchestrator 0.1.6 → 0.1.8

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 (438) hide show
  1. package/.prettierignore +10 -0
  2. package/.prettierrc.json +24 -0
  3. package/CLAUDE.md +3 -2
  4. package/README.md +71 -48
  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 +5 -22
  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/env-file.ts +115 -0
  107. package/apps/control-plane/src/cli/help-command-handler.ts +61 -32
  108. package/apps/control-plane/src/cli/init-command-handler.ts +182 -56
  109. package/apps/control-plane/src/cli/io.ts +7 -3
  110. package/apps/control-plane/src/cli/resume-command-handler.ts +21 -13
  111. package/apps/control-plane/src/cli/retry-command-handler.ts +12 -11
  112. package/apps/control-plane/src/cli/run-command-handler.ts +12 -8
  113. package/apps/control-plane/src/cli/send-command-handler.ts +6 -6
  114. package/apps/control-plane/src/cli/spec-ingestion-service.ts +14 -8
  115. package/apps/control-plane/src/cli/spec-input-resolver.ts +6 -1
  116. package/apps/control-plane/src/cli/spec-utils.ts +2 -2
  117. package/apps/control-plane/src/cli/status-command-handler.ts +13 -12
  118. package/apps/control-plane/src/cli/tooling.ts +3 -3
  119. package/apps/control-plane/src/cli/types.ts +1 -1
  120. package/apps/control-plane/src/core/collisions.ts +27 -10
  121. package/apps/control-plane/src/core/constants.ts +13 -7
  122. package/apps/control-plane/src/core/error-codes.ts +1 -1
  123. package/apps/control-plane/src/core/fs.ts +11 -5
  124. package/apps/control-plane/src/core/gates.ts +53 -27
  125. package/apps/control-plane/src/core/git.ts +18 -6
  126. package/apps/control-plane/src/core/kernel.ts +513 -227
  127. package/apps/control-plane/src/core/patch.ts +7 -3
  128. package/apps/control-plane/src/core/path-layout.ts +5 -1
  129. package/apps/control-plane/src/core/path-rules.ts +19 -5
  130. package/apps/control-plane/src/core/qa-index.ts +26 -12
  131. package/apps/control-plane/src/core/response.ts +9 -6
  132. package/apps/control-plane/src/core/schemas.ts +29 -10
  133. package/apps/control-plane/src/core/tool-caller.ts +1 -1
  134. package/apps/control-plane/src/core/workspace-hooks.ts +5 -5
  135. package/apps/control-plane/src/index.ts +3 -9
  136. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +79 -35
  137. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +7 -3
  138. package/apps/control-plane/src/mcp/mcp-server-adapter.ts +12 -10
  139. package/apps/control-plane/src/mcp/operation-ledger.ts +18 -8
  140. package/apps/control-plane/src/mcp/protocol-contract.ts +2 -2
  141. package/apps/control-plane/src/mcp/runtime-factory.ts +15 -6
  142. package/apps/control-plane/src/mcp/token-auth-verifier.ts +3 -2
  143. package/apps/control-plane/src/mcp/token-claims-validator.ts +11 -7
  144. package/apps/control-plane/src/mcp/tool-authorizer.ts +1 -3
  145. package/apps/control-plane/src/mcp/tool-client.ts +17 -5
  146. package/apps/control-plane/src/mcp/tool-contract-validator.ts +17 -8
  147. package/apps/control-plane/src/mcp/tool-registry-loader.ts +7 -3
  148. package/apps/control-plane/src/mcp/tool-runtime.ts +66 -39
  149. package/apps/control-plane/src/mcp/tools-markdown-generator.ts +6 -1
  150. package/apps/control-plane/src/providers/providers.ts +137 -54
  151. package/apps/control-plane/src/supervisor/build-wave-executor.ts +44 -25
  152. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +46 -33
  153. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +1 -1
  154. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +38 -23
  155. package/apps/control-plane/src/supervisor/run-coordinator.ts +71 -36
  156. package/apps/control-plane/src/supervisor/runtime.ts +59 -35
  157. package/apps/control-plane/src/supervisor/session-orchestrator.ts +48 -31
  158. package/apps/control-plane/src/supervisor/types.ts +22 -7
  159. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +30 -20
  160. package/apps/control-plane/test/activity-monitor.spec.ts +54 -30
  161. package/apps/control-plane/test/adapter-registry.spec.ts +5 -5
  162. package/apps/control-plane/test/aop.spec.ts +4 -4
  163. package/apps/control-plane/test/batch-operations.spec.ts +20 -18
  164. package/apps/control-plane/test/bootstrap-attach.spec.ts +52 -19
  165. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +58 -27
  166. package/apps/control-plane/test/bootstrap.spec.ts +72 -40
  167. package/apps/control-plane/test/cleanup-command.spec.ts +86 -32
  168. package/apps/control-plane/test/cli-helpers.spec.ts +119 -66
  169. package/apps/control-plane/test/cli.spec.ts +1 -1
  170. package/apps/control-plane/test/cli.unit.spec.ts +226 -167
  171. package/apps/control-plane/test/collision-queue.spec.ts +49 -40
  172. package/apps/control-plane/test/collisions.spec.ts +30 -30
  173. package/apps/control-plane/test/core-utils.spec.ts +29 -15
  174. package/apps/control-plane/test/cost-tracking.spec.ts +38 -22
  175. package/apps/control-plane/test/dashboard-api.integration.spec.ts +68 -36
  176. package/apps/control-plane/test/dashboard-client.spec.ts +18 -12
  177. package/apps/control-plane/test/dashboard-command.spec.ts +11 -7
  178. package/apps/control-plane/test/delete-command-handler.spec.ts +49 -41
  179. package/apps/control-plane/test/dependency-scheduler.spec.ts +47 -20
  180. package/apps/control-plane/test/epoch-tracking.spec.ts +9 -9
  181. package/apps/control-plane/test/feature-deletion-service.spec.ts +60 -52
  182. package/apps/control-plane/test/feature-lifecycle.spec.ts +36 -17
  183. package/apps/control-plane/test/gates.spec.ts +101 -81
  184. package/apps/control-plane/test/git-spawn-error.spec.ts +1 -1
  185. package/apps/control-plane/test/helpers.ts +10 -6
  186. package/apps/control-plane/test/incremental-gates.spec.ts +59 -20
  187. package/apps/control-plane/test/init-wizard.spec.ts +328 -68
  188. package/apps/control-plane/test/instance-isolation.spec.ts +43 -10
  189. package/apps/control-plane/test/issue-tracker.spec.ts +368 -128
  190. package/apps/control-plane/test/kernel-collision-replay.spec.ts +50 -29
  191. package/apps/control-plane/test/kernel.branches.spec.ts +64 -40
  192. package/apps/control-plane/test/kernel.coverage.spec.ts +85 -49
  193. package/apps/control-plane/test/kernel.coverage2.spec.ts +109 -65
  194. package/apps/control-plane/test/kernel.spec.ts +134 -51
  195. package/apps/control-plane/test/lock-service.spec.ts +92 -68
  196. package/apps/control-plane/test/mcp-helpers.spec.ts +53 -39
  197. package/apps/control-plane/test/mcp.spec.ts +231 -115
  198. package/apps/control-plane/test/merge-service.spec.ts +142 -94
  199. package/apps/control-plane/test/multi-project.spec.ts +28 -22
  200. package/apps/control-plane/test/notifier-service.spec.ts +136 -92
  201. package/apps/control-plane/test/parallel-gates.spec.ts +51 -35
  202. package/apps/control-plane/test/patch-service.spec.ts +128 -48
  203. package/apps/control-plane/test/performance-analytics.spec.ts +99 -63
  204. package/apps/control-plane/test/plan-service.spec.ts +50 -39
  205. package/apps/control-plane/test/planning-wave-executor.spec.ts +95 -71
  206. package/apps/control-plane/test/policy-loader-service.spec.ts +41 -19
  207. package/apps/control-plane/test/pr-monitor.spec.ts +113 -64
  208. package/apps/control-plane/test/providers.spec.ts +208 -104
  209. package/apps/control-plane/test/qa-index-service.spec.ts +31 -33
  210. package/apps/control-plane/test/qa-index.spec.ts +58 -61
  211. package/apps/control-plane/test/reactions.spec.ts +88 -45
  212. package/apps/control-plane/test/response.spec.ts +5 -5
  213. package/apps/control-plane/test/resume-command.spec.ts +121 -80
  214. package/apps/control-plane/test/run-coordinator.spec.ts +205 -136
  215. package/apps/control-plane/test/schema-date-time.spec.ts +49 -41
  216. package/apps/control-plane/test/service-retry-paths.spec.ts +77 -57
  217. package/apps/control-plane/test/services.spec.ts +147 -129
  218. package/apps/control-plane/test/session-management.spec.ts +136 -74
  219. package/apps/control-plane/test/spec-ingestion.spec.ts +23 -21
  220. package/apps/control-plane/test/spec-input-resolver.spec.ts +11 -10
  221. package/apps/control-plane/test/supervisor-collaborators.spec.ts +168 -121
  222. package/apps/control-plane/test/supervisor.calltool.spec.ts +21 -18
  223. package/apps/control-plane/test/supervisor.spec.ts +67 -43
  224. package/apps/control-plane/test/supervisor.unit.spec.ts +195 -126
  225. package/apps/control-plane/test/token-auth-verifier.spec.ts +29 -14
  226. package/apps/control-plane/test/tool-registry-loader.spec.ts +51 -27
  227. package/apps/control-plane/test/tool-runtime.spec.ts +63 -46
  228. package/apps/control-plane/test/worker-decision-loop.spec.ts +143 -122
  229. package/apps/control-plane/test/workspace-hooks.spec.ts +61 -23
  230. package/apps/control-plane/tsconfig.build.json +2 -7
  231. package/apps/control-plane/tsconfig.json +1 -5
  232. package/apps/control-plane/vitest.config.ts +7 -7
  233. package/config/agentic/orchestrator/adapters.yaml +3 -0
  234. package/config/agentic/orchestrator/agents.yaml +14 -0
  235. package/config/agentic/orchestrator/gates.yaml +28 -0
  236. package/config/agentic/orchestrator/policy.yaml +22 -0
  237. package/config/agentic/orchestrator/prompts/builder.system.md +1 -0
  238. package/config/agentic/orchestrator/prompts/planner.system.md +16 -0
  239. package/config/agentic/orchestrator/prompts/qa.system.md +1 -0
  240. package/dist/apps/control-plane/application/adapters/adapter-registry.js +12 -5
  241. package/dist/apps/control-plane/application/adapters/adapter-registry.js.map +1 -1
  242. package/dist/apps/control-plane/application/multi-project-loader.js +26 -9
  243. package/dist/apps/control-plane/application/multi-project-loader.js.map +1 -1
  244. package/dist/apps/control-plane/application/services/activity-monitor-service.js +7 -7
  245. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  246. package/dist/apps/control-plane/application/services/collision-queue-service.js +7 -7
  247. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  248. package/dist/apps/control-plane/application/services/cost-tracking-service.js +6 -8
  249. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  250. package/dist/apps/control-plane/application/services/dependency-scheduler-service.js.map +1 -1
  251. package/dist/apps/control-plane/application/services/feature-deletion-service.js +37 -29
  252. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  253. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +10 -10
  254. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  255. package/dist/apps/control-plane/application/services/feature-state-service.js +11 -11
  256. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  257. package/dist/apps/control-plane/application/services/gate-interpolation-service.js +3 -1
  258. package/dist/apps/control-plane/application/services/gate-interpolation-service.js.map +1 -1
  259. package/dist/apps/control-plane/application/services/gate-service.js +26 -26
  260. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  261. package/dist/apps/control-plane/application/services/instance-isolation-service.js +1 -1
  262. package/dist/apps/control-plane/application/services/instance-isolation-service.js.map +1 -1
  263. package/dist/apps/control-plane/application/services/issue-tracker-service.js +25 -15
  264. package/dist/apps/control-plane/application/services/issue-tracker-service.js.map +1 -1
  265. package/dist/apps/control-plane/application/services/lock-service.js +32 -32
  266. package/dist/apps/control-plane/application/services/lock-service.js.map +1 -1
  267. package/dist/apps/control-plane/application/services/merge-service.js +41 -27
  268. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  269. package/dist/apps/control-plane/application/services/notifier-service.js +29 -15
  270. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  271. package/dist/apps/control-plane/application/services/patch-service.js +21 -19
  272. package/dist/apps/control-plane/application/services/patch-service.js.map +1 -1
  273. package/dist/apps/control-plane/application/services/performance-analytics-service.js +4 -4
  274. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  275. package/dist/apps/control-plane/application/services/plan-service.js +33 -33
  276. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  277. package/dist/apps/control-plane/application/services/policy-loader-service.js.map +1 -1
  278. package/dist/apps/control-plane/application/services/pr-monitor-service.js +23 -11
  279. package/dist/apps/control-plane/application/services/pr-monitor-service.js.map +1 -1
  280. package/dist/apps/control-plane/application/services/qa-index-service.js +11 -11
  281. package/dist/apps/control-plane/application/services/qa-index-service.js.map +1 -1
  282. package/dist/apps/control-plane/application/services/reactions-service.js +13 -9
  283. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  284. package/dist/apps/control-plane/application/services/reporting-service.js +11 -9
  285. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  286. package/dist/apps/control-plane/application/services/run-lease-service.js +34 -33
  287. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  288. package/dist/apps/control-plane/application/tools/tool-metadata.js +2 -2
  289. package/dist/apps/control-plane/application/tools/tool-router.js.map +1 -1
  290. package/dist/apps/control-plane/cli/attach-command-handler.js +9 -9
  291. package/dist/apps/control-plane/cli/cleanup-command-handler.js +11 -9
  292. package/dist/apps/control-plane/cli/cleanup-command-handler.js.map +1 -1
  293. package/dist/apps/control-plane/cli/cli-argument-parser.js +4 -3
  294. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  295. package/dist/apps/control-plane/cli/dashboard-command-handler.js +23 -7
  296. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  297. package/dist/apps/control-plane/cli/delete-command-handler.js +7 -7
  298. package/dist/apps/control-plane/cli/env-file.d.ts +4 -0
  299. package/dist/apps/control-plane/cli/env-file.js +89 -0
  300. package/dist/apps/control-plane/cli/env-file.js.map +1 -0
  301. package/dist/apps/control-plane/cli/help-command-handler.js +58 -30
  302. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  303. package/dist/apps/control-plane/cli/init-command-handler.js +97 -37
  304. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  305. package/dist/apps/control-plane/cli/io.js +2 -2
  306. package/dist/apps/control-plane/cli/io.js.map +1 -1
  307. package/dist/apps/control-plane/cli/resume-command-handler.js +9 -9
  308. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  309. package/dist/apps/control-plane/cli/retry-command-handler.js +12 -11
  310. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  311. package/dist/apps/control-plane/cli/run-command-handler.js +12 -8
  312. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  313. package/dist/apps/control-plane/cli/send-command-handler.js +6 -6
  314. package/dist/apps/control-plane/cli/spec-ingestion-service.js +10 -8
  315. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  316. package/dist/apps/control-plane/cli/spec-input-resolver.js.map +1 -1
  317. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  318. package/dist/apps/control-plane/cli/status-command-handler.js +8 -8
  319. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  320. package/dist/apps/control-plane/cli/tooling.js +1 -1
  321. package/dist/apps/control-plane/core/collisions.js +11 -8
  322. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  323. package/dist/apps/control-plane/core/constants.js +13 -7
  324. package/dist/apps/control-plane/core/constants.js.map +1 -1
  325. package/dist/apps/control-plane/core/error-codes.js +1 -1
  326. package/dist/apps/control-plane/core/fs.js.map +1 -1
  327. package/dist/apps/control-plane/core/gates.d.ts +2 -2
  328. package/dist/apps/control-plane/core/gates.js +26 -19
  329. package/dist/apps/control-plane/core/gates.js.map +1 -1
  330. package/dist/apps/control-plane/core/git.js +3 -3
  331. package/dist/apps/control-plane/core/git.js.map +1 -1
  332. package/dist/apps/control-plane/core/kernel.d.ts +1 -0
  333. package/dist/apps/control-plane/core/kernel.js +134 -81
  334. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  335. package/dist/apps/control-plane/core/patch.js +7 -3
  336. package/dist/apps/control-plane/core/patch.js.map +1 -1
  337. package/dist/apps/control-plane/core/path-layout.d.ts +1 -0
  338. package/dist/apps/control-plane/core/path-layout.js +4 -1
  339. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  340. package/dist/apps/control-plane/core/path-rules.js +3 -1
  341. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  342. package/dist/apps/control-plane/core/qa-index.js +5 -5
  343. package/dist/apps/control-plane/core/qa-index.js.map +1 -1
  344. package/dist/apps/control-plane/core/response.js +3 -3
  345. package/dist/apps/control-plane/core/response.js.map +1 -1
  346. package/dist/apps/control-plane/core/schemas.js +10 -6
  347. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  348. package/dist/apps/control-plane/core/workspace-hooks.js +3 -3
  349. package/dist/apps/control-plane/index.d.ts +1 -1
  350. package/dist/apps/control-plane/index.js +1 -1
  351. package/dist/apps/control-plane/index.js.map +1 -1
  352. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +40 -23
  353. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  354. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +1 -1
  355. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  356. package/dist/apps/control-plane/mcp/mcp-server-adapter.js +6 -7
  357. package/dist/apps/control-plane/mcp/mcp-server-adapter.js.map +1 -1
  358. package/dist/apps/control-plane/mcp/operation-ledger.js +5 -5
  359. package/dist/apps/control-plane/mcp/operation-ledger.js.map +1 -1
  360. package/dist/apps/control-plane/mcp/protocol-contract.js +2 -2
  361. package/dist/apps/control-plane/mcp/runtime-factory.js +2 -2
  362. package/dist/apps/control-plane/mcp/runtime-factory.js.map +1 -1
  363. package/dist/apps/control-plane/mcp/token-auth-verifier.js +1 -1
  364. package/dist/apps/control-plane/mcp/token-auth-verifier.js.map +1 -1
  365. package/dist/apps/control-plane/mcp/token-claims-validator.js +5 -5
  366. package/dist/apps/control-plane/mcp/token-claims-validator.js.map +1 -1
  367. package/dist/apps/control-plane/mcp/tool-authorizer.js +1 -3
  368. package/dist/apps/control-plane/mcp/tool-authorizer.js.map +1 -1
  369. package/dist/apps/control-plane/mcp/tool-client.js +2 -2
  370. package/dist/apps/control-plane/mcp/tool-client.js.map +1 -1
  371. package/dist/apps/control-plane/mcp/tool-contract-validator.js +3 -3
  372. package/dist/apps/control-plane/mcp/tool-contract-validator.js.map +1 -1
  373. package/dist/apps/control-plane/mcp/tool-registry-loader.js +1 -1
  374. package/dist/apps/control-plane/mcp/tool-registry-loader.js.map +1 -1
  375. package/dist/apps/control-plane/mcp/tool-runtime.js +17 -17
  376. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  377. package/dist/apps/control-plane/mcp/tools-markdown-generator.js +6 -1
  378. package/dist/apps/control-plane/mcp/tools-markdown-generator.js.map +1 -1
  379. package/dist/apps/control-plane/providers/providers.d.ts +3 -2
  380. package/dist/apps/control-plane/providers/providers.js +81 -39
  381. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  382. package/dist/apps/control-plane/supervisor/build-wave-executor.js +12 -12
  383. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  384. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +19 -16
  385. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  386. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +1 -1
  387. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +13 -13
  388. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  389. package/dist/apps/control-plane/supervisor/run-coordinator.js +37 -20
  390. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  391. package/dist/apps/control-plane/supervisor/runtime.js +25 -21
  392. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  393. package/dist/apps/control-plane/supervisor/session-orchestrator.js +29 -23
  394. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  395. package/dist/apps/control-plane/supervisor/types.d.ts +3 -3
  396. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  397. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +14 -16
  398. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  399. package/eslint.config.mjs +20 -20
  400. package/example-configurations/README.md +1 -1
  401. package/example-configurations/java/agents.yaml +3 -3
  402. package/example-configurations/java/policy.yaml +1 -1
  403. package/example-configurations/node/agents.yaml +3 -3
  404. package/example-configurations/node/policy.yaml +1 -1
  405. package/package.json +10 -5
  406. package/packages/web-dashboard/next.config.js +2 -2
  407. package/packages/web-dashboard/src/app/api/actions/route.ts +25 -9
  408. package/packages/web-dashboard/src/app/api/events/route.ts +20 -6
  409. package/packages/web-dashboard/src/app/api/features/[id]/checkout/route.ts +88 -37
  410. package/packages/web-dashboard/src/app/api/features/[id]/evidence/[artifact]/route.ts +8 -5
  411. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +27 -9
  412. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +5 -2
  413. package/packages/web-dashboard/src/app/api/projects/route.ts +5 -5
  414. package/packages/web-dashboard/src/app/globals.css +10 -2
  415. package/packages/web-dashboard/src/app/page.tsx +100 -37
  416. package/packages/web-dashboard/src/lib/aop-client.ts +68 -37
  417. package/packages/web-dashboard/src/lib/multi-project-config.ts +28 -7
  418. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +59 -36
  419. package/packages/web-dashboard/tsconfig.json +3 -11
  420. package/scripts/nx-safe.mjs +10 -10
  421. package/spec-files/completed/agentic_orchestrator_cli_delete_command_spec.md +5 -0
  422. package/spec-files/completed/agentic_orchestrator_feature_gaps_closure_spec.md +189 -90
  423. package/spec-files/completed/agentic_orchestrator_init_policy_ux_simplification_spec.md +49 -16
  424. package/spec-files/completed/agentic_orchestrator_mcp_formalization_spec.md +24 -1
  425. package/spec-files/completed/agentic_orchestrator_single_global_orchestrator_spec.md +9 -0
  426. package/spec-files/completed/agentic_orchestrator_spec.md +171 -75
  427. package/spec-files/completed/agentic_orchestrator_validator_hardening_spec.md +25 -17
  428. package/spec-files/outstanding/agentic_orchestrator_artifact_database_publishing_spec.md +40 -5
  429. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +23 -12
  430. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +16 -4
  431. package/spec-files/outstanding/agentic_orchestrator_observability_integrity_diagnostics_spec.md +42 -2
  432. package/spec-files/outstanding/agentic_orchestrator_performance_improvements_spec.md +209 -130
  433. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +56 -3
  434. package/spec-files/outstanding/agentic_orchestrator_productization_commercial_spec.md +77 -10
  435. package/spec-files/outstanding/agentic_orchestrator_provider_auth_bootstrap_spec.md +384 -0
  436. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +29 -14
  437. package/spec-files/progress.md +186 -175
  438. package/tsconfig.json +2 -8
@@ -9,7 +9,7 @@ import { SupervisorRuntime } from '../src/index.js';
9
9
  function makeRuntime(options: Record<string, unknown> = {}) {
10
10
  const kernelState = {
11
11
  repoRoot: '',
12
- agentsConfig: { roles: {}, missing_prompt_behavior: 'ignore' }
12
+ agentsConfig: { roles: {}, missing_prompt_behavior: 'ignore' },
13
13
  };
14
14
 
15
15
  const kernel = {
@@ -19,16 +19,16 @@ function makeRuntime(options: Record<string, unknown> = {}) {
19
19
  (): Record<string, unknown> => ({
20
20
  recovery: {
21
21
  orchestrator_session_reattach_timeout_ms: 5000,
22
- orphan_session_cleanup_enabled: true
23
- }
24
- })
22
+ orphan_session_cleanup_enabled: true,
23
+ },
24
+ }),
25
25
  ),
26
26
  getRuntimeSessions: vi.fn(async () => ({
27
27
  run_id: 'run:test',
28
28
  owner_instance_id: 'owner:test',
29
29
  orchestrator_session_id: 'unknown',
30
30
  orchestrator_epoch: 0,
31
- feature_sessions: {}
31
+ feature_sessions: {},
32
32
  })),
33
33
  updateOrchestratorSession: vi.fn(async () => ({ data: {} })),
34
34
  updateFeatureSessionAssignment: vi.fn(async () => ({ data: { updated: true } })),
@@ -38,31 +38,31 @@ function makeRuntime(options: Record<string, unknown> = {}) {
38
38
  acquireRunLease: vi.fn(async () => ({ data: { took_over_stale: false } })),
39
39
  renewLeases: vi.fn(async () => undefined),
40
40
  renewRunLease: vi.fn(async () => undefined),
41
- repoDiff: vi.fn(async () => ({ data: { diff: '' } }))
41
+ repoDiff: vi.fn(async () => ({ data: { diff: '' } })),
42
42
  };
43
43
 
44
44
  const provider = {
45
45
  selection: {
46
46
  provider: 'custom',
47
47
  model: 'model-x',
48
- provider_config_ref: null
48
+ provider_config_ref: null,
49
49
  },
50
50
  createSession: vi.fn(async (role: string, featureId: string) => ({
51
- session_id: `${role}-${featureId}-session`
51
+ session_id: `${role}-${featureId}-session`,
52
52
  })),
53
53
  reattachSession: vi.fn(async () => null),
54
- closeSession: vi.fn(async () => ({ closed: true }))
54
+ closeSession: vi.fn(async () => ({ closed: true })),
55
55
  };
56
56
 
57
57
  const toolClient = {
58
- call: vi.fn(async (): Promise<any> => ({ ok: true, data: {} }))
58
+ call: vi.fn(async (): Promise<any> => ({ ok: true, data: {} })),
59
59
  };
60
60
 
61
61
  const runtime = new SupervisorRuntime(kernel as any, provider as any, toolClient as any, {
62
62
  run_id: 'run:test',
63
63
  owner_instance_id: 'owner:test',
64
64
  max_iterations_per_phase: 0,
65
- ...options
65
+ ...options,
66
66
  });
67
67
 
68
68
  return { runtime, kernel, provider, toolClient };
@@ -74,16 +74,16 @@ describe('SupervisorRuntime unit behavior', () => {
74
74
  kernel.getPolicySnapshot.mockReturnValue({
75
75
  recovery: {
76
76
  orchestrator_session_reattach_timeout_ms: 5000,
77
- orphan_session_cleanup_enabled: true
77
+ orphan_session_cleanup_enabled: true,
78
78
  },
79
79
  supervisor: {
80
- max_iterations_per_phase: 4
81
- }
80
+ max_iterations_per_phase: 4,
81
+ },
82
82
  });
83
83
 
84
84
  const runtime = new SupervisorRuntime(kernel as any, provider as any, toolClient as any, {
85
85
  run_id: 'run:test',
86
- owner_instance_id: 'owner:test'
86
+ owner_instance_id: 'owner:test',
87
87
  });
88
88
 
89
89
  expect(runtime.maxIterationsPerPhase).toBe(4);
@@ -96,13 +96,13 @@ describe('SupervisorRuntime unit behavior', () => {
96
96
  owner_instance_id: 'owner:test',
97
97
  orchestrator_session_id: 'orch-existing',
98
98
  orchestrator_epoch: 0,
99
- feature_sessions: {}
99
+ feature_sessions: {},
100
100
  });
101
101
  provider.reattachSession.mockResolvedValue({
102
102
  session_id: 'orch-existing',
103
103
  role: 'orchestrator',
104
104
  feature_id: 'global',
105
- system_prompt_loaded: false
105
+ system_prompt_loaded: false,
106
106
  });
107
107
 
108
108
  await runtime.ensureGlobalOrchestratorSession();
@@ -120,7 +120,7 @@ describe('SupervisorRuntime unit behavior', () => {
120
120
  owner_instance_id: 'other-owner',
121
121
  orchestrator_session_id: 'unknown',
122
122
  orchestrator_epoch: 0,
123
- feature_sessions: {}
123
+ feature_sessions: {},
124
124
  });
125
125
  provider.createSession.mockResolvedValue({ session_id: 'orch-new' });
126
126
 
@@ -133,8 +133,8 @@ describe('SupervisorRuntime unit behavior', () => {
133
133
  run_id: 'run:test',
134
134
  owner_instance_id: 'owner:test',
135
135
  orchestrator_session_id: 'orch-new',
136
- increment_epoch: false
137
- })
136
+ increment_epoch: false,
137
+ }),
138
138
  );
139
139
  });
140
140
 
@@ -143,21 +143,21 @@ describe('SupervisorRuntime unit behavior', () => {
143
143
  kernel.getPolicySnapshot.mockReturnValue({
144
144
  recovery: {
145
145
  orchestrator_session_reattach_timeout_ms: 10,
146
- orphan_session_cleanup_enabled: true
147
- }
146
+ orphan_session_cleanup_enabled: true,
147
+ },
148
148
  });
149
149
  kernel.getRuntimeSessions.mockResolvedValue({
150
150
  run_id: 'run:test',
151
151
  owner_instance_id: 'owner:test',
152
152
  orchestrator_session_id: 'orch-old',
153
153
  orchestrator_epoch: 4,
154
- feature_sessions: {}
154
+ feature_sessions: {},
155
155
  });
156
156
  provider.reattachSession.mockImplementation(
157
157
  () =>
158
158
  new Promise(() => {
159
159
  // Intentionally unresolved to force timeout-based fallback.
160
- })
160
+ }),
161
161
  );
162
162
  provider.createSession.mockResolvedValue({ session_id: 'orch-new' });
163
163
  toolClient.call.mockResolvedValue({ ok: true, data: {} });
@@ -170,18 +170,18 @@ describe('SupervisorRuntime unit behavior', () => {
170
170
  expect(kernel.updateOrchestratorSession).toHaveBeenCalledWith(
171
171
  expect.objectContaining({
172
172
  orchestrator_session_id: 'orch-new',
173
- increment_epoch: true
174
- })
173
+ increment_epoch: true,
174
+ }),
175
175
  );
176
176
  expect(toolClient.call).toHaveBeenCalledWith(
177
177
  TOOLS.FEATURE_LOG_APPEND,
178
178
  expect.objectContaining({
179
179
  feature_id: 'global',
180
- note: expect.stringContaining('"orphan_session_id":"orch-old"')
180
+ note: expect.stringContaining('"orphan_session_id":"orch-old"'),
181
181
  }),
182
182
  expect.objectContaining({
183
- actor_type: 'orchestrator'
184
- })
183
+ actor_type: 'orchestrator',
184
+ }),
185
185
  );
186
186
  });
187
187
 
@@ -196,14 +196,14 @@ describe('SupervisorRuntime unit behavior', () => {
196
196
  feature_a: {
197
197
  planner_session_id: 'planner-a',
198
198
  builder_session_id: 'builder-a',
199
- qa_session_id: 'unassigned'
199
+ qa_session_id: 'unassigned',
200
200
  },
201
201
  feature_b: {
202
202
  planner_session_id: 'planner-b',
203
203
  builder_session_id: 'builder-b',
204
- qa_session_id: 'qa-b'
205
- }
206
- }
204
+ qa_session_id: 'qa-b',
205
+ },
206
+ },
207
207
  });
208
208
  provider.closeSession.mockRejectedValueOnce(new Error('close error'));
209
209
 
@@ -226,14 +226,14 @@ describe('SupervisorRuntime unit behavior', () => {
226
226
  feature_a: {
227
227
  planner_session_id: 'planner-a',
228
228
  builder_session_id: 'builder-a',
229
- qa_session_id: 'qa-a'
229
+ qa_session_id: 'qa-a',
230
230
  },
231
231
  feature_b: {
232
232
  planner_session_id: 'planner-b',
233
233
  builder_session_id: 'builder-b',
234
- qa_session_id: 'unassigned'
235
- }
236
- }
234
+ qa_session_id: 'unassigned',
235
+ },
236
+ },
237
237
  });
238
238
 
239
239
  await runtime.cleanupOrphanWorkerSessions(['feature_a']);
@@ -252,13 +252,13 @@ describe('SupervisorRuntime unit behavior', () => {
252
252
  runtime.kernel.getRepoRoot = vi.fn(() => repoRoot);
253
253
  runtime.kernel.getAgentsConfig = vi.fn(() => ({
254
254
  roles: {
255
- planner: { system_prompt_path: 'prompts/planner.md' }
255
+ planner: { system_prompt_path: 'prompts/planner.md' },
256
256
  },
257
- missing_prompt_behavior: 'error'
257
+ missing_prompt_behavior: 'error',
258
258
  }));
259
259
 
260
260
  await expect(runtime.loadRolePrompts()).rejects.toMatchObject({
261
- code: ERROR_CODES.MISSING_ROLE_PROMPT
261
+ code: ERROR_CODES.MISSING_ROLE_PROMPT,
262
262
  });
263
263
 
264
264
  await fs.rm(repoRoot, { recursive: true, force: true });
@@ -274,9 +274,9 @@ describe('SupervisorRuntime unit behavior', () => {
274
274
  runtime.kernel.getAgentsConfig = vi.fn(() => ({
275
275
  roles: {
276
276
  planner: { system_prompt_path: 'prompts/planner.md' },
277
- builder: { system_prompt_path: 'prompts/missing-builder.md' }
277
+ builder: { system_prompt_path: 'prompts/missing-builder.md' },
278
278
  },
279
- missing_prompt_behavior: 'ignore'
279
+ missing_prompt_behavior: 'ignore',
280
280
  }));
281
281
 
282
282
  const first = await runtime.loadRolePrompts();
@@ -286,7 +286,7 @@ describe('SupervisorRuntime unit behavior', () => {
286
286
  expect(first).toEqual({
287
287
  planner: 'planner prompt',
288
288
  builder: null,
289
- qa: null
289
+ qa: null,
290
290
  });
291
291
  expect(second).toEqual(first);
292
292
  await fs.rm(repoRoot, { recursive: true, force: true });
@@ -295,17 +295,25 @@ describe('SupervisorRuntime unit behavior', () => {
295
295
  it('GIVEN_mixed_context_statuses_WHEN_running_planning_wave_THEN_submits_only_missing_plans_for_plannable_states', async () => {
296
296
  const { runtime } = makeRuntime();
297
297
  const callTool = vi.spyOn(runtime, 'callTool');
298
- const generatePlan = vi.spyOn(runtime, 'generateInitialPlan').mockResolvedValue({ generated: true });
298
+ const generatePlan = vi
299
+ .spyOn(runtime, 'generateInitialPlan')
300
+ .mockResolvedValue({ generated: true });
299
301
 
300
302
  callTool.mockImplementation(async (_role, toolName, args) => {
301
303
  if (toolName === TOOLS.FEATURE_GET_CONTEXT && args.feature_id === 'feature_a') {
302
- return { ok: true, data: { state: { front_matter: { status: STATUS.PLANNING } }, plan: null } };
304
+ return {
305
+ ok: true,
306
+ data: { state: { front_matter: { status: STATUS.PLANNING } }, plan: null },
307
+ };
303
308
  }
304
309
  if (toolName === TOOLS.FEATURE_GET_CONTEXT && args.feature_id === 'feature_b') {
305
310
  return { ok: true, data: { state: { front_matter: { status: STATUS.QA } }, plan: null } };
306
311
  }
307
312
  if (toolName === TOOLS.FEATURE_GET_CONTEXT && args.feature_id === 'feature_c') {
308
- return { ok: true, data: { state: { front_matter: { status: STATUS.BLOCKED } }, plan: { plan_version: 1 } } };
313
+ return {
314
+ ok: true,
315
+ data: { state: { front_matter: { status: STATUS.BLOCKED } }, plan: { plan_version: 1 } },
316
+ };
309
317
  }
310
318
  return { ok: true, data: {} };
311
319
  });
@@ -317,7 +325,7 @@ describe('SupervisorRuntime unit behavior', () => {
317
325
  expect(callTool).toHaveBeenCalledWith(
318
326
  'planner',
319
327
  TOOLS.PLAN_SUBMIT,
320
- expect.objectContaining({ feature_id: 'feature_a' })
328
+ expect.objectContaining({ feature_id: 'feature_a' }),
321
329
  );
322
330
  });
323
331
 
@@ -331,9 +339,9 @@ describe('SupervisorRuntime unit behavior', () => {
331
339
  ok: true,
332
340
  data: {
333
341
  front_matter: {
334
- status: args.feature_id === 'feature_c' ? STATUS.QA : STATUS.BUILDING
335
- }
336
- }
342
+ status: args.feature_id === 'feature_c' ? STATUS.QA : STATUS.BUILDING,
343
+ },
344
+ },
337
345
  };
338
346
  }
339
347
  return { ok: true, data: {} };
@@ -342,7 +350,7 @@ describe('SupervisorRuntime unit behavior', () => {
342
350
  await runtime.runBuildWave(['feature_a', 'feature_b', 'feature_c']);
343
351
 
344
352
  const gateCalls = callTool.mock.calls.filter(
345
- (call) => call[0] === 'builder' && call[1] === TOOLS.GATES_RUN
353
+ (call) => call[0] === 'builder' && call[1] === TOOLS.GATES_RUN,
346
354
  );
347
355
  expect(gateCalls).toHaveLength(1);
348
356
  expect(gateCalls[0][2]).toMatchObject({ feature_id: 'feature_a', mode: 'fast' });
@@ -354,12 +362,12 @@ describe('SupervisorRuntime unit behavior', () => {
354
362
  runtime.sessionsByFeature.set('feature_a', {
355
363
  planner: 'planner-old',
356
364
  builder: 'builder-old',
357
- qa: 'qa-old'
365
+ qa: 'qa-old',
358
366
  });
359
367
  vi.spyOn(runtime, 'loadRolePrompts').mockResolvedValue({
360
368
  planner: null,
361
369
  builder: null,
362
- qa: 'qa prompt'
370
+ qa: 'qa prompt',
363
371
  });
364
372
  vi.spyOn(runtime, 'patchFeatureCluster').mockResolvedValue();
365
373
  const callTool = vi.spyOn(runtime, 'callTool');
@@ -381,8 +389,8 @@ describe('SupervisorRuntime unit behavior', () => {
381
389
  feature_id: 'feature_a',
382
390
  planner_session_id: 'planner-old',
383
391
  builder_session_id: 'builder-old',
384
- qa_session_id: 'qa-new'
385
- })
392
+ qa_session_id: 'qa-new',
393
+ }),
386
394
  );
387
395
  });
388
396
 
@@ -392,13 +400,13 @@ describe('SupervisorRuntime unit behavior', () => {
392
400
  runtime.sessionsByFeature.set('feature_a', {
393
401
  planner: 'planner-session',
394
402
  builder: 'builder-session',
395
- qa: 'qa-session'
403
+ qa: 'qa-session',
396
404
  });
397
405
  toolClient.call.mockResolvedValueOnce({ ok: true, data: { accepted: true } });
398
406
 
399
407
  const response = await runtime.callTool('builder', TOOLS.GATES_RUN, {
400
408
  feature_id: 'feature_a',
401
- mode: 'fast'
409
+ mode: 'fast',
402
410
  });
403
411
 
404
412
  expect(response).toEqual({ ok: true, data: { accepted: true } });
@@ -407,12 +415,12 @@ describe('SupervisorRuntime unit behavior', () => {
407
415
  expect.objectContaining({
408
416
  feature_id: 'feature_a',
409
417
  mode: 'fast',
410
- operation_id: expect.any(String)
418
+ operation_id: expect.any(String),
411
419
  }),
412
420
  expect.objectContaining({
413
421
  session_id: 'builder-session',
414
- actor_type: 'builder'
415
- })
422
+ actor_type: 'builder',
423
+ }),
416
424
  );
417
425
  });
418
426
 
@@ -421,22 +429,22 @@ describe('SupervisorRuntime unit behavior', () => {
421
429
  runtime.sessionsByFeature.set('feature_a', {
422
430
  planner: 'planner-session',
423
431
  builder: 'builder-session',
424
- qa: 'qa-session'
432
+ qa: 'qa-session',
425
433
  });
426
434
  toolClient.call.mockResolvedValue({
427
435
  ok: false,
428
436
  error: {
429
437
  code: ERROR_CODES.LOCK_CONFLICT,
430
438
  message: 'lock held',
431
- details: { holder: 'feature_b' }
432
- }
439
+ details: { holder: 'feature_b' },
440
+ },
433
441
  });
434
442
 
435
443
  await expect(
436
- runtime.callTool('builder', TOOLS.GATES_RUN, { feature_id: 'feature_a' })
444
+ runtime.callTool('builder', TOOLS.GATES_RUN, { feature_id: 'feature_a' }),
437
445
  ).rejects.toMatchObject({
438
446
  code: ERROR_CODES.LOCK_CONFLICT,
439
- details: { holder: 'feature_b' }
447
+ details: { holder: 'feature_b' },
440
448
  });
441
449
  });
442
450
 
@@ -449,7 +457,7 @@ describe('SupervisorRuntime unit behavior', () => {
449
457
  feature_id: 'feature_plan',
450
458
  plan_version: 1,
451
459
  base_ref: 'HEAD',
452
- gate_profile: 'default'
460
+ gate_profile: 'default',
453
461
  });
454
462
  });
455
463
 
@@ -458,7 +466,7 @@ describe('SupervisorRuntime unit behavior', () => {
458
466
  runtime.sessionsByFeature.set('feature_a', {
459
467
  planner: 'p1',
460
468
  builder: 'b1',
461
- qa: 'q1'
469
+ qa: 'q1',
462
470
  });
463
471
 
464
472
  await runtime.renewLeaseHeartbeats();
@@ -491,10 +499,10 @@ describe('SupervisorRuntime unit behavior', () => {
491
499
  front_matter: {
492
500
  version: 3,
493
501
  cluster: {
494
- orchestrator_session_id: args.feature_id === 'feature_a' ? 'orch-main' : 'other'
495
- }
496
- }
497
- }
502
+ orchestrator_session_id: args.feature_id === 'feature_a' ? 'orch-main' : 'other',
503
+ },
504
+ },
505
+ },
498
506
  } as any;
499
507
  }
500
508
  return { ok: true, data: {} } as any;
@@ -511,8 +519,8 @@ describe('SupervisorRuntime unit behavior', () => {
511
519
  feature_id: 'feature_q',
512
520
  planner_session_id: 'unassigned',
513
521
  builder_session_id: 'unassigned',
514
- qa_session_id: 'unassigned'
515
- })
522
+ qa_session_id: 'unassigned',
523
+ }),
516
524
  );
517
525
  });
518
526
 
@@ -525,11 +533,16 @@ describe('SupervisorRuntime delegation methods', () => {
525
533
  it('GIVEN_policy_with_agent_idle_threshold_WHEN_runtime_created_THEN_applies_configured_idle_threshold', () => {
526
534
  const { kernel, provider, toolClient } = makeRuntime();
527
535
  kernel.getPolicySnapshot.mockReturnValue({
528
- recovery: { orchestrator_session_reattach_timeout_ms: 5000, orphan_session_cleanup_enabled: true },
529
- supervisor: { agent_idle_threshold_ms: 60000 }
536
+ recovery: {
537
+ orchestrator_session_reattach_timeout_ms: 5000,
538
+ orphan_session_cleanup_enabled: true,
539
+ },
540
+ supervisor: { agent_idle_threshold_ms: 60000 },
530
541
  });
531
542
 
532
- expect(() => new SupervisorRuntime(kernel as any, provider as any, toolClient as any)).not.toThrow();
543
+ expect(
544
+ () => new SupervisorRuntime(kernel as any, provider as any, toolClient as any),
545
+ ).not.toThrow();
533
546
  });
534
547
 
535
548
  it('GIVEN_planner_role_with_sessions_WHEN_calling_tool_THEN_uses_planner_session', async () => {
@@ -537,16 +550,19 @@ describe('SupervisorRuntime delegation methods', () => {
537
550
  runtime.sessionsByFeature.set('feature_a', {
538
551
  planner: 'planner-session',
539
552
  builder: 'builder-session',
540
- qa: 'qa-session'
553
+ qa: 'qa-session',
541
554
  });
542
555
  toolClient.call.mockResolvedValueOnce({ ok: true, data: { result: 'plan-submitted' } });
543
556
 
544
- await runtime.callTool('planner', TOOLS.PLAN_SUBMIT, { feature_id: 'feature_a', plan_json: {} });
557
+ await runtime.callTool('planner', TOOLS.PLAN_SUBMIT, {
558
+ feature_id: 'feature_a',
559
+ plan_json: {},
560
+ });
545
561
 
546
562
  expect(toolClient.call).toHaveBeenCalledWith(
547
563
  TOOLS.PLAN_SUBMIT,
548
564
  expect.anything(),
549
- expect.objectContaining({ session_id: 'planner-session', actor_type: 'planner' })
565
+ expect.objectContaining({ session_id: 'planner-session', actor_type: 'planner' }),
550
566
  );
551
567
  });
552
568
 
@@ -555,7 +571,7 @@ describe('SupervisorRuntime delegation methods', () => {
555
571
  runtime.sessionsByFeature.set('feature_a', {
556
572
  planner: 'planner-session',
557
573
  builder: 'builder-session',
558
- qa: 'qa-session'
574
+ qa: 'qa-session',
559
575
  });
560
576
  toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
561
577
 
@@ -564,7 +580,7 @@ describe('SupervisorRuntime delegation methods', () => {
564
580
  expect(toolClient.call).toHaveBeenCalledWith(
565
581
  TOOLS.GATES_RUN,
566
582
  expect.anything(),
567
- expect.objectContaining({ session_id: 'qa-session', actor_type: 'qa' })
583
+ expect.objectContaining({ session_id: 'qa-session', actor_type: 'qa' }),
568
584
  );
569
585
  });
570
586
 
@@ -573,12 +589,15 @@ describe('SupervisorRuntime delegation methods', () => {
573
589
  runtime.orchestratorSessionId = 'orch-main';
574
590
  toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
575
591
 
576
- await runtime.callTool('orchestrator', TOOLS.FEATURE_LOG_APPEND, { feature_id: 'global', note: 'test' });
592
+ await runtime.callTool('orchestrator', TOOLS.FEATURE_LOG_APPEND, {
593
+ feature_id: 'global',
594
+ note: 'test',
595
+ });
577
596
 
578
597
  expect(toolClient.call).toHaveBeenCalledWith(
579
598
  TOOLS.FEATURE_LOG_APPEND,
580
599
  expect.anything(),
581
- expect.objectContaining({ session_id: 'orch-main', actor_type: 'orchestrator' })
600
+ expect.objectContaining({ session_id: 'orch-main', actor_type: 'orchestrator' }),
582
601
  );
583
602
  });
584
603
 
@@ -591,7 +610,7 @@ describe('SupervisorRuntime delegation methods', () => {
591
610
  expect(toolClient.call).toHaveBeenCalledWith(
592
611
  TOOLS.FEATURE_STATE_GET,
593
612
  expect.anything(),
594
- expect.objectContaining({ session_id: 'bootstrap:builder' })
613
+ expect.objectContaining({ session_id: 'bootstrap:builder' }),
595
614
  );
596
615
  });
597
616
 
@@ -599,12 +618,14 @@ describe('SupervisorRuntime delegation methods', () => {
599
618
  const { runtime, toolClient } = makeRuntime();
600
619
  toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
601
620
 
602
- await runtime.callTool('planner', TOOLS.FEATURE_STATE_GET, { feature_id: 'feature_not_tracked' });
621
+ await runtime.callTool('planner', TOOLS.FEATURE_STATE_GET, {
622
+ feature_id: 'feature_not_tracked',
623
+ });
603
624
 
604
625
  expect(toolClient.call).toHaveBeenCalledWith(
605
626
  TOOLS.FEATURE_STATE_GET,
606
627
  expect.anything(),
607
- expect.objectContaining({ session_id: 'bootstrap:planner' })
628
+ expect.objectContaining({ session_id: 'bootstrap:planner' }),
608
629
  );
609
630
  });
610
631
 
@@ -613,16 +634,18 @@ describe('SupervisorRuntime delegation methods', () => {
613
634
  runtime.sessionsByFeature.set('feature_a', {
614
635
  planner: 'planner-session',
615
636
  builder: 'builder-session',
616
- qa: 'qa-session'
637
+ qa: 'qa-session',
617
638
  });
618
639
  toolClient.call.mockResolvedValueOnce({ ok: true, data: {} });
619
640
 
620
- await runtime.callTool('unknown' as never, TOOLS.FEATURE_STATE_GET, { feature_id: 'feature_a' });
641
+ await runtime.callTool('unknown' as never, TOOLS.FEATURE_STATE_GET, {
642
+ feature_id: 'feature_a',
643
+ });
621
644
 
622
645
  expect(toolClient.call).toHaveBeenCalledWith(
623
646
  TOOLS.FEATURE_STATE_GET,
624
647
  expect.anything(),
625
- expect.objectContaining({ session_id: 'bootstrap:unknown' })
648
+ expect.objectContaining({ session_id: 'bootstrap:unknown' }),
626
649
  );
627
650
  });
628
651
 
@@ -638,8 +661,8 @@ describe('SupervisorRuntime delegation methods', () => {
638
661
  plan: { plan_version: 1, acceptance_criteria: [], risk: [] },
639
662
  spec: '',
640
663
  qa_test_index: { summary: { pending: 0, failed: 0, running: 0 } },
641
- latest_evidence: {}
642
- }
664
+ latest_evidence: {},
665
+ },
643
666
  } as any;
644
667
  }
645
668
  return { ok: true, data: {} } as any;
@@ -647,7 +670,9 @@ describe('SupervisorRuntime delegation methods', () => {
647
670
 
648
671
  await runtime.runPostQaReconciliationWave(['feature_a'], 1);
649
672
 
650
- expect(callTool).toHaveBeenCalledWith('planner', TOOLS.FEATURE_GET_CONTEXT, { feature_id: 'feature_a' });
673
+ expect(callTool).toHaveBeenCalledWith('planner', TOOLS.FEATURE_GET_CONTEXT, {
674
+ feature_id: 'feature_a',
675
+ });
651
676
  });
652
677
 
653
678
  it('GIVEN_orphan_cleanup_disabled_WHEN_reattach_fails_THEN_skips_orphan_log', async () => {
@@ -655,25 +680,30 @@ describe('SupervisorRuntime delegation methods', () => {
655
680
  kernel.getPolicySnapshot.mockReturnValue({
656
681
  recovery: {
657
682
  orchestrator_session_reattach_timeout_ms: 10,
658
- orphan_session_cleanup_enabled: false
659
- }
683
+ orphan_session_cleanup_enabled: false,
684
+ },
660
685
  });
661
686
  kernel.getRuntimeSessions.mockResolvedValue({
662
687
  run_id: 'run:test',
663
688
  owner_instance_id: 'owner:test',
664
689
  orchestrator_session_id: 'orch-old',
665
690
  orchestrator_epoch: 4,
666
- feature_sessions: {}
691
+ feature_sessions: {},
667
692
  });
668
693
  provider.reattachSession.mockImplementation(
669
- () => new Promise(() => { /* intentionally unresolved to force timeout */ })
694
+ () =>
695
+ new Promise(() => {
696
+ /* intentionally unresolved to force timeout */
697
+ }),
670
698
  );
671
699
  provider.createSession.mockResolvedValue({ session_id: 'orch-new' });
672
700
 
673
701
  await runtime.ensureGlobalOrchestratorSession();
674
702
 
675
703
  expect(runtime.orchestratorSessionId).toBe('orch-new');
676
- const logCalls = toolClient.call.mock.calls.filter((call: unknown[]) => call[0] === TOOLS.FEATURE_LOG_APPEND);
704
+ const logCalls = toolClient.call.mock.calls.filter(
705
+ (call: unknown[]) => call[0] === TOOLS.FEATURE_LOG_APPEND,
706
+ );
677
707
  expect(logCalls).toHaveLength(0);
678
708
  });
679
709
 
@@ -684,9 +714,12 @@ describe('SupervisorRuntime delegation methods', () => {
684
714
  vi.spyOn(runtime, 'loadRolePrompts').mockResolvedValue({
685
715
  planner: { system: 'planner-prompt', tools: [], model_hint: null },
686
716
  builder: { system: 'builder-prompt', tools: [], model_hint: null },
687
- qa: { system: 'qa-prompt', tools: [], model_hint: null }
717
+ qa: { system: 'qa-prompt', tools: [], model_hint: null },
688
718
  } as never);
689
- toolClient.call.mockResolvedValue({ ok: true, data: { front_matter: { version: 1, cluster: {} } } });
719
+ toolClient.call.mockResolvedValue({
720
+ ok: true,
721
+ data: { front_matter: { version: 1, cluster: {} } },
722
+ });
690
723
 
691
724
  await runtime.initializeFeatureCluster('feature_init');
692
725
 
@@ -696,14 +729,21 @@ describe('SupervisorRuntime delegation methods', () => {
696
729
 
697
730
  it('GIVEN_cluster_patch_WHEN_patchFeatureCluster_called_THEN_delegates_to_session_orchestrator', async () => {
698
731
  const { runtime, toolClient } = makeRuntime();
699
- toolClient.call.mockResolvedValue({ ok: true, data: { front_matter: { version: 1, cluster: {} } } });
732
+ toolClient.call.mockResolvedValue({
733
+ ok: true,
734
+ data: { front_matter: { version: 1, cluster: {} } },
735
+ });
700
736
 
701
- await runtime.patchFeatureCluster('feature_patch', { planner: 'planner-session', builder: 'builder-session', qa: 'qa-session' });
737
+ await runtime.patchFeatureCluster('feature_patch', {
738
+ planner: 'planner-session',
739
+ builder: 'builder-session',
740
+ qa: 'qa-session',
741
+ });
702
742
 
703
743
  expect(toolClient.call).toHaveBeenCalledWith(
704
744
  TOOLS.FEATURE_STATE_PATCH,
705
745
  expect.objectContaining({ feature_id: 'feature_patch' }),
706
- expect.any(Object)
746
+ expect.any(Object),
707
747
  );
708
748
  });
709
749
 
@@ -714,9 +754,14 @@ describe('SupervisorRuntime delegation methods', () => {
714
754
  owner_instance_id: 'none',
715
755
  orchestrator_session_id: null,
716
756
  orchestrator_epoch: 0,
717
- feature_sessions: {}
757
+ feature_sessions: {},
718
758
  });
719
- provider.createSession.mockResolvedValue({ session_id: 'new-orch-session', role: 'orchestrator', feature_id: 'global', system_prompt_loaded: false } as any);
759
+ provider.createSession.mockResolvedValue({
760
+ session_id: 'new-orch-session',
761
+ role: 'orchestrator',
762
+ feature_id: 'global',
763
+ system_prompt_loaded: false,
764
+ } as any);
720
765
 
721
766
  await runtime.ensureGlobalOrchestratorSession();
722
767
  expect(provider.createSession).toHaveBeenCalled();
@@ -729,11 +774,13 @@ describe('SupervisorRuntime delegation methods', () => {
729
774
  owner_instance_id: 'owner:test',
730
775
  orchestrator_session_id: 'orch-session',
731
776
  orchestrator_epoch: 1,
732
- feature_sessions: {}
777
+ feature_sessions: {},
733
778
  });
734
779
 
735
780
  // Should complete without throwing
736
- await expect(runtime.cleanupOrphanWorkerSessions(['feature_a', 'feature_b'])).resolves.toBeUndefined();
781
+ await expect(
782
+ runtime.cleanupOrphanWorkerSessions(['feature_a', 'feature_b']),
783
+ ).resolves.toBeUndefined();
737
784
  });
738
785
 
739
786
  it('GIVEN_queue_WHEN_reconcileQueuedFeatures_called_THEN_delegates_to_session_orchestrator', async () => {
@@ -747,7 +794,7 @@ describe('SupervisorRuntime delegation methods', () => {
747
794
  vi.spyOn(runtime, 'loadRolePrompts').mockResolvedValue({
748
795
  planner: { system: 'p', tools: [], model_hint: null },
749
796
  builder: { system: 'b', tools: [], model_hint: null },
750
- qa: { system: 'q', tools: [], model_hint: null }
797
+ qa: { system: 'q', tools: [], model_hint: null },
751
798
  } as never);
752
799
 
753
800
  const bundle = await runtime.loadRolePrompts();
@@ -758,7 +805,11 @@ describe('SupervisorRuntime delegation methods', () => {
758
805
  const { runtime } = makeRuntime();
759
806
  const newMap = new Map([['feat1', { planner: 's1', builder: 's2', qa: 's3' }]]);
760
807
  runtime.sessionsByFeature = newMap as never;
761
- expect(runtime.sessionsByFeature.get('feat1')).toEqual({ planner: 's1', builder: 's2', qa: 's3' });
808
+ expect(runtime.sessionsByFeature.get('feat1')).toEqual({
809
+ planner: 's1',
810
+ builder: 's2',
811
+ qa: 's3',
812
+ });
762
813
  });
763
814
 
764
815
  it('GIVEN_runtime_WHEN_queue_set_THEN_roundtrips_value', () => {
@@ -781,7 +832,7 @@ describe('SupervisorRuntime delegation methods', () => {
781
832
  const bundle = {
782
833
  planner: { system: 'planner-sys', tools: [], model_hint: null },
783
834
  builder: { system: 'builder-sys', tools: [], model_hint: null },
784
- qa: { system: 'qa-sys', tools: [], model_hint: null }
835
+ qa: { system: 'qa-sys', tools: [], model_hint: null },
785
836
  };
786
837
  runtime.promptsCache = bundle as never;
787
838
  expect(runtime.promptsCache).toEqual(bundle);
@@ -821,10 +872,23 @@ describe('SupervisorRuntime delegation methods', () => {
821
872
  it('GIVEN_policy_max_iterations_WHEN_no_cli_override_THEN_uses_policy_value', () => {
822
873
  const { kernel } = makeRuntime();
823
874
  kernel.getPolicySnapshot.mockReturnValue({
824
- recovery: { orchestrator_session_reattach_timeout_ms: 5000, orphan_session_cleanup_enabled: true },
825
- supervisor: { max_iterations_per_phase: 10, max_parallel_gate_runs: 2 }
826
- });
827
- const runtime2 = new SupervisorRuntime(kernel as any, { selection: { provider: 'custom', model: 'm', provider_config_ref: null }, createSession: vi.fn(), reattachSession: vi.fn(), closeSession: vi.fn() } as any, { call: vi.fn() } as any, { run_id: 'r', owner_instance_id: 'o' });
875
+ recovery: {
876
+ orchestrator_session_reattach_timeout_ms: 5000,
877
+ orphan_session_cleanup_enabled: true,
878
+ },
879
+ supervisor: { max_iterations_per_phase: 10, max_parallel_gate_runs: 2 },
880
+ });
881
+ const runtime2 = new SupervisorRuntime(
882
+ kernel as any,
883
+ {
884
+ selection: { provider: 'custom', model: 'm', provider_config_ref: null },
885
+ createSession: vi.fn(),
886
+ reattachSession: vi.fn(),
887
+ closeSession: vi.fn(),
888
+ } as any,
889
+ { call: vi.fn() } as any,
890
+ { run_id: 'r', owner_instance_id: 'o' },
891
+ );
828
892
  expect(runtime2).toBeDefined();
829
893
  });
830
894
 
@@ -841,13 +905,15 @@ describe('PromptBundleLoader branches', () => {
841
905
  getRepoRoot: () => tmpDir,
842
906
  getAgentsConfig: () => ({
843
907
  roles: {
844
- planner: { system_prompt_path: 'prompts/planner.md' }
908
+ planner: { system_prompt_path: 'prompts/planner.md' },
845
909
  },
846
- missing_prompt_behavior: 'error'
847
- })
910
+ missing_prompt_behavior: 'error',
911
+ }),
848
912
  };
849
913
  const loader = new PromptBundleLoader(reader as never);
850
- await expect(loader.loadRolePrompts()).rejects.toMatchObject({ code: ERROR_CODES.MISSING_ROLE_PROMPT });
914
+ await expect(loader.loadRolePrompts()).rejects.toMatchObject({
915
+ code: ERROR_CODES.MISSING_ROLE_PROMPT,
916
+ });
851
917
  await fs.rm(tmpDir, { recursive: true, force: true });
852
918
  });
853
919
  });
@@ -858,7 +924,10 @@ describe('BuildWaveExecutor branches', () => {
858
924
  const toolCaller = {
859
925
  callTool: vi.fn(async (_role: string, toolName: string, _args?: Record<string, unknown>) => {
860
926
  if (toolName === TOOLS.FEATURE_STATE_GET) {
861
- return { ok: true, data: { front_matter: { status: STATUS.BUILDING, gate_retry_count: 0 } } };
927
+ return {
928
+ ok: true,
929
+ data: { front_matter: { status: STATUS.BUILDING, gate_retry_count: 0 } },
930
+ };
862
931
  }
863
932
  if (toolName === TOOLS.FEATURE_GET_CONTEXT) {
864
933
  return { ok: true, data: { plan: null } };
@@ -867,7 +936,7 @@ describe('BuildWaveExecutor branches', () => {
867
936
  return { ok: true, data: { overall: 'pass', evidence_path: 'evidence.json' } };
868
937
  }
869
938
  return { ok: true, data: {} };
870
- })
939
+ }),
871
940
  };
872
941
  const executor = new BuildWaveExecutor({ toolCaller: toolCaller as never });
873
942
  await expect(executor.run(['feature_a'], 5)).resolves.toBeUndefined();
@@ -893,26 +962,26 @@ describe('QaWaveExecutor gate run throws exception', () => {
893
962
  throw new Error('gate execution failed');
894
963
  }
895
964
  return { ok: true, data: {} };
896
- })
965
+ }),
897
966
  };
898
967
  const state = {
899
968
  runId: 'run:test',
900
969
  ownerInstanceId: 'owner:test',
901
970
  orchestratorSessionId: 'orch-sess',
902
- sessionsByFeature
971
+ sessionsByFeature,
903
972
  };
904
973
  const kernel = {
905
- updateFeatureSessionAssignment: vi.fn(async () => ({ data: { updated: true } }))
974
+ updateFeatureSessionAssignment: vi.fn(async () => ({ data: { updated: true } })),
906
975
  };
907
976
  const provider = {
908
977
  closeSession: vi.fn(async () => ({ closed: true })),
909
- createSession: vi.fn(async () => ({ session_id: 'new-session' }))
978
+ createSession: vi.fn(async () => ({ session_id: 'new-session' })),
910
979
  };
911
980
  const promptProvider = {
912
- loadRolePrompts: vi.fn(async () => ({ planner: null, builder: null, qa: null }))
981
+ loadRolePrompts: vi.fn(async () => ({ planner: null, builder: null, qa: null })),
913
982
  };
914
983
  const featureClusterPatcher = {
915
- patchFeatureCluster: vi.fn(async () => ({}))
984
+ patchFeatureCluster: vi.fn(async () => ({})),
916
985
  };
917
986
  const executor = new QaWaveExecutor({
918
987
  kernel: kernel as never,
@@ -920,7 +989,7 @@ describe('QaWaveExecutor gate run throws exception', () => {
920
989
  toolCaller: toolCaller as never,
921
990
  promptProvider: promptProvider as never,
922
991
  featureClusterPatcher: featureClusterPatcher as never,
923
- state: state as never
992
+ state: state as never,
924
993
  });
925
994
  await expect(executor.run(['feature_qa'], 5)).resolves.toBeUndefined();
926
995
  });