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
@@ -13,15 +13,15 @@ function basePlan(featureId: string) {
13
13
  files: {
14
14
  create: [],
15
15
  modify: ['apps/control-plane/src/file.ts'],
16
- delete: []
16
+ delete: [],
17
17
  },
18
18
  contracts: {
19
19
  openapi: 'none',
20
20
  events: 'none',
21
- db: 'none'
21
+ db: 'none',
22
22
  },
23
23
  acceptance_criteria: ['Existing acceptance criterion.'],
24
- gate_profile: 'default'
24
+ gate_profile: 'default',
25
25
  };
26
26
  }
27
27
 
@@ -37,19 +37,19 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
37
37
  feature_id: featureId,
38
38
  state: {
39
39
  front_matter: {
40
- status: STATUS.PLANNING
41
- }
40
+ status: STATUS.PLANNING,
41
+ },
42
42
  },
43
- plan: null
44
- }
43
+ plan: null,
44
+ },
45
45
  };
46
46
  }
47
47
  return { ok: true, data: {} };
48
- })
48
+ }),
49
49
  };
50
50
 
51
51
  const planGenerator = {
52
- generateInitialPlan: vi.fn(async () => ({ feature_id: featureId }))
52
+ generateInitialPlan: vi.fn(async () => ({ feature_id: featureId })),
53
53
  };
54
54
  const workerDecisionRunner = {
55
55
  execute: vi.fn(async () => ({
@@ -58,14 +58,14 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
58
58
  noteLogged: true,
59
59
  requestHandled: false,
60
60
  priorityOrder: [],
61
- toolResults: []
62
- }))
61
+ toolResults: [],
62
+ })),
63
63
  };
64
64
 
65
65
  const executor = new PlanningWaveExecutor({
66
66
  toolCaller: toolCaller as never,
67
67
  planGenerator: planGenerator as never,
68
- workerDecisionRunner: workerDecisionRunner as never
68
+ workerDecisionRunner: workerDecisionRunner as never,
69
69
  });
70
70
 
71
71
  await executor.run([featureId]);
@@ -73,11 +73,13 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
73
73
  expect(workerDecisionRunner.execute).toHaveBeenCalledWith(
74
74
  expect.objectContaining({
75
75
  role: 'planner',
76
- featureId
77
- })
76
+ featureId,
77
+ }),
78
78
  );
79
79
  expect(planGenerator.generateInitialPlan).not.toHaveBeenCalled();
80
- const planSubmitCalls = toolCaller.callTool.mock.calls.filter((call) => call[1] === TOOLS.PLAN_SUBMIT);
80
+ const planSubmitCalls = toolCaller.callTool.mock.calls.filter(
81
+ (call) => call[1] === TOOLS.PLAN_SUBMIT,
82
+ );
81
83
  expect(planSubmitCalls).toHaveLength(0);
82
84
  });
83
85
 
@@ -93,8 +95,8 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
93
95
  spec: 'Handle missing inputs and timeout retries under concurrent requests.',
94
96
  state: {
95
97
  front_matter: {
96
- status: STATUS.BLOCKED
97
- }
98
+ status: STATUS.BLOCKED,
99
+ },
98
100
  },
99
101
  plan: basePlan(featureId),
100
102
  qa_test_index: {
@@ -103,13 +105,13 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
103
105
  failed: 1,
104
106
  running: 0,
105
107
  passed: 0,
106
- waived: 0
107
- }
108
+ waived: 0,
109
+ },
108
110
  },
109
111
  latest_evidence: {
110
- overall: 'fail'
111
- }
112
- }
112
+ overall: 'fail',
113
+ },
114
+ },
113
115
  };
114
116
  }
115
117
  if (toolName === TOOLS.PLAN_UPDATE) {
@@ -119,12 +121,12 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
119
121
  return { ok: true, data: { appended: true } };
120
122
  }
121
123
  throw new Error(`unexpected_tool:${toolName}:${String(args.feature_id ?? '')}`);
122
- })
124
+ }),
123
125
  };
