sdd-agent-platform 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (698) hide show
  1. package/README.md +24 -28
  2. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js +84 -103
  3. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js.map +1 -1
  4. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.d.ts +10 -6
  5. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js +7 -8
  6. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js.map +1 -1
  7. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.d.ts +3 -1
  8. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js +7 -3
  9. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js.map +1 -1
  10. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.d.ts +0 -1
  11. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js +374 -421
  12. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js.map +1 -1
  13. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.d.ts +1 -1
  14. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js +7 -19
  15. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js.map +1 -1
  16. package/node_modules/@sdd-agent-platform/core/dist/contracts.d.ts +7 -1
  17. package/node_modules/@sdd-agent-platform/core/dist/contracts.js +6 -0
  18. package/node_modules/@sdd-agent-platform/core/dist/contracts.js.map +1 -1
  19. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js +2 -12
  20. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js.map +1 -1
  21. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js +1 -18
  22. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js.map +1 -1
  23. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.d.ts +1 -1
  24. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js +1 -1
  25. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js.map +1 -1
  26. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/contracts.d.ts +0 -1
  27. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js +110 -0
  28. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js.map +1 -0
  29. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js +83 -83
  30. package/node_modules/@sdd-agent-platform/core/dist/instructions.d.ts +1 -1
  31. package/node_modules/@sdd-agent-platform/core/dist/instructions.js +37 -80
  32. package/node_modules/@sdd-agent-platform/core/dist/instructions.js.map +1 -1
  33. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js +58 -68
  34. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js.map +1 -1
  35. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  36. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js +7 -0
  37. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js.map +1 -0
  38. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  39. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js +461 -0
  40. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js.map +1 -0
  41. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.d.ts +2 -0
  42. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js +3 -0
  43. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js.map +1 -0
  44. package/node_modules/@sdd-agent-platform/core/dist/orchestration/contracts.d.ts +1 -1
  45. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js +21 -28
  46. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js.map +1 -1
  47. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js +124 -40
  48. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js.map +1 -1
  49. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.d.ts +1 -1
  50. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js +6 -13
  51. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js.map +1 -1
  52. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.d.ts +13 -0
  53. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js +76 -0
  54. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js.map +1 -0
  55. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js +7 -7
  56. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js.map +1 -1
  57. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js +6 -6
  58. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js.map +1 -1
  59. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.d.ts +1 -1
  60. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js +18 -18
  61. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js.map +1 -1
  62. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js +2 -1
  63. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js.map +1 -1
  64. package/node_modules/@sdd-agent-platform/core/dist/risk/contracts.d.ts +2 -2
  65. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js +7 -7
  66. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js.map +1 -1
  67. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js +12 -27
  68. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js.map +1 -1
  69. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js +6 -6
  70. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js.map +1 -1
  71. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime-config.js +1 -1
  72. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime-config.js.map +1 -1
  73. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js +2 -4
  74. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js.map +1 -1
  75. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.d.ts +28 -0
  76. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js +383 -0
  77. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js.map +1 -0
  78. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.d.ts +37 -0
  79. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js +227 -0
  80. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js.map +1 -0
  81. package/node_modules/@sdd-agent-platform/core/dist/router.d.ts +1 -0
  82. package/node_modules/@sdd-agent-platform/core/dist/router.js +1 -0
  83. package/node_modules/@sdd-agent-platform/core/dist/router.js.map +1 -1
  84. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.d.ts +16 -0
  85. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js +6 -0
  86. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js.map +1 -1
  87. package/node_modules/@sdd-agent-platform/core/dist/run-state/model.d.ts +20 -0
  88. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js +7 -7
  89. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js.map +1 -1
  90. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.d.ts +1 -2
  91. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js +2 -9
  92. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js.map +1 -1
  93. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.d.ts +8 -0
  94. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.js +131 -0
  95. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.js.map +1 -0
  96. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js +1 -4
  97. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js.map +1 -1
  98. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js +0 -39
  99. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js.map +1 -1
  100. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/model.d.ts +1 -17
  101. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.d.ts +10 -0
  102. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js +65 -0
  103. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js.map +1 -1
  104. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.d.ts +64 -0
  105. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js +211 -0
  106. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js.map +1 -0
  107. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  108. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js +179 -0
  109. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  110. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.d.ts +5 -1
  111. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js +60 -22
  112. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js.map +1 -1
  113. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js +2 -2
  114. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js.map +1 -1
  115. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js +40 -0
  116. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js.map +1 -0
  117. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.d.ts +12 -0
  118. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js +2 -0
  119. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js.map +1 -0
  120. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.d.ts +55 -0
  121. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js +315 -0
  122. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js.map +1 -0
  123. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.d.ts +55 -0
  124. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js +238 -0
  125. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js.map +1 -0
  126. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.d.ts +736 -0
  127. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js +4018 -0
  128. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js.map +1 -0
  129. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js +8 -1
  130. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js.map +1 -1
  131. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js +25 -1
  132. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js.map +1 -1
  133. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.d.ts +170 -18
  134. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js +597 -85
  135. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js.map +1 -1
  136. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.d.ts +1 -17
  137. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js +1 -242
  138. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js.map +1 -1
  139. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.d.ts +1 -110
  140. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js +1 -496
  141. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js.map +1 -1
  142. package/node_modules/@sdd-agent-platform/core/dist/sync-back.d.ts +1 -2
  143. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js +1 -2
  144. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js.map +1 -1
  145. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.d.ts +167 -0
  146. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js +377 -0
  147. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js.map +1 -0
  148. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js +329 -314
  149. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js.map +1 -1
  150. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.d.ts +1 -0
  151. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js +31 -0
  152. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js.map +1 -1
  153. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.d.ts +44 -0
  154. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js +135 -0
  155. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js.map +1 -0
  156. package/node_modules/@sdd-agent-platform/core/dist/tsconfig.tsbuildinfo +1 -1
  157. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.d.ts +0 -49
  158. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js +1 -545
  159. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js.map +1 -1
  160. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.d.ts +5 -7
  161. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js +15 -55
  162. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js.map +1 -1
  163. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js +1 -40
  164. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js.map +1 -1
  165. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  166. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js +521 -0
  167. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js.map +1 -0
  168. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.d.ts +12 -2
  169. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js +247 -112
  170. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js.map +1 -1
  171. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.d.ts +26 -0
  172. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.js +73 -0
  173. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.js.map +1 -0
  174. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.d.ts +1 -1
  175. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js +49 -72
  176. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js.map +1 -1
  177. package/node_modules/@sdd-agent-platform/core/dist/verification.d.ts +3 -3
  178. package/node_modules/@sdd-agent-platform/core/dist/verification.js +2 -2
  179. package/node_modules/@sdd-agent-platform/core/dist/verification.js.map +1 -1
  180. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js +2 -7
  181. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  182. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js +0 -7
  183. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js.map +1 -1
  184. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js +2 -4
  185. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js.map +1 -1
  186. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.d.ts +3 -5
  187. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js +30 -4
  188. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  189. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.d.ts +40 -0
  190. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.js +110 -0
  191. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.js.map +1 -0
  192. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.d.ts +12 -0
  193. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.js +63 -0
  194. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.js.map +1 -0
  195. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.d.ts +21 -0
  196. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.js +95 -0
  197. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.js.map +1 -0
  198. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.d.ts +55 -5
  199. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js +518 -36
  200. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js.map +1 -1
  201. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.d.ts +228 -0
  202. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.js +452 -0
  203. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.js.map +1 -0
  204. package/node_modules/@sdd-agent-platform/core/package.json +6 -3
  205. package/node_modules/@sdd-agent-platform/core/src/ai-tools.test.ts +238 -137
  206. package/node_modules/@sdd-agent-platform/core/src/ai-tools.ts +84 -103
  207. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.test.ts +189 -189
  208. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.ts +222 -222
  209. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.test.ts +28 -28
  210. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.ts +302 -302
  211. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.test.ts +181 -181
  212. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.ts +231 -231
  213. package/node_modules/@sdd-agent-platform/core/src/artifacts/templates.ts +99 -99
  214. package/node_modules/@sdd-agent-platform/core/src/artifacts.ts +4 -4
  215. package/node_modules/@sdd-agent-platform/core/src/coding-facts/contracts.ts +79 -79
  216. package/node_modules/@sdd-agent-platform/core/src/coding-facts.ts +1 -1
  217. package/node_modules/@sdd-agent-platform/core/src/config/init-project.test.ts +314 -306
  218. package/node_modules/@sdd-agent-platform/core/src/config/init-project.ts +128 -120
  219. package/node_modules/@sdd-agent-platform/core/src/config/project-config.ts +265 -259
  220. package/node_modules/@sdd-agent-platform/core/src/config/project-detection.ts +147 -147
  221. package/node_modules/@sdd-agent-platform/core/src/config/starter-documents.ts +400 -445
  222. package/node_modules/@sdd-agent-platform/core/src/context/budget.ts +30 -30
  223. package/node_modules/@sdd-agent-platform/core/src/context/build-package.ts +305 -317
  224. package/node_modules/@sdd-agent-platform/core/src/context/command-summary.ts +45 -45
  225. package/node_modules/@sdd-agent-platform/core/src/context/context-build.test.ts +188 -188
  226. package/node_modules/@sdd-agent-platform/core/src/context/evidence-summary.ts +144 -144
  227. package/node_modules/@sdd-agent-platform/core/src/context/log-worker.ts +48 -48
  228. package/node_modules/@sdd-agent-platform/core/src/context/source-refs.ts +41 -41
  229. package/node_modules/@sdd-agent-platform/core/src/context-offload/contracts.ts +47 -47
  230. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.test.ts +71 -71
  231. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.ts +178 -178
  232. package/node_modules/@sdd-agent-platform/core/src/context-offload.ts +2 -2
  233. package/node_modules/@sdd-agent-platform/core/src/context.ts +6 -6
  234. package/node_modules/@sdd-agent-platform/core/src/contracts/issues.ts +13 -13
  235. package/node_modules/@sdd-agent-platform/core/src/contracts.test.ts +9 -9
  236. package/node_modules/@sdd-agent-platform/core/src/contracts.ts +121 -115
  237. package/node_modules/@sdd-agent-platform/core/src/delegation/delegation.test.ts +183 -183
  238. package/node_modules/@sdd-agent-platform/core/src/delegation/model.ts +23 -23
  239. package/node_modules/@sdd-agent-platform/core/src/delegation/queue.ts +58 -58
  240. package/node_modules/@sdd-agent-platform/core/src/delegation/run-state.ts +14 -14
  241. package/node_modules/@sdd-agent-platform/core/src/delegation/state-machine.ts +90 -90
  242. package/node_modules/@sdd-agent-platform/core/src/delegation/validation.ts +124 -124
  243. package/node_modules/@sdd-agent-platform/core/src/delegation.ts +26 -26
  244. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/ai-entries.ts +28 -28
  245. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/document-chain.ts +104 -112
  246. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/local-run-index.ts +27 -27
  247. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/project.ts +84 -84
  248. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/registries.ts +252 -252
  249. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-evidence.ts +330 -330
  250. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-records.ts +79 -79
  251. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-trust.ts +128 -128
  252. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/runtime-contracts.ts +300 -300
  253. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.test.ts +627 -657
  254. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.ts +301 -318
  255. package/node_modules/@sdd-agent-platform/core/src/doctor/model.ts +13 -13
  256. package/node_modules/@sdd-agent-platform/core/src/doctor/summary.ts +11 -11
  257. package/node_modules/@sdd-agent-platform/core/src/doctor.ts +2 -2
  258. package/node_modules/@sdd-agent-platform/core/src/evidence/lookup.ts +80 -80
  259. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime/contracts.ts +48 -49
  260. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime.ts +1 -1
  261. package/node_modules/@sdd-agent-platform/core/src/execution/agent-execution-records.ts +195 -195
  262. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.test.ts +187 -187
  263. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.ts +305 -305
  264. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.test.ts +97 -97
  265. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.ts +453 -453
  266. package/node_modules/@sdd-agent-platform/core/src/execution/host-invocation.ts +225 -225
  267. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.test.ts +132 -132
  268. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.ts +436 -436
  269. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.test.ts +102 -102
  270. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.ts +271 -271
  271. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.test.ts +111 -111
  272. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.ts +231 -231
  273. package/node_modules/@sdd-agent-platform/core/src/execution.ts +5 -5
  274. package/node_modules/@sdd-agent-platform/core/src/governance/policy.test.ts +57 -57
  275. package/node_modules/@sdd-agent-platform/core/src/governance/policy.ts +175 -175
  276. package/node_modules/@sdd-agent-platform/core/src/governance.ts +1 -1
  277. package/node_modules/@sdd-agent-platform/core/src/instructions.test.ts +80 -49
  278. package/node_modules/@sdd-agent-platform/core/src/instructions.ts +38 -81
  279. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.test.ts +174 -174
  280. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.ts +373 -373
  281. package/node_modules/@sdd-agent-platform/core/src/lifecycle/rendering.ts +29 -29
  282. package/node_modules/@sdd-agent-platform/core/src/lifecycle/risk-signals.ts +146 -146
  283. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.test.ts +47 -0
  284. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.ts +255 -263
  285. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/contracts.ts +179 -0
  286. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/kernel.ts +522 -0
  287. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph.ts +2 -0
  288. package/node_modules/@sdd-agent-platform/core/src/lifecycle.ts +4 -4
  289. package/node_modules/@sdd-agent-platform/core/src/orchestration/contracts.ts +50 -50
  290. package/node_modules/@sdd-agent-platform/core/src/orchestration/index.ts +2 -2
  291. package/node_modules/@sdd-agent-platform/core/src/orchestration/runtime.ts +331 -342
  292. package/node_modules/@sdd-agent-platform/core/src/path-safety.test.ts +22 -22
  293. package/node_modules/@sdd-agent-platform/core/src/phase8-contracts.test.ts +243 -243
  294. package/node_modules/@sdd-agent-platform/core/src/phase8-projection-compat.test.ts +152 -153
  295. package/node_modules/@sdd-agent-platform/core/src/phase8-risk-kernel.test.ts +277 -277
  296. package/node_modules/@sdd-agent-platform/core/src/phase9-lifecycle-graph.test.ts +103 -0
  297. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.test.ts +88 -88
  298. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.ts +222 -222
  299. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.test.ts +79 -79
  300. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.ts +160 -160
  301. package/node_modules/@sdd-agent-platform/core/src/planning.ts +2 -2
  302. package/node_modules/@sdd-agent-platform/core/src/registries/agent-capability-catalog.ts +426 -426
  303. package/node_modules/@sdd-agent-platform/core/src/registries/agent-registry.ts +230 -146
  304. package/node_modules/@sdd-agent-platform/core/src/registries/agent-runtime-static.ts +142 -142
  305. package/node_modules/@sdd-agent-platform/core/src/registries/capability-sources.ts +253 -253
  306. package/node_modules/@sdd-agent-platform/core/src/registries/command-team-runtime.ts +302 -309
  307. package/node_modules/@sdd-agent-platform/core/src/registries/eval-learning-context.ts +246 -246
  308. package/node_modules/@sdd-agent-platform/core/src/registries/plan-scout-domains.ts +89 -0
  309. package/node_modules/@sdd-agent-platform/core/src/registries/query-status.ts +119 -119
  310. package/node_modules/@sdd-agent-platform/core/src/registries/registries.test.ts +454 -429
  311. package/node_modules/@sdd-agent-platform/core/src/registries/skill-capabilities.ts +37 -37
  312. package/node_modules/@sdd-agent-platform/core/src/registries/tool-capabilities.ts +135 -135
  313. package/node_modules/@sdd-agent-platform/core/src/registries/tool-plugins.ts +132 -132
  314. package/node_modules/@sdd-agent-platform/core/src/registries/worker-adapters.ts +144 -144
  315. package/node_modules/@sdd-agent-platform/core/src/registries/workflow-gates.ts +111 -111
  316. package/node_modules/@sdd-agent-platform/core/src/registries.ts +42 -42
  317. package/node_modules/@sdd-agent-platform/core/src/risk/consumer-diagnostics.ts +98 -97
  318. package/node_modules/@sdd-agent-platform/core/src/risk/contracts.ts +63 -63
  319. package/node_modules/@sdd-agent-platform/core/src/risk/kernel.ts +233 -233
  320. package/node_modules/@sdd-agent-platform/core/src/risk/legacy-adapters.ts +251 -266
  321. package/node_modules/@sdd-agent-platform/core/src/risk/workflow-gates.ts +203 -203
  322. package/node_modules/@sdd-agent-platform/core/src/risk.ts +5 -5
  323. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime-config.ts +327 -327
  324. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime.ts +388 -388
  325. package/node_modules/@sdd-agent-platform/core/src/router/profile-resolution.ts +154 -154
  326. package/node_modules/@sdd-agent-platform/core/src/router/risk-policy.ts +33 -33
  327. package/node_modules/@sdd-agent-platform/core/src/router/route-cache.ts +100 -100
  328. package/node_modules/@sdd-agent-platform/core/src/router/route-projection.ts +356 -356
  329. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.test.ts +428 -428
  330. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.ts +2 -2
  331. package/node_modules/@sdd-agent-platform/core/src/router/routing-rules.ts +73 -73
  332. package/node_modules/@sdd-agent-platform/core/src/router/routing.ts +189 -191
  333. package/node_modules/@sdd-agent-platform/core/src/router/runtime-import.ts +464 -0
  334. package/node_modules/@sdd-agent-platform/core/src/router/runtime-inspection.ts +124 -124
  335. package/node_modules/@sdd-agent-platform/core/src/router/runtime-registry.ts +123 -123
  336. package/node_modules/@sdd-agent-platform/core/src/router/runtime-validation.ts +277 -277
  337. package/node_modules/@sdd-agent-platform/core/src/router/stage-route-binding.ts +273 -0
  338. package/node_modules/@sdd-agent-platform/core/src/router/team-mode.ts +170 -170
  339. package/node_modules/@sdd-agent-platform/core/src/router.ts +5 -4
  340. package/node_modules/@sdd-agent-platform/core/src/run-state/artifacts.ts +126 -118
  341. package/node_modules/@sdd-agent-platform/core/src/run-state/events.ts +27 -27
  342. package/node_modules/@sdd-agent-platform/core/src/run-state/inspect-run.ts +172 -172
  343. package/node_modules/@sdd-agent-platform/core/src/run-state/invocation-ledger.ts +109 -109
  344. package/node_modules/@sdd-agent-platform/core/src/run-state/model.ts +252 -230
  345. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.test.ts +52 -52
  346. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.ts +356 -356
  347. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.test.ts +70 -70
  348. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.ts +406 -406
  349. package/node_modules/@sdd-agent-platform/core/src/run-state/task-evidence.ts +198 -206
  350. package/node_modules/@sdd-agent-platform/core/src/run-state/timing.ts +146 -0
  351. package/node_modules/@sdd-agent-platform/core/src/run-state.ts +8 -8
  352. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/build.ts +60 -63
  353. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/findings.ts +257 -296
  354. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/model.ts +140 -152
  355. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.test.ts +66 -68
  356. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.ts +2 -2
  357. package/node_modules/@sdd-agent-platform/core/src/runtime-paths.ts +253 -176
  358. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.test.ts +101 -0
  359. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.ts +314 -0
  360. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.test.ts +380 -0
  361. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.ts +207 -0
  362. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/context.ts +111 -111
  363. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/document-hashes.ts +207 -207
  364. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/run-binding.ts +95 -95
  365. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-inspection.ts +39 -39
  366. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.test.ts +467 -401
  367. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.ts +738 -694
  368. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-rendering.ts +81 -81
  369. package/node_modules/@sdd-agent-platform/core/src/sdd-docs.ts +5 -5
  370. package/node_modules/@sdd-agent-platform/core/src/spec-manager-contracts.ts +13 -0
  371. package/node_modules/@sdd-agent-platform/core/src/stage-artifacts.ts +435 -0
  372. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration-contracts.ts +316 -0
  373. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.test.ts +2964 -0
  374. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.ts +5856 -0
  375. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/contracts.ts +40 -40
  376. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.test.ts +209 -209
  377. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.ts +360 -352
  378. package/node_modules/@sdd-agent-platform/core/src/stage-runtime.ts +2 -2
  379. package/node_modules/@sdd-agent-platform/core/src/status/project-status.test.ts +288 -288
  380. package/node_modules/@sdd-agent-platform/core/src/status/project-status.ts +651 -625
  381. package/node_modules/@sdd-agent-platform/core/src/status.ts +2 -2
  382. package/node_modules/@sdd-agent-platform/core/src/storage/json-io.ts +10 -10
  383. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.test.ts +489 -489
  384. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.ts +1981 -1175
  385. package/node_modules/@sdd-agent-platform/core/src/subagents/contracts.ts +45 -45
  386. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.test.ts +232 -232
  387. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.ts +307 -307
  388. package/node_modules/@sdd-agent-platform/core/src/subagents.ts +2 -2
  389. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.test.ts +141 -0
  390. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.ts +566 -0
  391. package/node_modules/@sdd-agent-platform/core/src/task-risk-profile.ts +193 -193
  392. package/node_modules/@sdd-agent-platform/core/src/test-support/fixtures.ts +413 -398
  393. package/node_modules/@sdd-agent-platform/core/src/test-support/run-state.ts +102 -70
  394. package/node_modules/@sdd-agent-platform/core/src/test-support.ts +2 -2
  395. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.test.ts +72 -0
  396. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.ts +174 -0
  397. package/node_modules/@sdd-agent-platform/core/src/verification/rendering.ts +137 -181
  398. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.test.ts +77 -77
  399. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.ts +77 -77
  400. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.ts +455 -494
  401. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.test.ts → task-evidence-judgment.test.ts} +261 -335
  402. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.ts → task-evidence-judgment.ts} +619 -648
  403. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.ts +1190 -1032
  404. package/node_modules/@sdd-agent-platform/core/src/verification/validation-cache.ts +106 -0
  405. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.ts +513 -513
  406. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.ts +334 -358
  407. package/node_modules/@sdd-agent-platform/core/src/verification.ts +8 -8
  408. package/node_modules/@sdd-agent-platform/core/src/work-units/contracts.ts +26 -26
  409. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.test.ts +88 -88
  410. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.ts +112 -112
  411. package/node_modules/@sdd-agent-platform/core/src/work-units.ts +2 -2
  412. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/evidence-packet.ts +190 -196
  413. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.test.ts +169 -171
  414. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.ts +136 -143
  415. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.test.ts +135 -137
  416. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.ts +153 -155
  417. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/types.ts +111 -114
  418. package/node_modules/@sdd-agent-platform/core/src/workflow-state/affected-file-conflicts.ts +95 -95
  419. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.test.ts +32 -32
  420. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.ts +114 -114
  421. package/node_modules/@sdd-agent-platform/core/src/workflow-state/latest-eligible-run.ts +184 -156
  422. package/node_modules/@sdd-agent-platform/core/src/workflow-state/migration-recovery.ts +158 -0
  423. package/node_modules/@sdd-agent-platform/core/src/workflow-state/repair-contract.ts +77 -0
  424. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve-task-run.ts +114 -0
  425. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.test.ts +970 -464
  426. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.ts +967 -363
  427. package/node_modules/@sdd-agent-platform/core/src/workflow-state/runtime-projections.ts +712 -0
  428. package/node_modules/@sdd-agent-platform/core/src/workflow-state.ts +2 -2
  429. package/node_modules/@sdd-agent-platform/core/src/worktree/isolation.ts +130 -130
  430. package/node_modules/@sdd-agent-platform/core/src/worktree/lifecycle.ts +269 -269
  431. package/node_modules/@sdd-agent-platform/core/src/worktree/worktree.test.ts +150 -150
  432. package/node_modules/@sdd-agent-platform/core/src/worktree.ts +2 -2
  433. package/node_modules/@sdd-agent-platform/core/tsconfig.json +15 -15
  434. package/package.json +2 -2
  435. package/packages/cli/dist/args.js +1 -1
  436. package/packages/cli/dist/args.js.map +1 -1
  437. package/packages/cli/dist/commands/context.js +1 -1
  438. package/packages/cli/dist/commands/context.js.map +1 -1
  439. package/packages/cli/dist/commands/evidence.js.map +1 -0
  440. package/packages/cli/dist/commands/execution.js +126 -0
  441. package/packages/cli/dist/commands/execution.js.map +1 -1
  442. package/packages/cli/dist/commands/instructions.d.ts +1 -1
  443. package/packages/cli/dist/commands/instructions.js +15 -1
  444. package/packages/cli/dist/commands/instructions.js.map +1 -1
  445. package/packages/cli/dist/commands/registry/runtime.js +70 -1
  446. package/packages/cli/dist/commands/registry/runtime.js.map +1 -1
  447. package/packages/cli/dist/commands/run.js +12 -1
  448. package/packages/cli/dist/commands/run.js.map +1 -1
  449. package/packages/cli/dist/commands/stage-close.d.ts +66 -0
  450. package/packages/cli/dist/commands/stage-close.js +524 -0
  451. package/packages/cli/dist/commands/stage-close.js.map +1 -0
  452. package/packages/cli/dist/commands/status.js +8 -1
  453. package/packages/cli/dist/commands/status.js.map +1 -1
  454. package/packages/cli/dist/commands/tasks.js.map +1 -1
  455. package/packages/cli/dist/dispatch.js +6 -31
  456. package/packages/cli/dist/dispatch.js.map +1 -1
  457. package/packages/cli/dist/help.js +153 -158
  458. package/packages/cli/dist/help.js.map +1 -1
  459. package/packages/cli/dist/renderers/workflow.d.ts +51 -2
  460. package/packages/cli/dist/renderers/workflow.js.map +1 -1
  461. package/packages/cli/dist/skill-import-args.d.ts +10 -0
  462. package/packages/cli/dist/skill-import-args.js +47 -0
  463. package/packages/cli/dist/skill-import-args.js.map +1 -0
  464. package/packages/cli/dist/tsconfig.tsbuildinfo +1 -1
  465. package/packages/cli/package.json +2 -2
  466. package/packages/core/dist/ai-tools.js +84 -103
  467. package/packages/core/dist/ai-tools.js.map +1 -1
  468. package/packages/core/dist/config/init-project.d.ts +10 -6
  469. package/packages/core/dist/config/init-project.js +7 -8
  470. package/packages/core/dist/config/init-project.js.map +1 -1
  471. package/packages/core/dist/config/project-config.d.ts +3 -1
  472. package/packages/core/dist/config/project-config.js +7 -3
  473. package/packages/core/dist/config/project-config.js.map +1 -1
  474. package/packages/core/dist/config/starter-documents.d.ts +0 -1
  475. package/packages/core/dist/config/starter-documents.js +374 -421
  476. package/packages/core/dist/config/starter-documents.js.map +1 -1
  477. package/packages/core/dist/context/build-package.d.ts +1 -1
  478. package/packages/core/dist/context/build-package.js +7 -19
  479. package/packages/core/dist/context/build-package.js.map +1 -1
  480. package/packages/core/dist/contracts.d.ts +7 -1
  481. package/packages/core/dist/contracts.js +6 -0
  482. package/packages/core/dist/contracts.js.map +1 -1
  483. package/packages/core/dist/doctor/checks/document-chain.js +2 -12
  484. package/packages/core/dist/doctor/checks/document-chain.js.map +1 -1
  485. package/packages/core/dist/doctor/doctor.js +1 -18
  486. package/packages/core/dist/doctor/doctor.js.map +1 -1
  487. package/packages/core/dist/evidence/lookup.d.ts +1 -1
  488. package/packages/core/dist/evidence/lookup.js +1 -1
  489. package/packages/core/dist/evidence/lookup.js.map +1 -1
  490. package/packages/core/dist/evidence-runtime/contracts.d.ts +0 -1
  491. package/packages/core/dist/evidence-runtime/coordination.js +110 -0
  492. package/packages/core/dist/evidence-runtime/coordination.js.map +1 -0
  493. package/packages/core/dist/execution/host-invocation.js +83 -83
  494. package/packages/core/dist/instructions.d.ts +1 -1
  495. package/packages/core/dist/instructions.js +37 -80
  496. package/packages/core/dist/instructions.js.map +1 -1
  497. package/packages/core/dist/lifecycle/ship.js +58 -68
  498. package/packages/core/dist/lifecycle/ship.js.map +1 -1
  499. package/packages/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  500. package/packages/core/dist/lifecycle-graph/contracts.js +7 -0
  501. package/packages/core/dist/lifecycle-graph/contracts.js.map +1 -0
  502. package/packages/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  503. package/packages/core/dist/lifecycle-graph/kernel.js +461 -0
  504. package/packages/core/dist/lifecycle-graph/kernel.js.map +1 -0
  505. package/packages/core/dist/lifecycle-graph.d.ts +2 -0
  506. package/packages/core/dist/lifecycle-graph.js +3 -0
  507. package/packages/core/dist/lifecycle-graph.js.map +1 -0
  508. package/packages/core/dist/orchestration/contracts.d.ts +1 -1
  509. package/packages/core/dist/orchestration/runtime.js +21 -28
  510. package/packages/core/dist/orchestration/runtime.js.map +1 -1
  511. package/packages/core/dist/registries/agent-registry.js +124 -40
  512. package/packages/core/dist/registries/agent-registry.js.map +1 -1
  513. package/packages/core/dist/registries/command-team-runtime.d.ts +1 -1
  514. package/packages/core/dist/registries/command-team-runtime.js +6 -13
  515. package/packages/core/dist/registries/command-team-runtime.js.map +1 -1
  516. package/packages/core/dist/registries/plan-scout-domains.d.ts +13 -0
  517. package/packages/core/dist/registries/plan-scout-domains.js +76 -0
  518. package/packages/core/dist/registries/plan-scout-domains.js.map +1 -0
  519. package/packages/core/dist/registries/skill-capabilities.js +7 -7
  520. package/packages/core/dist/registries/skill-capabilities.js.map +1 -1
  521. package/packages/core/dist/registries/tool-capabilities.js +6 -6
  522. package/packages/core/dist/registries/tool-capabilities.js.map +1 -1
  523. package/packages/core/dist/registries/workflow-gates.d.ts +1 -1
  524. package/packages/core/dist/registries/workflow-gates.js +18 -18
  525. package/packages/core/dist/registries/workflow-gates.js.map +1 -1
  526. package/packages/core/dist/risk/consumer-diagnostics.js +2 -1
  527. package/packages/core/dist/risk/consumer-diagnostics.js.map +1 -1
  528. package/packages/core/dist/risk/contracts.d.ts +2 -2
  529. package/packages/core/dist/risk/kernel.js +7 -7
  530. package/packages/core/dist/risk/kernel.js.map +1 -1
  531. package/packages/core/dist/risk/legacy-adapters.js +12 -27
  532. package/packages/core/dist/risk/legacy-adapters.js.map +1 -1
  533. package/packages/core/dist/risk/workflow-gates.js +6 -6
  534. package/packages/core/dist/risk/workflow-gates.js.map +1 -1
  535. package/packages/core/dist/router/agent-runtime-config.js +1 -1
  536. package/packages/core/dist/router/agent-runtime-config.js.map +1 -1
  537. package/packages/core/dist/router/routing.js +2 -4
  538. package/packages/core/dist/router/routing.js.map +1 -1
  539. package/packages/core/dist/router/runtime-import.d.ts +28 -0
  540. package/packages/core/dist/router/runtime-import.js +383 -0
  541. package/packages/core/dist/router/runtime-import.js.map +1 -0
  542. package/packages/core/dist/router/stage-route-binding.d.ts +37 -0
  543. package/packages/core/dist/router/stage-route-binding.js +227 -0
  544. package/packages/core/dist/router/stage-route-binding.js.map +1 -0
  545. package/packages/core/dist/router.d.ts +1 -0
  546. package/packages/core/dist/router.js +1 -0
  547. package/packages/core/dist/router.js.map +1 -1
  548. package/packages/core/dist/run-state/artifacts.d.ts +16 -0
  549. package/packages/core/dist/run-state/artifacts.js +6 -0
  550. package/packages/core/dist/run-state/artifacts.js.map +1 -1
  551. package/packages/core/dist/run-state/model.d.ts +20 -0
  552. package/packages/core/dist/run-state/run-state.js +7 -7
  553. package/packages/core/dist/run-state/run-state.js.map +1 -1
  554. package/packages/core/dist/run-state/task-evidence.d.ts +1 -2
  555. package/packages/core/dist/run-state/task-evidence.js +2 -9
  556. package/packages/core/dist/run-state/task-evidence.js.map +1 -1
  557. package/packages/core/dist/run-state/timing.d.ts +8 -0
  558. package/packages/core/dist/run-state/timing.js +131 -0
  559. package/packages/core/dist/run-state/timing.js.map +1 -0
  560. package/packages/core/dist/runtime-analysis/build.js +1 -4
  561. package/packages/core/dist/runtime-analysis/build.js.map +1 -1
  562. package/packages/core/dist/runtime-analysis/findings.js +0 -39
  563. package/packages/core/dist/runtime-analysis/findings.js.map +1 -1
  564. package/packages/core/dist/runtime-analysis/model.d.ts +1 -17
  565. package/packages/core/dist/runtime-paths.d.ts +10 -0
  566. package/packages/core/dist/runtime-paths.js +65 -0
  567. package/packages/core/dist/runtime-paths.js.map +1 -1
  568. package/packages/core/dist/runtime-projection-p0.d.ts +64 -0
  569. package/packages/core/dist/runtime-projection-p0.js +211 -0
  570. package/packages/core/dist/runtime-projection-p0.js.map +1 -0
  571. package/packages/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  572. package/packages/core/dist/sdd-docs/artifact-depth.js +179 -0
  573. package/packages/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  574. package/packages/core/dist/sdd-docs/task-parser.d.ts +5 -1
  575. package/packages/core/dist/sdd-docs/task-parser.js +60 -22
  576. package/packages/core/dist/sdd-docs/task-parser.js.map +1 -1
  577. package/packages/core/dist/sdd-docs/task-rendering.js +2 -2
  578. package/packages/core/dist/sdd-docs/task-rendering.js.map +1 -1
  579. package/packages/core/dist/spec-entry.js +40 -0
  580. package/packages/core/dist/spec-entry.js.map +1 -0
  581. package/packages/core/dist/spec-manager-contracts.d.ts +12 -0
  582. package/packages/core/dist/spec-manager-contracts.js +2 -0
  583. package/packages/core/dist/spec-manager-contracts.js.map +1 -0
  584. package/packages/core/dist/stage-artifacts.d.ts +55 -0
  585. package/packages/core/dist/stage-artifacts.js +315 -0
  586. package/packages/core/dist/stage-artifacts.js.map +1 -0
  587. package/packages/core/dist/stage-collaboration-contracts.d.ts +55 -0
  588. package/packages/core/dist/stage-collaboration-contracts.js +238 -0
  589. package/packages/core/dist/stage-collaboration-contracts.js.map +1 -0
  590. package/packages/core/dist/stage-collaboration.d.ts +736 -0
  591. package/packages/core/dist/stage-collaboration.js +4018 -0
  592. package/packages/core/dist/stage-collaboration.js.map +1 -0
  593. package/packages/core/dist/stage-runtime/runtime.js +8 -1
  594. package/packages/core/dist/stage-runtime/runtime.js.map +1 -1
  595. package/packages/core/dist/status/project-status.js +25 -1
  596. package/packages/core/dist/status/project-status.js.map +1 -1
  597. package/packages/core/dist/storage/runtime-store.d.ts +170 -18
  598. package/packages/core/dist/storage/runtime-store.js +597 -85
  599. package/packages/core/dist/storage/runtime-store.js.map +1 -1
  600. package/packages/core/dist/sync-back/apply.d.ts +1 -17
  601. package/packages/core/dist/sync-back/apply.js +1 -242
  602. package/packages/core/dist/sync-back/apply.js.map +1 -1
  603. package/packages/core/dist/sync-back/inspect.d.ts +1 -110
  604. package/packages/core/dist/sync-back/inspect.js +1 -496
  605. package/packages/core/dist/sync-back/inspect.js.map +1 -1
  606. package/packages/core/dist/sync-back.d.ts +1 -2
  607. package/packages/core/dist/sync-back.js +1 -2
  608. package/packages/core/dist/sync-back.js.map +1 -1
  609. package/packages/core/dist/task-execution-contract.d.ts +167 -0
  610. package/packages/core/dist/task-execution-contract.js +377 -0
  611. package/packages/core/dist/task-execution-contract.js.map +1 -0
  612. package/packages/core/dist/test-support/fixtures.js +329 -314
  613. package/packages/core/dist/test-support/fixtures.js.map +1 -1
  614. package/packages/core/dist/test-support/run-state.d.ts +1 -0
  615. package/packages/core/dist/test-support/run-state.js +31 -0
  616. package/packages/core/dist/test-support/run-state.js.map +1 -1
  617. package/packages/core/dist/truth-reconciliation.d.ts +44 -0
  618. package/packages/core/dist/truth-reconciliation.js +135 -0
  619. package/packages/core/dist/truth-reconciliation.js.map +1 -0
  620. package/packages/core/dist/tsconfig.tsbuildinfo +1 -1
  621. package/packages/core/dist/verification/goal-verify.d.ts +0 -49
  622. package/packages/core/dist/verification/goal-verify.js +1 -545
  623. package/packages/core/dist/verification/goal-verify.js.map +1 -1
  624. package/packages/core/dist/verification/rendering.d.ts +5 -7
  625. package/packages/core/dist/verification/rendering.js +15 -55
  626. package/packages/core/dist/verification/rendering.js.map +1 -1
  627. package/packages/core/dist/verification/single-task-loop.js +1 -40
  628. package/packages/core/dist/verification/single-task-loop.js.map +1 -1
  629. package/packages/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  630. package/packages/core/dist/verification/task-evidence-judgment.js +521 -0
  631. package/packages/core/dist/verification/task-evidence-judgment.js.map +1 -0
  632. package/packages/core/dist/verification/test-runtime.d.ts +12 -2
  633. package/packages/core/dist/verification/test-runtime.js +247 -112
  634. package/packages/core/dist/verification/test-runtime.js.map +1 -1
  635. package/packages/core/dist/verification/validation-cache.d.ts +26 -0
  636. package/packages/core/dist/verification/validation-cache.js +73 -0
  637. package/packages/core/dist/verification/validation-cache.js.map +1 -0
  638. package/packages/core/dist/verification/verify-contract.d.ts +1 -1
  639. package/packages/core/dist/verification/verify-contract.js +49 -72
  640. package/packages/core/dist/verification/verify-contract.js.map +1 -1
  641. package/packages/core/dist/verification.d.ts +3 -3
  642. package/packages/core/dist/verification.js +2 -2
  643. package/packages/core/dist/verification.js.map +1 -1
  644. package/packages/core/dist/workflow-gate/evidence-packet.js +2 -7
  645. package/packages/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  646. package/packages/core/dist/workflow-gate/hard-checks.js +0 -7
  647. package/packages/core/dist/workflow-gate/hard-checks.js.map +1 -1
  648. package/packages/core/dist/workflow-gate/policy.js +2 -4
  649. package/packages/core/dist/workflow-gate/policy.js.map +1 -1
  650. package/packages/core/dist/workflow-gate/types.d.ts +3 -5
  651. package/packages/core/dist/workflow-state/latest-eligible-run.js +30 -4
  652. package/packages/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  653. package/packages/core/dist/workflow-state/migration-recovery.d.ts +40 -0
  654. package/packages/core/dist/workflow-state/migration-recovery.js +110 -0
  655. package/packages/core/dist/workflow-state/migration-recovery.js.map +1 -0
  656. package/packages/core/dist/workflow-state/repair-contract.d.ts +12 -0
  657. package/packages/core/dist/workflow-state/repair-contract.js +63 -0
  658. package/packages/core/dist/workflow-state/repair-contract.js.map +1 -0
  659. package/packages/core/dist/workflow-state/resolve-task-run.d.ts +21 -0
  660. package/packages/core/dist/workflow-state/resolve-task-run.js +95 -0
  661. package/packages/core/dist/workflow-state/resolve-task-run.js.map +1 -0
  662. package/packages/core/dist/workflow-state/resolve.d.ts +55 -5
  663. package/packages/core/dist/workflow-state/resolve.js +518 -36
  664. package/packages/core/dist/workflow-state/resolve.js.map +1 -1
  665. package/packages/core/dist/workflow-state/runtime-projections.d.ts +228 -0
  666. package/packages/core/dist/workflow-state/runtime-projections.js +452 -0
  667. package/packages/core/dist/workflow-state/runtime-projections.js.map +1 -0
  668. package/packages/core/package.json +6 -3
  669. package/tsconfig.build.json +6 -7
  670. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.d.ts +0 -2
  671. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.js +0 -44
  672. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.js.map +0 -1
  673. package/node_modules/@sdd-agent-platform/core/src/sync-back/apply.ts +0 -270
  674. package/node_modules/@sdd-agent-platform/core/src/sync-back/inspect.ts +0 -655
  675. package/node_modules/@sdd-agent-platform/core/src/sync-back/sync-back.test.ts +0 -569
  676. package/node_modules/@sdd-agent-platform/core/src/sync-back.ts +0 -2
  677. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.test.ts +0 -255
  678. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.test.ts +0 -439
  679. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.test.ts +0 -341
  680. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.test.ts +0 -204
  681. package/packages/cli/dist/commands/lifecycle.d.ts +0 -6
  682. package/packages/cli/dist/commands/lifecycle.js +0 -112
  683. package/packages/cli/dist/commands/lifecycle.js.map +0 -1
  684. package/packages/cli/dist/commands/sync-back.d.ts +0 -6
  685. package/packages/cli/dist/commands/sync-back.js +0 -82
  686. package/packages/cli/dist/commands/sync-back.js.map +0 -1
  687. package/packages/cli/dist/commands/test.d.ts +0 -6
  688. package/packages/cli/dist/commands/test.js +0 -195
  689. package/packages/cli/dist/commands/test.js.map +0 -1
  690. package/packages/cli/dist/commands/verifies.d.ts +0 -6
  691. package/packages/cli/dist/commands/verifies.js +0 -85
  692. package/packages/cli/dist/commands/verifies.js.map +0 -1
  693. package/packages/cli/dist/commands/verify.d.ts +0 -6
  694. package/packages/cli/dist/commands/verify.js +0 -134
  695. package/packages/cli/dist/commands/verify.js.map +0 -1
  696. package/packages/core/dist/doctor/render.d.ts +0 -2
  697. package/packages/core/dist/doctor/render.js +0 -44
  698. package/packages/core/dist/doctor/render.js.map +0 -1
