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
@@ -31,7 +31,7 @@ function makeRuntimeSessions(overrides: AnyRecord = {}): AnyRecord {
31
31
  lease_expires_at: now,
32
32
  orchestrator_epoch: 0,
33
33
  feature_sessions: {},
34
- ...overrides
34
+ ...overrides,
35
35
  };
36
36
  }
37
37
 
@@ -43,16 +43,16 @@ function makeIndex(overrides: AnyRecord = {}): AnyRecord {
43
43
  merged: [],
44
44
  locks: {
45
45
  openapi: null,
46
- db_migrations: null
46
+ db_migrations: null,
47
47
  },
48
48
  lock_leases: {
49
49
  openapi: null,
50
- db_migrations: null
50
+ db_migrations: null,
51
51
  },
52
52
  blocked_queue: [],
53
53
  updated_at: new Date().toISOString(),
54
54
  runtime_sessions: makeRuntimeSessions(),
55
- ...overrides
55
+ ...overrides,
56
56
  };
57
57
  }
58
58
 
@@ -69,7 +69,7 @@ function makeRunLeaseHarness(initialIndex: AnyRecord = makeIndex()) {
69
69
  feature_sessions:
70
70
  source.feature_sessions && typeof source.feature_sessions === 'object'
71
71
  ? source.feature_sessions
72
- : {}
72
+ : {},
73
73
  };
74
74
  };
75
75
 
@@ -77,10 +77,12 @@ function makeRunLeaseHarness(initialIndex: AnyRecord = makeIndex()) {
77
77
  makeRuntimeSessions({
78
78
  started_at: at ?? new Date().toISOString(),
79
79
  last_heartbeat_at: at ?? new Date().toISOString(),
80
- lease_expires_at: at ?? new Date().toISOString()
80
+ lease_expires_at: at ?? new Date().toISOString(),
81
81
  }) as RuntimeSessionsSnapshot;
82
82
 
83
- let runLease: RuntimeSessionsSnapshot = clone(initialIndex.runtime_sessions ?? makeRuntimeSessions());
83
+ let runLease: RuntimeSessionsSnapshot = clone(
84
+ initialIndex.runtime_sessions ?? makeRuntimeSessions(),
85
+ );
84
86
 
85
87
  const service = new RunLeaseService({
86
88
  runLeaseTtlSeconds: () => 30,
@@ -95,15 +97,16 @@ function makeRunLeaseHarness(initialIndex: AnyRecord = makeIndex()) {
95
97
  runLease = clone(data);
96
98
  },
97
99
  normalizeRuntimeSessions,
98
- isRunLeaseFresh: (runtimeSessions: AnyRecord) => new Date(runtimeSessions.lease_expires_at).getTime() > Date.now(),
99
- emptyRuntimeSessions
100
+ isRunLeaseFresh: (runtimeSessions: AnyRecord) =>
101
+ new Date(runtimeSessions.lease_expires_at).getTime() > Date.now(),
102
+ emptyRuntimeSessions,
100
103
  });
101
104
 
102
105
  return {
103
106
  service,
104
107
  getIndex: () => clone(index),
105
108
  getRunLease: () => clone(runLease),
106
- writes
109
+ writes,
107
110
  };
108
111
  }
109
112
 
@@ -117,8 +120,8 @@ function makeLockPolicy(overrides: AnyRecord = {}): AnyRecord {
117
120
  initial_ms: 1,
118
121
  max_ms: 4,
119
122
  multiplier: 2,
120
- jitter_ms: 0
121
- }
123
+ jitter_ms: 0,
124
+ },
122
125
  };
123
126
  const lockOverrides = overrides.locks ?? {};
124
127
  return {
@@ -128,17 +131,19 @@ function makeLockPolicy(overrides: AnyRecord = {}): AnyRecord {
128
131
  ...lockOverrides,
129
132
  acquire_backoff: {
130
133
  ...lockDefaults.acquire_backoff,
131
- ...(lockOverrides.acquire_backoff ?? {})
132
- }
133
- }
134
+ ...(lockOverrides.acquire_backoff ?? {}),
135
+ },
136
+ },
134
137
  };
135
138
  }
136
139
 
