harness-engineering-agent 0.1.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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/config/config-defaults.d.ts +32 -0
  4. package/dist/config/config-defaults.d.ts.map +1 -0
  5. package/dist/config/config-defaults.js +32 -0
  6. package/dist/config/config-defaults.js.map +1 -0
  7. package/dist/config/config-errors.d.ts +7 -0
  8. package/dist/config/config-errors.d.ts.map +1 -0
  9. package/dist/config/config-errors.js +11 -0
  10. package/dist/config/config-errors.js.map +1 -0
  11. package/dist/config/config-file.d.ts +3 -0
  12. package/dist/config/config-file.d.ts.map +1 -0
  13. package/dist/config/config-file.js +31 -0
  14. package/dist/config/config-file.js.map +1 -0
  15. package/dist/config/config-merge.d.ts +8 -0
  16. package/dist/config/config-merge.d.ts.map +1 -0
  17. package/dist/config/config-merge.js +50 -0
  18. package/dist/config/config-merge.js.map +1 -0
  19. package/dist/config/config-schema.d.ts +135 -0
  20. package/dist/config/config-schema.d.ts.map +1 -0
  21. package/dist/config/config-schema.js +94 -0
  22. package/dist/config/config-schema.js.map +1 -0
  23. package/dist/config/config-types.d.ts +21 -0
  24. package/dist/config/config-types.d.ts.map +1 -0
  25. package/dist/config/config-types.js +2 -0
  26. package/dist/config/config-types.js.map +1 -0
  27. package/dist/config/harness-config.d.ts +6 -0
  28. package/dist/config/harness-config.d.ts.map +1 -0
  29. package/dist/config/harness-config.js +4 -0
  30. package/dist/config/harness-config.js.map +1 -0
  31. package/dist/config/index.d.ts +2 -0
  32. package/dist/config/index.d.ts.map +1 -0
  33. package/dist/config/index.js +2 -0
  34. package/dist/config/index.js.map +1 -0
  35. package/dist/config/load-harness-config.d.ts +9 -0
  36. package/dist/config/load-harness-config.d.ts.map +1 -0
  37. package/dist/config/load-harness-config.js +25 -0
  38. package/dist/config/load-harness-config.js.map +1 -0
  39. package/dist/controller/agent-output.d.ts +21 -0
  40. package/dist/controller/agent-output.d.ts.map +1 -0
  41. package/dist/controller/agent-output.js +75 -0
  42. package/dist/controller/agent-output.js.map +1 -0
  43. package/dist/controller/agent-session.d.ts +49 -0
  44. package/dist/controller/agent-session.d.ts.map +1 -0
  45. package/dist/controller/agent-session.js +220 -0
  46. package/dist/controller/agent-session.js.map +1 -0
  47. package/dist/controller/contracts.d.ts +65 -0
  48. package/dist/controller/contracts.d.ts.map +1 -0
  49. package/dist/controller/contracts.js +2 -0
  50. package/dist/controller/contracts.js.map +1 -0
  51. package/dist/controller/errors.d.ts +23 -0
  52. package/dist/controller/errors.d.ts.map +1 -0
  53. package/dist/controller/errors.js +37 -0
  54. package/dist/controller/errors.js.map +1 -0
  55. package/dist/controller/evidence-factory.d.ts +15 -0
  56. package/dist/controller/evidence-factory.d.ts.map +1 -0
  57. package/dist/controller/evidence-factory.js +38 -0
  58. package/dist/controller/evidence-factory.js.map +1 -0
  59. package/dist/controller/failure-analysis.d.ts +36 -0
  60. package/dist/controller/failure-analysis.d.ts.map +1 -0
  61. package/dist/controller/failure-analysis.js +175 -0
  62. package/dist/controller/failure-analysis.js.map +1 -0
  63. package/dist/controller/failure-factory.d.ts +85 -0
  64. package/dist/controller/failure-factory.d.ts.map +1 -0
  65. package/dist/controller/failure-factory.js +124 -0
  66. package/dist/controller/failure-factory.js.map +1 -0
  67. package/dist/controller/graph-validator.d.ts +4 -0
  68. package/dist/controller/graph-validator.d.ts.map +1 -0
  69. package/dist/controller/graph-validator.js +102 -0
  70. package/dist/controller/graph-validator.js.map +1 -0
  71. package/dist/controller/index.d.ts +15 -0
  72. package/dist/controller/index.d.ts.map +1 -0
  73. package/dist/controller/index.js +11 -0
  74. package/dist/controller/index.js.map +1 -0
  75. package/dist/controller/repair-loop.d.ts +42 -0
  76. package/dist/controller/repair-loop.d.ts.map +1 -0
  77. package/dist/controller/repair-loop.js +385 -0
  78. package/dist/controller/repair-loop.js.map +1 -0
  79. package/dist/controller/report-factory.d.ts +4 -0
  80. package/dist/controller/report-factory.d.ts.map +1 -0
  81. package/dist/controller/report-factory.js +107 -0
  82. package/dist/controller/report-factory.js.map +1 -0
  83. package/dist/controller/role-prompts.d.ts +8 -0
  84. package/dist/controller/role-prompts.d.ts.map +1 -0
  85. package/dist/controller/role-prompts.js +35 -0
  86. package/dist/controller/role-prompts.js.map +1 -0
  87. package/dist/controller/run-controller.d.ts +3 -0
  88. package/dist/controller/run-controller.d.ts.map +1 -0
  89. package/dist/controller/run-controller.js +291 -0
  90. package/dist/controller/run-controller.js.map +1 -0
  91. package/dist/controller/run-persistence.d.ts +15 -0
  92. package/dist/controller/run-persistence.d.ts.map +1 -0
  93. package/dist/controller/run-persistence.js +83 -0
  94. package/dist/controller/run-persistence.js.map +1 -0
  95. package/dist/controller/run-state.d.ts +61 -0
  96. package/dist/controller/run-state.d.ts.map +1 -0
  97. package/dist/controller/run-state.js +151 -0
  98. package/dist/controller/run-state.js.map +1 -0
  99. package/dist/controller/task-agent-output.d.ts +70 -0
  100. package/dist/controller/task-agent-output.d.ts.map +1 -0
  101. package/dist/controller/task-agent-output.js +256 -0
  102. package/dist/controller/task-agent-output.js.map +1 -0
  103. package/dist/controller/task-agent-schemas.d.ts +217 -0
  104. package/dist/controller/task-agent-schemas.d.ts.map +1 -0
  105. package/dist/controller/task-agent-schemas.js +171 -0
  106. package/dist/controller/task-agent-schemas.js.map +1 -0
  107. package/dist/controller/task-executor.d.ts +15 -0
  108. package/dist/controller/task-executor.d.ts.map +1 -0
  109. package/dist/controller/task-executor.js +751 -0
  110. package/dist/controller/task-executor.js.map +1 -0
  111. package/dist/controller/task-paths.d.ts +3 -0
  112. package/dist/controller/task-paths.d.ts.map +1 -0
  113. package/dist/controller/task-paths.js +20 -0
  114. package/dist/controller/task-paths.js.map +1 -0
  115. package/dist/controller/task-retry.d.ts +24 -0
  116. package/dist/controller/task-retry.d.ts.map +1 -0
  117. package/dist/controller/task-retry.js +42 -0
  118. package/dist/controller/task-retry.js.map +1 -0
  119. package/dist/controller/worktree-eligibility.d.ts +15 -0
  120. package/dist/controller/worktree-eligibility.d.ts.map +1 -0
  121. package/dist/controller/worktree-eligibility.js +38 -0
  122. package/dist/controller/worktree-eligibility.js.map +1 -0
  123. package/dist/controller/worktree-scheduler.d.ts +72 -0
  124. package/dist/controller/worktree-scheduler.d.ts.map +1 -0
  125. package/dist/controller/worktree-scheduler.js +142 -0
  126. package/dist/controller/worktree-scheduler.js.map +1 -0
  127. package/dist/domain/agent-result.d.ts +83 -0
  128. package/dist/domain/agent-result.d.ts.map +1 -0
  129. package/dist/domain/agent-result.js +44 -0
  130. package/dist/domain/agent-result.js.map +1 -0
  131. package/dist/domain/evidence.d.ts +97 -0
  132. package/dist/domain/evidence.d.ts.map +1 -0
  133. package/dist/domain/evidence.js +85 -0
  134. package/dist/domain/evidence.js.map +1 -0
  135. package/dist/domain/failure.d.ts +121 -0
  136. package/dist/domain/failure.d.ts.map +1 -0
  137. package/dist/domain/failure.js +72 -0
  138. package/dist/domain/failure.js.map +1 -0
  139. package/dist/domain/index.d.ts +19 -0
  140. package/dist/domain/index.d.ts.map +1 -0
  141. package/dist/domain/index.js +10 -0
  142. package/dist/domain/index.js.map +1 -0
  143. package/dist/domain/report.d.ts +904 -0
  144. package/dist/domain/report.d.ts.map +1 -0
  145. package/dist/domain/report.js +90 -0
  146. package/dist/domain/report.js.map +1 -0
  147. package/dist/domain/requirement.d.ts +10 -0
  148. package/dist/domain/requirement.d.ts.map +1 -0
  149. package/dist/domain/requirement.js +12 -0
  150. package/dist/domain/requirement.js.map +1 -0
  151. package/dist/domain/run.d.ts +857 -0
  152. package/dist/domain/run.d.ts.map +1 -0
  153. package/dist/domain/run.js +129 -0
  154. package/dist/domain/run.js.map +1 -0
  155. package/dist/domain/shared.d.ts +60 -0
  156. package/dist/domain/shared.d.ts.map +1 -0
  157. package/dist/domain/shared.js +66 -0
  158. package/dist/domain/shared.js.map +1 -0
  159. package/dist/domain/task.d.ts +316 -0
  160. package/dist/domain/task.d.ts.map +1 -0
  161. package/dist/domain/task.js +116 -0
  162. package/dist/domain/task.js.map +1 -0
  163. package/dist/index.d.ts +15 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +15 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/path/workspace-path.d.ts +6 -0
  168. package/dist/path/workspace-path.d.ts.map +1 -0
  169. package/dist/path/workspace-path.js +36 -0
  170. package/dist/path/workspace-path.js.map +1 -0
  171. package/dist/plugin/create-harness-plugin.d.ts +40 -0
  172. package/dist/plugin/create-harness-plugin.d.ts.map +1 -0
  173. package/dist/plugin/create-harness-plugin.js +169 -0
  174. package/dist/plugin/create-harness-plugin.js.map +1 -0
  175. package/dist/plugin/harness-agent-config.d.ts +6 -0
  176. package/dist/plugin/harness-agent-config.d.ts.map +1 -0
  177. package/dist/plugin/harness-agent-config.js +130 -0
  178. package/dist/plugin/harness-agent-config.js.map +1 -0
  179. package/dist/plugin/harness-chat-hook.d.ts +27 -0
  180. package/dist/plugin/harness-chat-hook.d.ts.map +1 -0
  181. package/dist/plugin/harness-chat-hook.js +72 -0
  182. package/dist/plugin/harness-chat-hook.js.map +1 -0
  183. package/dist/plugin/harness-chat-parts.d.ts +10 -0
  184. package/dist/plugin/harness-chat-parts.d.ts.map +1 -0
  185. package/dist/plugin/harness-chat-parts.js +36 -0
  186. package/dist/plugin/harness-chat-parts.js.map +1 -0
  187. package/dist/plugin/harness-chat-protocol.d.ts +9 -0
  188. package/dist/plugin/harness-chat-protocol.d.ts.map +1 -0
  189. package/dist/plugin/harness-chat-protocol.js +23 -0
  190. package/dist/plugin/harness-chat-protocol.js.map +1 -0
  191. package/dist/plugin/harness-coordinator.d.ts +33 -0
  192. package/dist/plugin/harness-coordinator.d.ts.map +1 -0
  193. package/dist/plugin/harness-coordinator.js +188 -0
  194. package/dist/plugin/harness-coordinator.js.map +1 -0
  195. package/dist/plugin/harness-intake-prompt.d.ts +2 -0
  196. package/dist/plugin/harness-intake-prompt.d.ts.map +1 -0
  197. package/dist/plugin/harness-intake-prompt.js +52 -0
  198. package/dist/plugin/harness-intake-prompt.js.map +1 -0
  199. package/dist/plugin/harness-intent.d.ts +72 -0
  200. package/dist/plugin/harness-intent.d.ts.map +1 -0
  201. package/dist/plugin/harness-intent.js +82 -0
  202. package/dist/plugin/harness-intent.js.map +1 -0
  203. package/dist/plugin/harness-parent-session-dispatcher.d.ts +46 -0
  204. package/dist/plugin/harness-parent-session-dispatcher.d.ts.map +1 -0
  205. package/dist/plugin/harness-parent-session-dispatcher.js +33 -0
  206. package/dist/plugin/harness-parent-session-dispatcher.js.map +1 -0
  207. package/dist/plugin/harness-requirement.d.ts +4 -0
  208. package/dist/plugin/harness-requirement.d.ts.map +1 -0
  209. package/dist/plugin/harness-requirement.js +37 -0
  210. package/dist/plugin/harness-requirement.js.map +1 -0
  211. package/dist/session/contracts.d.ts +178 -0
  212. package/dist/session/contracts.d.ts.map +1 -0
  213. package/dist/session/contracts.js +28 -0
  214. package/dist/session/contracts.js.map +1 -0
  215. package/dist/session/fake-session-adapter.d.ts +22 -0
  216. package/dist/session/fake-session-adapter.d.ts.map +1 -0
  217. package/dist/session/fake-session-adapter.js +238 -0
  218. package/dist/session/fake-session-adapter.js.map +1 -0
  219. package/dist/session/fake-session-errors.d.ts +23 -0
  220. package/dist/session/fake-session-errors.d.ts.map +1 -0
  221. package/dist/session/fake-session-errors.js +37 -0
  222. package/dist/session/fake-session-errors.js.map +1 -0
  223. package/dist/session/harness-agent-names.d.ts +51 -0
  224. package/dist/session/harness-agent-names.d.ts.map +1 -0
  225. package/dist/session/harness-agent-names.js +98 -0
  226. package/dist/session/harness-agent-names.js.map +1 -0
  227. package/dist/session/index.d.ts +9 -0
  228. package/dist/session/index.d.ts.map +1 -0
  229. package/dist/session/index.js +9 -0
  230. package/dist/session/index.js.map +1 -0
  231. package/dist/session/opencode-session-adapter.d.ts +9 -0
  232. package/dist/session/opencode-session-adapter.d.ts.map +1 -0
  233. package/dist/session/opencode-session-adapter.js +243 -0
  234. package/dist/session/opencode-session-adapter.js.map +1 -0
  235. package/dist/session/opencode-session-client.d.ts +58 -0
  236. package/dist/session/opencode-session-client.d.ts.map +1 -0
  237. package/dist/session/opencode-session-client.js +17 -0
  238. package/dist/session/opencode-session-client.js.map +1 -0
  239. package/dist/session/opencode-session-errors.d.ts +15 -0
  240. package/dist/session/opencode-session-errors.d.ts.map +1 -0
  241. package/dist/session/opencode-session-errors.js +19 -0
  242. package/dist/session/opencode-session-errors.js.map +1 -0
  243. package/dist/session/opencode-session-prompts.d.ts +12 -0
  244. package/dist/session/opencode-session-prompts.d.ts.map +1 -0
  245. package/dist/session/opencode-session-prompts.js +16 -0
  246. package/dist/session/opencode-session-prompts.js.map +1 -0
  247. package/dist/store/filesystem-run-store-io.d.ts +9 -0
  248. package/dist/store/filesystem-run-store-io.d.ts.map +1 -0
  249. package/dist/store/filesystem-run-store-io.js +85 -0
  250. package/dist/store/filesystem-run-store-io.js.map +1 -0
  251. package/dist/store/filesystem-run-store.d.ts +16 -0
  252. package/dist/store/filesystem-run-store.d.ts.map +1 -0
  253. package/dist/store/filesystem-run-store.js +286 -0
  254. package/dist/store/filesystem-run-store.js.map +1 -0
  255. package/dist/store/index.d.ts +5 -0
  256. package/dist/store/index.d.ts.map +1 -0
  257. package/dist/store/index.js +4 -0
  258. package/dist/store/index.js.map +1 -0
  259. package/dist/store/run-event.d.ts +786 -0
  260. package/dist/store/run-event.d.ts.map +1 -0
  261. package/dist/store/run-event.js +24 -0
  262. package/dist/store/run-event.js.map +1 -0
  263. package/dist/store/run-store-errors.d.ts +38 -0
  264. package/dist/store/run-store-errors.d.ts.map +1 -0
  265. package/dist/store/run-store-errors.js +62 -0
  266. package/dist/store/run-store-errors.js.map +1 -0
  267. package/dist/tools/context7-client.d.ts +22 -0
  268. package/dist/tools/context7-client.d.ts.map +1 -0
  269. package/dist/tools/context7-client.js +108 -0
  270. package/dist/tools/context7-client.js.map +1 -0
  271. package/dist/tools/grep-app-client.d.ts +21 -0
  272. package/dist/tools/grep-app-client.d.ts.map +1 -0
  273. package/dist/tools/grep-app-client.js +136 -0
  274. package/dist/tools/grep-app-client.js.map +1 -0
  275. package/dist/tools/harness-research-tools.d.ts +21 -0
  276. package/dist/tools/harness-research-tools.d.ts.map +1 -0
  277. package/dist/tools/harness-research-tools.js +101 -0
  278. package/dist/tools/harness-research-tools.js.map +1 -0
  279. package/dist/tools/lsp-client.d.ts +32 -0
  280. package/dist/tools/lsp-client.d.ts.map +1 -0
  281. package/dist/tools/lsp-client.js +234 -0
  282. package/dist/tools/lsp-client.js.map +1 -0
  283. package/dist/tools/lsp-json-rpc.d.ts +13 -0
  284. package/dist/tools/lsp-json-rpc.d.ts.map +1 -0
  285. package/dist/tools/lsp-json-rpc.js +98 -0
  286. package/dist/tools/lsp-json-rpc.js.map +1 -0
  287. package/dist/verification/command-policy.d.ts +11 -0
  288. package/dist/verification/command-policy.d.ts.map +1 -0
  289. package/dist/verification/command-policy.js +262 -0
  290. package/dist/verification/command-policy.js.map +1 -0
  291. package/dist/verification/contracts.d.ts +82 -0
  292. package/dist/verification/contracts.d.ts.map +1 -0
  293. package/dist/verification/contracts.js +6 -0
  294. package/dist/verification/contracts.js.map +1 -0
  295. package/dist/verification/fake-process-runner.d.ts +16 -0
  296. package/dist/verification/fake-process-runner.d.ts.map +1 -0
  297. package/dist/verification/fake-process-runner.js +28 -0
  298. package/dist/verification/fake-process-runner.js.map +1 -0
  299. package/dist/verification/index.d.ts +6 -0
  300. package/dist/verification/index.d.ts.map +1 -0
  301. package/dist/verification/index.js +5 -0
  302. package/dist/verification/index.js.map +1 -0
  303. package/dist/verification/node-process-runner.d.ts +12 -0
  304. package/dist/verification/node-process-runner.d.ts.map +1 -0
  305. package/dist/verification/node-process-runner.js +103 -0
  306. package/dist/verification/node-process-runner.js.map +1 -0
  307. package/dist/verification/verification-runner.d.ts +3 -0
  308. package/dist/verification/verification-runner.d.ts.map +1 -0
  309. package/dist/verification/verification-runner.js +101 -0
  310. package/dist/verification/verification-runner.js.map +1 -0
  311. package/dist/workspace/git-baseline.d.ts +63 -0
  312. package/dist/workspace/git-baseline.d.ts.map +1 -0
  313. package/dist/workspace/git-baseline.js +53 -0
  314. package/dist/workspace/git-baseline.js.map +1 -0
  315. package/dist/workspace/git-workspace-adapter.d.ts +43 -0
  316. package/dist/workspace/git-workspace-adapter.d.ts.map +1 -0
  317. package/dist/workspace/git-workspace-adapter.js +279 -0
  318. package/dist/workspace/git-workspace-adapter.js.map +1 -0
  319. package/dist/workspace/git-worktree-adapter.d.ts +45 -0
  320. package/dist/workspace/git-worktree-adapter.d.ts.map +1 -0
  321. package/dist/workspace/git-worktree-adapter.js +104 -0
  322. package/dist/workspace/git-worktree-adapter.js.map +1 -0
  323. package/dist/workspace/index.d.ts +7 -0
  324. package/dist/workspace/index.d.ts.map +1 -0
  325. package/dist/workspace/index.js +4 -0
  326. package/dist/workspace/index.js.map +1 -0
  327. package/package.json +45 -0
