sdd-agent-platform 0.4.0 → 0.4.2

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 (801) hide show
  1. package/README.md +36 -39
  2. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js +72 -71
  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 +64 -9
  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 +0 -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 +26 -17
  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 +3 -0
  11. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js +13 -9
  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 +3 -1
  14. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js +7 -3
  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 +4 -4
  17. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js +16 -20
  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 +1 -7
  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 +26 -8
  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 +4 -1
  28. package/node_modules/@sdd-agent-platform/core/dist/contracts.js +3 -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 +3 -0
  31. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.d.ts +3 -0
  32. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.js +7 -4
  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 +1 -1
  35. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js.map +1 -1
  36. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js +8 -8
  37. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js.map +1 -1
  38. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js +0 -1
  39. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js.map +1 -1
  40. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js +7 -7
  41. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js.map +1 -1
  42. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js +0 -24
  43. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js.map +1 -1
  44. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js +1 -1
  45. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  46. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js +277 -3
  47. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js.map +1 -1
  48. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.d.ts +23 -0
  49. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js +61 -0
  50. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js.map +1 -0
  51. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/contracts.d.ts +11 -1
  52. package/node_modules/@sdd-agent-platform/core/dist/execution/agent-execution-records.js +15 -8
  53. package/node_modules/@sdd-agent-platform/core/dist/execution/agent-execution-records.js.map +1 -1
  54. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js +4 -4
  55. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js.map +1 -1
  56. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js +3 -3
  57. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js.map +1 -1
  58. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js +5 -4
  59. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js.map +1 -1
  60. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js +16 -7
  61. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js.map +1 -1
  62. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.d.ts +112 -0
  63. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js +145 -0
  64. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js.map +1 -0
  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 +59 -66
  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 +3 -0
  74. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js +55 -19
  75. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js.map +1 -1
  76. package/node_modules/@sdd-agent-platform/core/dist/orchestration/contracts.d.ts +1 -1
  77. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.d.ts +12 -2
  78. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js +62 -21
  79. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js.map +1 -1
  80. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.d.ts +20 -2
  81. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js +218 -18
  82. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js.map +1 -1
  83. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js +17 -17
  84. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js.map +1 -1
  85. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.d.ts +10 -0
  86. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js +32 -2
  87. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js.map +1 -1
  88. package/node_modules/@sdd-agent-platform/core/dist/registries/capability-sources.d.ts +2 -17
  89. package/node_modules/@sdd-agent-platform/core/dist/registries/capability-sources.js +222 -10
  90. package/node_modules/@sdd-agent-platform/core/dist/registries/capability-sources.js.map +1 -1
  91. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.d.ts +1 -1
  92. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js +9 -9
  93. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js.map +1 -1
  94. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js +4 -4
  95. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js.map +1 -1
  96. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js +2 -2
  97. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js.map +1 -1
  98. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js +3 -3
  99. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js.map +1 -1
  100. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js +2 -2
  101. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js.map +1 -1
  102. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js +11 -11
  103. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js.map +1 -1
  104. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js +12 -12
  105. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js.map +1 -1
  106. package/node_modules/@sdd-agent-platform/core/dist/risk/contracts.d.ts +2 -2
  107. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js +4 -4
  108. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js.map +1 -1
  109. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js +4 -7
  110. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js.map +1 -1
  111. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.d.ts +2 -2
  112. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js +19 -17
  113. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js.map +1 -1
  114. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime-config.js +28 -13
  115. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime-config.js.map +1 -1
  116. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime.d.ts +61 -1
  117. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.d.ts +3 -1
  118. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js +192 -1
  119. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js.map +1 -1
  120. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js +73 -17
  121. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js.map +1 -1
  122. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.d.ts +28 -0
  123. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js +373 -0
  124. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js.map +1 -0
  125. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-inspection.js +11 -4
  126. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-inspection.js.map +1 -1
  127. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js +31 -3
  128. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js.map +1 -1
  129. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.d.ts +37 -0
  130. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js +235 -0
  131. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js.map +1 -0
  132. package/node_modules/@sdd-agent-platform/core/dist/router.d.ts +2 -0
  133. package/node_modules/@sdd-agent-platform/core/dist/router.js +2 -0
  134. package/node_modules/@sdd-agent-platform/core/dist/router.js.map +1 -1
  135. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.d.ts +16 -0
  136. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js +168 -18
  137. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js.map +1 -1
  138. package/node_modules/@sdd-agent-platform/core/dist/run-state/events.js +2 -2
  139. package/node_modules/@sdd-agent-platform/core/dist/run-state/events.js.map +1 -1
  140. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.d.ts +3 -3
  141. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js +22 -54
  142. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js.map +1 -1
  143. package/node_modules/@sdd-agent-platform/core/dist/run-state/invocation-ledger.js +2 -2
  144. package/node_modules/@sdd-agent-platform/core/dist/run-state/invocation-ledger.js.map +1 -1
  145. package/node_modules/@sdd-agent-platform/core/dist/run-state/model.d.ts +53 -9
  146. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.d.ts +0 -2
  147. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js +1 -3
  148. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js.map +1 -1
  149. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js +51 -34
  150. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js.map +1 -1
  151. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.d.ts +65 -0
  152. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js +169 -0
  153. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js.map +1 -0
  154. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.d.ts +8 -0
  155. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.js +131 -0
  156. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.js.map +1 -0
  157. package/node_modules/@sdd-agent-platform/core/dist/run-state.d.ts +2 -0
  158. package/node_modules/@sdd-agent-platform/core/dist/run-state.js +2 -0
  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 +0 -3
  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 +5 -44
  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 -17
  165. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.d.ts +20 -0
  166. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js +109 -14
  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 +64 -0
  169. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js +200 -0
  170. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js.map +1 -0
  171. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/context.js +1 -1
  172. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/context.js.map +1 -1
  173. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.d.ts +6 -0
  174. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js +276 -0
  175. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js.map +1 -0
  176. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.d.ts +1 -1
  177. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js +15 -4
  178. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js.map +1 -1
  179. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.d.ts +21 -0
  180. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js +139 -38
  181. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js.map +1 -1
  182. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.d.ts +55 -0
  183. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js +322 -0
  184. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js.map +1 -0
  185. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.d.ts +55 -0
  186. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js +241 -0
  187. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js.map +1 -0
  188. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.d.ts +888 -0
  189. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js +3870 -0
  190. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js.map +1 -0
  191. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js +8 -1
  192. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js.map +1 -1
  193. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.d.ts +105 -1
  194. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js +343 -8
  195. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js.map +1 -1
  196. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.d.ts +348 -3
  197. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js +1017 -8
  198. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js.map +1 -1
  199. package/node_modules/@sdd-agent-platform/core/dist/subagents/contracts.d.ts +1 -1
  200. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js +7 -7
  201. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js.map +1 -1
  202. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js +21 -0
  203. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js.map +1 -1
  204. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.d.ts +1 -1
  205. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js +19 -20
  206. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js.map +1 -1
  207. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.d.ts +44 -0
  208. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js +138 -0
  209. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js.map +1 -0
  210. package/node_modules/@sdd-agent-platform/core/dist/tsconfig.tsbuildinfo +1 -1
  211. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.d.ts +0 -1
  212. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js +44 -37
  213. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js.map +1 -1
  214. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.d.ts +0 -2
  215. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js +19 -49
  216. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js.map +1 -1
  217. package/node_modules/@sdd-agent-platform/core/dist/verification/review-gate.d.ts +22 -0
  218. package/node_modules/@sdd-agent-platform/core/dist/verification/review-gate.js +53 -0
  219. package/node_modules/@sdd-agent-platform/core/dist/verification/review-gate.js.map +1 -0
  220. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.d.ts +0 -1
  221. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js +213 -111
  222. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js.map +1 -1
  223. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.d.ts +28 -3
  224. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js +546 -125
  225. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js.map +1 -1
  226. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.d.ts +26 -0
  227. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.js +73 -0
  228. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.js.map +1 -0
  229. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.d.ts +76 -0
  230. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js +450 -0
  231. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js.map +1 -0
  232. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.d.ts +3 -1
  233. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js +105 -30
  234. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js.map +1 -1
  235. package/node_modules/@sdd-agent-platform/core/dist/verification.d.ts +2 -0
  236. package/node_modules/@sdd-agent-platform/core/dist/verification.js +2 -0
  237. package/node_modules/@sdd-agent-platform/core/dist/verification.js.map +1 -1
  238. package/node_modules/@sdd-agent-platform/core/dist/work-units/contracts.d.ts +1 -1
  239. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.d.ts +24 -0
  240. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js +395 -0
  241. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js.map +1 -0
  242. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.d.ts +4 -0
  243. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js +164 -0
  244. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js.map +1 -0
  245. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.d.ts +4 -0
  246. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js +182 -0
  247. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js.map +1 -0
  248. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.d.ts +88 -0
  249. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.js +2 -0
  250. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.js.map +1 -0
  251. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -1
  252. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js +17 -3
  253. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  254. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/dependencies.d.ts +8 -4
  255. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/dependencies.js +25 -11
  256. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/dependencies.js.map +1 -1
  257. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.d.ts +37 -0
  258. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js +188 -0
  259. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js.map +1 -0
  260. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.d.ts +40 -0
  261. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.js +110 -0
  262. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.js.map +1 -0
  263. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.d.ts +12 -0
  264. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.js +63 -0
  265. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.js.map +1 -0
  266. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.d.ts +21 -0
  267. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.js +95 -0
  268. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.js.map +1 -0
  269. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.d.ts +80 -3
  270. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js +674 -41
  271. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js.map +1 -1
  272. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.d.ts +228 -0
  273. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.js +452 -0
  274. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.js.map +1 -0
  275. package/node_modules/@sdd-agent-platform/core/dist/workflow-state.d.ts +1 -0
  276. package/node_modules/@sdd-agent-platform/core/dist/workflow-state.js +1 -0
  277. package/node_modules/@sdd-agent-platform/core/dist/workflow-state.js.map +1 -1
  278. package/node_modules/@sdd-agent-platform/core/package.json +3 -3
  279. package/node_modules/@sdd-agent-platform/core/src/ai-tools.test.ts +49 -1
  280. package/node_modules/@sdd-agent-platform/core/src/ai-tools.ts +72 -71
  281. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.test.ts +38 -0
  282. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.ts +65 -9
  283. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.ts +0 -1
  284. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.test.ts +52 -6
  285. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.ts +26 -17
  286. package/node_modules/@sdd-agent-platform/core/src/config/init-project.test.ts +44 -29
  287. package/node_modules/@sdd-agent-platform/core/src/config/init-project.ts +15 -11
  288. package/node_modules/@sdd-agent-platform/core/src/config/project-config.ts +10 -4
  289. package/node_modules/@sdd-agent-platform/core/src/config/starter-documents.ts +17 -20
  290. package/node_modules/@sdd-agent-platform/core/src/context/build-package.ts +2 -8
  291. package/node_modules/@sdd-agent-platform/core/src/context/context-build.test.ts +3 -2
  292. package/node_modules/@sdd-agent-platform/core/src/context/evidence-summary.ts +27 -8
  293. package/node_modules/@sdd-agent-platform/core/src/context/log-worker.ts +2 -2
  294. package/node_modules/@sdd-agent-platform/core/src/context-offload/contracts.ts +1 -1
  295. package/node_modules/@sdd-agent-platform/core/src/contracts.ts +4 -1
  296. package/node_modules/@sdd-agent-platform/core/src/delegation/model.ts +3 -0
  297. package/node_modules/@sdd-agent-platform/core/src/delegation/validation.ts +8 -5
  298. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/document-chain.ts +1 -1
  299. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/project.ts +8 -8
  300. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/registries.ts +0 -1
  301. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-evidence.ts +7 -7
  302. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-trust.ts +0 -21
  303. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/runtime-contracts.ts +1 -1
  304. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.test.ts +217 -7
  305. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.ts +301 -3
  306. package/node_modules/@sdd-agent-platform/core/src/evidence/lookup.ts +88 -0
  307. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime/contracts.ts +12 -1
  308. package/node_modules/@sdd-agent-platform/core/src/execution/agent-execution-records.ts +16 -11
  309. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.test.ts +57 -2
  310. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.ts +4 -4
  311. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.test.ts +11 -2
  312. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.ts +3 -3
  313. package/node_modules/@sdd-agent-platform/core/src/execution/host-invocation.ts +5 -4
  314. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.test.ts +17 -1
  315. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.ts +16 -7
  316. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.test.ts +102 -0
  317. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.ts +271 -0
  318. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.test.ts +14 -0
  319. package/node_modules/@sdd-agent-platform/core/src/governance/policy.test.ts +10 -0
  320. package/node_modules/@sdd-agent-platform/core/src/governance/policy.ts +2 -2
  321. package/node_modules/@sdd-agent-platform/core/src/instructions.test.ts +34 -13
  322. package/node_modules/@sdd-agent-platform/core/src/instructions.ts +60 -67
  323. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.test.ts +1 -1
  324. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.ts +1 -1
  325. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.test.ts +47 -0
  326. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.ts +58 -19
  327. package/node_modules/@sdd-agent-platform/core/src/orchestration/contracts.ts +1 -1
  328. package/node_modules/@sdd-agent-platform/core/src/orchestration/runtime.ts +74 -22
  329. package/node_modules/@sdd-agent-platform/core/src/phase8-contracts.test.ts +3 -3
  330. package/node_modules/@sdd-agent-platform/core/src/phase8-risk-kernel.test.ts +8 -3
  331. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.test.ts +2 -0
  332. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.test.ts +3 -0
  333. package/node_modules/@sdd-agent-platform/core/src/registries/agent-capability-catalog.ts +319 -20
  334. package/node_modules/@sdd-agent-platform/core/src/registries/agent-registry.ts +17 -17
  335. package/node_modules/@sdd-agent-platform/core/src/registries/agent-runtime-static.ts +42 -2
  336. package/node_modules/@sdd-agent-platform/core/src/registries/capability-sources.ts +238 -15
  337. package/node_modules/@sdd-agent-platform/core/src/registries/command-team-runtime.ts +10 -10
  338. package/node_modules/@sdd-agent-platform/core/src/registries/eval-learning-context.ts +4 -4
  339. package/node_modules/@sdd-agent-platform/core/src/registries/query-status.ts +2 -2
  340. package/node_modules/@sdd-agent-platform/core/src/registries/registries.test.ts +45 -4
  341. package/node_modules/@sdd-agent-platform/core/src/registries/tool-capabilities.ts +3 -3
  342. package/node_modules/@sdd-agent-platform/core/src/registries/tool-plugins.ts +2 -2
  343. package/node_modules/@sdd-agent-platform/core/src/registries/worker-adapters.ts +11 -11
  344. package/node_modules/@sdd-agent-platform/core/src/registries/workflow-gates.ts +12 -12
  345. package/node_modules/@sdd-agent-platform/core/src/risk/contracts.ts +2 -2
  346. package/node_modules/@sdd-agent-platform/core/src/risk/kernel.ts +4 -4
  347. package/node_modules/@sdd-agent-platform/core/src/risk/legacy-adapters.ts +4 -7
  348. package/node_modules/@sdd-agent-platform/core/src/risk/workflow-gates.ts +20 -18
  349. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime-config.ts +32 -13
  350. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime.ts +68 -1
  351. package/node_modules/@sdd-agent-platform/core/src/router/route-projection.ts +212 -1
  352. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.test.ts +391 -6
  353. package/node_modules/@sdd-agent-platform/core/src/router/routing.ts +78 -17
  354. package/node_modules/@sdd-agent-platform/core/src/router/runtime-import.ts +453 -0
  355. package/node_modules/@sdd-agent-platform/core/src/router/runtime-inspection.ts +11 -4
  356. package/node_modules/@sdd-agent-platform/core/src/router/runtime-validation.ts +32 -3
  357. package/node_modules/@sdd-agent-platform/core/src/router/stage-route-binding.ts +279 -0
  358. package/node_modules/@sdd-agent-platform/core/src/router.ts +2 -0
  359. package/node_modules/@sdd-agent-platform/core/src/run-state/artifacts.ts +173 -18
  360. package/node_modules/@sdd-agent-platform/core/src/run-state/events.ts +2 -2
  361. package/node_modules/@sdd-agent-platform/core/src/run-state/inspect-run.ts +24 -59
  362. package/node_modules/@sdd-agent-platform/core/src/run-state/invocation-ledger.ts +2 -2
  363. package/node_modules/@sdd-agent-platform/core/src/run-state/model.ts +59 -9
  364. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.ts +1 -5
  365. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.test.ts +53 -2
  366. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.ts +55 -41
  367. package/node_modules/@sdd-agent-platform/core/src/run-state/task-evidence.ts +252 -0
  368. package/node_modules/@sdd-agent-platform/core/src/run-state/timing.ts +146 -0
  369. package/node_modules/@sdd-agent-platform/core/src/run-state.ts +2 -0
  370. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/build.ts +0 -3
  371. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/findings.ts +6 -46
  372. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/model.ts +1 -13
  373. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.test.ts +0 -2
  374. package/node_modules/@sdd-agent-platform/core/src/runtime-paths.ts +131 -14
  375. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.test.ts +96 -0
  376. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.ts +292 -0
  377. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/context.ts +1 -1
  378. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/document-hashes.ts +306 -0
  379. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/run-binding.ts +15 -4
  380. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.test.ts +261 -0
  381. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.ts +169 -41
  382. package/node_modules/@sdd-agent-platform/core/src/stage-artifacts.ts +450 -0
  383. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration-contracts.ts +322 -0
  384. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.test.ts +2903 -0
  385. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.ts +5831 -0
  386. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.test.ts +1 -1
  387. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.ts +9 -1
  388. package/node_modules/@sdd-agent-platform/core/src/status/project-status.test.ts +239 -16
  389. package/node_modules/@sdd-agent-platform/core/src/status/project-status.ts +497 -8
  390. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.test.ts +560 -4
  391. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.ts +1510 -9
  392. package/node_modules/@sdd-agent-platform/core/src/subagents/contracts.ts +1 -1
  393. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.test.ts +3 -3
  394. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.ts +7 -7
  395. package/node_modules/@sdd-agent-platform/core/src/test-support/fixtures.ts +21 -0
  396. package/node_modules/@sdd-agent-platform/core/src/test-support/run-state.ts +20 -20
  397. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.test.ts +72 -0
  398. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.ts +177 -0
  399. package/node_modules/@sdd-agent-platform/core/src/verification/goal-verify.test.ts +13 -87
  400. package/node_modules/@sdd-agent-platform/core/src/verification/goal-verify.ts +46 -42
  401. package/node_modules/@sdd-agent-platform/core/src/verification/rendering.ts +18 -52
  402. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.test.ts +84 -0
  403. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.ts +77 -0
  404. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.test.ts +138 -64
  405. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.ts +226 -116
  406. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.test.ts +148 -48
  407. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.ts +619 -136
  408. package/node_modules/@sdd-agent-platform/core/src/verification/validation-cache.ts +106 -0
  409. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.test.ts +383 -0
  410. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.ts +556 -0
  411. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.test.ts +131 -8
  412. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.ts +117 -30
  413. package/node_modules/@sdd-agent-platform/core/src/verification.ts +2 -0
  414. package/node_modules/@sdd-agent-platform/core/src/work-units/contracts.ts +1 -1
  415. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/evidence-packet.ts +425 -0
  416. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.test.ts +507 -0
  417. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.ts +182 -0
  418. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.test.ts +174 -0
  419. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.ts +194 -0
  420. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/types.ts +115 -0
  421. package/node_modules/@sdd-agent-platform/core/src/workflow-state/affected-file-conflicts.ts +19 -4
  422. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.test.ts +1 -1
  423. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.ts +33 -11
  424. package/node_modules/@sdd-agent-platform/core/src/workflow-state/latest-eligible-run.ts +224 -0
  425. package/node_modules/@sdd-agent-platform/core/src/workflow-state/migration-recovery.ts +158 -0
  426. package/node_modules/@sdd-agent-platform/core/src/workflow-state/repair-contract.ts +77 -0
  427. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve-task-run.ts +114 -0
  428. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.test.ts +851 -9
  429. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.ts +862 -45
  430. package/node_modules/@sdd-agent-platform/core/src/workflow-state/runtime-projections.ts +712 -0
  431. package/node_modules/@sdd-agent-platform/core/src/workflow-state.ts +1 -0
  432. package/package.json +1 -1
  433. package/packages/cli/dist/args.js +2 -2
  434. package/packages/cli/dist/args.js.map +1 -1
  435. package/packages/cli/dist/commands/ai-tools.js +13 -2
  436. package/packages/cli/dist/commands/ai-tools.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/execution.js +49 -1
  440. package/packages/cli/dist/commands/execution.js.map +1 -1
  441. package/packages/cli/dist/commands/governance.js +1 -1
  442. package/packages/cli/dist/commands/governance.js.map +1 -1
  443. package/packages/cli/dist/commands/init.js +6 -1
  444. package/packages/cli/dist/commands/init.js.map +1 -1
  445. package/packages/cli/dist/commands/lifecycle.js +15 -2
  446. package/packages/cli/dist/commands/lifecycle.js.map +1 -1
  447. package/packages/cli/dist/commands/registry/runtime.js +48 -2
  448. package/packages/cli/dist/commands/registry/runtime.js.map +1 -1
  449. package/packages/cli/dist/commands/run.js +52 -2
  450. package/packages/cli/dist/commands/run.js.map +1 -1
  451. package/packages/cli/dist/commands/stage-close.d.ts +6 -0
  452. package/packages/cli/dist/commands/stage-close.js +295 -0
  453. package/packages/cli/dist/commands/stage-close.js.map +1 -0
  454. package/packages/cli/dist/commands/status.js +70 -4
  455. package/packages/cli/dist/commands/status.js.map +1 -1
  456. package/packages/cli/dist/commands/tasks.js +4 -4
  457. package/packages/cli/dist/commands/tasks.js.map +1 -1
  458. package/packages/cli/dist/commands/test.js +272 -5
  459. package/packages/cli/dist/commands/test.js.map +1 -1
  460. package/packages/cli/dist/commands/verifies.js +9 -5
  461. package/packages/cli/dist/commands/verifies.js.map +1 -1
  462. package/packages/cli/dist/commands/verify.js +257 -20
  463. package/packages/cli/dist/commands/verify.js.map +1 -1
  464. package/packages/cli/dist/dispatch.js +4 -9
  465. package/packages/cli/dist/dispatch.js.map +1 -1
  466. package/packages/cli/dist/help.js +42 -27
  467. package/packages/cli/dist/help.js.map +1 -1
  468. package/packages/cli/dist/renderers/doctor.js +1 -1
  469. package/packages/cli/dist/renderers/doctor.js.map +1 -1
  470. package/packages/cli/dist/renderers/execution.js +1 -1
  471. package/packages/cli/dist/renderers/execution.js.map +1 -1
  472. package/packages/cli/dist/renderers/json.d.ts +1 -0
  473. package/packages/cli/dist/renderers/json.js +3 -0
  474. package/packages/cli/dist/renderers/json.js.map +1 -1
  475. package/packages/cli/dist/renderers/registry-runtime.d.ts +2 -1
  476. package/packages/cli/dist/renderers/registry-runtime.js +27 -2
  477. package/packages/cli/dist/renderers/registry-runtime.js.map +1 -1
  478. package/packages/cli/dist/renderers/router.js +5 -3
  479. package/packages/cli/dist/renderers/router.js.map +1 -1
  480. package/packages/cli/dist/renderers/workflow.d.ts +0 -4
  481. package/packages/cli/dist/renderers/workflow.js +46 -84
  482. package/packages/cli/dist/renderers/workflow.js.map +1 -1
  483. package/packages/cli/dist/skill-import-args.d.ts +10 -0
  484. package/packages/cli/dist/skill-import-args.js +47 -0
  485. package/packages/cli/dist/skill-import-args.js.map +1 -0
  486. package/packages/cli/dist/tsconfig.tsbuildinfo +1 -1
  487. package/packages/cli/package.json +2 -2
  488. package/packages/core/dist/ai-tools.js +72 -71
  489. package/packages/core/dist/ai-tools.js.map +1 -1
  490. package/packages/core/dist/artifacts/ingestion.js +64 -9
  491. package/packages/core/dist/artifacts/ingestion.js.map +1 -1
  492. package/packages/core/dist/artifacts/sdd-evidence.js +0 -1
  493. package/packages/core/dist/artifacts/sdd-evidence.js.map +1 -1
  494. package/packages/core/dist/artifacts/sdd-result.js +26 -17
  495. package/packages/core/dist/artifacts/sdd-result.js.map +1 -1
  496. package/packages/core/dist/config/init-project.d.ts +3 -0
  497. package/packages/core/dist/config/init-project.js +13 -9
  498. package/packages/core/dist/config/init-project.js.map +1 -1
  499. package/packages/core/dist/config/project-config.d.ts +3 -1
  500. package/packages/core/dist/config/project-config.js +7 -3
  501. package/packages/core/dist/config/project-config.js.map +1 -1
  502. package/packages/core/dist/config/starter-documents.d.ts +4 -4
  503. package/packages/core/dist/config/starter-documents.js +16 -20
  504. package/packages/core/dist/config/starter-documents.js.map +1 -1
  505. package/packages/core/dist/context/build-package.d.ts +1 -1
  506. package/packages/core/dist/context/build-package.js +1 -7
  507. package/packages/core/dist/context/build-package.js.map +1 -1
  508. package/packages/core/dist/context/evidence-summary.js +26 -8
  509. package/packages/core/dist/context/evidence-summary.js.map +1 -1
  510. package/packages/core/dist/context/log-worker.js +2 -2
  511. package/packages/core/dist/context/log-worker.js.map +1 -1
  512. package/packages/core/dist/context-offload/contracts.d.ts +1 -1
  513. package/packages/core/dist/contracts.d.ts +4 -1
  514. package/packages/core/dist/contracts.js +3 -0
  515. package/packages/core/dist/contracts.js.map +1 -1
  516. package/packages/core/dist/delegation/model.d.ts +3 -0
  517. package/packages/core/dist/delegation/validation.d.ts +3 -0
  518. package/packages/core/dist/delegation/validation.js +7 -4
  519. package/packages/core/dist/delegation/validation.js.map +1 -1
  520. package/packages/core/dist/doctor/checks/document-chain.js +1 -1
  521. package/packages/core/dist/doctor/checks/document-chain.js.map +1 -1
  522. package/packages/core/dist/doctor/checks/project.js +8 -8
  523. package/packages/core/dist/doctor/checks/project.js.map +1 -1
  524. package/packages/core/dist/doctor/checks/registries.js +0 -1
  525. package/packages/core/dist/doctor/checks/registries.js.map +1 -1
  526. package/packages/core/dist/doctor/checks/run-evidence.js +7 -7
  527. package/packages/core/dist/doctor/checks/run-evidence.js.map +1 -1
  528. package/packages/core/dist/doctor/checks/run-trust.js +0 -24
  529. package/packages/core/dist/doctor/checks/run-trust.js.map +1 -1
  530. package/packages/core/dist/doctor/checks/runtime-contracts.js +1 -1
  531. package/packages/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  532. package/packages/core/dist/doctor/doctor.js +277 -3
  533. package/packages/core/dist/doctor/doctor.js.map +1 -1
  534. package/packages/core/dist/evidence/lookup.d.ts +23 -0
  535. package/packages/core/dist/evidence/lookup.js +61 -0
  536. package/packages/core/dist/evidence/lookup.js.map +1 -0
  537. package/packages/core/dist/evidence-runtime/contracts.d.ts +11 -1
  538. package/packages/core/dist/execution/agent-execution-records.js +15 -8
  539. package/packages/core/dist/execution/agent-execution-records.js.map +1 -1
  540. package/packages/core/dist/execution/background-executor.js +4 -4
  541. package/packages/core/dist/execution/background-executor.js.map +1 -1
  542. package/packages/core/dist/execution/foreground-subagents.js +3 -3
  543. package/packages/core/dist/execution/foreground-subagents.js.map +1 -1
  544. package/packages/core/dist/execution/host-invocation.js +5 -4
  545. package/packages/core/dist/execution/host-invocation.js.map +1 -1
  546. package/packages/core/dist/execution/resident-worker.js +16 -7
  547. package/packages/core/dist/execution/resident-worker.js.map +1 -1
  548. package/packages/core/dist/execution/stage-team-runtime.d.ts +112 -0
  549. package/packages/core/dist/execution/stage-team-runtime.js +145 -0
  550. package/packages/core/dist/execution/stage-team-runtime.js.map +1 -0
  551. package/packages/core/dist/governance/policy.d.ts +1 -1
  552. package/packages/core/dist/governance/policy.js +1 -1
  553. package/packages/core/dist/governance/policy.js.map +1 -1
  554. package/packages/core/dist/instructions.d.ts +1 -1
  555. package/packages/core/dist/instructions.js +59 -66
  556. package/packages/core/dist/instructions.js.map +1 -1
  557. package/packages/core/dist/lifecycle/decision-gate.js +1 -1
  558. package/packages/core/dist/lifecycle/decision-gate.js.map +1 -1
  559. package/packages/core/dist/lifecycle/ship.d.ts +3 -0
  560. package/packages/core/dist/lifecycle/ship.js +55 -19
  561. package/packages/core/dist/lifecycle/ship.js.map +1 -1
  562. package/packages/core/dist/orchestration/contracts.d.ts +1 -1
  563. package/packages/core/dist/orchestration/runtime.d.ts +12 -2
  564. package/packages/core/dist/orchestration/runtime.js +62 -21
  565. package/packages/core/dist/orchestration/runtime.js.map +1 -1
  566. package/packages/core/dist/registries/agent-capability-catalog.d.ts +20 -2
  567. package/packages/core/dist/registries/agent-capability-catalog.js +218 -18
  568. package/packages/core/dist/registries/agent-capability-catalog.js.map +1 -1
  569. package/packages/core/dist/registries/agent-registry.js +17 -17
  570. package/packages/core/dist/registries/agent-registry.js.map +1 -1
  571. package/packages/core/dist/registries/agent-runtime-static.d.ts +10 -0
  572. package/packages/core/dist/registries/agent-runtime-static.js +32 -2
  573. package/packages/core/dist/registries/agent-runtime-static.js.map +1 -1
  574. package/packages/core/dist/registries/capability-sources.d.ts +2 -17
  575. package/packages/core/dist/registries/capability-sources.js +222 -10
  576. package/packages/core/dist/registries/capability-sources.js.map +1 -1
  577. package/packages/core/dist/registries/command-team-runtime.d.ts +1 -1
  578. package/packages/core/dist/registries/command-team-runtime.js +9 -9
  579. package/packages/core/dist/registries/command-team-runtime.js.map +1 -1
  580. package/packages/core/dist/registries/eval-learning-context.js +4 -4
  581. package/packages/core/dist/registries/eval-learning-context.js.map +1 -1
  582. package/packages/core/dist/registries/query-status.js +2 -2
  583. package/packages/core/dist/registries/query-status.js.map +1 -1
  584. package/packages/core/dist/registries/tool-capabilities.js +3 -3
  585. package/packages/core/dist/registries/tool-capabilities.js.map +1 -1
  586. package/packages/core/dist/registries/tool-plugins.js +2 -2
  587. package/packages/core/dist/registries/tool-plugins.js.map +1 -1
  588. package/packages/core/dist/registries/worker-adapters.js +11 -11
  589. package/packages/core/dist/registries/worker-adapters.js.map +1 -1
  590. package/packages/core/dist/registries/workflow-gates.js +12 -12
  591. package/packages/core/dist/registries/workflow-gates.js.map +1 -1
  592. package/packages/core/dist/risk/contracts.d.ts +2 -2
  593. package/packages/core/dist/risk/kernel.js +4 -4
  594. package/packages/core/dist/risk/kernel.js.map +1 -1
  595. package/packages/core/dist/risk/legacy-adapters.js +4 -7
  596. package/packages/core/dist/risk/legacy-adapters.js.map +1 -1
  597. package/packages/core/dist/risk/workflow-gates.d.ts +2 -2
  598. package/packages/core/dist/risk/workflow-gates.js +19 -17
  599. package/packages/core/dist/risk/workflow-gates.js.map +1 -1
  600. package/packages/core/dist/router/agent-runtime-config.js +28 -13
  601. package/packages/core/dist/router/agent-runtime-config.js.map +1 -1
  602. package/packages/core/dist/router/agent-runtime.d.ts +61 -1
  603. package/packages/core/dist/router/route-projection.d.ts +3 -1
  604. package/packages/core/dist/router/route-projection.js +192 -1
  605. package/packages/core/dist/router/route-projection.js.map +1 -1
  606. package/packages/core/dist/router/routing.js +73 -17
  607. package/packages/core/dist/router/routing.js.map +1 -1
  608. package/packages/core/dist/router/runtime-import.d.ts +28 -0
  609. package/packages/core/dist/router/runtime-import.js +373 -0
  610. package/packages/core/dist/router/runtime-import.js.map +1 -0
  611. package/packages/core/dist/router/runtime-inspection.js +11 -4
  612. package/packages/core/dist/router/runtime-inspection.js.map +1 -1
  613. package/packages/core/dist/router/runtime-validation.js +31 -3
  614. package/packages/core/dist/router/runtime-validation.js.map +1 -1
  615. package/packages/core/dist/router/stage-route-binding.d.ts +37 -0
  616. package/packages/core/dist/router/stage-route-binding.js +235 -0
  617. package/packages/core/dist/router/stage-route-binding.js.map +1 -0
  618. package/packages/core/dist/router.d.ts +2 -0
  619. package/packages/core/dist/router.js +2 -0
  620. package/packages/core/dist/router.js.map +1 -1
  621. package/packages/core/dist/run-state/artifacts.d.ts +16 -0
  622. package/packages/core/dist/run-state/artifacts.js +168 -18
  623. package/packages/core/dist/run-state/artifacts.js.map +1 -1
  624. package/packages/core/dist/run-state/events.js +2 -2
  625. package/packages/core/dist/run-state/events.js.map +1 -1
  626. package/packages/core/dist/run-state/inspect-run.d.ts +3 -3
  627. package/packages/core/dist/run-state/inspect-run.js +22 -54
  628. package/packages/core/dist/run-state/inspect-run.js.map +1 -1
  629. package/packages/core/dist/run-state/invocation-ledger.js +2 -2
  630. package/packages/core/dist/run-state/invocation-ledger.js.map +1 -1
  631. package/packages/core/dist/run-state/model.d.ts +53 -9
  632. package/packages/core/dist/run-state/run-index.d.ts +0 -2
  633. package/packages/core/dist/run-state/run-index.js +1 -3
  634. package/packages/core/dist/run-state/run-index.js.map +1 -1
  635. package/packages/core/dist/run-state/run-state.js +51 -34
  636. package/packages/core/dist/run-state/run-state.js.map +1 -1
  637. package/packages/core/dist/run-state/task-evidence.d.ts +65 -0
  638. package/packages/core/dist/run-state/task-evidence.js +169 -0
  639. package/packages/core/dist/run-state/task-evidence.js.map +1 -0
  640. package/packages/core/dist/run-state/timing.d.ts +8 -0
  641. package/packages/core/dist/run-state/timing.js +131 -0
  642. package/packages/core/dist/run-state/timing.js.map +1 -0
  643. package/packages/core/dist/run-state.d.ts +2 -0
  644. package/packages/core/dist/run-state.js +2 -0
  645. package/packages/core/dist/run-state.js.map +1 -1
  646. package/packages/core/dist/runtime-analysis/build.js +0 -3
  647. package/packages/core/dist/runtime-analysis/build.js.map +1 -1
  648. package/packages/core/dist/runtime-analysis/findings.js +5 -44
  649. package/packages/core/dist/runtime-analysis/findings.js.map +1 -1
  650. package/packages/core/dist/runtime-analysis/model.d.ts +1 -17
  651. package/packages/core/dist/runtime-paths.d.ts +20 -0
  652. package/packages/core/dist/runtime-paths.js +109 -14
  653. package/packages/core/dist/runtime-paths.js.map +1 -1
  654. package/packages/core/dist/runtime-projection-p0.d.ts +64 -0
  655. package/packages/core/dist/runtime-projection-p0.js +200 -0
  656. package/packages/core/dist/runtime-projection-p0.js.map +1 -0
  657. package/packages/core/dist/sdd-docs/context.js +1 -1
  658. package/packages/core/dist/sdd-docs/context.js.map +1 -1
  659. package/packages/core/dist/sdd-docs/document-hashes.d.ts +6 -0
  660. package/packages/core/dist/sdd-docs/document-hashes.js +276 -0
  661. package/packages/core/dist/sdd-docs/document-hashes.js.map +1 -0
  662. package/packages/core/dist/sdd-docs/run-binding.d.ts +1 -1
  663. package/packages/core/dist/sdd-docs/run-binding.js +15 -4
  664. package/packages/core/dist/sdd-docs/run-binding.js.map +1 -1
  665. package/packages/core/dist/sdd-docs/task-parser.d.ts +21 -0
  666. package/packages/core/dist/sdd-docs/task-parser.js +139 -38
  667. package/packages/core/dist/sdd-docs/task-parser.js.map +1 -1
  668. package/packages/core/dist/stage-artifacts.d.ts +55 -0
  669. package/packages/core/dist/stage-artifacts.js +322 -0
  670. package/packages/core/dist/stage-artifacts.js.map +1 -0
  671. package/packages/core/dist/stage-collaboration-contracts.d.ts +55 -0
  672. package/packages/core/dist/stage-collaboration-contracts.js +241 -0
  673. package/packages/core/dist/stage-collaboration-contracts.js.map +1 -0
  674. package/packages/core/dist/stage-collaboration.d.ts +888 -0
  675. package/packages/core/dist/stage-collaboration.js +3870 -0
  676. package/packages/core/dist/stage-collaboration.js.map +1 -0
  677. package/packages/core/dist/stage-runtime/runtime.js +8 -1
  678. package/packages/core/dist/stage-runtime/runtime.js.map +1 -1
  679. package/packages/core/dist/status/project-status.d.ts +105 -1
  680. package/packages/core/dist/status/project-status.js +343 -8
  681. package/packages/core/dist/status/project-status.js.map +1 -1
  682. package/packages/core/dist/storage/runtime-store.d.ts +348 -3
  683. package/packages/core/dist/storage/runtime-store.js +1017 -8
  684. package/packages/core/dist/storage/runtime-store.js.map +1 -1
  685. package/packages/core/dist/subagents/contracts.d.ts +1 -1
  686. package/packages/core/dist/subagents/runtime.js +7 -7
  687. package/packages/core/dist/subagents/runtime.js.map +1 -1
  688. package/packages/core/dist/test-support/fixtures.js +21 -0
  689. package/packages/core/dist/test-support/fixtures.js.map +1 -1
  690. package/packages/core/dist/test-support/run-state.d.ts +1 -1
  691. package/packages/core/dist/test-support/run-state.js +19 -20
  692. package/packages/core/dist/test-support/run-state.js.map +1 -1
  693. package/packages/core/dist/truth-reconciliation.d.ts +44 -0
  694. package/packages/core/dist/truth-reconciliation.js +138 -0
  695. package/packages/core/dist/truth-reconciliation.js.map +1 -0
  696. package/packages/core/dist/tsconfig.tsbuildinfo +1 -1
  697. package/packages/core/dist/verification/goal-verify.d.ts +0 -1
  698. package/packages/core/dist/verification/goal-verify.js +44 -37
  699. package/packages/core/dist/verification/goal-verify.js.map +1 -1
  700. package/packages/core/dist/verification/rendering.d.ts +0 -2
  701. package/packages/core/dist/verification/rendering.js +19 -49
  702. package/packages/core/dist/verification/rendering.js.map +1 -1
  703. package/packages/core/dist/verification/review-gate.d.ts +22 -0
  704. package/packages/core/dist/verification/review-gate.js +53 -0
  705. package/packages/core/dist/verification/review-gate.js.map +1 -0
  706. package/packages/core/dist/verification/single-task-loop.d.ts +0 -1
  707. package/packages/core/dist/verification/single-task-loop.js +213 -111
  708. package/packages/core/dist/verification/single-task-loop.js.map +1 -1
  709. package/packages/core/dist/verification/test-runtime.d.ts +28 -3
  710. package/packages/core/dist/verification/test-runtime.js +546 -125
  711. package/packages/core/dist/verification/test-runtime.js.map +1 -1
  712. package/packages/core/dist/verification/validation-cache.d.ts +26 -0
  713. package/packages/core/dist/verification/validation-cache.js +73 -0
  714. package/packages/core/dist/verification/validation-cache.js.map +1 -0
  715. package/packages/core/dist/verification/validation-wave.d.ts +76 -0
  716. package/packages/core/dist/verification/validation-wave.js +450 -0
  717. package/packages/core/dist/verification/validation-wave.js.map +1 -0
  718. package/packages/core/dist/verification/verify-contract.d.ts +3 -1
  719. package/packages/core/dist/verification/verify-contract.js +105 -30
  720. package/packages/core/dist/verification/verify-contract.js.map +1 -1
  721. package/packages/core/dist/verification.d.ts +2 -0
  722. package/packages/core/dist/verification.js +2 -0
  723. package/packages/core/dist/verification.js.map +1 -1
  724. package/packages/core/dist/work-units/contracts.d.ts +1 -1
  725. package/packages/core/dist/workflow-gate/evidence-packet.d.ts +24 -0
  726. package/packages/core/dist/workflow-gate/evidence-packet.js +395 -0
  727. package/packages/core/dist/workflow-gate/evidence-packet.js.map +1 -0
  728. package/packages/core/dist/workflow-gate/hard-checks.d.ts +4 -0
  729. package/packages/core/dist/workflow-gate/hard-checks.js +164 -0
  730. package/packages/core/dist/workflow-gate/hard-checks.js.map +1 -0
  731. package/packages/core/dist/workflow-gate/policy.d.ts +4 -0
  732. package/packages/core/dist/workflow-gate/policy.js +182 -0
  733. package/packages/core/dist/workflow-gate/policy.js.map +1 -0
  734. package/packages/core/dist/workflow-gate/types.d.ts +88 -0
  735. package/packages/core/dist/workflow-gate/types.js +2 -0
  736. package/packages/core/dist/workflow-gate/types.js.map +1 -0
  737. package/packages/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -1
  738. package/packages/core/dist/workflow-state/affected-file-conflicts.js +17 -3
  739. package/packages/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  740. package/packages/core/dist/workflow-state/dependencies.d.ts +8 -4
  741. package/packages/core/dist/workflow-state/dependencies.js +25 -11
  742. package/packages/core/dist/workflow-state/dependencies.js.map +1 -1
  743. package/packages/core/dist/workflow-state/latest-eligible-run.d.ts +37 -0
  744. package/packages/core/dist/workflow-state/latest-eligible-run.js +188 -0
  745. package/packages/core/dist/workflow-state/latest-eligible-run.js.map +1 -0
  746. package/packages/core/dist/workflow-state/migration-recovery.d.ts +40 -0
  747. package/packages/core/dist/workflow-state/migration-recovery.js +110 -0
  748. package/packages/core/dist/workflow-state/migration-recovery.js.map +1 -0
  749. package/packages/core/dist/workflow-state/repair-contract.d.ts +12 -0
  750. package/packages/core/dist/workflow-state/repair-contract.js +63 -0
  751. package/packages/core/dist/workflow-state/repair-contract.js.map +1 -0
  752. package/packages/core/dist/workflow-state/resolve-task-run.d.ts +21 -0
  753. package/packages/core/dist/workflow-state/resolve-task-run.js +95 -0
  754. package/packages/core/dist/workflow-state/resolve-task-run.js.map +1 -0
  755. package/packages/core/dist/workflow-state/resolve.d.ts +80 -3
  756. package/packages/core/dist/workflow-state/resolve.js +674 -41
  757. package/packages/core/dist/workflow-state/resolve.js.map +1 -1
  758. package/packages/core/dist/workflow-state/runtime-projections.d.ts +228 -0
  759. package/packages/core/dist/workflow-state/runtime-projections.js +452 -0
  760. package/packages/core/dist/workflow-state/runtime-projections.js.map +1 -0
  761. package/packages/core/dist/workflow-state.d.ts +1 -0
  762. package/packages/core/dist/workflow-state.js +1 -0
  763. package/packages/core/dist/workflow-state.js.map +1 -1
  764. package/packages/core/package.json +3 -3
  765. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.d.ts +0 -2
  766. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.js +0 -44
  767. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.js.map +0 -1
  768. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.d.ts +0 -17
  769. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js +0 -221
  770. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js.map +0 -1
  771. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.d.ts +0 -91
  772. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js +0 -395
  773. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js.map +0 -1
  774. package/node_modules/@sdd-agent-platform/core/dist/sync-back.d.ts +0 -2
  775. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js +0 -3
  776. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js.map +0 -1
  777. package/node_modules/@sdd-agent-platform/core/src/sync-back/apply.ts +0 -248
  778. package/node_modules/@sdd-agent-platform/core/src/sync-back/inspect.ts +0 -522
  779. package/node_modules/@sdd-agent-platform/core/src/sync-back/sync-back.test.ts +0 -446
  780. package/node_modules/@sdd-agent-platform/core/src/sync-back.ts +0 -2
  781. package/packages/cli/dist/commands/artifact.d.ts +0 -6
  782. package/packages/cli/dist/commands/artifact.js +0 -168
  783. package/packages/cli/dist/commands/artifact.js.map +0 -1
  784. package/packages/cli/dist/commands/sync-back.d.ts +0 -6
  785. package/packages/cli/dist/commands/sync-back.js +0 -82
  786. package/packages/cli/dist/commands/sync-back.js.map +0 -1
  787. package/packages/cli/dist/renderers/artifacts.d.ts +0 -5
  788. package/packages/cli/dist/renderers/artifacts.js +0 -43
  789. package/packages/cli/dist/renderers/artifacts.js.map +0 -1
  790. package/packages/core/dist/doctor/render.d.ts +0 -2
  791. package/packages/core/dist/doctor/render.js +0 -44
  792. package/packages/core/dist/doctor/render.js.map +0 -1
  793. package/packages/core/dist/sync-back/apply.d.ts +0 -17
  794. package/packages/core/dist/sync-back/apply.js +0 -221
  795. package/packages/core/dist/sync-back/apply.js.map +0 -1
  796. package/packages/core/dist/sync-back/inspect.d.ts +0 -91
  797. package/packages/core/dist/sync-back/inspect.js +0 -395
  798. package/packages/core/dist/sync-back/inspect.js.map +0 -1
  799. package/packages/core/dist/sync-back.d.ts +0 -2
  800. package/packages/core/dist/sync-back.js +0 -3
  801. package/packages/core/dist/sync-back.js.map +0 -1