137
- async function makeLockHarness(options: {
138
- policy?: AnyRecord;
139
- index?: AnyRecord;
140
- states?: Record<string, AnyRecord>;
141
- } = {}) {
140
+ async function makeLockHarness(
141
+ options: {
142
+ policy?: AnyRecord;
143
+ index?: AnyRecord;
144
+ states?: Record<string, AnyRecord>;
145
+ } = {},
146
+ ) {
142
147
  let index = clone(options.index ?? makeIndex());
143
148
  const states = new Map<string, AnyRecord>(
144
149
  Object.entries(
@@ -146,15 +151,15 @@ async function makeLockHarness(options: {
146
151
  feature_a: {
147
152
  version: 1,
148
153
  status: STATUS.PLANNING,
149
- locks: { held: [] }
154
+ locks: { held: [] },
150
155
  },
151
156
  feature_b: {
152
157
  version: 1,
153
158
  status: STATUS.PLANNING,
154
- locks: { held: [] }
155
- }
156
- }
157
- )
159
+ locks: { held: [] },
160
+ },
161
+ },
162
+ ),
158
163
  );
159
164
  const policy = makeLockPolicy(options.policy);
160
165
  const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'aop-lock-service-'));
@@ -166,17 +171,21 @@ async function makeLockHarness(options: {
166
171
  index = clone(nextIndex);
167
172
  },
168
173
  updateState: async (featureId: string, _expectedVersion: number | null, updater: any) => {
169
- const existing = states.get(featureId) ?? { version: 1, status: STATUS.PLANNING, locks: { held: [] } };
174
+ const existing = states.get(featureId) ?? {
175
+ version: 1,
176
+ status: STATUS.PLANNING,
177
+ locks: { held: [] },
178
+ };
170
179
  const updateResult = await updater(clone(existing), '');
171
180
  const next = {
172
181
  ...existing,
173
- ...(updateResult.frontMatter ?? {})
182
+ ...(updateResult.frontMatter ?? {}),
174
183
  };
175
184
  states.set(featureId, next);
176
185
  return clone(next);
177
186
  },
178
187
  statePath: (featureId: string) => path.join(tmpDir, `${featureId}.state.md`),
179
- getPolicySnapshot: () => policy
188
+ getPolicySnapshot: () => policy,
180
189
  });
181
190
 
182
191
  return {
@@ -192,7 +201,7 @@ async function makeLockHarness(options: {
192
201
  const filePath = path.join(tmpDir, `${featureId}.state.md`);
193
202
  await fs.writeFile(filePath, '---\nfeature_id: test\n---\n', 'utf8');
194
203
  },
195
- cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true })
204
+ cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true }),
196
205
  };
197
206
  }
198
207
 
@@ -206,8 +215,8 @@ async function makeReportingHarness() {
206
215
  merged: ['feature_c'],
207
216
  locks: {
208
217
  openapi: 'feature_lock',
209
- db_migrations: null
210
- }
218
+ db_migrations: null,
219
+ },
211
220
  });
212
221
 
213
222
  const ensureState = async (featureId: string, frontMatter: AnyRecord) => {
@@ -221,34 +230,34 @@ async function makeReportingHarness() {
221
230
  collectAcceptedPlans: async () => clone(plans),
222
231
  getPolicySnapshot: () => ({
223
232
  exclusive_areas: ['libs/core'],
224
- protected_areas: ['agentic/orchestrator']
233
+ protected_areas: ['config/agentic/orchestrator'],
225
234
  }),
226
235
  readIndex: async () => clone(index),
227
236
  statePath: (featureId: string) => path.join(tmpDir, featureId, 'state.md'),
228
237
  featureCostPath: (featureId: string) => path.join(tmpDir, featureId, 'cost.json'),
229
238
  readState: async (featureId: string) => ({
230
- frontMatter: clone(stateMap.get(featureId) ?? {})
239
+ frontMatter: clone(stateMap.get(featureId) ?? {}),
231
240
  }),
232
241
  featureStateGet: async (featureId: string) => ({
233
242
  data: {
234
- front_matter: clone(stateMap.get(featureId) ?? {})
235
- }
243
+ front_matter: clone(stateMap.get(featureId) ?? {}),
244
+ },
236
245
  }),
237
246
  repoDiffBundle: async () => ({
238
247
  data: {
239
248
  diff_stat: '1 file changed',
240
249
  touched_files: ['src/example.ts'],
241
- last_gate_summary: { overall: 'pass' }
242
- }
250
+ last_gate_summary: { overall: 'pass' },
251
+ },
243
252
  }),