@@ -1,401 +1,467 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
4
- import { tmpdir } from 'node:os';
5
- import path from 'node:path';
6
-
7
- import { validTaskMarkdown } from '../test-support/fixtures.js';
8
- import { hashTasksContract } from './document-hashes.js';
9
- import { inspectSddTask } from './task-inspection.js';
10
- import { parseSddBranch, parseSddTasksMarkdown } from './task-parser.js';
11
- import { renderTaskGapReport } from './task-rendering.js';
12
-
13
- test('parseSddTasksMarkdown extracts task metadata and companion sections', () => {
14
- const markdown = `# Tasks
15
-
16
- ### T1: Parser foundation
17
-
18
- \`\`\`sdd-task
19
- id: T1
20
- status: pending
21
- wave: 1
22
- depends_on: []
23
- affected_files:
24
- - packages/core/src/index.ts
25
- change_surface: backend_only
26
- implementation_wave: wave-1
27
- validation_batch: backend-unit-wave-1
28
- validation_timing: batch_end
29
- requires_verify_before_next: false
30
- validation:
31
- - npm test => AC-1, AC-2
32
- risk:
33
- - parser boundary
34
- \`\`\`
35
-
36
- #### Boundary
37
-
38
- Only parse Markdown metadata; do not execute tasks.
39
-
40
- #### Acceptance
41
-
42
- - Task metadata is structured.
43
- - Boundary is retained.
44
-
45
- #### Implementation Notes
46
-
47
- None yet.
48
- `;
49
- const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
50
-
51
- assert.equal(model.gaps.length, 0);
52
- assert.equal(model.tasks.length, 1);
53
- assert.equal(model.tasks[0].id, 'T1');
54
- assert.equal(model.tasks[0].status, 'pending');
55
- assert.equal(model.tasks[0].wave, 1);
56
- assert.deepEqual(model.tasks[0].dependsOn, []);
57
- assert.deepEqual(model.tasks[0].affectedFiles, ['packages/core/src/index.ts']);
58
- assert.equal(model.tasks[0].changeSurface, 'backend_only');
59
- assert.equal(model.tasks[0].implementationWave, 'wave-1');
60
- assert.equal(model.tasks[0].validationBatch, 'backend-unit-wave-1');
61
- assert.equal(model.tasks[0].validationTiming, 'batch_end');
62
- assert.equal(model.tasks[0].requiresVerifyBeforeNext, false);
63
- assert.deepEqual(model.tasks[0].validation, ['npm test']);
64
- assert.deepEqual(model.tasks[0].validationCommands, [{ command: 'npm test', acceptanceRefs: ['AC-1', 'AC-2'], raw: 'npm test => AC-1, AC-2' }]);
65
- assert.deepEqual(model.tasks[0].risk, ['parser boundary']);
66
- assert.match(model.tasks[0].boundary ?? '', /Only parse Markdown metadata/);
67
- assert.deepEqual(model.tasks[0].acceptance, ['Task metadata is structured.', 'Boundary is retained.']);
68
- });
69
-
70
- test('parseSddTasksMarkdown blocks backend build validation for frontend-only tasks', () => {
71
- const markdown = `# Tasks
72
-
73
- ### T23: JSP rendering copy update
74
-
75
- \`\`\`sdd-task
76
- id: T23
77
- status: pending
78
- wave: 1
79
- depends_on: []
80
- affected_files:
81
- - emp-upms/emp-upms-server/src/main/webapp/WEB-INF/views/demo.jsp
82
- - emp-upms/emp-upms-server/src/main/webapp/static/img/banner.svg
83
- validation:
84
- - mvn compile -Ptest -pl emp-upms/emp-upms-server -am
85
- risk: []
86
- \`\`\`
87
-
88
- #### Boundary
89
-
90
- Only JSP copy and static image rendering.
91
-
92
- #### Acceptance
93
-
94
- - JSP copy renders correctly.
95
- `;
96
- const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
97
-
98
- assert.equal(model.gaps.some((gap) => gap.taskId === 'T23' && gap.field === 'validation' && /frontend-only/.test(gap.message)), true);
99
- assert.equal(model.gaps.some((gap) => /Maven\/Gradle/.test(gap.recommendation)), true);
100
- });
101
-
102
- test('parseSddTasksMarkdown validates Phase 8.19 batch contract fields', () => {
103
- const markdown = `# Tasks
104
-
105
- ### T24: Invalid batch contract
106
-
107
- \`\`\`sdd-task
108
- id: T24
109
- status: pending
110
- wave: 1
111
- depends_on: []
112
- affected_files:
113
- - packages/core/src/index.ts
114
- change_surface: api_only
115
- validation_timing: batch_end
116
- requires_verify_before_next: sometimes
117
- validation:
118
- - npm test
119
- risk: []
120
- \`\`\`
121
-
122
- #### Boundary
123
-
124
- Stay in parser scope.
125
-
126
- #### Acceptance
127
-
128
- - Parser blocks invalid batch contract.
129
- `;
130
- const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
131
- const fields = model.gaps.map((gap) => gap.field);
132
-
133
- assert.equal(fields.includes('change_surface'), true);
134
- assert.equal(fields.includes('validation_batch'), true);
135
- assert.equal(fields.includes('requires_verify_before_next'), true);
136
- });
137
-
138
- test('hashTasksContract includes Phase 8.19 validation grouping fields', () => {
139
- const base = `# Tasks
140
-
141
- ### T1: Hash grouping
142
-
143
- \`\`\`sdd-task
144
- id: T1
145
- status: pending
146
- wave: 1
147
- depends_on: []
148
- affected_files:
149
- - packages/core/src/index.ts
150
- change_surface: backend_only
151
- implementation_wave: wave-1
152
- validation_batch: batch-a
153
- validation_timing: batch_end
154
- requires_verify_before_next: false
155
- validation:
156
- - npm test
157
- risk: []
158
- \`\`\`
159
-
160
- #### Boundary
161
-
162
- Stay in parser scope.
163
-
164
- #### Acceptance
165
-
166
- - Hash includes validation grouping.
167
- `;
168
- const changed = base.replace('validation_batch: batch-a', 'validation_batch: batch-b');
169
-
170
- assert.notEqual(hashTasksContract(base), hashTasksContract(changed));
171
- });
172
-
173
- test('parseSddBranch separates raw doc hash from semantic tasks contract hash', async () => {
174
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-contract-hash-'));
175
- try {
176
- const branchDir = path.join(root, 'specs', 'feature');
177
- await mkdir(branchDir, { recursive: true });
178
- await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
179
- await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
180
- const original = validTaskMarkdown('T1', []);
181
- await writeFile(path.join(branchDir, 'tasks.md'), original, 'utf8');
182
- const base = await parseSddBranch(root, 'feature');
183
-
184
- await writeFile(path.join(branchDir, 'tasks.md'), `${original}\n\n<!-- formatting-only note -->\n`, 'utf8');
185
- const formattingOnly = await parseSddBranch(root, 'feature');
186
-
187
- await writeFile(path.join(branchDir, 'tasks.md'), original.replace('risk: []', 'risk:\n - security'), 'utf8');
188
- const semanticChange = await parseSddBranch(root, 'feature');
189
-
190
- assert.notEqual(formattingOnly.documents.tasksHash, base.documents.tasksHash);
191
- assert.equal(formattingOnly.documents.tasksContractHash, base.documents.tasksContractHash);
192
- assert.notEqual(semanticChange.documents.tasksContractHash, base.documents.tasksContractHash);
193
- } finally {
194
- await rm(root, { recursive: true, force: true });
195
- }
196
- });
197
-
198
- test('parseSddTasksMarkdown does not leak companion sections across indented task headings', () => {
199
- const markdown = `# Tasks
200
-
201
- ### ERP-SCRK-1: 固化入库同步状态机边界
202
-
203
- \`\`\`sdd-task
204
- id: ERP-SCRK-1
205
- status: pending
206
- wave: 1
207
- depends_on: []
208
- affected_files:
209
- - src/main/java/com/acme/erp/InboundSyncService.java
210
- validation:
211
- - mvn test -Dtest=InboundSyncServiceTest
212
- risk:
213
- - state-machine
214
- \`\`\`
215
-
216
- #### Boundary
217
-
218
- Only state-machine logic.
219
-
220
- #### Acceptance
221
-
222
- - Terminal states never roll back.
223
-
224
- ### ERP-SCRK-2: 移除 Mapper SQL 拼接
225
-
226
- \`\`\`sdd-task
227
- id: ERP-SCRK-2
228
- status: pending
229
- wave: 2
230
- depends_on:
231
- - ERP-SCRK-1
232
- affected_files:
233
- - src/main/java/com/acme/erp/InboundSyncMapper.java
234
- validation:
235
- - mvn test
236
- risk:
237
- - sql
238
- \`\`\`
239
-
240
- #### Boundary
241
-
242
- Only mapper SQL parameterization.
243
-
244
- #### Acceptance
245
-
246
- - Mapper has no SQL string concatenation.
247
- `;
248
- const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
249
-
250
- assert.equal(model.gaps.length, 0);
251
- assert.equal(model.tasks.length, 2);
252
- assert.deepEqual(model.tasks[0].acceptance, ['Terminal states never roll back.']);
253
- assert.deepEqual(model.tasks[1].acceptance, ['Mapper has no SQL string concatenation.']);
254
- assert.doesNotMatch(model.tasks[0].boundary ?? '', /Mapper SQL/);
255
- });
256
-
257
- test('parseSddTasksMarkdown reports task metadata and dependency gaps', () => {
258
- const markdown = `# Tasks
259
-
260
- ### T2: Gap case
261
-
262
- \`\`\`sdd-task
263
- id: T2
264
- status: surprise
265
- depends_on:
266
- - T404
267
- affected_files: []
268
- validation: []
269
- risk: []
270
- \`\`\`
271
- `;
272
- const model = parseSddTasksMarkdown(markdown);
273
- const fields = model.gaps.map((gap) => gap.field);
274
-
275
- assert.equal(model.tasks.length, 1);
276
- assert.equal(model.gaps.every((gap) => gap.severity === 'blocking'), true);
277
- assert.equal(fields.includes('status'), true);
278
- assert.equal(fields.includes('wave'), true);
279
- assert.equal(fields.includes('affected_files'), true);
280
- assert.equal(fields.includes('validation'), true);
281
- assert.equal(fields.includes('Boundary'), true);
282
- assert.equal(fields.includes('Acceptance'), true);
283
- assert.equal(fields.includes('depends_on'), true);
284
- assert.match(renderTaskGapReport({
285
- branch: 'master',
286
- specPath: 'spec.md',
287
- planPath: 'plan.md',
288
- tasksPath: 'tasks.md',
289
- verifyPath: 'verify.md',
290
- documents: { specExists: true, planExists: true, tasksExists: true, verifyExists: true },
291
- tasks: model.tasks,
292
- gaps: model.gaps
293
- }), /BLOCKED/);
294
- });
295
-
296
- test('parseSddBranch reads branch docs and inspectSddTask filters gaps', async () => {
297
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-parser-'));
298
- try {
299
- const branchDir = path.join(root, 'specs', 'feature');
300
- await mkdir(branchDir, { recursive: true });
301
- await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
302
- await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
303
- await writeFile(path.join(branchDir, 'tasks.md'), `# Tasks
304
-
305
- ### T1: Valid task
306
-
307
- \`\`\`sdd-task
308
- id: T1
309
- status: pending
310
- wave: 1
311
- depends_on: []
312
- affected_files:
313
- - a.ts
314
- validation:
315
- - npm test
316
- risk: []
317
- \`\`\`
318
-
319
- #### Boundary
320
-
321
- Stay in a.ts.
322
-
323
- #### Acceptance
324
-
325
- - a.ts behavior is covered.
326
- `, 'utf8');
327
-
328
- const model = await parseSddBranch(root, 'feature');
329
- const inspected = inspectSddTask(model, 'T1');
330
-
331
- assert.equal(model.documents.specExists, true);
332
- assert.equal(model.documents.planExists, true);
333
- assert.equal(model.documents.tasksExists, true);
334
- assert.equal(model.gaps.length, 0);
335
- assert.equal(inspected.task?.id, 'T1');
336
- assert.equal(inspected.gaps.length, 0);
337
- } finally {
338
- await rm(root, { recursive: true, force: true });
339
- }
340
- });
341
-
342
- test('retained phase fallback detects aggregate duplicate task ids and inspect ambiguity', async () => {
343
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-duplicate-'));
344
- try {
345
- const branchDir = path.join(root, 'specs', 'feature');
346
- await mkdir(branchDir, { recursive: true });
347
- await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
348
- await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
349
- await writeFile(path.join(branchDir, 'tasks.md'), '# Tasks\nLegacy index only.\n', 'utf8');
350
- await writeFile(path.join(branchDir, 'phase1.0-tasks.md'), validTaskMarkdown('T1', []), 'utf8');
351
- await writeFile(path.join(branchDir, 'phase1.1-tasks.md'), validTaskMarkdown('T1', []), 'utf8');
352
-
353
- const model = await parseSddBranch(root, 'feature');
354
- const inspected = inspectSddTask(model, 'T1');
355
-
356
- assert.equal(model.tasks.length, 2);
357
- assert.equal(model.gaps.some((gap) => gap.field === 'id' && gap.taskId === 'T1' && /Duplicate task id T1 across parsed task files/.test(gap.message)), true);
358
- assert.equal(inspected.task, null);
359
- assert.equal(inspected.gaps.some((gap) => /ambiguous/.test(gap.message)), true);
360
- } finally {
361
- await rm(root, { recursive: true, force: true });
362
- }
363
- });
364
-
365
- test('retained phase fallback validates cross-file dependencies over aggregate tasks', async () => {
366
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-cross-deps-'));
367
- try {
368
- const branchDir = path.join(root, 'specs', 'feature');
369
- await mkdir(branchDir, { recursive: true });
370
- await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
371
- await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
372
- await writeFile(path.join(branchDir, 'tasks.md'), '# Tasks\nLegacy index only.\n', 'utf8');
373
- await writeFile(path.join(branchDir, 'phase1.0-tasks.md'), validTaskMarkdown('P1.0-T1', []), 'utf8');
374
- await writeFile(path.join(branchDir, 'phase1.1-tasks.md'), validTaskMarkdown('P1.1-T1', ['P1.0-T1']), 'utf8');
375
-
376
- const model = await parseSddBranch(root, 'feature');
377
-
378
- assert.equal(model.tasks.length, 2);
379
- assert.equal(model.gaps.length, 0);
380
- } finally {
381
- await rm(root, { recursive: true, force: true });
382
- }
383
- });
384
-
385
- test('retained phase fallback still reports unknown dependencies', async () => {
386
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-unknown-deps-'));
387
- try {
388
- const branchDir = path.join(root, 'specs', 'feature');
389
- await mkdir(branchDir, { recursive: true });
390
- await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
391
- await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
392
- await writeFile(path.join(branchDir, 'tasks.md'), '# Tasks\nLegacy index only.\n', 'utf8');
393
- await writeFile(path.join(branchDir, 'phase1.0-tasks.md'), validTaskMarkdown('P1.0-T1', ['P9.9-T404']), 'utf8');
394
-
395
- const model = await parseSddBranch(root, 'feature');
396
-
397
- assert.equal(model.gaps.some((gap) => gap.type === 'Dependency Gap' && gap.taskId === 'P1.0-T1' && /unknown task P9.9-T404/.test(gap.message)), true);
398
- } finally {
399
- await rm(root, { recursive: true, force: true });
400
- }
401
- });
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import path from 'node:path';
6
+
7
+ import { validTaskMarkdown } from '../test-support/fixtures.js';
8
+ import { hashTasksContract } from './document-hashes.js';
9
+ import { inspectSddTask } from './task-inspection.js';
10
+ import { parseSddBranch, parseSddTasksMarkdown } from './task-parser.js';
11
+ import { renderTaskGapReport } from './task-rendering.js';
12
+
13
+ test('parseSddTasksMarkdown extracts task metadata and companion sections', () => {
14
+ const markdown = `# Tasks
15
+
16
+ ### T1: Parser foundation
17
+
18
+ \`\`\`sdd-task
19
+ id: T1
20
+ status: pending
21
+ wave: 1
22
+ depends_on: []
23
+ affected_files:
24
+ - packages/core/src/index.ts
25
+ change_surface: backend_only
26
+ implementation_wave: wave-1
27
+ validation_batch: backend-unit-wave-1
28
+ validation_timing: batch_end
29
+ requires_verify_before_next: false
30
+ validation:
31
+ - npm test => AC-1, AC-2
32
+ risk:
33
+ - parser boundary
34
+ \`\`\`
35
+
36
+ #### Boundary
37
+
38
+ Only parse Markdown metadata; do not execute tasks.
39
+
40
+ #### Acceptance
41
+
42
+ - Task metadata is structured.
43
+ - Boundary is retained.
44
+
45
+ #### Implementation Notes
46
+
47
+ None yet.
48
+ `;
49
+ const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
50
+
51
+ assert.equal(model.gaps.length, 0);
52
+ assert.equal(model.tasks.length, 1);
53
+ assert.equal(model.tasks[0].id, 'T1');
54
+ assert.equal(model.tasks[0].status, 'pending');
55
+ assert.equal(model.tasks[0].wave, 1);
56
+ assert.deepEqual(model.tasks[0].dependsOn, []);
57
+ assert.deepEqual(model.tasks[0].affectedFiles, ['packages/core/src/index.ts']);
58
+ assert.equal(model.tasks[0].changeSurface, 'backend_only');
59
+ assert.equal(model.tasks[0].implementationWave, 'wave-1');
60
+ assert.equal(model.tasks[0].validationBatch, 'backend-unit-wave-1');
61
+ assert.equal(model.tasks[0].validationTiming, 'batch_end');
62
+ assert.equal(model.tasks[0].requiresVerifyBeforeNext, false);
63
+ assert.deepEqual(model.tasks[0].validation, ['npm test']);
64
+ assert.deepEqual(model.tasks[0].validationCommands, [{ command: 'npm test', acceptanceRefs: ['AC-1', 'AC-2'], raw: 'npm test => AC-1, AC-2' }]);
65
+ assert.deepEqual(model.tasks[0].risk, ['parser boundary']);
66
+ assert.match(model.tasks[0].boundary ?? '', /Only parse Markdown metadata/);
67
+ assert.deepEqual(model.tasks[0].acceptance, ['Task metadata is structured.', 'Boundary is retained.']);
68
+ });
69
+
70
+ test('parseSddTasksMarkdown stops companion sections at next major section', () => {
71
+ const markdown = `# Tasks
72
+
73
+ ## Implementation Tasks
74
+
75
+ ### T2: Update JSP report page
76
+
77
+ \`\`\`sdd-task
78
+ id: T2
79
+ status: pending
80
+ workType: implementation
81
+ unitType: frontend
82
+ change_surface: frontend_only
83
+ \`\`\`
84
+
85
+ #### Implementation Notes
86
+
87
+ Use the renew report JSP only as a style reference.
88
+
89
+ ## Validation Tasks
90
+
91
+ ### T3: Validate JSP report page
92
+
93
+ \`\`\`sdd-task
94
+ id: T3
95
+ status: pending
96
+ workType: test
97
+ \`\`\`
98
+ `;
99
+ const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md', validateDependencies: false });
100
+
101
+ assert.equal(model.tasks[0].implementationNotes, 'Use the renew report JSP only as a style reference.');
102
+ assert.doesNotMatch(model.tasks[0].implementationNotes ?? '', /Validation Tasks/);
103
+ });
104
+
105
+ test('parseSddTasksMarkdown accepts cli-only change surface', () => {
106
+ const markdown = `# Tasks
107
+
108
+ ### T1: CLI status summary
109
+
110
+ \`\`\`sdd-task
111
+ id: T1
112
+ status: pending
113
+ wave: 1
114
+ depends_on: []
115
+ affected_files:
116
+ - packages/cli/src/commands/status.ts
117
+ change_surface: cli_only
118
+ validation:
119
+ - node --test --import tsx packages/cli/src/commands/cli-regression.test.ts
120
+ \`\`\`
121
+
122
+ #### Boundary
123
+
124
+ Only update the CLI status summary.
125
+
126
+ #### Acceptance
127
+
128
+ - CLI status summary renders accepted refs.
129
+ `;
130
+ const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
131
+
132
+ assert.equal(model.gaps.some((gap) => gap.field === 'change_surface'), false);
133
+ assert.equal(model.tasks[0].changeSurface, 'cli_only');
134
+ });
135
+
136
+ test('parseSddTasksMarkdown blocks backend build validation for frontend-only tasks', () => {
137
+ const markdown = `# Tasks
138
+
139
+ ### T23: JSP rendering copy update
140
+
141
+ \`\`\`sdd-task
142
+ id: T23
143
+ status: pending
144
+ wave: 1
145
+ depends_on: []
146
+ affected_files:
147
+ - emp-upms/emp-upms-server/src/main/webapp/WEB-INF/views/demo.jsp
148
+ - emp-upms/emp-upms-server/src/main/webapp/static/img/banner.svg
149
+ validation:
150
+ - mvn compile -Ptest -pl emp-upms/emp-upms-server -am
151
+ risk: []
152
+ \`\`\`
153
+
154
+ #### Boundary
155
+
156
+ Only JSP copy and static image rendering.
157
+
158
+ #### Acceptance
159
+
160
+ - JSP copy renders correctly.
161
+ `;
162
+ const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
163
+
164
+ assert.equal(model.gaps.some((gap) => gap.taskId === 'T23' && gap.field === 'validation' && /frontend-only/.test(gap.message)), true);
165
+ assert.equal(model.gaps.some((gap) => /Maven\/Gradle/.test(gap.recommendation)), true);
166
+ });
167
+
168
+ test('parseSddTasksMarkdown validates Phase 8.19 batch contract fields', () => {
169
+ const markdown = `# Tasks
170
+
171
+ ### T24: Invalid batch contract
172
+
173
+ \`\`\`sdd-task
174
+ id: T24
175
+ status: pending
176
+ wave: 1
177
+ depends_on: []
178
+ affected_files:
179
+ - packages/core/src/index.ts
180
+ change_surface: api_only
181
+ validation_timing: batch_end
182
+ requires_verify_before_next: sometimes
183
+ validation:
184
+ - npm test
185
+ risk: []
186
+ \`\`\`
187
+
188
+ #### Boundary
189
+
190
+ Stay in parser scope.
191
+
192
+ #### Acceptance
193
+
194
+ - Parser blocks invalid batch contract.
195
+ `;
196
+ const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
197
+ const fields = model.gaps.map((gap) => gap.field);
198
+
199
+ assert.equal(fields.includes('change_surface'), true);
200
+ assert.equal(fields.includes('validation_batch'), true);
201
+ assert.equal(fields.includes('requires_verify_before_next'), true);
202
+ });
203
+
204
+ test('hashTasksContract includes Phase 8.19 validation grouping fields', () => {
205
+ const base = `# Tasks
206
+
207
+ ### T1: Hash grouping
208
+
209
+ \`\`\`sdd-task
210
+ id: T1
211
+ status: pending
212
+ wave: 1
213
+ depends_on: []
214
+ affected_files:
215
+ - packages/core/src/index.ts
216
+ change_surface: backend_only
217
+ implementation_wave: wave-1
218
+ validation_batch: batch-a
219
+ validation_timing: batch_end
220
+ requires_verify_before_next: false
221
+ validation:
222
+ - npm test
223
+ risk: []
224
+ \`\`\`
225
+
226
+ #### Boundary
227
+
228
+ Stay in parser scope.
229
+
230
+ #### Acceptance
231
+
232
+ - Hash includes validation grouping.
233
+ `;
234
+ const changed = base.replace('validation_batch: batch-a', 'validation_batch: batch-b');
235
+
236
+ assert.notEqual(hashTasksContract(base), hashTasksContract(changed));
237
+ });
238
+
239
+ test('parseSddBranch separates raw doc hash from semantic tasks contract hash', async () => {
240
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-contract-hash-'));
241
+ try {
242
+ const branchDir = path.join(root, 'specs', 'feature');
243
+ await mkdir(branchDir, { recursive: true });
244
+ await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
245
+ await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
246
+ const original = validTaskMarkdown('T1', []);
247
+ await writeFile(path.join(branchDir, 'tasks.md'), original, 'utf8');
248
+ const base = await parseSddBranch(root, 'feature');
249
+
250
+ await writeFile(path.join(branchDir, 'tasks.md'), `${original}\n\n<!-- formatting-only note -->\n`, 'utf8');
251
+ const formattingOnly = await parseSddBranch(root, 'feature');
252
+
253
+ await writeFile(path.join(branchDir, 'tasks.md'), original.replace('risk: []', 'risk:\n - security'), 'utf8');
254
+ const semanticChange = await parseSddBranch(root, 'feature');
255
+
256
+ assert.notEqual(formattingOnly.documents.tasksHash, base.documents.tasksHash);
257
+ assert.equal(formattingOnly.documents.tasksContractHash, base.documents.tasksContractHash);
258
+ assert.notEqual(semanticChange.documents.tasksContractHash, base.documents.tasksContractHash);
259
+ } finally {
260
+ await rm(root, { recursive: true, force: true });
261
+ }
262
+ });
263
+
264
+ test('parseSddTasksMarkdown does not leak companion sections across indented task headings', () => {
265
+ const markdown = `# Tasks
266
+
267
+ ### ERP-SCRK-1: 固化入库同步状态机边界
268
+
269
+ \`\`\`sdd-task
270
+ id: ERP-SCRK-1
271
+ status: pending
272
+ wave: 1
273
+ depends_on: []
274
+ affected_files:
275
+ - src/main/java/com/acme/erp/InboundSyncService.java
276
+ validation:
277
+ - mvn test -Dtest=InboundSyncServiceTest
278
+ risk:
279
+ - state-machine
280
+ \`\`\`
281
+
282
+ #### Boundary
283
+
284
+ Only state-machine logic.
285
+
286
+ #### Acceptance
287
+
288
+ - Terminal states never roll back.
289
+
290
+ ### ERP-SCRK-2: 移除 Mapper SQL 拼接
291
+
292
+ \`\`\`sdd-task
293
+ id: ERP-SCRK-2
294
+ status: pending
295
+ wave: 2
296
+ depends_on:
297
+ - ERP-SCRK-1
298
+ affected_files:
299
+ - src/main/java/com/acme/erp/InboundSyncMapper.java
300
+ validation:
301
+ - mvn test
302
+ risk:
303
+ - sql
304
+ \`\`\`
305
+
306
+ #### Boundary
307
+
308
+ Only mapper SQL parameterization.
309
+
310
+ #### Acceptance
311
+
312
+ - Mapper has no SQL string concatenation.
313
+ `;
314
+ const model = parseSddTasksMarkdown(markdown, { tasksPath: 'specs/master/tasks.md' });
315
+
316
+ assert.equal(model.gaps.length, 0);
317
+ assert.equal(model.tasks.length, 2);
318
+ assert.deepEqual(model.tasks[0].acceptance, ['Terminal states never roll back.']);
319
+ assert.deepEqual(model.tasks[1].acceptance, ['Mapper has no SQL string concatenation.']);
320
+ assert.doesNotMatch(model.tasks[0].boundary ?? '', /Mapper SQL/);
321
+ });
322
+
323
+ test('parseSddTasksMarkdown reports task metadata and dependency gaps', () => {
324
+ const markdown = `# Tasks
325
+
326
+ ### T2: Gap case
327
+
328
+ \`\`\`sdd-task
329
+ id: T2
330
+ status: surprise
331
+ depends_on:
332
+ - T404
333
+ affected_files: []
334
+ validation: []
335
+ risk: []
336
+ \`\`\`
337
+ `;
338
+ const model = parseSddTasksMarkdown(markdown);
339
+ const fields = model.gaps.map((gap) => gap.field);
340
+
341
+ assert.equal(model.tasks.length, 1);
342
+ assert.equal(model.gaps.every((gap) => gap.severity === 'blocking'), true);
343
+ assert.equal(fields.includes('status'), true);
344
+ assert.equal(fields.includes('wave'), true);
345
+ assert.equal(fields.includes('affected_files'), true);
346
+ assert.equal(fields.includes('validation'), true);
347
+ assert.equal(fields.includes('Boundary'), true);
348
+ assert.equal(fields.includes('Acceptance'), true);
349
+ assert.equal(fields.includes('depends_on'), true);
350
+ assert.match(renderTaskGapReport({
351
+ branch: 'master',
352
+ specPath: 'spec.md',
353
+ planPath: 'plan.md',
354
+ tasksPath: 'tasks.md',
355
+ verifyPath: 'verify.md',
356
+ documents: { specExists: true, planExists: true, tasksExists: true, verifyExists: true },
357
+ tasks: model.tasks,
358
+ gaps: model.gaps
359
+ }), /BLOCKED/);
360
+ });
361
+
362
+ test('parseSddBranch reads branch docs and inspectSddTask filters gaps', async () => {
363
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-parser-'));
364
+ try {
365
+ const branchDir = path.join(root, 'specs', 'feature');
366
+ await mkdir(branchDir, { recursive: true });
367
+ await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
368
+ await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
369
+ await writeFile(path.join(branchDir, 'tasks.md'), `# Tasks
370
+
371
+ ### T1: Valid task
372
+
373
+ \`\`\`sdd-task
374
+ id: T1
375
+ status: pending
376
+ wave: 1
377
+ depends_on: []
378
+ affected_files:
379
+ - a.ts
380
+ validation:
381
+ - npm test
382
+ risk: []
383
+ \`\`\`
384
+
385
+ #### Boundary
386
+
387
+ Stay in a.ts.
388
+
389
+ #### Acceptance
390
+
391
+ - a.ts behavior is covered.
392
+ `, 'utf8');
393
+
394
+ const model = await parseSddBranch(root, 'feature');
395
+ const inspected = inspectSddTask(model, 'T1');
396
+
397
+ assert.equal(model.documents.specExists, true);
398
+ assert.equal(model.documents.planExists, true);
399
+ assert.equal(model.documents.tasksExists, true);
400
+ assert.equal(model.gaps.length, 0);
401
+ assert.equal(inspected.task?.id, 'T1');
402
+ assert.equal(inspected.gaps.length, 0);
403
+ } finally {
404
+ await rm(root, { recursive: true, force: true });
405
+ }
406
+ });
407
+
408
+ test('retained phase fallback detects aggregate duplicate task ids and inspect ambiguity', async () => {
409
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-duplicate-'));
410
+ try {
411
+ const branchDir = path.join(root, 'specs', 'feature');
412
+ await mkdir(branchDir, { recursive: true });
413
+ await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
414
+ await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
415
+ await writeFile(path.join(branchDir, 'tasks.md'), '# Tasks\nLegacy index only.\n', 'utf8');
416
+ await writeFile(path.join(branchDir, 'phase1.0-tasks.md'), validTaskMarkdown('T1', []), 'utf8');
417
+ await writeFile(path.join(branchDir, 'phase1.1-tasks.md'), validTaskMarkdown('T1', []), 'utf8');
418
+
419
+ const model = await parseSddBranch(root, 'feature');
420
+ const inspected = inspectSddTask(model, 'T1');
421
+
422
+ assert.equal(model.tasks.length, 2);
423
+ assert.equal(model.gaps.some((gap) => gap.field === 'id' && gap.taskId === 'T1' && /Duplicate task id T1 across parsed task files/.test(gap.message)), true);
424
+ assert.equal(inspected.task, null);
425
+ assert.equal(inspected.gaps.some((gap) => /ambiguous/.test(gap.message)), true);
426
+ } finally {
427
+ await rm(root, { recursive: true, force: true });
428
+ }
429
+ });
430
+
431
+ test('retained phase fallback validates cross-file dependencies over aggregate tasks', async () => {
432
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-cross-deps-'));
433
+ try {
434
+ const branchDir = path.join(root, 'specs', 'feature');
435
+ await mkdir(branchDir, { recursive: true });
436
+ await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
437
+ await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
438
+ await writeFile(path.join(branchDir, 'tasks.md'), '# Tasks\nLegacy index only.\n', 'utf8');
439
+ await writeFile(path.join(branchDir, 'phase1.0-tasks.md'), validTaskMarkdown('P1.0-T1', []), 'utf8');
440
+ await writeFile(path.join(branchDir, 'phase1.1-tasks.md'), validTaskMarkdown('P1.1-T1', ['P1.0-T1']), 'utf8');
441
+
442
+ const model = await parseSddBranch(root, 'feature');
443
+
444
+ assert.equal(model.tasks.length, 2);
445
+ assert.equal(model.gaps.length, 0);
446
+ } finally {
447
+ await rm(root, { recursive: true, force: true });
448
+ }
449
+ });
450
+
451
+ test('retained phase fallback still reports unknown dependencies', async () => {
452
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-unknown-deps-'));
453
+ try {
454
+ const branchDir = path.join(root, 'specs', 'feature');
455
+ await mkdir(branchDir, { recursive: true });
456
+ await writeFile(path.join(branchDir, 'spec.md'), '# Spec\n', 'utf8');
457
+ await writeFile(path.join(branchDir, 'plan.md'), '# Plan\n', 'utf8');
458
+ await writeFile(path.join(branchDir, 'tasks.md'), '# Tasks\nLegacy index only.\n', 'utf8');
459
+ await writeFile(path.join(branchDir, 'phase1.0-tasks.md'), validTaskMarkdown('P1.0-T1', ['P9.9-T404']), 'utf8');
460
+
461
+ const model = await parseSddBranch(root, 'feature');
462
+
463
+ assert.equal(model.gaps.some((gap) => gap.type === 'Dependency Gap' && gap.taskId === 'P1.0-T1' && /unknown task P9.9-T404/.test(gap.message)), true);
464
+ } finally {
465
+ await rm(root, { recursive: true, force: true });
466
+ }
467
+ });