sdd-agent-platform 0.4.1 → 0.5.0

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