124
126
 
125
127
  const executor = new PlanningWaveExecutor({
126
128
  toolCaller: toolCaller as never,
127
- planGenerator: { generateInitialPlan: vi.fn(async () => ({ feature_id: featureId })) }
129
+ planGenerator: { generateInitialPlan: vi.fn(async () => ({ feature_id: featureId })) },
128
130
  });
129
131
 
130
132
  await executor.runPostQaReconciliation([featureId], 1);
@@ -137,27 +139,29 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
137
139
  expected_plan_version: 2,
138
140
  plan_json: {
139
141
  plan_version: 3,
140
- revision_of: 2
141
- }
142
+ revision_of: 2,
143
+ },
142
144
  });
143
145
 
144
146
  const updatedPlan = updateCall?.[2].plan_json as Record<string, unknown>;
145
147
  expect(updatedPlan.acceptance_criteria).toEqual(
146
148
  expect.arrayContaining([
147
149
  'Reconcile QA/gate findings against plan scope and apply corrective updates before merge.',
148
- 'Planner reconciliation checkpoint [status=blocked;failed=1;pending=1;latest=fail]'
149
- ])
150
+ 'Planner reconciliation checkpoint [status=blocked;failed=1;pending=1;latest=fail]',
151
+ ]),
150
152
  );
151
153
  expect(updatedPlan.risk).toEqual(
152
154
  expect.arrayContaining([
153
155
  'Edge-case: boundary values and size limits are covered.',
154
156
  'Edge-case: empty/null/missing input handling is covered.',
155
157
  'Edge-case: timeout, retry, and latency behavior is covered.',
156
- 'Edge-case: concurrent access and race-condition behavior are covered.'
157
- ])
158
+ 'Edge-case: concurrent access and race-condition behavior are covered.',
159
+ ]),
158
160
  );
159
161
 
160
- const logCall = toolCaller.callTool.mock.calls.find((call) => call[1] === TOOLS.FEATURE_LOG_APPEND);
162
+ const logCall = toolCaller.callTool.mock.calls.find(
163
+ (call) => call[1] === TOOLS.FEATURE_LOG_APPEND,
164
+ );
161
165
  expect(logCall?.[0]).toBe('orchestrator');
162
166
  const note = JSON.parse(String(logCall?.[2].note)) as Record<string, unknown>;
163
167
  expect(note.decision).toBe('plan_update');
@@ -168,7 +172,7 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
168
172
  const edgeChecklist = [
169
173
  'Edge-case: boundary values and size limits are covered.',
170
174
  'Edge-case: negative-path input validation and error handling are covered.',
171
- 'Edge-case: dependency failure and retry behavior are covered.'
175
+ 'Edge-case: dependency failure and retry behavior are covered.',
172
176
  ];
173
177
  const toolCaller = {
174
178
  callTool: vi.fn(async (_role: string, toolName: string, _args: Record<string, unknown>) => {
@@ -180,12 +184,12 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
180
184
  spec: 'Simple feature flow.',
181
185
  state: {
182
186
  front_matter: {
183
- status: STATUS.READY_TO_MERGE
184
- }
187
+ status: STATUS.READY_TO_MERGE,
188
+ },
185
189
  },
186
190
  plan: {
187
191
  ...basePlan(featureId),
188
- risk: edgeChecklist
192
+ risk: edgeChecklist,
189
193
  },
190
194
  qa_test_index: {
191
195
  summary: {
@@ -193,33 +197,37 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
193
197
  failed: 0,
194
198
  running: 0,
195
199
  passed: 2,
196
- waived: 0
197
- }
200
+ waived: 0,
201
+ },
198
202
  },
199
203
  latest_evidence: {
200
- overall: 'pass'
201
- }
202
- }
204
+ overall: 'pass',
205
+ },
206
+ },
203
207
  };
204
208
  }
205
209
  if (toolName === TOOLS.FEATURE_LOG_APPEND) {
206
210
  return { ok: true, data: { appended: true } };
207
211
  }
