sdd-agent-platform 0.4.2 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (834) hide show
  1. package/README.md +34 -41
  2. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js +56 -73
  3. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js.map +1 -1
  4. package/node_modules/@sdd-agent-platform/core/dist/artifacts/ingestion.js +9 -64
  5. package/node_modules/@sdd-agent-platform/core/dist/artifacts/ingestion.js.map +1 -1
  6. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-evidence.js +1 -1
  7. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-evidence.js.map +1 -1
  8. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-result.js +17 -26
  9. package/node_modules/@sdd-agent-platform/core/dist/artifacts/sdd-result.js.map +1 -1
  10. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.d.ts +8 -7
  11. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js +8 -12
  12. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js.map +1 -1
  13. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.d.ts +1 -1
  14. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js +1 -1
  15. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js.map +1 -1
  16. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.d.ts +3 -4
  17. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js +377 -411
  18. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js.map +1 -1
  19. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.d.ts +1 -1
  20. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js +18 -25
  21. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js.map +1 -1
  22. package/node_modules/@sdd-agent-platform/core/dist/context/evidence-summary.js +8 -26
  23. package/node_modules/@sdd-agent-platform/core/dist/context/evidence-summary.js.map +1 -1
  24. package/node_modules/@sdd-agent-platform/core/dist/context/log-worker.js +2 -2
  25. package/node_modules/@sdd-agent-platform/core/dist/context/log-worker.js.map +1 -1
  26. package/node_modules/@sdd-agent-platform/core/dist/context-offload/contracts.d.ts +1 -1
  27. package/node_modules/@sdd-agent-platform/core/dist/contracts.d.ts +6 -1
  28. package/node_modules/@sdd-agent-platform/core/dist/contracts.js +5 -0
  29. package/node_modules/@sdd-agent-platform/core/dist/contracts.js.map +1 -1
  30. package/node_modules/@sdd-agent-platform/core/dist/delegation/model.d.ts +0 -3
  31. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.d.ts +0 -3
  32. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.js +4 -7
  33. package/node_modules/@sdd-agent-platform/core/dist/delegation/validation.js.map +1 -1
  34. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js +3 -13
  35. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js.map +1 -1
  36. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/local-run-index.js +1 -9
  37. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/local-run-index.js.map +1 -1
  38. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js +9 -9
  39. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/project.js.map +1 -1
  40. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js +1 -0
  41. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/registries.js.map +1 -1
  42. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js +4 -4
  43. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-evidence.js.map +1 -1
  44. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js +24 -0
  45. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/run-trust.js.map +1 -1
  46. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js +2 -2
  47. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  48. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js +43 -180
  49. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js.map +1 -1
  50. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.d.ts +1 -1
  51. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js +7 -14
  52. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js.map +1 -1
  53. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js +110 -0
  54. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js.map +1 -0
  55. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js +4 -4
  56. package/node_modules/@sdd-agent-platform/core/dist/execution/background-executor.js.map +1 -1
  57. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js +3 -3
  58. package/node_modules/@sdd-agent-platform/core/dist/execution/foreground-subagents.js.map +1 -1
  59. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js +85 -86
  60. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js.map +1 -1
  61. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js +2 -3
  62. package/node_modules/@sdd-agent-platform/core/dist/execution/resident-worker.js.map +1 -1
  63. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js +2 -2
  64. package/node_modules/@sdd-agent-platform/core/dist/execution/stage-team-runtime.js.map +1 -1
  65. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.d.ts +1 -1
  66. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.js +1 -1
  67. package/node_modules/@sdd-agent-platform/core/dist/governance/policy.js.map +1 -1
  68. package/node_modules/@sdd-agent-platform/core/dist/instructions.d.ts +1 -1
  69. package/node_modules/@sdd-agent-platform/core/dist/instructions.js +31 -67
  70. package/node_modules/@sdd-agent-platform/core/dist/instructions.js.map +1 -1
  71. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/decision-gate.js +1 -1
  72. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/decision-gate.js.map +1 -1
  73. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.d.ts +0 -1
  74. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js +59 -85
  75. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js.map +1 -1
  76. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  77. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js +7 -0
  78. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js.map +1 -0
  79. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  80. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js +461 -0
  81. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js.map +1 -0
  82. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.d.ts +2 -0
  83. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js +3 -0
  84. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js.map +1 -0
  85. package/node_modules/@sdd-agent-platform/core/dist/orchestration/contracts.d.ts +1 -1
  86. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.d.ts +2 -12
  87. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js +32 -80
  88. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js.map +1 -1
  89. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.d.ts +2 -5
  90. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js +27 -69
  91. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-capability-catalog.js.map +1 -1
  92. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js +118 -34
  93. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js.map +1 -1
  94. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js +1 -1
  95. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-runtime-static.js.map +1 -1
  96. package/node_modules/@sdd-agent-platform/core/dist/registries/capability-sources.js +1 -1
  97. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.d.ts +1 -1
  98. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js +8 -15
  99. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js.map +1 -1
  100. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js +4 -4
  101. package/node_modules/@sdd-agent-platform/core/dist/registries/eval-learning-context.js.map +1 -1
  102. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.d.ts +13 -0
  103. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js +76 -0
  104. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js.map +1 -0
  105. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js +2 -2
  106. package/node_modules/@sdd-agent-platform/core/dist/registries/query-status.js.map +1 -1
  107. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js +7 -7
  108. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js.map +1 -1
  109. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js +4 -4
  110. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js.map +1 -1
  111. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js +2 -2
  112. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-plugins.js.map +1 -1
  113. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js +11 -11
  114. package/node_modules/@sdd-agent-platform/core/dist/registries/worker-adapters.js.map +1 -1
  115. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.d.ts +1 -1
  116. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js +21 -21
  117. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js.map +1 -1
  118. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js +2 -1
  119. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js.map +1 -1
  120. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js +6 -6
  121. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js.map +1 -1
  122. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js +11 -23
  123. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js.map +1 -1
  124. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.d.ts +2 -2
  125. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js +18 -20
  126. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js.map +1 -1
  127. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime.d.ts +0 -2
  128. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js +1 -1
  129. package/node_modules/@sdd-agent-platform/core/dist/router/route-projection.js.map +1 -1
  130. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js +16 -48
  131. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js.map +1 -1
  132. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js +11 -1
  133. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js.map +1 -1
  134. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js +2 -2
  135. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-validation.js.map +1 -1
  136. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.d.ts +2 -2
  137. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js +20 -28
  138. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js.map +1 -1
  139. package/node_modules/@sdd-agent-platform/core/dist/router.d.ts +0 -1
  140. package/node_modules/@sdd-agent-platform/core/dist/router.js +0 -1
  141. package/node_modules/@sdd-agent-platform/core/dist/router.js.map +1 -1
  142. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.d.ts +6 -6
  143. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js +13 -124
  144. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js.map +1 -1
  145. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.d.ts +2 -0
  146. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js +5 -7
  147. package/node_modules/@sdd-agent-platform/core/dist/run-state/inspect-run.js.map +1 -1
  148. package/node_modules/@sdd-agent-platform/core/dist/run-state/model.d.ts +28 -28
  149. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.d.ts +3 -2
  150. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js +15 -66
  151. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-index.js.map +1 -1
  152. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js +26 -36
  153. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js.map +1 -1
  154. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.d.ts +0 -4
  155. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js +5 -51
  156. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js.map +1 -1
  157. package/node_modules/@sdd-agent-platform/core/dist/run-state.d.ts +0 -1
  158. package/node_modules/@sdd-agent-platform/core/dist/run-state.js +0 -1
  159. package/node_modules/@sdd-agent-platform/core/dist/run-state.js.map +1 -1
  160. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js +1 -1
  161. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js.map +1 -1
  162. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js +7 -16
  163. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js.map +1 -1
  164. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/model.d.ts +1 -2
  165. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.d.ts +0 -1
  166. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js +1 -4
  167. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js.map +1 -1
  168. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.d.ts +2 -2
  169. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js +11 -0
  170. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js.map +1 -1
  171. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  172. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js +179 -0
  173. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  174. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.d.ts +0 -2
  175. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js +10 -97
  176. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/document-hashes.js.map +1 -1
  177. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.d.ts +1 -1
  178. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js +6 -8
  179. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/run-binding.js.map +1 -1
  180. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.d.ts +5 -2
  181. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js +85 -68
  182. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js.map +1 -1
  183. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js +2 -2
  184. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js.map +1 -1
  185. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js +40 -0
  186. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js.map +1 -0
  187. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.d.ts +12 -0
  188. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js +2 -0
  189. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js.map +1 -0
  190. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.d.ts +2 -2
  191. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js +19 -26
  192. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js.map +1 -1
  193. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.d.ts +1 -1
  194. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js +3 -6
  195. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js.map +1 -1
  196. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.d.ts +111 -263
  197. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js +1272 -1124
  198. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js.map +1 -1
  199. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js +5 -5
  200. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js.map +1 -1
  201. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.d.ts +1 -44
  202. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js +47 -170
  203. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js.map +1 -1
  204. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js +73 -73
  205. package/node_modules/@sdd-agent-platform/core/dist/subagents/contracts.d.ts +1 -1
  206. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js +7 -7
  207. package/node_modules/@sdd-agent-platform/core/dist/subagents/runtime.js.map +1 -1
  208. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.d.ts +1 -0
  209. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js +2 -0
  210. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js.map +1 -0
  211. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.d.ts +1 -0
  212. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js +2 -0
  213. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js.map +1 -0
  214. package/node_modules/@sdd-agent-platform/core/dist/sync-back.d.ts +1 -0
  215. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js +2 -0
  216. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js.map +1 -0
  217. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.d.ts +167 -0
  218. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js +377 -0
  219. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js.map +1 -0
  220. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js +329 -314
  221. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js.map +1 -1
  222. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.d.ts +1 -0
  223. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js +53 -7
  224. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js.map +1 -1
  225. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js +9 -12
  226. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js.map +1 -1
  227. package/node_modules/@sdd-agent-platform/core/dist/tsconfig.tsbuildinfo +1 -1
  228. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.d.ts +0 -48
  229. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js +1 -520
  230. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js.map +1 -1
  231. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.d.ts +5 -5
  232. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js +14 -14
  233. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js.map +1 -1
  234. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.d.ts +1 -0
  235. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js +111 -159
  236. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js.map +1 -1
  237. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  238. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js +521 -0
  239. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js.map +1 -0
  240. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js +21 -21
  241. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js.map +1 -1
  242. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.d.ts +0 -18
  243. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js +5 -27
  244. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-wave.js.map +1 -1
  245. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js +45 -45
  246. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js.map +1 -1
  247. package/node_modules/@sdd-agent-platform/core/dist/verification.d.ts +3 -3
  248. package/node_modules/@sdd-agent-platform/core/dist/verification.js +2 -2
  249. package/node_modules/@sdd-agent-platform/core/dist/verification.js.map +1 -1
  250. package/node_modules/@sdd-agent-platform/core/dist/work-units/contracts.d.ts +1 -1
  251. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js +9 -227
  252. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  253. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js +9 -50
  254. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js.map +1 -1
  255. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js +4 -42
  256. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js.map +1 -1
  257. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.d.ts +2 -3
  258. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -0
  259. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js +2 -1
  260. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  261. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/dependencies.js +1 -1
  262. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.d.ts +1 -0
  263. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js +23 -63
  264. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  265. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.d.ts +2 -2
  266. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js +43 -65
  267. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js.map +1 -1
  268. package/node_modules/@sdd-agent-platform/core/package.json +5 -2
  269. package/node_modules/@sdd-agent-platform/core/src/ai-tools.test.ts +238 -185
  270. package/node_modules/@sdd-agent-platform/core/src/ai-tools.ts +56 -73
  271. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.test.ts +189 -227
  272. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.ts +222 -278
  273. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.test.ts +28 -28
  274. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.ts +301 -301
  275. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.test.ts +181 -181
  276. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.ts +231 -240
  277. package/node_modules/@sdd-agent-platform/core/src/artifacts/templates.ts +99 -99
  278. package/node_modules/@sdd-agent-platform/core/src/artifacts.ts +4 -4
  279. package/node_modules/@sdd-agent-platform/core/src/coding-facts/contracts.ts +79 -79
  280. package/node_modules/@sdd-agent-platform/core/src/coding-facts.ts +1 -1
  281. package/node_modules/@sdd-agent-platform/core/src/config/init-project.test.ts +314 -318
  282. package/node_modules/@sdd-agent-platform/core/src/config/init-project.ts +128 -123
  283. package/node_modules/@sdd-agent-platform/core/src/config/project-config.ts +265 -265
  284. package/node_modules/@sdd-agent-platform/core/src/config/project-detection.ts +147 -147
  285. package/node_modules/@sdd-agent-platform/core/src/config/starter-documents.ts +400 -432
  286. package/node_modules/@sdd-agent-platform/core/src/context/budget.ts +30 -30
  287. package/node_modules/@sdd-agent-platform/core/src/context/build-package.ts +304 -311
  288. package/node_modules/@sdd-agent-platform/core/src/context/command-summary.ts +45 -45
  289. package/node_modules/@sdd-agent-platform/core/src/context/context-build.test.ts +188 -189
  290. package/node_modules/@sdd-agent-platform/core/src/context/evidence-summary.ts +144 -163
  291. package/node_modules/@sdd-agent-platform/core/src/context/log-worker.ts +48 -48
  292. package/node_modules/@sdd-agent-platform/core/src/context/source-refs.ts +41 -41
  293. package/node_modules/@sdd-agent-platform/core/src/context-offload/contracts.ts +47 -47
  294. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.test.ts +71 -71
  295. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.ts +178 -178
  296. package/node_modules/@sdd-agent-platform/core/src/context-offload.ts +2 -2
  297. package/node_modules/@sdd-agent-platform/core/src/context.ts +6 -6
  298. package/node_modules/@sdd-agent-platform/core/src/contracts/issues.ts +13 -13
  299. package/node_modules/@sdd-agent-platform/core/src/contracts.test.ts +9 -9
  300. package/node_modules/@sdd-agent-platform/core/src/contracts.ts +121 -116
  301. package/node_modules/@sdd-agent-platform/core/src/delegation/delegation.test.ts +183 -183
  302. package/node_modules/@sdd-agent-platform/core/src/delegation/model.ts +23 -26
  303. package/node_modules/@sdd-agent-platform/core/src/delegation/queue.ts +58 -58
  304. package/node_modules/@sdd-agent-platform/core/src/delegation/run-state.ts +14 -14
  305. package/node_modules/@sdd-agent-platform/core/src/delegation/state-machine.ts +90 -90
  306. package/node_modules/@sdd-agent-platform/core/src/delegation/validation.ts +124 -127
  307. package/node_modules/@sdd-agent-platform/core/src/delegation.ts +26 -26
  308. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/ai-entries.ts +28 -28
  309. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/document-chain.ts +104 -112
  310. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/local-run-index.ts +19 -27
  311. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/project.ts +84 -84
  312. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/registries.ts +252 -251
  313. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-evidence.ts +330 -330
  314. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-records.ts +79 -79
  315. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-trust.ts +128 -107
  316. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/runtime-contracts.ts +300 -300
  317. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.test.ts +628 -755
  318. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.ts +301 -453
  319. package/node_modules/@sdd-agent-platform/core/src/doctor/model.ts +13 -13
  320. package/node_modules/@sdd-agent-platform/core/src/doctor/summary.ts +11 -11
  321. package/node_modules/@sdd-agent-platform/core/src/doctor.ts +2 -2
  322. package/node_modules/@sdd-agent-platform/core/src/evidence/lookup.ts +80 -88
  323. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime/contracts.ts +48 -48
  324. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime.ts +1 -1
  325. package/node_modules/@sdd-agent-platform/core/src/execution/agent-execution-records.ts +195 -195
  326. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.test.ts +187 -235
  327. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.ts +305 -305
  328. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.test.ts +97 -106
  329. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.ts +453 -453
  330. package/node_modules/@sdd-agent-platform/core/src/execution/host-invocation.ts +225 -226
  331. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.test.ts +132 -143
  332. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.ts +436 -437
  333. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.test.ts +102 -102
  334. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.ts +271 -271
  335. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.test.ts +111 -121
  336. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.ts +231 -231
  337. package/node_modules/@sdd-agent-platform/core/src/execution.ts +5 -5
  338. package/node_modules/@sdd-agent-platform/core/src/governance/policy.test.ts +57 -65
  339. package/node_modules/@sdd-agent-platform/core/src/governance/policy.ts +175 -175
  340. package/node_modules/@sdd-agent-platform/core/src/governance.ts +1 -1
  341. package/node_modules/@sdd-agent-platform/core/src/instructions.test.ts +80 -64
  342. package/node_modules/@sdd-agent-platform/core/src/instructions.ts +32 -68
  343. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.test.ts +174 -174
  344. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.ts +373 -373
  345. package/node_modules/@sdd-agent-platform/core/src/lifecycle/rendering.ts +29 -29
  346. package/node_modules/@sdd-agent-platform/core/src/lifecycle/risk-signals.ts +146 -146
  347. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.test.ts +47 -47
  348. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.ts +255 -280
  349. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/contracts.ts +179 -0
  350. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/kernel.ts +522 -0
  351. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph.ts +2 -0
  352. package/node_modules/@sdd-agent-platform/core/src/lifecycle.ts +4 -4
  353. package/node_modules/@sdd-agent-platform/core/src/orchestration/contracts.ts +50 -50
  354. package/node_modules/@sdd-agent-platform/core/src/orchestration/index.ts +2 -2
  355. package/node_modules/@sdd-agent-platform/core/src/orchestration/runtime.ts +331 -394
  356. package/node_modules/@sdd-agent-platform/core/src/path-safety.test.ts +22 -22
  357. package/node_modules/@sdd-agent-platform/core/src/phase8-contracts.test.ts +243 -242
  358. package/node_modules/@sdd-agent-platform/core/src/phase8-projection-compat.test.ts +152 -153
  359. package/node_modules/@sdd-agent-platform/core/src/phase8-risk-kernel.test.ts +277 -277
  360. package/node_modules/@sdd-agent-platform/core/src/phase9-lifecycle-graph.test.ts +103 -0
  361. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.test.ts +88 -88
  362. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.ts +222 -222
  363. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.test.ts +79 -79
  364. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.ts +160 -160
  365. package/node_modules/@sdd-agent-platform/core/src/planning.ts +2 -2
  366. package/node_modules/@sdd-agent-platform/core/src/registries/agent-capability-catalog.ts +426 -473
  367. package/node_modules/@sdd-agent-platform/core/src/registries/agent-registry.ts +230 -146
  368. package/node_modules/@sdd-agent-platform/core/src/registries/agent-runtime-static.ts +142 -142
  369. package/node_modules/@sdd-agent-platform/core/src/registries/capability-sources.ts +253 -253
  370. package/node_modules/@sdd-agent-platform/core/src/registries/command-team-runtime.ts +302 -309
  371. package/node_modules/@sdd-agent-platform/core/src/registries/eval-learning-context.ts +246 -246
  372. package/node_modules/@sdd-agent-platform/core/src/registries/plan-scout-domains.ts +89 -0
  373. package/node_modules/@sdd-agent-platform/core/src/registries/query-status.ts +119 -119
  374. package/node_modules/@sdd-agent-platform/core/src/registries/registries.test.ts +454 -445
  375. package/node_modules/@sdd-agent-platform/core/src/registries/skill-capabilities.ts +37 -37
  376. package/node_modules/@sdd-agent-platform/core/src/registries/tool-capabilities.ts +135 -135
  377. package/node_modules/@sdd-agent-platform/core/src/registries/tool-plugins.ts +132 -132
  378. package/node_modules/@sdd-agent-platform/core/src/registries/worker-adapters.ts +144 -144
  379. package/node_modules/@sdd-agent-platform/core/src/registries/workflow-gates.ts +111 -111
  380. package/node_modules/@sdd-agent-platform/core/src/registries.ts +42 -42
  381. package/node_modules/@sdd-agent-platform/core/src/risk/consumer-diagnostics.ts +98 -97
  382. package/node_modules/@sdd-agent-platform/core/src/risk/contracts.ts +63 -63
  383. package/node_modules/@sdd-agent-platform/core/src/risk/kernel.ts +233 -233
  384. package/node_modules/@sdd-agent-platform/core/src/risk/legacy-adapters.ts +251 -263
  385. package/node_modules/@sdd-agent-platform/core/src/risk/workflow-gates.ts +203 -205
  386. package/node_modules/@sdd-agent-platform/core/src/risk.ts +5 -5
  387. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime-config.ts +327 -327
  388. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime.ts +388 -390
  389. package/node_modules/@sdd-agent-platform/core/src/router/profile-resolution.ts +154 -154
  390. package/node_modules/@sdd-agent-platform/core/src/router/risk-policy.ts +33 -33
  391. package/node_modules/@sdd-agent-platform/core/src/router/route-cache.ts +100 -100
  392. package/node_modules/@sdd-agent-platform/core/src/router/route-projection.ts +356 -356
  393. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.test.ts +428 -665
  394. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.ts +2 -2
  395. package/node_modules/@sdd-agent-platform/core/src/router/routing-rules.ts +73 -73
  396. package/node_modules/@sdd-agent-platform/core/src/router/routing.ts +189 -223
  397. package/node_modules/@sdd-agent-platform/core/src/router/runtime-import.ts +464 -453
  398. package/node_modules/@sdd-agent-platform/core/src/router/runtime-inspection.ts +124 -124
  399. package/node_modules/@sdd-agent-platform/core/src/router/runtime-registry.ts +123 -123
  400. package/node_modules/@sdd-agent-platform/core/src/router/runtime-validation.ts +277 -277
  401. package/node_modules/@sdd-agent-platform/core/src/router/stage-route-binding.ts +273 -279
  402. package/node_modules/@sdd-agent-platform/core/src/router/team-mode.ts +170 -170
  403. package/node_modules/@sdd-agent-platform/core/src/router.ts +5 -6
  404. package/node_modules/@sdd-agent-platform/core/src/run-state/artifacts.ts +126 -240
  405. package/node_modules/@sdd-agent-platform/core/src/run-state/events.ts +27 -27
  406. package/node_modules/@sdd-agent-platform/core/src/run-state/inspect-run.ts +172 -172
  407. package/node_modules/@sdd-agent-platform/core/src/run-state/invocation-ledger.ts +109 -109
  408. package/node_modules/@sdd-agent-platform/core/src/run-state/model.ts +252 -253
  409. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.test.ts +80 -52
  410. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.ts +301 -352
  411. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.test.ts +70 -118
  412. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.ts +406 -416
  413. package/node_modules/@sdd-agent-platform/core/src/run-state/task-evidence.ts +198 -252
  414. package/node_modules/@sdd-agent-platform/core/src/run-state/timing.ts +146 -146
  415. package/node_modules/@sdd-agent-platform/core/src/run-state.ts +8 -9
  416. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/build.ts +60 -60
  417. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/findings.ts +249 -256
  418. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/model.ts +139 -140
  419. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.test.ts +65 -66
  420. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.ts +2 -2
  421. package/node_modules/@sdd-agent-platform/core/src/runtime-paths.ts +249 -253
  422. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.test.ts +101 -96
  423. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.ts +314 -292
  424. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.test.ts +380 -0
  425. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.ts +207 -0
  426. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/context.ts +111 -111
  427. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/document-hashes.ts +207 -306
  428. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/run-binding.ts +95 -97
  429. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-inspection.ts +39 -39
  430. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.test.ts +467 -523
  431. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.ts +738 -709
  432. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-rendering.ts +81 -81
  433. package/node_modules/@sdd-agent-platform/core/src/sdd-docs.ts +5 -5
  434. package/node_modules/@sdd-agent-platform/core/src/spec-manager-contracts.ts +13 -0
  435. package/node_modules/@sdd-agent-platform/core/src/stage-artifacts.ts +435 -450
  436. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration-contracts.ts +316 -322
  437. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.test.ts +2963 -2902
  438. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.ts +5856 -5831
  439. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/contracts.ts +40 -40
  440. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.test.ts +209 -209
  441. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.ts +360 -360
  442. package/node_modules/@sdd-agent-platform/core/src/stage-runtime.ts +2 -2
  443. package/node_modules/@sdd-agent-platform/core/src/status/project-status.test.ts +288 -511
  444. package/node_modules/@sdd-agent-platform/core/src/status/project-status.ts +651 -851
  445. package/node_modules/@sdd-agent-platform/core/src/status.ts +2 -2
  446. package/node_modules/@sdd-agent-platform/core/src/storage/json-io.ts +10 -10
  447. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.test.ts +489 -681
  448. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.ts +1981 -1981
  449. package/node_modules/@sdd-agent-platform/core/src/subagents/contracts.ts +45 -45
  450. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.test.ts +232 -232
  451. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.ts +307 -307
  452. package/node_modules/@sdd-agent-platform/core/src/subagents.ts +2 -2
  453. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.test.ts +141 -0
  454. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.ts +566 -0
  455. package/node_modules/@sdd-agent-platform/core/src/task-risk-profile.ts +193 -193
  456. package/node_modules/@sdd-agent-platform/core/src/test-support/fixtures.ts +413 -398
  457. package/node_modules/@sdd-agent-platform/core/src/test-support/run-state.ts +102 -56
  458. package/node_modules/@sdd-agent-platform/core/src/test-support.ts +2 -2
  459. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.test.ts +72 -72
  460. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.ts +9 -12
  461. package/node_modules/@sdd-agent-platform/core/src/verification/rendering.ts +137 -137
  462. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.test.ts +77 -84
  463. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.ts +77 -77
  464. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.ts +455 -506
  465. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.test.ts → task-evidence-judgment.test.ts} +261 -261
  466. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.ts → task-evidence-judgment.ts} +619 -619
  467. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.ts +1190 -1190
  468. package/node_modules/@sdd-agent-platform/core/src/verification/validation-cache.ts +106 -106
  469. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.ts +513 -556
  470. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.ts +334 -334
  471. package/node_modules/@sdd-agent-platform/core/src/verification.ts +8 -8
  472. package/node_modules/@sdd-agent-platform/core/src/work-units/contracts.ts +26 -26
  473. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.test.ts +88 -88
  474. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.ts +112 -112
  475. package/node_modules/@sdd-agent-platform/core/src/work-units.ts +2 -2
  476. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/evidence-packet.ts +190 -425
  477. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.test.ts +169 -507
  478. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.ts +136 -182
  479. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.test.ts +135 -174
  480. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.ts +153 -194
  481. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/types.ts +111 -115
  482. package/node_modules/@sdd-agent-platform/core/src/workflow-state/affected-file-conflicts.ts +95 -93
  483. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.test.ts +32 -32
  484. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.ts +114 -114
  485. package/node_modules/@sdd-agent-platform/core/src/workflow-state/latest-eligible-run.ts +184 -224
  486. package/node_modules/@sdd-agent-platform/core/src/workflow-state/migration-recovery.ts +158 -158
  487. package/node_modules/@sdd-agent-platform/core/src/workflow-state/repair-contract.ts +77 -77
  488. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve-task-run.ts +114 -114
  489. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.test.ts +969 -956
  490. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.ts +967 -992
  491. package/node_modules/@sdd-agent-platform/core/src/workflow-state/runtime-projections.ts +712 -712
  492. package/node_modules/@sdd-agent-platform/core/src/workflow-state.ts +2 -2
  493. package/node_modules/@sdd-agent-platform/core/src/worktree/isolation.ts +130 -130
  494. package/node_modules/@sdd-agent-platform/core/src/worktree/lifecycle.ts +269 -269
  495. package/node_modules/@sdd-agent-platform/core/src/worktree/worktree.test.ts +150 -150
  496. package/node_modules/@sdd-agent-platform/core/src/worktree.ts +2 -2
  497. package/node_modules/@sdd-agent-platform/core/tsconfig.json +15 -15
  498. package/package.json +2 -2
  499. package/packages/cli/dist/args.js +2 -2
  500. package/packages/cli/dist/args.js.map +1 -1
  501. package/packages/cli/dist/commands/ai-tools.js +2 -13
  502. package/packages/cli/dist/commands/ai-tools.js.map +1 -1
  503. package/packages/cli/dist/commands/{verifies.d.ts → artifact.d.ts} +1 -1
  504. package/packages/cli/dist/commands/artifact.js +168 -0
  505. package/packages/cli/dist/commands/artifact.js.map +1 -0
  506. package/packages/cli/dist/commands/context.js +1 -1
  507. package/packages/cli/dist/commands/context.js.map +1 -1
  508. package/packages/cli/dist/commands/evidence.js.map +1 -0
  509. package/packages/cli/dist/commands/execution.js +127 -49
  510. package/packages/cli/dist/commands/execution.js.map +1 -1
  511. package/packages/cli/dist/commands/governance.js +1 -1
  512. package/packages/cli/dist/commands/governance.js.map +1 -1
  513. package/packages/cli/dist/commands/init.js +1 -6
  514. package/packages/cli/dist/commands/init.js.map +1 -1
  515. package/packages/cli/dist/commands/instructions.d.ts +1 -1
  516. package/packages/cli/dist/commands/instructions.js +15 -1
  517. package/packages/cli/dist/commands/instructions.js.map +1 -1
  518. package/packages/cli/dist/commands/registry/runtime.js +63 -40
  519. package/packages/cli/dist/commands/registry/runtime.js.map +1 -1
  520. package/packages/cli/dist/commands/run.js +13 -52
  521. package/packages/cli/dist/commands/run.js.map +1 -1
  522. package/packages/cli/dist/commands/stage-close.d.ts +60 -0
  523. package/packages/cli/dist/commands/stage-close.js +270 -41
  524. package/packages/cli/dist/commands/stage-close.js.map +1 -1
  525. package/packages/cli/dist/commands/status.js +9 -68
  526. package/packages/cli/dist/commands/status.js.map +1 -1
  527. package/packages/cli/dist/commands/tasks.js.map +1 -1
  528. package/packages/cli/dist/dispatch.js +6 -26
  529. package/packages/cli/dist/dispatch.js.map +1 -1
  530. package/packages/cli/dist/help.js +153 -159
  531. package/packages/cli/dist/help.js.map +1 -1
  532. package/packages/cli/dist/renderers/artifacts.d.ts +5 -0
  533. package/packages/cli/dist/renderers/artifacts.js +43 -0
  534. package/packages/cli/dist/renderers/artifacts.js.map +1 -0
  535. package/packages/cli/dist/renderers/doctor.js +1 -2
  536. package/packages/cli/dist/renderers/doctor.js.map +1 -1
  537. package/packages/cli/dist/renderers/execution.js +1 -1
  538. package/packages/cli/dist/renderers/execution.js.map +1 -1
  539. package/packages/cli/dist/renderers/json.d.ts +0 -1
  540. package/packages/cli/dist/renderers/json.js +0 -3
  541. package/packages/cli/dist/renderers/json.js.map +1 -1
  542. package/packages/cli/dist/renderers/registry-runtime.d.ts +1 -2
  543. package/packages/cli/dist/renderers/registry-runtime.js +0 -20
  544. package/packages/cli/dist/renderers/registry-runtime.js.map +1 -1
  545. package/packages/cli/dist/renderers/router.js +1 -1
  546. package/packages/cli/dist/renderers/router.js.map +1 -1
  547. package/packages/cli/dist/renderers/workflow.d.ts +53 -0
  548. package/packages/cli/dist/renderers/workflow.js +93 -34
  549. package/packages/cli/dist/renderers/workflow.js.map +1 -1
  550. package/packages/cli/dist/tsconfig.tsbuildinfo +1 -1
  551. package/packages/cli/package.json +2 -2
  552. package/packages/core/dist/ai-tools.js +56 -73
  553. package/packages/core/dist/ai-tools.js.map +1 -1
  554. package/packages/core/dist/artifacts/ingestion.js +9 -64
  555. package/packages/core/dist/artifacts/ingestion.js.map +1 -1
  556. package/packages/core/dist/artifacts/sdd-evidence.js +1 -1
  557. package/packages/core/dist/artifacts/sdd-evidence.js.map +1 -1
  558. package/packages/core/dist/artifacts/sdd-result.js +17 -26
  559. package/packages/core/dist/artifacts/sdd-result.js.map +1 -1
  560. package/packages/core/dist/config/init-project.d.ts +8 -7
  561. package/packages/core/dist/config/init-project.js +8 -12
  562. package/packages/core/dist/config/init-project.js.map +1 -1
  563. package/packages/core/dist/config/project-config.d.ts +1 -1
  564. package/packages/core/dist/config/project-config.js +1 -1
  565. package/packages/core/dist/config/project-config.js.map +1 -1
  566. package/packages/core/dist/config/starter-documents.d.ts +3 -4
  567. package/packages/core/dist/config/starter-documents.js +377 -411
  568. package/packages/core/dist/config/starter-documents.js.map +1 -1
  569. package/packages/core/dist/context/build-package.d.ts +1 -1
  570. package/packages/core/dist/context/build-package.js +18 -25
  571. package/packages/core/dist/context/build-package.js.map +1 -1
  572. package/packages/core/dist/context/evidence-summary.js +8 -26
  573. package/packages/core/dist/context/evidence-summary.js.map +1 -1
  574. package/packages/core/dist/context/log-worker.js +2 -2
  575. package/packages/core/dist/context/log-worker.js.map +1 -1
  576. package/packages/core/dist/context-offload/contracts.d.ts +1 -1
  577. package/packages/core/dist/contracts.d.ts +6 -1
  578. package/packages/core/dist/contracts.js +5 -0
  579. package/packages/core/dist/contracts.js.map +1 -1
  580. package/packages/core/dist/delegation/model.d.ts +0 -3
  581. package/packages/core/dist/delegation/validation.d.ts +0 -3
  582. package/packages/core/dist/delegation/validation.js +4 -7
  583. package/packages/core/dist/delegation/validation.js.map +1 -1
  584. package/packages/core/dist/doctor/checks/document-chain.js +3 -13
  585. package/packages/core/dist/doctor/checks/document-chain.js.map +1 -1
  586. package/packages/core/dist/doctor/checks/local-run-index.js +1 -9
  587. package/packages/core/dist/doctor/checks/local-run-index.js.map +1 -1
  588. package/packages/core/dist/doctor/checks/project.js +9 -9
  589. package/packages/core/dist/doctor/checks/project.js.map +1 -1
  590. package/packages/core/dist/doctor/checks/registries.js +1 -0
  591. package/packages/core/dist/doctor/checks/registries.js.map +1 -1
  592. package/packages/core/dist/doctor/checks/run-evidence.js +4 -4
  593. package/packages/core/dist/doctor/checks/run-evidence.js.map +1 -1
  594. package/packages/core/dist/doctor/checks/run-trust.js +24 -0
  595. package/packages/core/dist/doctor/checks/run-trust.js.map +1 -1
  596. package/packages/core/dist/doctor/checks/runtime-contracts.js +2 -2
  597. package/packages/core/dist/doctor/checks/runtime-contracts.js.map +1 -1
  598. package/packages/core/dist/doctor/doctor.js +43 -180
  599. package/packages/core/dist/doctor/doctor.js.map +1 -1
  600. package/packages/core/dist/evidence/lookup.d.ts +1 -1
  601. package/packages/core/dist/evidence/lookup.js +7 -14
  602. package/packages/core/dist/evidence/lookup.js.map +1 -1
  603. package/packages/core/dist/evidence-runtime/coordination.js +110 -0
  604. package/packages/core/dist/evidence-runtime/coordination.js.map +1 -0
  605. package/packages/core/dist/execution/background-executor.js +4 -4
  606. package/packages/core/dist/execution/background-executor.js.map +1 -1
  607. package/packages/core/dist/execution/foreground-subagents.js +3 -3
  608. package/packages/core/dist/execution/foreground-subagents.js.map +1 -1
  609. package/packages/core/dist/execution/host-invocation.js +85 -86
  610. package/packages/core/dist/execution/host-invocation.js.map +1 -1
  611. package/packages/core/dist/execution/resident-worker.js +2 -3
  612. package/packages/core/dist/execution/resident-worker.js.map +1 -1
  613. package/packages/core/dist/execution/stage-team-runtime.js +2 -2
  614. package/packages/core/dist/execution/stage-team-runtime.js.map +1 -1
  615. package/packages/core/dist/governance/policy.d.ts +1 -1
  616. package/packages/core/dist/governance/policy.js +1 -1
  617. package/packages/core/dist/governance/policy.js.map +1 -1
  618. package/packages/core/dist/instructions.d.ts +1 -1
  619. package/packages/core/dist/instructions.js +31 -67
  620. package/packages/core/dist/instructions.js.map +1 -1
  621. package/packages/core/dist/lifecycle/decision-gate.js +1 -1
  622. package/packages/core/dist/lifecycle/decision-gate.js.map +1 -1
  623. package/packages/core/dist/lifecycle/ship.d.ts +0 -1
  624. package/packages/core/dist/lifecycle/ship.js +59 -85
  625. package/packages/core/dist/lifecycle/ship.js.map +1 -1
  626. package/packages/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  627. package/packages/core/dist/lifecycle-graph/contracts.js +7 -0
  628. package/packages/core/dist/lifecycle-graph/contracts.js.map +1 -0
  629. package/packages/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  630. package/packages/core/dist/lifecycle-graph/kernel.js +461 -0
  631. package/packages/core/dist/lifecycle-graph/kernel.js.map +1 -0
  632. package/packages/core/dist/lifecycle-graph.d.ts +2 -0
  633. package/packages/core/dist/lifecycle-graph.js +3 -0
  634. package/packages/core/dist/lifecycle-graph.js.map +1 -0
  635. package/packages/core/dist/orchestration/contracts.d.ts +1 -1
  636. package/packages/core/dist/orchestration/runtime.d.ts +2 -12
  637. package/packages/core/dist/orchestration/runtime.js +32 -80
  638. package/packages/core/dist/orchestration/runtime.js.map +1 -1
  639. package/packages/core/dist/registries/agent-capability-catalog.d.ts +2 -5
  640. package/packages/core/dist/registries/agent-capability-catalog.js +27 -69
  641. package/packages/core/dist/registries/agent-capability-catalog.js.map +1 -1
  642. package/packages/core/dist/registries/agent-registry.js +118 -34
  643. package/packages/core/dist/registries/agent-registry.js.map +1 -1
  644. package/packages/core/dist/registries/agent-runtime-static.js +1 -1
  645. package/packages/core/dist/registries/agent-runtime-static.js.map +1 -1
  646. package/packages/core/dist/registries/capability-sources.js +1 -1
  647. package/packages/core/dist/registries/command-team-runtime.d.ts +1 -1
  648. package/packages/core/dist/registries/command-team-runtime.js +8 -15
  649. package/packages/core/dist/registries/command-team-runtime.js.map +1 -1
  650. package/packages/core/dist/registries/eval-learning-context.js +4 -4
  651. package/packages/core/dist/registries/eval-learning-context.js.map +1 -1
  652. package/packages/core/dist/registries/plan-scout-domains.d.ts +13 -0
  653. package/packages/core/dist/registries/plan-scout-domains.js +76 -0
  654. package/packages/core/dist/registries/plan-scout-domains.js.map +1 -0
  655. package/packages/core/dist/registries/query-status.js +2 -2
  656. package/packages/core/dist/registries/query-status.js.map +1 -1
  657. package/packages/core/dist/registries/skill-capabilities.js +7 -7
  658. package/packages/core/dist/registries/skill-capabilities.js.map +1 -1
  659. package/packages/core/dist/registries/tool-capabilities.js +4 -4
  660. package/packages/core/dist/registries/tool-capabilities.js.map +1 -1
  661. package/packages/core/dist/registries/tool-plugins.js +2 -2
  662. package/packages/core/dist/registries/tool-plugins.js.map +1 -1
  663. package/packages/core/dist/registries/worker-adapters.js +11 -11
  664. package/packages/core/dist/registries/worker-adapters.js.map +1 -1
  665. package/packages/core/dist/registries/workflow-gates.d.ts +1 -1
  666. package/packages/core/dist/registries/workflow-gates.js +21 -21
  667. package/packages/core/dist/registries/workflow-gates.js.map +1 -1
  668. package/packages/core/dist/risk/consumer-diagnostics.js +2 -1
  669. package/packages/core/dist/risk/consumer-diagnostics.js.map +1 -1
  670. package/packages/core/dist/risk/kernel.js +6 -6
  671. package/packages/core/dist/risk/kernel.js.map +1 -1
  672. package/packages/core/dist/risk/legacy-adapters.js +11 -23
  673. package/packages/core/dist/risk/legacy-adapters.js.map +1 -1
  674. package/packages/core/dist/risk/workflow-gates.d.ts +2 -2
  675. package/packages/core/dist/risk/workflow-gates.js +18 -20
  676. package/packages/core/dist/risk/workflow-gates.js.map +1 -1
  677. package/packages/core/dist/router/agent-runtime.d.ts +0 -2
  678. package/packages/core/dist/router/route-projection.js +1 -1
  679. package/packages/core/dist/router/route-projection.js.map +1 -1
  680. package/packages/core/dist/router/routing.js +16 -48
  681. package/packages/core/dist/router/routing.js.map +1 -1
  682. package/packages/core/dist/router/runtime-import.js +11 -1
  683. package/packages/core/dist/router/runtime-import.js.map +1 -1
  684. package/packages/core/dist/router/runtime-validation.js +2 -2
  685. package/packages/core/dist/router/runtime-validation.js.map +1 -1
  686. package/packages/core/dist/router/stage-route-binding.d.ts +2 -2
  687. package/packages/core/dist/router/stage-route-binding.js +20 -28
  688. package/packages/core/dist/router/stage-route-binding.js.map +1 -1
  689. package/packages/core/dist/router.d.ts +0 -1
  690. package/packages/core/dist/router.js +0 -1
  691. package/packages/core/dist/router.js.map +1 -1
  692. package/packages/core/dist/run-state/artifacts.d.ts +6 -6
  693. package/packages/core/dist/run-state/artifacts.js +13 -124
  694. package/packages/core/dist/run-state/artifacts.js.map +1 -1
  695. package/packages/core/dist/run-state/inspect-run.d.ts +2 -0
  696. package/packages/core/dist/run-state/inspect-run.js +5 -7
  697. package/packages/core/dist/run-state/inspect-run.js.map +1 -1
  698. package/packages/core/dist/run-state/model.d.ts +28 -28
  699. package/packages/core/dist/run-state/run-index.d.ts +3 -2
  700. package/packages/core/dist/run-state/run-index.js +15 -66
  701. package/packages/core/dist/run-state/run-index.js.map +1 -1
  702. package/packages/core/dist/run-state/run-state.js +26 -36
  703. package/packages/core/dist/run-state/run-state.js.map +1 -1
  704. package/packages/core/dist/run-state/task-evidence.d.ts +0 -4
  705. package/packages/core/dist/run-state/task-evidence.js +5 -51
  706. package/packages/core/dist/run-state/task-evidence.js.map +1 -1
  707. package/packages/core/dist/run-state.d.ts +0 -1
  708. package/packages/core/dist/run-state.js +0 -1
  709. package/packages/core/dist/run-state.js.map +1 -1
  710. package/packages/core/dist/runtime-analysis/build.js +1 -1
  711. package/packages/core/dist/runtime-analysis/build.js.map +1 -1
  712. package/packages/core/dist/runtime-analysis/findings.js +7 -16
  713. package/packages/core/dist/runtime-analysis/findings.js.map +1 -1
  714. package/packages/core/dist/runtime-analysis/model.d.ts +1 -2
  715. package/packages/core/dist/runtime-paths.d.ts +0 -1
  716. package/packages/core/dist/runtime-paths.js +1 -4
  717. package/packages/core/dist/runtime-paths.js.map +1 -1
  718. package/packages/core/dist/runtime-projection-p0.d.ts +2 -2
  719. package/packages/core/dist/runtime-projection-p0.js +11 -0
  720. package/packages/core/dist/runtime-projection-p0.js.map +1 -1
  721. package/packages/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  722. package/packages/core/dist/sdd-docs/artifact-depth.js +179 -0
  723. package/packages/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  724. package/packages/core/dist/sdd-docs/document-hashes.d.ts +0 -2
  725. package/packages/core/dist/sdd-docs/document-hashes.js +10 -97
  726. package/packages/core/dist/sdd-docs/document-hashes.js.map +1 -1
  727. package/packages/core/dist/sdd-docs/run-binding.d.ts +1 -1
  728. package/packages/core/dist/sdd-docs/run-binding.js +6 -8
  729. package/packages/core/dist/sdd-docs/run-binding.js.map +1 -1
  730. package/packages/core/dist/sdd-docs/task-parser.d.ts +5 -2
  731. package/packages/core/dist/sdd-docs/task-parser.js +85 -68
  732. package/packages/core/dist/sdd-docs/task-parser.js.map +1 -1
  733. package/packages/core/dist/sdd-docs/task-rendering.js +2 -2
  734. package/packages/core/dist/sdd-docs/task-rendering.js.map +1 -1
  735. package/packages/core/dist/spec-entry.js +40 -0
  736. package/packages/core/dist/spec-entry.js.map +1 -0
  737. package/packages/core/dist/spec-manager-contracts.d.ts +12 -0
  738. package/packages/core/dist/spec-manager-contracts.js +2 -0
  739. package/packages/core/dist/spec-manager-contracts.js.map +1 -0
  740. package/packages/core/dist/stage-artifacts.d.ts +2 -2
  741. package/packages/core/dist/stage-artifacts.js +19 -26
  742. package/packages/core/dist/stage-artifacts.js.map +1 -1
  743. package/packages/core/dist/stage-collaboration-contracts.d.ts +1 -1
  744. package/packages/core/dist/stage-collaboration-contracts.js +3 -6
  745. package/packages/core/dist/stage-collaboration-contracts.js.map +1 -1
  746. package/packages/core/dist/stage-collaboration.d.ts +111 -263
  747. package/packages/core/dist/stage-collaboration.js +1272 -1124
  748. package/packages/core/dist/stage-collaboration.js.map +1 -1
  749. package/packages/core/dist/stage-runtime/runtime.js +5 -5
  750. package/packages/core/dist/stage-runtime/runtime.js.map +1 -1
  751. package/packages/core/dist/status/project-status.d.ts +1 -44
  752. package/packages/core/dist/status/project-status.js +47 -170
  753. package/packages/core/dist/status/project-status.js.map +1 -1
  754. package/packages/core/dist/storage/runtime-store.js +73 -73
  755. package/packages/core/dist/subagents/contracts.d.ts +1 -1
  756. package/packages/core/dist/subagents/runtime.js +7 -7
  757. package/packages/core/dist/subagents/runtime.js.map +1 -1
  758. package/packages/core/dist/sync-back/apply.d.ts +1 -0
  759. package/packages/core/dist/sync-back/apply.js +2 -0
  760. package/packages/core/dist/sync-back/apply.js.map +1 -0
  761. package/packages/core/dist/sync-back/inspect.d.ts +1 -0
  762. package/packages/core/dist/sync-back/inspect.js +2 -0
  763. package/packages/core/dist/sync-back/inspect.js.map +1 -0
  764. package/packages/core/dist/sync-back.d.ts +1 -0
  765. package/packages/core/dist/sync-back.js +2 -0
  766. package/packages/core/dist/sync-back.js.map +1 -0
  767. package/packages/core/dist/task-execution-contract.d.ts +167 -0
  768. package/packages/core/dist/task-execution-contract.js +377 -0
  769. package/packages/core/dist/task-execution-contract.js.map +1 -0
  770. package/packages/core/dist/test-support/fixtures.js +329 -314
  771. package/packages/core/dist/test-support/fixtures.js.map +1 -1
  772. package/packages/core/dist/test-support/run-state.d.ts +1 -0
  773. package/packages/core/dist/test-support/run-state.js +53 -7
  774. package/packages/core/dist/test-support/run-state.js.map +1 -1
  775. package/packages/core/dist/truth-reconciliation.js +9 -12
  776. package/packages/core/dist/truth-reconciliation.js.map +1 -1
  777. package/packages/core/dist/tsconfig.tsbuildinfo +1 -1
  778. package/packages/core/dist/verification/goal-verify.d.ts +0 -48
  779. package/packages/core/dist/verification/goal-verify.js +1 -520
  780. package/packages/core/dist/verification/goal-verify.js.map +1 -1
  781. package/packages/core/dist/verification/rendering.d.ts +5 -5
  782. package/packages/core/dist/verification/rendering.js +14 -14
  783. package/packages/core/dist/verification/rendering.js.map +1 -1
  784. package/packages/core/dist/verification/single-task-loop.d.ts +1 -0
  785. package/packages/core/dist/verification/single-task-loop.js +111 -159
  786. package/packages/core/dist/verification/single-task-loop.js.map +1 -1
  787. package/packages/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  788. package/packages/core/dist/verification/task-evidence-judgment.js +521 -0
  789. package/packages/core/dist/verification/task-evidence-judgment.js.map +1 -0
  790. package/packages/core/dist/verification/test-runtime.js +21 -21
  791. package/packages/core/dist/verification/test-runtime.js.map +1 -1
  792. package/packages/core/dist/verification/validation-wave.d.ts +0 -18
  793. package/packages/core/dist/verification/validation-wave.js +5 -27
  794. package/packages/core/dist/verification/validation-wave.js.map +1 -1
  795. package/packages/core/dist/verification/verify-contract.js +45 -45
  796. package/packages/core/dist/verification/verify-contract.js.map +1 -1
  797. package/packages/core/dist/verification.d.ts +3 -3
  798. package/packages/core/dist/verification.js +2 -2
  799. package/packages/core/dist/verification.js.map +1 -1
  800. package/packages/core/dist/work-units/contracts.d.ts +1 -1
  801. package/packages/core/dist/workflow-gate/evidence-packet.js +9 -227
  802. package/packages/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  803. package/packages/core/dist/workflow-gate/hard-checks.js +9 -50
  804. package/packages/core/dist/workflow-gate/hard-checks.js.map +1 -1
  805. package/packages/core/dist/workflow-gate/policy.js +4 -42
  806. package/packages/core/dist/workflow-gate/policy.js.map +1 -1
  807. package/packages/core/dist/workflow-gate/types.d.ts +2 -3
  808. package/packages/core/dist/workflow-state/affected-file-conflicts.d.ts +1 -0
  809. package/packages/core/dist/workflow-state/affected-file-conflicts.js +2 -1
  810. package/packages/core/dist/workflow-state/affected-file-conflicts.js.map +1 -1
  811. package/packages/core/dist/workflow-state/dependencies.js +1 -1
  812. package/packages/core/dist/workflow-state/latest-eligible-run.d.ts +1 -0
  813. package/packages/core/dist/workflow-state/latest-eligible-run.js +23 -63
  814. package/packages/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  815. package/packages/core/dist/workflow-state/resolve.d.ts +2 -2
  816. package/packages/core/dist/workflow-state/resolve.js +43 -65
  817. package/packages/core/dist/workflow-state/resolve.js.map +1 -1
  818. package/packages/core/package.json +5 -2
  819. package/tsconfig.build.json +6 -7
  820. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.test.ts +0 -269
  821. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.test.ts +0 -492
  822. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.test.ts +0 -383
  823. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.test.ts +0 -188
  824. package/packages/cli/dist/commands/lifecycle.d.ts +0 -6
  825. package/packages/cli/dist/commands/lifecycle.js +0 -125
  826. package/packages/cli/dist/commands/lifecycle.js.map +0 -1
  827. package/packages/cli/dist/commands/test.d.ts +0 -6
  828. package/packages/cli/dist/commands/test.js +0 -373
  829. package/packages/cli/dist/commands/test.js.map +0 -1
  830. package/packages/cli/dist/commands/verifies.js +0 -87
  831. package/packages/cli/dist/commands/verifies.js.map +0 -1
  832. package/packages/cli/dist/commands/verify.d.ts +0 -6
  833. package/packages/cli/dist/commands/verify.js +0 -330
  834. package/packages/cli/dist/commands/verify.js.map +0 -1
