@tea-agent/loop-agent 0.1.0-fe-test.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 (1050) hide show
  1. package/AGENTS.md +114 -0
  2. package/CHANGELOG.md +2283 -0
  3. package/README.md +177 -0
  4. package/bin/agent-worker.js +22 -0
  5. package/bin/loop-agent.js +57 -0
  6. package/dist/adapters/aimax.js +91 -0
  7. package/dist/adapters/context.js +32 -0
  8. package/dist/adapters/index.js +29 -0
  9. package/dist/adapters/loop-agent.js +192 -0
  10. package/dist/adapters/types.js +1 -0
  11. package/dist/application/context-usage/skill-resolution-stats.js +263 -0
  12. package/dist/application/dag/args.js +486 -0
  13. package/dist/application/dag/generate-task-dag.js +408 -0
  14. package/dist/application/dag/report-dag.js +14 -0
  15. package/dist/application/dag/run-dag.js +109 -0
  16. package/dist/application/dag/validate-dag.js +166 -0
  17. package/dist/application/evaluation/alias.js +184 -0
  18. package/dist/application/evaluation/budget.js +192 -0
  19. package/dist/application/evaluation/campaign-hash.js +47 -0
  20. package/dist/application/evaluation/campaign-matrix.js +372 -0
  21. package/dist/application/evaluation/campaign-scorecard.js +135 -0
  22. package/dist/application/evaluation/campaign.js +370 -0
  23. package/dist/application/evaluation/candidate-hash.js +75 -0
  24. package/dist/application/evaluation/candidate.js +69 -0
  25. package/dist/application/evaluation/corpus-hash.js +38 -0
  26. package/dist/application/evaluation/corpus.js +56 -0
  27. package/dist/application/evaluation/experiment.js +294 -0
  28. package/dist/application/evaluation/ignition.js +198 -0
  29. package/dist/application/evaluation/integrity-audit.js +162 -0
  30. package/dist/application/evaluation/outer-loop.js +132 -0
  31. package/dist/application/evaluation/pi-cell-executor.js +39 -0
  32. package/dist/application/evaluation/private-verifier.js +46 -0
  33. package/dist/application/evaluation/promotion-policy.js +151 -0
  34. package/dist/application/evaluation/proposer.js +98 -0
  35. package/dist/application/evaluation/replay.js +289 -0
  36. package/dist/application/evaluation/types.js +652 -0
  37. package/dist/application/loop/run-action.js +19 -0
  38. package/dist/application/task-lifecycle/advance.js +1204 -0
  39. package/dist/application/task-lifecycle/gates.js +130 -0
  40. package/dist/application/task-lifecycle/index.js +7 -0
  41. package/dist/application/task-lifecycle/observe.js +424 -0
  42. package/dist/application/task-lifecycle/plan-transitions.js +251 -0
  43. package/dist/application/task-lifecycle/recommendations.js +180 -0
  44. package/dist/application/task-lifecycle/record.js +73 -0
  45. package/dist/application/task-lifecycle/types.js +1 -0
  46. package/dist/build-stamp.json +6 -0
  47. package/dist/cli/catalog.js +24 -0
  48. package/dist/cli/command-definitions.js +659 -0
  49. package/dist/cli/help.js +56 -0
  50. package/dist/cli/index.js +5 -0
  51. package/dist/cli/program.js +647 -0
  52. package/dist/cli/router.js +13 -0
  53. package/dist/cli/update/init-surface-notifier.js +167 -0
  54. package/dist/cli/update/notifier.js +117 -0
  55. package/dist/cli/update/npm-client.js +151 -0
  56. package/dist/cli/update/policy.js +92 -0
  57. package/dist/cli/update/runtime-activity.js +29 -0
  58. package/dist/cli/update/state.js +68 -0
  59. package/dist/cli-governance/active-residue-check.js +38 -0
  60. package/dist/cli.js +57 -0
  61. package/dist/commands/client-recovery.js +1373 -0
  62. package/dist/commands/closeout.js +13 -0
  63. package/dist/commands/coverage-audit.js +14 -0
  64. package/dist/commands/coverage-report.js +50 -0
  65. package/dist/commands/cursor-prompt.js +182 -0
  66. package/dist/commands/dag-approve.js +142 -0
  67. package/dist/commands/dag-final-verification.js +76 -0
  68. package/dist/commands/dag-init-hybrid.js +57 -0
  69. package/dist/commands/dag-reconcile-run.js +5 -0
  70. package/dist/commands/dag-reconcile-tasks.js +51 -0
  71. package/dist/commands/dag-reject.js +91 -0
  72. package/dist/commands/dag-report.js +76 -0
  73. package/dist/commands/dag-request-interrupt.js +20 -0
  74. package/dist/commands/dag-rerun-task.js +19 -0
  75. package/dist/commands/dag-rerun.js +111 -0
  76. package/dist/commands/dag-resume.js +35 -0
  77. package/dist/commands/dag-run-task.js +12 -0
  78. package/dist/commands/dag-validate.js +20 -0
  79. package/dist/commands/dag-workflow-compile.js +91 -0
  80. package/dist/commands/dag-workflow-plan.js +130 -0
  81. package/dist/commands/dag-workflow-validate.js +66 -0
  82. package/dist/commands/delegate.js +130 -0
  83. package/dist/commands/docs-archive.js +5 -0
  84. package/dist/commands/docs-audit.js +6 -0
  85. package/dist/commands/doctor.js +283 -0
  86. package/dist/commands/eval.js +1398 -0
  87. package/dist/commands/examples.js +90 -0
  88. package/dist/commands/goal.js +92 -0
  89. package/dist/commands/handoff-check.js +5 -0
  90. package/dist/commands/harvest.js +44 -0
  91. package/dist/commands/import-prd.js +81 -0
  92. package/dist/commands/init-upgrade.js +3085 -0
  93. package/dist/commands/init.js +3630 -0
  94. package/dist/commands/inspect.js +11 -0
  95. package/dist/commands/instructions.js +223 -0
  96. package/dist/commands/knowledge.js +162 -0
  97. package/dist/commands/loop-benchmark.js +72 -0
  98. package/dist/commands/loop.js +251 -0
  99. package/dist/commands/new-task.js +5 -0
  100. package/dist/commands/operator.js +44 -0
  101. package/dist/commands/pi-prompt.js +174 -0
  102. package/dist/commands/pi-reuse-benchmark.js +153 -0
  103. package/dist/commands/plan-list.js +5 -0
  104. package/dist/commands/plan.js +50 -0
  105. package/dist/commands/promote-run.js +29 -0
  106. package/dist/commands/reference-index.js +16 -0
  107. package/dist/commands/run-dag-progress.js +123 -0
  108. package/dist/commands/run-dag.js +22 -0
  109. package/dist/commands/spine.js +38 -0
  110. package/dist/commands/stats.js +113 -0
  111. package/dist/commands/status.js +57 -0
  112. package/dist/commands/study-init.js +192 -0
  113. package/dist/commands/task-advance.js +366 -0
  114. package/dist/commands/task-contract.js +269 -0
  115. package/dist/commands/task-source-prepare.js +479 -0
  116. package/dist/commands/task-status.js +133 -0
  117. package/dist/commands/workflow.js +259 -0
  118. package/dist/commands/worktree-create.js +31 -0
  119. package/dist/commands/worktree-list.js +5 -0
  120. package/dist/commands/worktree-remove.js +26 -0
  121. package/dist/executors/config-core.js +5 -0
  122. package/dist/executors/config.js +2 -0
  123. package/dist/executors/dag-pi-executor.js +1277 -0
  124. package/dist/executors/dag-static-executor.js +42 -0
  125. package/dist/executors/dag.js +3 -0
  126. package/dist/executors/index.js +6 -0
  127. package/dist/executors/model-routing.js +71 -0
  128. package/dist/executors/pi-defaults.js +9 -0
  129. package/dist/executors/pi-event-serializer.js +65 -0
  130. package/dist/executors/pi-executor.js +981 -0
  131. package/dist/executors/pi-playwright-cli-tool.js +1006 -0
  132. package/dist/executors/pi-prompt-transport.js +198 -0
  133. package/dist/executors/pi-reuse-benchmark.js +316 -0
  134. package/dist/executors/pi-runtime-reuse.js +29 -0
  135. package/dist/executors/pi-sdk-executor.js +722 -0
  136. package/dist/executors/pi-sdk.js +1 -0
  137. package/dist/executors/pi-writer-tool-policy.js +266 -0
  138. package/dist/executors/pi.js +3 -0
  139. package/dist/executors/playwright-cli-launcher.js +63 -0
  140. package/dist/executors/process-tree.js +33 -0
  141. package/dist/executors/shell-executor.js +3055 -0
  142. package/dist/executors/shell-presets.js +99 -0
  143. package/dist/executors/shell-verification.js +262 -0
  144. package/dist/executors/shell-write-guard.js +543 -0
  145. package/dist/executors/shell.js +3 -0
  146. package/dist/executors/static.js +1 -0
  147. package/dist/governance/checks.js +437 -0
  148. package/dist/governance/document-index-closure.js +164 -0
  149. package/dist/governance/exec-plans.js +549 -0
  150. package/dist/governance/harness.js +9 -0
  151. package/dist/governance/index.js +3 -0
  152. package/dist/governance/manifest-types.js +254 -0
  153. package/dist/governance/manifest.js +2 -0
  154. package/dist/governance/path-guard.js +69 -0
  155. package/dist/governance/path-guards.js +2 -0
  156. package/dist/governance/profiles.js +3 -0
  157. package/dist/governance/requirement-coverage.js +425 -0
  158. package/dist/governance/skill-safety.js +135 -0
  159. package/dist/governance/spine-audit.js +155 -0
  160. package/dist/infrastructure/evaluation/alias-store.js +199 -0
  161. package/dist/infrastructure/evaluation/campaign-store.js +154 -0
  162. package/dist/infrastructure/evaluation/candidate-store.js +439 -0
  163. package/dist/infrastructure/evaluation/corpus-store.js +181 -0
  164. package/dist/infrastructure/evaluation/experiment-store.js +124 -0
  165. package/dist/infrastructure/evaluation/ignition-store.js +82 -0
  166. package/dist/infrastructure/evaluation/private-verifier-store.js +145 -0
  167. package/dist/infrastructure/evaluation/proposer-store.js +78 -0
  168. package/dist/infrastructure/evaluation/store.js +40 -0
  169. package/dist/infrastructure/harness/active-residue-policy.js +73 -0
  170. package/dist/infrastructure/harness/artifact-store.js +72 -0
  171. package/dist/infrastructure/harness/atomic-write.js +50 -0
  172. package/dist/infrastructure/harness/completed-facts-guard.js +40 -0
  173. package/dist/infrastructure/harness/loop-action-store.js +20 -0
  174. package/dist/infrastructure/harness/loop-store.js +41 -0
  175. package/dist/infrastructure/harness/one-shot-run-store.js +94 -0
  176. package/dist/infrastructure/harness/task-store.js +108 -0
  177. package/dist/records/closeout.js +2 -0
  178. package/dist/records/harvest.js +215 -0
  179. package/dist/records/index.js +3 -0
  180. package/dist/records/one-shot-runs.js +386 -0
  181. package/dist/records/promotion.js +200 -0
  182. package/dist/shared/artifacts-core.js +107 -0
  183. package/dist/shared/artifacts.js +2 -0
  184. package/dist/shared/context-files.js +32 -0
  185. package/dist/shared/context.js +2 -0
  186. package/dist/shared/copy-dir.js +17 -0
  187. package/dist/shared/git-progress.js +172 -0
  188. package/dist/shared/index.js +5 -0
  189. package/dist/shared/logger.js +17 -0
  190. package/dist/shared/one-shot-prompt-args.js +98 -0
  191. package/dist/shared/openspec-spec.js +125 -0
  192. package/dist/shared/operator/capabilities.js +2659 -0
  193. package/dist/shared/operator/command-lifecycle.js +94 -0
  194. package/dist/shared/operator/envelope.js +59 -0
  195. package/dist/shared/operator/index.js +5 -0
  196. package/dist/shared/operator/registry.js +38 -0
  197. package/dist/shared/operator/types.js +5 -0
  198. package/dist/shared/output-truncation.js +37 -0
  199. package/dist/shared/package-metadata.js +530 -0
  200. package/dist/shared/path-refs.js +31 -0
  201. package/dist/shared/pi-retry-settings.js +23 -0
  202. package/dist/shared/playwright-cli-command-policy.js +41 -0
  203. package/dist/shared/preview.js +39 -0
  204. package/dist/shared/prompts.js +26 -0
  205. package/dist/shared/reference-context.js +264 -0
  206. package/dist/shared/resilient-git.js +133 -0
  207. package/dist/shared/runtime-activity.js +6 -0
  208. package/dist/shared/timeout-policy.js +24 -0
  209. package/dist/shared/timeout.js +1 -0
  210. package/dist/shared/types.js +5 -0
  211. package/dist/sidecars/cursor-prompt/executor.js +428 -0
  212. package/dist/sidecars/cursor-prompt/index.js +3 -0
  213. package/dist/sidecars/cursor-prompt/stream.js +121 -0
  214. package/dist/task/config-types.js +235 -0
  215. package/dist/task/config.js +2 -0
  216. package/dist/task/contract/adopt.js +166 -0
  217. package/dist/task/contract/apply.js +326 -0
  218. package/dist/task/contract/canonicalize.js +60 -0
  219. package/dist/task/contract/constants.js +30 -0
  220. package/dist/task/contract/diff.js +177 -0
  221. package/dist/task/contract/hash.js +42 -0
  222. package/dist/task/contract/import-revision.js +96 -0
  223. package/dist/task/contract/index.js +17 -0
  224. package/dist/task/contract/journal.js +155 -0
  225. package/dist/task/contract/lock.js +153 -0
  226. package/dist/task/contract/observe.js +296 -0
  227. package/dist/task/contract/paths.js +19 -0
  228. package/dist/task/contract/project.js +185 -0
  229. package/dist/task/contract/recover.js +312 -0
  230. package/dist/task/contract/request-ledger.js +37 -0
  231. package/dist/task/contract/schema.js +153 -0
  232. package/dist/task/contract/transaction.js +160 -0
  233. package/dist/task/contract/types.js +1 -0
  234. package/dist/task/contract/validate-draft.js +106 -0
  235. package/dist/task/dag-source-paths.js +50 -0
  236. package/dist/task/delegate.js +208 -0
  237. package/dist/task/frontend-preflight.js +131 -0
  238. package/dist/task/frontend-project-capability.js +570 -0
  239. package/dist/task/goal-audit.js +51 -0
  240. package/dist/task/goal-policy.js +8 -0
  241. package/dist/task/goal.js +3 -0
  242. package/dist/task/ids.js +1 -0
  243. package/dist/task/index.js +12 -0
  244. package/dist/task/lifecycle.js +1 -0
  245. package/dist/task/operator/capabilities.js +6 -0
  246. package/dist/task/operator/envelope.js +2 -0
  247. package/dist/task/operator/index.js +5 -0
  248. package/dist/task/operator/registry.js +2 -0
  249. package/dist/task/operator/types.js +1 -0
  250. package/dist/task/paths.js +1 -0
  251. package/dist/task/read-model.js +140 -0
  252. package/dist/task/runtime.js +708 -0
  253. package/dist/task/source-prepare/artifact-meta.js +137 -0
  254. package/dist/task/source-prepare/build-draft.js +232 -0
  255. package/dist/task/source-prepare/completeness.js +248 -0
  256. package/dist/task/source-prepare/index.js +10 -0
  257. package/dist/task/source-prepare/parse-intent.js +496 -0
  258. package/dist/task/source-prepare/path-policy.js +197 -0
  259. package/dist/task/source-prepare/placeholder-paths.js +77 -0
  260. package/dist/task/source-prepare/prepare.js +920 -0
  261. package/dist/task/source-prepare/reference-integrity.js +290 -0
  262. package/dist/task/source-prepare/semantic-intake.js +717 -0
  263. package/dist/task/source-prepare/types.js +7 -0
  264. package/dist/task/source-references.js +228 -0
  265. package/dist/task/source-state.js +1 -0
  266. package/dist/task/state.js +41 -0
  267. package/dist/task/subagent-guidance.js +1 -0
  268. package/dist/task/task-demand-routing.js +443 -0
  269. package/dist/task/workflow-state-types.js +92 -0
  270. package/dist/task/worktree-cleanup.js +140 -0
  271. package/dist/task/worktree.js +388 -0
  272. package/dist/verification/maven/cache.js +142 -0
  273. package/dist/verification/maven/index.js +120 -0
  274. package/dist/verification/maven/plan-commands.js +421 -0
  275. package/dist/verification/maven/pom-static.js +136 -0
  276. package/dist/verification/maven/scope-resolve.js +153 -0
  277. package/dist/verification/maven/stale.js +130 -0
  278. package/dist/verification/maven/types.js +23 -0
  279. package/dist/verification/maven/workspace-graph.js +322 -0
  280. package/dist/worker/cli.js +957 -0
  281. package/dist/worker/closeout/apply.js +73 -0
  282. package/dist/worker/closeout/preview.js +30 -0
  283. package/dist/worker/console/app-data.js +316 -0
  284. package/dist/worker/console/chat/artifact-card.js +30 -0
  285. package/dist/worker/console/chat/assistant-content.js +121 -0
  286. package/dist/worker/console/chat/chat-event-store.js +981 -0
  287. package/dist/worker/console/chat/chat-ui-policy.js +25 -0
  288. package/dist/worker/console/chat/compaction-errors.js +64 -0
  289. package/dist/worker/console/chat/composer-draft-store.js +45 -0
  290. package/dist/worker/console/chat/context-panel.js +54 -0
  291. package/dist/worker/console/chat/contract-apply-receipt-store.js +174 -0
  292. package/dist/worker/console/chat/explore-tools.js +299 -0
  293. package/dist/worker/console/chat/human-gate-card.js +45 -0
  294. package/dist/worker/console/chat/interview-adapter.js +149 -0
  295. package/dist/worker/console/chat/mcp-inventory.js +221 -0
  296. package/dist/worker/console/chat/model-resolver.js +215 -0
  297. package/dist/worker/console/chat/operation-card.js +92 -0
  298. package/dist/worker/console/chat/pi-console-config.js +376 -0
  299. package/dist/worker/console/chat/pi-runtime.js +2446 -0
  300. package/dist/worker/console/chat/repo-browser.js +140 -0
  301. package/dist/worker/console/chat/repo-walk.js +125 -0
  302. package/dist/worker/console/chat/resource-loader.js +59 -0
  303. package/dist/worker/console/chat/resource-preferences-store.js +152 -0
  304. package/dist/worker/console/chat/routes.js +3137 -0
  305. package/dist/worker/console/chat/runtime-context.js +102 -0
  306. package/dist/worker/console/chat/runtime-selection.js +96 -0
  307. package/dist/worker/console/chat/semantic-activity.js +489 -0
  308. package/dist/worker/console/chat/session-store.js +484 -0
  309. package/dist/worker/console/chat/shortcuts.js +217 -0
  310. package/dist/worker/console/chat/tool-adapter.js +131 -0
  311. package/dist/worker/console/chat/tool-preview.js +247 -0
  312. package/dist/worker/console/chat/tools.js +212 -0
  313. package/dist/worker/console/chat/turn-execution-registry.js +82 -0
  314. package/dist/worker/console/chat/turn-process.js +346 -0
  315. package/dist/worker/console/chat/usage.js +165 -0
  316. package/dist/worker/console/chat/workspace-landing.js +103 -0
  317. package/dist/worker/console/dag-confirmation.js +347 -0
  318. package/dist/worker/console/dag-execution-receipt.js +393 -0
  319. package/dist/worker/console/doctor.js +230 -0
  320. package/dist/worker/console/draft-store.js +158 -0
  321. package/dist/worker/console/harness-pi-model-matrix.js +137 -0
  322. package/dist/worker/console/human-gate-token.js +130 -0
  323. package/dist/worker/console/index.js +17 -0
  324. package/dist/worker/console/inspect-split.js +82 -0
  325. package/dist/worker/console/interview/assessment.js +67 -0
  326. package/dist/worker/console/interview/grill-me.js +277 -0
  327. package/dist/worker/console/interview/session.js +100 -0
  328. package/dist/worker/console/interview/tools.js +109 -0
  329. package/dist/worker/console/loopback.js +16 -0
  330. package/dist/worker/console/mutation-gate-receipt-store.js +184 -0
  331. package/dist/worker/console/night-aux-ticker.js +146 -0
  332. package/dist/worker/console/observe-health-match.js +179 -0
  333. package/dist/worker/console/observe-link.js +42 -0
  334. package/dist/worker/console/open-browser.js +134 -0
  335. package/dist/worker/console/operation-run-facts.js +190 -0
  336. package/dist/worker/console/operation-runner.js +353 -0
  337. package/dist/worker/console/operation-sse.js +184 -0
  338. package/dist/worker/console/operation-store.js +169 -0
  339. package/dist/worker/console/operation-wait.js +355 -0
  340. package/dist/worker/console/operator-actions.js +3768 -0
  341. package/dist/worker/console/operator-selection.js +105 -0
  342. package/dist/worker/console/operator-surface-health.js +24 -0
  343. package/dist/worker/console/operator-user-error.js +45 -0
  344. package/dist/worker/console/pi-readiness.js +288 -0
  345. package/dist/worker/console/prd-identity.js +102 -0
  346. package/dist/worker/console/prd-intake-bridge.js +441 -0
  347. package/dist/worker/console/prd-reference-discovery.js +124 -0
  348. package/dist/worker/console/recovery-cta.js +320 -0
  349. package/dist/worker/console/recovery-error-copy.js +198 -0
  350. package/dist/worker/console/recovery-selection.js +107 -0
  351. package/dist/worker/console/repo-fingerprint.js +35 -0
  352. package/dist/worker/console/resolve-dag-run-for-task.js +115 -0
  353. package/dist/worker/console/resource-loader.js +95 -0
  354. package/dist/worker/console/routes.js +475 -0
  355. package/dist/worker/console/security.js +170 -0
  356. package/dist/worker/console/server.js +357 -0
  357. package/dist/worker/console/sibling-controller.js +33 -0
  358. package/dist/worker/console/static/assets/abnfDiagram-N423BO3Z-BmOEx0gA.js +1 -0
  359. package/dist/worker/console/static/assets/arc-BGiVVe8b.js +1 -0
  360. package/dist/worker/console/static/assets/architectureDiagram-T3A2C74G-nDdu4rgJ.js +36 -0
  361. package/dist/worker/console/static/assets/blockDiagram-VBNYF7ZC-Bb5u0BWf.js +132 -0
  362. package/dist/worker/console/static/assets/c4Diagram-5PPSVZJV-BlhC0j94.js +10 -0
  363. package/dist/worker/console/static/assets/channel-Tl-FkUqr.js +1 -0
  364. package/dist/worker/console/static/assets/chunk-2GRJ4B5K-Ai8_qQXI.js +1 -0
  365. package/dist/worker/console/static/assets/chunk-2Q5K7J3B-B9gyCjqX.js +1 -0
  366. package/dist/worker/console/static/assets/chunk-5RXB4S5H-Bzbj3zGH.js +231 -0
  367. package/dist/worker/console/static/assets/chunk-5VM5RSS4-BT415PvT.js +15 -0
  368. package/dist/worker/console/static/assets/chunk-6Q2QTUOP-D_A5_5QL.js +88 -0
  369. package/dist/worker/console/static/assets/chunk-GF5L2VYU-srJkaP3f.js +206 -0
  370. package/dist/worker/console/static/assets/chunk-JWPE2WC7-UYGvEP4l.js +1 -0
  371. package/dist/worker/console/static/assets/chunk-KBJHAD2P-B8luBrrz.js +1 -0
  372. package/dist/worker/console/static/assets/chunk-RYQCIY6F-DN7wXZSq.js +1 -0
  373. package/dist/worker/console/static/assets/chunk-XXDRQBXY-DXKyMuKS.js +1 -0
  374. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BaehtRk4.js +1 -0
  375. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BaehtRk4.js +1 -0
  376. package/dist/worker/console/static/assets/cose-bilkent-JH36ORCC-dqvoynXj.js +1 -0
  377. package/dist/worker/console/static/assets/cynefin-VYW2F7L2--PcyL34A.js +166 -0
  378. package/dist/worker/console/static/assets/cynefinDiagram-MW4NZA55-DvWs_hTY.js +62 -0
  379. package/dist/worker/console/static/assets/cytoscape.esm-yzknjiTM.js +321 -0
  380. package/dist/worker/console/static/assets/dagre-VZM6K2ZE-DxeIxbyO.js +4 -0
  381. package/dist/worker/console/static/assets/defaultLocale-DX6XiGOO.js +1 -0
  382. package/dist/worker/console/static/assets/diagram-7IWD3JNH-DPCG61Of.js +30 -0
  383. package/dist/worker/console/static/assets/diagram-B4RE2ZJO-CmuU50-U.js +3 -0
  384. package/dist/worker/console/static/assets/diagram-LBJQPF4R-B61XLD_v.js +24 -0
  385. package/dist/worker/console/static/assets/diagram-Q27KOJAE-BB7HTRRY.js +24 -0
  386. package/dist/worker/console/static/assets/diagram-UB23O5K3-DvkboAIp.js +41 -0
  387. package/dist/worker/console/static/assets/ebnfDiagram-BXEA7PRR-BdJ_y1fL.js +1 -0
  388. package/dist/worker/console/static/assets/erDiagram-JOGREHBK-9bUBZTRi.js +85 -0
  389. package/dist/worker/console/static/assets/flowDiagram-UKHOOZJN-Dw4L4RBa.js +156 -0
  390. package/dist/worker/console/static/assets/ganttDiagram-PKOTCBZU-Jr82N_QP.js +292 -0
  391. package/dist/worker/console/static/assets/gitGraphDiagram-DS77QQ5N-DAz9wFLr.js +106 -0
  392. package/dist/worker/console/static/assets/graph-DOmOIIwC.js +1 -0
  393. package/dist/worker/console/static/assets/index-B7Y-0g3J.css +1 -0
  394. package/dist/worker/console/static/assets/index-DkCrqaYg.js +325 -0
  395. package/dist/worker/console/static/assets/infoDiagram-6WML65LV-CBB5Np7y.js +2 -0
  396. package/dist/worker/console/static/assets/init-Gi6I4Gst.js +1 -0
  397. package/dist/worker/console/static/assets/ishikawaDiagram-WSZJBQD7-D8IOp94y.js +70 -0
  398. package/dist/worker/console/static/assets/journeyDiagram-NVQOT4AX-Dgd3AHGG.js +139 -0
  399. package/dist/worker/console/static/assets/kanban-definition-27J2QSJJ-BmYOxLE9.js +89 -0
  400. package/dist/worker/console/static/assets/layout-D-LzfAck.js +1 -0
  401. package/dist/worker/console/static/assets/linear-DfYTEF6J.js +1 -0
  402. package/dist/worker/console/static/assets/map-DxJ2ADlA.js +1 -0
  403. package/dist/worker/console/static/assets/mermaid.core-BjuFPRqa.js +308 -0
  404. package/dist/worker/console/static/assets/mindmap-definition-FAOFIHXS-CLyUViGd.js +96 -0
  405. package/dist/worker/console/static/assets/ordinal-Cboi1Yqb.js +1 -0
  406. package/dist/worker/console/static/assets/pegDiagram-VL7TDLO6-BvX2Di4-.js +1 -0
  407. package/dist/worker/console/static/assets/pieDiagram-7S7Q4E2Y-BFj0_OLv.js +39 -0
  408. package/dist/worker/console/static/assets/quadrantDiagram-CIZ2JOQS-BIUrD_hx.js +7 -0
  409. package/dist/worker/console/static/assets/railroadDiagram-AXF67PYL-CHBB48fj.js +1 -0
  410. package/dist/worker/console/static/assets/requirementDiagram-LRYGKXZP-sJrYw2Sf.js +84 -0
  411. package/dist/worker/console/static/assets/sankeyDiagram-W5VNT64P-BzHH6fPR.js +40 -0
  412. package/dist/worker/console/static/assets/sequenceDiagram-SI44F4Z6-7QCnelCt.js +162 -0
  413. package/dist/worker/console/static/assets/sizeCapture-X5ZJPWSS-sDYSxn72.js +1 -0
  414. package/dist/worker/console/static/assets/stateDiagram-OKZ733FA-XpiUdwzm.js +1 -0
  415. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-eEhq2A8Y.js +1 -0
  416. package/dist/worker/console/static/assets/swimlanes-SLNWSIFB-DvqgNPzD.js +2 -0
  417. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-la8AC7fo.js +8 -0
  418. package/dist/worker/console/static/assets/timeline-definition-Z64GVDOM-2TyOYNx0.js +120 -0
  419. package/dist/worker/console/static/assets/vennDiagram-T6HMQDX7-B-nM6wM2.js +34 -0
  420. package/dist/worker/console/static/assets/wardleyDiagram-T6FBY63Y-B86wPdbr.js +78 -0
  421. package/dist/worker/console/static/assets/xychartDiagram-ELKLHX3M-Dr1C4AQz.js +7 -0
  422. package/dist/worker/console/static/favicon.svg +37 -0
  423. package/dist/worker/console/static/fonts/katex/KaTeX_AMS-Regular.woff2 +0 -0
  424. package/dist/worker/console/static/fonts/katex/KaTeX_Caligraphic-Bold.woff2 +0 -0
  425. package/dist/worker/console/static/fonts/katex/KaTeX_Caligraphic-Regular.woff2 +0 -0
  426. package/dist/worker/console/static/fonts/katex/KaTeX_Fraktur-Bold.woff2 +0 -0
  427. package/dist/worker/console/static/fonts/katex/KaTeX_Fraktur-Regular.woff2 +0 -0
  428. package/dist/worker/console/static/fonts/katex/KaTeX_Main-Bold.woff2 +0 -0
  429. package/dist/worker/console/static/fonts/katex/KaTeX_Main-BoldItalic.woff2 +0 -0
  430. package/dist/worker/console/static/fonts/katex/KaTeX_Main-Italic.woff2 +0 -0
  431. package/dist/worker/console/static/fonts/katex/KaTeX_Main-Regular.woff2 +0 -0
  432. package/dist/worker/console/static/fonts/katex/KaTeX_Math-BoldItalic.woff2 +0 -0
  433. package/dist/worker/console/static/fonts/katex/KaTeX_Math-Italic.woff2 +0 -0
  434. package/dist/worker/console/static/fonts/katex/KaTeX_SansSerif-Bold.woff2 +0 -0
  435. package/dist/worker/console/static/fonts/katex/KaTeX_SansSerif-Italic.woff2 +0 -0
  436. package/dist/worker/console/static/fonts/katex/KaTeX_SansSerif-Regular.woff2 +0 -0
  437. package/dist/worker/console/static/fonts/katex/KaTeX_Script-Regular.woff2 +0 -0
  438. package/dist/worker/console/static/fonts/katex/KaTeX_Size1-Regular.woff2 +0 -0
  439. package/dist/worker/console/static/fonts/katex/KaTeX_Size2-Regular.woff2 +0 -0
  440. package/dist/worker/console/static/fonts/katex/KaTeX_Size3-Regular.woff2 +0 -0
  441. package/dist/worker/console/static/fonts/katex/KaTeX_Size4-Regular.woff2 +0 -0
  442. package/dist/worker/console/static/fonts/katex/KaTeX_Typewriter-Regular.woff2 +0 -0
  443. package/dist/worker/console/static/index.html +15 -0
  444. package/dist/worker/console/static-src/app/console-types.js +184 -0
  445. package/dist/worker/console/static-src/app/useConsoleShell.js +101 -0
  446. package/dist/worker/console/static-src/app/useOperatorActions.js +324 -0
  447. package/dist/worker/console/static-src/app/usePrdImport.js +172 -0
  448. package/dist/worker/console/static-src/app/useRecoveryActions.js +289 -0
  449. package/dist/worker/console/static-src/app/useRecoveryConsole.js +425 -0
  450. package/dist/worker/console/static-src/app/useTaskWizard.js +296 -0
  451. package/dist/worker/console/static-src/chat-markdown-security.js +38 -0
  452. package/dist/worker/console/static-src/chat-view-types.js +2 -0
  453. package/dist/worker/console/static-src/night/night-types.js +24 -0
  454. package/dist/worker/console/static-src/night/useNightBoard.js +94 -0
  455. package/dist/worker/console/static-src/night/useNightWizard.js +171 -0
  456. package/dist/worker/console/static-src/night-prepare-result.js +118 -0
  457. package/dist/worker/console/static-src/operator-chat/activity-journey.js +125 -0
  458. package/dist/worker/console/static-src/operator-chat/activity-rail-presentation.js +73 -0
  459. package/dist/worker/console/static-src/operator-chat/activity-references.js +20 -0
  460. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +420 -0
  461. package/dist/worker/console/static-src/operator-chat/format.js +71 -0
  462. package/dist/worker/console/static-src/operator-chat/landing-density.js +23 -0
  463. package/dist/worker/console/static-src/operator-chat/mutation-gate.js +45 -0
  464. package/dist/worker/console/static-src/operator-chat/refs.js +86 -0
  465. package/dist/worker/console/static-src/operator-chat/resource-auto-invocation.js +91 -0
  466. package/dist/worker/console/static-src/operator-chat/resource-diagnostics.js +204 -0
  467. package/dist/worker/console/static-src/operator-chat/runtime-snapshot-store.js +257 -0
  468. package/dist/worker/console/static-src/operator-chat/session-title-watcher.js +128 -0
  469. package/dist/worker/console/static-src/operator-chat/sidebar-split.js +90 -0
  470. package/dist/worker/console/static-src/operator-chat/slash-palette-layout.js +24 -0
  471. package/dist/worker/console/static-src/operator-chat/slash-palette-nav.js +141 -0
  472. package/dist/worker/console/static-src/operator-chat/spatial-overlay.js +38 -0
  473. package/dist/worker/console/static-src/operator-chat/tools-catalog.js +77 -0
  474. package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +690 -0
  475. package/dist/worker/console/static-src/operator-chat/turn-submission.js +158 -0
  476. package/dist/worker/console/static-src/operator-chat/types.js +1 -0
  477. package/dist/worker/console/static-src/operator-chat/useActivityRailTransition.js +59 -0
  478. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +495 -0
  479. package/dist/worker/console/static-src/operator-chat/useChatStream.js +780 -0
  480. package/dist/worker/console/static-src/operator-chat/useChatThread.js +280 -0
  481. package/dist/worker/console/static-src/operator-chat/useComposer.js +257 -0
  482. package/dist/worker/console/static-src/operator-chat/useInterview.js +108 -0
  483. package/dist/worker/console/static-src/operator-chat/useOverlayFocus.js +84 -0
  484. package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +148 -0
  485. package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +358 -0
  486. package/dist/worker/console/static-src/operator-chat/useRuntimeSnapshot.js +196 -0
  487. package/dist/worker/console/static-src/operator-chat/useWorkspaceLayout.js +58 -0
  488. package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +35 -0
  489. package/dist/worker/console/static-src/prd-file-import.js +218 -0
  490. package/dist/worker/console/vite.config.js +27 -0
  491. package/dist/worker/console/workflow-kinds.js +46 -0
  492. package/dist/worker/delivery/final-verification.js +302 -0
  493. package/dist/worker/delivery/git-transaction.js +497 -0
  494. package/dist/worker/delivery/package.js +537 -0
  495. package/dist/worker/delivery/verification-bundle.js +544 -0
  496. package/dist/worker/feature/acceptance-policy.js +227 -0
  497. package/dist/worker/feature/advance.js +301 -0
  498. package/dist/worker/feature/decision-loader.js +99 -0
  499. package/dist/worker/feature/discover.js +14 -0
  500. package/dist/worker/feature/doctor.js +223 -0
  501. package/dist/worker/feature/fullstack-validate.js +337 -0
  502. package/dist/worker/feature/next-action.js +140 -0
  503. package/dist/worker/feature/profile-schema.js +47 -0
  504. package/dist/worker/feature/ready-plan-projection.js +82 -0
  505. package/dist/worker/feature/reducer.js +137 -0
  506. package/dist/worker/feature/review.js +678 -0
  507. package/dist/worker/feature/run.js +390 -0
  508. package/dist/worker/feature/scaffold.js +812 -0
  509. package/dist/worker/feature/types.js +1 -0
  510. package/dist/worker/follow-up/approve.js +273 -0
  511. package/dist/worker/follow-up/factory.js +234 -0
  512. package/dist/worker/follow-up/paths.js +25 -0
  513. package/dist/worker/follow-up/policy.js +26 -0
  514. package/dist/worker/follow-up/schema.js +93 -0
  515. package/dist/worker/follow-up/store.js +96 -0
  516. package/dist/worker/loop-agent/command-result.js +1 -0
  517. package/dist/worker/loop-agent/controller-protocol.js +143 -0
  518. package/dist/worker/loop-agent/loop-agent-client.js +489 -0
  519. package/dist/worker/loop-agent/parse-json.js +14 -0
  520. package/dist/worker/materialize/harness-task-lifecycle-probe.js +126 -0
  521. package/dist/worker/materialize/harness-task-lineage.js +220 -0
  522. package/dist/worker/materialize/harness-task-materializer.js +648 -0
  523. package/dist/worker/metrics/projector.js +139 -0
  524. package/dist/worker/observability/dag-execution-trajectory.js +591 -0
  525. package/dist/worker/observability/event-history.js +216 -0
  526. package/dist/worker/observability/event-store.js +83 -0
  527. package/dist/worker/observability/events.js +79 -0
  528. package/dist/worker/observability/interrupt-eligibility.js +264 -0
  529. package/dist/worker/observability/progress-composite.js +34 -0
  530. package/dist/worker/observability/read-model.js +2499 -0
  531. package/dist/worker/observability/snapshot-store.js +43 -0
  532. package/dist/worker/observability/types.js +1 -0
  533. package/dist/worker/observe/dag-node-execution-output.js +180 -0
  534. package/dist/worker/observe/dag-run-artifacts.js +90 -0
  535. package/dist/worker/observe/health.js +58 -0
  536. package/dist/worker/observe/night-jobs.js +104 -0
  537. package/dist/worker/observe/node-input.js +441 -0
  538. package/dist/worker/observe/paths.js +174 -0
  539. package/dist/worker/observe/routes.js +1077 -0
  540. package/dist/worker/observe/server.js +117 -0
  541. package/dist/worker/observe/spec-evidence.js +398 -0
  542. package/dist/worker/observe/static/api.js +117 -0
  543. package/dist/worker/observe/static/app.js +169 -0
  544. package/dist/worker/observe/static/constants.js +182 -0
  545. package/dist/worker/observe/static/copy.js +67 -0
  546. package/dist/worker/observe/static/custom-select.js +567 -0
  547. package/dist/worker/observe/static/dag-edge-routing.js +368 -0
  548. package/dist/worker/observe/static/dag-helpers.js +161 -0
  549. package/dist/worker/observe/static/dag-history-labels.js +95 -0
  550. package/dist/worker/observe/static/dag-layout.d.ts +36 -0
  551. package/dist/worker/observe/static/dag-layout.js +163 -0
  552. package/dist/worker/observe/static/dag-model.js +145 -0
  553. package/dist/worker/observe/static/dom.js +220 -0
  554. package/dist/worker/observe/static/favicon.svg +37 -0
  555. package/dist/worker/observe/static/format-pool.d.ts +71 -0
  556. package/dist/worker/observe/static/format-pool.js +153 -0
  557. package/dist/worker/observe/static/format.js +347 -0
  558. package/dist/worker/observe/static/index.html +409 -0
  559. package/dist/worker/observe/static/kpi.js +78 -0
  560. package/dist/worker/observe/static/markdown-render.js +124 -0
  561. package/dist/worker/observe/static/operator-chrome.css +517 -0
  562. package/dist/worker/observe/static/operator-chrome.d.ts +83 -0
  563. package/dist/worker/observe/static/operator-chrome.js +623 -0
  564. package/dist/worker/observe/static/relations.js +133 -0
  565. package/dist/worker/observe/static/router.js +156 -0
  566. package/dist/worker/observe/static/run-processing.js +148 -0
  567. package/dist/worker/observe/static/shell-chrome.js +65 -0
  568. package/dist/worker/observe/static/state.js +496 -0
  569. package/dist/worker/observe/static/styles.css +3567 -0
  570. package/dist/worker/observe/static/views/batch.js +227 -0
  571. package/dist/worker/observe/static/views/dag-graph.js +508 -0
  572. package/dist/worker/observe/static/views/dag-inspector.js +1722 -0
  573. package/dist/worker/observe/static/views/dag-trajectory.js +313 -0
  574. package/dist/worker/observe/static/views/dag.js +483 -0
  575. package/dist/worker/observe/static/views/dags.js +877 -0
  576. package/dist/worker/observe/static/views/dashboard.js +747 -0
  577. package/dist/worker/observe/static/views/failures.js +143 -0
  578. package/dist/worker/observe/static/views/feature.js +492 -0
  579. package/dist/worker/observe/static/views/night.js +201 -0
  580. package/dist/worker/observe/static/views/pool.js +708 -0
  581. package/dist/worker/observe/static/views/run.js +453 -0
  582. package/dist/worker/observe/static/views/session-timeline.js +771 -0
  583. package/dist/worker/observe/static/views/shell.js +7 -0
  584. package/dist/worker/observe/static/views/task.js +315 -0
  585. package/dist/worker/observe/static/views/timeline.js +163 -0
  586. package/dist/worker/outcomes/adapters.js +153 -0
  587. package/dist/worker/outcomes/declared-artifacts.js +103 -0
  588. package/dist/worker/outcomes/evidence-tokens.js +29 -0
  589. package/dist/worker/outcomes/gate.js +40 -0
  590. package/dist/worker/outcomes/projector.js +227 -0
  591. package/dist/worker/outcomes/registry.js +1 -0
  592. package/dist/worker/outcomes/store.js +131 -0
  593. package/dist/worker/outcomes/types.js +79 -0
  594. package/dist/worker/pool/attempt-identity.js +41 -0
  595. package/dist/worker/pool/attempt-lease.js +184 -0
  596. package/dist/worker/pool/attempt-transition.js +210 -0
  597. package/dist/worker/pool/begin-attempt-with-lease.js +26 -0
  598. package/dist/worker/pool/begin-attempt.js +35 -0
  599. package/dist/worker/pool/doctor.js +165 -0
  600. package/dist/worker/pool/failure-routing.js +182 -0
  601. package/dist/worker/pool/migrate-state.js +303 -0
  602. package/dist/worker/pool/reconcile.js +285 -0
  603. package/dist/worker/pool/recovery-decision.js +163 -0
  604. package/dist/worker/pool/run-owner-store.js +126 -0
  605. package/dist/worker/pool/run-store.js +360 -0
  606. package/dist/worker/pool/runtime-reconcile-inventory.js +127 -0
  607. package/dist/worker/pool/state-projection.js +57 -0
  608. package/dist/worker/pool/types.js +17 -0
  609. package/dist/worker/pool/validation.js +144 -0
  610. package/dist/worker/preflight.js +157 -0
  611. package/dist/worker/profile-mapping.js +76 -0
  612. package/dist/worker/progress-reporter.js +63 -0
  613. package/dist/worker/report/morning-report.js +155 -0
  614. package/dist/worker/repos/repo-resolver.js +23 -0
  615. package/dist/worker/run-task/execute-prepared-task.js +178 -0
  616. package/dist/worker/run-task/run-task.js +912 -0
  617. package/dist/worker/runner/run-ready.js +561 -0
  618. package/dist/worker/runner/single-task-attempt.js +176 -0
  619. package/dist/worker/scheduler/admission.js +547 -0
  620. package/dist/worker/scheduler/auto-followup.js +99 -0
  621. package/dist/worker/scheduler/cli.js +644 -0
  622. package/dist/worker/scheduler/clock-install/darwin-launchd.js +238 -0
  623. package/dist/worker/scheduler/clock-install/linux-systemd-user.js +224 -0
  624. package/dist/worker/scheduler/clock-install/types.js +1 -0
  625. package/dist/worker/scheduler/clock-install/win32-schtasks.js +227 -0
  626. package/dist/worker/scheduler/clock-install.js +284 -0
  627. package/dist/worker/scheduler/clock.js +420 -0
  628. package/dist/worker/scheduler/dispatcher.js +503 -0
  629. package/dist/worker/scheduler/doctor.js +431 -0
  630. package/dist/worker/scheduler/evidence.js +170 -0
  631. package/dist/worker/scheduler/git-base.js +90 -0
  632. package/dist/worker/scheduler/index.js +25 -0
  633. package/dist/worker/scheduler/lease.js +114 -0
  634. package/dist/worker/scheduler/lifecycle.js +348 -0
  635. package/dist/worker/scheduler/lock.js +80 -0
  636. package/dist/worker/scheduler/morning-window.js +191 -0
  637. package/dist/worker/scheduler/night-git-finalizer.js +114 -0
  638. package/dist/worker/scheduler/night-harvest.js +412 -0
  639. package/dist/worker/scheduler/paths.js +92 -0
  640. package/dist/worker/scheduler/prepared-attempt-recovery.js +471 -0
  641. package/dist/worker/scheduler/recovery.js +277 -0
  642. package/dist/worker/scheduler/reservation.js +146 -0
  643. package/dist/worker/scheduler/retry.js +199 -0
  644. package/dist/worker/scheduler/scheduler-loop.js +272 -0
  645. package/dist/worker/scheduler/store.js +275 -0
  646. package/dist/worker/scheduler/traceability.js +54 -0
  647. package/dist/worker/scheduler/trigger.js +258 -0
  648. package/dist/worker/scheduler/types.js +369 -0
  649. package/dist/worker/scheduler/workspace-adapter.js +128 -0
  650. package/dist/worker/task-graph/acceptance-schema.js +40 -0
  651. package/dist/worker/task-graph/ready-planner.js +267 -0
  652. package/dist/worker/task-graph/ready-queue.js +23 -0
  653. package/dist/worker/task-graph/task-graph-schema.js +59 -0
  654. package/dist/worker/task-graph/types.js +1 -0
  655. package/dist/worker/task-graph/validate.js +293 -0
  656. package/dist/worker/task-spec/complexity-mapping.js +8 -0
  657. package/dist/worker/task-spec/schema.js +125 -0
  658. package/dist/worker/task-spec/types.js +1 -0
  659. package/dist/worker/task-spec/validate.js +391 -0
  660. package/dist/worker/task-spec/workflow-routing.js +149 -0
  661. package/dist/workflows/dag/authoring.js +8 -0
  662. package/dist/workflows/dag/authority-surface.js +138 -0
  663. package/dist/workflows/dag/backend-test-analysis-contract.js +507 -0
  664. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +1985 -0
  665. package/dist/workflows/dag/backend-test-case-manifest.js +638 -0
  666. package/dist/workflows/dag/backend-test-classification-contract.js +38 -0
  667. package/dist/workflows/dag/backend-test-contract-envelope.js +205 -0
  668. package/dist/workflows/dag/backend-test-coverage-contract.js +202 -0
  669. package/dist/workflows/dag/backend-test-execution-contract.js +715 -0
  670. package/dist/workflows/dag/backend-test-gap-fill.js +205 -0
  671. package/dist/workflows/dag/backend-test-intake-context.js +178 -0
  672. package/dist/workflows/dag/backend-test-layout.js +133 -0
  673. package/dist/workflows/dag/backend-test-markdown-workflow.js +1984 -0
  674. package/dist/workflows/dag/backend-test-module-stem.js +26 -0
  675. package/dist/workflows/dag/backend-test-pytest-collection.js +859 -0
  676. package/dist/workflows/dag/backend-test-result-contract.js +1030 -0
  677. package/dist/workflows/dag/backend-test-scenario-param.js +1670 -0
  678. package/dist/workflows/dag/backend-test-scenario-partitions.js +249 -0
  679. package/dist/workflows/dag/backend-test-semantic-review-contract.js +36 -0
  680. package/dist/workflows/dag/backend-test-stability-contract.js +57 -0
  681. package/dist/workflows/dag/backend-test-writer-completeness.js +1058 -0
  682. package/dist/workflows/dag/budget-enforcement.js +67 -0
  683. package/dist/workflows/dag/canvas-observer.js +474 -0
  684. package/dist/workflows/dag/context-policy.js +137 -0
  685. package/dist/workflows/dag/contract-output-registry.js +14 -0
  686. package/dist/workflows/dag/contract-validator-registrations.js +10 -0
  687. package/dist/workflows/dag/controller-identity.js +104 -0
  688. package/dist/workflows/dag/convergence/controller.js +596 -0
  689. package/dist/workflows/dag/decision-envelope.js +557 -0
  690. package/dist/workflows/dag/decision-evidence.js +153 -0
  691. package/dist/workflows/dag/decision-gates.js +1 -0
  692. package/dist/workflows/dag/dynamic-runtime/condition.js +48 -0
  693. package/dist/workflows/dag/dynamic-runtime/loop-until.js +161 -0
  694. package/dist/workflows/dag/dynamic-runtime/map.js +435 -0
  695. package/dist/workflows/dag/dynamic-runtime/reduction.js +72 -0
  696. package/dist/workflows/dag/dynamic-runtime/shared.js +203 -0
  697. package/dist/workflows/dag/event-observer.js +132 -0
  698. package/dist/workflows/dag/executor-registry.js +23 -0
  699. package/dist/workflows/dag/facts.js +4 -0
  700. package/dist/workflows/dag/failure-category.js +118 -0
  701. package/dist/workflows/dag/failure-routing.js +105 -0
  702. package/dist/workflows/dag/final-verification.js +180 -0
  703. package/dist/workflows/dag/frontend-implementation-contract.js +1911 -0
  704. package/dist/workflows/dag/frontend-lint-baseline.js +474 -0
  705. package/dist/workflows/dag/frontend-plan-render.js +90 -0
  706. package/dist/workflows/dag/frontend-prewrite-gate.js +1011 -0
  707. package/dist/workflows/dag/frontend-project-capability.js +1 -0
  708. package/dist/workflows/dag/frontend-recovery-plan.js +73 -0
  709. package/dist/workflows/dag/frontend-recovery-root-manifest.js +123 -0
  710. package/dist/workflows/dag/frontend-recovery-run.js +539 -0
  711. package/dist/workflows/dag/frontend-repair.js +541 -0
  712. package/dist/workflows/dag/frontend-review-context.js +116 -0
  713. package/dist/workflows/dag/frontend-risk.js +161 -0
  714. package/dist/workflows/dag/frontend-test-case-checklist.js +343 -0
  715. package/dist/workflows/dag/frontend-test-case-manifest.js +104 -0
  716. package/dist/workflows/dag/frontend-test-case-quality.js +105 -0
  717. package/dist/workflows/dag/frontend-test-html-report.js +174 -0
  718. package/dist/workflows/dag/frontend-test-l5-report.js +177 -0
  719. package/dist/workflows/dag/frontend-test-result-contract.js +487 -0
  720. package/dist/workflows/dag/frontend-verification-trace.js +275 -0
  721. package/dist/workflows/dag/frontend-worktree-diff.js +201 -0
  722. package/dist/workflows/dag/frontend-writer-recovery.js +106 -0
  723. package/dist/workflows/dag/frontend-writer-rollback.js +821 -0
  724. package/dist/workflows/dag/governance-constants.js +5 -0
  725. package/dist/workflows/dag/governance-profile.js +413 -0
  726. package/dist/workflows/dag/index.js +6 -0
  727. package/dist/workflows/dag/init-hybrid.js +7345 -0
  728. package/dist/workflows/dag/interrupt-request.js +559 -0
  729. package/dist/workflows/dag/knowledge-curator.js +165 -0
  730. package/dist/workflows/dag/l5-report-metrics.js +33 -0
  731. package/dist/workflows/dag/lifecycle.js +855 -0
  732. package/dist/workflows/dag/liveness-policy.js +251 -0
  733. package/dist/workflows/dag/node-execution.js +1081 -0
  734. package/dist/workflows/dag/observer-compose.js +52 -0
  735. package/dist/workflows/dag/output-protocol.js +356 -0
  736. package/dist/workflows/dag/project-governance-context.js +514 -0
  737. package/dist/workflows/dag/prompt-source.js +88 -0
  738. package/dist/workflows/dag/prompt.js +348 -0
  739. package/dist/workflows/dag/reconcile-run.js +145 -0
  740. package/dist/workflows/dag/reconcile-tasks.js +404 -0
  741. package/dist/workflows/dag/recovery-recommendation.js +329 -0
  742. package/dist/workflows/dag/repair-artifact.js +363 -0
  743. package/dist/workflows/dag/report.js +1229 -0
  744. package/dist/workflows/dag/rerun-plan.js +614 -0
  745. package/dist/workflows/dag/rerun-run.js +556 -0
  746. package/dist/workflows/dag/rerun-task.js +370 -0
  747. package/dist/workflows/dag/retry-policy.js +263 -0
  748. package/dist/workflows/dag/run-store.js +41 -0
  749. package/dist/workflows/dag/runner.js +1069 -0
  750. package/dist/workflows/dag/runtime-contract.js +87 -0
  751. package/dist/workflows/dag/runtime.js +5 -0
  752. package/dist/workflows/dag/scheduler.js +497 -0
  753. package/dist/workflows/dag/sdd-embedded.js +128 -0
  754. package/dist/workflows/dag/skill-instructions.js +478 -0
  755. package/dist/workflows/dag/skill-snapshot.js +553 -0
  756. package/dist/workflows/dag/skills.js +41 -0
  757. package/dist/workflows/dag/spec.js +3 -0
  758. package/dist/workflows/dag/task-contract-binding.js +138 -0
  759. package/dist/workflows/dag/task-demand-routing.js +1 -0
  760. package/dist/workflows/dag/topo.js +30 -0
  761. package/dist/workflows/dag/types.js +1145 -0
  762. package/dist/workflows/dag/upstream-artifacts.js +98 -0
  763. package/dist/workflows/dag/validate.js +998 -0
  764. package/dist/workflows/dag/workspace-checkpoint.js +186 -0
  765. package/dist/workflows/dynamic/artifacts.js +65 -0
  766. package/dist/workflows/dynamic/compile.js +371 -0
  767. package/dist/workflows/dynamic/compileTypes.js +1 -0
  768. package/dist/workflows/dynamic/errors.js +5 -0
  769. package/dist/workflows/dynamic/index.js +7 -0
  770. package/dist/workflows/dynamic/profiles.js +156 -0
  771. package/dist/workflows/dynamic/spec.js +115 -0
  772. package/dist/workflows/dynamic/validate.js +275 -0
  773. package/dist/workflows/loop/actions/dag-action.js +129 -0
  774. package/dist/workflows/loop/actions/pi-review.js +267 -0
  775. package/dist/workflows/loop/actions/shared.js +157 -0
  776. package/dist/workflows/loop/actions/shell-verify.js +82 -0
  777. package/dist/workflows/loop/actions/types.js +1 -0
  778. package/dist/workflows/loop/actions/workflow-action.js +255 -0
  779. package/dist/workflows/loop/actions.js +160 -0
  780. package/dist/workflows/loop/benchmark.js +510 -0
  781. package/dist/workflows/loop/closeout.js +135 -0
  782. package/dist/workflows/loop/context.js +47 -0
  783. package/dist/workflows/loop/events.js +26 -0
  784. package/dist/workflows/loop/hash.js +32 -0
  785. package/dist/workflows/loop/index.js +8 -0
  786. package/dist/workflows/loop/paths.js +17 -0
  787. package/dist/workflows/loop/policy/auto-policy.js +112 -0
  788. package/dist/workflows/loop/policy/path-patterns.js +13 -0
  789. package/dist/workflows/loop/rounds.js +81 -0
  790. package/dist/workflows/loop/signals.js +52 -0
  791. package/dist/workflows/loop/state.js +116 -0
  792. package/dist/workflows/loop/templates.js +54 -0
  793. package/dist/workflows/loop/types.js +28 -0
  794. package/docs/README.md +82 -0
  795. package/docs/architecture/README.md +35 -0
  796. package/docs/architecture/dag-execution.md +165 -0
  797. package/docs/architecture/evolution.md +108 -0
  798. package/docs/architecture/facts-and-state.md +74 -0
  799. package/docs/architecture/runtime-boundaries.md +226 -0
  800. package/docs/architecture/system-overview.md +100 -0
  801. package/docs/architecture/worker-and-feature.md +122 -0
  802. package/docs/governance/README.md +18 -0
  803. package/docs/governance/harness-methodology-debugging.md +177 -0
  804. package/docs/governance/harness-methodology-tdd.md +130 -0
  805. package/docs/governance/harness-methodology-verification.md +27 -0
  806. package/docs/init-surface.manifest.json +358 -0
  807. package/docs/operations/README.md +15 -0
  808. package/docs/operations/local-development-environment.md +77 -0
  809. package/docs/skills/README.md +7 -0
  810. package/docs/skills/vetted-skill-registry.md +49 -0
  811. package/docs/templates/README.md +67 -0
  812. package/docs/templates/adr.md +60 -0
  813. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -0
  814. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -0
  815. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -0
  816. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -0
  817. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -0
  818. package/docs/templates/agent-dag-report.schema.json +473 -0
  819. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -0
  820. package/docs/templates/agent-dag.base.json +190 -0
  821. package/docs/templates/agent-dag.final-verification.json +185 -0
  822. package/docs/templates/agent-dag.schema.json +590 -0
  823. package/docs/templates/agent-dag.supervised-implementation.json +640 -0
  824. package/docs/templates/agent-worker-production-readiness-checklist.md +47 -0
  825. package/docs/templates/backend-test-analysis.schema.json +37 -0
  826. package/docs/templates/backend-test-case-manifest.schema.json +223 -0
  827. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  828. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +41 -0
  829. package/docs/templates/backend-test-dag.json +671 -0
  830. package/docs/templates/backend-test-dag.retrospect.prompt.md +165 -0
  831. package/docs/templates/backend-test-dag.review-cases.prompt.md +36 -0
  832. package/docs/templates/backend-test-execution.schema.json +138 -0
  833. package/docs/templates/backend-test-result.schema.json +99 -0
  834. package/docs/templates/branch-merge-report.md +115 -0
  835. package/docs/templates/evaluation/agents-map-slim-v1.candidate.json +9 -0
  836. package/docs/templates/evaluation/agents-map-slim-v1.md +87 -0
  837. package/docs/templates/evaluation/agents-map-verbose-v0.candidate.json +9 -0
  838. package/docs/templates/evaluation/agents-map-verbose-v0.md +153 -0
  839. package/docs/templates/evaluation/campaign-budget-v1.json +12 -0
  840. package/docs/templates/evaluation/campaign-dogfood-v0.json +24 -0
  841. package/docs/templates/evaluation/campaign-evidence-v1.json +44 -0
  842. package/docs/templates/evaluation/context-policy-baseline-v1.json +17 -0
  843. package/docs/templates/evaluation/context-policy-role-specialized-v1.json +28 -0
  844. package/docs/templates/evaluation/corpus-dogfood-v0.manifest.json +118 -0
  845. package/docs/templates/evaluation/matrix-dag-dry-run-v1.json +21 -0
  846. package/docs/templates/evaluation/matrix-fixture-v1.json +10 -0
  847. package/docs/templates/evaluation/private-verifier-dogfood-v0.json +16 -0
  848. package/docs/templates/exec-plan.md +66 -0
  849. package/docs/templates/feature-spec.md +53 -0
  850. package/docs/templates/frontend-design-contract.md +68 -0
  851. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  852. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  853. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  854. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  855. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  856. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  857. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  858. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  859. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  860. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  861. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  862. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  863. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  864. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  865. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  866. package/docs/templates/frontend-eval/metrics.md +138 -0
  867. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  868. package/docs/templates/frontend-implementation-contract.schema.json +35 -0
  869. package/docs/templates/frontend-task-constraints.md +62 -0
  870. package/docs/templates/frontend-task-requirement.md +104 -0
  871. package/docs/templates/frontend-test-case-checklist.md +44 -0
  872. package/docs/templates/frontend-test-case.example.md +143 -0
  873. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +63 -0
  874. package/docs/templates/frontend-test-dag.json +409 -0
  875. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +21 -0
  876. package/docs/templates/frontend-test-dag.retrospect.prompt.md +5 -0
  877. package/docs/templates/frontend-test-dag.review-cases.prompt.md +5 -0
  878. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -0
  879. package/docs/templates/frontend-test-standard-scenarios.v1.json +159 -0
  880. package/docs/templates/harness.schema.json +351 -0
  881. package/docs/templates/hybrid-dag.json +188 -0
  882. package/docs/templates/init-evolution-review.md +35 -0
  883. package/docs/templates/init-managed-agents.md +157 -0
  884. package/docs/templates/interactive-ui-round2-experiment.md +66 -0
  885. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -0
  886. package/docs/templates/knowledge-sync-dag.json +178 -0
  887. package/docs/templates/knowledge-sync-draft.schema.json +71 -0
  888. package/docs/templates/product-line/AGENTS.md +9 -0
  889. package/docs/templates/product-line/README.md +42 -0
  890. package/docs/templates/product-line/acceptance.yaml +23 -0
  891. package/docs/templates/product-line/closeout.yaml +9 -0
  892. package/docs/templates/product-line/design.md +13 -0
  893. package/docs/templates/product-line/feature-scaffold-batch.example.yaml +31 -0
  894. package/docs/templates/product-line/feature.yaml +11 -0
  895. package/docs/templates/product-line/links.md +10 -0
  896. package/docs/templates/product-line/requirement.md +17 -0
  897. package/docs/templates/product-line/scaffold-samples/README.md +36 -0
  898. package/docs/templates/product-line/scaffold-samples/backend-only/acceptance.yaml +16 -0
  899. package/docs/templates/product-line/scaffold-samples/backend-only/design.md +14 -0
  900. package/docs/templates/product-line/scaffold-samples/backend-only/feature.yaml +14 -0
  901. package/docs/templates/product-line/scaffold-samples/backend-only/requirement.md +6 -0
  902. package/docs/templates/product-line/scaffold-samples/backend-only/tasks/BE-IMPL-001.yaml +83 -0
  903. package/docs/templates/product-line/scaffold-samples/backend-only/tasks/task-graph.yaml +14 -0
  904. package/docs/templates/product-line/scaffold-samples/fe-with-api/acceptance.yaml +18 -0
  905. package/docs/templates/product-line/scaffold-samples/fe-with-api/design.md +18 -0
  906. package/docs/templates/product-line/scaffold-samples/fe-with-api/feature.yaml +14 -0
  907. package/docs/templates/product-line/scaffold-samples/fe-with-api/requirement.md +6 -0
  908. package/docs/templates/product-line/scaffold-samples/fe-with-api/tasks/BE-IMPL-001.yaml +84 -0
  909. package/docs/templates/product-line/scaffold-samples/fe-with-api/tasks/CONTRACT-001.yaml +84 -0
  910. package/docs/templates/product-line/scaffold-samples/fe-with-api/tasks/FE-IMPL-001.yaml +86 -0
  911. package/docs/templates/product-line/scaffold-samples/fe-with-api/tasks/task-graph.yaml +40 -0
  912. package/docs/templates/product-line/scaffold-samples/frontend-only/acceptance.yaml +16 -0
  913. package/docs/templates/product-line/scaffold-samples/frontend-only/design.md +14 -0
  914. package/docs/templates/product-line/scaffold-samples/frontend-only/feature.yaml +14 -0
  915. package/docs/templates/product-line/scaffold-samples/frontend-only/requirement.md +6 -0
  916. package/docs/templates/product-line/scaffold-samples/frontend-only/tasks/FE-IMPL-001.yaml +85 -0
  917. package/docs/templates/product-line/scaffold-samples/frontend-only/tasks/task-graph.yaml +14 -0
  918. package/docs/templates/product-line/task-graph.yaml +23 -0
  919. package/docs/templates/product-line/task.yaml +68 -0
  920. package/docs/templates/product-line/test-plan.md +7 -0
  921. package/docs/templates/production-readiness-checklist.md +57 -0
  922. package/docs/templates/progress-log.md +27 -0
  923. package/docs/templates/project-start-checklist.md +9 -0
  924. package/docs/templates/qa-report.md +48 -0
  925. package/docs/templates/sprint-contract.md +29 -0
  926. package/docs/templates/worker-dogfood-evidence.md +80 -0
  927. package/docs/templates/worker-dogfood-setup.md +68 -0
  928. package/examples/decision-gate-agent-dag.json +177 -0
  929. package/examples/example-dag.json +46 -0
  930. package/examples/hybrid-loop-agent-dag.json +189 -0
  931. package/examples/l5-report-coms-process-definition.html +322 -0
  932. package/examples/l5-report-demo.html +79 -0
  933. package/harness.json +90 -0
  934. package/package.json +98 -0
  935. package/scripts/kb-bootstrap-init-skeleton.sh +241 -0
  936. package/scripts/kb-graph-incremental-prepare.mjs +386 -0
  937. package/scripts/kb-graph-materialize.mjs +105 -0
  938. package/scripts/kb-graph-promote.mjs +164 -0
  939. package/scripts/kb-query.mjs +554 -0
  940. package/skills/agent-worker/SKILL.md +48 -0
  941. package/skills/agent-worker/references/agent-worker-operator.md +159 -0
  942. package/skills/ai-engineering-context/SKILL.md +48 -0
  943. package/skills/analyze-product-dependencies/SKILL.md +108 -0
  944. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +35 -0
  945. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +38 -0
  946. package/skills/analyze-product-dependencies/references/example.md +76 -0
  947. package/skills/analyze-product-dependencies/references/forward-test-cases.md +110 -0
  948. package/skills/analyze-product-dependencies/references/input-contract.md +34 -0
  949. package/skills/analyze-product-dependencies/references/kb-integration.md +64 -0
  950. package/skills/analyze-product-dependencies/references/scouting-rules.md +76 -0
  951. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +460 -0
  952. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +194 -0
  953. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +200 -0
  954. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +90 -0
  955. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +138 -0
  956. package/skills/analyze-product-requirements/SKILL.md +145 -0
  957. package/skills/analyze-product-requirements/references/acceptance-criteria.md +87 -0
  958. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +70 -0
  959. package/skills/analyze-product-requirements/references/example.md +104 -0
  960. package/skills/analyze-product-requirements/references/forward-test-cases.md +144 -0
  961. package/skills/analyze-product-requirements/references/kb-integration.md +56 -0
  962. package/skills/analyze-product-requirements/references/product-analysis-schema.md +41 -0
  963. package/skills/analyze-product-requirements/references/product-requirement-schema.md +42 -0
  964. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +66 -0
  965. package/skills/analyze-product-requirements/scripts/compute-source-identity.mjs +35 -0
  966. package/skills/analyze-product-requirements/scripts/test-validators.mjs +501 -0
  967. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +100 -0
  968. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +109 -0
  969. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +109 -0
  970. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +175 -0
  971. package/skills/browser-tools/SKILL.md +196 -0
  972. package/skills/browser-tools/browser-content.js +103 -0
  973. package/skills/browser-tools/browser-cookies.js +35 -0
  974. package/skills/browser-tools/browser-eval.js +53 -0
  975. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  976. package/skills/browser-tools/browser-nav.js +44 -0
  977. package/skills/browser-tools/browser-pick.js +162 -0
  978. package/skills/browser-tools/browser-screenshot.js +34 -0
  979. package/skills/browser-tools/browser-start.js +86 -0
  980. package/skills/browser-tools/package-lock.json +2556 -0
  981. package/skills/browser-tools/package.json +19 -0
  982. package/skills/code-review-core/SKILL.md +20 -0
  983. package/skills/codebase-scout/SKILL.md +19 -0
  984. package/skills/frontend-bounded-implement/SKILL.md +53 -0
  985. package/skills/frontend-design-review/SKILL.md +79 -0
  986. package/skills/frontend-design-review/references/review-checklist.md +43 -0
  987. package/skills/frontend-implementation/SKILL.md +52 -0
  988. package/skills/frontend-implementation/references/code-standards.md +33 -0
  989. package/skills/frontend-implementation/references/design-spec.md +56 -0
  990. package/skills/frontend-implementation/references/node-contracts.md +31 -0
  991. package/skills/frontend-review/SKILL.md +55 -0
  992. package/skills/frontend-review/references/review-findings.md +50 -0
  993. package/skills/frontend-verification/SKILL.md +61 -0
  994. package/skills/frontend-verification/references/verification-checklist.md +48 -0
  995. package/skills/grill-me/SKILL.md +10 -0
  996. package/skills/grill-with-docs/SKILL.md +80 -0
  997. package/skills/grill-with-docs/adr-format.md +58 -0
  998. package/skills/grill-with-docs/context-format.md +52 -0
  999. package/skills/init-capability-evolution/SKILL.md +70 -0
  1000. package/skills/local-jacoco-coverage/SKILL.md +281 -0
  1001. package/skills/local-jacoco-coverage/references/requirement-to-source-mapping.md +85 -0
  1002. package/skills/local-jacoco-coverage/references/runtime-alignment.md +106 -0
  1003. package/skills/local-jacoco-coverage/scripts/run-coverage-analysis.sh +148 -0
  1004. package/skills/local-jacoco-coverage/scripts/start-jacoco-agent.sh +110 -0
  1005. package/skills/loop-agent/SKILL.md +68 -0
  1006. package/skills/loop-agent/references/README.md +67 -0
  1007. package/skills/loop-agent/references/command-reference.md +645 -0
  1008. package/skills/loop-agent/references/docs-converge.md +126 -0
  1009. package/skills/loop-agent/references/harness-policy.md +289 -0
  1010. package/skills/loop-agent/references/hybrid-dag.md +245 -0
  1011. package/skills/loop-agent/references/learned/README.md +21 -0
  1012. package/skills/loop-agent/references/long-running-loop.md +57 -0
  1013. package/skills/loop-agent/references/model-routing.md +45 -0
  1014. package/skills/loop-agent/references/multi-worktree.md +54 -0
  1015. package/skills/loop-agent/references/one-shot-runs.md +84 -0
  1016. package/skills/loop-agent/references/orchestrator-and-interventions.md +175 -0
  1017. package/skills/loop-agent/references/pi-prompt.md +23 -0
  1018. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -0
  1019. package/skills/loop-agent/references/post-implementation-and-patterns.md +54 -0
  1020. package/skills/loop-agent/references/source-and-plan-practice.md +169 -0
  1021. package/skills/loop-agent/references/task-workflow.md +104 -0
  1022. package/skills/loop-agent/references/verification-and-failure-handling.md +148 -0
  1023. package/skills/playwright-cli/SKILL.md +93 -0
  1024. package/skills/playwright-cli/references/element-attributes.md +23 -0
  1025. package/skills/playwright-cli/references/playwright-tests.md +39 -0
  1026. package/skills/playwright-cli/references/request-mocking.md +87 -0
  1027. package/skills/playwright-cli/references/running-code.md +241 -0
  1028. package/skills/playwright-cli/references/session-management.md +225 -0
  1029. package/skills/playwright-cli/references/storage-state.md +275 -0
  1030. package/skills/playwright-cli/references/test-generation.md +433 -0
  1031. package/skills/playwright-cli/references/tracing.md +5 -0
  1032. package/skills/playwright-cli/references/video-recording.md +5 -0
  1033. package/skills/playwright-cli-case-generator/SKILL.md +108 -0
  1034. package/skills/requesting-code-review/SKILL.md +101 -0
  1035. package/skills/requesting-code-review/code-reviewer.md +168 -0
  1036. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  1037. package/skills/systematic-debugging/SKILL.md +312 -0
  1038. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  1039. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  1040. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  1041. package/skills/systematic-debugging/find-polluter.sh +63 -0
  1042. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  1043. package/skills/systematic-debugging/test-academic.md +14 -0
  1044. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  1045. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  1046. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  1047. package/skills/test-driven-development/SKILL.md +27 -0
  1048. package/skills/using-git-worktrees/SKILL.md +215 -0
  1049. package/skills/verification-before-completion/SKILL.md +154 -0
  1050. package/skills/webapp-testing/SKILL.md +19 -0