208
212
  throw new Error(`unexpected_tool:${toolName}`);
209
- })
213
+ }),
210
214
  };
211
215
 
212
216
  const executor = new PlanningWaveExecutor({
213
217
  toolCaller: toolCaller as never,
214
- planGenerator: { generateInitialPlan: vi.fn(async () => ({ feature_id: featureId })) }
218
+ planGenerator: { generateInitialPlan: vi.fn(async () => ({ feature_id: featureId })) },
215
219
  });
216
220
 
217
221
  await executor.runPostQaReconciliation([featureId], 2);
218
222
 
219
- const planUpdateCalls = toolCaller.callTool.mock.calls.filter((call) => call[1] === TOOLS.PLAN_UPDATE);
223
+ const planUpdateCalls = toolCaller.callTool.mock.calls.filter(
224
+ (call) => call[1] === TOOLS.PLAN_UPDATE,
225
+ );
220
226
  expect(planUpdateCalls).toHaveLength(0);
221
227
 
222
- const logCall = toolCaller.callTool.mock.calls.find((call) => call[1] === TOOLS.FEATURE_LOG_APPEND);
228
+ const logCall = toolCaller.callTool.mock.calls.find(
229
+ (call) => call[1] === TOOLS.FEATURE_LOG_APPEND,
230
+ );
223
231
  expect(logCall).toBeTruthy();
224
232
  const logArgs = logCall?.[2] ?? {};
225
233
  const note = JSON.parse(String(logArgs.note));
@@ -240,28 +248,32 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
240
248
  state: { front_matter: { status: STATUS.QA } },
241
249
  plan: null,
242
250
  qa_test_index: { summary: { pending: 0, failed: 0, running: 0 } },
243
- latest_evidence: {}
244
- }
251
+ latest_evidence: {},
252
+ },
245
253
  };
246
254
  }
247
255
  if (toolName === TOOLS.FEATURE_LOG_APPEND) {
248
256
  return { ok: true, data: {} };
249
257
  }
250
258
  return { ok: true, data: {} };
251
- })
259
+ }),
252
260
  };
253
261
 
254
262
  const executor = new PlanningWaveExecutor({
255
263
  toolCaller: toolCaller as never,
256
- planGenerator: { generateInitialPlan: vi.fn() }
264
+ planGenerator: { generateInitialPlan: vi.fn() },
257
265
  });
258
266
 
259
267
  await executor.runPostQaReconciliation([featureId], 1);
260
268
 
261
- const planUpdateCalls = toolCaller.callTool.mock.calls.filter((call) => call[1] === TOOLS.PLAN_UPDATE);
269
+ const planUpdateCalls = toolCaller.callTool.mock.calls.filter(
270
+ (call) => call[1] === TOOLS.PLAN_UPDATE,
271
+ );
262
272
  expect(planUpdateCalls).toHaveLength(0);
263
273
 
264
- const logCall = toolCaller.callTool.mock.calls.find((call) => call[1] === TOOLS.FEATURE_LOG_APPEND);
274
+ const logCall = toolCaller.callTool.mock.calls.find(
275
+ (call) => call[1] === TOOLS.FEATURE_LOG_APPEND,
276
+ );
265
277
  expect(logCall).toBeTruthy();
266
278
  const logPayload = (logCall as unknown[] | undefined)?.[2] as { note?: string } | undefined;
267
279
  const note = JSON.parse(String(logPayload?.note));
@@ -283,31 +295,35 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
283
295
  plan: {
284
296
  feature_id: featureId,
285
297
  plan_version: 'not_a_number',
286
- acceptance_criteria: []
298
+ acceptance_criteria: [],
287
299
  },
288
300
  qa_test_index: { summary: { pending: 0, failed: 0, running: 0 } },
289
- latest_evidence: {}
290
- }
301
+ latest_evidence: {},
302
+ },
291
303
  };
292
304
  }
293
305
  if (toolName === TOOLS.FEATURE_LOG_APPEND) {
294
306
  return { ok: true, data: {} };
295
307
  }