244
253
  qaTestIndexGet: async () => ({
245
254
  data: {
246
255
  summary: {
247
256
  required_total: 1,
248
- pending_required: 0
249
- }
250
- }
251
- })
257
+ pending_required: 0,
258
+ },
259
+ },
260
+ }),
252
261
  });
253
262
 
254
263
  return {
@@ -258,7 +267,7 @@ async function makeReportingHarness() {
258
267
  index = clone(nextIndex);
259
268
  },
260
269
  ensureState,
261
- cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true })
270
+ cleanup: async () => await fs.rm(tmpDir, { recursive: true, force: true }),
262
271
  };
263
272
  }
264
273
 
@@ -267,7 +276,7 @@ describe('RunLeaseService', () => {
267
276
  const freshLease = makeRuntimeSessions({
268
277
  run_id: 'run:existing',
269
278
  owner_instance_id: 'owner:existing',
270
- lease_expires_at: new Date(Date.now() + 60_000).toISOString()
279
+ lease_expires_at: new Date(Date.now() + 60_000).toISOString(),
271
280
  });
272
281
  const { service } = makeRunLeaseHarness(makeIndex({ runtime_sessions: freshLease }));
273
282
 
@@ -277,10 +286,10 @@ describe('RunLeaseService', () => {
277
286
  owner_instance_id: 'owner:new',
278
287
  provider: 'provider',
279
288
  model: 'model',
280
- provider_config_ref_hash: ''
281
- } as any)
289
+ provider_config_ref_hash: '',
290
+ } as any),
282
291
  ).rejects.toMatchObject({
283
- normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
292
+ normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
284
293
  });
285
294
 
286
295
  await expect(
@@ -289,15 +298,15 @@ describe('RunLeaseService', () => {
289
298
  owner_instance_id: 'owner:new',
290
299
  provider: 'provider',
291
300
  model: 'model',
292
- provider_config_ref_hash: ''
293
- })
301
+ provider_config_ref_hash: '',
302
+ }),
294
303
  ).rejects.toMatchObject({
295
304
  normalizedResponse: {
296
305
  error: {
297
306
  code: ERROR_CODES.RUN_ALREADY_ACTIVE,
298
- details: { stale: false }
299
- }
300
- }
307
+ details: { stale: false },
308
+ },
309
+ },
301
310
  });
302
311
  });
303
312
 
@@ -306,8 +315,10 @@ describe('RunLeaseService', () => {
306
315
  run_id: 'run:stale',
307
316
  owner_instance_id: 'owner:stale',
308
317
  orchestrator_session_id: 'orch:old',
309
- feature_sessions: { feature_x: { planner_session_id: 'p', builder_session_id: 'b', qa_session_id: 'q' } },
310
- lease_expires_at: new Date(Date.now() - 60_000).toISOString()
318
+ feature_sessions: {
319
+ feature_x: { planner_session_id: 'p', builder_session_id: 'b', qa_session_id: 'q' },
320
+ },
321
+ lease_expires_at: new Date(Date.now() - 60_000).toISOString(),
311
322
  });
312
323
  const harness = makeRunLeaseHarness(makeIndex({ runtime_sessions: staleLease }));
313
324
 
@@ -318,15 +329,15 @@ describe('RunLeaseService', () => {
318
329
  provider: 'provider',
319
330
  model: 'model',
320
331
  provider_config_ref_hash: '',
321
- takeover_stale_run: false
322
- })
332
+ takeover_stale_run: false,
333
+ }),
323
334
  ).rejects.toMatchObject({
324
335
  normalizedResponse: {
325
336
  error: {
326
337
  code: ERROR_CODES.RUN_ALREADY_ACTIVE,
327
- details: { stale: true, requires_takeover: true }
328
- }
329
- }
338
+ details: { stale: true, requires_takeover: true },
339
+ },
340
+ },
330
341
  });
331
342
 
