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
@@ -10,7 +10,7 @@ vi.mock('../src/core/fs.js', async (importOriginal) => {
10
10
  return {
11
11
  ...actual,
12
12
  pathExists: vi.fn(async () => false),
13
- nowIso: actual.nowIso
13
+ nowIso: actual.nowIso,
14
14
  };
15
15
  });
16
16
 
@@ -25,7 +25,7 @@ function makeIndex(overrides: Partial<AnyRecord> = {}): AnyRecord {
25
25
  locks: {},
26
26
  lock_leases: {},
27
27
  updated_at: '2026-01-01T00:00:00.000Z',
28
- ...overrides
28
+ ...overrides,
29
29
  };
30
30
  }
31
31
 
@@ -40,24 +40,26 @@ function makePolicy(overrides: Partial<AnyRecord> = {}): AnyRecord {
40
40
  initial_ms: 10,
41
41
  max_ms: 100,
42
42
  multiplier: 2,
43
- jitter_ms: 0
43
+ jitter_ms: 0,
44
44
  },
45
- ...overrides
46
- }
45
+ ...overrides,
46
+ },
47
47
  };
48
48
  }
49
49
 
50
50
  function makePort(indexData: AnyRecord, policyData: AnyRecord): LockServicePort {
51
51
  let stored = { ...indexData };
52
52
  return {
53
- withIndexLock: vi.fn(async (fn: () => Promise<unknown>) => fn()) as unknown as <T>(operation: () => Promise<T>) => Promise<T>,
53
+ withIndexLock: vi.fn(async (fn: () => Promise<unknown>) => fn()) as unknown as <T>(
54
+ operation: () => Promise<T>,
55
+ ) => Promise<T>,
54
56
  readIndex: vi.fn(async () => ({ ...stored })),
55
57
  writeIndex: vi.fn(async (idx: AnyRecord) => {
56
58
  stored = { ...idx };
57
59
  }),
58
60
  updateState: vi.fn(async () => ({})),
59
61
  statePath: vi.fn((featureId: string) => `/tmp/.aop/features/${featureId}/state.md`),
60
- getPolicySnapshot: vi.fn(() => policyData)
62
+ getPolicySnapshot: vi.fn(() => policyData),
61
63
  };
62
64
  }
63
65
 
@@ -85,9 +87,9 @@ describe('LockService', () => {
85
87
  ci: {
86
88
  holder: 'feature-a',
87
89
  lease_id: 'existing-lease',
88
- expires_at: new Date(Date.now() + 60000).toISOString()
89
- }
90
- }
90
+ expires_at: new Date(Date.now() + 60000).toISOString(),
91
+ },
92
+ },
91
93
  });
92
94
  const port = makePort(index, makePolicy());
93
95
  const svc = new LockService(port);
@@ -105,9 +107,9 @@ describe('LockService', () => {
105
107
  ci: {
106
108
  holder: 'feature-old',
107
109
  lease_id: 'old-lease',
108
- expires_at: new Date(Date.now() - 5000).toISOString()
109
- }
110
- }
110
+ expires_at: new Date(Date.now() - 5000).toISOString(),
111
+ },
112
+ },
111
113
  });
112
114
  const port = makePort(index, makePolicy());
113
115
  const svc = new LockService(port);
@@ -125,8 +127,8 @@ describe('LockService', () => {
125
127
 
126
128
  await expect(svc.locksAcquire('unknown-resource', 'feature-a', null)).rejects.toMatchObject({
127
129
  normalizedResponse: expect.objectContaining({
128
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
129
- })
130
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
131
+ }),
130
132
  });
131
133
  });
132
134
 
@@ -136,8 +138,8 @@ describe('LockService', () => {
136
138
 
137
139
  await expect(svc.locksAcquire(null, 'feature-a', null)).rejects.toMatchObject({
138
140
  normalizedResponse: expect.objectContaining({
139
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
140
- })
141
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
142
+ }),
141
143
  });
142
144
  });
143
145
 
@@ -147,8 +149,8 @@ describe('LockService', () => {
147
149
 
148
150
  await expect(svc.locksAcquire('ci', null, null)).rejects.toMatchObject({
149
151
  normalizedResponse: expect.objectContaining({
150
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
151
- })
152
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
153
+ }),
152
154
  });
153
155
  });
154
156
 