296
308
  return { ok: true, data: {} };
297
- })
309
+ }),
298
310
  };
299
311
 
300
312
  const executor = new PlanningWaveExecutor({
301
313
  toolCaller: toolCaller as never,
302
- planGenerator: { generateInitialPlan: vi.fn() }
314
+ planGenerator: { generateInitialPlan: vi.fn() },
303
315
  });
304
316
 
305
317
  await executor.runPostQaReconciliation([featureId], 1);
306
318
 
307
- const planUpdateCalls = toolCaller.callTool.mock.calls.filter((call) => call[1] === TOOLS.PLAN_UPDATE);
319
+ const planUpdateCalls = toolCaller.callTool.mock.calls.filter(
320
+ (call) => call[1] === TOOLS.PLAN_UPDATE,
321
+ );
308
322
  expect(planUpdateCalls).toHaveLength(0);
309
323
 
310
- const logCall = toolCaller.callTool.mock.calls.find((call) => call[1] === TOOLS.FEATURE_LOG_APPEND);
324
+ const logCall = toolCaller.callTool.mock.calls.find(
325
+ (call) => call[1] === TOOLS.FEATURE_LOG_APPEND,
326
+ );
311
327
  expect(logCall).toBeTruthy();
312
328
  const logPayload = (logCall as unknown[] | undefined)?.[2] as { note?: string } | undefined;
313
329
  const note = JSON.parse(String(logPayload?.note));
@@ -320,7 +336,7 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
320
336
  const edgeChecklist = [
321
337
  'Edge-case: boundary values and size limits are covered.',
322
338
  'Edge-case: negative-path input validation and error handling are covered.',
323
- 'Edge-case: dependency failure and retry behavior are covered.'
339
+ 'Edge-case: dependency failure and retry behavior are covered.',
324
340
  ];
325
341
  const toolCaller = {
326
342
  callTool: vi.fn(async (_role: string, toolName: string) => {
@@ -333,28 +349,32 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
333
349
  state: { front_matter: { status: STATUS.READY_TO_MERGE } },
334
350
  plan: {
335
351
  ...basePlan(featureId),
336
- risk: edgeChecklist
352
+ risk: edgeChecklist,
353
+ },
354
+ qa_test_index: {
355
+ summary: { pending: 0, failed: 0, running: 0, passed: 1, waived: 0 },
337
356
  },
338
- qa_test_index: { summary: { pending: 0, failed: 0, running: 0, passed: 1, waived: 0 } },
339
- latest_evidence: {}
340
- }
357
+ latest_evidence: {},
358
+ },
341
359
  };
342
360
  }
343
361
  if (toolName === TOOLS.FEATURE_LOG_APPEND) {
344
362
  return { ok: true, data: {} };
345
363
  }
346
364
  return { ok: true, data: {} };
347
- })
365
+ }),
348
366
  };
349
367
 
350
368
  const executor = new PlanningWaveExecutor({
351
369
  toolCaller: toolCaller as never,
352
- planGenerator: { generateInitialPlan: vi.fn() }
370
+ planGenerator: { generateInitialPlan: vi.fn() },
353
371
  });
354
372
 
355
373
  await executor.runPostQaReconciliation([featureId], 1);
356
374
 
357
- const logCall = toolCaller.callTool.mock.calls.find((call) => call[1] === TOOLS.FEATURE_LOG_APPEND);
375
+ const logCall = toolCaller.callTool.mock.calls.find(
376
+ (call) => call[1] === TOOLS.FEATURE_LOG_APPEND,
377
+ );
358
378
  expect(logCall).toBeTruthy();
359
379
  const logPayload = (logCall as unknown[] | undefined)?.[2] as { note?: string } | undefined;
360
380
  const note = JSON.parse(String(logPayload?.note));
@@ -374,23 +394,27 @@ describe('PlanningWaveExecutor post-QA reconciliation', () => {
374
394
  state: { front_matter: { status: 42 } },
375
395
  plan: basePlan(featureId),
376
396
  qa_test_index: { summary: {} },
377
- latest_evidence: {}
378
- }
397
+ latest_evidence: {},
398
+ },
379
399
  };