332
343
  const takeover = await harness.service.acquireRunLease({
@@ -335,7 +346,7 @@ describe('RunLeaseService', () => {
335
346
  provider: 'provider',
336
347
  model: 'model',
337
348
  provider_config_ref_hash: '',
338
- takeover_stale_run: true
349
+ takeover_stale_run: true,
339
350
  });
340
351
 
341
352
  expect(takeover.data.took_over_stale).toBe(true);
@@ -354,8 +365,8 @@ describe('RunLeaseService', () => {
354
365
  lease_expires_at: '2026-01-01T00:00:30.000Z',
355
366
  feature_sessions: {
356
367
  keep_feature: { planner_session_id: 'p1', builder_session_id: 'b1', qa_session_id: 'q1' },
357
- stale_feature: { planner_session_id: 'p2', builder_session_id: 'b2', qa_session_id: 'q2' }
358
- }
368
+ stale_feature: { planner_session_id: 'p2', builder_session_id: 'b2', qa_session_id: 'q2' },
369
+ },
359
370
  });
360
371
  const harness = makeRunLeaseHarness(makeIndex({ runtime_sessions: initial }));
361
372
 
@@ -366,7 +377,7 @@ describe('RunLeaseService', () => {
366
377
  run_id: 'run:owner',
367
378
  owner_instance_id: 'owner:owner',
368
379
  orchestrator_session_id: 'orch:new',
369
- increment_epoch: true
380
+ increment_epoch: true,
370
381
  });
371
382
 
372
383
  await harness.service.updateFeatureSessionAssignment({
@@ -375,13 +386,13 @@ describe('RunLeaseService', () => {
375
386
  feature_id: 'keep_feature',
376
387
  planner_session_id: 'p-next',
377
388
  builder_session_id: 'b-next',
378
- qa_session_id: 'q-next'
389
+ qa_session_id: 'q-next',
379
390
  });
380
391
 
381
392
  const pruned = await harness.service.pruneFeatureSessionAssignments({
382
393
  run_id: 'run:owner',
383
394
  owner_instance_id: 'owner:owner',
384
- active_feature_ids: ['keep_feature']
395
+ active_feature_ids: ['keep_feature'],
385
396
  });
386
397
  expect(pruned.data.removed).toEqual(['stale_feature']);
387
398
 
@@ -395,7 +406,7 @@ describe('RunLeaseService', () => {
395
406
  run_id: 'run:same',
396
407
  owner_instance_id: 'owner:same',
397
408
  started_at: '2026-01-01T00:00:00.000Z',
398
- lease_expires_at: new Date(Date.now() + 60_000).toISOString()
409
+ lease_expires_at: new Date(Date.now() + 60_000).toISOString(),
399
410
  });
400
411
  const harness = makeRunLeaseHarness(makeIndex({ runtime_sessions: existing }));
401
412
 
@@ -404,17 +415,17 @@ describe('RunLeaseService', () => {
404
415
  owner_instance_id: 'owner:same',
405
416
  provider: 'provider',
406
417
  model: 'model',
407
- provider_config_ref_hash: 'hash'
418
+ provider_config_ref_hash: 'hash',
408
419
  });
409
420
  expect(reused.data.reused_existing_owner).toBe(true);
410
421
  expect(reused.data.runtime_sessions.started_at).toBe('2026-01-01T00:00:00.000Z');
411
422
 
412
423
  await expect(harness.service.renewRunLease('', '')).rejects.toMatchObject({
413
- normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
424
+ normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
414
425
  });
415
426
 
416
427
  await expect(harness.service.renewRunLease('run:other', 'owner:other')).rejects.toMatchObject({
417
- normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } }
428
+ normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } },
418
429
  });
419
430
 
420
431
  const notReleased = await harness.service.releaseRunLease('run:other', 'owner:other');
@@ -424,10 +435,10 @@ describe('RunLeaseService', () => {
424
435
  harness.service.updateOrchestratorSession({
425
436
  run_id: '',
426
437
  owner_instance_id: 'owner:same',
427
- orchestrator_session_id: ''
428
- } as any)
438
+ orchestrator_session_id: '',
439
+ } as any),
429
440
  ).rejects.toMatchObject({
430
- normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
441
+ normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
431
442
  });
432
443
 