@@ -0,0 +1,385 @@
1
+ import { AgentResultSchema, } from "../domain/index.js";
2
+ import { VerificationExecutionStatus } from "../verification/index.js";
3
+ import { createEvidence } from "./evidence-factory.js";
4
+ import { createContextGapFailure, createImplementationFailure, createScopeDriftFailure, } from "./failure-factory.js";
5
+ import { withParts } from "./run-state.js";
6
+ import { readRepairWorkerOutput, readWorkerOutput } from "./task-agent-output.js";
7
+ import { isAllowedPath } from "./task-paths.js";
8
+ import { persistTaskFailed, persistTaskPaused } from "./task-retry.js";
9
+ export const runRepairLoop = async (input) => {
10
+ const repairAttempt = input.repairAttempt ?? 1;
11
+ const seenRootCauseFingerprints = input.seenRootCauseFingerprints ?? [];
12
+ if (repairAttempt > input.task.retryBudget.maxRepairAttempts) {
13
+ const budgetFailure = createImplementationFailure({
14
+ failureId: input.executor.options.ids.createFailureId(`${input.task.taskId}-${input.attempt}-repair-budget`),
15
+ runId: input.run.runId,
16
+ taskId: input.task.taskId,
17
+ summary: "Repair budget exhausted before another automatic fix.",
18
+ detail: `task ${input.task.taskId} exhausted repair budget at attempt ${repairAttempt}`,
19
+ recoveryPlan: "Pause automatic repair and request a manual decision.",
20
+ });
21
+ return {
22
+ kind: "terminal",
23
+ run: await persistTaskFailed({
24
+ run: input.run,
25
+ failure: budgetFailure,
26
+ task: input.task,
27
+ writer: input.executor.writer,
28
+ }),
29
+ };
30
+ }
31
+ const repairOutput = await readRepairWorkerOutput({
32
+ input: input.executor,
33
+ run: input.run,
34
+ task: input.task,
35
+ attempt: repairAttempt,
36
+ failure: input.failure,
37
+ evidence: input.evidence,
38
+ });
39
+ if (repairOutput.kind === "failed") {
40
+ return {
41
+ kind: "terminal",
42
+ run: await persistTaskFailed({
43
+ run: input.run,
44
+ failure: repairOutput.failure,
45
+ task: input.task,
46
+ writer: input.executor.writer,
47
+ }),
48
+ };
49
+ }
50
+ const repairTask = repairOutput.repairTask;
51
+ const validationFailure = validateRepairTask({
52
+ options: input.executor.options,
53
+ run: input.run,
54
+ task: input.task,
55
+ failure: input.failure,
56
+ repairTask,
57
+ seenRootCauseFingerprints,
58
+ });
59
+ if (validationFailure?.kind === "failed") {
60
+ return {
61
+ kind: "terminal",
62
+ run: await persistTaskFailed({
63
+ run: input.run,
64
+ failure: validationFailure.failure,
65
+ task: input.task,
66
+ writer: input.executor.writer,
67
+ }),
68
+ };
69
+ }
70
+ if (validationFailure?.kind === "paused") {
71
+ return {
72
+ kind: "terminal",
73
+ run: await persistTaskPaused({
74
+ run: input.run,
75
+ failure: validationFailure.failure,
76
+ task: input.task,
77
+ writer: input.executor.writer,
78
+ eventPayload: { rootCauseFingerprint: repairTask.rootCauseFingerprint },
79
+ }),
80
+ };
81
+ }
82
+ const repairResult = AgentResultSchema.parse({
83
+ schemaVersion: "1.0.0",
84
+ resultId: input.executor.options.ids.createAgentResultId(`repair-worker-${input.task.taskId}-${repairAttempt}`),
85
+ runId: input.run.runId,
86
+ taskId: input.task.taskId,
87
+ role: "repair-worker",
88
+ status: "completed",
89
+ summary: repairOutput.output.summary,
90
+ evidenceIds: repairTask.failureEvidenceIds,
91
+ changedPaths: [],
92
+ });
93
+ let currentRun = withParts(input.run, {
94
+ evidence: input.run.evidence,
95
+ failures: input.run.failures,
96
+ agentResults: [...input.run.agentResults, repairResult],
97
+ workspace: input.run.workspace,
98
+ });
99
+ const redResult = await runVerificationPhase({
100
+ options: input.executor.options,
101
+ run: currentRun,
102
+ task: input.task,
103
+ commands: repairTask.verificationPlan.minimalFailureSet,
104
+ kind: "red",
105
+ label: `repair-red-${repairAttempt}`,
106
+ expectedStatus: "failed",
107
+ });
108
+ if (redResult.kind === "terminal") {
109
+ return { kind: "terminal", run: redResult.run };
110
+ }
111
+ currentRun = redResult.run;
112
+ const repairScopedTask = {
113
+ ...input.task,
114
+ allowedPaths: repairTask.allowedPaths,
115
+ evidenceRefs: [...input.task.evidenceRefs, ...repairTask.failureEvidenceIds],
116
+ };
117
+ const workerOutput = await readWorkerOutput({
118
+ input: input.executor,
119
+ run: currentRun,
120
+ task: repairScopedTask,
121
+ attempt: repairAttempt,
122
+ });
123
+ if (workerOutput.kind === "failed") {
124
+ return {
125
+ kind: "terminal",
126
+ run: await persistTaskFailed({
127
+ run: currentRun,
128
+ failure: workerOutput.failure,
129
+ task: input.task,
130
+ writer: input.executor.writer,
131
+ }),
132
+ };
133
+ }
134
+ if (!workerOutput.output.changedPaths.every((path) => isAllowedPath(path, repairTask.allowedPaths))) {
135
+ const scopeFailure = createScopeDriftFailure({
136
+ failureId: input.executor.options.ids.createFailureId(`${input.task.taskId}-${repairAttempt}-repair-scope`),
137
+ runId: currentRun.runId,
138
+ taskId: input.task.taskId,
139
+ driftedPaths: workerOutput.output.changedPaths,
140
+ summary: "Repair worker reported paths outside the approved repair scope.",
141
+ detail: workerOutput.output.changedPaths.join(", "),
142
+ recoveryPlan: "Stop automatic repair and require manual review of the widened path set.",
143
+ });
144
+ return {
145
+ kind: "terminal",
146
+ run: await persistTaskFailed({
147
+ run: currentRun,
148
+ failure: scopeFailure,
149
+ task: input.task,
150
+ writer: input.executor.writer,
151
+ }),
152
+ };
153
+ }
154
+ const greenResult = await runVerificationPhase({
155
+ options: input.executor.options,
156
+ run: currentRun,
157
+ task: input.task,
158
+ commands: repairTask.verificationPlan.minimalFailureSet,
159
+ kind: "green",
160
+ label: `repair-green-${repairAttempt}`,
161
+ expectedStatus: "passed",
162
+ });
163
+ if (greenResult.kind === "terminal") {
164
+ const analyzed = await input.analyzeFailure({
165
+ run: greenResult.run,
166
+ task: input.task,
167
+ attempt: input.attempt,
168
+ failure: greenResult.failure,
169
+ evidence: greenResult.evidence,
170
+ });
171
+ if (!analyzed.repairRequested || analyzed.run.status !== "executing") {
172
+ return { kind: "terminal", run: analyzed.run };
173
+ }
174
+ return runRepairLoop({
175
+ ...input,
176
+ run: analyzed.run,
177
+ failure: analyzed.failure,
178
+ evidence: greenResult.evidence,
179
+ repairAttempt: repairAttempt + 1,
180
+ seenRootCauseFingerprints: [...seenRootCauseFingerprints, repairTask.rootCauseFingerprint],
181
+ });
182
+ }
183
+ currentRun = greenResult.run;
184
+ const refactorResult = await runVerificationPhase({
185
+ options: input.executor.options,
186
+ run: currentRun,
187
+ task: input.task,
188
+ commands: repairTask.verificationPlan.fullVerification,
189
+ kind: "refactor",
190
+ label: `repair-refactor-${repairAttempt}`,
191
+ expectedStatus: "passed",
192
+ });
193
+ if (refactorResult.kind === "terminal") {
194
+ const analyzed = await input.analyzeFailure({
195
+ run: refactorResult.run,
196
+ task: input.task,
197
+ attempt: input.attempt,
198
+ failure: refactorResult.failure,
199
+ evidence: refactorResult.evidence,
200
+ });
201
+ if (!analyzed.repairRequested || analyzed.run.status !== "executing") {
202
+ return { kind: "terminal", run: analyzed.run };
203
+ }
204
+ return runRepairLoop({
205
+ ...input,
206
+ run: analyzed.run,
207
+ failure: analyzed.failure,
208
+ evidence: refactorResult.evidence,
209
+ repairAttempt: repairAttempt + 1,
210
+ seenRootCauseFingerprints: [...seenRootCauseFingerprints, repairTask.rootCauseFingerprint],
211
+ });
212
+ }
213
+ return {
214
+ kind: "completed",
215
+ run: refactorResult.run,
216
+ evidence: refactorResult.evidence,
217
+ changedPaths: workerOutput.output.changedPaths,
218
+ };
219
+ };
220
+ const validateRepairTask = (input) => {
221
+ if (input.repairTask.sourceTaskId !== input.task.taskId) {
222
+ return {
223
+ kind: "failed",
224
+ failure: createImplementationFailure({
225
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-source-task`),
226
+ runId: input.run.runId,
227
+ taskId: input.task.taskId,
228
+ summary: "Repair task source task does not match the active task.",
229
+ detail: input.repairTask.sourceTaskId,
230
+ recoveryPlan: "Reject the repair task and request a fresh structured repair plan.",
231
+ }),
232
+ };
233
+ }
234
+ if (input.repairTask.sourceFailureId !== input.failure.failureId) {
235
+ return {
236
+ kind: "failed",
237
+ failure: createImplementationFailure({
238
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-source-failure`),
239
+ runId: input.run.runId,
240
+ taskId: input.task.taskId,
241
+ summary: "Repair task failure reference does not match the analyzed failure.",
242
+ detail: input.repairTask.sourceFailureId,
243
+ recoveryPlan: "Reject the repair task and regenerate it from the current failure record.",
244
+ }),
245
+ };
246
+ }
247
+ if (!input.repairTask.allowedPaths.every((path) => isAllowedPath(path, input.task.allowedPaths))) {
248
+ return {
249
+ kind: "failed",
250
+ failure: createScopeDriftFailure({
251
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-allowed-paths`),
252
+ runId: input.run.runId,
253
+ taskId: input.task.taskId,
254
+ driftedPaths: input.repairTask.allowedPaths,
255
+ summary: "Repair task widened allowedPaths beyond the source task scope.",
256
+ detail: input.repairTask.allowedPaths.join(", "),
257
+ recoveryPlan: "Reject the widened repair scope and require a narrower repair task.",
258
+ }),
259
+ };
260
+ }
261
+ if (input.repairTask.retryBudget.maxRepairAttempts > input.task.retryBudget.maxRepairAttempts) {
262
+ return {
263
+ kind: "failed",
264
+ failure: createImplementationFailure({
265
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-budget-scope`),
266
+ runId: input.run.runId,
267
+ taskId: input.task.taskId,
268
+ summary: "Repair task widened the approved repair budget.",
269
+ detail: JSON.stringify(input.repairTask.retryBudget),
270
+ recoveryPlan: "Reject the repair task until its budget is equal to or narrower than the source task.",
271
+ }),
272
+ };
273
+ }
274
+ if (input.repairTask.retryBudget.maxAttempts > input.task.retryBudget.maxAttempts) {
275
+ return {
276
+ kind: "failed",
277
+ failure: createImplementationFailure({
278
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-task-budget`),
279
+ runId: input.run.runId,
280
+ taskId: input.task.taskId,
281
+ summary: "Repair task widened the approved attempt budget.",
282
+ detail: JSON.stringify(input.repairTask.retryBudget),
283
+ recoveryPlan: "Reject the repair task until its attempt budget is equal to or narrower than the source task.",
284
+ }),
285
+ };
286
+ }
287
+ const evidenceIds = new Set(input.run.evidence.map((evidence) => evidence.evidenceId));
288
+ if (!input.repairTask.failureEvidenceIds.every((evidenceId) => evidenceIds.has(evidenceId))) {
289
+ return {
290
+ kind: "failed",
291
+ failure: createContextGapFailure({
292
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-evidence-gap`),
293
+ runId: input.run.runId,
294
+ taskId: input.task.taskId,
295
+ relatedEvidenceIds: input.repairTask.failureEvidenceIds,
296
+ summary: "Repair task referenced missing failure evidence.",
297
+ detail: input.repairTask.failureEvidenceIds.join(", "),
298
+ recoveryPlan: "Regenerate the repair task with real failure evidence references.",
299
+ missingContext: ["failure-evidence"],
300
+ }),
301
+ };
302
+ }
303
+ if (input.seenRootCauseFingerprints.includes(input.repairTask.rootCauseFingerprint)) {
304
+ return {
305
+ kind: "paused",
306
+ failure: createImplementationFailure({
307
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-repair-repeated-root-cause`),
308
+ runId: input.run.runId,
309
+ taskId: input.task.taskId,
310
+ rootCauseFingerprint: input.repairTask.rootCauseFingerprint,
311
+ summary: "Repeated repair root cause detected.",
312
+ detail: `Repeated rootCauseFingerprint: ${input.repairTask.rootCauseFingerprint}`,
313
+ recoveryPlan: "Pause automatic repair and request human review for the repeated root cause.",
314
+ }),
315
+ };
316
+ }
317
+ return undefined;
318
+ };
319
+ const runVerificationPhase = async (input) => {
320
+ let verificationResult;
321
+ try {
322
+ verificationResult = await input.options.verificationRunner.run({
323
+ verificationCommands: input.commands,
324
+ defaultWorkingDirectory: input.options.workingDirectory,
325
+ });
326
+ }
327
+ catch (error) {
328
+ if (!(error instanceof Error)) {
329
+ throw error;
330
+ }
331
+ const failure = createImplementationFailure({
332
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-${input.label}-environment`),
333
+ runId: input.run.runId,
334
+ taskId: input.task.taskId,
335
+ summary: `Repair verification phase ${input.kind} could not run.`,
336
+ detail: error.message,
337
+ recoveryPlan: "Fix the verification environment before continuing the repair loop.",
338
+ });
339
+ return { kind: "terminal", run: input.run, evidence: [], failure };
340
+ }
341
+ if (verificationResult.records.length === 0) {
342
+ const failure = createContextGapFailure({
343
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-${input.label}-empty`),
344
+ runId: input.run.runId,
345
+ taskId: input.task.taskId,
346
+ relatedEvidenceIds: [],
347
+ summary: `Repair verification phase ${input.kind} produced no records.`,
348
+ detail: "At least one verification record is required for every repair phase.",
349
+ recoveryPlan: "Rerun the repair phase and capture a real verification record.",
350
+ missingContext: ["verification-record"],
351
+ });
352
+ return { kind: "terminal", run: input.run, evidence: [], failure };
353
+ }
354
+ const evidence = verificationResult.records.map((record, index) => createEvidence({
355
+ ids: input.options.ids,
356
+ runId: input.run.runId,
357
+ task: input.task,
358
+ record,
359
+ label: `${input.task.taskId}-${input.label}-${index}`,
360
+ kind: input.kind,
361
+ summary: `${input.kind}:${record.command.name}`,
362
+ }));
363
+ const nextRun = withParts(input.run, {
364
+ evidence: [...input.run.evidence, ...evidence],
365
+ failures: input.run.failures,
366
+ agentResults: input.run.agentResults,
367
+ workspace: input.run.workspace,
368
+ });
369
+ const phasePassed = verificationResult.records.every((record) => record.status === VerificationExecutionStatus.passed);
370
+ const expectedSatisfied = input.expectedStatus === "passed" ? phasePassed : !phasePassed;
371
+ if (expectedSatisfied) {
372
+ return { kind: "completed", run: nextRun, evidence };
373
+ }
374
+ const failure = createImplementationFailure({
375
+ failureId: input.options.ids.createFailureId(`${input.task.taskId}-${input.label}-mismatch`),
376
+ runId: input.run.runId,
377
+ taskId: input.task.taskId,
378
+ ...(evidence[0] === undefined ? {} : { failingEvidenceId: evidence[0].evidenceId }),
379
+ summary: `Repair verification phase ${input.kind} returned an unexpected result.`,
380
+ detail: `expected ${input.expectedStatus}`,
381
+ recoveryPlan: "Analyze the repair evidence and decide whether another bounded repair attempt is allowed.",
382
+ });
383
+ return { kind: "terminal", run: nextRun, evidence, failure };
384
+ };
385
+ //# sourceMappingURL=repair-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-loop.js","sourceRoot":"","sources":["../../src/controller/repair-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAKlB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,2BAA2B,EAA8B,MAAM,0BAA0B,CAAA;AAGlG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AA0BtE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAcnC,EAA6B,EAAE;IAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAA;IAC9C,MAAM,yBAAyB,GAAG,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAA;IAEvE,IAAI,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAC7D,MAAM,aAAa,GAAG,2BAA2B,CAAC;YAChD,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CACnD,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,gBAAgB,CACtD;YACD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;YACzB,OAAO,EAAE,uDAAuD;YAChE,MAAM,EAAE,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,uCAAuC,aAAa,EAAE;YACvF,YAAY,EAAE,uDAAuD;SACtE,CAAC,CAAA;QACF,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,MAAM,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aAC9B,CAAC;SACH,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC;QAChD,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAA;IACF,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,MAAM,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aAC9B,CAAC;SACH,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAA;IAC1C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;QAC3C,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;QAC/B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU;QACV,yBAAyB;KAC1B,CAAC,CAAA;IACF,IAAI,iBAAiB,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,MAAM,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,iBAAiB,CAAC,OAAO;gBAClC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aAC9B,CAAC;SACH,CAAA;IACH,CAAC;IACD,IAAI,iBAAiB,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,MAAM,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,iBAAiB,CAAC,OAAO;gBAClC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;gBAC7B,YAAY,EAAE,EAAE,oBAAoB,EAAE,UAAU,CAAC,oBAAoB,EAAE;aACxE,CAAC;SACH,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC;QAC3C,aAAa,EAAE,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CACtD,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,CACtD;QACD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;QACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;QACzB,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO;QACpC,WAAW,EAAE,UAAU,CAAC,kBAAkB;QAC1C,YAAY,EAAE,EAAE;KACjB,CAAC,CAAA;IACF,IAAI,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;QACpC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;QAC5B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;QAC5B,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;QACvD,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS;KAC/B,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC;QAC3C,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;QAC/B,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,UAAU,CAAC,gBAAgB,CAAC,iBAAiB;QACvD,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,cAAc,aAAa,EAAE;QACpC,cAAc,EAAE,QAAQ;KACzB,CAAC,CAAA;IACF,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,CAAA;IACjD,CAAC;IACD,UAAU,GAAG,SAAS,CAAC,GAAG,CAAA;IAE1B,MAAM,gBAAgB,GAAG;QACvB,GAAG,KAAK,CAAC,IAAI;QACb,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC,kBAAkB,CAAC;KAC9D,CAAA;IAChB,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC;QAC1C,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa;KACvB,CAAC,CAAA;IACF,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,MAAM,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aAC9B,CAAC;SACH,CAAA;IACH,CAAC;IACD,IACE,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,EAC/F,CAAC;QACD,MAAM,YAAY,GAAG,uBAAuB,CAAC;YAC3C,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CACnD,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,aAAa,eAAe,CACrD;YACD,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;YACzB,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,YAAY;YAC9C,OAAO,EAAE,iEAAiE;YAC1E,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACnD,YAAY,EAAE,0EAA0E;SACzF,CAAC,CAAA;QACF,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,MAAM,iBAAiB,CAAC;gBAC3B,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;aAC9B,CAAC;SACH,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC;QAC7C,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;QAC/B,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,UAAU,CAAC,gBAAgB,CAAC,iBAAiB;QACvD,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,gBAAgB,aAAa,EAAE;QACtC,cAAc,EAAE,QAAQ;KACzB,CAAC,CAAA;IACF,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC;YAC1C,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,QAAQ,EAAE,WAAW,CAAC,QAAQ;SAC/B,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAA;QAChD,CAAC;QACD,OAAO,aAAa,CAAC;YACnB,GAAG,KAAK;YACR,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,aAAa,EAAE,aAAa,GAAG,CAAC;YAChC,yBAAyB,EAAE,CAAC,GAAG,yBAAyB,EAAE,UAAU,CAAC,oBAAoB,CAAC;SAC3F,CAAC,CAAA;IACJ,CAAC;IACD,UAAU,GAAG,WAAW,CAAC,GAAG,CAAA;IAE5B,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC;QAChD,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;QAC/B,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,UAAU,CAAC,gBAAgB,CAAC,gBAAgB;QACtD,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,mBAAmB,aAAa,EAAE;QACzC,cAAc,EAAE,QAAQ;KACzB,CAAC,CAAA;IACF,IAAI,cAAc,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC;YAC1C,GAAG,EAAE,cAAc,CAAC,GAAG;YACvB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;SAClC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACrE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAA;QAChD,CAAC;QACD,OAAO,aAAa,CAAC;YACnB,GAAG,KAAK;YACR,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,aAAa,EAAE,aAAa,GAAG,CAAC;YAChC,yBAAyB,EAAE,CAAC,GAAG,yBAAyB,EAAE,UAAU,CAAC,oBAAoB,CAAC;SAC3F,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,cAAc,CAAC,GAAG;QACvB,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,YAAY;KAC/C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,KAO3B,EAGa,EAAE;IACd,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,2BAA2B,CAAC;gBACnC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC;gBACvF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,OAAO,EAAE,yDAAyD;gBAClE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;gBACrC,YAAY,EAAE,oEAAoE;aACnF,CAAC;SACH,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACjE,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,2BAA2B,CAAC;gBACnC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,wBAAwB,CAAC;gBAC1F,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,OAAO,EAAE,oEAAoE;gBAC7E,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,eAAe;gBACxC,YAAY,EAAE,2EAA2E;aAC1F,CAAC;SACH,CAAA;IACH,CAAC;IACD,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAC5F,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,uBAAuB,CAAC;gBAC/B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,uBAAuB,CAAC;gBACzF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;gBAC3C,OAAO,EAAE,gEAAgE;gBACzE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChD,YAAY,EAAE,qEAAqE;aACpF,CAAC;SACH,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAC9F,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,2BAA2B,CAAC;gBACnC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,sBAAsB,CAAC;gBACxF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,OAAO,EAAE,iDAAiD;gBAC1D,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;gBACpD,YAAY,EACV,uFAAuF;aAC1F,CAAC;SACH,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAClF,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,2BAA2B,CAAC;gBACnC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC;gBACvF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,OAAO,EAAE,kDAAkD;gBAC3D,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;gBACpD,YAAY,EACV,+FAA+F;aAClG,CAAC;SACH,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;IACtF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,uBAAuB,CAAC;gBAC/B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,sBAAsB,CAAC;gBACxF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,kBAAkB;gBACvD,OAAO,EAAE,kDAAkD;gBAC3D,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtD,YAAY,EAAE,mEAAmE;gBACjF,cAAc,EAAE,CAAC,kBAAkB,CAAC;aACrC,CAAC;SACH,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,yBAAyB,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACpF,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,2BAA2B,CAAC;gBACnC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAC1C,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,6BAA6B,CAClD;gBACD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;gBACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACzB,oBAAoB,EAAE,KAAK,CAAC,UAAU,CAAC,oBAAoB;gBAC3D,OAAO,EAAE,sCAAsC;gBAC/C,MAAM,EAAE,kCAAkC,KAAK,CAAC,UAAU,CAAC,oBAAoB,EAAE;gBACjF,YAAY,EACV,8EAA8E;aACjF,CAAC;SACH,CAAA;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,KAAK,EAAE,KAQnC,EAYC,EAAE;IACF,IAAI,kBAAyC,CAAA;IAC7C,IAAI,CAAC;QACH,kBAAkB,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC9D,oBAAoB,EAAE,KAAK,CAAC,QAAQ;YACpC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB;SACxD,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAA;QACb,CAAC;QACD,MAAM,OAAO,GAAG,2BAA2B,CAAC;YAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAC1C,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,cAAc,CAClD;YACD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;YACzB,OAAO,EAAE,6BAA6B,KAAK,CAAC,IAAI,iBAAiB;YACjE,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,YAAY,EAAE,qEAAqE;SACpF,CAAC,CAAA;QACF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAA;IACpE,CAAC;IACD,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACtC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,QAAQ,CAAC;YACzF,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;YACzB,kBAAkB,EAAE,EAAE;YACtB,OAAO,EAAE,6BAA6B,KAAK,CAAC,IAAI,uBAAuB;YACvE,MAAM,EAAE,sEAAsE;YAC9E,YAAY,EAAE,gEAAgE;YAC9E,cAAc,EAAE,CAAC,qBAAqB,CAAC;SACxC,CAAC,CAAA;QACF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAA;IACpE,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAChE,cAAc,CAAC;QACb,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM;QACN,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE;QACrD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;KAChD,CAAC,CACH,CAAA;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;QACnC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAC9C,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ;QAC5B,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY;QACpC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS;KAC/B,CAAC,CAAA;IACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAClD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,2BAA2B,CAAC,MAAM,CACjE,CAAA;IACD,MAAM,iBAAiB,GAAG,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;IACxF,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;IACtD,CAAC;IACD,MAAM,OAAO,GAAG,2BAA2B,CAAC;QAC1C,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,WAAW,CAAC;QAC5F,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;QACtB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;QACzB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACnF,OAAO,EAAE,6BAA6B,KAAK,CAAC,IAAI,iCAAiC;QACjF,MAAM,EAAE,YAAY,KAAK,CAAC,cAAc,EAAE;QAC1C,YAAY,EACV,2FAA2F;KAC9F,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAC9D,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type Report, type Run } from "../domain/index.js";
2
+ import type { ControllerClock } from "./contracts.js";
3
+ export declare const createReport: (run: Run, clock: ControllerClock) => Report;
4
+ //# sourceMappingURL=report-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-factory.d.ts","sourceRoot":"","sources":["../../src/controller/report-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAEX,KAAK,GAAG,EAET,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,eAAO,MAAM,YAAY,GAAI,KAAK,GAAG,EAAE,OAAO,eAAe,KAAG,MAsE/D,CAAA"}
@@ -0,0 +1,107 @@
1
+ import { ReportSchema, } from "../domain/index.js";
2
+ export const createReport = (run, clock) => {
3
+ const waivedRequirementIds = run.governance.waivers.map((waiver) => waiver.requirementId);
4
+ const tasks = "taskGraph" in run ? run.taskGraph.tasks.map((task) => createTaskSummary(task, run)) : [];
5
+ const traceability = "taskGraph" in run
6
+ ? run.requirement.acceptanceCriteria.map((criterion, index) => createAcceptanceTrace(run, criterion, index))
7
+ : [];
8
+ const evidenceGaps = run.failures
9
+ .filter((failure) => failure.category === "context-gap")
10
+ .map((failure) => ({
11
+ taskId: failure.taskId,
12
+ missing: failure.missingContext,
13
+ summary: failure.summary,
14
+ }));
15
+ const openRequirementIds = traceability.some((item) => item.status === "blocked")
16
+ ? [run.requirement.requirementId]
17
+ : run.status === "completed" || waivedRequirementIds.includes(run.requirement.requirementId)
18
+ ? []
19
+ : [run.requirement.requirementId];
20
+ return ReportSchema.parse({
21
+ schemaVersion: "1.0.0",
22
+ run,
23
+ generatedAt: clock.now().toISOString(),
24
+ acceptance: {
25
+ status: openRequirementIds.length === 0 && waivedRequirementIds.length > 0
26
+ ? "waived"
27
+ : run.status === "completed"
28
+ ? "accepted"
29
+ : "blocked",
30
+ summary: `Run ${run.runId} is ${run.status}`,
31
+ openRequirementIds,
32
+ waivedRequirementIds,
33
+ },
34
+ traceability,
35
+ tasks,
36
+ unfinishedTasks: tasks.filter((task) => task.status !== "completed"),
37
+ verificationSummaries: run.evidence.map((evidence) => ({
38
+ evidenceId: evidence.evidenceId,
39
+ taskId: evidence.taskId,
40
+ command: evidence.verificationCommand.command,
41
+ commandSummary: evidence.verificationCommand.name,
42
+ status: evidence.outcome.status,
43
+ exitCode: evidence.outcome.exitCode,
44
+ outputDigest: evidence.outcome.outputDigest,
45
+ outputRef: evidence.outcome.outputRef,
46
+ })),
47
+ failures: run.failures.map((failure) => ({
48
+ failureId: failure.failureId,
49
+ taskId: failure.taskId,
50
+ category: failure.category,
51
+ summary: failure.summary,
52
+ relatedEvidenceIds: failure.relatedEvidenceIds,
53
+ })),
54
+ evidenceGaps,
55
+ waivers: run.governance.waivers.map((waiver) => ({
56
+ waiverId: waiver.waiverId,
57
+ requirementId: waiver.requirementId,
58
+ reason: waiver.reason,
59
+ residualRisk: waiver.residualRisk,
60
+ })),
61
+ residualRisks: [
62
+ ...run.governance.waivers.map((waiver) => waiver.residualRisk),
63
+ ...evidenceGaps.map((gap) => `Evidence gap for ${gap.taskId}: ${gap.summary}`),
64
+ ],
65
+ });
66
+ };
67
+ const createTaskSummary = (task, run) => ({
68
+ taskId: task.taskId,
69
+ status: task.status,
70
+ changedPaths: run === undefined
71
+ ? []
72
+ : run.agentResults
73
+ .filter(isCompletedAgentResult)
74
+ .filter((result) => result.taskId === task.taskId)
75
+ .flatMap((result) => result.changedPaths),
76
+ evidenceIds: task.evidenceRefs,
77
+ });
78
+ const createAcceptanceTrace = (run, criterion, index) => {
79
+ const criterionId = `${run.requirement.requirementId}-ac-${index + 1}`;
80
+ const taskIds = run.taskGraph.tasks
81
+ .filter((task) => task.requirementIds.includes(run.requirement.requirementId))
82
+ .map((task) => task.taskId);
83
+ const evidence = run.evidence.filter((item) => item.acceptanceCriterionIds.includes(criterionId));
84
+ const agentResultIds = run.agentResults
85
+ .filter((result) => taskIds.includes(result.taskId) &&
86
+ result.evidenceIds.some((id) => evidence.some((item) => item.evidenceId === id)))
87
+ .map((result) => result.resultId);
88
+ const failureIds = run.failures
89
+ .filter((failure) => taskIds.includes(failure.taskId))
90
+ .map((failure) => failure.failureId);
91
+ const changedPaths = evidence.flatMap((item) => item.changedPaths);
92
+ const accepted = evidence.some((item) => item.outcome.status === "passed") &&
93
+ taskIds.some((taskId) => run.taskGraph.tasks.some((task) => task.taskId === taskId && task.status === "completed"));
94
+ return {
95
+ criterionId,
96
+ requirementId: run.requirement.requirementId,
97
+ criterion,
98
+ status: accepted ? "accepted" : "blocked",
99
+ taskIds,
100
+ changedPaths: [...new Set(changedPaths)],
101
+ verificationEvidenceIds: evidence.map((item) => item.evidenceId),
102
+ agentResultIds,
103
+ failureIds,
104
+ };
105
+ };
106
+ const isCompletedAgentResult = (result) => result.status === "completed";
107
+ //# sourceMappingURL=report-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-factory.js","sourceRoot":"","sources":["../../src/controller/report-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Requirement, RunId } from "../domain/index.js";
2
+ import type { HarnessSessionRole } from "../session/index.js";
3
+ export declare const roleSystemPrompt: (role: HarnessSessionRole) => string;
4
+ export declare const plannerTaskPrompt: (input: {
5
+ readonly requirement: Requirement;
6
+ readonly runId: RunId;
7
+ }) => string;
8
+ //# sourceMappingURL=role-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-prompts.d.ts","sourceRoot":"","sources":["../../src/controller/role-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAY7D,eAAO,MAAM,gBAAgB,GAAI,MAAM,kBAAkB,KAAG,MAAmC,CAAA;AAE/F,eAAO,MAAM,iBAAiB,GAAI,OAAO;IACvC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACtB,KAAG,MAwBA,CAAA"}
@@ -0,0 +1,35 @@
1
+ const ROLE_SYSTEM_PROMPTS = {
2
+ intake: "将用户需求整理成结构化 Requirement JSON;不要推进状态。",
3
+ planner: "根据 Requirement JSON 生成 TaskGraph JSON;只输出 JSON,不执行任务。",
4
+ worker: "完成指定 Task;严格遵守 allowedPaths;只输出 WorkerOutput JSON。",
5
+ verifier: "只依据任务与实际 evidence 判断;只输出 VerifierOutput JSON。",
6
+ acceptance: "检查需求、任务和 evidence 的闭环;只输出结构化验收结论。",
7
+ "failure-analyzer": "根据实际失败证据分类根因并给出结构化恢复建议。",
8
+ "repair-worker": "根据失败证据输出结构化修复建议;只建议,不直接推进状态。",
9
+ };
10
+ export const roleSystemPrompt = (role) => ROLE_SYSTEM_PROMPTS[role];
11
+ export const plannerTaskPrompt = (input) => JSON.stringify({
12
+ requirement: input.requirement,
13
+ runId: input.runId,
14
+ outputContract: {
15
+ schemaVersion: "1.0.0",
16
+ type: "TaskGraph",
17
+ required: ["schemaVersion", "graphId", "runId", "version", "tasks", "edges"],
18
+ taskRequired: [
19
+ "schemaVersion",
20
+ "taskId",
21
+ "runId",
22
+ "requirementIds",
23
+ "title",
24
+ "summary",
25
+ "status",
26
+ "allowedPaths",
27
+ "verificationPlan",
28
+ "retryBudget",
29
+ "dependencies",
30
+ "evidenceRefs",
31
+ "assignedAgentRole",
32
+ ],
33
+ },
34
+ });
35
+ //# sourceMappingURL=role-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-prompts.js","sourceRoot":"","sources":["../../src/controller/role-prompts.ts"],"names":[],"mappings":"AAGA,MAAM,mBAAmB,GAAG;IAC1B,MAAM,EAAE,sCAAsC;IAC9C,OAAO,EAAE,uDAAuD;IAChE,MAAM,EAAE,oDAAoD;IAC5D,QAAQ,EAAE,+CAA+C;IACzD,UAAU,EAAE,mCAAmC;IAC/C,kBAAkB,EAAE,yBAAyB;IAC7C,eAAe,EAAE,8BAA8B;CACM,CAAA;AAEvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAwB,EAAU,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;AAE/F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAGjC,EAAU,EAAE,CACX,IAAI,CAAC,SAAS,CAAC;IACb,WAAW,EAAE,KAAK,CAAC,WAAW;IAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,cAAc,EAAE;QACd,aAAa,EAAE,OAAO;QACtB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,CAAC,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;QAC5E,YAAY,EAAE;YACZ,eAAe;YACf,QAAQ;YACR,OAAO;YACP,gBAAgB;YAChB,OAAO;YACP,SAAS;YACT,QAAQ;YACR,cAAc;YACd,kBAAkB;YAClB,aAAa;YACb,cAAc;YACd,cAAc;YACd,mBAAmB;SACpB;KACF;CACF,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { CreateRunControllerOptions, RunController } from "./contracts.js";
2
+ export declare const createRunController: (options: CreateRunControllerOptions) => RunController;
3
+ //# sourceMappingURL=run-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-controller.d.ts","sourceRoot":"","sources":["../../src/controller/run-controller.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAmC/E,eAAO,MAAM,mBAAmB,GAAI,SAAS,0BAA0B,KAAG,aAsVzE,CAAA"}