380
400
  }
381
401
  return { ok: true, data: {} };
382
- })
402
+ }),
383
403
  };
384
404
 
385
405
  const executor = new PlanningWaveExecutor({
386
406
  toolCaller: toolCaller as never,
387
- planGenerator: { generateInitialPlan: vi.fn() }
407
+ planGenerator: { generateInitialPlan: vi.fn() },
388
408
  });
389
409
 
390
410
  await executor.runPostQaReconciliation([featureId], 1);
391
411
 
392
- const planUpdateCalls = toolCaller.callTool.mock.calls.filter((call) => call[1] === TOOLS.PLAN_UPDATE);
393
- const logCalls = toolCaller.callTool.mock.calls.filter((call) => call[1] === TOOLS.FEATURE_LOG_APPEND);
412
+ const planUpdateCalls = toolCaller.callTool.mock.calls.filter(
413
+ (call) => call[1] === TOOLS.PLAN_UPDATE,
414
+ );
415
+ const logCalls = toolCaller.callTool.mock.calls.filter(
416
+ (call) => call[1] === TOOLS.FEATURE_LOG_APPEND,
417
+ );
394
418
  expect(planUpdateCalls).toHaveLength(0);
395
419
  expect(logCalls).toHaveLength(0);
396
420
  });
@@ -3,7 +3,10 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
5
5
 
6
- import { mergePolicy, loadComposedPolicy } from '../src/application/services/policy-loader-service.js';
6
+ import {
7
+ mergePolicy,
8
+ loadComposedPolicy,
9
+ } from '../src/application/services/policy-loader-service.js';
7
10
  import { SchemaRegistry } from '../src/core/schemas.js';
8
11
 
9
12
  // ---------------------------------------------------------------------------
@@ -68,26 +71,31 @@ describe('mergePolicy', () => {
68
71
  it('GIVEN_deeply_nested_user_value_WHEN_merged_THEN_only_overridden_leaf_changes', () => {
69
72
  const defaults = {
70
73
  execution: {
71
- retry_policy: { transient_max_retries: 1, transient_error_codes: [124] }
72
- }
74
+ retry_policy: { transient_max_retries: 1, transient_error_codes: [124] },
75
+ },
73
76
  };
74
77
  const user = {
75
78
  execution: {
76
- retry_policy: { transient_max_retries: 3 }
77
- }
79
+ retry_policy: { transient_max_retries: 3 },
80
+ },
78
81
  };
79
82
  const result = mergePolicy(defaults, user) as {
80
- execution: { retry_policy: { transient_max_retries: number; transient_error_codes: number[] } };
83
+ execution: {
84
+ retry_policy: { transient_max_retries: number; transient_error_codes: number[] };
85
+ };
81
86
  };
82
87
  expect(result.execution.retry_policy.transient_max_retries).toBe(3);
83
88
  expect(result.execution.retry_policy.transient_error_codes).toEqual([124]);
84
89
  });
85
90
 
86
91
  it('GIVEN_array_in_protected_areas_WHEN_user_overrides_THEN_array_is_replaced_wholesale', () => {
87
- const defaults = { protected_areas: ['agentic/orchestrator/policy.yaml'] };
88
- const user = { protected_areas: ['agentic/orchestrator/policy.yaml', 'libs/core'] };
92
+ const defaults = { protected_areas: ['config/agentic/orchestrator/policy.yaml'] };
93
+ const user = { protected_areas: ['config/agentic/orchestrator/policy.yaml', 'libs/core'] };
89
94
  const result = mergePolicy(defaults, user) as Record<string, unknown>;
90
- expect(result['protected_areas']).toEqual(['agentic/orchestrator/policy.yaml', 'libs/core']);
95
+ expect(result['protected_areas']).toEqual([
96
+ 'config/agentic/orchestrator/policy.yaml',
97
+ 'libs/core',
98
+ ]);
91
99
  expect((result['protected_areas'] as unknown[]).length).toBe(2);
92
100
  });