433
444
  await expect(
@@ -437,20 +448,20 @@ describe('RunLeaseService', () => {
437
448
  feature_id: 'feature_a',
438
449
  planner_session_id: 'planner',
439
450
  builder_session_id: 'builder',
440
- qa_session_id: 'qa'
441
- })
451
+ qa_session_id: 'qa',
452
+ }),
442
453
  ).rejects.toMatchObject({
443
- normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } }
454
+ normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } },
444
455
  });
445
456
 
446
457
  await expect(
447
458
  harness.service.pruneFeatureSessionAssignments({
448
459
  run_id: 'run:other',
449
460
  owner_instance_id: 'owner:other',
450
- active_feature_ids: []
451
- })
461
+ active_feature_ids: [],
462
+ }),
452
463
  ).rejects.toMatchObject({
453
- normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } }
464
+ normalizedResponse: { error: { code: ERROR_CODES.RUN_LEASE_NOT_OWNED } },
454
465
  });
455
466
  });
456
467
  });
@@ -472,11 +483,11 @@ describe('LockService', () => {
472
483
  cleanups.push(harness.cleanup);
473
484
 
474
485
  await expect(harness.service.locksAcquire('missing', 'feature_a')).rejects.toMatchObject({
475
- normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
486
+ normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
476
487
  });
477
488
 
478
489
  await expect(harness.service.locksAcquire('openapi', null)).rejects.toMatchObject({
479
- normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
490
+ normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
480
491
  });
481
492
 
482
493
  const acquired = await harness.service.locksAcquire('openapi', 'feature_a');
@@ -484,7 +495,7 @@ describe('LockService', () => {
484
495
  expect(harness.getState('feature_a').locks.held).toContain('openapi');
485
496
 
486
497
  await expect(harness.service.locksRelease('openapi', 'feature_b')).rejects.toMatchObject({
487
- normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
498
+ normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
488
499
  });
489
500
 
490
501
  const released = await harness.service.locksRelease('openapi', 'feature_a');
@@ -497,29 +508,29 @@ describe('LockService', () => {
497
508
  active: ['feature_a'],
498
509
  locks: {
499
510
  openapi: 'feature_old',
500
- db_migrations: 'feature_b'
511
+ db_migrations: 'feature_b',
501
512
  },
502
513
  lock_leases: {
503
514
  openapi: {
504
515
  holder: 'feature_old',
505
516
  lease_id: 'lease-old',
506
- expires_at: new Date(Date.now() - 60_000).toISOString()
517
+ expires_at: new Date(Date.now() - 60_000).toISOString(),
507
518
  },
508
519
  db_migrations: {
509
520
  holder: 'feature_b',
510
521
  lease_id: 'lease-b',
511
- expires_at: new Date(Date.now() + 60_000).toISOString()
512
- }
513
- }
522
+ expires_at: new Date(Date.now() + 60_000).toISOString(),
523
+ },
524
+ },
514
525
  });
515
526
  const harness = await makeLockHarness({
516
527
  index: staleIndex,
517
528
  policy: {
518
529
  locks: {
519
530
  acquire_behavior: 'wait',
520
- default_wait_timeout_seconds: 1
521
- }
522
- }
531
+ default_wait_timeout_seconds: 1,
532
+ },
533
+ },
523
534
  });
524
535
  cleanups.push(harness.cleanup);
525
536
 
@@ -537,7 +548,7 @@ describe('LockService', () => {
537
548
  expiredSnapshot.lock_leases.openapi = {
538
549
  holder: 'feature_a',
539
550
  lease_id: 'lease-stale',
540
- expires_at: new Date(Date.now() - 60_000).toISOString()
551
+ expires_at: new Date(Date.now() - 60_000).toISOString(),
541
552
  };
542
553
  harness.setIndex(expiredSnapshot);
543
554
 
@@ -552,28 +563,28 @@ describe('LockService', () => {
552
563
  const harness = await makeLockHarness({
553
564
  policy: {
554
565
  locks: {
555
- acquire_behavior: 'fail'
556
- }
566
+ acquire_behavior: 'fail',
567
+ },
557
568
  },
558
569
  index: makeIndex({
559
570
  locks: {
560
571
  openapi: 'feature_other',
561
- db_migrations: null
572
+ db_migrations: null,
562
573
  },
563
574
  lock_leases: {
564
575
  openapi: {
565
576
  holder: 'feature_other',
566
577
  lease_id: 'lease-1',
567
- expires_at: new Date(Date.now() + 60_000).toISOString()
578
+ expires_at: new Date(Date.now() + 60_000).toISOString(),
568
579
  },
569
- db_migrations: null
570
- }
571
- })
580
+ db_migrations: null,
581
+ },
582
+ }),
572
583
  });