@@ -159,9 +161,9 @@ describe('LockService', () => {
159
161
  ci: {
160
162
  holder: 'feature-b',
161
163
  lease_id: 'b-lease',
162
- expires_at: new Date(Date.now() + 60000).toISOString()
163
- }
164
- }
164
+ expires_at: new Date(Date.now() + 60000).toISOString(),
165
+ },
166
+ },
165
167
  });
166
168
  const policy = makePolicy({ acquire_behavior: 'fail' });
167
169
  const port = makePort(index, policy);
@@ -169,8 +171,8 @@ describe('LockService', () => {
169
171
 
170
172
  await expect(svc.locksAcquire('ci', 'feature-a', null)).rejects.toMatchObject({
171
173
  normalizedResponse: expect.objectContaining({
172
- error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT })
173
- })
174
+ error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT }),
175
+ }),
174
176
  });
175
177
  });
176
178
 
@@ -181,23 +183,23 @@ describe('LockService', () => {
181
183
  ci: {
182
184
  holder: 'feature-b',
183
185
  lease_id: 'b-lease',
184
- expires_at: new Date(Date.now() + 60000).toISOString()
185
- }
186
- }
186
+ expires_at: new Date(Date.now() + 60000).toISOString(),
187
+ },
188
+ },
187
189
  });
188
190
  // Very short timeout so the test completes quickly
189
191
  const policy = makePolicy({
190
192
  acquire_behavior: 'wait',
191
193
  default_wait_timeout_seconds: 0,
192
- acquire_backoff: { initial_ms: 5, max_ms: 5, multiplier: 1, jitter_ms: 0 }
194
+ acquire_backoff: { initial_ms: 5, max_ms: 5, multiplier: 1, jitter_ms: 0 },
193
195
  });
194
196
  const port = makePort(index, policy);
195
197
  const svc = new LockService(port);
196
198
 
197
199
  await expect(svc.locksAcquire('ci', 'feature-a', 0)).rejects.toMatchObject({
198
200
  normalizedResponse: expect.objectContaining({
199
- error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT })
200
- })
201
+ error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT }),
202
+ }),
201
203
  });
202
204
  });
203
205
 
@@ -208,13 +210,13 @@ describe('LockService', () => {
208
210
  ci: {
209
211
  holder: 'feature-b',
210
212
  lease_id: 'b-lease',
211
- expires_at: new Date(Date.now() + 60000).toISOString()
212
- }
213
- }
213
+ expires_at: new Date(Date.now() + 60000).toISOString(),
214
+ },
215
+ },
214
216
  });
215
217
  const policy = makePolicy({
216
218
  acquire_behavior: 'wait',
217
- acquire_backoff: { initial_ms: 5, max_ms: 5, multiplier: 1, jitter_ms: 0 }
219
+ acquire_backoff: { initial_ms: 5, max_ms: 5, multiplier: 1, jitter_ms: 0 },
218
220
  });
219
221
  const port = makePort(index, policy);
220
222
  const svc = new LockService(port);
@@ -222,8 +224,8 @@ describe('LockService', () => {
222
224
  // Pass 0 seconds explicitly (overrides policy default)
223
225
  await expect(svc.locksAcquire('ci', 'feature-a', 0)).rejects.toMatchObject({
224
226
  normalizedResponse: expect.objectContaining({
225
- error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT })
226
- })
227
+ error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT }),
228
+ }),
227
229
  });
228
230
  });
229
231
  });
@@ -233,8 +235,12 @@ describe('LockService', () => {
233
235
  const index = makeIndex({
234
236
  locks: { ci: 'feature-a' },
235
237
  lock_leases: {
236
- ci: { holder: 'feature-a', lease_id: 'lease-1', expires_at: new Date(Date.now() + 60000).toISOString() }
237
- }
238
+ ci: {
239
+ holder: 'feature-a',
240
+ lease_id: 'lease-1',
241
+ expires_at: new Date(Date.now() + 60000).toISOString(),
242
+ },
243
+ },
238
244
  });
239
245
  const port = makePort(index, makePolicy());
240
246
  const svc = new LockService(port);
@@ -253,8 +259,8 @@ describe('LockService', () => {
253
259
 
254
260
  await expect(svc.locksRelease(null, null)).rejects.toMatchObject({
255
261
  normalizedResponse: expect.objectContaining({
256
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
257
- })
262
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
263
+ }),
258
264
  });
259
265
  });