93
101
  });
@@ -145,12 +153,18 @@ notifications:
145
153
  const result = await loadComposedPolicy(tmpDir, policyPath, schemaRegistry);
146
154
 
147
155
  // User values are preserved in merged result
148
- expect((result.mergedPolicy['worktree'] as Record<string, unknown>)['base_branch']).toBe('develop');
149
- expect((result.mergedPolicy['supervisor'] as Record<string, unknown>)['max_parallel_gate_runs']).toBe(4);
156
+ expect((result.mergedPolicy['worktree'] as Record<string, unknown>)['base_branch']).toBe(
157
+ 'develop',
158
+ );
159
+ expect(
160
+ (result.mergedPolicy['supervisor'] as Record<string, unknown>)['max_parallel_gate_runs'],
161
+ ).toBe(4);
150
162
 
151
163
  // Defaults fill in required fields not in lean policy
152
164
  expect(result.mergedPolicy['implementation']).toBeDefined();
153
- expect((result.mergedPolicy['implementation'] as Record<string, unknown>)['workspace']).toBe('nx');
165
+ expect((result.mergedPolicy['implementation'] as Record<string, unknown>)['workspace']).toBe(
166
+ 'nx',
167
+ );
154
168
  expect(result.mergedPolicy['rbac']).toBeDefined();
155
169
  expect(result.mergedPolicy['locks']).toBeDefined();
156
170
  });
@@ -179,7 +193,7 @@ locks:
179
193
  multiplier: 2
180
194
  jitter_ms: 50
181
195
  protected_areas:
182
- - agentic/orchestrator/policy.yaml
196
+ - config/agentic/orchestrator/policy.yaml
183
197
  required_modes:
184
198
  - fast
185
199
  required_merge_mode: merge
@@ -232,10 +246,18 @@ rbac:
232
246
  const result = await loadComposedPolicy(tmpDir, policyPath, schemaRegistry);
233
247
 
234
248
  // User values dominate
235
- expect((result.mergedPolicy['commit_policy'] as Record<string, unknown>)['allow_commit']).toBe(true);
236
- expect((result.mergedPolicy['execution'] as Record<string, unknown>)['default_step_timeout_seconds']).toBe(300);
237
- expect((result.mergedPolicy['merge_policy'] as Record<string, unknown>)['require_user_approval']).toBe(false);
238
- const strategies = (result.mergedPolicy['merge_policy'] as Record<string, unknown>)['allowed_strategies'];
249
+ expect((result.mergedPolicy['commit_policy'] as Record<string, unknown>)['allow_commit']).toBe(
250
+ true,
251
+ );
252
+ expect(
253
+ (result.mergedPolicy['execution'] as Record<string, unknown>)['default_step_timeout_seconds'],
254
+ ).toBe(300);
255
+ expect(
256
+ (result.mergedPolicy['merge_policy'] as Record<string, unknown>)['require_user_approval'],
257
+ ).toBe(false);
258
+ const strategies = (result.mergedPolicy['merge_policy'] as Record<string, unknown>)[
259
+ 'allowed_strategies'
260
+ ];
239
261
  expect(strategies).toEqual(['squash']);
240
262
  });
241
263
 
@@ -286,7 +308,7 @@ locks:
286
308
  multiplier: 2
287
309
  jitter_ms: 150
288
310
  protected_areas:
289
- - agentic/orchestrator/policy.yaml
311
+ - config/agentic/orchestrator/policy.yaml
290
312
  required_modes:
291
313
  - fast
292
314
  required_merge_mode: merge
@@ -326,7 +348,7 @@ rbac:
326
348
  `;
327
349
  const policyPath = await writePolicyFile(badPolicy);
328
350
  await expect(loadComposedPolicy(tmpDir, policyPath, schemaRegistry)).rejects.toThrow(
329
- /invalid_policy_yaml/
351
+ /invalid_policy_yaml/,
330
352
  );
331
353
  });
332
354