@@ -1,15 +1,24 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { mkdtemp, rm } from 'node:fs/promises';
3
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
4
  import { tmpdir } from 'node:os';
5
5
  import path from 'node:path';
6
+ import { execFile } from 'node:child_process';
7
+ import { promisify } from 'node:util';
6
8
 
7
9
  import { initProject } from '../config/init-project.js';
8
10
  import { createRun, readRunState, writeRunState } from '../run-state/run-state.js';
9
- import { validTaskMarkdown, writeBranchDocs } from '../test-support/fixtures.js';
10
- import { bindTestRunState, markTestRunReadyForSyncBack } from '../test-support/run-state.js';
11
+ import { hashTestDocument, validTaskMarkdown, writeBranchDocs } from '../test-support/fixtures.js';
12
+ import { bindTestRunState, markTestRunReadyForShip } from '../test-support/run-state.js';
11
13
  import { createDelegationRecord } from '../delegation/validation.js';
14
+ import { recordRuntimeProjectionEnvelope, recordRuntimeRepair } from '../storage/runtime-store.js';
15
+ import { buildOpenRepairRecord } from './repair-contract.js';
16
+ import { recordTruthAlignmentProjection, SPEC_COLLABORATION_ADJUDICATION_PROJECTION_TYPE, specCollaborationScopeKey, TEST_COLLABORATION_ADJUDICATION_PROJECTION_TYPE, testCollaborationScopeKey, type TruthAlignmentProjection } from '../stage-collaboration.js';
17
+ import { readTruthReconciliationProjection } from '../truth-reconciliation.js';
12
18
  import { resolveWorkflowState } from './resolve.js';
