sdd-agent-platform 0.4.2 → 0.5.1

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 (834) hide show
  1. package/README.md +34 -41
  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 -1
  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 +18 -25
  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/local-run-index.js +1 -9
  37. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/local-run-index.js.map +1 -1
  38. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js +9 -9
  39. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js.map +1 -1
  40. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js +1 -0
  41. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js.map +1 -1
  42. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js +4 -4
  43. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js.map +1 -1
  44. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js +24 -0
  45. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js.map +1 -1
  46. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js +2 -2
  47. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  48. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js +43 -180
  49. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js.map +1 -1
  50. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.d.ts +1 -1
  51. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js +7 -14
  52. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js.map +1 -1
  53. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js +110 -0
  54. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js.map +1 -0
  55. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js +4 -4
  56. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js.map +1 -1
  57. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js +3 -3
  58. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js.map +1 -1
  59. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js +85 -86
  60. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js.map +1 -1
  61. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js +2 -3
  62. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js.map +1 -1
  63. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js +2 -2
  64. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js.map +1 -1
  65. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.d.ts +1 -1
  66. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.js +1 -1
  67. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.js.map +1 -1
  68. package/node_modules/@sdd-agent-platform/core/dist/instructions.d.ts +1 -1
  69. package/node_modules/@sdd-agent-platform/core/dist/instructions.js +31 -67
  70. package/node_modules/@sdd-agent-platform/core/dist/instructions.js.map +1 -1
  71. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/decision-gate.js +1 -1
  72. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/decision-gate.js.map +1 -1
  73. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.d.ts +0 -1
  74. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js +59 -85
  75. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js.map +1 -1
  76. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  77. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js +7 -0
  78. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js.map +1 -0
  79. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  80. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js +461 -0
  81. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js.map +1 -0
  82. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.d.ts +2 -0
  83. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js +3 -0
  84. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js.map +1 -0
  85. package/node_modules/@sdd-agent-platform/core/dist/orchestration/contracts.d.ts +1 -1
  86. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.d.ts +2 -12
  87. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js +32 -80
  88. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js.map +1 -1
  89. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.d.ts +2 -5
  90. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js +27 -69
  91. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js.map +1 -1
  92. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js +118 -34
  93. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js.map +1 -1
  94. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js +1 -1
  95. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js.map +1 -1
  96. package/node_modules/@sdd-agent-platform/core/dist/registries/capability-sources.js +1 -1
  97. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.d.ts +1 -1
  98. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js +8 -15
  99. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js.map +1 -1
  100. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js +4 -4
  101. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js.map +1 -1
  102. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.d.ts +13 -0
  103. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js +76 -0
  104. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js.map +1 -0
  105. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js +2 -2
  106. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js.map +1 -1
  107. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js +7 -7
  108. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js.map +1 -1
  109. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js +4 -4
  110. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js.map +1 -1
  111. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js +2 -2
  112. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js.map +1 -1
  113. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js +11 -11
  114. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js.map +1 -1
  115. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.d.ts +1 -1
  116. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js +21 -21
  117. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js.map +1 -1
  118. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js +2 -1
  119. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js.map +1 -1
  120. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js +6 -6
  121. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js.map +1 -1
  122. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js +11 -23
  123. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js.map +1 -1
  124. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.d.ts +2 -2
  125. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js +18 -20
  126. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js.map +1 -1
  127. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime.d.ts +0 -2
  128. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js +1 -1
  129. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js.map +1 -1
  130. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js +16 -48
  131. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js.map +1 -1
  132. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js +11 -1
  133. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js.map +1 -1
  134. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js +2 -2
  135. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js.map +1 -1
  136. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.d.ts +2 -2
  137. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js +20 -28
  138. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js.map +1 -1
  139. package/node_modules/@sdd-agent-platform/core/dist/router.d.ts +0 -1
  140. package/node_modules/@sdd-agent-platform/core/dist/router.js +0 -1
  141. package/node_modules/@sdd-agent-platform/core/dist/router.js.map +1 -1
  142. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.d.ts +6 -6
  143. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js +13 -124
  144. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js.map +1 -1
  145. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.d.ts +2 -0
  146. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js +5 -7
  147. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js.map +1 -1
  148. package/node_modules/@sdd-agent-platform/core/dist/run-state/model.d.ts +28 -28
  149. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.d.ts +3 -2
  150. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js +15 -66
  151. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js.map +1 -1
  152. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js +26 -36
  153. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js.map +1 -1
  154. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.d.ts +0 -4
  155. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js +5 -51
  156. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js.map +1 -1
  157. package/node_modules/@sdd-agent-platform/core/dist/run-state.d.ts +0 -1
  158. package/node_modules/@sdd-agent-platform/core/dist/run-state.js +0 -1
  159. package/node_modules/@sdd-agent-platform/core/dist/run-state.js.map +1 -1
  160. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js +1 -1
  161. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js.map +1 -1
  162. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js +7 -16
  163. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js.map +1 -1
  164. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/model.d.ts +1 -2
  165. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.d.ts +0 -1
  166. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js +1 -4
  167. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js.map +1 -1
  168. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.d.ts +2 -2
  169. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js +11 -0
  170. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js.map +1 -1
  171. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  172. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js +179 -0
  173. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  174. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.d.ts +0 -2
  175. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js +10 -97
  176. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js.map +1 -1
  177. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.d.ts +1 -1
  178. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js +6 -8
  179. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js.map +1 -1
  180. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.d.ts +5 -2
  181. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js +85 -68
  182. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js.map +1 -1
  183. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js +2 -2
  184. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js.map +1 -1
  185. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js +40 -0
  186. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js.map +1 -0
  187. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.d.ts +12 -0
  188. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js +2 -0
  189. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js.map +1 -0
  190. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.d.ts +2 -2
  191. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js +19 -26
  192. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js.map +1 -1
  193. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.d.ts +1 -1
  194. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js +3 -6
  195. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js.map +1 -1
  196. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.d.ts +111 -263
  197. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js +1272 -1124
  198. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js.map +1 -1
  199. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js +5 -5
  200. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js.map +1 -1
  201. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.d.ts +1 -44
  202. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js +47 -170
  203. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js.map +1 -1
  204. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js +73 -73
  205. package/node_modules/@sdd-agent-platform/core/dist/subagents/contracts.d.ts +1 -1
  206. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js +7 -7
  207. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js.map +1 -1
  208. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.d.ts +1 -0
  209. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js +2 -0
  210. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js.map +1 -0
  211. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.d.ts +1 -0
  212. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js +2 -0
  213. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js.map +1 -0
  214. package/node_modules/@sdd-agent-platform/core/dist/sync-back.d.ts +1 -0
  215. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js +2 -0
  216. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js.map +1 -0
  217. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.d.ts +167 -0
  218. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js +377 -0
  219. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js.map +1 -0
  220. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js +329 -314
  221. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js.map +1 -1
  222. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.d.ts +1 -0
  223. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js +53 -7
  224. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js.map +1 -1
  225. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js +9 -12
  226. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js.map +1 -1
  227. package/node_modules/@sdd-agent-platform/core/dist/tsconfig.tsbuildinfo +1 -1
  228. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.d.ts +0 -48
  229. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js +1 -520
  230. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js.map +1 -1
  231. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.d.ts +5 -5
  232. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js +14 -14
  233. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js.map +1 -1
  234. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.d.ts +1 -0
  235. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js +111 -159
  236. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js.map +1 -1
  237. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  238. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js +521 -0
  239. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js.map +1 -0
  240. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js +21 -21
  241. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js.map +1 -1
  242. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.d.ts +0 -18
  243. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js +5 -27
  244. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js.map +1 -1
  245. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js +45 -45
  246. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js.map +1 -1
  247. package/node_modules/@sdd-agent-platform/core/dist/verification.d.ts +3 -3
  248. package/node_modules/@sdd-agent-platform/core/dist/verification.js +2 -2
  249. package/node_modules/@sdd-agent-platform/core/dist/verification.js.map +1 -1
  250. package/node_modules/@sdd-agent-platform/core/dist/work-units/contracts.d.ts +1 -1
  251. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js +9 -227
  252. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  253. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js +9 -50
  254. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js.map +1 -1
  255. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js +4 -42
  256. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js.map +1 -1
  257. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.d.ts +2 -3
  258. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -0
  259. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js +2 -1
  260. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  261. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/dependencies.js +1 -1
  262. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.d.ts +1 -0
  263. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js +23 -63
  264. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  265. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.d.ts +2 -2
  266. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js +43 -65
  267. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js.map +1 -1
  268. package/node_modules/@sdd-agent-platform/core/package.json +5 -2
  269. package/node_modules/@sdd-agent-platform/core/src/ai-tools.test.ts +238 -185
  270. package/node_modules/@sdd-agent-platform/core/src/ai-tools.ts +56 -73
  271. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.test.ts +189 -227
  272. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.ts +222 -278
  273. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.test.ts +28 -28
  274. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.ts +301 -301
  275. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.test.ts +181 -181
  276. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.ts +231 -240
  277. package/node_modules/@sdd-agent-platform/core/src/artifacts/templates.ts +99 -99
  278. package/node_modules/@sdd-agent-platform/core/src/artifacts.ts +4 -4
  279. package/node_modules/@sdd-agent-platform/core/src/coding-facts/contracts.ts +79 -79
  280. package/node_modules/@sdd-agent-platform/core/src/coding-facts.ts +1 -1
  281. package/node_modules/@sdd-agent-platform/core/src/config/init-project.test.ts +314 -318
  282. package/node_modules/@sdd-agent-platform/core/src/config/init-project.ts +128 -123
  283. package/node_modules/@sdd-agent-platform/core/src/config/project-config.ts +265 -265
  284. package/node_modules/@sdd-agent-platform/core/src/config/project-detection.ts +147 -147
  285. package/node_modules/@sdd-agent-platform/core/src/config/starter-documents.ts +400 -432
  286. package/node_modules/@sdd-agent-platform/core/src/context/budget.ts +30 -30
  287. package/node_modules/@sdd-agent-platform/core/src/context/build-package.ts +304 -311
  288. package/node_modules/@sdd-agent-platform/core/src/context/command-summary.ts +45 -45
  289. package/node_modules/@sdd-agent-platform/core/src/context/context-build.test.ts +188 -189
  290. package/node_modules/@sdd-agent-platform/core/src/context/evidence-summary.ts +144 -163
  291. package/node_modules/@sdd-agent-platform/core/src/context/log-worker.ts +48 -48
  292. package/node_modules/@sdd-agent-platform/core/src/context/source-refs.ts +41 -41
  293. package/node_modules/@sdd-agent-platform/core/src/context-offload/contracts.ts +47 -47
  294. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.test.ts +71 -71
  295. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.ts +178 -178
  296. package/node_modules/@sdd-agent-platform/core/src/context-offload.ts +2 -2
  297. package/node_modules/@sdd-agent-platform/core/src/context.ts +6 -6
  298. package/node_modules/@sdd-agent-platform/core/src/contracts/issues.ts +13 -13
  299. package/node_modules/@sdd-agent-platform/core/src/contracts.test.ts +9 -9
  300. package/node_modules/@sdd-agent-platform/core/src/contracts.ts +121 -116
  301. package/node_modules/@sdd-agent-platform/core/src/delegation/delegation.test.ts +183 -183
  302. package/node_modules/@sdd-agent-platform/core/src/delegation/model.ts +23 -26
  303. package/node_modules/@sdd-agent-platform/core/src/delegation/queue.ts +58 -58
  304. package/node_modules/@sdd-agent-platform/core/src/delegation/run-state.ts +14 -14
  305. package/node_modules/@sdd-agent-platform/core/src/delegation/state-machine.ts +90 -90
  306. package/node_modules/@sdd-agent-platform/core/src/delegation/validation.ts +124 -127
  307. package/node_modules/@sdd-agent-platform/core/src/delegation.ts +26 -26
  308. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/ai-entries.ts +28 -28
  309. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/document-chain.ts +104 -112
  310. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/local-run-index.ts +19 -27
  311. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/project.ts +84 -84
  312. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/registries.ts +252 -251
  313. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-evidence.ts +330 -330
  314. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-records.ts +79 -79
  315. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-trust.ts +128 -107
  316. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/runtime-contracts.ts +300 -300
  317. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.test.ts +628 -755
  318. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.ts +301 -453
  319. package/node_modules/@sdd-agent-platform/core/src/doctor/model.ts +13 -13
  320. package/node_modules/@sdd-agent-platform/core/src/doctor/summary.ts +11 -11
  321. package/node_modules/@sdd-agent-platform/core/src/doctor.ts +2 -2
  322. package/node_modules/@sdd-agent-platform/core/src/evidence/lookup.ts +80 -88
  323. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime/contracts.ts +48 -48
  324. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime.ts +1 -1
  325. package/node_modules/@sdd-agent-platform/core/src/execution/agent-execution-records.ts +195 -195
  326. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.test.ts +187 -235
  327. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.ts +305 -305
  328. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.test.ts +97 -106
  329. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.ts +453 -453
  330. package/node_modules/@sdd-agent-platform/core/src/execution/host-invocation.ts +225 -226
  331. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.test.ts +132 -143
  332. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.ts +436 -437
  333. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.test.ts +102 -102
  334. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.ts +271 -271
  335. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.test.ts +111 -121
  336. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.ts +231 -231
  337. package/node_modules/@sdd-agent-platform/core/src/execution.ts +5 -5
  338. package/node_modules/@sdd-agent-platform/core/src/governance/policy.test.ts +57 -65
  339. package/node_modules/@sdd-agent-platform/core/src/governance/policy.ts +175 -175
  340. package/node_modules/@sdd-agent-platform/core/src/governance.ts +1 -1
  341. package/node_modules/@sdd-agent-platform/core/src/instructions.test.ts +80 -64
  342. package/node_modules/@sdd-agent-platform/core/src/instructions.ts +32 -68
  343. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.test.ts +174 -174
  344. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.ts +373 -373
  345. package/node_modules/@sdd-agent-platform/core/src/lifecycle/rendering.ts +29 -29
  346. package/node_modules/@sdd-agent-platform/core/src/lifecycle/risk-signals.ts +146 -146
  347. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.test.ts +47 -47
  348. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.ts +255 -280
  349. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/contracts.ts +179 -0
  350. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/kernel.ts +522 -0
  351. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph.ts +2 -0
  352. package/node_modules/@sdd-agent-platform/core/src/lifecycle.ts +4 -4
  353. package/node_modules/@sdd-agent-platform/core/src/orchestration/contracts.ts +50 -50
  354. package/node_modules/@sdd-agent-platform/core/src/orchestration/index.ts +2 -2
  355. package/node_modules/@sdd-agent-platform/core/src/orchestration/runtime.ts +331 -394
  356. package/node_modules/@sdd-agent-platform/core/src/path-safety.test.ts +22 -22
  357. package/node_modules/@sdd-agent-platform/core/src/phase8-contracts.test.ts +243 -242
  358. package/node_modules/@sdd-agent-platform/core/src/phase8-projection-compat.test.ts +152 -153
  359. package/node_modules/@sdd-agent-platform/core/src/phase8-risk-kernel.test.ts +277 -277
  360. package/node_modules/@sdd-agent-platform/core/src/phase9-lifecycle-graph.test.ts +103 -0
  361. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.test.ts +88 -88
  362. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.ts +222 -222
  363. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.test.ts +79 -79
  364. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.ts +160 -160
  365. package/node_modules/@sdd-agent-platform/core/src/planning.ts +2 -2
  366. package/node_modules/@sdd-agent-platform/core/src/registries/agent-capability-catalog.ts +426 -473
  367. package/node_modules/@sdd-agent-platform/core/src/registries/agent-registry.ts +230 -146
  368. package/node_modules/@sdd-agent-platform/core/src/registries/agent-runtime-static.ts +142 -142
  369. package/node_modules/@sdd-agent-platform/core/src/registries/capability-sources.ts +253 -253
  370. package/node_modules/@sdd-agent-platform/core/src/registries/command-team-runtime.ts +302 -309
  371. package/node_modules/@sdd-agent-platform/core/src/registries/eval-learning-context.ts +246 -246
  372. package/node_modules/@sdd-agent-platform/core/src/registries/plan-scout-domains.ts +89 -0
  373. package/node_modules/@sdd-agent-platform/core/src/registries/query-status.ts +119 -119
  374. package/node_modules/@sdd-agent-platform/core/src/registries/registries.test.ts +454 -445
  375. package/node_modules/@sdd-agent-platform/core/src/registries/skill-capabilities.ts +37 -37
  376. package/node_modules/@sdd-agent-platform/core/src/registries/tool-capabilities.ts +135 -135
  377. package/node_modules/@sdd-agent-platform/core/src/registries/tool-plugins.ts +132 -132
  378. package/node_modules/@sdd-agent-platform/core/src/registries/worker-adapters.ts +144 -144
  379. package/node_modules/@sdd-agent-platform/core/src/registries/workflow-gates.ts +111 -111
  380. package/node_modules/@sdd-agent-platform/core/src/registries.ts +42 -42
  381. package/node_modules/@sdd-agent-platform/core/src/risk/consumer-diagnostics.ts +98 -97
  382. package/node_modules/@sdd-agent-platform/core/src/risk/contracts.ts +63 -63
  383. package/node_modules/@sdd-agent-platform/core/src/risk/kernel.ts +233 -233
  384. package/node_modules/@sdd-agent-platform/core/src/risk/legacy-adapters.ts +251 -263
  385. package/node_modules/@sdd-agent-platform/core/src/risk/workflow-gates.ts +203 -205
  386. package/node_modules/@sdd-agent-platform/core/src/risk.ts +5 -5
  387. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime-config.ts +327 -327
  388. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime.ts +388 -390
  389. package/node_modules/@sdd-agent-platform/core/src/router/profile-resolution.ts +154 -154
  390. package/node_modules/@sdd-agent-platform/core/src/router/risk-policy.ts +33 -33
  391. package/node_modules/@sdd-agent-platform/core/src/router/route-cache.ts +100 -100
  392. package/node_modules/@sdd-agent-platform/core/src/router/route-projection.ts +356 -356
  393. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.test.ts +428 -665
  394. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.ts +2 -2
  395. package/node_modules/@sdd-agent-platform/core/src/router/routing-rules.ts +73 -73
  396. package/node_modules/@sdd-agent-platform/core/src/router/routing.ts +189 -223
  397. package/node_modules/@sdd-agent-platform/core/src/router/runtime-import.ts +464 -453
  398. package/node_modules/@sdd-agent-platform/core/src/router/runtime-inspection.ts +124 -124
  399. package/node_modules/@sdd-agent-platform/core/src/router/runtime-registry.ts +123 -123
  400. package/node_modules/@sdd-agent-platform/core/src/router/runtime-validation.ts +277 -277
  401. package/node_modules/@sdd-agent-platform/core/src/router/stage-route-binding.ts +273 -279
  402. package/node_modules/@sdd-agent-platform/core/src/router/team-mode.ts +170 -170
  403. package/node_modules/@sdd-agent-platform/core/src/router.ts +5 -6
  404. package/node_modules/@sdd-agent-platform/core/src/run-state/artifacts.ts +126 -240
  405. package/node_modules/@sdd-agent-platform/core/src/run-state/events.ts +27 -27
  406. package/node_modules/@sdd-agent-platform/core/src/run-state/inspect-run.ts +172 -172
  407. package/node_modules/@sdd-agent-platform/core/src/run-state/invocation-ledger.ts +109 -109
  408. package/node_modules/@sdd-agent-platform/core/src/run-state/model.ts +252 -253
  409. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.test.ts +80 -52
  410. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.ts +301 -352
  411. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.test.ts +70 -118
  412. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.ts +406 -416
  413. package/node_modules/@sdd-agent-platform/core/src/run-state/task-evidence.ts +198 -252
  414. package/node_modules/@sdd-agent-platform/core/src/run-state/timing.ts +146 -146
  415. package/node_modules/@sdd-agent-platform/core/src/run-state.ts +8 -9
  416. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/build.ts +60 -60
  417. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/findings.ts +249 -256
  418. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/model.ts +139 -140
  419. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.test.ts +65 -66
  420. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.ts +2 -2
  421. package/node_modules/@sdd-agent-platform/core/src/runtime-paths.ts +249 -253
  422. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.test.ts +101 -96
  423. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.ts +314 -292
  424. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.test.ts +380 -0
  425. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.ts +207 -0
  426. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/context.ts +111 -111
  427. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/document-hashes.ts +207 -306
  428. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/run-binding.ts +95 -97
  429. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-inspection.ts +39 -39
  430. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.test.ts +467 -523
  431. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.ts +738 -709
  432. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-rendering.ts +81 -81
  433. package/node_modules/@sdd-agent-platform/core/src/sdd-docs.ts +5 -5
  434. package/node_modules/@sdd-agent-platform/core/src/spec-manager-contracts.ts +13 -0
  435. package/node_modules/@sdd-agent-platform/core/src/stage-artifacts.ts +435 -450
  436. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration-contracts.ts +316 -322
  437. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.test.ts +2963 -2902
  438. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.ts +5856 -5831
  439. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/contracts.ts +40 -40
  440. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.test.ts +209 -209
  441. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.ts +360 -360
  442. package/node_modules/@sdd-agent-platform/core/src/stage-runtime.ts +2 -2
  443. package/node_modules/@sdd-agent-platform/core/src/status/project-status.test.ts +288 -511
  444. package/node_modules/@sdd-agent-platform/core/src/status/project-status.ts +651 -851
  445. package/node_modules/@sdd-agent-platform/core/src/status.ts +2 -2
  446. package/node_modules/@sdd-agent-platform/core/src/storage/json-io.ts +10 -10
  447. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.test.ts +489 -681
  448. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.ts +1981 -1981
  449. package/node_modules/@sdd-agent-platform/core/src/subagents/contracts.ts +45 -45
  450. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.test.ts +232 -232
  451. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.ts +307 -307
  452. package/node_modules/@sdd-agent-platform/core/src/subagents.ts +2 -2
  453. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.test.ts +141 -0
  454. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.ts +566 -0
  455. package/node_modules/@sdd-agent-platform/core/src/task-risk-profile.ts +193 -193
  456. package/node_modules/@sdd-agent-platform/core/src/test-support/fixtures.ts +413 -398
  457. package/node_modules/@sdd-agent-platform/core/src/test-support/run-state.ts +102 -56
  458. package/node_modules/@sdd-agent-platform/core/src/test-support.ts +2 -2
  459. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.test.ts +72 -72
  460. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.ts +9 -12
  461. package/node_modules/@sdd-agent-platform/core/src/verification/rendering.ts +137 -137
  462. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.test.ts +77 -84
  463. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.ts +77 -77
  464. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.ts +455 -506
  465. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.test.ts → task-evidence-judgment.test.ts} +261 -261
  466. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.ts → task-evidence-judgment.ts} +619 -619
  467. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.ts +1190 -1190
  468. package/node_modules/@sdd-agent-platform/core/src/verification/validation-cache.ts +106 -106
  469. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.ts +513 -556
  470. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.ts +334 -334
  471. package/node_modules/@sdd-agent-platform/core/src/verification.ts +8 -8
  472. package/node_modules/@sdd-agent-platform/core/src/work-units/contracts.ts +26 -26
  473. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.test.ts +88 -88
  474. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.ts +112 -112
  475. package/node_modules/@sdd-agent-platform/core/src/work-units.ts +2 -2
  476. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/evidence-packet.ts +190 -425
  477. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.test.ts +169 -507
  478. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.ts +136 -182
  479. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.test.ts +135 -174
  480. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.ts +153 -194
  481. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/types.ts +111 -115
  482. package/node_modules/@sdd-agent-platform/core/src/workflow-state/affected-file-conflicts.ts +95 -93
  483. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.test.ts +32 -32
  484. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.ts +114 -114
  485. package/node_modules/@sdd-agent-platform/core/src/workflow-state/latest-eligible-run.ts +184 -224
  486. package/node_modules/@sdd-agent-platform/core/src/workflow-state/migration-recovery.ts +158 -158
  487. package/node_modules/@sdd-agent-platform/core/src/workflow-state/repair-contract.ts +77 -77
  488. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve-task-run.ts +114 -114
  489. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.test.ts +969 -956
  490. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.ts +967 -992
  491. package/node_modules/@sdd-agent-platform/core/src/workflow-state/runtime-projections.ts +712 -712
  492. package/node_modules/@sdd-agent-platform/core/src/workflow-state.ts +2 -2
  493. package/node_modules/@sdd-agent-platform/core/src/worktree/isolation.ts +130 -130
  494. package/node_modules/@sdd-agent-platform/core/src/worktree/lifecycle.ts +269 -269
  495. package/node_modules/@sdd-agent-platform/core/src/worktree/worktree.test.ts +150 -150
  496. package/node_modules/@sdd-agent-platform/core/src/worktree.ts +2 -2
  497. package/node_modules/@sdd-agent-platform/core/tsconfig.json +15 -15
  498. package/package.json +2 -2
  499. package/packages/cli/dist/args.js +2 -2
  500. package/packages/cli/dist/args.js.map +1 -1
  501. package/packages/cli/dist/commands/ai-tools.js +2 -13
  502. package/packages/cli/dist/commands/ai-tools.js.map +1 -1
  503. package/packages/cli/dist/commands/{verifies.d.ts → artifact.d.ts} +1 -1
  504. package/packages/cli/dist/commands/artifact.js +168 -0
  505. package/packages/cli/dist/commands/artifact.js.map +1 -0
  506. package/packages/cli/dist/commands/context.js +1 -1
  507. package/packages/cli/dist/commands/context.js.map +1 -1
  508. package/packages/cli/dist/commands/evidence.js.map +1 -0
  509. package/packages/cli/dist/commands/execution.js +127 -49
  510. package/packages/cli/dist/commands/execution.js.map +1 -1
  511. package/packages/cli/dist/commands/governance.js +1 -1
  512. package/packages/cli/dist/commands/governance.js.map +1 -1
  513. package/packages/cli/dist/commands/init.js +1 -6
  514. package/packages/cli/dist/commands/init.js.map +1 -1
  515. package/packages/cli/dist/commands/instructions.d.ts +1 -1
  516. package/packages/cli/dist/commands/instructions.js +15 -1
  517. package/packages/cli/dist/commands/instructions.js.map +1 -1
  518. package/packages/cli/dist/commands/registry/runtime.js +63 -40
  519. package/packages/cli/dist/commands/registry/runtime.js.map +1 -1
  520. package/packages/cli/dist/commands/run.js +13 -52
  521. package/packages/cli/dist/commands/run.js.map +1 -1
  522. package/packages/cli/dist/commands/stage-close.d.ts +60 -0
  523. package/packages/cli/dist/commands/stage-close.js +270 -41
  524. package/packages/cli/dist/commands/stage-close.js.map +1 -1
  525. package/packages/cli/dist/commands/status.js +9 -68
  526. package/packages/cli/dist/commands/status.js.map +1 -1
  527. package/packages/cli/dist/commands/tasks.js.map +1 -1
  528. package/packages/cli/dist/dispatch.js +6 -26
  529. package/packages/cli/dist/dispatch.js.map +1 -1
  530. package/packages/cli/dist/help.js +153 -159
  531. package/packages/cli/dist/help.js.map +1 -1
  532. package/packages/cli/dist/renderers/artifacts.d.ts +5 -0
  533. package/packages/cli/dist/renderers/artifacts.js +43 -0
  534. package/packages/cli/dist/renderers/artifacts.js.map +1 -0
  535. package/packages/cli/dist/renderers/doctor.js +1 -2
  536. package/packages/cli/dist/renderers/doctor.js.map +1 -1
  537. package/packages/cli/dist/renderers/execution.js +1 -1
  538. package/packages/cli/dist/renderers/execution.js.map +1 -1
  539. package/packages/cli/dist/renderers/json.d.ts +0 -1
  540. package/packages/cli/dist/renderers/json.js +0 -3
  541. package/packages/cli/dist/renderers/json.js.map +1 -1
  542. package/packages/cli/dist/renderers/registry-runtime.d.ts +1 -2
  543. package/packages/cli/dist/renderers/registry-runtime.js +0 -20
  544. package/packages/cli/dist/renderers/registry-runtime.js.map +1 -1
  545. package/packages/cli/dist/renderers/router.js +1 -1
  546. package/packages/cli/dist/renderers/router.js.map +1 -1
  547. package/packages/cli/dist/renderers/workflow.d.ts +53 -0
  548. package/packages/cli/dist/renderers/workflow.js +93 -34
  549. package/packages/cli/dist/renderers/workflow.js.map +1 -1
  550. package/packages/cli/dist/tsconfig.tsbuildinfo +1 -1
  551. package/packages/cli/package.json +2 -2
  552. package/packages/core/dist/ai-tools.js +56 -73
  553. package/packages/core/dist/ai-tools.js.map +1 -1
  554. package/packages/core/dist/artifacts/ingestion.js +9 -64
  555. package/packages/core/dist/artifacts/ingestion.js.map +1 -1
  556. package/packages/core/dist/artifacts/sdd-evidence.js +1 -1
  557. package/packages/core/dist/artifacts/sdd-evidence.js.map +1 -1
  558. package/packages/core/dist/artifacts/sdd-result.js +17 -26
  559. package/packages/core/dist/artifacts/sdd-result.js.map +1 -1
  560. package/packages/core/dist/config/init-project.d.ts +8 -7
  561. package/packages/core/dist/config/init-project.js +8 -12
  562. package/packages/core/dist/config/init-project.js.map +1 -1
  563. package/packages/core/dist/config/project-config.d.ts +1 -1
  564. package/packages/core/dist/config/project-config.js +1 -1
  565. package/packages/core/dist/config/project-config.js.map +1 -1
  566. package/packages/core/dist/config/starter-documents.d.ts +3 -4
  567. package/packages/core/dist/config/starter-documents.js +377 -411
  568. package/packages/core/dist/config/starter-documents.js.map +1 -1
  569. package/packages/core/dist/context/build-package.d.ts +1 -1
  570. package/packages/core/dist/context/build-package.js +18 -25
  571. package/packages/core/dist/context/build-package.js.map +1 -1
  572. package/packages/core/dist/context/evidence-summary.js +8 -26
  573. package/packages/core/dist/context/evidence-summary.js.map +1 -1
  574. package/packages/core/dist/context/log-worker.js +2 -2
  575. package/packages/core/dist/context/log-worker.js.map +1 -1
  576. package/packages/core/dist/context-offload/contracts.d.ts +1 -1
  577. package/packages/core/dist/contracts.d.ts +6 -1
  578. package/packages/core/dist/contracts.js +5 -0
  579. package/packages/core/dist/contracts.js.map +1 -1
  580. package/packages/core/dist/delegation/model.d.ts +0 -3
  581. package/packages/core/dist/delegation/validation.d.ts +0 -3
  582. package/packages/core/dist/delegation/validation.js +4 -7
  583. package/packages/core/dist/delegation/validation.js.map +1 -1
  584. package/packages/core/dist/doctor/checks/document-chain.js +3 -13
  585. package/packages/core/dist/doctor/checks/document-chain.js.map +1 -1
  586. package/packages/core/dist/doctor/checks/local-run-index.js +1 -9
  587. package/packages/core/dist/doctor/checks/local-run-index.js.map +1 -1
  588. package/packages/core/dist/doctor/checks/project.js +9 -9
  589. package/packages/core/dist/doctor/checks/project.js.map +1 -1
  590. package/packages/core/dist/doctor/checks/registries.js +1 -0
  591. package/packages/core/dist/doctor/checks/registries.js.map +1 -1
  592. package/packages/core/dist/doctor/checks/run-evidence.js +4 -4
  593. package/packages/core/dist/doctor/checks/run-evidence.js.map +1 -1
  594. package/packages/core/dist/doctor/checks/run-trust.js +24 -0
  595. package/packages/core/dist/doctor/checks/run-trust.js.map +1 -1
  596. package/packages/core/dist/doctor/checks/runtime-contracts.js +2 -2
  597. package/packages/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  598. package/packages/core/dist/doctor/doctor.js +43 -180
  599. package/packages/core/dist/doctor/doctor.js.map +1 -1
  600. package/packages/core/dist/evidence/lookup.d.ts +1 -1
  601. package/packages/core/dist/evidence/lookup.js +7 -14
  602. package/packages/core/dist/evidence/lookup.js.map +1 -1
  603. package/packages/core/dist/evidence-runtime/coordination.js +110 -0
  604. package/packages/core/dist/evidence-runtime/coordination.js.map +1 -0
  605. package/packages/core/dist/execution/background-executor.js +4 -4
  606. package/packages/core/dist/execution/background-executor.js.map +1 -1
  607. package/packages/core/dist/execution/foreground-subagents.js +3 -3
  608. package/packages/core/dist/execution/foreground-subagents.js.map +1 -1
  609. package/packages/core/dist/execution/host-invocation.js +85 -86
  610. package/packages/core/dist/execution/host-invocation.js.map +1 -1
  611. package/packages/core/dist/execution/resident-worker.js +2 -3
  612. package/packages/core/dist/execution/resident-worker.js.map +1 -1
  613. package/packages/core/dist/execution/stage-team-runtime.js +2 -2
  614. package/packages/core/dist/execution/stage-team-runtime.js.map +1 -1
  615. package/packages/core/dist/governance/policy.d.ts +1 -1
  616. package/packages/core/dist/governance/policy.js +1 -1
  617. package/packages/core/dist/governance/policy.js.map +1 -1
  618. package/packages/core/dist/instructions.d.ts +1 -1
  619. package/packages/core/dist/instructions.js +31 -67
  620. package/packages/core/dist/instructions.js.map +1 -1
  621. package/packages/core/dist/lifecycle/decision-gate.js +1 -1
  622. package/packages/core/dist/lifecycle/decision-gate.js.map +1 -1
  623. package/packages/core/dist/lifecycle/ship.d.ts +0 -1
  624. package/packages/core/dist/lifecycle/ship.js +59 -85
  625. package/packages/core/dist/lifecycle/ship.js.map +1 -1
  626. package/packages/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  627. package/packages/core/dist/lifecycle-graph/contracts.js +7 -0
  628. package/packages/core/dist/lifecycle-graph/contracts.js.map +1 -0
  629. package/packages/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  630. package/packages/core/dist/lifecycle-graph/kernel.js +461 -0
  631. package/packages/core/dist/lifecycle-graph/kernel.js.map +1 -0
  632. package/packages/core/dist/lifecycle-graph.d.ts +2 -0
  633. package/packages/core/dist/lifecycle-graph.js +3 -0
  634. package/packages/core/dist/lifecycle-graph.js.map +1 -0
  635. package/packages/core/dist/orchestration/contracts.d.ts +1 -1
  636. package/packages/core/dist/orchestration/runtime.d.ts +2 -12
  637. package/packages/core/dist/orchestration/runtime.js +32 -80
  638. package/packages/core/dist/orchestration/runtime.js.map +1 -1
  639. package/packages/core/dist/registries/agent-capability-catalog.d.ts +2 -5
  640. package/packages/core/dist/registries/agent-capability-catalog.js +27 -69
  641. package/packages/core/dist/registries/agent-capability-catalog.js.map +1 -1
  642. package/packages/core/dist/registries/agent-registry.js +118 -34
  643. package/packages/core/dist/registries/agent-registry.js.map +1 -1
  644. package/packages/core/dist/registries/agent-runtime-static.js +1 -1
  645. package/packages/core/dist/registries/agent-runtime-static.js.map +1 -1
  646. package/packages/core/dist/registries/capability-sources.js +1 -1
  647. package/packages/core/dist/registries/command-team-runtime.d.ts +1 -1
  648. package/packages/core/dist/registries/command-team-runtime.js +8 -15
  649. package/packages/core/dist/registries/command-team-runtime.js.map +1 -1
  650. package/packages/core/dist/registries/eval-learning-context.js +4 -4
  651. package/packages/core/dist/registries/eval-learning-context.js.map +1 -1
  652. package/packages/core/dist/registries/plan-scout-domains.d.ts +13 -0
  653. package/packages/core/dist/registries/plan-scout-domains.js +76 -0
  654. package/packages/core/dist/registries/plan-scout-domains.js.map +1 -0
  655. package/packages/core/dist/registries/query-status.js +2 -2
  656. package/packages/core/dist/registries/query-status.js.map +1 -1
  657. package/packages/core/dist/registries/skill-capabilities.js +7 -7
  658. package/packages/core/dist/registries/skill-capabilities.js.map +1 -1
  659. package/packages/core/dist/registries/tool-capabilities.js +4 -4
  660. package/packages/core/dist/registries/tool-capabilities.js.map +1 -1
  661. package/packages/core/dist/registries/tool-plugins.js +2 -2
  662. package/packages/core/dist/registries/tool-plugins.js.map +1 -1
  663. package/packages/core/dist/registries/worker-adapters.js +11 -11
  664. package/packages/core/dist/registries/worker-adapters.js.map +1 -1
  665. package/packages/core/dist/registries/workflow-gates.d.ts +1 -1
  666. package/packages/core/dist/registries/workflow-gates.js +21 -21
  667. package/packages/core/dist/registries/workflow-gates.js.map +1 -1
  668. package/packages/core/dist/risk/consumer-diagnostics.js +2 -1
  669. package/packages/core/dist/risk/consumer-diagnostics.js.map +1 -1
  670. package/packages/core/dist/risk/kernel.js +6 -6
  671. package/packages/core/dist/risk/kernel.js.map +1 -1
  672. package/packages/core/dist/risk/legacy-adapters.js +11 -23
  673. package/packages/core/dist/risk/legacy-adapters.js.map +1 -1
  674. package/packages/core/dist/risk/workflow-gates.d.ts +2 -2
  675. package/packages/core/dist/risk/workflow-gates.js +18 -20
  676. package/packages/core/dist/risk/workflow-gates.js.map +1 -1
  677. package/packages/core/dist/router/agent-runtime.d.ts +0 -2
  678. package/packages/core/dist/router/route-projection.js +1 -1
  679. package/packages/core/dist/router/route-projection.js.map +1 -1
  680. package/packages/core/dist/router/routing.js +16 -48
  681. package/packages/core/dist/router/routing.js.map +1 -1
  682. package/packages/core/dist/router/runtime-import.js +11 -1
  683. package/packages/core/dist/router/runtime-import.js.map +1 -1
  684. package/packages/core/dist/router/runtime-validation.js +2 -2
  685. package/packages/core/dist/router/runtime-validation.js.map +1 -1
  686. package/packages/core/dist/router/stage-route-binding.d.ts +2 -2
  687. package/packages/core/dist/router/stage-route-binding.js +20 -28
  688. package/packages/core/dist/router/stage-route-binding.js.map +1 -1
  689. package/packages/core/dist/router.d.ts +0 -1
  690. package/packages/core/dist/router.js +0 -1
  691. package/packages/core/dist/router.js.map +1 -1
  692. package/packages/core/dist/run-state/artifacts.d.ts +6 -6
  693. package/packages/core/dist/run-state/artifacts.js +13 -124
  694. package/packages/core/dist/run-state/artifacts.js.map +1 -1
  695. package/packages/core/dist/run-state/inspect-run.d.ts +2 -0
  696. package/packages/core/dist/run-state/inspect-run.js +5 -7
  697. package/packages/core/dist/run-state/inspect-run.js.map +1 -1
  698. package/packages/core/dist/run-state/model.d.ts +28 -28
  699. package/packages/core/dist/run-state/run-index.d.ts +3 -2
  700. package/packages/core/dist/run-state/run-index.js +15 -66
  701. package/packages/core/dist/run-state/run-index.js.map +1 -1
  702. package/packages/core/dist/run-state/run-state.js +26 -36
  703. package/packages/core/dist/run-state/run-state.js.map +1 -1
  704. package/packages/core/dist/run-state/task-evidence.d.ts +0 -4
  705. package/packages/core/dist/run-state/task-evidence.js +5 -51
  706. package/packages/core/dist/run-state/task-evidence.js.map +1 -1
  707. package/packages/core/dist/run-state.d.ts +0 -1
  708. package/packages/core/dist/run-state.js +0 -1
  709. package/packages/core/dist/run-state.js.map +1 -1
  710. package/packages/core/dist/runtime-analysis/build.js +1 -1
  711. package/packages/core/dist/runtime-analysis/build.js.map +1 -1
  712. package/packages/core/dist/runtime-analysis/findings.js +7 -16
  713. package/packages/core/dist/runtime-analysis/findings.js.map +1 -1
  714. package/packages/core/dist/runtime-analysis/model.d.ts +1 -2
  715. package/packages/core/dist/runtime-paths.d.ts +0 -1
  716. package/packages/core/dist/runtime-paths.js +1 -4
  717. package/packages/core/dist/runtime-paths.js.map +1 -1
  718. package/packages/core/dist/runtime-projection-p0.d.ts +2 -2
  719. package/packages/core/dist/runtime-projection-p0.js +11 -0
  720. package/packages/core/dist/runtime-projection-p0.js.map +1 -1
  721. package/packages/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  722. package/packages/core/dist/sdd-docs/artifact-depth.js +179 -0
  723. package/packages/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  724. package/packages/core/dist/sdd-docs/document-hashes.d.ts +0 -2
  725. package/packages/core/dist/sdd-docs/document-hashes.js +10 -97
  726. package/packages/core/dist/sdd-docs/document-hashes.js.map +1 -1
  727. package/packages/core/dist/sdd-docs/run-binding.d.ts +1 -1
  728. package/packages/core/dist/sdd-docs/run-binding.js +6 -8
  729. package/packages/core/dist/sdd-docs/run-binding.js.map +1 -1
  730. package/packages/core/dist/sdd-docs/task-parser.d.ts +5 -2
  731. package/packages/core/dist/sdd-docs/task-parser.js +85 -68
  732. package/packages/core/dist/sdd-docs/task-parser.js.map +1 -1
  733. package/packages/core/dist/sdd-docs/task-rendering.js +2 -2
  734. package/packages/core/dist/sdd-docs/task-rendering.js.map +1 -1
  735. package/packages/core/dist/spec-entry.js +40 -0
  736. package/packages/core/dist/spec-entry.js.map +1 -0
  737. package/packages/core/dist/spec-manager-contracts.d.ts +12 -0
  738. package/packages/core/dist/spec-manager-contracts.js +2 -0
  739. package/packages/core/dist/spec-manager-contracts.js.map +1 -0
  740. package/packages/core/dist/stage-artifacts.d.ts +2 -2
  741. package/packages/core/dist/stage-artifacts.js +19 -26
  742. package/packages/core/dist/stage-artifacts.js.map +1 -1
  743. package/packages/core/dist/stage-collaboration-contracts.d.ts +1 -1
  744. package/packages/core/dist/stage-collaboration-contracts.js +3 -6
  745. package/packages/core/dist/stage-collaboration-contracts.js.map +1 -1
  746. package/packages/core/dist/stage-collaboration.d.ts +111 -263
  747. package/packages/core/dist/stage-collaboration.js +1272 -1124
  748. package/packages/core/dist/stage-collaboration.js.map +1 -1
  749. package/packages/core/dist/stage-runtime/runtime.js +5 -5
  750. package/packages/core/dist/stage-runtime/runtime.js.map +1 -1
  751. package/packages/core/dist/status/project-status.d.ts +1 -44
  752. package/packages/core/dist/status/project-status.js +47 -170
  753. package/packages/core/dist/status/project-status.js.map +1 -1
  754. package/packages/core/dist/storage/runtime-store.js +73 -73
  755. package/packages/core/dist/subagents/contracts.d.ts +1 -1
  756. package/packages/core/dist/subagents/runtime.js +7 -7
  757. package/packages/core/dist/subagents/runtime.js.map +1 -1
  758. package/packages/core/dist/sync-back/apply.d.ts +1 -0
  759. package/packages/core/dist/sync-back/apply.js +2 -0
  760. package/packages/core/dist/sync-back/apply.js.map +1 -0
  761. package/packages/core/dist/sync-back/inspect.d.ts +1 -0
  762. package/packages/core/dist/sync-back/inspect.js +2 -0
  763. package/packages/core/dist/sync-back/inspect.js.map +1 -0
  764. package/packages/core/dist/sync-back.d.ts +1 -0
  765. package/packages/core/dist/sync-back.js +2 -0
  766. package/packages/core/dist/sync-back.js.map +1 -0
  767. package/packages/core/dist/task-execution-contract.d.ts +167 -0
  768. package/packages/core/dist/task-execution-contract.js +377 -0
  769. package/packages/core/dist/task-execution-contract.js.map +1 -0
  770. package/packages/core/dist/test-support/fixtures.js +329 -314
  771. package/packages/core/dist/test-support/fixtures.js.map +1 -1
  772. package/packages/core/dist/test-support/run-state.d.ts +1 -0
  773. package/packages/core/dist/test-support/run-state.js +53 -7
  774. package/packages/core/dist/test-support/run-state.js.map +1 -1
  775. package/packages/core/dist/truth-reconciliation.js +9 -12
  776. package/packages/core/dist/truth-reconciliation.js.map +1 -1
  777. package/packages/core/dist/tsconfig.tsbuildinfo +1 -1
  778. package/packages/core/dist/verification/goal-verify.d.ts +0 -48
  779. package/packages/core/dist/verification/goal-verify.js +1 -520
  780. package/packages/core/dist/verification/goal-verify.js.map +1 -1
  781. package/packages/core/dist/verification/rendering.d.ts +5 -5
  782. package/packages/core/dist/verification/rendering.js +14 -14
  783. package/packages/core/dist/verification/rendering.js.map +1 -1
  784. package/packages/core/dist/verification/single-task-loop.d.ts +1 -0
  785. package/packages/core/dist/verification/single-task-loop.js +111 -159
  786. package/packages/core/dist/verification/single-task-loop.js.map +1 -1
  787. package/packages/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  788. package/packages/core/dist/verification/task-evidence-judgment.js +521 -0
  789. package/packages/core/dist/verification/task-evidence-judgment.js.map +1 -0
  790. package/packages/core/dist/verification/test-runtime.js +21 -21
  791. package/packages/core/dist/verification/test-runtime.js.map +1 -1
  792. package/packages/core/dist/verification/validation-wave.d.ts +0 -18
  793. package/packages/core/dist/verification/validation-wave.js +5 -27
  794. package/packages/core/dist/verification/validation-wave.js.map +1 -1
  795. package/packages/core/dist/verification/verify-contract.js +45 -45
  796. package/packages/core/dist/verification/verify-contract.js.map +1 -1
  797. package/packages/core/dist/verification.d.ts +3 -3
  798. package/packages/core/dist/verification.js +2 -2
  799. package/packages/core/dist/verification.js.map +1 -1
  800. package/packages/core/dist/work-units/contracts.d.ts +1 -1
  801. package/packages/core/dist/workflow-gate/evidence-packet.js +9 -227
  802. package/packages/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  803. package/packages/core/dist/workflow-gate/hard-checks.js +9 -50
  804. package/packages/core/dist/workflow-gate/hard-checks.js.map +1 -1
  805. package/packages/core/dist/workflow-gate/policy.js +4 -42
  806. package/packages/core/dist/workflow-gate/policy.js.map +1 -1
  807. package/packages/core/dist/workflow-gate/types.d.ts +2 -3
  808. package/packages/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -0
  809. package/packages/core/dist/workflow-state/affected-file-conflicts.js +2 -1
  810. package/packages/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  811. package/packages/core/dist/workflow-state/dependencies.js +1 -1
  812. package/packages/core/dist/workflow-state/latest-eligible-run.d.ts +1 -0
  813. package/packages/core/dist/workflow-state/latest-eligible-run.js +23 -63
  814. package/packages/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  815. package/packages/core/dist/workflow-state/resolve.d.ts +2 -2
  816. package/packages/core/dist/workflow-state/resolve.js +43 -65
  817. package/packages/core/dist/workflow-state/resolve.js.map +1 -1
  818. package/packages/core/package.json +5 -2
  819. package/tsconfig.build.json +6 -7
  820. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.test.ts +0 -269
  821. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.test.ts +0 -492
  822. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.test.ts +0 -383
  823. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.test.ts +0 -188
  824. package/packages/cli/dist/commands/lifecycle.d.ts +0 -6
  825. package/packages/cli/dist/commands/lifecycle.js +0 -125
  826. package/packages/cli/dist/commands/lifecycle.js.map +0 -1
  827. package/packages/cli/dist/commands/test.d.ts +0 -6
  828. package/packages/cli/dist/commands/test.js +0 -373
  829. package/packages/cli/dist/commands/test.js.map +0 -1
  830. package/packages/cli/dist/commands/verifies.js +0 -87
  831. package/packages/cli/dist/commands/verifies.js.map +0 -1
  832. package/packages/cli/dist/commands/verify.d.ts +0 -6
  833. package/packages/cli/dist/commands/verify.js +0 -330
  834. 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
  }