260
266
 
@@ -264,8 +270,8 @@ describe('LockService', () => {
264
270
 
265
271
  await expect(svc.locksRelease(null, 'feature-a')).rejects.toMatchObject({
266
272
  normalizedResponse: expect.objectContaining({
267
- error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT })
268
- })
273
+ error: expect.objectContaining({ code: ERROR_CODES.INVALID_ARGUMENT }),
274
+ }),
269
275
  });
270
276
  });
271
277
 
@@ -273,16 +279,20 @@ describe('LockService', () => {
273
279
  const index = makeIndex({
274
280
  locks: { ci: 'feature-b' },
275
281
  lock_leases: {
276
- ci: { holder: 'feature-b', lease_id: 'lease-b', expires_at: new Date(Date.now() + 60000).toISOString() }
277
- }
282
+ ci: {
283
+ holder: 'feature-b',
284
+ lease_id: 'lease-b',
285
+ expires_at: new Date(Date.now() + 60000).toISOString(),
286
+ },
287
+ },
278
288
  });
279
289
  const port = makePort(index, makePolicy());
280
290
  const svc = new LockService(port);
281
291
 
282
292
  await expect(svc.locksRelease('ci', 'feature-a')).rejects.toMatchObject({
283
293
  normalizedResponse: expect.objectContaining({
284
- error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT })
285
- })
294
+ error: expect.objectContaining({ code: ERROR_CODES.LOCK_CONFLICT }),
295
+ }),
286
296
  });
287
297
  });
288
298
 