19
+ import { readNextIntentProjection, readTaskOrchestrationProjection, readValidationUnitProjection, readWorkflowCurrentStateProjection } from './runtime-projections.js';
20
+
21
+ const execFileAsync = promisify(execFile);
13
22
 
14
23
  test('workflow state resolver projects branch docs latest run and next action', async () => {
15
24
  const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-'));
@@ -18,7 +27,7 @@ test('workflow state resolver projects branch docs latest run and next action',
18
27
  await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
19
28
  const run = await createRun(root, { runId: 'run-1' });
20
29
  await bindTestRunState(root, run.runId, 'feature', 'T1');
21
- await markTestRunReadyForSyncBack(root, run.runId, 'T1');
30
+ await markTestRunReadyForShip(root, run.runId, 'T1');
22
31
 
23
32
  const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
24
33
 
@@ -27,7 +36,480 @@ test('workflow state resolver projects branch docs latest run and next action',
27
36
  assert.equal(workflow.latestRun?.runId, 'run-1');
28
37
  assert.deepEqual(workflow.latestRunsByTask.map((entry) => `${entry.partition}:${entry.taskId}:${entry.runId}`), ['feature:T1:run-1']);
29
38
  assert.equal(workflow.taskCounts.total, 1);
30
- assert.equal(workflow.recommendedNextCommand, 'sdd sync-back inspect --branch feature --task T1');
39
+ assert.equal(workflow.recommendedNextCommand, 'sdd ship close --branch feature --compact-json');
40
+ assert.equal(workflow.nextIntent.bundle, 'ship');
41
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'ship');
42
+ assert.equal(workflow.nextIntent.hostProjections.find((projection) => projection.host === 'claude_code')?.entry, '/sdd:ship close --branch feature --compact-json');
43
+ const currentStateProjection = await readWorkflowCurrentStateProjection(root, 'feature');
44
+ const nextIntentProjection = await readNextIntentProjection(root, 'feature');
45
+ const taskOrchestrationProjection = await readTaskOrchestrationProjection(root, 'feature');
46
+ const validationUnitProjection = await readValidationUnitProjection(root, 'feature');
47
+
48
+ assert.equal(currentStateProjection?.payload.contract, 'sdd-workflow-current-state-projection-v1');
49
+ assert.equal(currentStateProjection?.payload.lifecycle.currentStage, 'ship');
50
+ assert.equal(currentStateProjection?.payload.lifecycle.writer, 'runtime_sqlite');
51
+ assert.equal(currentStateProjection?.payload.tasks[0]?.taskId, 'T1');
52
+ assert.equal(currentStateProjection?.payload.tasks[0]?.consumability, 'consumable');
53
+ assert.equal(currentStateProjection?.payload.validationUnits[0]?.validationUnitId, 'T1');
54
+ assert.equal(taskOrchestrationProjection?.payload.contract, 'sdd-task-orchestration-projection-v1');
55
+ assert.equal(taskOrchestrationProjection?.payload.tasks[0]?.taskId, 'T1');
56
+ assert.equal(taskOrchestrationProjection?.payload.tasks[0]?.sourceRef.ref, 'specs/feature/tasks.md#T1');
57
+ assert.equal(validationUnitProjection?.payload.contract, 'sdd-validation-unit-projection-v1');
58
+ assert.deepEqual(validationUnitProjection?.payload.validationUnits[0]?.taskIds, ['T1']);
59
+ assert.equal(nextIntentProjection?.payload.contract, 'sdd-next-intent-projection-v1');
60
+ assert.equal(nextIntentProjection?.payload.advisory, true);
61
+ assert.equal(nextIntentProjection?.payload.rules.recommendationIsNotAGate, true);
62
+ assert.equal(nextIntentProjection?.payload.primary.canonicalCommand, workflow.nextIntent.canonicalCommand);
63
+ assert.equal(nextIntentProjection?.payload.primary.targetRuntimeStage, 'ship');
64
+ } finally {
65
+ await rm(root, { recursive: true, force: true });
66
+ }
67
+ });
68
+
69
+ test('workflow state routes validation PASS to goal-verify before ship readiness', async () => {
70
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-test-pass-'));
71
+ try {
72
+ await initProject(root);
73
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
74
+ const run = await createRun(root, { runId: 'run-pass-no-syncback' });
75
+ await bindTestRunState(root, run.runId, 'feature', 'T1');
76
+ const bound = await readRunState(root, run.runId);
77
+ await writeRunState(root, {
78
+ ...bound,
79
+ status: 'completed',
80
+ validation: {
81
+ status: 'pass',
82
+ commands: ['npm test'],
83
+ evidence: ['artifacts/validation-T1.md']
84
+ }
85
+ });
86
+
87
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
88
+
89
+ assert.equal(workflow.nextIntent.stage, 'test');
90
+ assert.equal(workflow.nextIntent.bundle, 'test');
91
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'goal-verify');
92
+ assert.equal(workflow.nextIntent.intent, 'run_goal_verify');
93
+ assert.equal(workflow.recommendedNextCommand, 'sdd test close --branch feature --target goal-verify --compact-json');
94
+ } finally {
95
+ await rm(root, { recursive: true, force: true });
96
+ }
97
+ });
98
+
99
+ test('workflow state routes non-aligned truthAlignment to owner stage-manager reconciliation', async () => {
100
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-truth-reconcile-'));
101
+ try {
102
+ await initProject(root);
103
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
104
+ await recordTruthAlignmentProjection(root, truthAlignmentProjection({
105
+ branch: 'feature',
106
+ status: 'drift_detected',
107
+ ownerStage: 'do',
108
+ semanticImpact: 'material',
109
+ invalidatesStages: ['do'],
110
+ staleRefs: [{ kind: 'artifact', ref: '.sdd/runs/feature/do/implementation-v1.md', hash: 'old-implementation-hash' }],
111
+ reasons: ['accepted implementation evidence no longer matches declared truth']
112
+ }));
113
+
114
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
115
+ const projection = await readTruthReconciliationProjection(root, 'feature');
116
+
117
+ assert.equal(workflow.nextIntent.intent, 'reconcile_truth');
118
+ assert.equal(workflow.nextIntent.bundle, 'do');
119
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'do');
120
+ assert.equal(workflow.recommendedNextCommand, 'sdd do task <task_id> --branch feature');
121
+ assert.equal(workflow.truthReconciliation?.changeKind, 'implementation_mismatch');
122
+ assert.deepEqual(workflow.truthReconciliation?.minimalFrontier, ['do', 'test', 'goal-verify', 'ship']);
123
+ assert.equal(workflow.truthReconciliation?.preservesEvidenceRefs.length, 0);
124
+ assert.equal(workflow.truthReconciliation?.supersedesEvidenceRefs.length, 2);
125
+ assert.equal(projection?.payload.nextIntent.canonicalCommand, workflow.nextIntent.canonicalCommand);
126
+ assert.equal(workflow.nextIntent.hostProjections.find((host) => host.host === 'claude_code')?.entry, '/sdd:do task <task_id> --branch feature');
127
+ assert.equal(workflow.nextIntent.canonicalCommand.includes('sync-back'), false);
128
+ } finally {
129
+ await rm(root, { recursive: true, force: true });
130
+ }
131
+ });
132
+
133
+ test('workflow state advances material truth reconciliation frontier after do correction evidence', async () => {
134
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-truth-frontier-'));
135
+ try {
136
+ await initProject(root);
137
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
138
+ await recordTruthAlignmentProjection(root, truthAlignmentProjection({
139
+ branch: 'feature',
140
+ status: 'drift_detected',
141
+ ownerStage: 'do',
142
+ semanticImpact: 'material',
143
+ invalidatesStages: ['do'],
144
+ staleRefs: [{ kind: 'artifact', ref: '.sdd/runs/feature/do/implementation-v1.md', hash: 'old-implementation-hash' }],
145
+ reasons: ['accepted implementation evidence no longer matches declared truth'],
146
+ createdAt: '2020-01-01T00:00:00.000Z'
147
+ }));
148
+ const run = await createRun(root, { runId: 'run-post-truth-do', branch: 'feature', taskId: 'T1' });
149
+ await writeRunState(root, {
150
+ ...run,
151
+ status: 'completed',
152
+ createdAt: '2026-06-01T00:00:01.000Z',
153
+ updatedAt: '2026-06-01T00:00:01.000Z',
154
+ tasks: {
155
+ T1: {
156
+ status: 'implemented_pending_validation',
157
+ implementationStatus: 'implemented',
158
+ verificationStatus: 'not_run',
159
+ validationBatch: null,
160
+ validationTiming: 'task_end',
161
+ requiresVerifyBeforeNext: true,
162
+ gaps: [],
163
+ artifacts: ['.sdd/runs/feature/do/implementation-v2.md']
164
+ }
165
+ }
166
+ });
167
+
168
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
169
+
170
+ assert.equal(workflow.truthReconciliation?.ownerStage, 'do');
171
+ assert.deepEqual(workflow.truthReconciliation?.minimalFrontier, ['do', 'test', 'goal-verify', 'ship']);
172
+ assert.equal(workflow.nextIntent.intent, 'reconcile_truth');
173
+ assert.equal(workflow.nextIntent.bundle, 'test');
174
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'test');
175
+ assert.equal(workflow.recommendedNextCommand, 'sdd test close --branch feature --compact-json');
176
+ assert.equal(workflow.nextIntent.canonicalCommand.includes('sync-back'), false);
177
+ } finally {
178
+ await rm(root, { recursive: true, force: true });
179
+ }
180
+ });
181
+
182
+ test('workflow state advances material truth reconciliation frontier after test stage close', async () => {
183
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-truth-test-frontier-'));
184
+ try {
185
+ await initProject(root);
186
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
187
+ await recordTruthAlignmentProjection(root, truthAlignmentProjection({
188
+ branch: 'feature',
189
+ status: 'drift_detected',
190
+ ownerStage: 'do',
191
+ semanticImpact: 'material',
192
+ invalidatesStages: ['do'],
193
+ staleRefs: [{ kind: 'artifact', ref: '.sdd/runs/feature/do/implementation-v1.md', hash: 'old-implementation-hash' }],
194
+ reasons: ['accepted implementation evidence no longer matches declared truth'],
195
+ createdAt: '2020-01-01T00:00:00.000Z'
196
+ }));
197
+ const doRun = await createRun(root, { runId: 'run-post-truth-do', branch: 'feature', taskId: 'T1' });
198
+ await writeRunState(root, {
199
+ ...doRun,
200
+ status: 'completed',
201
+ tasks: {
202
+ T1: {
203
+ status: 'implemented_pending_validation',
204
+ implementationStatus: 'implemented',
205
+ verificationStatus: 'not_run',
206
+ validationBatch: null,
207
+ validationTiming: 'task_end',
208
+ requiresVerifyBeforeNext: true,
209
+ gaps: [],
210
+ artifacts: ['.sdd/runs/feature/do/implementation-v2.md']
211
+ }
212
+ }
213
+ });
214
+ const acceptedTestRef = { kind: 'artifact' as const, ref: '.sdd/runs/feature/test/validation-v2.md', hash: 'validation-v2-hash' };
215
+ const generatedAt = '2026-06-01T00:00:02.000Z';
216
+ await recordRuntimeProjectionEnvelope(root, {
217
+ projectionType: TEST_COLLABORATION_ADJUDICATION_PROJECTION_TYPE,
218
+ scopeKey: testCollaborationScopeKey({ branch: 'feature' }),
219
+ inputHash: 'test-adjudication-v2',
220
+ producer: 'phase9.6-test-stage-collaboration-runtime',
221
+ producerVersion: 'phase9.6-test-stage-collaboration-runtime-v1',
222
+ generatedAt,
223
+ payload: {
224
+ contract: 'phase-9.1-stage-collaboration-runtime-v1',
225
+ adjudicationId: 'test-adjudication-v2',
226
+ stage: 'test',
227
+ scope: { branch: 'feature' },
228
+ health: 'ready_for_goal_verify',
229
+ stageDecision: {
230
+ contract: 'phase-9.1-stage-collaboration-runtime-v1',
231
+ decisionId: 'test-stage-decision-v2',
232
+ stage: 'test',
233
+ scope: { branch: 'feature' },
234
+ status: 'completed',
235
+ health: 'ready_for_goal_verify',
236
+ acceptedDecisionRefs: [acceptedTestRef],
237
+ advisoryRefs: [],
238
+ capabilityRefs: [],
239
+ blockingReasons: [],
240
+ createdAt: generatedAt
241
+ },
242
+ handoffPacket: null,
243
+ rejection: null,
244
+ nextActions: [],
245
+ closureRefs: {
246
+ runRef: { kind: 'run', ref: 'run-post-truth-test' },
247
+ acceptedTestEvidenceRef: acceptedTestRef,
248
+ testAcceptanceStatus: 'accepted',
249
+ testEvidenceHash: 'validation-v2-hash',
250
+ acceptedDoHandoffRef: null,
251
+ artifactRefs: [acceptedTestRef],
252
+ collaborationContractRef: null,
253
+ lifecycleRiskProjectionRef: { kind: 'projection', ref: 'phase8_lifecycle_risk_decision:feature:all:none:none' },
254
+ adjudicationProjectionRef: { kind: 'projection', ref: `${TEST_COLLABORATION_ADJUDICATION_PROJECTION_TYPE}:${testCollaborationScopeKey({ branch: 'feature' })}` },
255
+ stageRunProjectionRef: { kind: 'projection', ref: 'phase8_stage_run:feature:all:run-post-truth-test:none:test' },
256
+ reasons: []
257
+ },
258
+ createdAt: generatedAt
259
+ }
260
+ });
261
+
262
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
263
+
264
+ assert.equal(workflow.nextIntent.intent, 'reconcile_truth');
265
+ assert.equal(workflow.nextIntent.bundle, 'test');
266
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'goal-verify');
267
+ assert.equal(workflow.recommendedNextCommand, 'sdd test close --branch feature --target goal-verify --compact-json');
268
+ assert.equal(workflow.nextIntent.canonicalCommand.includes('sync-back'), false);
269
+ } finally {
270
+ await rm(root, { recursive: true, force: true });
271
+ }
272
+ });
273
+
274
+ test('workflow state maps intra-bundle truth reconciliation to task and test command bundles', async () => {
275
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-truth-bundles-'));
276
+ try {
277
+ await initProject(root);
278
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
279
+ await recordTruthAlignmentProjection(root, truthAlignmentProjection({
280
+ branch: 'feature',
281
+ status: 'update_required',
282
+ ownerStage: 'verifies',
283
+ semanticImpact: 'none',
284
+ invalidatesStages: ['verifies'],
285
+ staleRefs: [{ kind: 'document', ref: 'specs/feature/verify.md', hash: 'old-verify-hash' }],
286
+ reasons: ['verify contract needs documentation catch-up']
287
+ }));
288
+
289
+ const verifiesWorkflow = await resolveWorkflowState(root, { branch: 'feature' });
290
+
291
+ assert.equal(verifiesWorkflow.nextIntent.bundle, 'tasks');
292
+ assert.equal(verifiesWorkflow.nextIntent.targetRuntimeStage, 'verifies');
293
+ assert.equal(verifiesWorkflow.nextIntent.displayCommand, '/sdd:tasks target=verifies close --branch feature --compact-json');
294
+ assert.equal(verifiesWorkflow.nextIntent.canonicalCommand, 'sdd tasks close --branch feature --target verifies --compact-json');
295
+
296
+ await recordTruthAlignmentProjection(root, truthAlignmentProjection({
297
+ branch: 'feature',
298
+ status: 'drift_detected',
299
+ ownerStage: 'goal-verify',
300
+ semanticImpact: 'bounded',
301
+ invalidatesStages: ['goal-verify'],
302
+ staleRefs: [{ kind: 'projection', ref: 'phase9_12_truth_alignment:feature', hash: 'old-gate-hash' }],
303
+ reasons: ['goal verification gate policy changed']
304
+ }));
305
+
306
+ const goalVerifyWorkflow = await resolveWorkflowState(root, { branch: 'feature' });
307
+
308
+ assert.equal(goalVerifyWorkflow.nextIntent.bundle, 'test');
309
+ assert.equal(goalVerifyWorkflow.nextIntent.targetRuntimeStage, 'goal-verify');
310
+ assert.equal(goalVerifyWorkflow.nextIntent.displayCommand, '/sdd:test target=goal-verify close --branch feature --compact-json');
311
+ assert.equal(goalVerifyWorkflow.nextIntent.canonicalCommand, 'sdd test close --branch feature --target goal-verify --compact-json');
312
+ assert.equal(goalVerifyWorkflow.nextIntent.canonicalCommand.includes('sync-back'), false);
313
+ } finally {
314
+ await rm(root, { recursive: true, force: true });
315
+ }
316
+ });
317
+
318
+ test('workflow state routes stale aligned truthAlignment refs to minimal document reconciliation', async () => {
319
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-stale-truth-'));
320
+ try {
321
+ await initProject(root);
322
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
323
+ const specPath = path.join(root, 'specs', 'feature', 'spec.md');
324
+ const tasksPath = path.join(root, 'specs', 'feature', 'tasks.md');
325
+ const specHash = hashTestDocument(await readFile(specPath, 'utf8'));
326
+ const tasksHash = hashTestDocument(await readFile(tasksPath, 'utf8'));
327
+ await recordTruthAlignmentProjection(root, {
328
+ contract: 'sdd-truth-alignment-v1',
329
+ branch: 'feature',
330
+ sourceStage: 'goal-verify',
331
+ declaredTruthRefs: [
332
+ { kind: 'document', ref: 'specs/feature/spec.md', hash: specHash },
333
+ { kind: 'document', ref: 'specs/feature/tasks.md', hash: tasksHash }
334
+ ],
335
+ acceptedRealityRefs: [{ kind: 'artifact', ref: '.sdd/runs/feature/goal-verify/goal-verification-v1.md' }],
336
+ status: 'aligned',
337
+ ownerStage: null,
338
+ semanticImpact: 'none',
339
+ staleRefs: [],
340
+ invalidatesStages: [],
341
+ reasons: ['Accepted goal verification is structurally aligned with declared upstream truth refs.'],
342
+ createdAt: '2026-06-01T00:00:00.000Z'
343
+ });
344
+ await writeFile(tasksPath, `${await readFile(tasksPath, 'utf8')}\nAdditional documentation-only acceptance clarification.\n`, 'utf8');
345
+
346
+ const workflow = await resolveWorkflowState(root, { branch: 'feature' });
347
+
348
+ assert.equal(workflow.nextIntent.intent, 'reconcile_truth');
349
+ assert.equal(workflow.nextIntent.bundle, 'tasks');
350
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'tasks');
351
+ assert.equal(workflow.recommendedNextCommand, 'sdd tasks close --branch feature --compact-json');
352
+ assert.equal(workflow.truthReconciliation?.changeKind, 'documentation_catchup');
353
+ assert.equal(workflow.truthReconciliation?.semanticImpact, 'none');
354
+ assert.deepEqual(workflow.truthReconciliation?.minimalFrontier, ['tasks']);
355
+ assert.equal(workflow.truthReconciliation?.changedRef.ref, 'specs/feature/tasks.md');
356
+ assert.equal(workflow.truthReconciliation?.oldHash, tasksHash);
357
+ assert.notEqual(workflow.truthReconciliation?.newHash, tasksHash);
358
+ assert.equal(workflow.nextIntent.canonicalCommand.includes('sync-back'), false);
359
+ } finally {
360
+ await rm(root, { recursive: true, force: true });
361
+ }
362
+ });
363
+
364
+ test('workflow state skips document truth refs already accepted by stage close', async () => {
365
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-stale-truth-close-'));
366
+ try {
367
+ await initProject(root);
368
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
369
+ const specPath = path.join(root, 'specs', 'feature', 'spec.md');
370
+ const tasksPath = path.join(root, 'specs', 'feature', 'tasks.md');
371
+ const originalSpecHash = hashTestDocument(await readFile(specPath, 'utf8'));
372
+ const originalTasksHash = hashTestDocument(await readFile(tasksPath, 'utf8'));
373
+ await recordTruthAlignmentProjection(root, {
374
+ contract: 'sdd-truth-alignment-v1',
375
+ branch: 'feature',
376
+ sourceStage: 'goal-verify',
377
+ declaredTruthRefs: [
378
+ { kind: 'document', ref: 'specs/feature/spec.md', hash: originalSpecHash },
379
+ { kind: 'document', ref: 'specs/feature/tasks.md', hash: originalTasksHash }
380
+ ],
381
+ acceptedRealityRefs: [{ kind: 'artifact', ref: '.sdd/runs/feature/goal-verify/goal-verification-v1.md' }],
382
+ status: 'aligned',
383
+ ownerStage: null,
384
+ semanticImpact: 'none',
385
+ staleRefs: [],
386
+ invalidatesStages: [],
387
+ reasons: ['Accepted goal verification is structurally aligned with declared upstream truth refs.'],
388
+ createdAt: '2026-06-01T00:00:00.000Z'
389
+ });
390
+ await writeFile(specPath, `${await readFile(specPath, 'utf8')}\nSpec documentation-only correction.\n`, 'utf8');
391
+ await writeFile(tasksPath, `${await readFile(tasksPath, 'utf8')}\nTasks documentation-only correction.\n`, 'utf8');
392
+ const currentSpecHash = hashTestDocument(await readFile(specPath, 'utf8'));
393
+ const currentTasksHash = hashTestDocument(await readFile(tasksPath, 'utf8'));
394
+ const acceptedSpecRef = { kind: 'document' as const, ref: 'specs/feature/spec.md', hash: currentSpecHash };
395
+ const generatedAt = '2026-06-01T00:00:02.000Z';
396
+ await recordRuntimeProjectionEnvelope(root, {
397
+ projectionType: SPEC_COLLABORATION_ADJUDICATION_PROJECTION_TYPE,
398
+ scopeKey: specCollaborationScopeKey({ branch: 'feature' }),
399
+ inputHash: 'spec-adjudication-v2',
400
+ producer: 'phase9.1-spec-stage-collaboration-runtime',
401
+ producerVersion: 'phase9.1-spec-stage-collaboration-runtime-v1',
402
+ generatedAt,
403
+ payload: {
404
+ contract: 'phase-9.1-stage-collaboration-runtime-v1',
405
+ adjudicationId: 'spec-adjudication-v2',
406
+ stage: 'spec',
407
+ scope: { branch: 'feature' },
408
+ health: 'ready_for_plan',
409
+ stageDecision: {
410
+ contract: 'phase-9.1-stage-collaboration-runtime-v1',
411
+ decisionId: 'spec-stage-decision-v2',
412
+ stage: 'spec',
413
+ scope: { branch: 'feature' },
414
+ status: 'completed',
415
+ health: 'ready_for_plan',
416
+ acceptedDecisionRefs: [acceptedSpecRef],
417
+ advisoryRefs: [],
418
+ capabilityRefs: [],
419
+ blockingReasons: [],
420
+ createdAt: generatedAt
421
+ },
422
+ handoffPacket: null,
423
+ rejection: null,
424
+ nextActions: [],
425
+ closureRefs: {
426
+ acceptedSpecRef,
427
+ specHash: currentSpecHash,
428
+ reasons: []
429
+ },
430
+ createdAt: generatedAt
431
+ }
432
+ });
433
+
434
+ const workflow = await resolveWorkflowState(root, { branch: 'feature' });
435
+
436
+ assert.equal(workflow.nextIntent.intent, 'reconcile_truth');
437
+ assert.equal(workflow.nextIntent.bundle, 'tasks');
438
+ assert.equal(workflow.nextIntent.targetRuntimeStage, 'tasks');
439
+ assert.equal(workflow.recommendedNextCommand, 'sdd tasks close --branch feature --compact-json');
440
+ assert.equal(workflow.truthReconciliation?.changedRef.ref, 'specs/feature/tasks.md');
441
+ assert.equal(workflow.truthReconciliation?.oldHash, originalTasksHash);
442
+ assert.equal(workflow.truthReconciliation?.newHash, currentTasksHash);
443
+ assert.equal(workflow.truthReconciliation?.reasons.some((reason) => reason.includes('specs/feature/spec.md')), false);
444
+ } finally {
445
+ await rm(root, { recursive: true, force: true });
446
+ }
447
+ });
448
+
449
+ test('workflow state routes open repairs before repeating do or validation', async () => {
450
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-repair-'));
451
+ try {
452
+ await initProject(root);
453
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
454
+ await recordRuntimeRepair(root, buildOpenRepairRecord({
455
+ branchSlug: 'feature',
456
+ taskId: 'T1',
457
+ message: 'validation command is not directly executable: manual: inspect service',
458
+ recommendedCommands: ['sdd doctor --branch feature --latest-only']
459
+ }));
460
+
461
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
462
+
463
+ assert.equal(workflow.openRepairs.length, 1);
464
+ assert.equal(workflow.nextIntent.intent, 'repair_failure');
465
+ assert.equal(workflow.recommendedNextCommand, 'sdd doctor --branch feature --latest-only');
466
+ assert.equal(workflow.blockingReasons.some((reason) => reason.includes('not directly executable')), true);
467
+ } finally {
468
+ await rm(root, { recursive: true, force: true });
469
+ }
470
+ });
471
+
472
+ test('workflow state strict stale rejection names tasks contract drift', async () => {
473
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-stale-dimension-'));
474
+ try {
475
+ await initProject(root);
476
+ const originalTasks = validTaskMarkdown('T1', []);
477
+ await writeBranchDocs(root, 'feature', originalTasks);
478
+ const run = await createRun(root, { runId: 'run-stale-contract' });
479
+ await bindTestRunState(root, run.runId, 'feature', 'T1');
480
+ await markTestRunReadyForShip(root, run.runId, 'T1');
481
+ await writeBranchDocs(root, 'feature', originalTasks.replace('risk: []', 'required_artifacts:\n - artifacts/implement-T1.md\nrisk: []'));
482
+
483
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
484
+ const rejected = workflow.latestEligibleRunsByTask.find((selection) => selection.taskId === 'T1')?.rejected.find((candidate) => candidate.runId === 'run-stale-contract');
485
+
486
+ assert.equal(workflow.latestRun, null);
487
+ assert.equal(rejected?.compatibility, 'strict_stale');
488
+ assert.equal(rejected?.reasons.some((reason) => reason.includes('tasks contract hash drift')), true);
489
+ } finally {
490
+ await rm(root, { recursive: true, force: true });
491
+ }
492
+ });
493
+
494
+
495
+ test('workflow state does not route to ship until every required task has PASS evidence', async () => {
496
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-readiness-'));
497
+ try {
498
+ await initProject(root);
499
+ await writeBranchDocs(root, 'feature', `# Tasks\n\n${validTaskMarkdown('T1', []).replace('packages/core/src/index.ts', 'docs/t1.md')}\n${validTaskMarkdown('T2', []).replace('T1', 'T2').replace('packages/core/src/index.ts', 'docs/t2.md')}`);
500
+ const run = await createRun(root, { runId: 'run-t1-pass' });
501
+ await bindTestRunState(root, run.runId, 'feature', 'T1');
502
+ await markTestRunReadyForShip(root, run.runId, 'T1');
503
+
504
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
505
+
506
+ assert.equal(workflow.nextIntent.stage, 'do');
507
+ assert.equal(workflow.recommendedNextCommand, 'sdd do task T2 --branch feature');
508
+ assert.deepEqual(workflow.workflowReadiness.requiredTaskIds, ['T1', 'T2']);
509
+ assert.deepEqual(workflow.workflowReadiness.acceptedTaskIds, ['T1']);
510
+ assert.deepEqual(workflow.workflowReadiness.missingTaskIds, ['T2']);
511
+ assert.equal(workflow.workflowReadiness.readyForShip, false);
512
+ assert.deepEqual(workflow.whyNotShip, ['Task T2 has no accepted validation PASS evidence.']);
31
513
  } finally {
32
514
  await rm(root, { recursive: true, force: true });
33
515
  }
@@ -40,7 +522,7 @@ test('workflow state resolver reports affected-file conflicts without run-index
40
522
  await writeBranchDocs(root, 'feature', `${validTaskMarkdown('T1', []).replace('packages/core/src/index.ts', 'src/shared.ts')}\n${validTaskMarkdown('T2', []).replace('T1', 'T2').replace('packages/core/src/index.ts', 'src/shared.ts')}`);
41
523
  const runA = await createRun(root, { runId: 'run-a' });
42
524
  await bindTestRunState(root, runA.runId, 'feature', 'T1');
43
- await markTestRunReadyForSyncBack(root, runA.runId, 'T1');
525
+ await markTestRunReadyForShip(root, runA.runId, 'T1');
44
526
  const runB = await createRun(root, { runId: 'run-b' });
45
527
  await bindTestRunState(root, runB.runId, 'feature', 'T2');
46
528
  const archived = await createRun(root, { runId: 'run-c' });
@@ -86,7 +568,7 @@ test('workflow state ignores superseded failed and foreground observer conflict
86
568
  });
87
569
  const retry = await createRun(root, { runId: 'run-retry' });
88
570
  await bindTestRunState(root, retry.runId, 'feature', 'T1');
89
- await markTestRunReadyForSyncBack(root, retry.runId, 'T1');
571
+ await markTestRunReadyForShip(root, retry.runId, 'T1');
90
572
 
91
573
  const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
92
574
 
@@ -108,8 +590,368 @@ test('workflow state resolver surfaces dependency blockers and points next actio
108
590
 
109
591
  assert.deepEqual(workflow.dependencyBlockers.map((blocker) => `${blocker.taskId}->${blocker.dependencyId}`), ['DEP2->DEP1']);
110
592
  assert.equal(workflow.blockingReasons.some((reason) => reason.includes('DEP2 depends on DEP1')), true);
111
- assert.equal(workflow.recommendedNextCommand, 'sdd tasks inspect DEP1 --branch feature');
593
+ assert.equal(workflow.recommendedNextCommand, 'sdd do task DEP1 --branch feature');
594
+ } finally {
595
+ await rm(root, { recursive: true, force: true });
596
+ }
597
+ });
598
+
599
+ test('workflow state treats implemented batch dependency as ready for downstream do', async () => {
600
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-runtime-dependency-ready-'));
601
+ try {
602
+ await initProject(root);
603
+ await writeBranchDocs(root, 'feature', `# Tasks
604
+
605
+ ${validTaskMarkdown('DEP1', [])
606
+ .replace('packages/core/src/index.ts', 'docs/dep1.md')
607
+ .replace('validation:\n - npm test', 'validation_batch: dep-batch\nvalidation_timing: batch_end\nrequires_verify_before_next: false\nvalidation:\n - npm test')}
608
+ ${validTaskMarkdown('DEP2', ['DEP1'])
609
+ .replace('packages/core/src/index.ts', 'docs/dep2.md')
610
+ .replace('validation:\n - npm test', 'validation_batch: dep-batch\nvalidation_timing: batch_end\nrequires_verify_before_next: false\nvalidation:\n - npm test')}`);
611
+ const run = await createRun(root, { runId: 'run-dep1-implemented' });
612
+ await bindTestRunState(root, run.runId, 'feature', 'DEP1');
613
+ const bound = await readRunState(root, run.runId);
614
+ await writeRunState(root, {
615
+ ...bound,
616
+ status: 'completed',
617
+ tasks: {
618
+ ...bound.tasks,
619
+ DEP1: {
620
+ status: 'implemented_pending_validation',
621
+ implementationStatus: 'implemented',
622
+ verificationStatus: 'pending_batch',
623
+ validationBatch: 'dep-batch',
624
+ validationTiming: 'batch_end',
625
+ requiresVerifyBeforeNext: false,
626
+ gaps: [],
627
+ artifacts: []
628
+ }
629
+ }
630
+ });
631
+
632
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'DEP2' });
633
+
634
+ assert.deepEqual(workflow.dependencyBlockers, []);
635
+ assert.equal(workflow.recommendedNextCommand, 'sdd do task DEP2 --branch feature');
636
+ } finally {
637
+ await rm(root, { recursive: true, force: true });
638
+ }
639
+ });
640
+
641
+ test('workflow state blocks downstream do until strict dependency verification passes', async () => {
642
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-runtime-dependency-strict-'));
643
+ try {
644
+ await initProject(root);
645
+ await writeBranchDocs(root, 'feature', `# Tasks
646
+
647
+ ${validTaskMarkdown('DEP1', [])
648
+ .replace('packages/core/src/index.ts', 'docs/dep1.md')
649
+ .replace('validation:\n - npm test', 'validation_timing: task_end\nrequires_verify_before_next: true\nvalidation:\n - npm test')}
650
+ ${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
651
+ const run = await createRun(root, { runId: 'run-dep1-strict-implemented' });
652
+ await bindTestRunState(root, run.runId, 'feature', 'DEP1');
653
+ const bound = await readRunState(root, run.runId);
654
+ await writeRunState(root, {
655
+ ...bound,
656
+ status: 'completed',
657
+ tasks: {
658
+ ...bound.tasks,
659
+ DEP1: {
660
+ status: 'implemented_pending_validation',
661
+ implementationStatus: 'implemented',
662
+ verificationStatus: 'not_run',
663
+ validationBatch: null,
664
+ validationTiming: 'task_end',
665
+ requiresVerifyBeforeNext: true,
666
+ gaps: [],
667
+ artifacts: []
668
+ }
669
+ }
670
+ });
671
+
672
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'DEP2' });
673
+
674
+ assert.deepEqual(workflow.dependencyBlockers.map((blocker) => `${blocker.taskId}->${blocker.dependencyId}`), ['DEP2->DEP1']);
675
+ assert.equal(workflow.blockingReasons.some((reason) => reason.includes('has not passed required verification')), true);
676
+ assert.equal(workflow.recommendedNextCommand, 'sdd test task-DEP1 --branch feature');
677
+ } finally {
678
+ await rm(root, { recursive: true, force: true });
679
+ }
680
+ });
681
+
682
+
683
+ test('latest eligible selector prefers older compatible evidence over newer strict-stale evidence', async () => {
684
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-eligible-'));
685
+ try {
686
+ await initProject(root);
687
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
688
+ const compatible = await createRun(root, { runId: 'run-compatible' });
689
+ await bindTestRunState(root, compatible.runId, 'feature', 'T1');
690
+ await markTestRunReadyForShip(root, compatible.runId, 'T1');
691
+
692
+ const strictStale = await createRun(root, { runId: 'run-strict-stale' });
693
+ await bindTestRunState(root, strictStale.runId, 'feature', 'T1');
694
+ await markTestRunReadyForShip(root, strictStale.runId, 'T1');
695
+ const strictStaleState = await readRunState(root, strictStale.runId);
696
+ await writeRunState(root, {
697
+ ...strictStaleState,
698
+ documentSnapshot: {
699
+ ...strictStaleState.documentSnapshot,
700
+ tasksContractHash: 'stale-tasks-contract-hash',
701
+ taskContractHash: 'stale-task-contract-hash',
702
+ }
703
+ });
704
+
705
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
706
+ const selection = workflow.latestEligibleRunsByTask.find((entry) => entry.taskId === 'T1');
707
+
708
+ assert.equal(workflow.latestRun?.runId, 'run-compatible');
709
+ assert.equal(selection?.selected?.runId, 'run-compatible');
710
+ assert.deepEqual(selection?.rejected.map((entry) => `${entry.runId}:${entry.compatibility}`), ['run-strict-stale:strict_stale']);
711
+ assert.equal(selection?.rejected[0]?.reasons.some((reason) => reason.includes('strict_stale')), true);
712
+ } finally {
713
+ await rm(root, { recursive: true, force: true });
714
+ }
715
+ });
716
+
717
+ test('latest eligible selector keeps task-local evidence when another task changes', async () => {
718
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-task-local-eligible-'));
719
+ try {
720
+ await initProject(root);
721
+ const task1 = validTaskMarkdown('T1', []).replace('packages/core/src/index.ts', 'docs/t1.md');
722
+ const task2 = validTaskMarkdown('T2', []).replace('T1', 'T2').replace('packages/core/src/index.ts', 'docs/t2.md');
723
+ await writeBranchDocs(root, 'feature', `# Tasks\n\n${task1}\n${task2}`);
724
+ const run = await createRun(root, { runId: 'run-t1-compatible' });
725
+ await bindTestRunState(root, run.runId, 'feature', 'T1');
726
+ await markTestRunReadyForShip(root, run.runId, 'T1');
727
+ await writeBranchDocs(root, 'feature', `# Tasks\n\n${task1}\n${task2.replace('risk: []', 'risk:\n - security')}`);
728
+
729
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
730
+ const selection = workflow.latestEligibleRunsByTask.find((entry) => entry.taskId === 'T1');
731
+
732
+ assert.equal(workflow.latestRun?.runId, 'run-t1-compatible');
733
+ assert.equal(selection?.selected?.runId, 'run-t1-compatible');
734
+ assert.deepEqual(selection?.rejected.map((entry) => entry.runId), []);
735
+ } finally {
736
+ await rm(root, { recursive: true, force: true });
737
+ }
738
+ });
739
+
740
+ test('latest eligible selector rejects newer blocked runs and keeps older completed evidence eligible', async () => {
741
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-blocked-eligible-'));
742
+ try {
743
+ await initProject(root);
744
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
745
+ const completed = await createRun(root, { runId: 'run-completed' });
746
+ await bindTestRunState(root, completed.runId, 'feature', 'T1');
747
+ await markTestRunReadyForShip(root, completed.runId, 'T1');
748
+
749
+ const blocked = await createRun(root, { runId: 'run-blocked' });
750
+ await bindTestRunState(root, blocked.runId, 'feature', 'T1');
751
+ await markTestRunReadyForShip(root, blocked.runId, 'T1');
752
+ await writeRunState(root, { ...await readRunState(root, blocked.runId), status: 'blocked' });
753
+
754
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
755
+ const selection = workflow.latestEligibleRunsByTask.find((entry) => entry.taskId === 'T1');
756
+
757
+ assert.equal(selection?.selected?.runId, 'run-completed');
758
+ assert.equal(selection?.rejected.some((entry) => entry.runId === 'run-blocked' && entry.reasons.includes('Run is blocked.')), true);
759
+ } finally {
760
+ await rm(root, { recursive: true, force: true });
761
+ }
762
+ });
763
+
764
+ test('latest eligible selector returns visible candidates and rejects archived or failed runs with reasons', async () => {
765
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-rejected-'));
766
+ try {
767
+ await initProject(root);
768
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', []));
769
+ const failed = await createRun(root, { runId: 'run-failed' });
770
+ await bindTestRunState(root, failed.runId, 'feature', 'T1');
771
+ await writeRunState(root, {
772
+ ...await readRunState(root, failed.runId),
773
+ status: 'failed',
774
+ validation: { status: 'fail', commands: ['npm test'], evidence: [] }
775
+ });
776
+ const archived = await createRun(root, { runId: 'run-archived' });
777
+ await bindTestRunState(root, archived.runId, 'feature', 'T1');
778
+ await writeRunState(root, { ...await readRunState(root, archived.runId), status: 'archived' });
779
+
780
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
781
+ const selection = workflow.latestEligibleRunsByTask.find((entry) => entry.taskId === 'T1');
782
+
783
+ assert.equal(workflow.latestRun, null);
784
+ assert.deepEqual(selection?.candidates.map((entry) => entry.runId), ['run-failed']);
785
+ assert.deepEqual(selection?.rejected.map((entry) => entry.runId).sort(), ['run-archived', 'run-failed']);
786
+ assert.equal(selection?.rejected.some((entry) => entry.reasons.includes('Run failed.')), true);
787
+ assert.equal(selection?.rejected.some((entry) => entry.reasons.includes('Run is archived.')), true);
788
+ } finally {
789
+ await rm(root, { recursive: true, force: true });
790
+ }
791
+ });
792
+
793
+ test('workflow state uses explicit partition runtime despite divergent git branch', async () => {
794
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-divergent-'));
795
+ try {
796
+ await initProject(root);
797
+ await execFileAsync('git', ['init'], { cwd: root });
798
+ await execFileAsync('git', ['checkout', '-b', 'current-branch'], { cwd: root });
799
+ await writeBranchDocs(root, 'feature', validTaskMarkdown('T1', [])
800
+ .replace('packages/core/src/index.ts', 'docs/t1.md')
801
+ .replace('validation:\n - npm test', 'validation_timing: task_end\nrequires_verify_before_next: true\nvalidation:\n - npm test'));
802
+ const divergent = await createRun(root, { runId: 'run-divergent' });
803
+ await bindTestRunState(root, divergent.runId, 'feature', 'T1');
804
+ const bound = await readRunState(root, divergent.runId);
805
+ await writeRunState(root, {
806
+ ...bound,
807
+ status: 'completed',
808
+ tasks: {
809
+ ...bound.tasks,
810
+ T1: {
811
+ status: 'implemented_pending_validation',
812
+ implementationStatus: 'implemented',
813
+ verificationStatus: 'not_run',
814
+ validationBatch: null,
815
+ validationTiming: 'task_end',
816
+ requiresVerifyBeforeNext: true,
817
+ gaps: [],
818
+ artifacts: []
819
+ }
820
+ }
821
+ });
822
+
823
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'T1' });
824
+ const selection = workflow.latestEligibleRunsByTask.find((entry) => entry.taskId === 'T1');
825
+
826
+ assert.equal(workflow.latestRun?.runId, 'run-divergent');
827
+ assert.equal(selection?.selected?.runId, 'run-divergent');
828
+ assert.deepEqual(selection?.rejected.map((entry) => entry.runId), []);
829
+ assert.equal(workflow.nextIntent.intent, 'run_task_validation');
830
+ assert.equal(workflow.recommendedNextCommand, 'sdd test task-T1 --branch feature');
831
+ } finally {
832
+ await rm(root, { recursive: true, force: true });
833
+ }
834
+ });
835
+
836
+ test('workflow state recommends wave validation for implemented wave_end boundary', async () => {
837
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-wave-boundary-'));
838
+ try {
839
+ await initProject(root);
840
+ await writeBranchDocs(root, 'feature', `# Tasks
841
+
842
+ ${validTaskMarkdown('W1', [])
843
+ .replace('packages/core/src/index.ts', 'docs/w1.md')
844
+ .replace('validation:\n - npm test', 'validation_batch: docs-wave\nvalidation_timing: wave_end\nrequires_verify_before_next: false\nvalidation:\n - npm test')}`);
845
+ const run = await createRun(root, { runId: 'run-w1-implemented' });
846
+ await bindTestRunState(root, run.runId, 'feature', 'W1');
847
+ const bound = await readRunState(root, run.runId);
848
+ await writeRunState(root, {
849
+ ...bound,
850
+ status: 'completed',
851
+ tasks: {
852
+ ...bound.tasks,
853
+ W1: {
854
+ status: 'implemented_pending_validation',
855
+ implementationStatus: 'implemented',
856
+ verificationStatus: 'pending_batch',
857
+ validationBatch: 'docs-wave',
858
+ validationTiming: 'wave_end',
859
+ requiresVerifyBeforeNext: false,
860
+ gaps: [],
861
+ artifacts: []
862
+ }
863
+ }
864
+ });
865
+
866
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'W1' });
867
+
868
+ assert.equal(workflow.nextIntent.intent, 'run_wave_validation');
869
+ assert.equal(workflow.recommendedNextCommand, 'sdd test docs-wave --branch feature');
870
+ } finally {
871
+ await rm(root, { recursive: true, force: true });
872
+ }
873
+ });
874
+
875
+ test('workflow state dependency readiness ignores newer ineligible runtime state', async () => {
876
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-workflow-state-eligible-runtime-'));
877
+ try {
878
+ await initProject(root);
879
+ await writeBranchDocs(root, 'feature', `# Tasks
880
+
881
+ ${validTaskMarkdown('DEP1', [])
882
+ .replace('packages/core/src/index.ts', 'docs/dep1.md')
883
+ .replace('validation:\n - npm test', 'validation_batch: dep-batch\nvalidation_timing: batch_end\nrequires_verify_before_next: false\nvalidation:\n - npm test')}
884
+ ${validTaskMarkdown('DEP2', ['DEP1']).replace('packages/core/src/index.ts', 'docs/dep2.md')}`);
885
+ const eligible = await createRun(root, { runId: 'run-dep1-eligible' });
886
+ await bindTestRunState(root, eligible.runId, 'feature', 'DEP1');
887
+ const eligibleState = await readRunState(root, eligible.runId);
888
+ await writeRunState(root, {
889
+ ...eligibleState,
890
+ status: 'completed',
891
+ tasks: {
892
+ ...eligibleState.tasks,
893
+ DEP1: {
894
+ status: 'implemented_pending_validation',
895
+ implementationStatus: 'implemented',
896
+ verificationStatus: 'pending_batch',
897
+ validationBatch: 'dep-batch',
898
+ validationTiming: 'batch_end',
899
+ requiresVerifyBeforeNext: false,
900
+ gaps: [],
901
+ artifacts: []
902
+ }
903
+ }
904
+ });
905
+ const blocked = await createRun(root, { runId: 'run-dep1-blocked-newer' });
906
+ await bindTestRunState(root, blocked.runId, 'feature', 'DEP1');
907
+ const blockedState = await readRunState(root, blocked.runId);
908
+ await writeRunState(root, {
909
+ ...blockedState,
910
+ status: 'blocked',
911
+ updatedAt: new Date(Date.parse(eligibleState.updatedAt) + 1000).toISOString(),
912
+ tasks: {
913
+ ...blockedState.tasks,
914
+ DEP1: {
915
+ status: 'pending',
916
+ implementationStatus: 'not_started',
917
+ verificationStatus: 'not_run',
918
+ validationBatch: 'dep-batch',
919
+ validationTiming: 'batch_end',
920
+ requiresVerifyBeforeNext: false,
921
+ gaps: [],
922
+ artifacts: []
923
+ }
924
+ }
925
+ });
926
+
927
+ const workflow = await resolveWorkflowState(root, { branch: 'feature', taskId: 'DEP2' });
928
+
929
+ assert.deepEqual(workflow.dependencyBlockers, []);
930
+ assert.equal(workflow.recommendedNextCommand, 'sdd test dep-batch --branch feature');
112
931
  } finally {
113
932
  await rm(root, { recursive: true, force: true });
114
933
  }
115
- });
934
+ });
935
+
936
+ function truthAlignmentProjection(input: Pick<TruthAlignmentProjection, 'branch' | 'status' | 'ownerStage' | 'semanticImpact' | 'invalidatesStages' | 'staleRefs' | 'reasons'> & { createdAt?: string }): TruthAlignmentProjection {
937
+ return {
938
+ contract: 'sdd-truth-alignment-v1',
939
+ branch: input.branch,
940
+ sourceStage: 'goal-verify',
941
+ declaredTruthRefs: [
942
+ { kind: 'document', ref: `specs/${input.branch}/spec.md`, hash: 'spec-hash' },
943
+ { kind: 'document', ref: `specs/${input.branch}/tasks.md`, hash: 'tasks-hash' }
944
+ ],
945
+ acceptedRealityRefs: [
946
+ { kind: 'artifact', ref: `.sdd/runs/${input.branch}/goal-verify/goal-verification-v1.md`, hash: 'goal-hash' },
947
+ { kind: 'artifact', ref: `.sdd/runs/${input.branch}/do/implementation-v1.md`, hash: 'implementation-hash' }
948
+ ],
949
+ status: input.status,
950
+ ownerStage: input.ownerStage,
951
+ semanticImpact: input.semanticImpact,
952
+ staleRefs: input.staleRefs,
953
+ invalidatesStages: input.invalidatesStages,
954
+ reasons: input.reasons,
955
+ createdAt: input.createdAt ?? '2026-06-01T00:00:00.000Z'
956
+ };
957
+ }