573
584
  cleanups.push(harness.cleanup);
574
585
 
575
586
  await expect(harness.service.locksAcquire('openapi', 'feature_a')).rejects.toMatchObject({
576
- normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
587
+ normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
577
588
  });
578
589
  });
579
590
 
@@ -582,38 +593,38 @@ describe('LockService', () => {
582
593
  policy: {
583
594
  locks: {
584
595
  acquire_behavior: undefined,
585
- default_wait_timeout_seconds: 0
586
- }
596
+ default_wait_timeout_seconds: 0,
597
+ },
587
598
  },
588
599
  states: {
589
600
  feature_a: {
590
601
  version: 1,
591
- status: STATUS.PLANNING
592
- }
602
+ status: STATUS.PLANNING,
603
+ },
593
604
  },
594
605
  index: makeIndex({
595
606
  locks: {
596
607
  openapi: 'feature_other',
597
- db_migrations: null
608
+ db_migrations: null,
598
609
  },
599
610
  lock_leases: {
600
611
  openapi: {
601
612
  holder: 'feature_other',
602
613
  lease_id: 'lease-wait',
603
- expires_at: new Date(Date.now() + 60_000).toISOString()
614
+ expires_at: new Date(Date.now() + 60_000).toISOString(),
604
615
  },
605
- db_migrations: null
606
- }
607
- })
616
+ db_migrations: null,
617
+ },
618
+ }),
608
619
  });
609
620
  cleanups.push(harness.cleanup);
610
621
 
611
622
  await expect(harness.service.locksAcquire('openapi', 'feature_a', 0)).rejects.toMatchObject({
612
- normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
623
+ normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
613
624
  });
614
625
 
615
626
  await expect(harness.service.locksRelease(null, null)).rejects.toMatchObject({
616
- normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } }
627
+ normalizedResponse: { error: { code: ERROR_CODES.INVALID_ARGUMENT } },
617
628
  });
618
629
 
619
630
  await harness.service.locksRelease('db_migrations', 'feature_a');
@@ -642,14 +653,14 @@ describe('ReportingService', () => {
642
653
  feature_id: 'feature_a',
643
654
  files: { modify: ['src/shared.ts'] },
644
655
  allowed_areas: ['libs/core'],
645
- contracts: { openapi: 'none', events: 'none', db: 'none' }
656
+ contracts: { openapi: 'none', events: 'none', db: 'none' },
646
657
  },
647
658
  {
648
659
  feature_id: 'feature_b',
649
660
  files: { create: ['src/shared.ts'] },
650
661
  allowed_areas: ['libs/core/module'],
651
- contracts: { openapi: 'none', events: 'none', db: 'none' }
652
- }
662
+ contracts: { openapi: 'none', events: 'none', db: 'none' },
663
+ },
653
664
  );
654
665
 
