sdd-agent-platform 0.4.2 → 0.5.0

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 (826) hide show
  1. package/README.md +33 -39
  2. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js +56 -73
  3. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js.map +1 -1
  4. package/node_modules/@sdd-agent-platform/core/dist/artifacts/ingestion.js +9 -64
  5. package/node_modules/@sdd-agent-platform/core/dist/artifacts/ingestion.js.map +1 -1
  6. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-evidence.js +1 -0
  7. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-evidence.js.map +1 -1
  8. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-result.js +17 -26
  9. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-result.js.map +1 -1
  10. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.d.ts +8 -7
  11. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js +8 -12
  12. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js.map +1 -1
  13. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.d.ts +1 -1
  14. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js +1 -1
  15. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js.map +1 -1
  16. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.d.ts +3 -4
  17. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js +377 -411
  18. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js.map +1 -1
  19. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.d.ts +1 -1
  20. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js +7 -13
  21. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js.map +1 -1
  22. package/node_modules/@sdd-agent-platform/core/dist/context/evidence-summary.js +8 -26
  23. package/node_modules/@sdd-agent-platform/core/dist/context/evidence-summary.js.map +1 -1
  24. package/node_modules/@sdd-agent-platform/core/dist/context/log-worker.js +2 -2
  25. package/node_modules/@sdd-agent-platform/core/dist/context/log-worker.js.map +1 -1
  26. package/node_modules/@sdd-agent-platform/core/dist/context-offload/contracts.d.ts +1 -1
  27. package/node_modules/@sdd-agent-platform/core/dist/contracts.d.ts +6 -1
  28. package/node_modules/@sdd-agent-platform/core/dist/contracts.js +5 -0
  29. package/node_modules/@sdd-agent-platform/core/dist/contracts.js.map +1 -1
  30. package/node_modules/@sdd-agent-platform/core/dist/delegation/model.d.ts +0 -3
  31. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.d.ts +0 -3
  32. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.js +4 -7
  33. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.js.map +1 -1
  34. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js +3 -13
  35. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js.map +1 -1
  36. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js +8 -8
  37. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js.map +1 -1
  38. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js +1 -0
  39. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js.map +1 -1
  40. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js +4 -4
  41. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js.map +1 -1
  42. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js +24 -0
  43. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js.map +1 -1
  44. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js +1 -1
  45. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  46. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js +43 -180
  47. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js.map +1 -1
  48. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.d.ts +1 -1
  49. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js +7 -14
  50. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js.map +1 -1
  51. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js +110 -0
  52. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js.map +1 -0
  53. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js +4 -4
  54. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js.map +1 -1
  55. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js +3 -3
  56. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js.map +1 -1
  57. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js +85 -86
  58. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js.map +1 -1
  59. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js +2 -3
  60. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js.map +1 -1
  61. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js +2 -2
  62. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js.map +1 -1
  63. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.d.ts +1 -1
  64. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.js +1 -1
  65. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.js.map +1 -1
  66. package/node_modules/@sdd-agent-platform/core/dist/instructions.d.ts +1 -1
  67. package/node_modules/@sdd-agent-platform/core/dist/instructions.js +31 -67
  68. package/node_modules/@sdd-agent-platform/core/dist/instructions.js.map +1 -1
  69. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/decision-gate.js +1 -1
  70. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/decision-gate.js.map +1 -1
  71. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.d.ts +0 -1
  72. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js +59 -85
  73. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js.map +1 -1
  74. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  75. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js +7 -0
  76. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js.map +1 -0
  77. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  78. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js +461 -0
  79. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js.map +1 -0
  80. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.d.ts +2 -0
  81. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js +3 -0
  82. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js.map +1 -0
  83. package/node_modules/@sdd-agent-platform/core/dist/orchestration/contracts.d.ts +1 -1
  84. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.d.ts +2 -12
  85. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js +32 -80
  86. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js.map +1 -1
  87. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.d.ts +2 -5
  88. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js +27 -69
  89. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js.map +1 -1
  90. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js +118 -34
  91. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js.map +1 -1
  92. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js +1 -1
  93. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js.map +1 -1
  94. package/node_modules/@sdd-agent-platform/core/dist/registries/capability-sources.js +1 -1
  95. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.d.ts +1 -1
  96. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js +8 -15
  97. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js.map +1 -1
  98. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js +4 -4
  99. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js.map +1 -1
  100. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.d.ts +13 -0
  101. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js +76 -0
  102. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js.map +1 -0
  103. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js +2 -2
  104. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js.map +1 -1
  105. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js +7 -7
  106. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js.map +1 -1
  107. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js +4 -4
  108. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js.map +1 -1
  109. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js +2 -2
  110. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js.map +1 -1
  111. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js +11 -11
  112. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js.map +1 -1
  113. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.d.ts +1 -1
  114. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js +21 -21
  115. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js.map +1 -1
  116. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js +2 -1
  117. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js.map +1 -1
  118. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js +6 -6
  119. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js.map +1 -1
  120. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js +11 -23
  121. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js.map +1 -1
  122. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.d.ts +2 -2
  123. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js +18 -20
  124. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js.map +1 -1
  125. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime.d.ts +0 -2
  126. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js +1 -1
  127. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js.map +1 -1
  128. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js +16 -48
  129. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js.map +1 -1
  130. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js +11 -1
  131. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js.map +1 -1
  132. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js +2 -2
  133. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js.map +1 -1
  134. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.d.ts +2 -2
  135. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js +20 -28
  136. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js.map +1 -1
  137. package/node_modules/@sdd-agent-platform/core/dist/router.d.ts +0 -1
  138. package/node_modules/@sdd-agent-platform/core/dist/router.js +0 -1
  139. package/node_modules/@sdd-agent-platform/core/dist/router.js.map +1 -1
  140. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.d.ts +6 -6
  141. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js +13 -124
  142. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js.map +1 -1
  143. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.d.ts +2 -0
  144. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js +5 -7
  145. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js.map +1 -1
  146. package/node_modules/@sdd-agent-platform/core/dist/run-state/model.d.ts +28 -28
  147. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.d.ts +2 -0
  148. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js +3 -1
  149. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js.map +1 -1
  150. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js +26 -36
  151. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js.map +1 -1
  152. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.d.ts +0 -4
  153. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js +5 -51
  154. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js.map +1 -1
  155. package/node_modules/@sdd-agent-platform/core/dist/run-state.d.ts +0 -1
  156. package/node_modules/@sdd-agent-platform/core/dist/run-state.js +0 -1
  157. package/node_modules/@sdd-agent-platform/core/dist/run-state.js.map +1 -1
  158. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js +1 -1
  159. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js.map +1 -1
  160. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js +5 -5
  161. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js.map +1 -1
  162. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js +1 -1
  163. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js.map +1 -1
  164. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.d.ts +2 -2
  165. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js +11 -0
  166. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js.map +1 -1
  167. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  168. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js +179 -0
  169. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  170. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.d.ts +0 -2
  171. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js +10 -97
  172. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js.map +1 -1
  173. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.d.ts +1 -1
  174. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js +6 -8
  175. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js.map +1 -1
  176. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.d.ts +5 -2
  177. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js +85 -68
  178. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js.map +1 -1
  179. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js +2 -2
  180. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js.map +1 -1
  181. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js +40 -0
  182. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js.map +1 -0
  183. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.d.ts +12 -0
  184. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js +2 -0
  185. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js.map +1 -0
  186. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.d.ts +2 -2
  187. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js +19 -26
  188. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js.map +1 -1
  189. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.d.ts +1 -1
  190. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js +3 -6
  191. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js.map +1 -1
  192. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.d.ts +111 -263
  193. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js +1272 -1124
  194. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js.map +1 -1
  195. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js +5 -5
  196. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js.map +1 -1
  197. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.d.ts +1 -44
  198. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js +47 -170
  199. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js.map +1 -1
  200. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js +73 -73
  201. package/node_modules/@sdd-agent-platform/core/dist/subagents/contracts.d.ts +1 -1
  202. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js +7 -7
  203. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js.map +1 -1
  204. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.d.ts +1 -0
  205. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js +2 -0
  206. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js.map +1 -0
  207. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.d.ts +1 -0
  208. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js +2 -0
  209. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js.map +1 -0
  210. package/node_modules/@sdd-agent-platform/core/dist/sync-back.d.ts +1 -0
  211. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js +2 -0
  212. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js.map +1 -0
  213. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.d.ts +167 -0
  214. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js +377 -0
  215. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js.map +1 -0
  216. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js +329 -314
  217. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js.map +1 -1
  218. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.d.ts +1 -0
  219. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js +53 -7
  220. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js.map +1 -1
  221. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js +9 -12
  222. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js.map +1 -1
  223. package/node_modules/@sdd-agent-platform/core/dist/tsconfig.tsbuildinfo +1 -1
  224. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.d.ts +0 -48
  225. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js +1 -520
  226. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js.map +1 -1
  227. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.d.ts +5 -5
  228. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js +14 -14
  229. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js.map +1 -1
  230. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.d.ts +1 -0
  231. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js +111 -159
  232. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js.map +1 -1
  233. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  234. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js +521 -0
  235. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js.map +1 -0
  236. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js +21 -21
  237. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js.map +1 -1
  238. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.d.ts +0 -18
  239. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js +5 -27
  240. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js.map +1 -1
  241. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js +45 -45
  242. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js.map +1 -1
  243. package/node_modules/@sdd-agent-platform/core/dist/verification.d.ts +3 -3
  244. package/node_modules/@sdd-agent-platform/core/dist/verification.js +2 -2
  245. package/node_modules/@sdd-agent-platform/core/dist/verification.js.map +1 -1
  246. package/node_modules/@sdd-agent-platform/core/dist/work-units/contracts.d.ts +1 -1
  247. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js +9 -227
  248. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  249. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js +9 -50
  250. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js.map +1 -1
  251. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js +4 -42
  252. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js.map +1 -1
  253. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.d.ts +2 -3
  254. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -0
  255. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js +2 -1
  256. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  257. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/dependencies.js +1 -1
  258. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.d.ts +1 -0
  259. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js +23 -63
  260. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  261. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.d.ts +2 -2
  262. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js +43 -65
  263. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js.map +1 -1
  264. package/node_modules/@sdd-agent-platform/core/package.json +5 -2
  265. package/node_modules/@sdd-agent-platform/core/src/ai-tools.test.ts +238 -185
  266. package/node_modules/@sdd-agent-platform/core/src/ai-tools.ts +56 -73
  267. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.test.ts +189 -227
  268. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.ts +222 -278
  269. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.test.ts +28 -28
  270. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.ts +302 -301
  271. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.test.ts +181 -181
  272. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.ts +231 -240
  273. package/node_modules/@sdd-agent-platform/core/src/artifacts/templates.ts +99 -99
  274. package/node_modules/@sdd-agent-platform/core/src/artifacts.ts +4 -4
  275. package/node_modules/@sdd-agent-platform/core/src/coding-facts/contracts.ts +79 -79
  276. package/node_modules/@sdd-agent-platform/core/src/coding-facts.ts +1 -1
  277. package/node_modules/@sdd-agent-platform/core/src/config/init-project.test.ts +314 -318
  278. package/node_modules/@sdd-agent-platform/core/src/config/init-project.ts +128 -123
  279. package/node_modules/@sdd-agent-platform/core/src/config/project-config.ts +265 -265
  280. package/node_modules/@sdd-agent-platform/core/src/config/project-detection.ts +147 -147
  281. package/node_modules/@sdd-agent-platform/core/src/config/starter-documents.ts +400 -432
  282. package/node_modules/@sdd-agent-platform/core/src/context/budget.ts +30 -30
  283. package/node_modules/@sdd-agent-platform/core/src/context/build-package.ts +305 -311
  284. package/node_modules/@sdd-agent-platform/core/src/context/command-summary.ts +45 -45
  285. package/node_modules/@sdd-agent-platform/core/src/context/context-build.test.ts +188 -189
  286. package/node_modules/@sdd-agent-platform/core/src/context/evidence-summary.ts +144 -163
  287. package/node_modules/@sdd-agent-platform/core/src/context/log-worker.ts +48 -48
  288. package/node_modules/@sdd-agent-platform/core/src/context/source-refs.ts +41 -41
  289. package/node_modules/@sdd-agent-platform/core/src/context-offload/contracts.ts +47 -47
  290. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.test.ts +71 -71
  291. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.ts +178 -178
  292. package/node_modules/@sdd-agent-platform/core/src/context-offload.ts +2 -2
  293. package/node_modules/@sdd-agent-platform/core/src/context.ts +6 -6
  294. package/node_modules/@sdd-agent-platform/core/src/contracts/issues.ts +13 -13
  295. package/node_modules/@sdd-agent-platform/core/src/contracts.test.ts +9 -9
  296. package/node_modules/@sdd-agent-platform/core/src/contracts.ts +121 -116
  297. package/node_modules/@sdd-agent-platform/core/src/delegation/delegation.test.ts +183 -183
  298. package/node_modules/@sdd-agent-platform/core/src/delegation/model.ts +23 -26
  299. package/node_modules/@sdd-agent-platform/core/src/delegation/queue.ts +58 -58
  300. package/node_modules/@sdd-agent-platform/core/src/delegation/run-state.ts +14 -14
  301. package/node_modules/@sdd-agent-platform/core/src/delegation/state-machine.ts +90 -90
  302. package/node_modules/@sdd-agent-platform/core/src/delegation/validation.ts +124 -127
  303. package/node_modules/@sdd-agent-platform/core/src/delegation.ts +26 -26
  304. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/ai-entries.ts +28 -28
  305. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/document-chain.ts +104 -112
  306. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/local-run-index.ts +27 -27
  307. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/project.ts +84 -84
  308. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/registries.ts +252 -251
  309. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-evidence.ts +330 -330
  310. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-records.ts +79 -79
  311. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-trust.ts +128 -107
  312. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/runtime-contracts.ts +300 -300
  313. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.test.ts +627 -755
  314. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.ts +301 -453
  315. package/node_modules/@sdd-agent-platform/core/src/doctor/model.ts +13 -13
  316. package/node_modules/@sdd-agent-platform/core/src/doctor/summary.ts +11 -11
  317. package/node_modules/@sdd-agent-platform/core/src/doctor.ts +2 -2
  318. package/node_modules/@sdd-agent-platform/core/src/evidence/lookup.ts +80 -88
  319. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime/contracts.ts +48 -48
  320. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime.ts +1 -1
  321. package/node_modules/@sdd-agent-platform/core/src/execution/agent-execution-records.ts +195 -195
  322. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.test.ts +187 -235
  323. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.ts +305 -305
  324. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.test.ts +97 -106
  325. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.ts +453 -453
  326. package/node_modules/@sdd-agent-platform/core/src/execution/host-invocation.ts +225 -226
  327. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.test.ts +132 -143
  328. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.ts +436 -437
  329. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.test.ts +102 -102
  330. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.ts +271 -271
  331. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.test.ts +111 -121
  332. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.ts +231 -231
  333. package/node_modules/@sdd-agent-platform/core/src/execution.ts +5 -5
  334. package/node_modules/@sdd-agent-platform/core/src/governance/policy.test.ts +57 -65
  335. package/node_modules/@sdd-agent-platform/core/src/governance/policy.ts +175 -175
  336. package/node_modules/@sdd-agent-platform/core/src/governance.ts +1 -1
  337. package/node_modules/@sdd-agent-platform/core/src/instructions.test.ts +80 -64
  338. package/node_modules/@sdd-agent-platform/core/src/instructions.ts +32 -68
  339. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.test.ts +174 -174
  340. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.ts +373 -373
  341. package/node_modules/@sdd-agent-platform/core/src/lifecycle/rendering.ts +29 -29
  342. package/node_modules/@sdd-agent-platform/core/src/lifecycle/risk-signals.ts +146 -146
  343. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.test.ts +47 -47
  344. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.ts +255 -280
  345. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/contracts.ts +179 -0
  346. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/kernel.ts +522 -0
  347. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph.ts +2 -0
  348. package/node_modules/@sdd-agent-platform/core/src/lifecycle.ts +4 -4
  349. package/node_modules/@sdd-agent-platform/core/src/orchestration/contracts.ts +50 -50
  350. package/node_modules/@sdd-agent-platform/core/src/orchestration/index.ts +2 -2
  351. package/node_modules/@sdd-agent-platform/core/src/orchestration/runtime.ts +331 -394
  352. package/node_modules/@sdd-agent-platform/core/src/path-safety.test.ts +22 -22
  353. package/node_modules/@sdd-agent-platform/core/src/phase8-contracts.test.ts +243 -242
  354. package/node_modules/@sdd-agent-platform/core/src/phase8-projection-compat.test.ts +152 -153
  355. package/node_modules/@sdd-agent-platform/core/src/phase8-risk-kernel.test.ts +277 -277
  356. package/node_modules/@sdd-agent-platform/core/src/phase9-lifecycle-graph.test.ts +103 -0
  357. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.test.ts +88 -88
  358. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.ts +222 -222
  359. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.test.ts +79 -79
  360. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.ts +160 -160
  361. package/node_modules/@sdd-agent-platform/core/src/planning.ts +2 -2
  362. package/node_modules/@sdd-agent-platform/core/src/registries/agent-capability-catalog.ts +426 -473
  363. package/node_modules/@sdd-agent-platform/core/src/registries/agent-registry.ts +230 -146
  364. package/node_modules/@sdd-agent-platform/core/src/registries/agent-runtime-static.ts +142 -142
  365. package/node_modules/@sdd-agent-platform/core/src/registries/capability-sources.ts +253 -253
  366. package/node_modules/@sdd-agent-platform/core/src/registries/command-team-runtime.ts +302 -309
  367. package/node_modules/@sdd-agent-platform/core/src/registries/eval-learning-context.ts +246 -246
  368. package/node_modules/@sdd-agent-platform/core/src/registries/plan-scout-domains.ts +89 -0
  369. package/node_modules/@sdd-agent-platform/core/src/registries/query-status.ts +119 -119
  370. package/node_modules/@sdd-agent-platform/core/src/registries/registries.test.ts +454 -445
  371. package/node_modules/@sdd-agent-platform/core/src/registries/skill-capabilities.ts +37 -37
  372. package/node_modules/@sdd-agent-platform/core/src/registries/tool-capabilities.ts +135 -135
  373. package/node_modules/@sdd-agent-platform/core/src/registries/tool-plugins.ts +132 -132
  374. package/node_modules/@sdd-agent-platform/core/src/registries/worker-adapters.ts +144 -144
  375. package/node_modules/@sdd-agent-platform/core/src/registries/workflow-gates.ts +111 -111
  376. package/node_modules/@sdd-agent-platform/core/src/registries.ts +42 -42
  377. package/node_modules/@sdd-agent-platform/core/src/risk/consumer-diagnostics.ts +98 -97
  378. package/node_modules/@sdd-agent-platform/core/src/risk/contracts.ts +63 -63
  379. package/node_modules/@sdd-agent-platform/core/src/risk/kernel.ts +233 -233
  380. package/node_modules/@sdd-agent-platform/core/src/risk/legacy-adapters.ts +251 -263
  381. package/node_modules/@sdd-agent-platform/core/src/risk/workflow-gates.ts +203 -205
  382. package/node_modules/@sdd-agent-platform/core/src/risk.ts +5 -5
  383. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime-config.ts +327 -327
  384. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime.ts +388 -390
  385. package/node_modules/@sdd-agent-platform/core/src/router/profile-resolution.ts +154 -154
  386. package/node_modules/@sdd-agent-platform/core/src/router/risk-policy.ts +33 -33
  387. package/node_modules/@sdd-agent-platform/core/src/router/route-cache.ts +100 -100
  388. package/node_modules/@sdd-agent-platform/core/src/router/route-projection.ts +356 -356
  389. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.test.ts +428 -665
  390. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.ts +2 -2
  391. package/node_modules/@sdd-agent-platform/core/src/router/routing-rules.ts +73 -73
  392. package/node_modules/@sdd-agent-platform/core/src/router/routing.ts +189 -223
  393. package/node_modules/@sdd-agent-platform/core/src/router/runtime-import.ts +464 -453
  394. package/node_modules/@sdd-agent-platform/core/src/router/runtime-inspection.ts +124 -124
  395. package/node_modules/@sdd-agent-platform/core/src/router/runtime-registry.ts +123 -123
  396. package/node_modules/@sdd-agent-platform/core/src/router/runtime-validation.ts +277 -277
  397. package/node_modules/@sdd-agent-platform/core/src/router/stage-route-binding.ts +273 -279
  398. package/node_modules/@sdd-agent-platform/core/src/router/team-mode.ts +170 -170
  399. package/node_modules/@sdd-agent-platform/core/src/router.ts +5 -6
  400. package/node_modules/@sdd-agent-platform/core/src/run-state/artifacts.ts +126 -240
  401. package/node_modules/@sdd-agent-platform/core/src/run-state/events.ts +27 -27
  402. package/node_modules/@sdd-agent-platform/core/src/run-state/inspect-run.ts +172 -172
  403. package/node_modules/@sdd-agent-platform/core/src/run-state/invocation-ledger.ts +109 -109
  404. package/node_modules/@sdd-agent-platform/core/src/run-state/model.ts +252 -253
  405. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.test.ts +52 -52
  406. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.ts +356 -352
  407. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.test.ts +70 -118
  408. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.ts +406 -416
  409. package/node_modules/@sdd-agent-platform/core/src/run-state/task-evidence.ts +198 -252
  410. package/node_modules/@sdd-agent-platform/core/src/run-state/timing.ts +146 -146
  411. package/node_modules/@sdd-agent-platform/core/src/run-state.ts +8 -9
  412. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/build.ts +60 -60
  413. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/findings.ts +257 -256
  414. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/model.ts +140 -140
  415. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.test.ts +66 -66
  416. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.ts +2 -2
  417. package/node_modules/@sdd-agent-platform/core/src/runtime-paths.ts +253 -253
  418. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.test.ts +101 -96
  419. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.ts +314 -292
  420. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.test.ts +380 -0
  421. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.ts +207 -0
  422. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/context.ts +111 -111
  423. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/document-hashes.ts +207 -306
  424. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/run-binding.ts +95 -97
  425. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-inspection.ts +39 -39
  426. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.test.ts +467 -523
  427. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.ts +738 -709
  428. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-rendering.ts +81 -81
  429. package/node_modules/@sdd-agent-platform/core/src/sdd-docs.ts +5 -5
  430. package/node_modules/@sdd-agent-platform/core/src/spec-manager-contracts.ts +13 -0
  431. package/node_modules/@sdd-agent-platform/core/src/stage-artifacts.ts +435 -450
  432. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration-contracts.ts +316 -322
  433. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.test.ts +2963 -2902
  434. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.ts +5856 -5831
  435. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/contracts.ts +40 -40
  436. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.test.ts +209 -209
  437. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.ts +360 -360
  438. package/node_modules/@sdd-agent-platform/core/src/stage-runtime.ts +2 -2
  439. package/node_modules/@sdd-agent-platform/core/src/status/project-status.test.ts +288 -511
  440. package/node_modules/@sdd-agent-platform/core/src/status/project-status.ts +651 -851
  441. package/node_modules/@sdd-agent-platform/core/src/status.ts +2 -2
  442. package/node_modules/@sdd-agent-platform/core/src/storage/json-io.ts +10 -10
  443. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.test.ts +489 -681
  444. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.ts +1981 -1981
  445. package/node_modules/@sdd-agent-platform/core/src/subagents/contracts.ts +45 -45
  446. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.test.ts +232 -232
  447. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.ts +307 -307
  448. package/node_modules/@sdd-agent-platform/core/src/subagents.ts +2 -2
  449. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.test.ts +141 -0
  450. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.ts +566 -0
  451. package/node_modules/@sdd-agent-platform/core/src/task-risk-profile.ts +193 -193
  452. package/node_modules/@sdd-agent-platform/core/src/test-support/fixtures.ts +413 -398
  453. package/node_modules/@sdd-agent-platform/core/src/test-support/run-state.ts +102 -56
  454. package/node_modules/@sdd-agent-platform/core/src/test-support.ts +2 -2
  455. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.test.ts +72 -72
  456. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.ts +9 -12
  457. package/node_modules/@sdd-agent-platform/core/src/verification/rendering.ts +137 -137
  458. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.test.ts +77 -84
  459. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.ts +77 -77
  460. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.ts +455 -506
  461. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.test.ts → task-evidence-judgment.test.ts} +261 -261
  462. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.ts → task-evidence-judgment.ts} +619 -619
  463. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.ts +1190 -1190
  464. package/node_modules/@sdd-agent-platform/core/src/verification/validation-cache.ts +106 -106
  465. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.ts +513 -556
  466. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.ts +334 -334
  467. package/node_modules/@sdd-agent-platform/core/src/verification.ts +8 -8
  468. package/node_modules/@sdd-agent-platform/core/src/work-units/contracts.ts +26 -26
  469. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.test.ts +88 -88
  470. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.ts +112 -112
  471. package/node_modules/@sdd-agent-platform/core/src/work-units.ts +2 -2
  472. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/evidence-packet.ts +190 -425
  473. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.test.ts +169 -507
  474. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.ts +136 -182
  475. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.test.ts +135 -174
  476. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.ts +153 -194
  477. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/types.ts +111 -115
  478. package/node_modules/@sdd-agent-platform/core/src/workflow-state/affected-file-conflicts.ts +95 -93
  479. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.test.ts +32 -32
  480. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.ts +114 -114
  481. package/node_modules/@sdd-agent-platform/core/src/workflow-state/latest-eligible-run.ts +184 -224
  482. package/node_modules/@sdd-agent-platform/core/src/workflow-state/migration-recovery.ts +158 -158
  483. package/node_modules/@sdd-agent-platform/core/src/workflow-state/repair-contract.ts +77 -77
  484. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve-task-run.ts +114 -114
  485. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.test.ts +969 -956
  486. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.ts +967 -992
  487. package/node_modules/@sdd-agent-platform/core/src/workflow-state/runtime-projections.ts +712 -712
  488. package/node_modules/@sdd-agent-platform/core/src/workflow-state.ts +2 -2
  489. package/node_modules/@sdd-agent-platform/core/src/worktree/isolation.ts +130 -130
  490. package/node_modules/@sdd-agent-platform/core/src/worktree/lifecycle.ts +269 -269
  491. package/node_modules/@sdd-agent-platform/core/src/worktree/worktree.test.ts +150 -150
  492. package/node_modules/@sdd-agent-platform/core/src/worktree.ts +2 -2
  493. package/node_modules/@sdd-agent-platform/core/tsconfig.json +15 -15
  494. package/package.json +2 -2
  495. package/packages/cli/dist/args.js +2 -2
  496. package/packages/cli/dist/args.js.map +1 -1
  497. package/packages/cli/dist/commands/ai-tools.js +2 -13
  498. package/packages/cli/dist/commands/ai-tools.js.map +1 -1
  499. package/packages/cli/dist/commands/{verifies.d.ts → artifact.d.ts} +1 -1
  500. package/packages/cli/dist/commands/artifact.js +168 -0
  501. package/packages/cli/dist/commands/artifact.js.map +1 -0
  502. package/packages/cli/dist/commands/context.js +1 -1
  503. package/packages/cli/dist/commands/context.js.map +1 -1
  504. package/packages/cli/dist/commands/evidence.js.map +1 -0
  505. package/packages/cli/dist/commands/execution.js +127 -49
  506. package/packages/cli/dist/commands/execution.js.map +1 -1
  507. package/packages/cli/dist/commands/governance.js +1 -1
  508. package/packages/cli/dist/commands/governance.js.map +1 -1
  509. package/packages/cli/dist/commands/init.js +1 -6
  510. package/packages/cli/dist/commands/init.js.map +1 -1
  511. package/packages/cli/dist/commands/instructions.d.ts +1 -1
  512. package/packages/cli/dist/commands/instructions.js +15 -1
  513. package/packages/cli/dist/commands/instructions.js.map +1 -1
  514. package/packages/cli/dist/commands/registry/runtime.js +63 -40
  515. package/packages/cli/dist/commands/registry/runtime.js.map +1 -1
  516. package/packages/cli/dist/commands/run.js +13 -52
  517. package/packages/cli/dist/commands/run.js.map +1 -1
  518. package/packages/cli/dist/commands/stage-close.d.ts +60 -0
  519. package/packages/cli/dist/commands/stage-close.js +270 -41
  520. package/packages/cli/dist/commands/stage-close.js.map +1 -1
  521. package/packages/cli/dist/commands/status.js +9 -68
  522. package/packages/cli/dist/commands/status.js.map +1 -1
  523. package/packages/cli/dist/commands/tasks.js.map +1 -1
  524. package/packages/cli/dist/dispatch.js +6 -26
  525. package/packages/cli/dist/dispatch.js.map +1 -1
  526. package/packages/cli/dist/help.js +153 -159
  527. package/packages/cli/dist/help.js.map +1 -1
  528. package/packages/cli/dist/renderers/artifacts.d.ts +5 -0
  529. package/packages/cli/dist/renderers/artifacts.js +43 -0
  530. package/packages/cli/dist/renderers/artifacts.js.map +1 -0
  531. package/packages/cli/dist/renderers/doctor.js +1 -1
  532. package/packages/cli/dist/renderers/doctor.js.map +1 -1
  533. package/packages/cli/dist/renderers/execution.js +1 -1
  534. package/packages/cli/dist/renderers/execution.js.map +1 -1
  535. package/packages/cli/dist/renderers/json.d.ts +0 -1
  536. package/packages/cli/dist/renderers/json.js +0 -3
  537. package/packages/cli/dist/renderers/json.js.map +1 -1
  538. package/packages/cli/dist/renderers/registry-runtime.d.ts +1 -2
  539. package/packages/cli/dist/renderers/registry-runtime.js +0 -20
  540. package/packages/cli/dist/renderers/registry-runtime.js.map +1 -1
  541. package/packages/cli/dist/renderers/router.js +1 -1
  542. package/packages/cli/dist/renderers/router.js.map +1 -1
  543. package/packages/cli/dist/renderers/workflow.d.ts +53 -0
  544. package/packages/cli/dist/renderers/workflow.js +89 -30
  545. package/packages/cli/dist/renderers/workflow.js.map +1 -1
  546. package/packages/cli/dist/tsconfig.tsbuildinfo +1 -1
  547. package/packages/cli/package.json +2 -2
  548. package/packages/core/dist/ai-tools.js +56 -73
  549. package/packages/core/dist/ai-tools.js.map +1 -1
  550. package/packages/core/dist/artifacts/ingestion.js +9 -64
  551. package/packages/core/dist/artifacts/ingestion.js.map +1 -1
  552. package/packages/core/dist/artifacts/sdd-evidence.js +1 -0
  553. package/packages/core/dist/artifacts/sdd-evidence.js.map +1 -1
  554. package/packages/core/dist/artifacts/sdd-result.js +17 -26
  555. package/packages/core/dist/artifacts/sdd-result.js.map +1 -1
  556. package/packages/core/dist/config/init-project.d.ts +8 -7
  557. package/packages/core/dist/config/init-project.js +8 -12
  558. package/packages/core/dist/config/init-project.js.map +1 -1
  559. package/packages/core/dist/config/project-config.d.ts +1 -1
  560. package/packages/core/dist/config/project-config.js +1 -1
  561. package/packages/core/dist/config/project-config.js.map +1 -1
  562. package/packages/core/dist/config/starter-documents.d.ts +3 -4
  563. package/packages/core/dist/config/starter-documents.js +377 -411
  564. package/packages/core/dist/config/starter-documents.js.map +1 -1
  565. package/packages/core/dist/context/build-package.d.ts +1 -1
  566. package/packages/core/dist/context/build-package.js +7 -13
  567. package/packages/core/dist/context/build-package.js.map +1 -1
  568. package/packages/core/dist/context/evidence-summary.js +8 -26
  569. package/packages/core/dist/context/evidence-summary.js.map +1 -1
  570. package/packages/core/dist/context/log-worker.js +2 -2
  571. package/packages/core/dist/context/log-worker.js.map +1 -1
  572. package/packages/core/dist/context-offload/contracts.d.ts +1 -1
  573. package/packages/core/dist/contracts.d.ts +6 -1
  574. package/packages/core/dist/contracts.js +5 -0
  575. package/packages/core/dist/contracts.js.map +1 -1
  576. package/packages/core/dist/delegation/model.d.ts +0 -3
  577. package/packages/core/dist/delegation/validation.d.ts +0 -3
  578. package/packages/core/dist/delegation/validation.js +4 -7
  579. package/packages/core/dist/delegation/validation.js.map +1 -1
  580. package/packages/core/dist/doctor/checks/document-chain.js +3 -13
  581. package/packages/core/dist/doctor/checks/document-chain.js.map +1 -1
  582. package/packages/core/dist/doctor/checks/project.js +8 -8
  583. package/packages/core/dist/doctor/checks/project.js.map +1 -1
  584. package/packages/core/dist/doctor/checks/registries.js +1 -0
  585. package/packages/core/dist/doctor/checks/registries.js.map +1 -1
  586. package/packages/core/dist/doctor/checks/run-evidence.js +4 -4
  587. package/packages/core/dist/doctor/checks/run-evidence.js.map +1 -1
  588. package/packages/core/dist/doctor/checks/run-trust.js +24 -0
  589. package/packages/core/dist/doctor/checks/run-trust.js.map +1 -1
  590. package/packages/core/dist/doctor/checks/runtime-contracts.js +1 -1
  591. package/packages/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  592. package/packages/core/dist/doctor/doctor.js +43 -180
  593. package/packages/core/dist/doctor/doctor.js.map +1 -1
  594. package/packages/core/dist/evidence/lookup.d.ts +1 -1
  595. package/packages/core/dist/evidence/lookup.js +7 -14
  596. package/packages/core/dist/evidence/lookup.js.map +1 -1
  597. package/packages/core/dist/evidence-runtime/coordination.js +110 -0
  598. package/packages/core/dist/evidence-runtime/coordination.js.map +1 -0
  599. package/packages/core/dist/execution/background-executor.js +4 -4
  600. package/packages/core/dist/execution/background-executor.js.map +1 -1
  601. package/packages/core/dist/execution/foreground-subagents.js +3 -3
  602. package/packages/core/dist/execution/foreground-subagents.js.map +1 -1
  603. package/packages/core/dist/execution/host-invocation.js +85 -86
  604. package/packages/core/dist/execution/host-invocation.js.map +1 -1
  605. package/packages/core/dist/execution/resident-worker.js +2 -3
  606. package/packages/core/dist/execution/resident-worker.js.map +1 -1
  607. package/packages/core/dist/execution/stage-team-runtime.js +2 -2
  608. package/packages/core/dist/execution/stage-team-runtime.js.map +1 -1
  609. package/packages/core/dist/governance/policy.d.ts +1 -1
  610. package/packages/core/dist/governance/policy.js +1 -1
  611. package/packages/core/dist/governance/policy.js.map +1 -1
  612. package/packages/core/dist/instructions.d.ts +1 -1
  613. package/packages/core/dist/instructions.js +31 -67
  614. package/packages/core/dist/instructions.js.map +1 -1
  615. package/packages/core/dist/lifecycle/decision-gate.js +1 -1
  616. package/packages/core/dist/lifecycle/decision-gate.js.map +1 -1
  617. package/packages/core/dist/lifecycle/ship.d.ts +0 -1
  618. package/packages/core/dist/lifecycle/ship.js +59 -85
  619. package/packages/core/dist/lifecycle/ship.js.map +1 -1
  620. package/packages/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  621. package/packages/core/dist/lifecycle-graph/contracts.js +7 -0
  622. package/packages/core/dist/lifecycle-graph/contracts.js.map +1 -0
  623. package/packages/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  624. package/packages/core/dist/lifecycle-graph/kernel.js +461 -0
  625. package/packages/core/dist/lifecycle-graph/kernel.js.map +1 -0
  626. package/packages/core/dist/lifecycle-graph.d.ts +2 -0
  627. package/packages/core/dist/lifecycle-graph.js +3 -0
  628. package/packages/core/dist/lifecycle-graph.js.map +1 -0
  629. package/packages/core/dist/orchestration/contracts.d.ts +1 -1
  630. package/packages/core/dist/orchestration/runtime.d.ts +2 -12
  631. package/packages/core/dist/orchestration/runtime.js +32 -80
  632. package/packages/core/dist/orchestration/runtime.js.map +1 -1
  633. package/packages/core/dist/registries/agent-capability-catalog.d.ts +2 -5
  634. package/packages/core/dist/registries/agent-capability-catalog.js +27 -69
  635. package/packages/core/dist/registries/agent-capability-catalog.js.map +1 -1
  636. package/packages/core/dist/registries/agent-registry.js +118 -34
  637. package/packages/core/dist/registries/agent-registry.js.map +1 -1
  638. package/packages/core/dist/registries/agent-runtime-static.js +1 -1
  639. package/packages/core/dist/registries/agent-runtime-static.js.map +1 -1
  640. package/packages/core/dist/registries/capability-sources.js +1 -1
  641. package/packages/core/dist/registries/command-team-runtime.d.ts +1 -1
  642. package/packages/core/dist/registries/command-team-runtime.js +8 -15
  643. package/packages/core/dist/registries/command-team-runtime.js.map +1 -1
  644. package/packages/core/dist/registries/eval-learning-context.js +4 -4
  645. package/packages/core/dist/registries/eval-learning-context.js.map +1 -1
  646. package/packages/core/dist/registries/plan-scout-domains.d.ts +13 -0
  647. package/packages/core/dist/registries/plan-scout-domains.js +76 -0
  648. package/packages/core/dist/registries/plan-scout-domains.js.map +1 -0
  649. package/packages/core/dist/registries/query-status.js +2 -2
  650. package/packages/core/dist/registries/query-status.js.map +1 -1
  651. package/packages/core/dist/registries/skill-capabilities.js +7 -7
  652. package/packages/core/dist/registries/skill-capabilities.js.map +1 -1
  653. package/packages/core/dist/registries/tool-capabilities.js +4 -4
  654. package/packages/core/dist/registries/tool-capabilities.js.map +1 -1
  655. package/packages/core/dist/registries/tool-plugins.js +2 -2
  656. package/packages/core/dist/registries/tool-plugins.js.map +1 -1
  657. package/packages/core/dist/registries/worker-adapters.js +11 -11
  658. package/packages/core/dist/registries/worker-adapters.js.map +1 -1
  659. package/packages/core/dist/registries/workflow-gates.d.ts +1 -1
  660. package/packages/core/dist/registries/workflow-gates.js +21 -21
  661. package/packages/core/dist/registries/workflow-gates.js.map +1 -1
  662. package/packages/core/dist/risk/consumer-diagnostics.js +2 -1
  663. package/packages/core/dist/risk/consumer-diagnostics.js.map +1 -1
  664. package/packages/core/dist/risk/kernel.js +6 -6
  665. package/packages/core/dist/risk/kernel.js.map +1 -1
  666. package/packages/core/dist/risk/legacy-adapters.js +11 -23
  667. package/packages/core/dist/risk/legacy-adapters.js.map +1 -1
  668. package/packages/core/dist/risk/workflow-gates.d.ts +2 -2
  669. package/packages/core/dist/risk/workflow-gates.js +18 -20
  670. package/packages/core/dist/risk/workflow-gates.js.map +1 -1
  671. package/packages/core/dist/router/agent-runtime.d.ts +0 -2
  672. package/packages/core/dist/router/route-projection.js +1 -1
  673. package/packages/core/dist/router/route-projection.js.map +1 -1
  674. package/packages/core/dist/router/routing.js +16 -48
  675. package/packages/core/dist/router/routing.js.map +1 -1
  676. package/packages/core/dist/router/runtime-import.js +11 -1
  677. package/packages/core/dist/router/runtime-import.js.map +1 -1
  678. package/packages/core/dist/router/runtime-validation.js +2 -2
  679. package/packages/core/dist/router/runtime-validation.js.map +1 -1
  680. package/packages/core/dist/router/stage-route-binding.d.ts +2 -2
  681. package/packages/core/dist/router/stage-route-binding.js +20 -28
  682. package/packages/core/dist/router/stage-route-binding.js.map +1 -1
  683. package/packages/core/dist/router.d.ts +0 -1
  684. package/packages/core/dist/router.js +0 -1
  685. package/packages/core/dist/router.js.map +1 -1
  686. package/packages/core/dist/run-state/artifacts.d.ts +6 -6
  687. package/packages/core/dist/run-state/artifacts.js +13 -124
  688. package/packages/core/dist/run-state/artifacts.js.map +1 -1
  689. package/packages/core/dist/run-state/inspect-run.d.ts +2 -0
  690. package/packages/core/dist/run-state/inspect-run.js +5 -7
  691. package/packages/core/dist/run-state/inspect-run.js.map +1 -1
  692. package/packages/core/dist/run-state/model.d.ts +28 -28
  693. package/packages/core/dist/run-state/run-index.d.ts +2 -0
  694. package/packages/core/dist/run-state/run-index.js +3 -1
  695. package/packages/core/dist/run-state/run-index.js.map +1 -1
  696. package/packages/core/dist/run-state/run-state.js +26 -36
  697. package/packages/core/dist/run-state/run-state.js.map +1 -1
  698. package/packages/core/dist/run-state/task-evidence.d.ts +0 -4
  699. package/packages/core/dist/run-state/task-evidence.js +5 -51
  700. package/packages/core/dist/run-state/task-evidence.js.map +1 -1
  701. package/packages/core/dist/run-state.d.ts +0 -1
  702. package/packages/core/dist/run-state.js +0 -1
  703. package/packages/core/dist/run-state.js.map +1 -1
  704. package/packages/core/dist/runtime-analysis/build.js +1 -1
  705. package/packages/core/dist/runtime-analysis/build.js.map +1 -1
  706. package/packages/core/dist/runtime-analysis/findings.js +5 -5
  707. package/packages/core/dist/runtime-analysis/findings.js.map +1 -1
  708. package/packages/core/dist/runtime-paths.js +1 -1
  709. package/packages/core/dist/runtime-paths.js.map +1 -1
  710. package/packages/core/dist/runtime-projection-p0.d.ts +2 -2
  711. package/packages/core/dist/runtime-projection-p0.js +11 -0
  712. package/packages/core/dist/runtime-projection-p0.js.map +1 -1
  713. package/packages/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  714. package/packages/core/dist/sdd-docs/artifact-depth.js +179 -0
  715. package/packages/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  716. package/packages/core/dist/sdd-docs/document-hashes.d.ts +0 -2
  717. package/packages/core/dist/sdd-docs/document-hashes.js +10 -97
  718. package/packages/core/dist/sdd-docs/document-hashes.js.map +1 -1
  719. package/packages/core/dist/sdd-docs/run-binding.d.ts +1 -1
  720. package/packages/core/dist/sdd-docs/run-binding.js +6 -8
  721. package/packages/core/dist/sdd-docs/run-binding.js.map +1 -1
  722. package/packages/core/dist/sdd-docs/task-parser.d.ts +5 -2
  723. package/packages/core/dist/sdd-docs/task-parser.js +85 -68
  724. package/packages/core/dist/sdd-docs/task-parser.js.map +1 -1
  725. package/packages/core/dist/sdd-docs/task-rendering.js +2 -2
  726. package/packages/core/dist/sdd-docs/task-rendering.js.map +1 -1
  727. package/packages/core/dist/spec-entry.js +40 -0
  728. package/packages/core/dist/spec-entry.js.map +1 -0
  729. package/packages/core/dist/spec-manager-contracts.d.ts +12 -0
  730. package/packages/core/dist/spec-manager-contracts.js +2 -0
  731. package/packages/core/dist/spec-manager-contracts.js.map +1 -0
  732. package/packages/core/dist/stage-artifacts.d.ts +2 -2
  733. package/packages/core/dist/stage-artifacts.js +19 -26
  734. package/packages/core/dist/stage-artifacts.js.map +1 -1
  735. package/packages/core/dist/stage-collaboration-contracts.d.ts +1 -1
  736. package/packages/core/dist/stage-collaboration-contracts.js +3 -6
  737. package/packages/core/dist/stage-collaboration-contracts.js.map +1 -1
  738. package/packages/core/dist/stage-collaboration.d.ts +111 -263
  739. package/packages/core/dist/stage-collaboration.js +1272 -1124
  740. package/packages/core/dist/stage-collaboration.js.map +1 -1
  741. package/packages/core/dist/stage-runtime/runtime.js +5 -5
  742. package/packages/core/dist/stage-runtime/runtime.js.map +1 -1
  743. package/packages/core/dist/status/project-status.d.ts +1 -44
  744. package/packages/core/dist/status/project-status.js +47 -170
  745. package/packages/core/dist/status/project-status.js.map +1 -1
  746. package/packages/core/dist/storage/runtime-store.js +73 -73
  747. package/packages/core/dist/subagents/contracts.d.ts +1 -1
  748. package/packages/core/dist/subagents/runtime.js +7 -7
  749. package/packages/core/dist/subagents/runtime.js.map +1 -1
  750. package/packages/core/dist/sync-back/apply.d.ts +1 -0
  751. package/packages/core/dist/sync-back/apply.js +2 -0
  752. package/packages/core/dist/sync-back/apply.js.map +1 -0
  753. package/packages/core/dist/sync-back/inspect.d.ts +1 -0
  754. package/packages/core/dist/sync-back/inspect.js +2 -0
  755. package/packages/core/dist/sync-back/inspect.js.map +1 -0
  756. package/packages/core/dist/sync-back.d.ts +1 -0
  757. package/packages/core/dist/sync-back.js +2 -0
  758. package/packages/core/dist/sync-back.js.map +1 -0
  759. package/packages/core/dist/task-execution-contract.d.ts +167 -0
  760. package/packages/core/dist/task-execution-contract.js +377 -0
  761. package/packages/core/dist/task-execution-contract.js.map +1 -0
  762. package/packages/core/dist/test-support/fixtures.js +329 -314
  763. package/packages/core/dist/test-support/fixtures.js.map +1 -1
  764. package/packages/core/dist/test-support/run-state.d.ts +1 -0
  765. package/packages/core/dist/test-support/run-state.js +53 -7
  766. package/packages/core/dist/test-support/run-state.js.map +1 -1
  767. package/packages/core/dist/truth-reconciliation.js +9 -12
  768. package/packages/core/dist/truth-reconciliation.js.map +1 -1
  769. package/packages/core/dist/tsconfig.tsbuildinfo +1 -1
  770. package/packages/core/dist/verification/goal-verify.d.ts +0 -48
  771. package/packages/core/dist/verification/goal-verify.js +1 -520
  772. package/packages/core/dist/verification/goal-verify.js.map +1 -1
  773. package/packages/core/dist/verification/rendering.d.ts +5 -5
  774. package/packages/core/dist/verification/rendering.js +14 -14
  775. package/packages/core/dist/verification/rendering.js.map +1 -1
  776. package/packages/core/dist/verification/single-task-loop.d.ts +1 -0
  777. package/packages/core/dist/verification/single-task-loop.js +111 -159
  778. package/packages/core/dist/verification/single-task-loop.js.map +1 -1
  779. package/packages/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  780. package/packages/core/dist/verification/task-evidence-judgment.js +521 -0
  781. package/packages/core/dist/verification/task-evidence-judgment.js.map +1 -0
  782. package/packages/core/dist/verification/test-runtime.js +21 -21
  783. package/packages/core/dist/verification/test-runtime.js.map +1 -1
  784. package/packages/core/dist/verification/validation-wave.d.ts +0 -18
  785. package/packages/core/dist/verification/validation-wave.js +5 -27
  786. package/packages/core/dist/verification/validation-wave.js.map +1 -1
  787. package/packages/core/dist/verification/verify-contract.js +45 -45
  788. package/packages/core/dist/verification/verify-contract.js.map +1 -1
  789. package/packages/core/dist/verification.d.ts +3 -3
  790. package/packages/core/dist/verification.js +2 -2
  791. package/packages/core/dist/verification.js.map +1 -1
  792. package/packages/core/dist/work-units/contracts.d.ts +1 -1
  793. package/packages/core/dist/workflow-gate/evidence-packet.js +9 -227
  794. package/packages/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  795. package/packages/core/dist/workflow-gate/hard-checks.js +9 -50
  796. package/packages/core/dist/workflow-gate/hard-checks.js.map +1 -1
  797. package/packages/core/dist/workflow-gate/policy.js +4 -42
  798. package/packages/core/dist/workflow-gate/policy.js.map +1 -1
  799. package/packages/core/dist/workflow-gate/types.d.ts +2 -3
  800. package/packages/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -0
  801. package/packages/core/dist/workflow-state/affected-file-conflicts.js +2 -1
  802. package/packages/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  803. package/packages/core/dist/workflow-state/dependencies.js +1 -1
  804. package/packages/core/dist/workflow-state/latest-eligible-run.d.ts +1 -0
  805. package/packages/core/dist/workflow-state/latest-eligible-run.js +23 -63
  806. package/packages/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  807. package/packages/core/dist/workflow-state/resolve.d.ts +2 -2
  808. package/packages/core/dist/workflow-state/resolve.js +43 -65
  809. package/packages/core/dist/workflow-state/resolve.js.map +1 -1
  810. package/packages/core/package.json +5 -2
  811. package/tsconfig.build.json +6 -7
  812. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.test.ts +0 -269
  813. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.test.ts +0 -492
  814. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.test.ts +0 -383
  815. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.test.ts +0 -188
  816. package/packages/cli/dist/commands/lifecycle.d.ts +0 -6
  817. package/packages/cli/dist/commands/lifecycle.js +0 -125
  818. package/packages/cli/dist/commands/lifecycle.js.map +0 -1
  819. package/packages/cli/dist/commands/test.d.ts +0 -6
  820. package/packages/cli/dist/commands/test.js +0 -373
  821. package/packages/cli/dist/commands/test.js.map +0 -1
  822. package/packages/cli/dist/commands/verifies.js +0 -87
  823. package/packages/cli/dist/commands/verifies.js.map +0 -1
  824. package/packages/cli/dist/commands/verify.d.ts +0 -6
  825. package/packages/cli/dist/commands/verify.js +0 -330
  826. package/packages/cli/dist/commands/verify.js.map +0 -1