@@ -0,0 +1,1081 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { readFile } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { pathMatchesPattern } from "../../shared/git-progress.js";
6
+ import { recordDecisionEnvelopeForNode, shouldPauseOnHumanEscalation, writeHumanEscalationArtifacts, } from "./decision-envelope.js";
7
+ import { FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT, FRONTEND_WRITER_NODE_IDS, isFrontendWriterAuthorized, readFrontendPrewriteResult, } from "./scheduler.js";
8
+ import { writeNodeRecord, writeNodeSkillArtifacts } from "./run-store.js";
9
+ import { resolveContextPolicy } from "./context-policy.js";
10
+ import { buildDagNodePromptEnvelope, formatConvergenceFeedbackBlock, } from "./prompt.js";
11
+ import { persistLongNodeOutputArtifacts } from "./upstream-artifacts.js";
12
+ import { buildOutputLimitRecoverySection, loadBackendTestWriterProgressForRetry, } from "./backend-test-writer-completeness.js";
13
+ import { computeBackoffDelayMs, isRetryablePiFailureCategory, isSafeReadOnlyPiRetryCandidate, isWriterEmptyDiffRetryCandidate, isWriterTransportRetryCandidate, } from "./retry-policy.js";
14
+ import { applyNodeActivity, evaluateNodeLiveness, resolveLivenessPolicy, } from "./liveness-policy.js";
15
+ import { buildProtocolRetryInstruction, normalizeReviewVerdictAfterRetries, parseJsonReviewVerdict, validateOutputProtocol, } from "./output-protocol.js";
16
+ import { getStructuredContractValidator } from "./contract-output-registry.js";
17
+ import "./contract-validator-registrations.js";
18
+ import { writeDagNodeJsonArtifact } from "../../infrastructure/harness/artifact-store.js";
19
+ import { buildProjectGovernanceContext, readCompletedWriterChangeManifests, writeProjectGovernanceContext, } from "./project-governance-context.js";
20
+ import { assertSkillSnapshotCoversSpec, buildNodePromptFromSnapshot, isDagSkillSnapshotIntegrityError, readSkillSnapshot, } from "./skill-snapshot.js";
21
+ import { resolveDagSkillInstructions, skillInstructionMetadata, } from "./skill-instructions.js";
22
+ import { parseRepairArtifactFromText, resolveRepairTaskForGate, validateRepairArtifactScope, } from "./repair-artifact.js";
23
+ import { resolveModelForTask, } from "./types.js";
24
+ import { loadHarnessManifest } from "../../governance/harness.js";
25
+ import { resolveExecutorThinkingMatrix } from "../../executors/model-routing.js";
26
+ function canonicalApprovalJson(value) {
27
+ if (Array.isArray(value)) {
28
+ return `[${value.map((entry) => canonicalApprovalJson(entry)).join(",")}]`;
29
+ }
30
+ if (value && typeof value === "object") {
31
+ const record = value;
32
+ return `{${Object.keys(record)
33
+ .sort()
34
+ .map((key) => `${JSON.stringify(key)}:${canonicalApprovalJson(record[key])}`)
35
+ .join(",")}}`;
36
+ }
37
+ return JSON.stringify(value) ?? "null";
38
+ }
39
+ export function parseAndValidateFinalWriteSetApproval(input) {
40
+ const binding = input.task.finalWriteSetApproval;
41
+ if (!binding) {
42
+ return { ok: false, reason: "missing final write-set approval binding", approvalSourceNodeId: "(missing)" };
43
+ }
44
+ const source = input.state.nodes[binding.approvalSourceNodeId];
45
+ if (source?.status !== "FINISHED" || parseProcessVerdict(source) !== "pass") {
46
+ return {
47
+ ok: false,
48
+ reason: "final write-set approval source did not finish with VERDICT: pass",
49
+ approvalSourceNodeId: binding.approvalSourceNodeId,
50
+ };
51
+ }
52
+ const raw = canonicalNodeOutput(source);
53
+ const blocks = [...raw.matchAll(/```FINAL_WRITE_SET_APPROVAL_JSON\s*\r?\n([\s\S]*?)\r?\n```/g)];
54
+ if (blocks.length !== 1) {
55
+ return { ok: false, reason: `expected exactly one FINAL_WRITE_SET_APPROVAL_JSON block, found ${blocks.length}`, approvalSourceNodeId: binding.approvalSourceNodeId };
56
+ }
57
+ let approval;
58
+ try {
59
+ approval = JSON.parse(blocks[0][1]);
60
+ }
61
+ catch {
62
+ return { ok: false, reason: "final write-set approval is not valid JSON", approvalSourceNodeId: binding.approvalSourceNodeId };
63
+ }
64
+ const required = ["schemaVersion", "writerNodeId", "approvalSourceNodeId", "auditedPlanNodeId", "approvedWriteSet", "taskContractSha256", "auditedPlanSha256", "approvalDigest"];
65
+ if (Object.keys(approval).length !== required.length || required.some((key) => !(key in approval))) {
66
+ return { ok: false, reason: "final write-set approval has an invalid schema", approvalSourceNodeId: binding.approvalSourceNodeId };
67
+ }
68
+ const approved = approval.approvedWriteSet;
69
+ if (approval.schemaVersion !== 1 ||
70
+ approval.writerNodeId !== binding.writerNodeId ||
71
+ approval.writerNodeId !== input.task.id ||
72
+ approval.approvalSourceNodeId !== binding.approvalSourceNodeId ||
73
+ approval.auditedPlanNodeId !== binding.auditedPlanNodeId ||
74
+ !Array.isArray(approved) ||
75
+ !approved.every((entry) => typeof entry === "string") ||
76
+ typeof approval.taskContractSha256 !== "string" ||
77
+ typeof approval.auditedPlanSha256 !== "string" ||
78
+ typeof approval.approvalDigest !== "string") {
79
+ return { ok: false, reason: "final write-set approval binding or field types are invalid", approvalSourceNodeId: binding.approvalSourceNodeId };
80
+ }
81
+ if (!/^[a-f0-9]{64}$/.test(approval.taskContractSha256) ||
82
+ !/^[a-f0-9]{64}$/.test(approval.auditedPlanSha256) ||
83
+ !/^[a-f0-9]{64}$/.test(approval.approvalDigest)) {
84
+ return { ok: false, reason: "final write-set approval digest fields are invalid", approvalSourceNodeId: binding.approvalSourceNodeId };
85
+ }
86
+ const canonicalPayload = { ...approval };
87
+ delete canonicalPayload.approvalDigest;
88
+ const expectedDigest = createHash("sha256")
89
+ .update(canonicalApprovalJson(canonicalPayload))
90
+ .digest("hex");
91
+ if (approval.approvalDigest !== expectedDigest) {
92
+ return { ok: false, reason: "final write-set approval digest mismatch", approvalSourceNodeId: binding.approvalSourceNodeId };
93
+ }
94
+ const expectedTaskDigest = input.spec.taskContractBinding?.canonicalHash;
95
+ const plan = input.state.nodes[binding.auditedPlanNodeId];
96
+ const expectedPlanDigest = createHash("sha256")
97
+ .update(canonicalNodeOutput(plan))
98
+ .digest("hex");
99
+ if (!expectedTaskDigest || approval.taskContractSha256 !== expectedTaskDigest || approval.auditedPlanSha256 !== expectedPlanDigest) {
100
+ return { ok: false, reason: "final write-set approval is stale for the task contract or audited plan", approvalSourceNodeId: binding.approvalSourceNodeId };
101
+ }
102
+ const effectiveWriteSet = approved;
103
+ if (effectiveWriteSet.length === 0 || new Set(effectiveWriteSet).size !== effectiveWriteSet.length) {
104
+ return { ok: false, reason: "final write-set approval must contain a non-empty ordered unique path set", approvalSourceNodeId: binding.approvalSourceNodeId };
105
+ }
106
+ for (const entry of effectiveWriteSet) {
107
+ const normalized = entry.replace(/\\/g, "/").replace(/^\.\//, "");
108
+ if (!normalized || normalized === "." || normalized === ".." || normalized.includes("*") || normalized.includes("?") || normalized.includes("REPLACE/") || normalized.includes("PLACEHOLDER")) {
109
+ return { ok: false, reason: `final write-set approval contains a broad or placeholder path: ${entry}`, approvalSourceNodeId: binding.approvalSourceNodeId };
110
+ }
111
+ if (!input.task.allowedPaths.some((allowed) => pathMatchesPattern(normalized, allowed))) {
112
+ return { ok: false, reason: `final write-set approval exceeds allowedPaths: ${entry}`, approvalSourceNodeId: binding.approvalSourceNodeId };
113
+ }
114
+ if (input.task.forbiddenPaths.some((forbidden) => pathMatchesPattern(normalized, forbidden))) {
115
+ return { ok: false, reason: `final write-set approval overlaps forbiddenPaths: ${entry}`, approvalSourceNodeId: binding.approvalSourceNodeId };
116
+ }
117
+ }
118
+ return { ok: true, effectiveWriteSet, approvalDigest: approval.approvalDigest };
119
+ }
120
+ export function buildNodePrompt(spec, task, upstream, options) {
121
+ const policy = resolveContextPolicy(spec);
122
+ return buildDagNodePromptEnvelope({
123
+ spec,
124
+ task,
125
+ upstream,
126
+ resolvedSkills: policy.resolveSkills(spec, task),
127
+ maxUpstreamChars: policy.resolveMaxUpstreamChars(task),
128
+ projectGovernanceContext: options?.projectGovernanceContext,
129
+ convergenceFeedback: options?.convergenceFeedback,
130
+ });
131
+ }
132
+ function frontendStructuredArtifactRetryGuidance(schemaId) {
133
+ if (schemaId === "frontend-implementation-contract-plan-patch-v1") {
134
+ return [
135
+ "Return exactly this artifact and nothing else: one short lead-in line, then exactly one fenced json block containing only the editable RFC 7386 plan patch, immediately followed by exactly one fenced openspec-citations block.",
136
+ "The runtime applies your patch to its protected contract skeleton. Do not emit schemaVersion, sourceBinding, riskLevel, targets.files, or mockApi.productionDefaultOff; do not emit the full contract.",
137
+ "Do not emit Markdown headings, bullets, plan prose, explanations, raw JSON, or any other fenced block.",
138
+ ];
139
+ }
140
+ if (schemaId === "frontend-implementation-contract-revision-patch-v1") {
141
+ return [
142
+ "Return exactly this artifact and nothing else: one short lead-in line, then exactly one fenced json block containing the RFC 7386 merge-patch delta, immediately followed by exactly one fenced openspec-citations block.",
143
+ "The delta contains only the fields you change; null deletes a key, arrays and scalars replace, and plain objects merge recursively. Do not emit a full contract or a schemaVersion/targets section.",
144
+ "Do not emit Markdown headings, bullets, plan prose, explanations, raw JSON, or any other fenced block.",
145
+ ];
146
+ }
147
+ return [
148
+ "Return exactly this artifact and nothing else: one short lead-in line, then exactly one fenced json block conforming to frontend-implementation-contract-v1, immediately followed by exactly one fenced openspec-citations block.",
149
+ "The contract JSON fields are the complete implementation plan. Do not emit a separate plan document, Markdown headings, bullets, plan prose, explanations, raw JSON, or any other fenced block.",
150
+ ];
151
+ }
152
+ function buildAttemptPrompt(task, basePrompt, attemptNumber, previousFailureCategory, previousProtocolReason, recoveryTargetPaths, recoveryDiagnostics) {
153
+ if (attemptNumber <= 1)
154
+ return basePrompt;
155
+ if (previousFailureCategory === "protocol-invalid" &&
156
+ task.outputProtocol &&
157
+ previousProtocolReason) {
158
+ return [
159
+ basePrompt,
160
+ "",
161
+ buildProtocolRetryInstruction(task.outputProtocol, previousProtocolReason),
162
+ ].join("\n");
163
+ }
164
+ if (previousFailureCategory === "invalid-output" &&
165
+ task.structuredContractOutput &&
166
+ previousProtocolReason) {
167
+ return [
168
+ basePrompt,
169
+ "",
170
+ "<retry_instruction>",
171
+ "Previous attempt produced an invalid frontend implementation contract:",
172
+ previousProtocolReason,
173
+ ...frontendStructuredArtifactRetryGuidance(task.structuredContractOutput.schemaId),
174
+ "Fix every reported field violation: do not emit null for optional fields, do not misspell field names, and match the required types exactly.",
175
+ "</retry_instruction>",
176
+ ].join("\n");
177
+ }
178
+ if (previousFailureCategory === "structured-output-truncated" &&
179
+ task.structuredContractOutput) {
180
+ return [
181
+ basePrompt,
182
+ "",
183
+ "<retry_instruction>",
184
+ "Previous attempt was truncated by the provider (stopReason=length) before the JSON contract was completed.",
185
+ ...frontendStructuredArtifactRetryGuidance(task.structuredContractOutput.schemaId),
186
+ "The JSON artifact must be complete; omit evidence excerpts and duplicated upstream context.",
187
+ "</retry_instruction>",
188
+ ].join("\n");
189
+ }
190
+ if (previousFailureCategory === "writer-empty-diff") {
191
+ const maxAttempts = task.retryPolicy?.maxAttempts ?? 3;
192
+ // When a completeness progress exists for this writer, fold the concrete
193
+ // target paths into the empty-diff retry so the model does not guess and
194
+ // does not need to read a forbidden `.harness/**` evidence file.
195
+ if (recoveryTargetPaths && recoveryTargetPaths.length > 0) {
196
+ return [
197
+ basePrompt,
198
+ "",
199
+ buildOutputLimitRecoverySection({
200
+ attempt: attemptNumber,
201
+ maxAttempts,
202
+ reason: "T4",
203
+ targetPaths: recoveryTargetPaths,
204
+ diagnostics: recoveryDiagnostics,
205
+ }),
206
+ ].join("\n");
207
+ }
208
+ return [
209
+ basePrompt,
210
+ "",
211
+ "<retry_instruction>",
212
+ "Previous attempt made no file changes.",
213
+ "Use write/edit tools immediately to create the required bounded files; do not repeat analysis or planning.",
214
+ "Return only after producing a non-empty bounded diff and the required implementation outcome.",
215
+ "</retry_instruction>",
216
+ ].join("\n");
217
+ }
218
+ if (previousFailureCategory === "incomplete-write-set") {
219
+ const maxAttempts = task.retryPolicy?.maxAttempts ?? 3;
220
+ // Embed concrete missing/broken paths from the run-owned progress facts
221
+ // so the continuation attempt is fully self-contained and never reads
222
+ // a forbidden `.harness/**` evidence file. When the loader finds no
223
+ // progress facts yet (rare), fall back to the path-pointing contract.
224
+ if (recoveryTargetPaths) {
225
+ return [
226
+ basePrompt,
227
+ "",
228
+ buildOutputLimitRecoverySection({
229
+ attempt: attemptNumber,
230
+ maxAttempts,
231
+ reason: "T3_or_T5",
232
+ targetPaths: recoveryTargetPaths,
233
+ diagnostics: recoveryDiagnostics,
234
+ }),
235
+ ].join("\n");
236
+ }
237
+ return [
238
+ basePrompt,
239
+ "",
240
+ "<retry_instruction>",
241
+ `OUTPUT_LIMIT_RECOVERY attempt=${attemptNumber}/${maxAttempts}`,
242
+ "reason=T3_or_T5",
243
+ "Previous attempt produced an incomplete or structurally broken write set (Completeness Gate).",
244
+ "Continue or repair ONLY missing/broken target paths listed in reports/backend-test-output-limit-recovery.md and contracts/backend-test-writer-progress-*.json when present.",
245
+ "One file per write/edit; no chat dump of full bodies; do not delete or shrink in-scope cases/rules/TPs.",
246
+ "Prefer edit/append for truncated files; rewrite a file only if unparseable or empty.",
247
+ "After targets are complete, short IMPLEMENTATION_OUTCOME only.",
248
+ "</retry_instruction>",
249
+ ].join("\n");
250
+ }
251
+ if (previousFailureCategory !== "output-too-large") {
252
+ return basePrompt;
253
+ }
254
+ if (task.outputMode === "structured-required") {
255
+ if (task.structuredContractOutput) {
256
+ return [
257
+ basePrompt,
258
+ "",
259
+ "<retry_instruction>",
260
+ "Previous attempt exceeded the structured output size limit.",
261
+ ...frontendStructuredArtifactRetryGuidance(task.structuredContractOutput.schemaId),
262
+ "Keep every required field but make values concise; omit evidence excerpts and duplicated upstream context.",
263
+ "</retry_instruction>",
264
+ ].join("\n");
265
+ }
266
+ return [
267
+ basePrompt,
268
+ "",
269
+ "<retry_instruction>",
270
+ "Previous attempt exceeded the structured output size limit.",
271
+ "Return only the compact structured artifact required by this node's output contract.",
272
+ "Do not include explanatory prose, duplicated upstream context, long evidence excerpts, or additional markdown sections.",
273
+ "If a fenced JSON object is required, output exactly one fenced json block and nothing else.",
274
+ "</retry_instruction>",
275
+ ].join("\n");
276
+ }
277
+ return [
278
+ basePrompt,
279
+ "",
280
+ "<retry_instruction>",
281
+ "Previous attempt exceeded the output size limit.",
282
+ "Return a minimal plan: ordered steps, narrow writeSet boundaries, and verification commands.",
283
+ "Drop verbatim upstream quotes, long evidence excerpts, and repeated context.",
284
+ "</retry_instruction>",
285
+ ].join("\n");
286
+ }
287
+ export async function buildNodePromptWithResolvedSkillInstructions(spec, task, upstream, cwd, options) {
288
+ const policy = resolveContextPolicy(spec);
289
+ const skillNames = policy.resolveSkills(spec, task);
290
+ const budget = policy.resolveSkillInstructionBudget(task);
291
+ const resolvedSkillInstructions = task.executor === "pi"
292
+ ? await resolveDagSkillInstructions(skillNames, {
293
+ cwd,
294
+ includeLearnedPatterns: budget.includeLearnedPatterns,
295
+ perSkillMaxChars: budget.perSkillMaxChars,
296
+ totalMaxChars: budget.totalMaxChars,
297
+ })
298
+ : [];
299
+ return {
300
+ prompt: buildDagNodePromptEnvelope({
301
+ spec,
302
+ task,
303
+ upstream,
304
+ resolvedSkills: skillNames,
305
+ resolvedSkillInstructions,
306
+ maxUpstreamChars: policy.resolveMaxUpstreamChars(task),
307
+ projectGovernanceContext: options?.projectGovernanceContext,
308
+ convergenceFeedback: options?.convergenceFeedback,
309
+ }),
310
+ resolvedSkills: skillInstructionMetadata(resolvedSkillInstructions),
311
+ };
312
+ }
313
+ export function canonicalNodeOutput(node) {
314
+ const assistantText = node?.assistantText ?? "";
315
+ return assistantText.trim().length > 0 ? assistantText : (node?.stdout ?? "");
316
+ }
317
+ export function parseProcessVerdict(node) {
318
+ const text = canonicalNodeOutput(node);
319
+ const jsonVerdict = parseJsonReviewVerdict(text);
320
+ if (jsonVerdict.ok)
321
+ return jsonVerdict.verdict;
322
+ for (const line of text.split("\n")) {
323
+ const trimmed = line.trim();
324
+ if (trimmed === "VERDICT: pass")
325
+ return "pass";
326
+ if (trimmed === "VERDICT: request-revision")
327
+ return "request-revision";
328
+ }
329
+ return "unknown";
330
+ }
331
+ /**
332
+ * Derive a bounded convergence feedback block for the next-round
333
+ * supervisor/repair node from `state.convergence`. Deterministic: reads the
334
+ * last passHistory entry and its preservedNodeRecordPath pointers; never
335
+ * searches the run directory. Returns undefined on pass 1 (no prior evidence).
336
+ */
337
+ export function deriveConvergenceFeedback(state) {
338
+ const convergence = state.convergence;
339
+ if (!convergence?.enabled || convergence.currentPass <= 1)
340
+ return undefined;
341
+ const last = convergence.passHistory.at(-1);
342
+ if (!last)
343
+ return undefined;
344
+ return {
345
+ pass: last.pass,
346
+ reason: last.reason,
347
+ hardVerifyFailureCategory: last.hardVerifyFailureCategory,
348
+ processVerdict: last.processVerdict,
349
+ reviewVerdict: last.reviewVerdict,
350
+ reviewFailureCategory: last.reviewFailureCategory,
351
+ shellSuccessCount: last.shellSuccessCount,
352
+ repairArtifact: last.repairArtifact
353
+ ? {
354
+ failureClass: last.repairArtifact.failureClass,
355
+ rootCause: last.repairArtifact.rootCause,
356
+ fixScope: last.repairArtifact.fixScope,
357
+ invariant: last.repairArtifact.invariant,
358
+ }
359
+ : undefined,
360
+ evidenceRefs: last.artifactRefs.map((ref) => ({
361
+ nodeId: ref.nodeId,
362
+ preservedNodeRecordPath: ref.preservedNodeRecordPath,
363
+ })),
364
+ };
365
+ }
366
+ function assertRepairArtifactVerdictMatchesSupervisor(input) {
367
+ const supervisorVerdict = parseProcessVerdict(input.node);
368
+ if (supervisorVerdict === "unknown")
369
+ return;
370
+ if (supervisorVerdict !== input.artifactVerdict) {
371
+ throw new Error(`repair artifact gate failed: verdict mismatch between supervisor ${supervisorVerdict} and REPAIR_ARTIFACT_JSON ${input.artifactVerdict}`);
372
+ }
373
+ }
374
+ function parseSupervisorRepairArtifact(node) {
375
+ return parseRepairArtifactFromText(canonicalNodeOutput(node));
376
+ }
377
+ function validateRepairArtifactGateBeforeShell(input) {
378
+ const gate = input.task.shell?.repairArtifactGate;
379
+ if (!gate)
380
+ return;
381
+ const upstream = input.state.nodes[gate.fromNodeId];
382
+ const parsed = parseSupervisorRepairArtifact(upstream);
383
+ if (!parsed.ok) {
384
+ throw new Error(`repair artifact gate failed: ${parsed.reason}`);
385
+ }
386
+ assertRepairArtifactVerdictMatchesSupervisor({
387
+ node: upstream,
388
+ artifactVerdict: parsed.artifact.verdict,
389
+ });
390
+ upstream.repairArtifact = parsed.artifact;
391
+ const resolution = resolveRepairTaskForGate({
392
+ tasks: Array.from(input.tasksById.values()),
393
+ gateTask: input.task,
394
+ });
395
+ if (!resolution.ok) {
396
+ // A pass verdict does not need a repair writer; only fail closed when the
397
+ // supervisor requested a revision that must be routed to a repair node.
398
+ if (parsed.artifact.verdict === "request-revision") {
399
+ throw new Error(`repair artifact gate failed: ${resolution.reason}`);
400
+ }
401
+ return;
402
+ }
403
+ const scoped = validateRepairArtifactScope({
404
+ artifact: parsed.artifact,
405
+ repairTask: resolution.repairTask,
406
+ });
407
+ if (!scoped.ok) {
408
+ throw new Error(`repair artifact gate failed: ${scoped.reason}`);
409
+ }
410
+ }
411
+ function recordRepairArtifactForSupervisorNode(input) {
412
+ const dependentGate = Object.values(input.state.nodes).find((record) => record.id === "process-gate-shell");
413
+ if (input.task.id !== "process-supervisor-pi" || !dependentGate)
414
+ return;
415
+ const parsed = parseSupervisorRepairArtifact(input.node);
416
+ if (parsed.ok) {
417
+ input.node.repairArtifact = parsed.artifact;
418
+ }
419
+ }
420
+ function sleep(ms) {
421
+ return new Promise((resolve) => setTimeout(resolve, ms));
422
+ }
423
+ function durationBetween(startedAt, finishedAt) {
424
+ const started = startedAt ? new Date(startedAt).getTime() : Number.NaN;
425
+ const finished = finishedAt ? new Date(finishedAt).getTime() : Number.NaN;
426
+ return Number.isFinite(started) && Number.isFinite(finished)
427
+ ? Math.max(0, finished - started)
428
+ : 0;
429
+ }
430
+ function sumAttemptMetric(attempts, select) {
431
+ const values = attempts.map(select).filter((value) => value !== undefined);
432
+ return values.length > 0
433
+ ? values.reduce((sum, value) => sum + value, 0)
434
+ : undefined;
435
+ }
436
+ async function notifyNodeObserver(observer, event, nodeId, state, chunk) {
437
+ try {
438
+ if (event === "onNodeOutput") {
439
+ await observer?.onNodeOutput?.(nodeId, chunk ?? "", state);
440
+ return;
441
+ }
442
+ await observer?.[event]?.(nodeId, state);
443
+ }
444
+ catch {
445
+ // Observers are derived views; they must not affect canonical DAG execution.
446
+ }
447
+ }
448
+ export async function executeDagNode(input) {
449
+ const { nodeId, tasksById, state, spec, cwd, runDir, executeNode } = input;
450
+ let task = tasksById.get(nodeId);
451
+ const node = state.nodes[nodeId];
452
+ const failBeforePrompt = async (error, failureCategory) => {
453
+ const failedAt = new Date().toISOString();
454
+ node.startedAt ??= failedAt;
455
+ node.status = "ERROR";
456
+ node.stderr = error instanceof Error ? error.message : String(error);
457
+ node.failureCategory = failureCategory;
458
+ node.finishedAt = failedAt;
459
+ node.lastActivityAt = node.finishedAt;
460
+ node.durationMs = durationBetween(node.startedAt, node.finishedAt);
461
+ node.timing = { retryBackoffMs: 0, settlementCleanupMs: 0 };
462
+ state.nodes[nodeId].nodeRecordPath = path.join(runDir, `${nodeId}.json`);
463
+ await writeNodeRecord(runDir, nodeId, state.nodes[nodeId]);
464
+ await input.persistState();
465
+ await notifyNodeObserver(input.observer, "onNodeFinish", nodeId, state);
466
+ };
467
+ const failSkillSnapshot = (error) => failBeforePrompt(error, "skill-snapshot-integrity");
468
+ const skipFrontendWriter = async (admission) => {
469
+ const skippedAt = new Date().toISOString();
470
+ node.startedAt ??= skippedAt;
471
+ node.frontendWriterAdmission = admission;
472
+ node.status = "SKIPPED";
473
+ node.skippedReason = "frontend-prewrite-not-authorized";
474
+ node.finishedAt = skippedAt;
475
+ node.lastActivityAt = skippedAt;
476
+ node.durationMs = durationBetween(node.startedAt, node.finishedAt);
477
+ node.timing = { retryBackoffMs: 0, settlementCleanupMs: 0 };
478
+ state.nodes[nodeId].nodeRecordPath = path.join(runDir, `${nodeId}.json`);
479
+ await writeNodeRecord(runDir, nodeId, state.nodes[nodeId]);
480
+ await input.persistState();
481
+ await notifyNodeObserver(input.observer, "onNodeFinish", nodeId, state);
482
+ };
483
+ if (task.finalWriteSetApproval) {
484
+ const authorization = parseAndValidateFinalWriteSetApproval({ task, spec, state });
485
+ if (!authorization.ok) {
486
+ node.runtimeWriteAuthorization = {
487
+ schemaVersion: 1,
488
+ status: "rejected",
489
+ approvalSourceNodeId: authorization.approvalSourceNodeId,
490
+ reason: authorization.reason,
491
+ };
492
+ await failBeforePrompt(new Error(`final-write-set-approval-invalid: ${authorization.reason}`), "final-write-set-approval-invalid");
493
+ return;
494
+ }
495
+ task = {
496
+ ...task,
497
+ writeSet: authorization.effectiveWriteSet,
498
+ resolvedFinalWriteSetApproval: {
499
+ approvalDigest: authorization.approvalDigest,
500
+ approvalSourceNodeId: task.finalWriteSetApproval.approvalSourceNodeId,
501
+ },
502
+ };
503
+ node.runtimeWriteAuthorization = {
504
+ schemaVersion: 1,
505
+ status: "validated",
506
+ approvalSourceNodeId: task.finalWriteSetApproval.approvalSourceNodeId,
507
+ approvalDigest: authorization.approvalDigest,
508
+ effectiveWriteSet: [...authorization.effectiveWriteSet],
509
+ };
510
+ }
511
+ if (FRONTEND_WRITER_NODE_IDS.includes(nodeId)) {
512
+ const admission = await readFrontendPrewriteResult(runDir);
513
+ if (!admission.ok) {
514
+ await skipFrontendWriter(undefined);
515
+ return;
516
+ }
517
+ const decision = isFrontendWriterAuthorized(admission.result);
518
+ const record = {
519
+ schemaVersion: 1,
520
+ writerNodeId: nodeId,
521
+ decision,
522
+ sourceArtifact: FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT,
523
+ artifactHash: admission.artifactHash,
524
+ checkedAt: new Date().toISOString(),
525
+ reason: decision === "denied"
526
+ ? `classification: ${admission.result.classification}`
527
+ : null,
528
+ };
529
+ if (decision === "denied") {
530
+ await skipFrontendWriter(record);
531
+ return;
532
+ }
533
+ node.frontendWriterAdmission = record;
534
+ }
535
+ let projectGovernanceContext;
536
+ if (task.governanceStandardReview) {
537
+ try {
538
+ const changeManifest = await readCompletedWriterChangeManifests({
539
+ runDir,
540
+ spec,
541
+ state,
542
+ });
543
+ projectGovernanceContext = await buildProjectGovernanceContext({
544
+ runId: state.runId,
545
+ cwd,
546
+ changeManifest,
547
+ runDir,
548
+ });
549
+ state.projectGovernanceContextRef = await writeProjectGovernanceContext(runDir, projectGovernanceContext);
550
+ await input.persistState();
551
+ }
552
+ catch (error) {
553
+ await failBeforePrompt(error, "project-governance-integrity");
554
+ return;
555
+ }
556
+ }
557
+ const isDynamicTask = Boolean(task.dynamicExpansion ||
558
+ task.dynamicReduction ||
559
+ task.dynamicCondition ||
560
+ task.dynamicLoopUntil);
561
+ let snapshotPrompt;
562
+ if (state.skillSnapshotRef) {
563
+ try {
564
+ const skillSnapshot = await readSkillSnapshot(runDir, state.skillSnapshotRef, {
565
+ expectedRunId: state.runId,
566
+ });
567
+ assertSkillSnapshotCoversSpec(skillSnapshot, spec, state);
568
+ if (!isDynamicTask) {
569
+ snapshotPrompt = buildNodePromptFromSnapshot({
570
+ spec,
571
+ task,
572
+ upstream: state.nodes,
573
+ snapshot: skillSnapshot,
574
+ projectGovernanceContext,
575
+ });
576
+ const feedbackBlock = formatConvergenceFeedbackBlock(deriveConvergenceFeedback(state));
577
+ if (feedbackBlock &&
578
+ (task.role === "supervisor" ||
579
+ task.role === "implementer" ||
580
+ task.id === "process-supervisor-pi" ||
581
+ task.id === "repair-pi")) {
582
+ snapshotPrompt = {
583
+ ...snapshotPrompt,
584
+ prompt: `${snapshotPrompt.prompt}\n\n<convergence_feedback>\n${feedbackBlock}\n</convergence_feedback>`,
585
+ };
586
+ }
587
+ }
588
+ }
589
+ catch (error) {
590
+ await failSkillSnapshot(error);
591
+ return;
592
+ }
593
+ }
594
+ node.status = "RUNNING";
595
+ node.startedAt = new Date().toISOString();
596
+ node.lastActivityAt = node.startedAt;
597
+ node.lastMeaningfulProgressAt = node.startedAt;
598
+ node.livenessStatus = "active";
599
+ node.currentAttempt = 1;
600
+ if (task.shell?.verifyEvidence) {
601
+ node.verifyEvidence = task.shell.verifyEvidence;
602
+ }
603
+ await input.persistState();
604
+ await notifyNodeObserver(input.observer, "onNodeStart", nodeId, state);
605
+ if (isDynamicTask) {
606
+ const dynamicExecutionStartedAt = new Date().toISOString();
607
+ try {
608
+ const result = await input.executeDynamicNode({
609
+ task,
610
+ tasksById,
611
+ state,
612
+ spec,
613
+ cwd,
614
+ runDir,
615
+ executeNode,
616
+ observer: input.observer,
617
+ persistState: input.persistState,
618
+ });
619
+ node.stdout = result.stdout;
620
+ node.stderr = result.stderr;
621
+ node.failureCategory = result.failureCategory;
622
+ node.status = result.ok ? "FINISHED" : "ERROR";
623
+ }
624
+ catch (error) {
625
+ node.status = "ERROR";
626
+ node.stderr = error instanceof Error ? error.message : String(error);
627
+ }
628
+ const dynamicExecutionFinishedAt = new Date().toISOString();
629
+ const dynamicExecutionWallDurationMs = durationBetween(dynamicExecutionStartedAt, dynamicExecutionFinishedAt);
630
+ if (node.status === "FINISHED") {
631
+ const artifactMeta = await persistLongNodeOutputArtifacts({
632
+ runDir,
633
+ nodeId,
634
+ stdout: node.stdout,
635
+ assistantText: node.assistantText,
636
+ });
637
+ Object.assign(node, artifactMeta);
638
+ }
639
+ const dynamicFinishedAt = new Date().toISOString();
640
+ node.finishedAt = dynamicFinishedAt;
641
+ node.lastActivityAt = dynamicFinishedAt;
642
+ node.durationMs = durationBetween(node.startedAt, dynamicFinishedAt);
643
+ node.timing = {
644
+ retryBackoffMs: 0,
645
+ settlementCleanupMs: Math.max(0, node.durationMs - dynamicExecutionWallDurationMs),
646
+ };
647
+ state.nodes[nodeId].nodeRecordPath = path.join(runDir, `${nodeId}.json`);
648
+ await writeNodeRecord(runDir, nodeId, state.nodes[nodeId]);
649
+ await input.persistState();
650
+ await notifyNodeObserver(input.observer, "onNodeFinish", nodeId, state);
651
+ return;
652
+ }
653
+ let prompt;
654
+ let resolvedSkills;
655
+ try {
656
+ if (snapshotPrompt) {
657
+ prompt = snapshotPrompt.prompt;
658
+ resolvedSkills = snapshotPrompt.resolvedSkills;
659
+ }
660
+ else {
661
+ ({ prompt, resolvedSkills } =
662
+ await buildNodePromptWithResolvedSkillInstructions(spec, task, state.nodes, cwd, {
663
+ projectGovernanceContext,
664
+ convergenceFeedback: deriveConvergenceFeedback(state),
665
+ }));
666
+ }
667
+ }
668
+ catch (error) {
669
+ if (!isDagSkillSnapshotIntegrityError(error))
670
+ throw error;
671
+ await failSkillSnapshot(error);
672
+ return;
673
+ }
674
+ node.resolvedSkills = resolvedSkills;
675
+ await writeNodeSkillArtifacts(runDir, nodeId, resolvedSkills);
676
+ const model = resolveModelForTask(task, spec.executorModels);
677
+ let thinking;
678
+ if (task.executor === "pi") {
679
+ try {
680
+ const manifest = await loadHarnessManifest(cwd);
681
+ thinking = resolveExecutorThinkingMatrix(manifest.executors?.pi)[task.complexity];
682
+ }
683
+ catch {
684
+ // Invalid or missing harness preserves the previous no-override behavior.
685
+ }
686
+ }
687
+ const retryPolicy = task.retryPolicy &&
688
+ (isSafeReadOnlyPiRetryCandidate(task) ||
689
+ isWriterEmptyDiffRetryCandidate(task) ||
690
+ isWriterTransportRetryCandidate(task))
691
+ ? task.retryPolicy
692
+ : undefined;
693
+ const maxAttempts = retryPolicy?.maxAttempts ?? 1;
694
+ const attempts = [];
695
+ let totalAttemptWallDurationMs = 0;
696
+ let totalBackoffMs = 0;
697
+ const livenessPolicy = resolveLivenessPolicy(spec.defaults?.livenessPolicy, task.livenessPolicy);
698
+ /**
699
+ * Attempt-fenced, throttled activity sink. Late events from a previous
700
+ * attempt are no-ops. Persistence is best-effort and never throws to the
701
+ * executor path.
702
+ */
703
+ const ACTIVITY_PERSIST_MIN_INTERVAL_MS = 2_000;
704
+ let lastActivityPersistMs = 0;
705
+ const reportActivity = (activity) => {
706
+ const accepted = applyNodeActivity({
707
+ node,
708
+ currentAttempt: node.currentAttempt ?? 1,
709
+ activityAttempt: activity.attempt,
710
+ kind: activity.kind,
711
+ at: activity.at,
712
+ });
713
+ if (!accepted)
714
+ return;
715
+ const evaluation = evaluateNodeLiveness({
716
+ node,
717
+ policy: livenessPolicy,
718
+ runnerHeartbeatAt: state.runner?.heartbeatAt,
719
+ });
720
+ node.livenessStatus = evaluation.status;
721
+ const nowMs = Date.now();
722
+ if (nowMs - lastActivityPersistMs < ACTIVITY_PERSIST_MIN_INTERVAL_MS) {
723
+ return;
724
+ }
725
+ lastActivityPersistMs = nowMs;
726
+ // Canonical mid-call activity lives in active state.json. Queue through the
727
+ // runner's serialized state writer; per-node records remain terminal/attempt
728
+ // evidence so a late best-effort write cannot recreate an archived run dir.
729
+ void input.persistState().catch(() => { });
730
+ };
731
+ let terminalResult;
732
+ let previousFailureCategory;
733
+ let previousProtocolReason;
734
+ for (let attemptNumber = 1; attemptNumber <= maxAttempts; attemptNumber += 1) {
735
+ const attemptStartedAt = new Date().toISOString();
736
+ node.currentAttempt = attemptNumber;
737
+ node.livenessStatus = "active";
738
+ let result;
739
+ try {
740
+ validateRepairArtifactGateBeforeShell({
741
+ task,
742
+ tasksById,
743
+ state,
744
+ });
745
+ // For backend-test generation writers, load the most recent
746
+ // completeness progress from the run dir so the next attempt's
747
+ // prompt embeds concrete target paths. Undefined for non-writers
748
+ // or when no progress facts exist yet (no-op).
749
+ const recoveryProgress = await loadBackendTestWriterProgressForRetry(runDir, task.id);
750
+ const recoveryTargetPaths = recoveryProgress?.targetPaths;
751
+ // Fold per-path structural reasons (e.g. T5 "case heading at wrong
752
+ // level") into the retry prompt so the model fixes the exact defect
753
+ // instead of guessing from a generic hint.
754
+ const recoveryDiagnostics = recoveryProgress?.issues
755
+ ?.filter((i) => !!i.path && i.recoverable)
756
+ .reduce((acc, i) => {
757
+ (acc[i.path] ??= []).push(i.detail);
758
+ return acc;
759
+ }, {});
760
+ result = await executeNode({
761
+ task,
762
+ cwd,
763
+ model,
764
+ ...(thinking ? { thinking } : {}),
765
+ prompt: buildAttemptPrompt(task, prompt, attemptNumber, previousFailureCategory, previousProtocolReason, recoveryTargetPaths, recoveryDiagnostics),
766
+ attempt: attemptNumber,
767
+ reportActivity,
768
+ timeoutMs: livenessPolicy.absoluteMaxWallClockMs,
769
+ stallTimeoutMs: livenessPolicy.stallProbeMs,
770
+ abortGraceMs: livenessPolicy.abortGraceMs,
771
+ });
772
+ }
773
+ catch (error) {
774
+ result = {
775
+ ok: false,
776
+ stdout: "",
777
+ stderr: error instanceof Error ? error.message : String(error),
778
+ durationMs: 0,
779
+ };
780
+ }
781
+ // R0: executor ok=true still fails closed when outputProtocol is violated.
782
+ // Valid semantic results (e.g. VERDICT: request-revision) pass validation.
783
+ if (result.ok && task.outputProtocol) {
784
+ const protocolText = canonicalNodeOutput(result);
785
+ const protocolCheck = validateOutputProtocol(task.outputProtocol, protocolText);
786
+ if (!protocolCheck.ok) {
787
+ result = {
788
+ ...result,
789
+ ok: false,
790
+ failureCategory: protocolCheck.failureCategory,
791
+ stderr: [result.stderr, protocolCheck.reason]
792
+ .filter(Boolean)
793
+ .join("\n"),
794
+ };
795
+ previousProtocolReason = protocolCheck.reason;
796
+ }
797
+ else {
798
+ previousProtocolReason = undefined;
799
+ }
800
+ }
801
+ // R1: structured contract nodes self-validate their output so schema,
802
+ // typo, and null violations surface as retryable invalid-output at the
803
+ // producing node instead of failing the whole run at the prewrite gate.
804
+ if (result.ok && task.structuredContractOutput) {
805
+ const validator = getStructuredContractValidator(task.structuredContractOutput.schemaId);
806
+ if (validator) {
807
+ const contractText = canonicalNodeOutput(result);
808
+ const contractCheck = await validator({
809
+ runDir,
810
+ text: contractText,
811
+ sourceBinding: spec.sourceBinding,
812
+ nodeId,
813
+ attempt: attemptNumber,
814
+ structuredContractOutput: task.structuredContractOutput,
815
+ });
816
+ if (!contractCheck.ok) {
817
+ // A provider stopReason=length means the response was cut before the
818
+ // JSON contract could complete; separate it from an ordinary bad
819
+ // contract so the retry switches to a JSON-only output strategy.
820
+ const attemptStopReason = result.stopReason;
821
+ result = {
822
+ ...result,
823
+ ok: false,
824
+ failureCategory: attemptStopReason === "length"
825
+ ? "structured-output-truncated"
826
+ : "invalid-output",
827
+ stderr: [result.stderr, contractCheck.reason]
828
+ .filter(Boolean)
829
+ .join("\n"),
830
+ };
831
+ previousProtocolReason = contractCheck.reason;
832
+ }
833
+ else {
834
+ if (contractCheck.normalizedText) {
835
+ result = {
836
+ ...result,
837
+ assistantText: contractCheck.normalizedText,
838
+ stdout: contractCheck.normalizedText,
839
+ };
840
+ }
841
+ previousProtocolReason = undefined;
842
+ }
843
+ }
844
+ else {
845
+ // DAG spec validation rejects unknown schemaIds; this is a
846
+ // defensive fallback for a registry that has not been populated.
847
+ console.warn(`[run-dag] warning: no structured contract validator registered for schemaId ${task.structuredContractOutput.schemaId}; skipping node self-check`);
848
+ }
849
+ }
850
+ const attemptFinishedAt = new Date().toISOString();
851
+ const attemptWallDurationMs = durationBetween(attemptStartedAt, attemptFinishedAt);
852
+ totalAttemptWallDurationMs += attemptWallDurationMs;
853
+ const attemptRecord = {
854
+ attempt: attemptNumber,
855
+ startedAt: attemptStartedAt,
856
+ finishedAt: attemptFinishedAt,
857
+ durationMs: attemptWallDurationMs,
858
+ timing: { executorDurationMs: result.durationMs },
859
+ ok: result.ok,
860
+ stdout: result.stdout,
861
+ stderr: result.stderr,
862
+ assistantText: result.assistantText,
863
+ failureCategory: result.failureCategory,
864
+ backend: result.backend,
865
+ sdkAttempted: result.sdkAttempted,
866
+ tokensUsed: result.tokensUsed,
867
+ parsedEvents: result.parsedEvents,
868
+ artifactPath: `${nodeId}/attempt-${attemptNumber}.json`,
869
+ };
870
+ if (retryPolicy !== undefined) {
871
+ attempts.push(attemptRecord);
872
+ // Persist immutable attempt evidence BEFORE waiting for the next attempt
873
+ // and before applying the result to the node record, so a later success
874
+ // never overwrites prior failure evidence.
875
+ await writeDagNodeJsonArtifact(runDir, nodeId, `attempt-${attemptNumber}.json`, attemptRecord);
876
+ node.attempts = attempts;
877
+ }
878
+ // Reflect the latest attempt on the node so progress is observable,
879
+ // but keep node.status RUNNING while retry is still possible.
880
+ node.durationMs = durationBetween(node.startedAt, attemptFinishedAt);
881
+ node.stdout = result.stdout;
882
+ node.stderr = result.stderr;
883
+ node.failureCategory = result.failureCategory;
884
+ node.assistantText = result.assistantText;
885
+ node.backend = result.backend;
886
+ node.sdkAttempted = result.sdkAttempted;
887
+ node.tokensUsed =
888
+ retryPolicy === undefined
889
+ ? result.tokensUsed
890
+ : sumAttemptMetric(attempts, (attempt) => attempt.tokensUsed);
891
+ node.parsedEvents =
892
+ retryPolicy === undefined
893
+ ? result.parsedEvents
894
+ : sumAttemptMetric(attempts, (attempt) => attempt.parsedEvents);
895
+ node.lastActivityAt = attemptFinishedAt;
896
+ if (result.failureCategory === "termination-unconfirmed") {
897
+ node.needsAttentionReason = "attempt-termination-unconfirmed";
898
+ node.livenessStatus = "needs-attention";
899
+ }
900
+ if (retryPolicy !== undefined) {
901
+ state.nodes[nodeId].nodeRecordPath = path.join(runDir, `${nodeId}.json`);
902
+ await writeNodeRecord(runDir, nodeId, state.nodes[nodeId]);
903
+ await input.persistState();
904
+ }
905
+ terminalResult = result;
906
+ previousFailureCategory = result.failureCategory;
907
+ if (result.ok)
908
+ break;
909
+ const canRetry = retryPolicy !== undefined && attemptNumber < maxAttempts;
910
+ const retryable = retryPolicy !== undefined &&
911
+ (isRetryablePiFailureCategory(result.failureCategory, {
912
+ retryCategories: retryPolicy.retryCategories,
913
+ }) ||
914
+ (result.failureCategory === "protocol-invalid" &&
915
+ task.outputProtocol?.retryOnInvalid === true));
916
+ if (!canRetry || !retryable)
917
+ break;
918
+ const delayMs = computeBackoffDelayMs(attemptNumber + 1, retryPolicy);
919
+ if (delayMs > 0) {
920
+ const backoffStartedAt = new Date().toISOString();
921
+ await sleep(delayMs);
922
+ const backoffFinishedAt = new Date().toISOString();
923
+ totalBackoffMs += durationBetween(backoffStartedAt, backoffFinishedAt);
924
+ // Keep lastActivityAt fresh so backoff wait is not misread as node-quiet.
925
+ node.lastActivityAt = new Date().toISOString();
926
+ state.nodes[nodeId].nodeRecordPath = path.join(runDir, `${nodeId}.json`);
927
+ await writeNodeRecord(runDir, nodeId, state.nodes[nodeId]);
928
+ await input.persistState();
929
+ }
930
+ }
931
+ // AC2: after retries are exhausted on a canonical review verdict protocol
932
+ // node, attempt one deterministic normalization of the full terminal output.
933
+ // This ONLY re-wraps output so the first non-empty line is the single
934
+ // supported verdict; it never changes the verdict value, and missing /
935
+ // duplicated / conflicting / illegal verdicts remain protocol-invalid.
936
+ // Shell, write-guard, timeout, and model failures are never normalized.
937
+ if (terminalResult &&
938
+ !terminalResult.ok &&
939
+ terminalResult.failureCategory === "protocol-invalid" &&
940
+ task.outputProtocol) {
941
+ const fullText = terminalResult.assistantText &&
942
+ terminalResult.assistantText.trim().length > 0
943
+ ? terminalResult.assistantText
944
+ : (terminalResult.stdout ?? "");
945
+ const normalized = normalizeReviewVerdictAfterRetries(task.outputProtocol, fullText);
946
+ if (normalized.ok) {
947
+ const normalizedText = normalized.normalizedOutput;
948
+ terminalResult = {
949
+ ...terminalResult,
950
+ ok: true,
951
+ failureCategory: undefined,
952
+ assistantText: normalizedText,
953
+ stdout: normalizedText,
954
+ stderr: [
955
+ terminalResult.stderr,
956
+ `verdict normalized after retries exhausted: ${normalized.verdictLine}`,
957
+ ]
958
+ .filter(Boolean)
959
+ .join("\n"),
960
+ };
961
+ // Sync the observable node fields so downstream gates and reports see the
962
+ // normalized first-line verdict while the original evidence is preserved.
963
+ node.assistantText = normalizedText;
964
+ node.stdout = normalizedText;
965
+ node.failureCategory = undefined;
966
+ node.stderr = terminalResult.stderr;
967
+ }
968
+ }
969
+ const result = terminalResult;
970
+ try {
971
+ recordRepairArtifactForSupervisorNode({
972
+ task,
973
+ node,
974
+ state,
975
+ });
976
+ const outputChunk = result.assistantText ?? result.stdout;
977
+ if (outputChunk.trim()) {
978
+ await notifyNodeObserver(input.observer, "onNodeOutput", nodeId, state, outputChunk);
979
+ }
980
+ node.status = result.ok ? "FINISHED" : "ERROR";
981
+ if (result.ok) {
982
+ const decisionRecord = await recordDecisionEnvelopeForNode({
983
+ task,
984
+ runDir,
985
+ nodeId,
986
+ assistantText: node.assistantText ?? result.assistantText,
987
+ });
988
+ if (decisionRecord) {
989
+ node.decisionEnvelope = decisionRecord.nodeRecord;
990
+ if (!decisionRecord.nodeRecord.parseOk) {
991
+ node.status = "ERROR";
992
+ node.failureCategory = "decision-envelope-invalid";
993
+ node.stderr = [
994
+ node.stderr,
995
+ ...(decisionRecord.nodeRecord.errors ?? []),
996
+ ]
997
+ .filter(Boolean)
998
+ .join("\n");
999
+ }
1000
+ else if (shouldPauseOnHumanEscalation(task, decisionRecord.nodeRecord) &&
1001
+ decisionRecord.envelope) {
1002
+ const pausedAt = new Date().toISOString();
1003
+ const nodeArtifactsDir = path.join(runDir, nodeId);
1004
+ const { jsonPath } = await writeHumanEscalationArtifacts({
1005
+ nodeArtifactsDir,
1006
+ runId: state.runId,
1007
+ nodeId,
1008
+ envelope: decisionRecord.envelope,
1009
+ pausedAt,
1010
+ });
1011
+ node.pauseReason = "decision-gate-requires-human";
1012
+ node.escalationArtifactPath = jsonPath;
1013
+ input.onPause(nodeId, pausedAt, node.pauseReason);
1014
+ }
1015
+ }
1016
+ }
1017
+ }
1018
+ catch (error) {
1019
+ node.status = "ERROR";
1020
+ node.stderr = error instanceof Error ? error.message : String(error);
1021
+ }
1022
+ // Attempt artifacts must observe their own persisted boundaries before the
1023
+ // potentially asynchronous artifact write; post-attempt work belongs to node timing.
1024
+ const terminalFinishedAt = new Date().toISOString();
1025
+ node.finishedAt = terminalFinishedAt;
1026
+ node.lastActivityAt = terminalFinishedAt;
1027
+ node.durationMs = durationBetween(node.startedAt, terminalFinishedAt);
1028
+ node.timing = {
1029
+ retryBackoffMs: totalBackoffMs,
1030
+ settlementCleanupMs: Math.max(0, durationBetween(node.startedAt, terminalFinishedAt) -
1031
+ totalAttemptWallDurationMs -
1032
+ totalBackoffMs),
1033
+ };
1034
+ if (node.status === "FINISHED") {
1035
+ const artifactMeta = await persistLongNodeOutputArtifacts({
1036
+ runDir,
1037
+ nodeId,
1038
+ stdout: node.stdout,
1039
+ assistantText: node.assistantText,
1040
+ });
1041
+ Object.assign(node, artifactMeta);
1042
+ if (task.shell?.jsonArtifactGate) {
1043
+ const artifactPath = path.join(runDir, task.shell.jsonArtifactGate.outputDir, task.shell.jsonArtifactGate.artifactName);
1044
+ const bytes = await readFile(artifactPath);
1045
+ node.structuredArtifactPath = artifactPath;
1046
+ node.structuredArtifactSha256 = createHash("sha256")
1047
+ .update(bytes)
1048
+ .digest("hex");
1049
+ node.structuredArtifactSchemaId = task.shell.jsonArtifactGate.schemaId;
1050
+ }
1051
+ else if (task.shell?.backendTestPipeline === "classification-result-context" ||
1052
+ task.shell?.backendTestPipeline === "markdown-execute-html") {
1053
+ // Legacy 15-node and Markdown-first 8-node pipelines materialize
1054
+ // contracts/backend-test-result.json without jsonArtifactGate. Bind it
1055
+ // so Outcome adapters project kind=backend-test-result for Ready Planner.
1056
+ const artifactPath = path.join(runDir, "contracts", "backend-test-result.json");
1057
+ if (existsSync(artifactPath)) {
1058
+ const bytes = await readFile(artifactPath);
1059
+ node.structuredArtifactPath = artifactPath;
1060
+ node.structuredArtifactSha256 = createHash("sha256")
1061
+ .update(bytes)
1062
+ .digest("hex");
1063
+ node.structuredArtifactSchemaId = "backend-test-result-v1";
1064
+ }
1065
+ }
1066
+ }
1067
+ const finishedAt = new Date().toISOString();
1068
+ node.finishedAt = finishedAt;
1069
+ node.lastActivityAt = finishedAt;
1070
+ node.durationMs = durationBetween(node.startedAt, finishedAt);
1071
+ node.timing = {
1072
+ ...node.timing,
1073
+ settlementCleanupMs: Math.max(0, durationBetween(node.startedAt, finishedAt) -
1074
+ totalAttemptWallDurationMs -
1075
+ totalBackoffMs),
1076
+ };
1077
+ state.nodes[nodeId].nodeRecordPath = path.join(runDir, `${nodeId}.json`);
1078
+ await writeNodeRecord(runDir, nodeId, state.nodes[nodeId]);
1079
+ await input.persistState();
1080
+ await notifyNodeObserver(input.observer, "onNodeFinish", nodeId, state);
1081
+ }