655
666
  await harness.ensureState('feature_a', {
@@ -657,14 +668,14 @@ describe('ReportingService', () => {
657
668
  locks: { held: ['openapi'] },
658
669
  gate_profile: 'default',
659
670
  gates: { plan: 'pass' },
660
- last_updated: '2026-01-01T00:00:00.000Z'
671
+ last_updated: '2026-01-01T00:00:00.000Z',
661
672
  });
662
673
  await harness.ensureState('feature_lock', {
663
674
  status: STATUS.BLOCKED,
664
675
  locks: { held: [] },
665
676
  gate_profile: 'default',
666
677
  gates: { plan: 'na' },
667
- last_updated: '2026-01-02T00:00:00.000Z'
678
+ last_updated: '2026-01-02T00:00:00.000Z',
668
679
  });
669
680
 
670
681
  const collisions = await harness.service.collisionsScan();
@@ -673,7 +684,10 @@ describe('ReportingService', () => {
673
684
  expect(typeof collisions.data.collisions[0].fingerprint).toBe('string');
674
685
 
675
686
  const dashboard = await harness.service.reportDashboard();
676
- expect(dashboard.data.features.map((item: AnyRecord) => item.feature_id)).toEqual(['feature_a', 'feature_lock']);
687
+ expect(dashboard.data.features.map((item: AnyRecord) => item.feature_id)).toEqual([
688
+ 'feature_a',
689
+ 'feature_lock',
690
+ ]);
677
691
  });
678
692
 
679
693
  it('aggregates feature summary from state, diff bundle, and qa index', async () => {
@@ -682,14 +696,14 @@ describe('ReportingService', () => {
682
696
  await harness.ensureState('feature_summary', {
683
697
  status: STATUS.QA,
684
698
  gates: { full: 'pass' },
685
- locks: { held: [] }
699
+ locks: { held: [] },
686
700
  });
687
701
  harness.setIndex(
688
702
  makeIndex({
689
703
  active: ['feature_summary'],
690
704
  blocked: [],
691
- merged: []
692
- })
705
+ merged: [],
706
+ }),
693
707
  );
694
708
 
695
709
  const summary = await harness.service.reportFeatureSummary('feature_summary');
@@ -706,7 +720,9 @@ describe('ReportingService worktree_branch coverage', () => {
706
720
  afterEach(async () => {
707
721
  while (cleanups.length > 0) {
708
722
  const cleanup = cleanups.pop();
709
- if (cleanup) {await cleanup();}
723
+ if (cleanup) {
724
+ await cleanup();
725
+ }
710
726
  }
711
727
  });
712
728
 
@@ -720,7 +736,7 @@ describe('ReportingService worktree_branch coverage', () => {
720
736
  locks: { held: [] },
721
737
  gate_profile: 'default',
722
738
  gates: { plan: 'pass' },
723
- last_updated: '2026-01-01T00:00:00.000Z'
739
+ last_updated: '2026-01-01T00:00:00.000Z',
724
740
  });
725
741
 
726
742
  const dashboard = await harness.service.reportDashboard();
@@ -735,7 +751,9 @@ describe('LockService sleep branch coverage', () => {
735
751
  afterEach(async () => {
736
752
  while (cleanups.length > 0) {
737
753
  const cleanup = cleanups.pop();
738
- if (cleanup) {await cleanup();}
754
+ if (cleanup) {
755
+ await cleanup();
756
+ }
739
757
  }
740
758
  vi.useRealTimers();
741
759
  });
@@ -752,12 +770,12 @@ describe('LockService sleep branch coverage', () => {
752
770
  initial_ms: 0,
753
771
  max_ms: 0,
754
772
  multiplier: 1,
755
- jitter_ms: 0
756
- }
757
- }
773
+ jitter_ms: 0,
774
+ },
775
+ },
758
776
  },
759
777
  states: {
760
- feature_a: { version: 1, status: STATUS.PLANNING, locks: { held: [] } }
778
+ feature_a: { version: 1, status: STATUS.PLANNING, locks: { held: [] } },
761
779
  },
762
780
  index: makeIndex({
763
781
  locks: { openapi: 'feature_other', db_migrations: null },
@@ -765,11 +783,11 @@ describe('LockService sleep branch coverage', () => {
765
783
  openapi: {
766
784
  holder: 'feature_other',
767
785
  lease_id: 'lease-sleep-test',
768
- expires_at: new Date(Date.now() + 60_000).toISOString()
786
+ expires_at: new Date(Date.now() + 60_000).toISOString(),
769
787
  },
770
- db_migrations: null
771
- }
772
- })
788
+ db_migrations: null,
789
+ },
790
+ }),
773
791
  });
774
792
  cleanups.push(harness.cleanup);
775
793
 
@@ -780,7 +798,7 @@ describe('LockService sleep branch coverage', () => {
780
798
  vi.advanceTimersByTime(15_000);
781
799
 
782
800
  await expect(acquirePromise).rejects.toMatchObject({
783
- normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } }
801
+ normalizedResponse: { error: { code: ERROR_CODES.LOCK_CONFLICT } },
784
802
  });
785
803
  });
786
804
  });