@@ -1,666 +1,429 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtemp, readFile, rm } from 'node:fs/promises';
4
- import { tmpdir } from 'node:os';
5
- import path from 'node:path';
6
-
7
- import { initProject } from '../config/init-project.js';
8
- import {
9
- adaptiveTeamTaskMarkdown,
10
- appendProjectRuntimeConfig,
11
- phase63FrontendTaskMarkdown,
12
- phase63InvalidProjectRuntimeConfig,
13
- phase63ProjectRuntimeConfig,
14
- validTaskMarkdown,
15
- writeBranchDocs
16
- } from '../test-support/fixtures.js';
17
- import { writeVerifyContract } from '../verification/verify-contract.js';
18
- import { createRun, readRunState, writeRunState } from '../run-state/run-state.js';
19
- import { bindTestRunState } from '../test-support/run-state.js';
20
- import { evaluateLifecycleRiskDecisionForModel, recordLifecycleRiskDecisionProjection, readLifecycleRiskDecisionProjection } from '../risk.js';
21
- import { parseSddBranch } from '../sdd-docs/task-parser.js';
22
- import {
23
- inspectAgentSkillTeamRuntime,
24
- inspectCapabilitySource,
25
- inspectExternalAgentPackImport,
26
- inspectSkillCapability,
27
- inspectTeamModePolicy,
28
- listCapabilitySources,
29
- listSkillCapabilities,
30
- routeSddTask,
31
- validateAgentSkillTeamRuntime
32
- } from './route-sdd-task.js';
33
- import { importRuntimeSkillCapability } from './runtime-import.js';
34
-
35
- test('Phase 6 agent skill team runtime exposes reusable contracts and router decisions', async () => {
36
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase60-runtime-'));
37
- try {
38
- await initProject(root);
39
- await seedLifecycleRiskDecision(root, 'master');
40
-
41
- const runtime = await inspectAgentSkillTeamRuntime(root);
42
- const validation = await validateAgentSkillTeamRuntime(root);
43
- const skillCapabilities = await listSkillCapabilities(root);
44
- const hashlineCapability = await inspectSkillCapability(root, 'host.edit.hashline');
45
- const sourceCatalog = await listCapabilitySources(root);
46
- const agencySource = await inspectCapabilitySource(root, 'agency_agents_material');
47
- const agencyImport = await inspectExternalAgentPackImport(root, 'agency_agents_material');
48
- const codexSource = await inspectCapabilitySource(root, 'codex_host_future');
49
- const codexImport = await inspectExternalAgentPackImport(root, 'codex_host_future');
50
- const figmaSource = await inspectCapabilitySource(root, 'figma_design_future');
51
- const teamDefault = await inspectTeamModePolicy(root);
52
- const teamEnabled = await inspectTeamModePolicy(root, { taskId: 'ONBOARDING-1', branch: 'master', enabled: true });
53
- const route = await routeSddTask(root, { taskId: 'ONBOARDING-1', branch: 'master', teamModeEnabled: true });
54
-
55
- assert.equal(runtime.version, 'phase-6.0-agent-skill-team-runtime-v1');
56
- assert.equal(runtime.teamMode.decision, 'disabled');
57
- assert.equal(runtime.hostAdapter.workflowProjectionPolicy.includes('host-neutral canonical CLI commands'), true);
58
- assert.deepEqual(runtime.hostAdapter.workflowProjections.map((projection) => `${projection.host}:${projection.support}`), ['claude_code:active', 'codex:future', 'opencode:active']);
59
- assert.equal(runtime.hostAdapter.workflowProjections.find((projection) => projection.host === 'codex')?.unsupportedReason?.includes('not marked active'), true);
60
- assert.equal(runtime.profiles.some((profile) => profile.id === 'orchestrator'), true);
61
- assert.equal(runtime.profiles.some((profile) => profile.id === 'security'), true);
62
- assert.equal(runtime.skillCapabilities.some((capability) => capability.id === 'claude.subagent.researcher'), true);
63
- assert.equal(validation.valid, true);
64
- assert.equal(skillCapabilities.capabilities.some((capability) => capability.id === 'external.agency_agents.material'), true);
65
- assert.ok(hashlineCapability);
66
- assert.equal(hashlineCapability.reuseDecision, 'reuse_direct');
67
- assert.equal(sourceCatalog.sources.some((source) => source.id === 'ohmy_team_mode'), true);
68
- assert.ok(codexSource);
69
- assert.equal(codexSource.quarantineStatus, 'denied');
70
- assert.equal(codexSource.hostCompatibility.includes('codex:unsupported'), true);
71
- assert.equal(codexImport.status, 'denied');
72
- assert.equal(codexImport.allowedProfiles.length, 0);
73
- assert.ok(figmaSource);
74
- assert.equal(figmaSource.allowedEvidenceTypes.includes('design_context'), true);
75
- assert.equal(figmaSource.reuseDecision, 'adapt_via_host_adapter');
76
- assert.ok(agencySource);
77
- assert.equal(agencySource.quarantineRequired, true);
78
- assert.equal(agencySource.quarantineStatus, 'quarantined');
79
- assert.equal(agencySource.permissionModel.length > 0, true);
80
- assert.equal(agencySource.provenanceRequirements.length > 0, true);
81
- assert.equal(agencyImport.status, 'quarantined');
82
- assert.equal(agencyImport.checks.some((check) => check.check === 'dangerous_command_scan'), true);
83
- assert.equal(teamDefault.decision, 'disabled');
84
- assert.equal(teamDefault.activation, 'off');
85
- assert.equal(teamDefault.mode, 'off');
86
- assert.equal(teamEnabled.decision, 'enabled');
87
- assert.equal(teamEnabled.activation, 'force');
88
- assert.equal(teamEnabled.mode, 'review-lite');
89
- assert.equal(route.version, 'phase-6.0-agent-router-v1');
90
- assert.equal(route.taskId, 'ONBOARDING-1');
91
- assert.equal(route.recommendedProfile, 'researcher');
92
- assert.equal(route.requiredCapabilities.includes('context7.docs'), true);
93
- assert.equal(route.toolPermission?.policy, 'allow');
94
- assert.equal(route.teamMode.activation, 'force');
95
- assert.equal(route.teamMode.mode, 'review-lite');
96
- assert.equal(route.teamMode.costClass, 'low');
97
- } finally {
98
- await rm(root, { recursive: true, force: true });
99
- }
100
- });
101
-
102
- test('Phase 6 adaptive team-mode routes choose cost-bounded agent teams automatically', async () => {
103
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase60-adaptive-team-'));
104
- try {
105
- await initProject(root);
106
- await writeBranchDocs(root, 'master', `# Tasks\n\n${adaptiveTeamTaskMarkdown('LOW', { allowedAgents: ['implementer'], affectedFiles: ['docs/low.md'] })}\n${adaptiveTeamTaskMarkdown('REVIEW', { allowedAgents: ['reviewer'], requiredArtifacts: ['artifacts/review-REVIEW.md'], affectedFiles: ['docs/review.md'] })}\n${adaptiveTeamTaskMarkdown('SOURCE', { allowedAgents: ['implementer'] })}\n${adaptiveTeamTaskMarkdown('HIGH', { allowedAgents: ['implementer'], risk: ['database'] })}\n${adaptiveTeamTaskMarkdown('SECURITY', { allowedAgents: ['security'], risk: ['security'] })}`);
107
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
108
- await seedLifecycleRiskDecision(root, 'master');
109
-
110
- const low = await routeSddTask(root, { taskId: 'LOW', branch: 'master' });
111
- const review = await routeSddTask(root, { taskId: 'REVIEW', branch: 'master' });
112
- const sourceBoundary = await routeSddTask(root, { taskId: 'SOURCE', branch: 'master' });
113
- const high = await routeSddTask(root, { taskId: 'HIGH', branch: 'master', approved: true });
114
- const unapprovedHigh = await routeSddTask(root, { taskId: 'HIGH', branch: 'master' });
115
- const security = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master', approved: true });
116
- const forced = await routeSddTask(root, { taskId: 'LOW', branch: 'master', teamModeActivation: 'force' });
117
- const disabled = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master', teamModeActivation: 'off' });
118
- const unapprovedSecurity = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master' });
119
-
120
- assert.equal(low.teamMode.activation, 'auto');
121
- assert.equal(low.teamMode.mode, 'off');
122
- assert.equal(low.teamMode.enabled, false);
123
- assert.equal(low.teamMode.costClass, 'none');
124
- assert.equal(low.teamMode.costRoute, 'downgraded');
125
- assert.match(low.teamMode.downgradeReason ?? '', /Shared risk profile is low/);
126
- assert.equal(low.teamMode.trustPolicyEnforced, true);
127
- assert.equal(review.teamMode.activation, 'auto');
128
- assert.equal(review.teamMode.mode, 'review-lite');
129
- assert.equal(review.teamMode.enabled, true);
130
- assert.equal(review.teamMode.costClass, 'low');
131
- assert.equal(review.teamMode.costRoute, 'downgraded');
132
- assert.match(review.teamMode.downgradeReason ?? '', /Low-cost review-lite route/);
133
- assert.equal(review.teamMode.trustPolicyEnforced, true);
134
- assert.equal(review.teamMode.maxMembers <= 2, true);
135
- assert.equal(review.teamMode.waveRecommendation.includes('implementation_review'), true);
136
- assert.equal(unapprovedHigh.category, 'blocked');
137
- assert.equal(unapprovedHigh.lifecycleGate, 'approval-before-test');
138
- assert.match(unapprovedHigh.nextAction, /rerun sdd test task-HIGH --approved/);
139
- assert.equal(high.teamMode.mode, 'hyperplan');
140
- assert.equal(high.teamMode.enabled, true);
141
- assert.equal(high.teamMode.costClass, 'high');
142
- assert.equal(high.teamMode.costRoute, 'no_downgrade');
143
- assert.equal(high.teamMode.downgradeReason, null);
144
- assert.equal(high.teamMode.trustPolicyEnforced, true);
145
- assert.equal(high.teamMode.maxMembers <= 4, true);
146
- assert.equal(high.teamMode.waveRecommendation.includes('hyperplan'), true);
147
- assert.equal(sourceBoundary.lifecycleGate, 'review-before-test');
148
- assert.match(sourceBoundary.nextAction, /reviewer inspect affected files and validation commands/);
149
- assert.equal(sourceBoundary.teamMode.mode, 'hyperplan');
150
- assert.equal(sourceBoundary.teamMode.costClass, 'high');
151
- assert.match(sourceBoundary.teamMode.reason, /Source-boundary/);
152
- assert.equal(security.teamMode.mode, 'security-research');
153
- assert.equal(security.teamMode.costClass, 'high');
154
- assert.equal(security.teamMode.costRoute, 'no_downgrade');
155
- assert.equal(security.teamMode.downgradeReason, null);
156
- assert.equal(security.teamMode.trustPolicyEnforced, true);
157
- assert.equal(security.teamMode.maxMembers <= 3, true);
158
- assert.equal(security.teamMode.waveRecommendation.includes('security_research'), true);
159
- assert.equal(unapprovedSecurity.category, 'blocked');
160
- assert.match(unapprovedSecurity.blockedReason ?? '', /human approval before validation/);
161
- assert.equal(unapprovedSecurity.lifecycleGate, 'approval-before-test');
162
- assert.match(unapprovedSecurity.nextAction, /rerun sdd test task-SECURITY --approved/);
163
- assert.doesNotMatch(unapprovedSecurity.nextAction, /Fix task gaps/);
164
- assert.equal(forced.teamMode.activation, 'force');
165
- assert.equal(forced.teamMode.mode, 'review-lite');
166
- assert.equal(forced.teamMode.costClass, 'low');
167
- assert.equal(forced.teamMode.costRoute, 'no_downgrade');
168
- assert.equal(forced.teamMode.downgradeReason, null);
169
- assert.equal(forced.teamMode.trustPolicyEnforced, true);
170
- assert.equal(disabled.teamMode.activation, 'off');
171
- assert.equal(disabled.teamMode.mode, 'off');
172
- assert.equal(disabled.teamMode.enabled, false);
173
- assert.equal(disabled.teamMode.costRoute, 'blocked');
174
- assert.equal(disabled.teamMode.trustPolicyEnforced, true);
175
- } finally {
176
- await rm(root, { recursive: true, force: true });
177
- }
178
- });
179
-
180
- test('routeSddTask uses derived route cache and opt-in profiling only', async () => {
181
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-cache-profile-'));
182
- try {
183
- await initProject(root);
184
- await writeBranchDocs(root, 'master', `# Tasks\n\n${adaptiveTeamTaskMarkdown('CACHE', { allowedAgents: ['reviewer'], requiredArtifacts: ['artifacts/review-CACHE.md'], affectedFiles: ['docs/cache.md'] })}`);
185
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
186
- await seedLifecycleRiskDecision(root, 'master');
187
-
188
- const uncached = await routeSddTask(root, { taskId: 'CACHE', branch: 'master' });
189
- const first = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true, profile: true });
190
- const second = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true });
191
- const third = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true, profile: true });
192
-
193
- assert.equal(uncached.cache, undefined);
194
- assert.equal(uncached.profile, undefined);
195
- assert.equal(first.cache?.status, 'stored');
196
- assert.equal(first.cache?.source, 'content_addressed_derived_route');
197
- assert.equal(first.cache?.authoritative, false);
198
- assert.ok(first.profile);
199
- assert.equal(first.profile.every((span) => span.contract === 'phase-6.9-runtime-profile-v1'), true);
200
- assert.equal(first.profile.some((span) => span.name === 'route_compute'), true);
201
- assert.equal(first.teamMode.costRoute, 'downgraded');
202
- assert.equal(first.teamMode.trustPolicyEnforced, true);
203
- assert.equal(second.cache?.status, 'hit');
204
- assert.equal(second.cache?.authoritative, false);
205
- assert.equal(second.profile, undefined);
206
- assert.equal(third.cache?.status, 'hit');
207
- assert.ok(third.profile);
208
- assert.equal(third.profile.some((span) => span.name === 'route_total'), true);
209
- assert.equal(third.profile.some((span) => span.name === 'route_compute'), false);
210
-
211
- await writeBranchDocs(root, 'master', `# Tasks\n\n${adaptiveTeamTaskMarkdown('CACHE', { allowedAgents: ['reviewer'], requiredArtifacts: ['artifacts/review-CACHE.md'], affectedFiles: ['docs/cache.md'] })}\n\nCache key invalidation fixture.`);
212
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
213
- await seedLifecycleRiskDecision(root, 'master');
214
- const invalidated = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true });
215
-
216
- assert.equal(invalidated.cache?.status, 'stored');
217
- assert.notEqual(invalidated.cache?.key, first.cache?.key);
218
- assert.equal(invalidated.cache?.authoritative, false);
219
- } finally {
220
- await rm(root, { recursive: true, force: true });
221
- }
222
- });
223
-
224
- test('Phase 6.3 project agent runtime merges project config and routes by alias and rule', async () => {
225
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase63-runtime-'));
226
- try {
227
- await initProject(root);
228
- await appendProjectRuntimeConfig(root, phase63ProjectRuntimeConfig());
229
- await writeBranchDocs(root, 'master', phase63FrontendTaskMarkdown('FRONTEND-1'));
230
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
231
- await seedLifecycleRiskDecision(root, 'master');
232
-
233
- const runtime = await inspectAgentSkillTeamRuntime(root);
234
- const validation = await validateAgentSkillTeamRuntime(root);
235
- const skillCapabilities = await listSkillCapabilities(root);
236
- const frontendCapability = await inspectSkillCapability(root, 'project.skill.frontend_review');
237
- const frontendSource = await inspectCapabilitySource(root, 'project_frontend_material');
238
- const pack = await inspectExternalAgentPackImport(root, 'project_frontend_material');
239
- const route = await routeSddTask(root, { taskId: 'FRONTEND-1', branch: 'master' });
240
-
241
- assert.equal(validation.valid, true);
242
- assert.equal(runtime.profiles.some((profile) => profile.id === 'frontend'), true);
243
- assert.equal(runtime.skillCapabilities.some((capability) => capability.id === 'project.skill.frontend_review'), true);
244
- assert.equal(runtime.capabilitySources.some((source) => source.id === 'project_frontend_material'), true);
245
- assert.equal(runtime.registrySources?.some((source) => source.id === 'frontend' && source.origin === 'project_config'), true);
246
- assert.equal(skillCapabilities.registrySources?.some((source) => source.id === 'project.skill.frontend_review' && source.origin === 'project_config'), true);
247
- assert.ok(frontendCapability);
248
- assert.equal(frontendCapability.evidenceType, 'artifact');
249
- assert.ok(frontendSource);
250
- assert.equal(frontendSource.quarantineRequired, true);
251
- assert.equal(pack.status, 'quarantined');
252
- assert.equal(route.recommendedProfile, 'frontend');
253
- assert.equal(route.allowedProfiles.includes('frontend'), true);
254
- assert.equal(route.requiredCapabilities.includes('project.skill.frontend_review'), true);
255
- assert.equal(route.requiredCapabilities.includes('playwright.browser_validation'), true);
256
- assert.equal(route.resolvedAliases?.some((alias) => alias.input === 'frontend-dev' && alias.resolved === 'frontend'), true);
257
- assert.equal(route.routingRuleHits?.includes('frontend-default'), true);
258
- assert.equal(route.registrySources?.some((source) => source.id === 'frontend' && source.origin === 'project_config'), true);
259
- assert.equal((route.quarantineWarnings?.length ?? 0) > 0, true);
260
- assert.equal(route.adapterMapping?.hostAdapter, 'claude_code');
261
- assert.equal(route.toolPermission?.toolGroups.includes('browser'), true);
262
- } finally {
263
- await rm(root, { recursive: true, force: true });
264
- }
265
- });
266
-
267
- test('Phase 6.3 skill capability import writes project and user-global runtime declarations', async () => {
268
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase63-import-runtime-'));
269
- try {
270
- await initProject(root);
271
- const configPath = path.join(root, '.sdd', 'project.yml');
272
- const before = await readFile(configPath, 'utf8');
273
-
274
- const dryRun = await importRuntimeSkillCapability(root, {
275
- capabilityId: 'project.skill.frontend_review_imported',
276
- source: 'project',
277
- sourceRef: '.claude/skills/frontend-review/SKILL.md',
278
- name: 'Frontend review imported',
279
- domains: ['frontend', 'review'],
280
- stages: ['plan', 'do', 'test'],
281
- dryRun: true
282
- });
283
- assert.equal(dryRun.status, 'dry_run');
284
- assert.equal(dryRun.written, false);
285
- assert.equal(await inspectSkillCapability(root, 'project.skill.frontend_review_imported'), null);
286
- assert.equal(await readFile(configPath, 'utf8'), before);
287
-
288
- const created = await importRuntimeSkillCapability(root, {
289
- capabilityId: 'project.skill.frontend_review_imported',
290
- source: 'project',
291
- sourceRef: '.claude/skills/frontend-review/SKILL.md',
292
- name: 'Frontend review imported',
293
- domains: ['frontend', 'review'],
294
- stages: ['plan', 'do', 'test']
295
- });
296
- const projectCapability = await inspectSkillCapability(root, 'project.skill.frontend_review_imported');
297
- const projectSource = await inspectCapabilitySource(root, 'project_skill_frontend_review_imported_source');
298
- const validation = await validateAgentSkillTeamRuntime(root);
299
-
300
- assert.equal(created.status, 'created');
301
- assert.equal(created.written, true);
302
- assert.ok(projectCapability);
303
- assert.equal(projectCapability.source, 'project');
304
- assert.equal(projectCapability.sourceRef, 'project_skill_frontend_review_imported_source');
305
- assert.ok(projectSource);
306
- assert.equal(projectSource.kind, 'project_material');
307
- assert.equal(projectSource.quarantineRequired, false);
308
- assert.equal(validation.valid, true);
309
-
310
- const afterCreate = await readFile(configPath, 'utf8');
311
- const unchanged = await importRuntimeSkillCapability(root, {
312
- capabilityId: 'project.skill.frontend_review_imported',
313
- source: 'project',
314
- sourceRef: '.claude/skills/frontend-review/SKILL.md',
315
- name: 'Frontend review imported',
316
- domains: ['frontend', 'review'],
317
- stages: ['plan', 'do', 'test']
318
- });
319
- assert.equal(unchanged.status, 'unchanged');
320
- assert.equal(unchanged.written, false);
321
- assert.equal(await readFile(configPath, 'utf8'), afterCreate);
322
-
323
- const blockedUpdate = await importRuntimeSkillCapability(root, {
324
- capabilityId: 'project.skill.frontend_review_imported',
325
- source: 'project',
326
- sourceRef: '.claude/skills/frontend-review/SKILL.md',
327
- name: 'Frontend review changed',
328
- domains: ['frontend', 'review'],
329
- stages: ['plan', 'do', 'test']
330
- });
331
- assert.equal(blockedUpdate.status, 'blocked');
332
- assert.equal(blockedUpdate.written, false);
333
-
334
- const forcedUpdate = await importRuntimeSkillCapability(root, {
335
- capabilityId: 'project.skill.frontend_review_imported',
336
- source: 'project',
337
- sourceRef: '.claude/skills/frontend-review/SKILL.md',
338
- name: 'Frontend review changed',
339
- domains: ['frontend', 'review'],
340
- stages: ['plan', 'do', 'test'],
341
- force: true
342
- });
343
- assert.equal(forcedUpdate.status, 'updated');
344
- assert.equal(forcedUpdate.written, true);
345
- assert.equal((await inspectSkillCapability(root, 'project.skill.frontend_review_imported'))?.name, 'Frontend review changed');
346
-
347
- const userGlobal = await importRuntimeSkillCapability(root, {
348
- capabilityId: 'user.skill.ui_ux_pro_max',
349
- source: 'user_global',
350
- sourceRef: 'C:\\Users\\inshn\\.claude\\skills\\ui-ux-pro-max\\SKILL.md',
351
- name: 'UI UX Pro Max',
352
- domains: ['ui_ux', 'frontend'],
353
- stages: ['spec', 'plan', 'test'],
354
- allowedEvidenceTypes: ['candidate_evidence', 'design_context'],
355
- attribution: 'user-global Claude Code skill'
356
- });
357
- const userCapability = await inspectSkillCapability(root, 'user.skill.ui_ux_pro_max');
358
- const userSource = await inspectCapabilitySource(root, 'user_skill_ui_ux_pro_max_source');
359
- const userPack = await inspectExternalAgentPackImport(root, 'user_skill_ui_ux_pro_max_source');
360
-
361
- assert.equal(userGlobal.status, 'created');
362
- assert.ok(userCapability);
363
- assert.equal(userCapability.source, 'user_global');
364
- assert.ok(userSource);
365
- assert.equal(userSource.kind, 'user_global_material');
366
- assert.equal(userSource.quarantineRequired, true);
367
- assert.equal(userSource.quarantineStatus, 'required');
368
- assert.equal(userSource.allowedEvidenceTypes.includes('design_context'), true);
369
- assert.equal(userPack.status, 'quarantined');
370
- assert.equal((await validateAgentSkillTeamRuntime(root)).valid, true);
371
-
372
- const builtInBlocked = await importRuntimeSkillCapability(root, {
373
- capabilityId: 'host.edit.hashline',
374
- source: 'project',
375
- sourceRef: '.claude/skills/hashline/SKILL.md',
376
- domains: ['editing'],
377
- stages: ['do'],
378
- force: true
379
- });
380
- assert.equal(builtInBlocked.status, 'blocked');
381
- } finally {
382
- await rm(root, { recursive: true, force: true });
383
- }
384
- });
385
-
386
-
387
- test('Phase 6.3 invalid agent runtime declarations fail closed', async () => {
388
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase63-invalid-runtime-'));
389
- try {
390
- await initProject(root);
391
- await appendProjectRuntimeConfig(root, phase63InvalidProjectRuntimeConfig());
392
-
393
- const validation = await validateAgentSkillTeamRuntime(root);
394
- const issueText = validation.issues.map((issue) => `${issue.field}: ${issue.message}`).join('\n');
395
-
396
- assert.equal(validation.valid, false);
397
- assert.match(issueText, /agent_runtime\.aliases\.frontend_dev/);
398
- assert.match(issueText, /Alias points to unknown profile missing_profile/);
399
- assert.match(issueText, /bad-rule\.preferProfile/);
400
- assert.match(issueText, /missing\.capability/);
401
- assert.match(issueText, /project\.skill\.bad\.evidenceType/);
402
- assert.match(issueText, /unknown source missing_source/);
403
- assert.match(issueText, /unsafe_source\.attribution/);
404
- assert.match(issueText, /unsafe_source\.permissionModel/);
405
- assert.match(issueText, /unsafe_source\.provenanceRequirements/);
406
- assert.match(issueText, /unsafe_source\.hostCompatibility/);
407
- assert.match(issueText, /unsafe_source\.allowedEvidenceTypes/);
408
- assert.match(issueText, /unsafe_source\.forbiddenAuthority/);
409
- assert.match(issueText, /Quarantined source is missing active quarantine status/);
410
- assert.match(issueText, /Quarantined source cannot be reused directly/);
411
- assert.match(issueText, /Quarantined source requests prompt import, direct execution, or lifecycle authority/);
412
- } finally {
413
- await rm(root, { recursive: true, force: true });
414
- }
415
- });
416
-
417
- test('Phase 8.6 capability routing selects narrow domains, packs, and rejected external sources', async () => {
418
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase86-capability-routing-'));
419
- try {
420
- await initProject(root);
421
- await writeBranchDocs(root, 'master', `# Tasks
422
-
423
- ${capabilityRouteTaskMarkdown('SIMPLE', 'Simple backend parser fix', ['packages/core/src/parser.ts'], [], ['npm test'])}
424
- ${capabilityRouteTaskMarkdown('UI', 'UI UX frontend interaction update', ['src/components/Button.tsx'], ['ui-ux', 'accessibility'], ['browser Playwright validation'])}
425
- ${capabilityRouteTaskMarkdown('SECURITY', 'Security permission boundary update', ['packages/core/src/auth.ts'], ['security'], ['npm test'])}
426
- ${capabilityRouteTaskMarkdown('DB', 'Database migration data safety update', ['db/migrations/001.sql'], ['database', 'data-loss'], ['npm test'])}
427
- ${capabilityRouteTaskMarkdown('RELEASE', 'Release deploy rollback readiness', ['.github/workflows/release.yml'], ['release', 'ci-build'], ['npm test'])}
428
- ${capabilityRouteTaskMarkdown('TESTING', 'Testing quality coverage update', ['packages/core/src/parser.test.ts'], ['validation'], ['coverage acceptance test'])}`);
429
- await seedLifecycleRiskDecision(root, 'master');
430
-
431
- const simple = await routeSddTask(root, { taskId: 'SIMPLE', branch: 'master' });
432
- const ui = await routeSddTask(root, { taskId: 'UI', branch: 'master' });
433
- const security = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master', approved: true });
434
- const db = await routeSddTask(root, { taskId: 'DB', branch: 'master', approved: true });
435
- const release = await routeSddTask(root, { taskId: 'RELEASE', branch: 'master', approved: true });
436
- const testing = await routeSddTask(root, { taskId: 'TESTING', branch: 'master' });
437
- const figmaConsidered = ui.capabilityDecision.consideredExternalSources.find((source) => source.sourceId === 'figma_design_future');
438
- const uiUxProMaxConsidered = ui.capabilityDecision.consideredExternalSources.find((source) => source.sourceId === 'ui_ux_pro_max_external');
439
-
440
-
441
- assert.deepEqual(simple.capabilityDecision.selectedDomains.map((item) => item.domain), ['backend-engineering']);
442
- assert.equal(simple.capabilityDecision.selectedPacks.length <= 2, true);
443
- assert.equal(simple.capabilityDecision.authority, 'advisory_only');
444
- assert.equal(simple.capabilityDecision.permissionCeiling, simple.autonomyCeiling);
445
- assert.equal(ui.capabilityDecision.selectedDomains.some((item) => item.domain === 'frontend-engineering'), true);
446
- assert.equal(ui.capabilityDecision.selectedDomains.some((item) => item.domain === 'ui-ux-product-design'), true);
447
- assert.equal(ui.capabilityDecision.selectedPacks.some((pack) => pack.id === 'baseline-ui-ux-product-design'), true);
448
- assert.equal(ui.capabilityDecision.rejectedExternalSources.some((source) => source.sourceId === 'figma_design_future' && /Future adapter|quarantine/.test(source.reason)), true);
449
- assert.equal(ui.capabilityDecision.rejectedExternalSources.some((source) => source.sourceId === 'ui_ux_pro_max_external' && /quarantine/i.test(source.reason)), true);
450
- assert.ok(figmaConsidered);
451
- assert.equal(figmaConsidered.kind, 'future_adapter');
452
- assert.equal(figmaConsidered.consideredUse.length > 0, true);
453
- assert.ok(uiUxProMaxConsidered);
454
- assert.equal(uiUxProMaxConsidered.kind, 'open_source_material');
455
- assert.equal(uiUxProMaxConsidered.quarantineStatus, 'quarantined');
456
- assert.equal(security.capabilityDecision.selectedDomains.some((item) => item.domain === 'security-engineering'), true);
457
- assert.equal(db.capabilityDecision.selectedDomains.some((item) => item.domain === 'db-data-engineering'), true);
458
- assert.equal(release.capabilityDecision.selectedDomains.some((item) => item.domain === 'release-engineering'), true);
459
- assert.equal(release.capabilityDecision.selectedPacks.some((pack) => pack.id === 'baseline-release-engineering'), true);
460
- assert.equal(testing.capabilityDecision.selectedDomains.some((item) => item.domain === 'testing-quality-engineering'), true);
461
- assert.equal(testing.capabilityDecision.evidenceRequirements.some((item) => item.includes('evidence requirement')), true);
462
- assert.equal(ui.requiredCapabilities.includes('figma_design_future'), false);
463
- } finally {
464
- await rm(root, { recursive: true, force: true });
465
- }
466
- });
467
-
468
-
469
- test('routeSddTask blocks downstream tasks until dependencies are completed', async () => {
470
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-dependencies-'));
471
- try {
472
- await initProject(root);
473
- await writeBranchDocs(root, 'feature', `# Tasks\n\n${validTaskMarkdown('DEP1', [])}\n${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
474
- await seedLifecycleRiskDecision(root, 'feature');
475
-
476
- const blocked = await routeSddTask(root, { taskId: 'DEP2', branch: 'feature', approved: true });
477
-
478
- assert.equal(blocked.category, 'blocked');
479
- assert.equal(blocked.recommendedProfile, null);
480
- assert.match(blocked.blockedReason ?? '', /DEP2 depends on DEP1, but DEP1 has not passed required verification/);
481
- assert.match(blocked.nextAction, /sdd test task-DEP1/);
482
-
483
- await writeBranchDocs(root, 'feature', `# Tasks\n\n${validTaskMarkdown('DEP1', []).replace('status: pending', 'status: completed')}\n${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
484
- await seedLifecycleRiskDecision(root, 'feature');
485
- const ready = await routeSddTask(root, { taskId: 'DEP2', branch: 'feature' });
486
-
487
- assert.notEqual(ready.category, 'blocked');
488
- assert.equal(ready.blockedReason, null);
489
- assert.ok(ready.recommendedProfile);
490
- } finally {
491
- await rm(root, { recursive: true, force: true });
492
- }
493
- });
494
-
495
- test('routeSddTask uses latest eligible runtime dependency readiness', async () => {
496
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-runtime-dependencies-'));
497
- try {
498
- await initProject(root);
499
- await writeBranchDocs(root, 'feature', `# Tasks
500
-
501
- ${validTaskMarkdown('DEP1', [])
502
- .replace('packages/core/src/index.ts', 'docs/dep1.md')
503
- .replace('validation:\n - npm test', 'validation_batch: dep-batch\nvalidation_timing: batch_end\nrequires_verify_before_next: false\nvalidation:\n - npm test')}
504
- ${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
505
- await seedLifecycleRiskDecision(root, 'feature');
506
- const run = await createRun(root, { runId: 'run-dep1-implemented' });
507
- await bindTestRunState(root, run.runId, 'feature', 'DEP1');
508
- const bound = await readRunState(root, run.runId);
509
- await writeRunState(root, {
510
- ...bound,
511
- status: 'completed',
512
- tasks: {
513
- ...bound.tasks,
514
- DEP1: {
515
- status: 'implemented_pending_validation',
516
- implementationStatus: 'implemented',
517
- verificationStatus: 'pending_batch',
518
- validationBatch: 'dep-batch',
519
- validationTiming: 'batch_end',
520
- requiresVerifyBeforeNext: false,
521
- gaps: [],
522
- artifacts: []
523
- }
524
- }
525
- });
526
-
527
- const decision = await routeSddTask(root, { taskId: 'DEP2', branch: 'feature' });
528
-
529
- assert.notEqual(decision.category, 'blocked');
530
- assert.equal(decision.blockedReason, null);
531
- assert.ok(decision.recommendedProfile);
532
- } finally {
533
- await rm(root, { recursive: true, force: true });
534
- }
535
- });
536
-
537
- test('routeSddTask blocks stage-local routing when lifecycle projection is missing', async () => {
538
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-lifecycle-authority-'));
539
- try {
540
- await initProject(root);
541
- await writeBranchDocs(root, 'master', `# Tasks\n\n${validTaskMarkdown('LOCAL', [])}`);
542
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
543
-
544
- const decision = await routeSddTask(root, { taskId: 'LOCAL', branch: 'master' });
545
-
546
- assert.equal(decision.category, 'blocked');
547
- assert.match(decision.blockedReason ?? '', /Stage-local entry requires an active lifecycle decision/);
548
- assert.match(decision.nextAction, /Run \/sdd or \/sdd:spec/);
549
- assert.equal(decision.recommendedProfile, null);
550
-
551
- const projection = await readLifecycleRiskDecisionProjection(root, { branch: 'master' });
552
- assert.equal(projection, null);
553
- } finally {
554
- await rm(root, { recursive: true, force: true });
555
- }
556
- });
557
-
558
- test('routeSddTask semantically binds natural do text to the accepted task boundary', async () => {
559
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-semantic-binding-'));
560
- try {
561
- await initProject(root);
562
- const loginTask = validTaskMarkdown('LOGIN-1', [])
563
- .replace('Valid task', '登录系统')
564
- .replace('Stay in parser files only.', '只实现登录系统边界。')
565
- .replace('Parser behavior is covered.', '登录系统任务完成。');
566
- await writeBranchDocs(root, 'master', `# Tasks\n\n${loginTask}`);
567
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
568
- await seedLifecycleRiskDecision(root, 'master');
569
-
570
- const byId = await routeSddTask(root, { taskId: 'LOGIN-1', branch: 'master' });
571
- const byText = await routeSddTask(root, { taskId: '做登录系统', branch: 'master' });
572
-
573
- assert.equal(byId.taskId, 'LOGIN-1');
574
- assert.equal(byText.taskId, 'LOGIN-1');
575
- assert.equal(byText.stageRouteBinding?.status, 'bound');
576
- assert.equal(byText.stageRouteBinding?.targetId, 'LOGIN-1');
577
- assert.equal(byText.blockedReason, null);
578
- } finally {
579
- await rm(root, { recursive: true, force: true });
580
- }
581
- });
582
-
583
- test('routeSddTask blocks ambiguous natural do text before implementation routing', async () => {
584
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-ambiguous-binding-'));
585
- try {
586
- await initProject(root);
587
- const apiTask = validTaskMarkdown('LOGIN-API', [])
588
- .replace('Valid task', '登录系统接口')
589
- .replace('Stay in parser files only.', '只实现登录系统接口。')
590
- .replace('Parser behavior is covered.', '登录系统接口完成。')
591
- .replace('packages/core/src/index.ts', 'packages/core/src/login-api.ts');
592
- const pageTask = validTaskMarkdown('LOGIN-UI', [])
593
- .replace('Valid task', '登录系统页面')
594
- .replace('Stay in parser files only.', '只实现登录系统页面。')
595
- .replace('Parser behavior is covered.', '登录系统页面完成。')
596
- .replace('packages/core/src/index.ts', 'packages/core/src/login-ui.ts');
597
- await writeBranchDocs(root, 'master', `# Tasks\n\n${apiTask}\n${pageTask}`);
598
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
599
- await seedLifecycleRiskDecision(root, 'master');
600
-
601
- const decision = await routeSddTask(root, { taskId: '登录系统', branch: 'master' });
602
-
603
- assert.equal(decision.category, 'blocked');
604
- assert.equal(decision.recommendedProfile, null);
605
- assert.equal(decision.stageRouteBinding?.status, 'ambiguous');
606
- assert.deepEqual(decision.stageRouteBinding?.matchedRefs.map((ref) => ref.ref).sort(), ['task:LOGIN-API', 'task:LOGIN-UI']);
607
- assert.match(decision.nextAction, /Ambiguous task text/);
608
- } finally {
609
- await rm(root, { recursive: true, force: true });
610
- }
611
- });
612
-
613
- test('routeSddTask routes boundary-expanding natural do text back to lifecycle authority', async () => {
614
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-boundary-expanding-'));
615
- try {
616
- await initProject(root);
617
- const paymentTask = validTaskMarkdown('PAY-1', [])
618
- .replace('Valid task', '支付系统')
619
- .replace('Stay in parser files only.', '只实现支付系统边界。')
620
- .replace('Parser behavior is covered.', '支付系统任务完成。');
621
- await writeBranchDocs(root, 'master', `# Tasks\n\n${paymentTask}`);
622
- await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
623
- await seedLifecycleRiskDecision(root, 'master');
624
-
625
- const decision = await routeSddTask(root, { taskId: '做登录系统', branch: 'master' });
626
-
627
- assert.equal(decision.category, 'blocked');
628
- assert.equal(decision.recommendedProfile, null);
629
- assert.equal(decision.stageRouteBinding?.status, 'boundary_expanding');
630
- assert.equal(decision.stageRouteBinding?.targetId, null);
631
- assert.match(decision.nextAction, /Run \/sdd or \/sdd:spec/);
632
- } finally {
633
- await rm(root, { recursive: true, force: true });
634
- }
635
- });
636
-
637
- function capabilityRouteTaskMarkdown(taskId: string, title: string, affectedFiles: string[], risk: string[], validation: string[]): string {
638
- const affectedFilesBlock = affectedFiles.length === 0 ? 'affected_files: []' : `affected_files:\n${affectedFiles.map((file) => ` - ${file}`).join('\n')}`;
639
- const riskBlock = risk.length === 0 ? 'risk: []' : `risk:\n${risk.map((item) => ` - ${item}`).join('\n')}`;
640
- const validationBlock = validation.length === 0 ? 'validation: []' : `validation:\n${validation.map((item) => ` - ${item}`).join('\n')}`;
641
- return `### ${taskId}: ${title}
642
-
643
- \`\`\`sdd-task
644
- id: ${taskId}
645
- status: pending
646
- wave: 1
647
- depends_on: []
648
- acceptance_refs:
649
- - AC-1
650
- ${affectedFilesBlock}
651
- ${validationBlock}
652
- ${riskBlock}
653
- allowed_agents:
654
- - implementer
655
- \`\`\`
656
-
657
- #### Acceptance
658
-
659
- - ${title}.
660
- `;
661
- }
662
-
663
- async function seedLifecycleRiskDecision(root: string, branch: string): Promise<void> {
664
- const model = await parseSddBranch(root, branch);
665
- await recordLifecycleRiskDecisionProjection(root, evaluateLifecycleRiskDecisionForModel(branch, model));
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtemp, rm } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import path from 'node:path';
6
+
7
+ import { initProject } from '../config/init-project.js';
8
+ import {
9
+ adaptiveTeamTaskMarkdown,
10
+ appendProjectRuntimeConfig,
11
+ phase63FrontendTaskMarkdown,
12
+ phase63InvalidProjectRuntimeConfig,
13
+ phase63ProjectRuntimeConfig,
14
+ validTaskMarkdown,
15
+ writeBranchDocs
16
+ } from '../test-support/fixtures.js';
17
+ import { writeVerifyContract } from '../verification/verify-contract.js';
18
+ import { createRun, readRunState, writeRunState } from '../run-state/run-state.js';
19
+ import { bindTestRunState } from '../test-support/run-state.js';
20
+ import {
21
+ inspectAgentSkillTeamRuntime,
22
+ inspectCapabilitySource,
23
+ inspectExternalAgentPackImport,
24
+ inspectSkillCapability,
25
+ inspectTeamModePolicy,
26
+ listCapabilitySources,
27
+ listSkillCapabilities,
28
+ routeSddTask,
29
+ validateAgentSkillTeamRuntime
30
+ } from './route-sdd-task.js';
31
+
32
+ test.skip('Phase 6 agent skill team runtime exposes reusable contracts and router decisions', async () => {
33
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase60-runtime-'));
34
+ try {
35
+ await initProject(root);
36
+
37
+ const runtime = await inspectAgentSkillTeamRuntime(root);
38
+ const validation = await validateAgentSkillTeamRuntime(root);
39
+ const skillCapabilities = await listSkillCapabilities(root);
40
+ const hashlineCapability = await inspectSkillCapability(root, 'host.edit.hashline');
41
+ const sourceCatalog = await listCapabilitySources(root);
42
+ const agencySource = await inspectCapabilitySource(root, 'agency_agents_material');
43
+ const agencyImport = await inspectExternalAgentPackImport(root, 'agency_agents_material');
44
+ const codexSource = await inspectCapabilitySource(root, 'codex_host_future');
45
+ const codexImport = await inspectExternalAgentPackImport(root, 'codex_host_future');
46
+ const figmaSource = await inspectCapabilitySource(root, 'figma_design_future');
47
+ const teamDefault = await inspectTeamModePolicy(root);
48
+ const teamEnabled = await inspectTeamModePolicy(root, { taskId: 'ONBOARDING-1', branch: 'master', enabled: true });
49
+ const route = await routeSddTask(root, { taskId: 'ONBOARDING-1', branch: 'master', teamModeEnabled: true });
50
+
51
+ assert.equal(runtime.version, 'phase-6.0-agent-skill-team-runtime-v1');
52
+ assert.equal(runtime.teamMode.decision, 'disabled');
53
+ assert.equal(runtime.hostAdapter.workflowProjectionPolicy.includes('host-neutral canonical CLI commands'), true);
54
+ assert.deepEqual(runtime.hostAdapter.workflowProjections.map((projection) => `${projection.host}:${projection.support}`), ['claude_code:active', 'codex:future', 'opencode:active']);
55
+ assert.equal(runtime.hostAdapter.workflowProjections.find((projection) => projection.host === 'codex')?.unsupportedReason?.includes('not marked active'), true);
56
+ assert.equal(runtime.profiles.some((profile) => profile.id === 'orchestrator'), true);
57
+ assert.equal(runtime.profiles.some((profile) => profile.id === 'security'), true);
58
+ assert.equal(runtime.skillCapabilities.some((capability) => capability.id === 'claude.subagent.researcher'), true);
59
+ assert.equal(validation.valid, true);
60
+ assert.equal(skillCapabilities.capabilities.some((capability) => capability.id === 'external.agency_agents.material'), true);
61
+ assert.ok(hashlineCapability);
62
+ assert.equal(hashlineCapability.reuseDecision, 'reuse_direct');
63
+ assert.equal(sourceCatalog.sources.some((source) => source.id === 'ohmy_team_mode'), true);
64
+ assert.ok(codexSource);
65
+ assert.equal(codexSource.quarantineStatus, 'denied');
66
+ assert.equal(codexSource.hostCompatibility.includes('codex:unsupported'), true);
67
+ assert.equal(codexImport.status, 'denied');
68
+ assert.equal(codexImport.allowedProfiles.length, 0);
69
+ assert.ok(figmaSource);
70
+ assert.equal(figmaSource.allowedEvidenceTypes.includes('design_context'), true);
71
+ assert.equal(figmaSource.reuseDecision, 'adapt_via_host_adapter');
72
+ assert.ok(agencySource);
73
+ assert.equal(agencySource.quarantineRequired, true);
74
+ assert.equal(agencySource.quarantineStatus, 'quarantined');
75
+ assert.equal(agencySource.permissionModel.length > 0, true);
76
+ assert.equal(agencySource.provenanceRequirements.length > 0, true);
77
+ assert.equal(agencyImport.status, 'quarantined');
78
+ assert.equal(agencyImport.checks.some((check) => check.check === 'dangerous_command_scan'), true);
79
+ assert.equal(teamDefault.decision, 'disabled');
80
+ assert.equal(teamDefault.activation, 'off');
81
+ assert.equal(teamDefault.mode, 'off');
82
+ assert.equal(teamEnabled.decision, 'enabled');
83
+ assert.equal(teamEnabled.activation, 'force');
84
+ assert.equal(teamEnabled.mode, 'review-lite');
85
+ assert.equal(route.version, 'phase-6.0-agent-router-v1');
86
+ assert.equal(route.taskId, 'ONBOARDING-1');
87
+ assert.equal(route.recommendedProfile, 'researcher');
88
+ assert.equal(route.requiredCapabilities.includes('context7.docs'), true);
89
+ assert.equal(route.toolPermission?.policy, 'allow');
90
+ assert.equal(route.teamMode.activation, 'force');
91
+ assert.equal(route.teamMode.mode, 'review-lite');
92
+ assert.equal(route.teamMode.costClass, 'low');
93
+ } finally {
94
+ await rm(root, { recursive: true, force: true });
95
+ }
96
+ });
97
+
98
+ test.skip('Phase 6 adaptive team-mode routes choose cost-bounded agent teams automatically', async () => {
99
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase60-adaptive-team-'));
100
+ try {
101
+ await initProject(root);
102
+ await writeBranchDocs(root, 'master', `# Tasks\n\n${adaptiveTeamTaskMarkdown('LOW', { allowedAgents: ['implementer'], affectedFiles: ['docs/low.md'] })}\n${adaptiveTeamTaskMarkdown('REVIEW', { allowedAgents: ['reviewer'], requiredArtifacts: ['artifacts/review-REVIEW.md'], affectedFiles: ['docs/review.md'] })}\n${adaptiveTeamTaskMarkdown('SOURCE', { allowedAgents: ['implementer'] })}\n${adaptiveTeamTaskMarkdown('HIGH', { allowedAgents: ['implementer'], risk: ['database'] })}\n${adaptiveTeamTaskMarkdown('SECURITY', { allowedAgents: ['security'], risk: ['security'] })}`);
103
+ await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
104
+
105
+ const low = await routeSddTask(root, { taskId: 'LOW', branch: 'master' });
106
+ const review = await routeSddTask(root, { taskId: 'REVIEW', branch: 'master' });
107
+ const sourceBoundary = await routeSddTask(root, { taskId: 'SOURCE', branch: 'master' });
108
+ const high = await routeSddTask(root, { taskId: 'HIGH', branch: 'master', approved: true });
109
+ const unapprovedHigh = await routeSddTask(root, { taskId: 'HIGH', branch: 'master' });
110
+ const security = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master', approved: true });
111
+ const forced = await routeSddTask(root, { taskId: 'LOW', branch: 'master', teamModeActivation: 'force' });
112
+ const disabled = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master', teamModeActivation: 'off' });
113
+ const unapprovedSecurity = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master' });
114
+
115
+ assert.equal(low.teamMode.activation, 'auto');
116
+ assert.equal(low.teamMode.mode, 'off');
117
+ assert.equal(low.teamMode.enabled, false);
118
+ assert.equal(low.teamMode.costClass, 'none');
119
+ assert.equal(low.teamMode.costRoute, 'downgraded');
120
+ assert.match(low.teamMode.downgradeReason ?? '', /Shared risk profile is low/);
121
+ assert.equal(low.teamMode.trustPolicyEnforced, true);
122
+ assert.equal(review.teamMode.activation, 'auto');
123
+ assert.equal(review.teamMode.mode, 'review-lite');
124
+ assert.equal(review.teamMode.enabled, true);
125
+ assert.equal(review.teamMode.costClass, 'low');
126
+ assert.equal(review.teamMode.costRoute, 'downgraded');
127
+ assert.match(review.teamMode.downgradeReason ?? '', /Low-cost review-lite route/);
128
+ assert.equal(review.teamMode.trustPolicyEnforced, true);
129
+ assert.equal(review.teamMode.maxMembers <= 2, true);
130
+ assert.equal(review.teamMode.waveRecommendation.includes('implementation_review'), true);
131
+ assert.equal(unapprovedHigh.category, 'blocked');
132
+ assert.equal(unapprovedHigh.lifecycleGate, 'approval-before-test');
133
+ assert.match(unapprovedHigh.nextAction, /rerun sdd test task HIGH --approved/);
134
+ assert.equal(high.teamMode.mode, 'hyperplan');
135
+ assert.equal(high.teamMode.enabled, true);
136
+ assert.equal(high.teamMode.costClass, 'high');
137
+ assert.equal(high.teamMode.costRoute, 'no_downgrade');
138
+ assert.equal(high.teamMode.downgradeReason, null);
139
+ assert.equal(high.teamMode.trustPolicyEnforced, true);
140
+ assert.equal(high.teamMode.maxMembers <= 4, true);
141
+ assert.equal(high.teamMode.waveRecommendation.includes('hyperplan'), true);
142
+ assert.equal(sourceBoundary.lifecycleGate, 'review-before-test');
143
+ assert.match(sourceBoundary.nextAction, /reviewer inspect affected files and validation commands/);
144
+ assert.equal(sourceBoundary.teamMode.mode, 'hyperplan');
145
+ assert.equal(sourceBoundary.teamMode.costClass, 'high');
146
+ assert.match(sourceBoundary.teamMode.reason, /Source-boundary/);
147
+ assert.equal(security.teamMode.mode, 'security-research');
148
+ assert.equal(security.teamMode.costClass, 'high');
149
+ assert.equal(security.teamMode.costRoute, 'no_downgrade');
150
+ assert.equal(security.teamMode.downgradeReason, null);
151
+ assert.equal(security.teamMode.trustPolicyEnforced, true);
152
+ assert.equal(security.teamMode.maxMembers <= 3, true);
153
+ assert.equal(security.teamMode.waveRecommendation.includes('security_research'), true);
154
+ assert.equal(unapprovedSecurity.category, 'blocked');
155
+ assert.match(unapprovedSecurity.blockedReason ?? '', /human approval before validation/);
156
+ assert.equal(unapprovedSecurity.lifecycleGate, 'approval-before-test');
157
+ assert.match(unapprovedSecurity.nextAction, /rerun sdd test task SECURITY --approved/);
158
+ assert.doesNotMatch(unapprovedSecurity.nextAction, /Fix task gaps/);
159
+ assert.equal(forced.teamMode.activation, 'force');
160
+ assert.equal(forced.teamMode.mode, 'review-lite');
161
+ assert.equal(forced.teamMode.costClass, 'low');
162
+ assert.equal(forced.teamMode.costRoute, 'no_downgrade');
163
+ assert.equal(forced.teamMode.downgradeReason, null);
164
+ assert.equal(forced.teamMode.trustPolicyEnforced, true);
165
+ assert.equal(disabled.teamMode.activation, 'off');
166
+ assert.equal(disabled.teamMode.mode, 'off');
167
+ assert.equal(disabled.teamMode.enabled, false);
168
+ assert.equal(disabled.teamMode.costRoute, 'blocked');
169
+ assert.equal(disabled.teamMode.trustPolicyEnforced, true);
170
+ } finally {
171
+ await rm(root, { recursive: true, force: true });
172
+ }
173
+ });
174
+
175
+ test('routeSddTask uses derived route cache and opt-in profiling only', async () => {
176
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-cache-profile-'));
177
+ try {
178
+ await initProject(root);
179
+ await writeBranchDocs(root, 'master', `# Tasks\n\n${adaptiveTeamTaskMarkdown('CACHE', { allowedAgents: ['reviewer'], requiredArtifacts: ['artifacts/review-CACHE.md'], affectedFiles: ['docs/cache.md'] })}`);
180
+ await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
181
+
182
+ const uncached = await routeSddTask(root, { taskId: 'CACHE', branch: 'master' });
183
+ const first = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true, profile: true });
184
+ const second = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true });
185
+ const third = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true, profile: true });
186
+
187
+ assert.equal(uncached.cache, undefined);
188
+ assert.equal(uncached.profile, undefined);
189
+ assert.equal(first.cache?.status, 'stored');
190
+ assert.equal(first.cache?.source, 'content_addressed_derived_route');
191
+ assert.equal(first.cache?.authoritative, false);
192
+ assert.ok(first.profile);
193
+ assert.equal(first.profile.every((span) => span.contract === 'phase-6.9-runtime-profile-v1'), true);
194
+ assert.equal(first.profile.some((span) => span.name === 'route_compute'), true);
195
+ assert.equal(first.teamMode.costRoute, 'downgraded');
196
+ assert.equal(first.teamMode.trustPolicyEnforced, true);
197
+ assert.equal(second.cache?.status, 'hit');
198
+ assert.equal(second.cache?.authoritative, false);
199
+ assert.equal(second.profile, undefined);
200
+ assert.equal(third.cache?.status, 'hit');
201
+ assert.ok(third.profile);
202
+ assert.equal(third.profile.some((span) => span.name === 'route_total'), true);
203
+ assert.equal(third.profile.some((span) => span.name === 'route_compute'), false);
204
+
205
+ await writeBranchDocs(root, 'master', `# Tasks\n\n${adaptiveTeamTaskMarkdown('CACHE', { allowedAgents: ['reviewer'], requiredArtifacts: ['artifacts/review-CACHE.md'], affectedFiles: ['docs/cache.md'] })}\n\nCache key invalidation fixture.`);
206
+ await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
207
+ const invalidated = await routeSddTask(root, { taskId: 'CACHE', branch: 'master', cache: true });
208
+
209
+ assert.equal(invalidated.cache?.status, 'stored');
210
+ assert.notEqual(invalidated.cache?.key, first.cache?.key);
211
+ assert.equal(invalidated.cache?.authoritative, false);
212
+ } finally {
213
+ await rm(root, { recursive: true, force: true });
214
+ }
215
+ });
216
+
217
+ test('Phase 6.3 project agent runtime merges project config and routes by alias and rule', async () => {
218
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase63-runtime-'));
219
+ try {
220
+ await initProject(root);
221
+ await appendProjectRuntimeConfig(root, phase63ProjectRuntimeConfig());
222
+ await writeBranchDocs(root, 'master', phase63FrontendTaskMarkdown('FRONTEND-1'));
223
+ await writeVerifyContract(root, { branch: 'master', branchSource: 'cli_option', force: true });
224
+
225
+ const runtime = await inspectAgentSkillTeamRuntime(root);
226
+ const validation = await validateAgentSkillTeamRuntime(root);
227
+ const skillCapabilities = await listSkillCapabilities(root);
228
+ const frontendCapability = await inspectSkillCapability(root, 'project.skill.frontend_review');
229
+ const frontendSource = await inspectCapabilitySource(root, 'project_frontend_material');
230
+ const pack = await inspectExternalAgentPackImport(root, 'project_frontend_material');
231
+ const route = await routeSddTask(root, { taskId: 'FRONTEND-1', branch: 'master' });
232
+
233
+ assert.equal(validation.valid, true);
234
+ assert.equal(runtime.profiles.some((profile) => profile.id === 'frontend'), true);
235
+ assert.equal(runtime.skillCapabilities.some((capability) => capability.id === 'project.skill.frontend_review'), true);
236
+ assert.equal(runtime.capabilitySources.some((source) => source.id === 'project_frontend_material'), true);
237
+ assert.equal(runtime.registrySources?.some((source) => source.id === 'frontend' && source.origin === 'project_config'), true);
238
+ assert.equal(skillCapabilities.registrySources?.some((source) => source.id === 'project.skill.frontend_review' && source.origin === 'project_config'), true);
239
+ assert.ok(frontendCapability);
240
+ assert.equal(frontendCapability.evidenceType, 'artifact');
241
+ assert.ok(frontendSource);
242
+ assert.equal(frontendSource.quarantineRequired, true);
243
+ assert.equal(pack.status, 'quarantined');
244
+ assert.equal(route.recommendedProfile, 'frontend');
245
+ assert.equal(route.allowedProfiles.includes('frontend'), true);
246
+ assert.equal(route.requiredCapabilities.includes('project.skill.frontend_review'), true);
247
+ assert.equal(route.requiredCapabilities.includes('playwright.browser_validation'), true);
248
+ assert.equal(route.resolvedAliases?.some((alias) => alias.input === 'frontend-dev' && alias.resolved === 'frontend'), true);
249
+ assert.equal(route.routingRuleHits?.includes('frontend-default'), true);
250
+ assert.equal(route.registrySources?.some((source) => source.id === 'frontend' && source.origin === 'project_config'), true);
251
+ assert.equal((route.quarantineWarnings?.length ?? 0) > 0, true);
252
+ assert.equal(route.adapterMapping?.hostAdapter, 'claude_code');
253
+ assert.equal(route.toolPermission?.toolGroups.includes('browser'), true);
254
+ } finally {
255
+ await rm(root, { recursive: true, force: true });
256
+ }
257
+ });
258
+
259
+ test('Phase 6.3 invalid agent runtime declarations fail closed', async () => {
260
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase63-invalid-runtime-'));
261
+ try {
262
+ await initProject(root);
263
+ await appendProjectRuntimeConfig(root, phase63InvalidProjectRuntimeConfig());
264
+
265
+ const validation = await validateAgentSkillTeamRuntime(root);
266
+ const issueText = validation.issues.map((issue) => `${issue.field}: ${issue.message}`).join('\n');
267
+
268
+ assert.equal(validation.valid, false);
269
+ assert.match(issueText, /agent_runtime\.aliases\.frontend_dev/);
270
+ assert.match(issueText, /Alias points to unknown profile missing_profile/);
271
+ assert.match(issueText, /bad-rule\.preferProfile/);
272
+ assert.match(issueText, /missing\.capability/);
273
+ assert.match(issueText, /project\.skill\.bad\.evidenceType/);
274
+ assert.match(issueText, /unknown source missing_source/);
275
+ assert.match(issueText, /unsafe_source\.attribution/);
276
+ assert.match(issueText, /unsafe_source\.permissionModel/);
277
+ assert.match(issueText, /unsafe_source\.provenanceRequirements/);
278
+ assert.match(issueText, /unsafe_source\.hostCompatibility/);
279
+ assert.match(issueText, /unsafe_source\.allowedEvidenceTypes/);
280
+ assert.match(issueText, /unsafe_source\.forbiddenAuthority/);
281
+ assert.match(issueText, /Quarantined source is missing active quarantine status/);
282
+ assert.match(issueText, /Quarantined source cannot be reused directly/);
283
+ assert.match(issueText, /Quarantined source requests prompt import, direct execution, or lifecycle authority/);
284
+ } finally {
285
+ await rm(root, { recursive: true, force: true });
286
+ }
287
+ });
288
+
289
+ test('Phase 8.6 capability routing selects narrow domains, packs, and rejected external sources', async () => {
290
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-phase86-capability-routing-'));
291
+ try {
292
+ await initProject(root);
293
+ await writeBranchDocs(root, 'master', `# Tasks
294
+
295
+ ${capabilityRouteTaskMarkdown('SIMPLE', 'Simple backend parser fix', ['packages/core/src/parser.ts'], [], ['npm test'])}
296
+ ${capabilityRouteTaskMarkdown('UI', 'UI UX frontend interaction update', ['src/components/Button.tsx'], ['ui-ux', 'accessibility'], ['browser Playwright validation'])}
297
+ ${capabilityRouteTaskMarkdown('SECURITY', 'Security permission boundary update', ['packages/core/src/auth.ts'], ['security'], ['npm test'])}
298
+ ${capabilityRouteTaskMarkdown('DB', 'Database migration data safety update', ['db/migrations/001.sql'], ['database', 'data-loss'], ['npm test'])}
299
+ ${capabilityRouteTaskMarkdown('RELEASE', 'Release deploy rollback readiness', ['.github/workflows/release.yml'], ['release', 'ci-build'], ['npm test'])}
300
+ ${capabilityRouteTaskMarkdown('TESTING', 'Testing quality coverage update', ['packages/core/src/parser.test.ts'], ['validation'], ['coverage acceptance test'])}`);
301
+
302
+ const simple = await routeSddTask(root, { taskId: 'SIMPLE', branch: 'master' });
303
+ const ui = await routeSddTask(root, { taskId: 'UI', branch: 'master' });
304
+ const security = await routeSddTask(root, { taskId: 'SECURITY', branch: 'master', approved: true });
305
+ const db = await routeSddTask(root, { taskId: 'DB', branch: 'master', approved: true });
306
+ const release = await routeSddTask(root, { taskId: 'RELEASE', branch: 'master', approved: true });
307
+ const testing = await routeSddTask(root, { taskId: 'TESTING', branch: 'master' });
308
+ const figmaConsidered = ui.capabilityDecision.consideredExternalSources.find((source) => source.sourceId === 'figma_design_future');
309
+ const uiUxProMaxConsidered = ui.capabilityDecision.consideredExternalSources.find((source) => source.sourceId === 'ui_ux_pro_max_external');
310
+
311
+
312
+ assert.deepEqual(simple.capabilityDecision.selectedDomains.map((item) => item.domain), ['backend-engineering']);
313
+ assert.equal(simple.capabilityDecision.selectedPacks.length <= 2, true);
314
+ assert.equal(simple.capabilityDecision.authority, 'advisory_only');
315
+ assert.equal(simple.capabilityDecision.permissionCeiling, simple.autonomyCeiling);
316
+ assert.equal(ui.capabilityDecision.selectedDomains.some((item) => item.domain === 'frontend-engineering'), true);
317
+ assert.equal(ui.capabilityDecision.selectedDomains.some((item) => item.domain === 'ui-ux-product-design'), true);
318
+ assert.equal(ui.capabilityDecision.selectedPacks.some((pack) => pack.id === 'baseline-ui-ux-product-design'), true);
319
+ assert.equal(ui.capabilityDecision.rejectedExternalSources.some((source) => source.sourceId === 'figma_design_future' && /Future adapter|quarantine/.test(source.reason)), true);
320
+ assert.equal(ui.capabilityDecision.rejectedExternalSources.some((source) => source.sourceId === 'ui_ux_pro_max_external' && /quarantine/i.test(source.reason)), true);
321
+ assert.ok(figmaConsidered);
322
+ assert.equal(figmaConsidered.kind, 'future_adapter');
323
+ assert.equal(figmaConsidered.consideredUse.length > 0, true);
324
+ assert.ok(uiUxProMaxConsidered);
325
+ assert.equal(uiUxProMaxConsidered.kind, 'open_source_material');
326
+ assert.equal(uiUxProMaxConsidered.quarantineStatus, 'quarantined');
327
+ assert.equal(security.capabilityDecision.selectedDomains.some((item) => item.domain === 'security-engineering'), true);
328
+ assert.equal(db.capabilityDecision.selectedDomains.some((item) => item.domain === 'db-data-engineering'), true);
329
+ assert.equal(release.capabilityDecision.selectedDomains.some((item) => item.domain === 'release-engineering'), true);
330
+ assert.equal(release.capabilityDecision.selectedPacks.some((pack) => pack.id === 'baseline-release-engineering'), true);
331
+ assert.equal(testing.capabilityDecision.selectedDomains.some((item) => item.domain === 'testing-quality-engineering'), true);
332
+ assert.equal(testing.capabilityDecision.evidenceRequirements.some((item) => item.includes('evidence requirement')), true);
333
+ assert.equal(ui.requiredCapabilities.includes('figma_design_future'), false);
334
+ } finally {
335
+ await rm(root, { recursive: true, force: true });
336
+ }
337
+ });
338
+
339
+
340
+ test.skip('routeSddTask blocks downstream tasks until dependencies are completed', async () => {
341
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-dependencies-'));
342
+ try {
343
+ await initProject(root);
344
+ await writeBranchDocs(root, 'feature', `# Tasks\n\n${validTaskMarkdown('DEP1', [])}\n${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
345
+
346
+ const blocked = await routeSddTask(root, { taskId: 'DEP2', branch: 'feature', approved: true });
347
+
348
+ assert.equal(blocked.category, 'blocked');
349
+ assert.equal(blocked.recommendedProfile, null);
350
+ assert.match(blocked.blockedReason ?? '', /DEP2 depends on DEP1, but DEP1 has not passed required verification/);
351
+ assert.match(blocked.nextAction, /sdd test task DEP1/);
352
+
353
+ await writeBranchDocs(root, 'feature', `# Tasks\n\n${validTaskMarkdown('DEP1', []).replace('status: pending', 'status: completed')}\n${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
354
+ const ready = await routeSddTask(root, { taskId: 'DEP2', branch: 'feature' });
355
+
356
+ assert.notEqual(ready.category, 'blocked');
357
+ assert.equal(ready.blockedReason, null);
358
+ assert.ok(ready.recommendedProfile);
359
+ } finally {
360
+ await rm(root, { recursive: true, force: true });
361
+ }
362
+ });
363
+
364
+ test('routeSddTask uses latest eligible runtime dependency readiness', async () => {
365
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-route-runtime-dependencies-'));
366
+ try {
367
+ await initProject(root);
368
+ await writeBranchDocs(root, 'feature', `# Tasks
369
+
370
+ ${validTaskMarkdown('DEP1', [])
371
+ .replace('packages/core/src/index.ts', 'docs/dep1.md')
372
+ .replace('validation:\n - npm test', 'validation_batch: dep-batch\nvalidation_timing: batch_end\nrequires_verify_before_next: false\nvalidation:\n - npm test')}
373
+ ${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
374
+ const run = await createRun(root, { runId: 'run-dep1-implemented' });
375
+ await bindTestRunState(root, run.runId, 'feature', 'DEP1');
376
+ const bound = await readRunState(root, run.runId);
377
+ await writeRunState(root, {
378
+ ...bound,
379
+ status: 'completed',
380
+ tasks: {
381
+ ...bound.tasks,
382
+ DEP1: {
383
+ status: 'implemented_pending_validation',
384
+ implementationStatus: 'implemented',
385
+ verificationStatus: 'pending_batch',
386
+ validationBatch: 'dep-batch',
387
+ validationTiming: 'batch_end',
388
+ requiresVerifyBeforeNext: false,
389
+ gaps: [],
390
+ artifacts: []
391
+ }
392
+ }
393
+ });
394
+
395
+ const decision = await routeSddTask(root, { taskId: 'DEP2', branch: 'feature' });
396
+
397
+ assert.notEqual(decision.category, 'blocked');
398
+ assert.equal(decision.blockedReason, null);
399
+ assert.ok(decision.recommendedProfile);
400
+ } finally {
401
+ await rm(root, { recursive: true, force: true });
402
+ }
403
+ });
404
+
405
+ function capabilityRouteTaskMarkdown(taskId: string, title: string, affectedFiles: string[], risk: string[], validation: string[]): string {
406
+ const affectedFilesBlock = affectedFiles.length === 0 ? 'affected_files: []' : `affected_files:\n${affectedFiles.map((file) => ` - ${file}`).join('\n')}`;
407
+ const riskBlock = risk.length === 0 ? 'risk: []' : `risk:\n${risk.map((item) => ` - ${item}`).join('\n')}`;
408
+ const validationBlock = validation.length === 0 ? 'validation: []' : `validation:\n${validation.map((item) => ` - ${item}`).join('\n')}`;
409
+ return `### ${taskId}: ${title}
410
+
411
+ \`\`\`sdd-task
412
+ id: ${taskId}
413
+ status: pending
414
+ wave: 1
415
+ depends_on: []
416
+ acceptance_refs:
417
+ - AC-1
418
+ ${affectedFilesBlock}
419
+ ${validationBlock}
420
+ ${riskBlock}
421
+ allowed_agents:
422
+ - implementer
423
+ \`\`\`
424
+
425
+ #### Acceptance
426
+
427
+ - ${title}.
428
+ `;
666
429
  }