@@ -299,7 +309,9 @@ describe('LockService', () => {
299
309
  it('GIVEN_collisionQueueService_present_WHEN_locksRelease_called_THEN_reDrives_queue', async () => {
300
310
  const index = makeIndex({ locks: { ci: 'feature-a' }, lock_leases: { ci: null } });
301
311
  const port = makePort(index, makePolicy());
302
- const reDriveFn = vi.fn(async () => ({ data: { processed: 1, retried: 1, still_blocked: 0 } }));
312
+ const reDriveFn = vi.fn(async () => ({
313
+ data: { processed: 1, retried: 1, still_blocked: 0 },
314
+ }));
303
315
  port.collisionQueueService = { reDriveBlockedQueue: reDriveFn };
304
316
  const svc = new LockService(port);
305
317
 
@@ -314,7 +326,7 @@ describe('LockService', () => {
314
326
  port.collisionQueueService = {
315
327
  reDriveBlockedQueue: vi.fn(async () => {
316
328
  throw new Error('queue error');
317
- })
329
+ }),
318
330
  };
319
331
  const svc = new LockService(port);
320
332
 
@@ -340,8 +352,8 @@ describe('LockService', () => {
340
352
  const index = makeIndex({
341
353
  locks: { ci: 'feature-a' },
342
354
  lock_leases: {
343
- ci: { holder: 'feature-a', lease_id: 'lease-1', expires_at: oldExpiry }
344
- }
355
+ ci: { holder: 'feature-a', lease_id: 'lease-1', expires_at: oldExpiry },
356
+ },
345
357
  });
346
358
  const port = makePort(index, makePolicy());
347
359
  const svc = new LockService(port);
@@ -357,8 +369,12 @@ describe('LockService', () => {
357
369
  it('GIVEN_no_matching_holders_WHEN_renewLeases_called_THEN_does_not_write_index', async () => {
358
370
  const index = makeIndex({
359
371
  lock_leases: {
360
- ci: { holder: 'feature-b', lease_id: 'lease-b', expires_at: new Date(Date.now() + 60000).toISOString() }
361
- }
372
+ ci: {
373
+ holder: 'feature-b',
374
+ lease_id: 'lease-b',
375
+ expires_at: new Date(Date.now() + 60000).toISOString(),
376
+ },
377
+ },
362
378
  });
363
379
  const port = makePort(index, makePolicy());
364
380
  const svc = new LockService(port);
@@ -370,7 +386,7 @@ describe('LockService', () => {
370
386
 
371
387
  it('GIVEN_null_lease_entry_WHEN_renewLeases_called_THEN_skips_entry', async () => {
372
388
  const index = makeIndex({
373
- lock_leases: { ci: null }
389
+ lock_leases: { ci: null },
374
390
  });
375
391
  const port = makePort(index, makePolicy());
376
392
  const svc = new LockService(port);
@@ -383,8 +399,12 @@ describe('LockService', () => {
383
399
  it('GIVEN_empty_featureIds_WHEN_renewLeases_called_THEN_does_not_write_index', async () => {
384
400
  const index = makeIndex({
385
401
  lock_leases: {
386
- ci: { holder: 'feature-a', lease_id: 'lease-1', expires_at: new Date(Date.now() + 60000).toISOString() }
387
- }
402
+ ci: {
403
+ holder: 'feature-a',
404
+ lease_id: 'lease-1',
405
+ expires_at: new Date(Date.now() + 60000).toISOString(),
406
+ },
407
+ },
388
408
  });
389
409
  const port = makePort(index, makePolicy());
390
410
  const svc = new LockService(port);
@@ -399,8 +419,12 @@ describe('LockService', () => {
399
419
  it('GIVEN_no_stale_leases_WHEN_recoverFromState_called_THEN_returns_empty_stale_list', async () => {
400
420
  const index = makeIndex({
401
421
  lock_leases: {
402
- ci: { holder: 'feature-a', lease_id: 'lease-1', expires_at: new Date(Date.now() + 60000).toISOString() }
403
- }
422
+ ci: {
423
+ holder: 'feature-a',
424
+ lease_id: 'lease-1',
425
+ expires_at: new Date(Date.now() + 60000).toISOString(),
426
+ },
427
+ },
404
428
  });
405
429
  const port = makePort(index, makePolicy());
406
430
  const svc = new LockService(port);
@@ -419,10 +443,10 @@ describe('LockService', () => {
419
443
  ci: {
420
444
  holder: 'feature-stale',
421
445
  lease_id: 'old-lease',
422
- expires_at: new Date(Date.now() - 10000).toISOString()
423
- }
446
+ expires_at: new Date(Date.now() - 10000).toISOString(),
447
+ },
424
448
  },
425
- locks: { ci: 'feature-stale' }
449
+ locks: { ci: 'feature-stale' },
426
450
  });
427
451
  const port = makePort(index, makePolicy());
428
452
  const svc = new LockService(port);
@@ -437,7 +461,7 @@ describe('LockService', () => {
437
461
 
438
462
  it('GIVEN_null_lease_entry_WHEN_recoverFromState_called_THEN_skips_entry', async () => {
439
463
  const index = makeIndex({
440
- lock_leases: { ci: null }
464
+ lock_leases: { ci: null },
441
465
  });
442
466
  const port = makePort(index, makePolicy());
443
467
  const svc = new LockService(port);
@@ -454,10 +478,10 @@ describe('LockService', () => {
454
478
  deploy: {
455
479
  holder: 'ghost-feature',
456
480
  lease_id: 'ghost-lease',
457
- expires_at: new Date(Date.now() - 5000).toISOString()
458
- }
481
+ expires_at: new Date(Date.now() - 5000).toISOString(),
482
+ },
459
483
  },
460
- locks: { deploy: 'ghost-feature' }
484
+ locks: { deploy: 'ghost-feature' },
461
485
  });
462
486
  const port = makePort(index, makePolicy());
463
487
  const svc = new LockService(port);
@@ -476,15 +500,15 @@ describe('LockService', () => {
476
500
  ci: {
477
501
  holder: 'feature-x',
478
502
  lease_id: 'lease-1',
479
- expires_at: new Date(Date.now() - 5000).toISOString()
503
+ expires_at: new Date(Date.now() - 5000).toISOString(),
480
504
  },
481
505
  deploy: {
482
506
  holder: 'feature-x',
483
507
  lease_id: 'lease-2',
484
- expires_at: new Date(Date.now() - 5000).toISOString()
485
- }
508
+ expires_at: new Date(Date.now() - 5000).toISOString(),
509
+ },
486
510
  },
487
- locks: { ci: 'feature-x', deploy: 'feature-x' }
511
+ locks: { ci: 'feature-x', deploy: 'feature-x' },
488
512
  });
489
513
  const port = makePort(index, makePolicy());
490
514
  const svc = new LockService(port);
@@ -12,14 +12,14 @@ import { ToolContractValidator } from '../src/mcp/tool-contract-validator.js';
12
12
  import {
13
13
  isMutatingTool,
14
14
  toolRequiresOperationId,
15
- withOperationIdIfRequired
15
+ withOperationIdIfRequired,
16
16
  } from '../src/application/tools/tool-metadata.js';
17
17
 
18
18
  describe('McpServerAdapter helpers', () => {
19
19
  it('GIVEN_valid_token_and_empty_arguments_WHEN_calling_tool_THEN_forwards_claims', async () => {
20
20
  const runtime = {
21
21
  listTools: vi.fn(async () => [{ name: 'report.dashboard' }]),
22
- callTool: vi.fn(async () => ok({ accepted: true }))
22
+ callTool: vi.fn(async () => ok({ accepted: true })),
23
23
  };
24
24
  const auth = {
25
25
  verifyToken: vi.fn(() => ({
@@ -28,8 +28,8 @@ describe('McpServerAdapter helpers', () => {
28
28
  actor_type: 'orchestrator',
29
29
  actor_id: 'actor-1',
30
30
  issued_at: new Date().toISOString(),
31
- expires_at: new Date(Date.now() + 60_000).toISOString()
32
- }))
31
+ expires_at: new Date(Date.now() + 60_000).toISOString(),
32
+ })),
33
33
  };
34
34
  const adapter = new McpServerAdapter(runtime as any, auth as any);
35
35
 
@@ -40,13 +40,13 @@ describe('McpServerAdapter helpers', () => {
40
40
  expect(runtime.callTool).toHaveBeenCalledWith(
41
41
  'report.dashboard',
42
42
  {},
43
- expect.objectContaining({ actor_type: 'orchestrator', actor_id: 'actor-1' })
43
+ expect.objectContaining({ actor_type: 'orchestrator', actor_id: 'actor-1' }),
44
44
  );
45
45
  });
46
46
 
47
47
  it('GIVEN_mismatched_actor_claim_or_normalized_error_WHEN_calling_tool_THEN_returns_expected_failure', async () => {
48
48
  const runtime = {
49
- callTool: vi.fn()
49
+ callTool: vi.fn(),
50
50
  };
51
51
  const auth = {
52
52
  verifyToken: vi.fn(() => ({
@@ -55,32 +55,32 @@ describe('McpServerAdapter helpers', () => {
55
55
  actor_type: 'orchestrator',
56
56
  actor_id: 'actor-1',
57
57
  issued_at: new Date().toISOString(),
58
- expires_at: new Date(Date.now() + 60_000).toISOString()
59
- }))
58
+ expires_at: new Date(Date.now() + 60_000).toISOString(),
59
+ })),
60
60
  };
61
61
  const adapter = new McpServerAdapter(runtime as any, auth as any);
62
62
 
63
63
  const mismatch = await adapter.toolsCall({
64
64
  name: 'report.dashboard',
65
- arguments: { actor_id: 'other-actor' }
65
+ arguments: { actor_id: 'other-actor' },
66
66
  });
67
67
  expect(mismatch).toMatchObject({
68
68
  ok: false,
69
- error: { code: ERROR_CODES.INVALID_ACTOR_CLAIM }
69
+ error: { code: ERROR_CODES.INVALID_ACTOR_CLAIM },
70
70
  });
71
71
 
72
72
  auth.verifyToken = vi.fn(() => {
73
73
  throw {
74
74
  normalizedResponse: {
75
75
  ok: false,
76
- error: { code: 'normalized_error' }
77
- }
76
+ error: { code: 'normalized_error' },
77
+ },
78
78
  };
79
79
  });
80
80
  const normalized = await adapter.toolsCall({ name: 'report.dashboard', arguments: {} });
81
81
  expect(normalized).toMatchObject({
82
82
  ok: false,
83
- error: { code: 'normalized_error' }
83
+ error: { code: 'normalized_error' },
84
84
  });
85
85
 
86
86
  auth.verifyToken = vi.fn(() => {
@@ -89,7 +89,7 @@ describe('McpServerAdapter helpers', () => {
89
89
  const unauthenticated = await adapter.toolsCall({ name: 'report.dashboard', arguments: {} });
90
90
  expect(unauthenticated).toMatchObject({
91
91
  ok: false,
92
- error: { code: ERROR_CODES.UNAUTHENTICATED }
92
+ error: { code: ERROR_CODES.UNAUTHENTICATED },
93
93
  });
94
94
  });
95
95
  });
@@ -110,14 +110,22 @@ describe('OperationLedger', () => {
110
110
  const ledger = new OperationLedger(repoRoot);
111
111
  vi.spyOn(ledger, 'ensureRunLedger').mockResolvedValue(undefined);
112
112
 
113
- await expect(ledger.resolveOperation('run-x', 'op-x', 'hash-x')).resolves.toEqual({ status: 'new' });
114
- await ledger.recordOperation('run-x', 'op-x', 'feature.init', 'hash-x', ok({ initialized: true }));
113
+ await expect(ledger.resolveOperation('run-x', 'op-x', 'hash-x')).resolves.toEqual({
114
+ status: 'new',
115
+ });
116
+ await ledger.recordOperation(
117
+ 'run-x',
118
+ 'op-x',
119
+ 'feature.init',
120
+ 'hash-x',
121
+ ok({ initialized: true }),
122
+ );
115
123
 
116
124
  const stored = JSON.parse(await fs.readFile(ledger.ledgerPath('run-x'), 'utf8'));
117
125
  expect(stored.operations['op-x']).toMatchObject({
118
126
  operation_id: 'op-x',
119
127
  tool_name: 'feature.init',
120
- request_hash: 'hash-x'
128
+ request_hash: 'hash-x',
121
129
  });
122
130
  });
123
131
 
@@ -141,8 +149,8 @@ describe('ToolAuthorizer', () => {
141
149
  const registry = {
142
150
  toolsByName: new Map([
143
151
  ['report.dashboard', { supported_roles: ['orchestrator'] }],
144
- ['feature.init', { supported_roles: ['orchestrator', 'system'] }]
145
- ])
152
+ ['feature.init', { supported_roles: ['orchestrator', 'system'] }],
153
+ ]),
146
154
  };
147
155
 
148
156
  it('GIVEN_missing_tool_or_role_allowlist_WHEN_authorizing_THEN_returns_false', () => {
@@ -153,7 +161,7 @@ describe('ToolAuthorizer', () => {
153
161
 
154
162
  it('GIVEN_policy_references_unknown_tool_WHEN_constructing_THEN_throws', () => {
155
163
  expect(() => new ToolAuthorizer({ orchestrator: ['missing.tool'] }, registry as any)).toThrow(
156
- 'policy_references_unknown_tool:orchestrator:missing.tool'
164
+ 'policy_references_unknown_tool:orchestrator:missing.tool',
157
165
  );
158
166
  });
159
167
  });
@@ -164,29 +172,29 @@ describe('ToolContractValidator', () => {
164
172
  readErrorsSchema: vi.fn(async () => ({
165
173
  type: 'object',
166
174
  required: ['ok'],
167
- properties: { ok: { type: 'boolean' } }
175
+ properties: { ok: { type: 'boolean' } },
168
176
  })),
169
177
  readSchemaByRef: vi.fn(async (schemaRef: string) => {
170
178
  if (schemaRef.includes('input')) {
171
179
  return {
172
180
  type: 'object',
173
181
  required: ['id'],
174
- properties: { id: { type: 'string' } }
182
+ properties: { id: { type: 'string' } },
175
183
  };
176
184
  }
177
185
  return {
178
186
  type: 'object',
179
187
  required: ['result'],
180
- properties: { result: { type: 'string' } }
188
+ properties: { result: { type: 'string' } },
181
189
  };
182
- })
190
+ }),
183
191
  };
184
192
  const registry = {
185
- toolsRoot: '/tmp'
193
+ toolsRoot: '/tmp',
186
194
  };
187
195
  const tool = {
188
196
  input_schema_ref: 'schemas/input/tool.schema.json',
189
- output_schema_ref: 'schemas/output/tool.schema.json'
197
+ output_schema_ref: 'schemas/output/tool.schema.json',
190
198
  };
191
199
 
192
200
  const validator = await ToolContractValidator.create(loader as any, registry as any);
@@ -204,19 +212,19 @@ describe('ToolContractValidator', () => {
204
212
  readErrorsSchema: vi.fn(async () => ({
205
213
  type: 'object',
206
214
  required: ['ok'],
207
- properties: { ok: { type: 'boolean' } }
215
+ properties: { ok: { type: 'boolean' } },
208
216
  })),
209
217
  readSchemaByRef: vi.fn(async (schemaRef: string) => {
210
218
  if (schemaRef.includes('input')) {
211
219
  return { type: 'object', required: ['id'], properties: { id: { type: 'string' } } };
212
220
  }
213
221
  return { type: 'object', required: ['result'], properties: { result: { type: 'string' } } };
214
- })
222
+ }),
215
223
  };
216
224
  const registry = { toolsRoot: '/tmp' };
217
225
  const tool = {
218
226
  input_schema_ref: 'schemas/input/tool.schema.json',
219
- output_schema_ref: 'schemas/output/tool.schema.json'
227
+ output_schema_ref: 'schemas/output/tool.schema.json',
220
228
  };
221
229
 
222
230
  const validator = await ToolContractValidator.create(loader as never, registry as never);
@@ -237,9 +245,9 @@ describe('ToolContractValidator', () => {
237
245
  readErrorsSchema: vi.fn(async () => ({
238
246
  type: 'object',
239
247
  required: ['ok'],
240
- properties: { ok: { type: 'boolean' } }
248
+ properties: { ok: { type: 'boolean' } },
241
249
  })),
242
- readSchemaByRef: vi.fn(async () => ({}))
250
+ readSchemaByRef: vi.fn(async () => ({})),
243
251
  };
244
252
  const registry = { toolsRoot: '/tmp' };
245
253
 
@@ -256,16 +264,19 @@ describe('ToolContractValidator', () => {
256
264
  readErrorsSchema: vi.fn(async () => ({
257
265
  type: 'object',
258
266
  required: ['ok'],
259
- properties: { ok: { type: 'boolean' } }
267
+ properties: { ok: { type: 'boolean' } },
260
268
  })),
261
- readSchemaByRef: vi.fn(async () => ({}))
269
+ readSchemaByRef: vi.fn(async () => ({})),
262
270
  };
263
271
  const registry = { toolsRoot: '/tmp' };
264
272
  const validator = await ToolContractValidator.create(loader as never, registry as never);
265
273
 
266
274
  const mockFn = vi.fn(() => false) as ReturnType<typeof vi.fn> & { errors: null };
267
275
  mockFn.errors = null;
268
- validator.validators.set(path.resolve('/tmp', 'schemas/input/null-errors.json'), mockFn as never);
276
+ validator.validators.set(
277
+ path.resolve('/tmp', 'schemas/input/null-errors.json'),
278
+ mockFn as never,
279
+ );
269
280
 
270
281
  const tool = { input_schema_ref: 'schemas/input/null-errors.json' } as never;
271
282
  const result = await validator.validateInput(tool, {});
@@ -278,16 +289,19 @@ describe('ToolContractValidator', () => {
278
289
  readErrorsSchema: vi.fn(async () => ({
279
290
  type: 'object',
280
291
  required: ['ok'],
281
- properties: { ok: { type: 'boolean' } }
292
+ properties: { ok: { type: 'boolean' } },
282
293
  })),
283
- readSchemaByRef: vi.fn(async () => ({}))
294
+ readSchemaByRef: vi.fn(async () => ({})),
284
295
  };
285
296
  const registry = { toolsRoot: '/tmp' };
286
297
  const validator = await ToolContractValidator.create(loader as never, registry as never);
287
298
 
288
299
  const mockFn = vi.fn(() => false) as ReturnType<typeof vi.fn> & { errors: null };
289
300
  mockFn.errors = null;
290
- validator.validators.set(path.resolve('/tmp', 'schemas/output/null-errors.json'), mockFn as never);
301
+ validator.validators.set(
302
+ path.resolve('/tmp', 'schemas/output/null-errors.json'),
303
+ mockFn as never,
304
+ );
291
305
 
292
306
  const tool = { output_schema_ref: 'schemas/output/null-errors.json' } as never;
293
307
  const result = await validator.validateOutput(tool, {});
@@ -300,9 +314,9 @@ describe('ToolContractValidator', () => {
300
314
  readErrorsSchema: vi.fn(async () => ({
301
315
  type: 'object',
302
316
  required: ['ok'],
303
- properties: { ok: { type: 'boolean' } }
317
+ properties: { ok: { type: 'boolean' } },
304
318
  })),
305
- readSchemaByRef: vi.fn(async () => ({}))
319
+ readSchemaByRef: vi.fn(async () => ({})),
306
320
  };
307
321
  const registry = { toolsRoot: '/tmp' };
308
322
  const validator = await ToolContractValidator.create(loader as never, registry as never);