@@ -1,619 +1,619 @@
1
- import { createHash } from 'node:crypto';
2
- import { readFile } from 'node:fs/promises';
3
- import {
4
- ACCEPTANCE_POLICY_RULESET_VERSION,
5
- SDD_EVIDENCE_CONTRACT,
6
- SDD_EVIDENCE_VERSION,
7
- SDD_RESULT_CONTRACT,
8
- SDD_RESULT_VERSION
9
- } from '../contracts.js';
10
- import { artifactKind, readArtifact, recordRuntimeOnlyArtifact } from '../run-state/artifacts.js';
11
- import { appendEvent } from '../run-state/events.js';
12
- import { appendArtifactHashLedgerEntry, appendDeclaredCommandLedgerEntries, appendInvocationLedgerEntry, listInvocationLedgerEntries } from '../run-state/invocation-ledger.js';
13
- import type { InvocationLedgerEntry, InvocationLedgerKind, RunState, RunStateTaskRuntime } from '../run-state/model.js';
14
- import { readRunState, writeRunState } from '../run-state/run-state.js';
15
- import { getBranchStageEvidencePathFromRef, isBranchStageEvidenceRef, toBranchStageEvidenceRef, toEvidencePayloadFileName } from '../runtime-paths.js';
16
- import { hasRuntimeEvidenceScopeViolation, readRuntimeEvidenceClaims } from '../context/evidence-summary.js';
17
- import type { ArtifactTrustValidationReport, EvidenceClaim, EvidenceCoverageStatus, EvidenceQualityIssue } from '../artifacts/sdd-evidence.js';
18
- import { validateSddResultArtifact } from '../artifacts/sdd-result.js';
19
- import type { SddResultStatus } from '../artifacts/sdd-result.js';
20
- import { taskGap } from '../sdd-docs/task-inspection.js';
21
- import { inspectSddTask } from '../sdd-docs/task-inspection.js';
22
- import type { SddTask, SddTaskGap } from '../sdd-docs/task-parser.js';
23
- import { resolveTaskRun } from '../workflow-state/resolve-task-run.js';
24
-
25
- export type GoalVerifyStatus = 'PASS' | 'PASS_WITH_GAPS' | 'FAIL' | 'BLOCKED';
26
- export type HarnessVerifyStatus = 'PASS' | 'GAPS' | 'BLOCKED' | 'HUMAN_NEEDED';
27
-
28
- export interface GoalVerifyOptions {
29
- branch?: string;
30
- taskId: string;
31
- runId?: string;
32
- reviewArtifact?: string;
33
- validationArtifact?: string;
34
- }
35
-
36
- interface PolicyRuleSet {
37
- id: typeof ACCEPTANCE_POLICY_RULESET_VERSION;
38
- version: string;
39
- ruleIds: string[];
40
- }
41
-
42
- interface PolicyDecision {
43
- status: EvidenceCoverageStatus;
44
- ruleSet: PolicyRuleSet;
45
- passedRules: string[];
46
- failedRules: string[];
47
- issueCodes: EvidenceQualityIssue[];
48
- }
49
-
50
- export interface AcceptanceCoverageItem {
51
- acceptance: string;
52
- status: EvidenceCoverageStatus;
53
- evidence: string;
54
- policyDecision?: PolicyDecision;
55
- issueCodes?: EvidenceQualityIssue[];
56
- }
57
-
58
- export interface GoalVerifyResult {
59
- runId: string;
60
- taskId: string;
61
- status: GoalVerifyStatus;
62
- task: SddTask | null;
63
- reviewArtifact: string | null;
64
- validationArtifact: string | null;
65
- coverageArtifactPath: string;
66
- acceptanceCoverage: AcceptanceCoverageItem[];
67
- gaps: SddTaskGap[];
68
- commands: string[];
69
- plannedCommands: string[];
70
- executedCommands: string[];
71
- standardStatus: HarnessVerifyStatus;
72
- message: string;
73
- }
74
-
75
- interface AcceptanceCoverageTarget {
76
- label: string;
77
- description: string | null;
78
- matchTexts: string[];
79
- }
80
-
81
- export async function runGoalVerify(projectRoot: string, options: GoalVerifyOptions): Promise<GoalVerifyResult> {
82
- const resolved = await resolveTaskRun(projectRoot, { runId: options.runId, branch: options.branch, taskId: options.taskId });
83
- const branch = resolved.context.partition;
84
- const model = resolved.model;
85
- const inspected = { task: resolved.task, gaps: inspectSddTask(model, options.taskId).gaps };
86
- const runId = resolved.runId;
87
- const state = resolved.state;
88
- const reviewArtifact = options.reviewArtifact ?? artifactPathForAgent(state, options.taskId, 'reviewer');
89
- const validationArtifact = options.validationArtifact ?? artifactPathForAgent(state, options.taskId, 'validator');
90
- const gaps: SddTaskGap[] = [...inspected.gaps];
91
- const plannedCommands = inspected.task?.validation ?? [];
92
- for (const reason of resolved.staleReasons) {
93
- gaps.push(taskGap(options.taskId, 'run_snapshot', reason, 'Rerun sdd do task for the current partition before verify.'));
94
- }
95
- for (const conflict of resolved.affectedFileConflicts) {
96
- gaps.push(taskGap(options.taskId, 'affected_files', `Affected file ${conflict.file} is active in run ${conflict.runId} for ${conflict.partition}/${conflict.taskId}.`, 'Resolve or archive the conflicting active run before verify.'));
97
- }
98
- const acceptanceCoverage: AcceptanceCoverageItem[] = [];
99
- const acceptedArtifacts: string[] = [];
100
- let reviewStatus: SddResultStatus | null = null;
101
- let validationStatus: SddResultStatus | null = null;
102
- let validationTrust: ArtifactTrustValidationReport | null = null;
103
- let executedCommands: string[] = [];
104
-
105
- await appendEvent(projectRoot, runId, {
106
- event: 'phase_started',
107
- runId,
108
- summary: `Phase 1.9 goal-level verify started for ${options.taskId}`,
109
- data: { phase: 'verify', branch, task: options.taskId }
110
- });
111
-
112
- if (!inspected.task) {
113
- gaps.push(taskGap(options.taskId, 'task', `Task ${options.taskId} was not found for goal-level verification.`, 'Create the task or choose an existing task id before verify.'));
114
- }
115
-
116
- if (!reviewArtifact) {
117
- gaps.push(taskGap(options.taskId, 'review_artifact', 'No reviewer evidence was supplied or selected from runtime state.', 'Author reviewer evidence under .sdd/runs/<branch>/do/code-review-vN.md and register its ref/hash before goal-level verify.'));
118
- } else {
119
- const reviewReport = await validateSddResultArtifact(projectRoot, runId, reviewArtifact, { expectedTask: options.taskId, expectedAgent: 'reviewer' });
120
- if (!reviewReport.valid || !reviewReport.result) {
121
- gaps.push(taskGap(options.taskId, 'review_artifact', `Reviewer artifact ${reviewArtifact} is invalid: ${reviewReport.issues.map((issue) => issue.message).join('; ')}`, 'Fix reviewer artifact contract before goal-level verify.'));
122
- } else {
123
- reviewStatus = reviewReport.result.status;
124
- acceptedArtifacts.push(reviewArtifact);
125
- if (reviewReport.result.status !== 'PASS') {
126
- gaps.push(taskGap(options.taskId, 'review_status', `Reviewer status is ${reviewReport.result.status}, not PASS.`, 'Resolve review findings before marking verification PASS.'));
127
- }
128
- }
129
- }
130
-
131
- if (!validationArtifact) {
132
- gaps.push(taskGap(options.taskId, 'validation_artifact', 'No validator evidence was supplied or selected from runtime state.', 'Author validator evidence under .sdd/runs/<branch>/test/validation-vN.md and register its ref/hash before goal-level verify.'));
133
- } else {
134
- const validationReport = await validateSddResultArtifact(projectRoot, runId, validationArtifact, { expectedTask: options.taskId, expectedAgent: 'validator' });
135
- validationTrust = validationReport.trust ?? null;
136
- if (!validationReport.valid || !validationReport.result) {
137
- gaps.push(taskGap(options.taskId, 'validation_artifact', `Validator artifact ${validationArtifact} is invalid: ${validationReport.issues.map((issue) => issue.message).join('; ')}`, 'Fix validator artifact contract before goal-level verify.'));
138
- } else {
139
- validationStatus = validationReport.result.status;
140
- acceptedArtifacts.push(validationArtifact);
141
- if (validationReport.result.status === 'FAIL' || validationReport.result.status === 'BLOCKED') {
142
- gaps.push(taskGap(options.taskId, 'validation_status', `Validator status is ${validationReport.result.status}.`, 'Do not mark task completed; inspect validation gaps and recovery proposal.'));
143
- }
144
- }
145
- }
146
-
147
- if (inspected.task) {
148
- const validationRaw = validationArtifact ? await readArtifactIfExists(projectRoot, runId, validationArtifact) : '';
149
- const reviewRaw = reviewArtifact ? await readArtifactIfExists(projectRoot, runId, reviewArtifact) : '';
150
- if (reviewArtifact && reviewRaw.length > 0) {
151
- await appendArtifactHashLedgerEntry(projectRoot, { runId, taskId: options.taskId, branch, artifactPath: reviewArtifact, content: reviewRaw });
152
- }
153
- if (validationArtifact && validationRaw.length > 0) {
154
- await appendArtifactHashLedgerEntry(projectRoot, { runId, taskId: options.taskId, branch, artifactPath: validationArtifact, content: validationRaw });
155
- }
156
- await appendDeclaredCommandLedgerEntries(projectRoot, { runId, taskId: options.taskId, branch, commands: inspected.task.validation });
157
- const invocationLedger = await listInvocationLedgerEntries(projectRoot, runId);
158
- executedCommands = executedCommandsFromLedger(invocationLedger);
159
- const admittedClaims = await readRuntimeEvidenceClaims(projectRoot, runId, options.taskId);
160
- const scopeViolation = await hasRuntimeEvidenceScopeViolation(projectRoot, runId, options.taskId);
161
- if (scopeViolation) {
162
- gaps.push(taskGap(options.taskId, 'runtime_scope', 'PARTITION_SCOPE_VIOLATION: Runtime evidence claims do not match the run partition.', 'Reingest validator evidence in the correct branch/partition before verify.'));
163
- }
164
- for (const target of taskAcceptanceCoverageTargets(inspected.task)) {
165
- const coverage = scopeViolation
166
- ? acceptanceCoverageDecision(target.label, 'BLOCKED', 'Runtime evidence scope violation blocks acceptance coverage.', ['PARTITION_SCOPE_VIOLATION'], [], ['require-partition-scope'])
167
- : evaluateAcceptanceCoverageTarget(target, {
168
- taskId: options.taskId,
169
- validationArtifact,
170
- validationRaw,
171
- claims: admittedClaims.length > 0 ? admittedClaims : validationTrust?.claims ?? [],
172
- validationStatus,
173
- invocationLedger
174
- });
175
- await appendInvocationLedgerEntry(projectRoot, {
176
- runId,
177
- taskId: options.taskId,
178
- branch,
179
- kind: 'policy_evaluation',
180
- ref: `${ACCEPTANCE_POLICY_RULESET_VERSION}:${target.label}`,
181
- status: coverage.status,
182
- artifactPath: validationArtifact,
183
- inputHash: validationRaw.length > 0 ? hashDocumentContent(validationRaw) : null,
184
- materialRefs: [],
185
- metadata: {
186
- passedRules: coverage.policyDecision?.passedRules.join(',') ?? '',
187
- failedRules: coverage.policyDecision?.failedRules.join(',') ?? '',
188
- issueCodes: coverage.issueCodes?.join(',') ?? ''
189
- }
190
- });
191
- acceptanceCoverage.push(coverage);
192
- if (coverage.status !== 'PASS') {
193
- gaps.push(taskGap(options.taskId, 'acceptance_coverage', `Acceptance target ${target.label} is ${coverage.status}: ${coverage.evidence}`, `Add ${SDD_EVIDENCE_CONTRACT} claim/evidence/provenance/policy records for ${target.label}; mention-only acceptance refs cannot pass.`));
194
- }
195
- }
196
- }
197
-
198
- const status = deriveGoalVerifyStatus(reviewStatus, validationStatus, gaps);
199
- const standardStatus = toHarnessVerifyStatus(status, reviewStatus, validationStatus, gaps);
200
- const coverageFileName = `acceptance-coverage-${options.taskId}.md`;
201
- const coverageRef = toBranchStageEvidenceRef(branch, 'goal-verify', coverageFileName);
202
- await recordRuntimeOnlyArtifact(projectRoot, runId, coverageFileName, renderAcceptanceCoverageArtifact(options.taskId, status, coverageRef, inspected.task, reviewArtifact, validationArtifact, acceptanceCoverage, gaps, executedCommands), { logicalRef: coverageRef, branch, taskId: options.taskId, artifactRole: 'goal-verify-acceptance-coverage' });
203
- const allArtifacts = [...acceptedArtifacts, coverageRef];
204
-
205
- await persistVerifyState(projectRoot, runId, {
206
- status,
207
- taskId: options.taskId,
208
- taskState: buildGoalVerifyTaskState(inspected.task, status, gaps, allArtifacts, acceptanceCoverage),
209
- commands: plannedCommands,
210
- evidence: allArtifacts,
211
- artifacts: allArtifacts.map((artifactPath) => ({ path: artifactPath, kind: artifactKind(artifactPath), task: options.taskId, agent: agentFromArtifactPath(artifactPath) }))
212
- });
213
- await appendEvent(projectRoot, runId, {
214
- event: status === 'PASS' ? 'validation_passed' : 'validation_failed',
215
- runId,
216
- summary: `Phase 1.9 goal-level verify ${status} for ${options.taskId}`,
217
- data: { task: options.taskId, status, coverageArtifact: coverageRef, gaps, plannedCommands, executedCommands }
218
- });
219
-
220
- return {
221
- runId,
222
- taskId: options.taskId,
223
- status,
224
- task: inspected.task,
225
- reviewArtifact,
226
- validationArtifact,
227
- coverageArtifactPath: coverageRef,
228
- acceptanceCoverage,
229
- gaps,
230
- commands: plannedCommands,
231
- plannedCommands,
232
- executedCommands,
233
- standardStatus,
234
- message: status === 'PASS' ? 'Goal-level verify passed with explicit acceptance coverage.' : 'Goal-level verify found gaps; inspect coverage artifact.'
235
- };
236
- }
237
-
238
- function buildGoalVerifyTaskState(task: SddTask | null, status: GoalVerifyStatus, gaps: SddTaskGap[], artifacts: string[], acceptanceCoverage: unknown[]): RunStateTaskRuntime {
239
- const verificationStatus = status === 'PASS' ? 'pass' : status === 'PASS_WITH_GAPS' ? 'pass_with_gaps' : status === 'FAIL' ? 'failed' : 'blocked';
240
- return {
241
- status: status === 'PASS' ? 'implemented_verified' : verificationStatus === 'pass_with_gaps' ? 'validation_blocked' : verificationStatus === 'failed' ? 'validation_failed' : 'validation_blocked',
242
- implementationStatus: 'implemented',
243
- verificationStatus,
244
- validationBatch: task?.validationBatch ?? null,
245
- validationTiming: task?.validationTiming ?? 'task_end',
246
- requiresVerifyBeforeNext: task?.requiresVerifyBeforeNext ?? true,
247
- verifyStatus: status,
248
- gaps,
249
- artifacts,
250
- acceptanceCoverage
251
- };
252
- }
253
-
254
- async function persistVerifyState(projectRoot: string, runId: string, input: {
255
- status: GoalVerifyStatus;
256
- taskId: string;
257
- taskState: RunStateTaskRuntime;
258
- commands: string[];
259
- evidence: string[];
260
- artifacts: Array<{ path: string; kind: string; task: string; agent: string }>;
261
- }): Promise<void> {
262
- const state = await readRunState(projectRoot, runId);
263
- const now = new Date().toISOString();
264
- const knownArtifactPaths = new Set(state.artifacts.map((artifact) => artifact.path));
265
- const newArtifacts = input.artifacts
266
- .filter((artifact) => !knownArtifactPaths.has(artifact.path))
267
- .map((artifact) => ({ ...artifact, createdAt: now }));
268
- await writeRunState(projectRoot, {
269
- ...state,
270
- status: input.status === 'PASS' ? 'completed' : 'blocked',
271
- phase: 'verify',
272
- currentTask: input.taskId,
273
- tasks: {
274
- ...state.tasks,
275
- [input.taskId]: input.taskState
276
- },
277
- artifacts: [...state.artifacts, ...newArtifacts],
278
- validation: {
279
- status: input.status === 'PASS' ? 'pass' : input.status === 'PASS_WITH_GAPS' ? 'pass_with_gaps' : input.status === 'BLOCKED' ? 'blocked' : 'fail',
280
- commands: input.commands,
281
- evidence: input.evidence
282
- },
283
- });
284
- }
285
-
286
-
287
- function renderAcceptanceCoverageArtifact(taskId: string, status: GoalVerifyStatus, coverageRef: string, task: SddTask | null, reviewArtifact: string | null, validationArtifact: string | null, coverage: AcceptanceCoverageItem[], gaps: SddTaskGap[], executedCommands: string[]): string {
288
- return `# Acceptance Coverage ${taskId}\n\n\`\`\`sdd-result\ncontract: ${SDD_RESULT_CONTRACT}\nversion: ${SDD_RESULT_VERSION}\nagent: validator\ntask: ${taskId}\nstatus: ${status}\nartifacts:\n - ${coverageRef}\n\`\`\`\n\n## Source Evidence\n\n- review_artifact: ${reviewArtifact ?? 'missing'}\n- validation_artifact: ${validationArtifact ?? 'missing'}\n- task_source: ${task ? sourceLocationEvidence(task.source) : 'missing'}\n\n## Planned Validation Commands\n\n${task && task.validation.length > 0 ? task.validation.map((command) => `- ${command}`).join('\n') : '- none'}\n\n## Executed Runtime Commands\n\n${executedCommands.length > 0 ? executedCommands.map((command) => `- ${command}`).join('\n') : '- none'}\n\n## Acceptance Mapping\n\n${coverage.length > 0 ? coverage.map((item) => `- [${item.status}] ${item.acceptance} Evidence: ${item.evidence}`).join('\n') : '- No acceptance items available.'}\n\n## Policy Decisions\n\n${coverage.length > 0 ? coverage.map((item) => `- ${item.acceptance}: status=${item.policyDecision?.status ?? item.status}; ruleset=${item.policyDecision?.ruleSet.id ?? ACCEPTANCE_POLICY_RULESET_VERSION}; passed=${item.policyDecision?.passedRules.join(',') || 'none'}; failed=${item.policyDecision?.failedRules.join(',') || 'none'}; issues=${item.issueCodes?.join(',') || 'none'}`).join('\n') : '- none'}\n\n## Gaps\n\n${gaps.length > 0 ? gaps.map((gap) => `- [${gap.severity}] ${gap.type} ${gap.field}: ${gap.message} Recommendation: ${gap.recommendation}`).join('\n') : '- none'}\n`;
289
- }
290
-
291
- function evaluateAcceptanceCoverageTarget(target: AcceptanceCoverageTarget, input: { taskId: string; validationArtifact: string | null; validationRaw: string; claims: EvidenceClaim[]; validationStatus: SddResultStatus | null; invocationLedger: InvocationLedgerEntry[] }): AcceptanceCoverageItem {
292
- const matchingClaims = input.claims.filter((claim) => claim.task === input.taskId && acceptanceMatchesTarget(target, claim.acceptance));
293
- const issueCodes: EvidenceQualityIssue[] = [];
294
- const failedRules: string[] = [];
295
- if (matchingClaims.length === 0) {
296
- if (target.matchTexts.some((text) => text.length > 0 && input.validationRaw.toLowerCase().includes(text.toLowerCase()))) {
297
- issueCodes.push('MENTION_ONLY');
298
- failedRules.push('require-structured-evidence');
299
- return acceptanceCoverageDecision(target.label, 'REFERENCED_ONLY', `Referenced ${target.label} in ${input.validationArtifact ?? 'validator artifact'} without policy-backed evidence.`, issueCodes, [], failedRules);
300
- }
301
- issueCodes.push('MISSING_ARTIFACT_REFERENCE');
302
- failedRules.push('require-acceptance-claim');
303
- return acceptanceCoverageDecision(target.label, 'MISSING', 'No policy-backed acceptance evidence found in validator artifact.', issueCodes, [], failedRules);
304
- }
305
-
306
- let best = matchingClaims[0];
307
- let bestRank = evidenceClaimSelectionRank(best, input);
308
- for (const claim of matchingClaims.slice(1)) {
309
- const rank = evidenceClaimSelectionRank(claim, input);
310
- if (rank > bestRank) {
311
- best = claim;
312
- bestRank = rank;
313
- }
314
- }
315
-
316
- if (best.status === 'PASS') {
317
- const ledgerDecision = evaluatePassClaimPolicy(best, input);
318
- if (ledgerDecision.issueCodes.length === 0) {
319
- return acceptanceCoverageDecision(target.label, 'PASS', `Policy-proven by ${SDD_EVIDENCE_CONTRACT} claim for ${best.acceptance} in ${best.sourceArtifact}; evidence=${best.evidence.map((item) => `${item.kind}:${item.ref}`).join(', ')}; provenance=${best.provenance.join(', ')}; policy=${best.policy.join(', ')}.`, [], ledgerDecision.passedRules, []);
320
- }
321
- return acceptanceCoverageDecision(target.label, 'BLOCKED', `PASS claim for ${best.acceptance} is missing required policy/provenance corroboration.`, ledgerDecision.issueCodes, [], ledgerDecision.failedRules);
322
- }
323
-
324
- if (best.status === 'FAIL') {
325
- return acceptanceCoverageDecision(target.label, 'FAIL', `Explicit FAIL claim for ${best.acceptance}: ${best.claim}`, [], ['explicit-fail-overrides-pass'], []);
326
- }
327
- if (best.status === 'BLOCKED') {
328
- return acceptanceCoverageDecision(target.label, 'BLOCKED', `Explicit BLOCKED claim for ${best.acceptance}: ${best.claim}`, [], ['explicit-blocked-overrides-pass'], []);
329
- }
330
- if (best.status === 'REFERENCED_ONLY') {
331
- return acceptanceCoverageDecision(target.label, 'REFERENCED_ONLY', `Structured evidence references ${best.acceptance} but does not prove PASS.`, ['MENTION_ONLY'], [], ['require-pass-claim']);
332
- }
333
- return acceptanceCoverageDecision(target.label, 'MISSING', `Structured evidence marks ${best.acceptance} missing.`, ['MISSING_ARTIFACT_REFERENCE'], [], ['require-pass-claim']);
334
- }
335
-
336
- function evidenceClaimSelectionRank(claim: EvidenceClaim, input: { validationStatus: SddResultStatus | null; invocationLedger: InvocationLedgerEntry[] }): number {
337
- if (claim.status === 'FAIL') {
338
- return 500;
339
- }
340
- if (claim.status === 'BLOCKED') {
341
- return 400;
342
- }
343
- if (claim.status === 'PASS') {
344
- const decision = evaluatePassClaimPolicy(claim, input);
345
- return decision.issueCodes.length === 0 ? 300 : 200 - decision.issueCodes.length;
346
- }
347
- if (claim.status === 'REFERENCED_ONLY') {
348
- return 100;
349
- }
350
- return 0;
351
- }
352
-
353
- function evaluatePassClaimPolicy(claim: EvidenceClaim, input: { validationStatus: SddResultStatus | null; invocationLedger: InvocationLedgerEntry[] }): { issueCodes: EvidenceQualityIssue[]; failedRules: string[]; passedRules: string[] } {
354
- const issueCodes: EvidenceQualityIssue[] = [];
355
- const failedRules: string[] = [];
356
- const passedRules: string[] = [];
357
- const addFailure = (code: EvidenceQualityIssue, rule: string): void => {
358
- if (!issueCodes.includes(code)) {
359
- issueCodes.push(code);
360
- }
361
- if (!failedRules.includes(rule)) {
362
- failedRules.push(rule);
363
- }
364
- };
365
- const addPassed = (rule: string): void => {
366
- if (!passedRules.includes(rule)) {
367
- passedRules.push(rule);
368
- }
369
- };
370
- if (claim.evidence.length === 0) {
371
- addFailure('UNSOURCED_PASS', 'require-source-evidence');
372
- } else {
373
- addPassed('require-source-evidence');
374
- }
375
- if (claim.provenance.length === 0) {
376
- addFailure('PROVENANCE_GAP', 'require-provenance');
377
- } else {
378
- addPassed('require-provenance');
379
- }
380
- if (claim.policy.length === 0) {
381
- addFailure('POLICY_RULE_FAILED', 'require-policy-rule');
382
- } else {
383
- addPassed('require-policy-rule');
384
- }
385
- if (input.validationStatus !== 'PASS') {
386
- addFailure('POLICY_RULE_FAILED', 'require-validator-pass');
387
- } else {
388
- addPassed('require-validator-pass');
389
- }
390
- const ledgerDecision = evaluateClaimLedgerCorroboration(claim, input.invocationLedger);
391
- for (const issue of ledgerDecision.issueCodes) {
392
- if (!issueCodes.includes(issue)) {
393
- issueCodes.push(issue);
394
- }
395
- }
396
- for (const rule of ledgerDecision.failedRules) {
397
- if (!failedRules.includes(rule)) {
398
- failedRules.push(rule);
399
- }
400
- }
401
- if (ledgerDecision.failedRules.length === 0) {
402
- addPassed('require-ledger-corroboration');
403
- }
404
- return { issueCodes, failedRules, passedRules };
405
- }
406
-
407
- function evaluateClaimLedgerCorroboration(claim: EvidenceClaim, entries: InvocationLedgerEntry[]): { issueCodes: EvidenceQualityIssue[]; failedRules: string[] } {
408
- const issueCodes: EvidenceQualityIssue[] = [];
409
- const failedRules: string[] = [];
410
- const commandRefs = invocationLedgerRefs(entries, 'command');
411
- const artifactRefs = invocationLedgerRefs(entries, 'artifact_hash');
412
- const materialRefs = ledgerMaterialRefs(entries);
413
- const addIssue = (code: EvidenceQualityIssue, rule: string): void => {
414
- if (!issueCodes.includes(code)) {
415
- issueCodes.push(code);
416
- }
417
- if (!failedRules.includes(rule)) {
418
- failedRules.push(rule);
419
- }
420
- };
421
-
422
- if (!artifactRefs.has(claim.sourceArtifact)) {
423
- addIssue('MISSING_ARTIFACT_REFERENCE', 'require-source-artifact-hash');
424
- }
425
- for (const item of claim.evidence) {
426
- if (item.kind === 'command' && !commandRefs.has(item.ref)) {
427
- addIssue('MISSING_COMMAND_OUTPUT', 'require-command-ledger');
428
- }
429
- if (item.kind === 'artifact' && !artifactRefs.has(item.ref)) {
430
- addIssue('MISSING_ARTIFACT_REFERENCE', 'require-artifact-hash');
431
- }
432
- if (item.kind === 'material' && !materialRefs.has(item.ref)) {
433
- addIssue('MISSING_MATERIAL_REFERENCE', 'require-material-ledger');
434
- }
435
- }
436
- for (const ref of claim.provenance) {
437
- const typed = parseTypedLedgerRef(ref);
438
- if (!typed) {
439
- continue;
440
- }
441
- if (typed.kind === 'command' && !commandRefs.has(typed.ref)) {
442
- addIssue('PROVENANCE_GAP', 'require-command-provenance-ledger');
443
- }
444
- if (typed.kind === 'artifact' && !artifactRefs.has(typed.ref)) {
445
- addIssue('PROVENANCE_GAP', 'require-artifact-provenance-ledger');
446
- }
447
- if (typed.kind === 'material' && !materialRefs.has(typed.ref)) {
448
- addIssue('PROVENANCE_GAP', 'require-material-provenance-ledger');
449
- }
450
- }
451
- return { issueCodes, failedRules };
452
- }
453
-
454
- function invocationLedgerRefs(entries: InvocationLedgerEntry[], kind: InvocationLedgerKind): Set<string> {
455
- const refs = new Set<string>();
456
- for (const entry of entries) {
457
- if (entry.kind === kind) {
458
- refs.add(entry.ref);
459
- if (entry.artifactPath) {
460
- refs.add(entry.artifactPath);
461
- }
462
- if (kind === 'command' && typeof entry.metadata.stepId === 'string') {
463
- refs.add(entry.metadata.stepId);
464
- }
465
- }
466
- }
467
- return refs;
468
- }
469
-
470
- function parseTypedLedgerRef(value: string): { kind: string; ref: string } | null {
471
- const separator = value.indexOf(':');
472
- if (separator <= 0) {
473
- return null;
474
- }
475
- const kind = value.slice(0, separator).trim();
476
- const ref = value.slice(separator + 1).trim();
477
- if (!/^[A-Za-z0-9_-]+$/.test(kind) || !ref) {
478
- return null;
479
- }
480
- return { kind, ref };
481
- }
482
-
483
- function acceptanceMatchesTarget(target: AcceptanceCoverageTarget, acceptance: string): boolean {
484
- const normalizedAcceptance = acceptance.toLowerCase();
485
- return target.matchTexts.some((text) => text.toLowerCase() === normalizedAcceptance) || target.label.toLowerCase() === normalizedAcceptance;
486
- }
487
-
488
-
489
- function acceptanceCoverageDecision(acceptance: string, status: EvidenceCoverageStatus, evidence: string, issueCodes: EvidenceQualityIssue[], passedRules: string[], failedRules: string[]): AcceptanceCoverageItem {
490
- return {
491
- acceptance,
492
- status,
493
- evidence,
494
- issueCodes,
495
- policyDecision: {
496
- status,
497
- ruleSet: {
498
- id: ACCEPTANCE_POLICY_RULESET_VERSION,
499
- version: SDD_EVIDENCE_VERSION,
500
- ruleIds: ['require-structured-evidence', 'require-source-evidence', 'require-provenance', 'require-policy-rule']
501
- },
502
- passedRules,
503
- failedRules,
504
- issueCodes
505
- }
506
- };
507
- }
508
-
509
- function taskAcceptanceCoverageTargets(task: SddTask): AcceptanceCoverageTarget[] {
510
- if (task.acceptanceRefs.length > 0) {
511
- return task.acceptanceRefs.map((ref, index) => {
512
- const description = task.acceptance[index] ?? null;
513
- return {
514
- label: ref,
515
- description,
516
- matchTexts: description ? [ref, description] : [ref]
517
- };
518
- });
519
- }
520
- return task.acceptance.map((acceptance) => ({
521
- label: acceptance,
522
- description: null,
523
- matchTexts: [acceptance]
524
- }));
525
- }
526
-
527
- function deriveGoalVerifyStatus(reviewStatus: SddResultStatus | null, validationStatus: SddResultStatus | null, gaps: SddTaskGap[]): GoalVerifyStatus {
528
- if (gaps.length > 0) {
529
- return validationStatus === 'PASS_WITH_GAPS' ? 'PASS_WITH_GAPS' : 'BLOCKED';
530
- }
531
- if (reviewStatus !== 'PASS' || !validationStatus) {
532
- return 'BLOCKED';
533
- }
534
- if (validationStatus === 'PASS') {
535
- return 'PASS';
536
- }
537
- if (validationStatus === 'PASS_WITH_GAPS') {
538
- return 'PASS_WITH_GAPS';
539
- }
540
- return validationStatus === 'FAIL' ? 'FAIL' : 'BLOCKED';
541
- }
542
-
543
- function toHarnessVerifyStatus(status: GoalVerifyStatus, reviewStatus: SddResultStatus | null, validationStatus: SddResultStatus | null, gaps: SddTaskGap[]): HarnessVerifyStatus {
544
- if (status === 'PASS') {
545
- return 'PASS';
546
- }
547
- if (status === 'PASS_WITH_GAPS') {
548
- return 'GAPS';
549
- }
550
- if (!reviewStatus || !validationStatus || gaps.some((gap) => gap.field === 'review_artifact' || gap.field === 'validation_artifact')) {
551
- return 'HUMAN_NEEDED';
552
- }
553
- return 'BLOCKED';
554
- }
555
-
556
- async function readArtifactIfExists(projectRoot: string, runId: string, runRelativeArtifactPath: string): Promise<string> {
557
- try {
558
- if (isBranchStageEvidenceRef(runRelativeArtifactPath)) {
559
- try {
560
- return await readFile(getBranchStageEvidencePathFromRef(projectRoot, runRelativeArtifactPath), 'utf8');
561
- } catch {
562
- return await readArtifact(projectRoot, runId, toEvidencePayloadFileName(runRelativeArtifactPath));
563
- }
564
- }
565
- return await readArtifact(projectRoot, runId, toEvidencePayloadFileName(runRelativeArtifactPath));
566
- } catch {
567
- return '';
568
- }
569
- }
570
-
571
- function artifactPathForAgent(state: RunState, taskId: string, agent: string): string | null {
572
- const delegation = Object.values(state.delegations).find((candidate) => candidate.task === taskId && candidate.agent === agent && candidate.status === 'COMPLETED');
573
- if (delegation) {
574
- return delegation.expectedArtifact;
575
- }
576
- const artifact = state.artifacts.find((candidate) => candidate.task === taskId && candidate.agent === agent);
577
- return artifact?.path ?? null;
578
- }
579
-
580
- function agentFromArtifactPath(artifactPath: string): string {
581
- const kind = artifactKind(artifactPath);
582
- if (kind === 'implement') {
583
- return 'implementer';
584
- }
585
- if (kind === 'review' || kind === 'validation' || kind === 'debug') {
586
- return kind === 'debug' ? 'debugger' : kind === 'review' ? 'reviewer' : 'validator';
587
- }
588
- if (kind === 'gap-report') {
589
- return 'runtime';
590
- }
591
- return 'unknown';
592
- }
593
-
594
- function executedCommandsFromLedger(entries: InvocationLedgerEntry[]): string[] {
595
- return [...new Set(entries
596
- .filter((entry) => entry.kind === 'command' && entry.status !== 'declared')
597
- .map((entry) => entry.ref))];
598
- }
599
-
600
- function sourceLocationEvidence(source: SddTask['source']): string {
601
- return `${source.filePath}:${source.lineStart}-${source.lineEnd}`;
602
- }
603
-
604
- function ledgerMaterialRefs(entries: InvocationLedgerEntry[]): Set<string> {
605
- const refs = new Set<string>();
606
- for (const entry of entries) {
607
- if (entry.kind === 'material') {
608
- refs.add(entry.ref);
609
- }
610
- for (const ref of entry.materialRefs) {
611
- refs.add(ref);
612
- }
613
- }
614
- return refs;
615
- }
616
-
617
- function hashDocumentContent(raw: string): string {
618
- return createHash('sha256').update(raw.replace(/\r\n/g, '\n'), 'utf8').digest('hex');
619
- }
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import {
4
+ ACCEPTANCE_POLICY_RULESET_VERSION,
5
+ SDD_EVIDENCE_CONTRACT,
6
+ SDD_EVIDENCE_VERSION,
7
+ SDD_RESULT_CONTRACT,
8
+ SDD_RESULT_VERSION
9
+ } from '../contracts.js';
10
+ import { artifactKind, readArtifact, recordRuntimeOnlyArtifact } from '../run-state/artifacts.js';
11
+ import { appendEvent } from '../run-state/events.js';
12
+ import { appendArtifactHashLedgerEntry, appendDeclaredCommandLedgerEntries, appendInvocationLedgerEntry, listInvocationLedgerEntries } from '../run-state/invocation-ledger.js';
13
+ import type { InvocationLedgerEntry, InvocationLedgerKind, RunState, RunStateTaskRuntime } from '../run-state/model.js';
14
+ import { readRunState, writeRunState } from '../run-state/run-state.js';
15
+ import { getBranchStageEvidencePathFromRef, isBranchStageEvidenceRef, toBranchStageEvidenceRef, toEvidencePayloadFileName } from '../runtime-paths.js';
16
+ import { hasRuntimeEvidenceScopeViolation, readRuntimeEvidenceClaims } from '../context/evidence-summary.js';
17
+ import type { ArtifactTrustValidationReport, EvidenceClaim, EvidenceCoverageStatus, EvidenceQualityIssue } from '../artifacts/sdd-evidence.js';
18
+ import { validateSddResultArtifact } from '../artifacts/sdd-result.js';
19
+ import type { SddResultStatus } from '../artifacts/sdd-result.js';
20
+ import { taskGap } from '../sdd-docs/task-inspection.js';
21
+ import { inspectSddTask } from '../sdd-docs/task-inspection.js';
22
+ import type { SddTask, SddTaskGap } from '../sdd-docs/task-parser.js';
23
+ import { resolveTaskRun } from '../workflow-state/resolve-task-run.js';
24
+
25
+ export type TaskEvidenceJudgmentStatus = 'PASS' | 'PASS_WITH_GAPS' | 'FAIL' | 'BLOCKED';
26
+ export type HarnessVerifyStatus = 'PASS' | 'GAPS' | 'BLOCKED' | 'HUMAN_NEEDED';
27
+
28
+ export interface TaskEvidenceJudgmentOptions {
29
+ branch?: string;
30
+ taskId: string;
31
+ runId?: string;
32
+ reviewArtifact?: string;
33
+ validationArtifact?: string;
34
+ }
35
+
36
+ interface PolicyRuleSet {
37
+ id: typeof ACCEPTANCE_POLICY_RULESET_VERSION;
38
+ version: string;
39
+ ruleIds: string[];
40
+ }
41
+
42
+ interface PolicyDecision {
43
+ status: EvidenceCoverageStatus;
44
+ ruleSet: PolicyRuleSet;
45
+ passedRules: string[];
46
+ failedRules: string[];
47
+ issueCodes: EvidenceQualityIssue[];
48
+ }
49
+
50
+ export interface AcceptanceCoverageItem {
51
+ acceptance: string;
52
+ status: EvidenceCoverageStatus;
53
+ evidence: string;
54
+ policyDecision?: PolicyDecision;
55
+ issueCodes?: EvidenceQualityIssue[];
56
+ }
57
+
58
+ export interface TaskEvidenceJudgmentResult {
59
+ runId: string;
60
+ taskId: string;
61
+ status: TaskEvidenceJudgmentStatus;
62
+ task: SddTask | null;
63
+ reviewArtifact: string | null;
64
+ validationArtifact: string | null;
65
+ coverageArtifactPath: string;
66
+ acceptanceCoverage: AcceptanceCoverageItem[];
67
+ gaps: SddTaskGap[];
68
+ commands: string[];
69
+ plannedCommands: string[];
70
+ executedCommands: string[];
71
+ standardStatus: HarnessVerifyStatus;
72
+ message: string;
73
+ }
74
+
75
+ interface AcceptanceCoverageTarget {
76
+ label: string;
77
+ description: string | null;
78
+ matchTexts: string[];
79
+ }
80
+
81
+ export async function runTaskEvidenceJudgment(projectRoot: string, options: TaskEvidenceJudgmentOptions): Promise<TaskEvidenceJudgmentResult> {
82
+ const resolved = await resolveTaskRun(projectRoot, { runId: options.runId, branch: options.branch, taskId: options.taskId });
83
+ const branch = resolved.context.partition;
84
+ const model = resolved.model;
85
+ const inspected = { task: resolved.task, gaps: inspectSddTask(model, options.taskId).gaps };
86
+ const runId = resolved.runId;
87
+ const state = resolved.state;
88
+ const reviewArtifact = options.reviewArtifact ?? artifactPathForAgent(state, options.taskId, 'reviewer');
89
+ const validationArtifact = options.validationArtifact ?? artifactPathForAgent(state, options.taskId, 'validator');
90
+ const gaps: SddTaskGap[] = [...inspected.gaps];
91
+ const plannedCommands = inspected.task?.validation ?? [];
92
+ for (const reason of resolved.staleReasons) {
93
+ gaps.push(taskGap(options.taskId, 'run_snapshot', reason, 'Rerun sdd execute for the current partition before verify.'));
94
+ }
95
+ for (const conflict of resolved.affectedFileConflicts) {
96
+ gaps.push(taskGap(options.taskId, 'affected_files', `Affected file ${conflict.file} is active in run ${conflict.runId} for ${conflict.partition}/${conflict.taskId}.`, 'Resolve or archive the conflicting active run before verify.'));
97
+ }
98
+ const acceptanceCoverage: AcceptanceCoverageItem[] = [];
99
+ const acceptedArtifacts: string[] = [];
100
+ let reviewStatus: SddResultStatus | null = null;
101
+ let validationStatus: SddResultStatus | null = null;
102
+ let validationTrust: ArtifactTrustValidationReport | null = null;
103
+ let executedCommands: string[] = [];
104
+
105
+ await appendEvent(projectRoot, runId, {
106
+ event: 'phase_started',
107
+ runId,
108
+ summary: `Execute evidence judgment started for ${options.taskId}`,
109
+ data: { phase: 'verify', branch, task: options.taskId }
110
+ });
111
+
112
+ if (!inspected.task) {
113
+ gaps.push(taskGap(options.taskId, 'task', `Task ${options.taskId} was not found for goal-level verification.`, 'Create the task or choose an existing task id before verify.'));
114
+ }
115
+
116
+ if (!reviewArtifact) {
117
+ gaps.push(taskGap(options.taskId, 'review_artifact', 'No reviewer evidence was supplied or selected from runtime state.', 'Author reviewer evidence under .sdd/runs/<branch>/execute/code-review-vN.md and register its ref/hash before execute evidence judgment.'));
118
+ } else {
119
+ const reviewReport = await validateSddResultArtifact(projectRoot, runId, reviewArtifact, { expectedTask: options.taskId, expectedAgent: 'reviewer' });
120
+ if (!reviewReport.valid || !reviewReport.result) {
121
+ gaps.push(taskGap(options.taskId, 'review_artifact', `Reviewer artifact ${reviewArtifact} is invalid: ${reviewReport.issues.map((issue) => issue.message).join('; ')}`, 'Fix reviewer artifact contract before execute evidence judgment.'));
122
+ } else {
123
+ reviewStatus = reviewReport.result.status;
124
+ acceptedArtifacts.push(reviewArtifact);
125
+ if (reviewReport.result.status !== 'PASS') {
126
+ gaps.push(taskGap(options.taskId, 'review_status', `Reviewer status is ${reviewReport.result.status}, not PASS.`, 'Resolve review findings before marking verification PASS.'));
127
+ }
128
+ }
129
+ }
130
+
131
+ if (!validationArtifact) {
132
+ gaps.push(taskGap(options.taskId, 'validation_artifact', 'No validator evidence was supplied or selected from runtime state.', 'Author validator evidence under .sdd/runs/<branch>/execute/validation-vN.md and register its ref/hash before execute evidence judgment.'));
133
+ } else {
134
+ const validationReport = await validateSddResultArtifact(projectRoot, runId, validationArtifact, { expectedTask: options.taskId, expectedAgent: 'validator' });
135
+ validationTrust = validationReport.trust ?? null;
136
+ if (!validationReport.valid || !validationReport.result) {
137
+ gaps.push(taskGap(options.taskId, 'validation_artifact', `Validator artifact ${validationArtifact} is invalid: ${validationReport.issues.map((issue) => issue.message).join('; ')}`, 'Fix validator artifact contract before execute evidence judgment.'));
138
+ } else {
139
+ validationStatus = validationReport.result.status;
140
+ acceptedArtifacts.push(validationArtifact);
141
+ if (validationReport.result.status === 'FAIL' || validationReport.result.status === 'BLOCKED') {
142
+ gaps.push(taskGap(options.taskId, 'validation_status', `Validator status is ${validationReport.result.status}.`, 'Do not mark task completed; inspect validation gaps and recovery proposal.'));
143
+ }
144
+ }
145
+ }
146
+
147
+ if (inspected.task) {
148
+ const validationRaw = validationArtifact ? await readArtifactIfExists(projectRoot, runId, validationArtifact) : '';
149
+ const reviewRaw = reviewArtifact ? await readArtifactIfExists(projectRoot, runId, reviewArtifact) : '';
150
+ if (reviewArtifact && reviewRaw.length > 0) {
151
+ await appendArtifactHashLedgerEntry(projectRoot, { runId, taskId: options.taskId, branch, artifactPath: reviewArtifact, content: reviewRaw });
152
+ }
153
+ if (validationArtifact && validationRaw.length > 0) {
154
+ await appendArtifactHashLedgerEntry(projectRoot, { runId, taskId: options.taskId, branch, artifactPath: validationArtifact, content: validationRaw });
155
+ }
156
+ await appendDeclaredCommandLedgerEntries(projectRoot, { runId, taskId: options.taskId, branch, commands: inspected.task.validation });
157
+ const invocationLedger = await listInvocationLedgerEntries(projectRoot, runId);
158
+ executedCommands = executedCommandsFromLedger(invocationLedger);
159
+ const admittedClaims = await readRuntimeEvidenceClaims(projectRoot, runId, options.taskId);
160
+ const scopeViolation = await hasRuntimeEvidenceScopeViolation(projectRoot, runId, options.taskId);
161
+ if (scopeViolation) {
162
+ gaps.push(taskGap(options.taskId, 'runtime_scope', 'PARTITION_SCOPE_VIOLATION: Runtime evidence claims do not match the run partition.', 'Reingest validator evidence in the correct branch/partition before verify.'));
163
+ }
164
+ for (const target of taskAcceptanceCoverageTargets(inspected.task)) {
165
+ const coverage = scopeViolation
166
+ ? acceptanceCoverageDecision(target.label, 'BLOCKED', 'Runtime evidence scope violation blocks acceptance coverage.', ['PARTITION_SCOPE_VIOLATION'], [], ['require-partition-scope'])
167
+ : evaluateAcceptanceCoverageTarget(target, {
168
+ taskId: options.taskId,
169
+ validationArtifact,
170
+ validationRaw,
171
+ claims: admittedClaims.length > 0 ? admittedClaims : validationTrust?.claims ?? [],
172
+ validationStatus,
173
+ invocationLedger
174
+ });
175
+ await appendInvocationLedgerEntry(projectRoot, {
176
+ runId,
177
+ taskId: options.taskId,
178
+ branch,
179
+ kind: 'policy_evaluation',
180
+ ref: `${ACCEPTANCE_POLICY_RULESET_VERSION}:${target.label}`,
181
+ status: coverage.status,
182
+ artifactPath: validationArtifact,
183
+ inputHash: validationRaw.length > 0 ? hashDocumentContent(validationRaw) : null,
184
+ materialRefs: [],
185
+ metadata: {
186
+ passedRules: coverage.policyDecision?.passedRules.join(',') ?? '',
187
+ failedRules: coverage.policyDecision?.failedRules.join(',') ?? '',
188
+ issueCodes: coverage.issueCodes?.join(',') ?? ''
189
+ }
190
+ });
191
+ acceptanceCoverage.push(coverage);
192
+ if (coverage.status !== 'PASS') {
193
+ gaps.push(taskGap(options.taskId, 'acceptance_coverage', `Acceptance target ${target.label} is ${coverage.status}: ${coverage.evidence}`, `Add ${SDD_EVIDENCE_CONTRACT} claim/evidence/provenance/policy records for ${target.label}; mention-only acceptance refs cannot pass.`));
194
+ }
195
+ }
196
+ }
197
+
198
+ const status = deriveTaskEvidenceJudgmentStatus(reviewStatus, validationStatus, gaps);
199
+ const standardStatus = toHarnessVerifyStatus(status, reviewStatus, validationStatus, gaps);
200
+ const coverageFileName = `acceptance-coverage-${options.taskId}.md`;
201
+ const coverageRef = toBranchStageEvidenceRef(branch, 'execute', coverageFileName);
202
+ await recordRuntimeOnlyArtifact(projectRoot, runId, coverageFileName, renderAcceptanceCoverageArtifact(options.taskId, status, coverageRef, inspected.task, reviewArtifact, validationArtifact, acceptanceCoverage, gaps, executedCommands), { logicalRef: coverageRef, branch, taskId: options.taskId, artifactRole: 'task-evidence-judgment-acceptance-coverage' });
203
+ const allArtifacts = [...acceptedArtifacts, coverageRef];
204
+
205
+ await persistVerifyState(projectRoot, runId, {
206
+ status,
207
+ taskId: options.taskId,
208
+ taskState: buildTaskEvidenceJudgmentTaskState(inspected.task, status, gaps, allArtifacts, acceptanceCoverage),
209
+ commands: plannedCommands,
210
+ evidence: allArtifacts,
211
+ artifacts: allArtifacts.map((artifactPath) => ({ path: artifactPath, kind: artifactKind(artifactPath), task: options.taskId, agent: agentFromArtifactPath(artifactPath) }))
212
+ });
213
+ await appendEvent(projectRoot, runId, {
214
+ event: status === 'PASS' ? 'validation_passed' : 'validation_failed',
215
+ runId,
216
+ summary: `Execute evidence judgment ${status} for ${options.taskId}`,
217
+ data: { task: options.taskId, status, coverageArtifact: coverageRef, gaps, plannedCommands, executedCommands }
218
+ });
219
+
220
+ return {
221
+ runId,
222
+ taskId: options.taskId,
223
+ status,
224
+ task: inspected.task,
225
+ reviewArtifact,
226
+ validationArtifact,
227
+ coverageArtifactPath: coverageRef,
228
+ acceptanceCoverage,
229
+ gaps,
230
+ commands: plannedCommands,
231
+ plannedCommands,
232
+ executedCommands,
233
+ standardStatus,
234
+ message: status === 'PASS' ? 'Task evidence judgment passed with explicit acceptance coverage.' : 'Task evidence judgment found gaps; inspect coverage artifact.'
235
+ };
236
+ }
237
+
238
+ function buildTaskEvidenceJudgmentTaskState(task: SddTask | null, status: TaskEvidenceJudgmentStatus, gaps: SddTaskGap[], artifacts: string[], acceptanceCoverage: unknown[]): RunStateTaskRuntime {
239
+ const verificationStatus = status === 'PASS' ? 'pass' : status === 'PASS_WITH_GAPS' ? 'pass_with_gaps' : status === 'FAIL' ? 'failed' : 'blocked';
240
+ return {
241
+ status: status === 'PASS' ? 'implemented_verified' : verificationStatus === 'pass_with_gaps' ? 'validation_blocked' : verificationStatus === 'failed' ? 'validation_failed' : 'validation_blocked',
242
+ implementationStatus: 'implemented',
243
+ verificationStatus,
244
+ validationBatch: task?.validationBatch ?? null,
245
+ validationTiming: task?.validationTiming ?? 'task_end',
246
+ requiresVerifyBeforeNext: task?.requiresVerifyBeforeNext ?? true,
247
+ verifyStatus: status,
248
+ gaps,
249
+ artifacts,
250
+ acceptanceCoverage
251
+ };
252
+ }
253
+
254
+ async function persistVerifyState(projectRoot: string, runId: string, input: {
255
+ status: TaskEvidenceJudgmentStatus;
256
+ taskId: string;
257
+ taskState: RunStateTaskRuntime;
258
+ commands: string[];
259
+ evidence: string[];
260
+ artifacts: Array<{ path: string; kind: string; task: string; agent: string }>;
261
+ }): Promise<void> {
262
+ const state = await readRunState(projectRoot, runId);
263
+ const now = new Date().toISOString();
264
+ const knownArtifactPaths = new Set(state.artifacts.map((artifact) => artifact.path));
265
+ const newArtifacts = input.artifacts
266
+ .filter((artifact) => !knownArtifactPaths.has(artifact.path))
267
+ .map((artifact) => ({ ...artifact, createdAt: now }));
268
+ await writeRunState(projectRoot, {
269
+ ...state,
270
+ status: input.status === 'PASS' ? 'completed' : 'blocked',
271
+ phase: 'verify',
272
+ currentTask: input.taskId,
273
+ tasks: {
274
+ ...state.tasks,
275
+ [input.taskId]: input.taskState
276
+ },
277
+ artifacts: [...state.artifacts, ...newArtifacts],
278
+ validation: {
279
+ status: input.status === 'PASS' ? 'pass' : input.status === 'PASS_WITH_GAPS' ? 'pass_with_gaps' : input.status === 'BLOCKED' ? 'blocked' : 'fail',
280
+ commands: input.commands,
281
+ evidence: input.evidence
282
+ },
283
+ });
284
+ }
285
+
286
+
287
+ function renderAcceptanceCoverageArtifact(taskId: string, status: TaskEvidenceJudgmentStatus, coverageRef: string, task: SddTask | null, reviewArtifact: string | null, validationArtifact: string | null, coverage: AcceptanceCoverageItem[], gaps: SddTaskGap[], executedCommands: string[]): string {
288
+ return `# Acceptance Coverage ${taskId}\n\n\`\`\`sdd-result\ncontract: ${SDD_RESULT_CONTRACT}\nversion: ${SDD_RESULT_VERSION}\nagent: validator\ntask: ${taskId}\nstatus: ${status}\nartifacts:\n - ${coverageRef}\n\`\`\`\n\n## Source Evidence\n\n- review_artifact: ${reviewArtifact ?? 'missing'}\n- validation_artifact: ${validationArtifact ?? 'missing'}\n- task_source: ${task ? sourceLocationEvidence(task.source) : 'missing'}\n\n## Planned Validation Commands\n\n${task && task.validation.length > 0 ? task.validation.map((command) => `- ${command}`).join('\n') : '- none'}\n\n## Executed Runtime Commands\n\n${executedCommands.length > 0 ? executedCommands.map((command) => `- ${command}`).join('\n') : '- none'}\n\n## Acceptance Mapping\n\n${coverage.length > 0 ? coverage.map((item) => `- [${item.status}] ${item.acceptance} Evidence: ${item.evidence}`).join('\n') : '- No acceptance items available.'}\n\n## Policy Decisions\n\n${coverage.length > 0 ? coverage.map((item) => `- ${item.acceptance}: status=${item.policyDecision?.status ?? item.status}; ruleset=${item.policyDecision?.ruleSet.id ?? ACCEPTANCE_POLICY_RULESET_VERSION}; passed=${item.policyDecision?.passedRules.join(',') || 'none'}; failed=${item.policyDecision?.failedRules.join(',') || 'none'}; issues=${item.issueCodes?.join(',') || 'none'}`).join('\n') : '- none'}\n\n## Gaps\n\n${gaps.length > 0 ? gaps.map((gap) => `- [${gap.severity}] ${gap.type} ${gap.field}: ${gap.message} Recommendation: ${gap.recommendation}`).join('\n') : '- none'}\n`;
289
+ }
290
+
291
+ function evaluateAcceptanceCoverageTarget(target: AcceptanceCoverageTarget, input: { taskId: string; validationArtifact: string | null; validationRaw: string; claims: EvidenceClaim[]; validationStatus: SddResultStatus | null; invocationLedger: InvocationLedgerEntry[] }): AcceptanceCoverageItem {
292
+ const matchingClaims = input.claims.filter((claim) => claim.task === input.taskId && acceptanceMatchesTarget(target, claim.acceptance));
293
+ const issueCodes: EvidenceQualityIssue[] = [];
294
+ const failedRules: string[] = [];
295
+ if (matchingClaims.length === 0) {
296
+ if (target.matchTexts.some((text) => text.length > 0 && input.validationRaw.toLowerCase().includes(text.toLowerCase()))) {
297
+ issueCodes.push('MENTION_ONLY');
298
+ failedRules.push('require-structured-evidence');
299
+ return acceptanceCoverageDecision(target.label, 'REFERENCED_ONLY', `Referenced ${target.label} in ${input.validationArtifact ?? 'validator artifact'} without policy-backed evidence.`, issueCodes, [], failedRules);
300
+ }
301
+ issueCodes.push('MISSING_ARTIFACT_REFERENCE');
302
+ failedRules.push('require-acceptance-claim');
303
+ return acceptanceCoverageDecision(target.label, 'MISSING', 'No policy-backed acceptance evidence found in validator artifact.', issueCodes, [], failedRules);
304
+ }
305
+
306
+ let best = matchingClaims[0];
307
+ let bestRank = evidenceClaimSelectionRank(best, input);
308
+ for (const claim of matchingClaims.slice(1)) {
309
+ const rank = evidenceClaimSelectionRank(claim, input);
310
+ if (rank > bestRank) {
311
+ best = claim;
312
+ bestRank = rank;
313
+ }
314
+ }
315
+
316
+ if (best.status === 'PASS') {
317
+ const ledgerDecision = evaluatePassClaimPolicy(best, input);
318
+ if (ledgerDecision.issueCodes.length === 0) {
319
+ return acceptanceCoverageDecision(target.label, 'PASS', `Policy-proven by ${SDD_EVIDENCE_CONTRACT} claim for ${best.acceptance} in ${best.sourceArtifact}; evidence=${best.evidence.map((item) => `${item.kind}:${item.ref}`).join(', ')}; provenance=${best.provenance.join(', ')}; policy=${best.policy.join(', ')}.`, [], ledgerDecision.passedRules, []);
320
+ }
321
+ return acceptanceCoverageDecision(target.label, 'BLOCKED', `PASS claim for ${best.acceptance} is missing required policy/provenance corroboration.`, ledgerDecision.issueCodes, [], ledgerDecision.failedRules);
322
+ }
323
+
324
+ if (best.status === 'FAIL') {
325
+ return acceptanceCoverageDecision(target.label, 'FAIL', `Explicit FAIL claim for ${best.acceptance}: ${best.claim}`, [], ['explicit-fail-overrides-pass'], []);
326
+ }
327
+ if (best.status === 'BLOCKED') {
328
+ return acceptanceCoverageDecision(target.label, 'BLOCKED', `Explicit BLOCKED claim for ${best.acceptance}: ${best.claim}`, [], ['explicit-blocked-overrides-pass'], []);
329
+ }
330
+ if (best.status === 'REFERENCED_ONLY') {
331
+ return acceptanceCoverageDecision(target.label, 'REFERENCED_ONLY', `Structured evidence references ${best.acceptance} but does not prove PASS.`, ['MENTION_ONLY'], [], ['require-pass-claim']);
332
+ }
333
+ return acceptanceCoverageDecision(target.label, 'MISSING', `Structured evidence marks ${best.acceptance} missing.`, ['MISSING_ARTIFACT_REFERENCE'], [], ['require-pass-claim']);
334
+ }
335
+
336
+ function evidenceClaimSelectionRank(claim: EvidenceClaim, input: { validationStatus: SddResultStatus | null; invocationLedger: InvocationLedgerEntry[] }): number {
337
+ if (claim.status === 'FAIL') {
338
+ return 500;
339
+ }
340
+ if (claim.status === 'BLOCKED') {
341
+ return 400;
342
+ }
343
+ if (claim.status === 'PASS') {
344
+ const decision = evaluatePassClaimPolicy(claim, input);
345
+ return decision.issueCodes.length === 0 ? 300 : 200 - decision.issueCodes.length;
346
+ }
347
+ if (claim.status === 'REFERENCED_ONLY') {
348
+ return 100;
349
+ }
350
+ return 0;
351
+ }
352
+
353
+ function evaluatePassClaimPolicy(claim: EvidenceClaim, input: { validationStatus: SddResultStatus | null; invocationLedger: InvocationLedgerEntry[] }): { issueCodes: EvidenceQualityIssue[]; failedRules: string[]; passedRules: string[] } {
354
+ const issueCodes: EvidenceQualityIssue[] = [];
355
+ const failedRules: string[] = [];
356
+ const passedRules: string[] = [];
357
+ const addFailure = (code: EvidenceQualityIssue, rule: string): void => {
358
+ if (!issueCodes.includes(code)) {
359
+ issueCodes.push(code);
360
+ }
361
+ if (!failedRules.includes(rule)) {
362
+ failedRules.push(rule);
363
+ }
364
+ };
365
+ const addPassed = (rule: string): void => {
366
+ if (!passedRules.includes(rule)) {
367
+ passedRules.push(rule);
368
+ }
369
+ };
370
+ if (claim.evidence.length === 0) {
371
+ addFailure('UNSOURCED_PASS', 'require-source-evidence');
372
+ } else {
373
+ addPassed('require-source-evidence');
374
+ }
375
+ if (claim.provenance.length === 0) {
376
+ addFailure('PROVENANCE_GAP', 'require-provenance');
377
+ } else {
378
+ addPassed('require-provenance');
379
+ }
380
+ if (claim.policy.length === 0) {
381
+ addFailure('POLICY_RULE_FAILED', 'require-policy-rule');
382
+ } else {
383
+ addPassed('require-policy-rule');
384
+ }
385
+ if (input.validationStatus !== 'PASS') {
386
+ addFailure('POLICY_RULE_FAILED', 'require-validator-pass');
387
+ } else {
388
+ addPassed('require-validator-pass');
389
+ }
390
+ const ledgerDecision = evaluateClaimLedgerCorroboration(claim, input.invocationLedger);
391
+ for (const issue of ledgerDecision.issueCodes) {
392
+ if (!issueCodes.includes(issue)) {
393
+ issueCodes.push(issue);
394
+ }
395
+ }
396
+ for (const rule of ledgerDecision.failedRules) {
397
+ if (!failedRules.includes(rule)) {
398
+ failedRules.push(rule);
399
+ }
400
+ }
401
+ if (ledgerDecision.failedRules.length === 0) {
402
+ addPassed('require-ledger-corroboration');
403
+ }
404
+ return { issueCodes, failedRules, passedRules };
405
+ }
406
+
407
+ function evaluateClaimLedgerCorroboration(claim: EvidenceClaim, entries: InvocationLedgerEntry[]): { issueCodes: EvidenceQualityIssue[]; failedRules: string[] } {
408
+ const issueCodes: EvidenceQualityIssue[] = [];
409
+ const failedRules: string[] = [];
410
+ const commandRefs = invocationLedgerRefs(entries, 'command');
411
+ const artifactRefs = invocationLedgerRefs(entries, 'artifact_hash');
412
+ const materialRefs = ledgerMaterialRefs(entries);
413
+ const addIssue = (code: EvidenceQualityIssue, rule: string): void => {
414
+ if (!issueCodes.includes(code)) {
415
+ issueCodes.push(code);
416
+ }
417
+ if (!failedRules.includes(rule)) {
418
+ failedRules.push(rule);
419
+ }
420
+ };
421
+
422
+ if (!artifactRefs.has(claim.sourceArtifact)) {
423
+ addIssue('MISSING_ARTIFACT_REFERENCE', 'require-source-artifact-hash');
424
+ }
425
+ for (const item of claim.evidence) {
426
+ if (item.kind === 'command' && !commandRefs.has(item.ref)) {
427
+ addIssue('MISSING_COMMAND_OUTPUT', 'require-command-ledger');
428
+ }
429
+ if (item.kind === 'artifact' && !artifactRefs.has(item.ref)) {
430
+ addIssue('MISSING_ARTIFACT_REFERENCE', 'require-artifact-hash');
431
+ }
432
+ if (item.kind === 'material' && !materialRefs.has(item.ref)) {
433
+ addIssue('MISSING_MATERIAL_REFERENCE', 'require-material-ledger');
434
+ }
435
+ }
436
+ for (const ref of claim.provenance) {
437
+ const typed = parseTypedLedgerRef(ref);
438
+ if (!typed) {
439
+ continue;
440
+ }
441
+ if (typed.kind === 'command' && !commandRefs.has(typed.ref)) {
442
+ addIssue('PROVENANCE_GAP', 'require-command-provenance-ledger');
443
+ }
444
+ if (typed.kind === 'artifact' && !artifactRefs.has(typed.ref)) {
445
+ addIssue('PROVENANCE_GAP', 'require-artifact-provenance-ledger');
446
+ }
447
+ if (typed.kind === 'material' && !materialRefs.has(typed.ref)) {
448
+ addIssue('PROVENANCE_GAP', 'require-material-provenance-ledger');
449
+ }
450
+ }
451
+ return { issueCodes, failedRules };
452
+ }
453
+
454
+ function invocationLedgerRefs(entries: InvocationLedgerEntry[], kind: InvocationLedgerKind): Set<string> {
455
+ const refs = new Set<string>();
456
+ for (const entry of entries) {
457
+ if (entry.kind === kind) {
458
+ refs.add(entry.ref);
459
+ if (entry.artifactPath) {
460
+ refs.add(entry.artifactPath);
461
+ }
462
+ if (kind === 'command' && typeof entry.metadata.stepId === 'string') {
463
+ refs.add(entry.metadata.stepId);
464
+ }
465
+ }
466
+ }
467
+ return refs;
468
+ }
469
+
470
+ function parseTypedLedgerRef(value: string): { kind: string; ref: string } | null {
471
+ const separator = value.indexOf(':');
472
+ if (separator <= 0) {
473
+ return null;
474
+ }
475
+ const kind = value.slice(0, separator).trim();
476
+ const ref = value.slice(separator + 1).trim();
477
+ if (!/^[A-Za-z0-9_-]+$/.test(kind) || !ref) {
478
+ return null;
479
+ }
480
+ return { kind, ref };
481
+ }
482
+
483
+ function acceptanceMatchesTarget(target: AcceptanceCoverageTarget, acceptance: string): boolean {
484
+ const normalizedAcceptance = acceptance.toLowerCase();
485
+ return target.matchTexts.some((text) => text.toLowerCase() === normalizedAcceptance) || target.label.toLowerCase() === normalizedAcceptance;
486
+ }
487
+
488
+
489
+ function acceptanceCoverageDecision(acceptance: string, status: EvidenceCoverageStatus, evidence: string, issueCodes: EvidenceQualityIssue[], passedRules: string[], failedRules: string[]): AcceptanceCoverageItem {
490
+ return {
491
+ acceptance,
492
+ status,
493
+ evidence,
494
+ issueCodes,
495
+ policyDecision: {
496
+ status,
497
+ ruleSet: {
498
+ id: ACCEPTANCE_POLICY_RULESET_VERSION,
499
+ version: SDD_EVIDENCE_VERSION,
500
+ ruleIds: ['require-structured-evidence', 'require-source-evidence', 'require-provenance', 'require-policy-rule']
501
+ },
502
+ passedRules,
503
+ failedRules,
504
+ issueCodes
505
+ }
506
+ };
507
+ }
508
+
509
+ function taskAcceptanceCoverageTargets(task: SddTask): AcceptanceCoverageTarget[] {
510
+ if (task.acceptanceRefs.length > 0) {
511
+ return task.acceptanceRefs.map((ref, index) => {
512
+ const description = task.acceptance[index] ?? null;
513
+ return {
514
+ label: ref,
515
+ description,
516
+ matchTexts: description ? [ref, description] : [ref]
517
+ };
518
+ });
519
+ }
520
+ return task.acceptance.map((acceptance) => ({
521
+ label: acceptance,
522
+ description: null,
523
+ matchTexts: [acceptance]
524
+ }));
525
+ }
526
+
527
+ function deriveTaskEvidenceJudgmentStatus(reviewStatus: SddResultStatus | null, validationStatus: SddResultStatus | null, gaps: SddTaskGap[]): TaskEvidenceJudgmentStatus {
528
+ if (gaps.length > 0) {
529
+ return validationStatus === 'PASS_WITH_GAPS' ? 'PASS_WITH_GAPS' : 'BLOCKED';
530
+ }
531
+ if (reviewStatus !== 'PASS' || !validationStatus) {
532
+ return 'BLOCKED';
533
+ }
534
+ if (validationStatus === 'PASS') {
535
+ return 'PASS';
536
+ }
537
+ if (validationStatus === 'PASS_WITH_GAPS') {
538
+ return 'PASS_WITH_GAPS';
539
+ }
540
+ return validationStatus === 'FAIL' ? 'FAIL' : 'BLOCKED';
541
+ }
542
+
543
+ function toHarnessVerifyStatus(status: TaskEvidenceJudgmentStatus, reviewStatus: SddResultStatus | null, validationStatus: SddResultStatus | null, gaps: SddTaskGap[]): HarnessVerifyStatus {
544
+ if (status === 'PASS') {
545
+ return 'PASS';
546
+ }
547
+ if (status === 'PASS_WITH_GAPS') {
548
+ return 'GAPS';
549
+ }
550
+ if (!reviewStatus || !validationStatus || gaps.some((gap) => gap.field === 'review_artifact' || gap.field === 'validation_artifact')) {
551
+ return 'HUMAN_NEEDED';
552
+ }
553
+ return 'BLOCKED';
554
+ }
555
+
556
+ async function readArtifactIfExists(projectRoot: string, runId: string, runRelativeArtifactPath: string): Promise<string> {
557
+ try {
558
+ if (isBranchStageEvidenceRef(runRelativeArtifactPath)) {
559
+ try {
560
+ return await readFile(getBranchStageEvidencePathFromRef(projectRoot, runRelativeArtifactPath), 'utf8');
561
+ } catch {
562
+ return await readArtifact(projectRoot, runId, toEvidencePayloadFileName(runRelativeArtifactPath));
563
+ }
564
+ }
565
+ return await readArtifact(projectRoot, runId, toEvidencePayloadFileName(runRelativeArtifactPath));
566
+ } catch {
567
+ return '';
568
+ }
569
+ }
570
+
571
+ function artifactPathForAgent(state: RunState, taskId: string, agent: string): string | null {
572
+ const delegation = Object.values(state.delegations).find((candidate) => candidate.task === taskId && candidate.agent === agent && candidate.status === 'COMPLETED');
573
+ if (delegation) {
574
+ return delegation.expectedArtifact;
575
+ }
576
+ const artifact = state.artifacts.find((candidate) => candidate.task === taskId && candidate.agent === agent);
577
+ return artifact?.path ?? null;
578
+ }
579
+
580
+ function agentFromArtifactPath(artifactPath: string): string {
581
+ const kind = artifactKind(artifactPath);
582
+ if (kind === 'implement') {
583
+ return 'implementer';
584
+ }
585
+ if (kind === 'review' || kind === 'validation' || kind === 'debug') {
586
+ return kind === 'debug' ? 'debugger' : kind === 'review' ? 'reviewer' : 'validator';
587
+ }
588
+ if (kind === 'gap-report') {
589
+ return 'runtime';
590
+ }
591
+ return 'unknown';
592
+ }
593
+
594
+ function executedCommandsFromLedger(entries: InvocationLedgerEntry[]): string[] {
595
+ return [...new Set(entries
596
+ .filter((entry) => entry.kind === 'command' && entry.status !== 'declared')
597
+ .map((entry) => entry.ref))];
598
+ }
599
+
600
+ function sourceLocationEvidence(source: SddTask['source']): string {
601
+ return `${source.filePath}:${source.lineStart}-${source.lineEnd}`;
602
+ }
603
+
604
+ function ledgerMaterialRefs(entries: InvocationLedgerEntry[]): Set<string> {
605
+ const refs = new Set<string>();
606
+ for (const entry of entries) {
607
+ if (entry.kind === 'material') {
608
+ refs.add(entry.ref);
609
+ }
610
+ for (const ref of entry.materialRefs) {
611
+ refs.add(ref);
612
+ }
613
+ }
614
+ return refs;
615
+ }
616
+
617
+ function hashDocumentContent(raw: string): string {
618
+ return createHash('sha256').update(raw.replace(/\r\n/g, '\n'), 'utf8').digest('hex');
619
+ }