@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,1069 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { randomUUID } from "node:crypto";
3
+ import { writeJsonAtomic } from "../../infrastructure/harness/atomic-write.js";
4
+ import { hostname } from "node:os";
5
+ import path from "node:path";
6
+ import { isHardBudgetBreached, resolveEffectiveMaxConcurrent, } from "../../application/evaluation/budget.js";
7
+ import { readCandidateRecord } from "../../infrastructure/evaluation/candidate-store.js";
8
+ import { CANONICAL_TASK_ID_PATTERN, formatLocalCompactDate, } from "../../task/runtime.js";
9
+ import { assertFrozenBudget, initRunBudgetLedger, preflightBudgetOrBreach, recordFinishedNodeBudget, writeBudgetLedgerArtifacts, } from "./budget-enforcement.js";
10
+ import { getDagRunDir, isTerminalDagRunStatus, locateDagRun, readDagRunSpec, readDagRunState, readHumanApprovalArtifact, requireActiveDagRun, } from "./lifecycle.js";
11
+ import { markInterruptNeedsReconcile, mergeAbortSignals, readInterruptRequest, runnerIdentityFromState, settleDagInterrupt, startInterruptWatcher, } from "./interrupt-request.js";
12
+ import { moveToCompletedRunDir, moveToPausedRunDir, prepareRunDir, writeRunSpec, writeRunState, } from "./run-store.js";
13
+ import { evaluateNodeLiveness, resolveLivenessPolicy, } from "./liveness-policy.js";
14
+ import { createDagNodeExecutor } from "./executor-registry.js";
15
+ import { executeDagPiNode } from "../../executors/dag-pi-executor.js";
16
+ import { assertValidDagSpec } from "./validate.js";
17
+ import { assertRuntimeContractCompatible, DAG_CONTROLLER_CAPABILITIES, } from "./runtime-contract.js";
18
+ import { captureControllerIdentity, verifyControllerIdentityForResume, } from "./controller-identity.js";
19
+ import { resolveRunningControllerIdentity } from "../../shared/package-metadata.js";
20
+ import { normalizeDagPromptSources } from "./prompt-source.js";
21
+ import { relocateConvergenceArtifactPaths, relocateRunArtifactPaths, } from "./upstream-artifacts.js";
22
+ import { createSkillSnapshot, prepareSkillSnapshotForContinuation, writeSkillSnapshot, } from "./skill-snapshot.js";
23
+ import { captureWorkspaceCheckpoint, WORKSPACE_CHECKPOINT_START_REL, WORKSPACE_CHECKPOINT_TERMINAL_REL, writeWorkspaceCheckpoint, } from "./workspace-checkpoint.js";
24
+ import { buildNodePrompt, buildNodePromptWithResolvedSkillInstructions, executeDagNode, } from "./node-execution.js";
25
+ import { runConvergencePassController, } from "./convergence/controller.js";
26
+ import { executeDagRanksOnce, FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT, FRONTEND_WRITER_NODE_IDS, isConditionSkippedReason, readFrontendPrewriteResult, } from "./scheduler.js";
27
+ import { topoSortToRanks } from "./topo.js";
28
+ import { isFrontendWriterTransientPartialWrite } from "./frontend-writer-recovery.js";
29
+ import { parseDagSpec, resolveModelForTask, } from "./types.js";
30
+ import { executeDynamicCondition } from "./dynamic-runtime/condition.js";
31
+ import { executeDynamicLoopUntil } from "./dynamic-runtime/loop-until.js";
32
+ import { executeDynamicMapExpansion } from "./dynamic-runtime/map.js";
33
+ import { executeDynamicReduction } from "./dynamic-runtime/reduction.js";
34
+ export { buildNodePrompt, buildNodePromptWithResolvedSkillInstructions };
35
+ export async function loadDagSpecFromFile(dagPath) {
36
+ const raw = JSON.parse(await readFile(dagPath, "utf-8"));
37
+ const normalized = await normalizeDagPromptSources(raw, path.dirname(dagPath));
38
+ return parseDagSpec(normalized);
39
+ }
40
+ export const CANONICAL_DAG_RUN_ID_PATTERN = /^\d{8}-[a-z0-9]+(-[a-z0-9]+)*$/;
41
+ const TASK_ID_IN_TEXT_PATTERN = /\d{4}-\d{2}-\d{2}-[a-z0-9]+(?:-[a-z0-9]+)*/g;
42
+ export function toKebabSlug(text, maxLen = 40) {
43
+ return (text
44
+ .toLowerCase()
45
+ .replace(/[^a-z0-9]+/g, "-")
46
+ .replace(/^-|-$/g, "")
47
+ .slice(0, maxLen) || "dag");
48
+ }
49
+ export function extractTaskIdFromDagSpec(spec) {
50
+ if (spec.objective) {
51
+ const match = spec.objective.match(TASK_ID_IN_TEXT_PATTERN);
52
+ if (match)
53
+ return match[0];
54
+ }
55
+ for (const line of spec.globalConstraints ?? []) {
56
+ const match = line.match(TASK_ID_IN_TEXT_PATTERN);
57
+ if (match)
58
+ return match[0];
59
+ }
60
+ return undefined;
61
+ }
62
+ export function deriveDagRunSlug(spec) {
63
+ const taskId = extractTaskIdFromDagSpec(spec);
64
+ if (taskId && CANONICAL_TASK_ID_PATTERN.test(taskId)) {
65
+ return taskId.slice(11);
66
+ }
67
+ return toKebabSlug(spec.title);
68
+ }
69
+ export function validateDagRunIdFormat(runId) {
70
+ const warnings = [];
71
+ if (!CANONICAL_DAG_RUN_ID_PATTERN.test(runId)) {
72
+ warnings.push(`run-id "${runId}" does not match canonical YYYYMMDD-<slug>; legacy run facts remain readable`);
73
+ }
74
+ return { warnings };
75
+ }
76
+ async function listExistingDagRunIds(cwd) {
77
+ const ids = new Set();
78
+ for (const lifecycle of ["active", "completed", "paused"]) {
79
+ const dir = path.join(cwd, ".harness", "dag-runs", lifecycle);
80
+ try {
81
+ const entries = await readdir(dir);
82
+ for (const entry of entries) {
83
+ if (entry !== ".gitkeep")
84
+ ids.add(entry);
85
+ }
86
+ }
87
+ catch {
88
+ // lifecycle dir may not exist in minimal fixtures.
89
+ }
90
+ }
91
+ return ids;
92
+ }
93
+ export function collisionSafeDagRunId(baseId, existing, now = new Date()) {
94
+ if (!existing.has(baseId))
95
+ return baseId;
96
+ for (let round = 2; round <= 99; round += 1) {
97
+ const candidate = `${baseId}-r${round}`;
98
+ if (!existing.has(candidate))
99
+ return candidate;
100
+ }
101
+ const hh = String(now.getHours()).padStart(2, "0");
102
+ const mm = String(now.getMinutes()).padStart(2, "0");
103
+ const ss = String(now.getSeconds()).padStart(2, "0");
104
+ const timed = `${baseId}-${hh}${mm}${ss}`;
105
+ if (!existing.has(timed))
106
+ return timed;
107
+ return `${timed}-r2`;
108
+ }
109
+ export async function buildDagRunId(spec, options) {
110
+ const now = options?.now ?? new Date();
111
+ const datePrefix = formatLocalCompactDate(now);
112
+ const baseId = `${datePrefix}-${deriveDagRunSlug(spec)}`;
113
+ if (!options?.cwd)
114
+ return baseId;
115
+ const existing = await listExistingDagRunIds(options.cwd);
116
+ return collisionSafeDagRunId(baseId, existing, now);
117
+ }
118
+ /**
119
+ * Append a human-readable round label to a run title when the runId carries
120
+ * a `-rN` collision suffix (2026-08-16): the sidebar / Inspect list showed
121
+ * identical titles for reruns and only the id hinted at the round.
122
+ */
123
+ export function titleWithRoundLabel(title, runId) {
124
+ const match = /-r(\d{1,2})$/.exec(runId);
125
+ if (!match)
126
+ return title;
127
+ const round = Number.parseInt(match[1], 10);
128
+ if (!Number.isFinite(round) || round < 2)
129
+ return title;
130
+ // Never stack labels on reruns of reruns.
131
+ const base = title.replace(/\s*(第\s*\d+\s*轮)$/u, "");
132
+ return `${base}(第 ${round} 轮)`;
133
+ }
134
+ export function createInitialRunState(spec, opts, ranks, runId = opts.runId ?? "dag") {
135
+ const nodes = {};
136
+ for (const task of spec.tasks) {
137
+ nodes[task.id] = {
138
+ id: task.id,
139
+ status: "PENDING",
140
+ executor: task.executor,
141
+ complexity: task.complexity,
142
+ ...(task.outputMode ? { outputMode: task.outputMode } : {}),
143
+ ...(resolveModelForTask(task, spec.executorModels)
144
+ ? { model: resolveModelForTask(task, spec.executorModels) }
145
+ : {}),
146
+ };
147
+ }
148
+ const executionMode = opts.dryRun
149
+ ? "dry-run"
150
+ : opts.initOnly
151
+ ? "init-only"
152
+ : "execute";
153
+ const state = {
154
+ version: 1,
155
+ title: titleWithRoundLabel(spec.title, runId),
156
+ runId,
157
+ cwd: opts.cwd,
158
+ startedAt: new Date().toISOString(),
159
+ executionMode,
160
+ runner: {
161
+ pid: process.pid,
162
+ hostname: hostname(),
163
+ startedAt: new Date().toISOString(),
164
+ heartbeatAt: new Date().toISOString(),
165
+ },
166
+ status: opts.initOnly || opts.dryRun ? "pending" : "running",
167
+ ranks,
168
+ nodes,
169
+ ...(spec.evaluation ? { evaluation: { ...spec.evaluation } } : {}),
170
+ ...(spec.convergence
171
+ ? {
172
+ convergence: {
173
+ enabled: spec.convergence.enabled === true,
174
+ maxPasses: Math.max(1, spec.convergence.maxPasses ?? 3),
175
+ currentPass: 1,
176
+ passHistory: [],
177
+ },
178
+ }
179
+ : {}),
180
+ ...(opts.workerAssociation
181
+ ? { workerAssociation: structuredClone(opts.workerAssociation) }
182
+ : {}),
183
+ };
184
+ initRunBudgetLedger(state, spec.budget);
185
+ return state;
186
+ }
187
+ export function assertFrozenEvaluationBinding(spec, state) {
188
+ const declared = spec.evaluation;
189
+ const frozen = state.evaluation;
190
+ if (!declared && !frozen)
191
+ return;
192
+ if (!declared ||
193
+ !frozen ||
194
+ JSON.stringify(declared) !== JSON.stringify(frozen)) {
195
+ throw new Error(`dag run ${state.runId} evaluation binding drifted between run.json and state.json; refuse to continue`);
196
+ }
197
+ }
198
+ export async function assertEvaluationBindingPreflight(cwd, binding) {
199
+ if (!binding)
200
+ return;
201
+ const record = await readCandidateRecord(cwd, binding.candidateId);
202
+ if (record.manifest.bundleHash !== binding.bundleHash) {
203
+ throw new Error(`evaluation bundleHash mismatch for ${binding.candidateId}: declared ${binding.bundleHash}, registry ${record.manifest.bundleHash}`);
204
+ }
205
+ if (!["eligible", "experimenting", "accepted"].includes(record.status)) {
206
+ throw new Error(`evaluation candidate ${binding.candidateId} lifecycle status ${record.status} is not executable`);
207
+ }
208
+ }
209
+ export async function runDag(spec, opts) {
210
+ assertValidDagSpec(spec);
211
+ // Candidate identity is validated before run-id allocation or directory creation.
212
+ await assertEvaluationBindingPreflight(opts.cwd, spec.evaluation);
213
+ // Phase 0.5: new writer execution requires DagSpec v4 + live taskContractBinding match.
214
+ const { assertDagSpecAllowsNewWriterExecution, assertTaskContractBindingConsistent, } = await import("./task-contract-binding.js");
215
+ assertDagSpecAllowsNewWriterExecution(spec);
216
+ await assertTaskContractBindingConsistent({ repoRoot: opts.cwd, spec });
217
+ const runningIdentity = resolveRunningControllerIdentity();
218
+ if (!runningIdentity) {
219
+ throw new Error("running controller identity could not be resolved; refuse to create an unpinned DAG run");
220
+ }
221
+ assertRuntimeContractCompatible(spec, {
222
+ ...DAG_CONTROLLER_CAPABILITIES,
223
+ controllerVersion: runningIdentity.packageVersion,
224
+ });
225
+ const { ranks } = topoSortToRanks(spec);
226
+ const { maxConcurrent } = resolveEffectiveMaxConcurrent(Math.max(1, opts.maxConcurrent ?? 4), spec.budget);
227
+ let runId = opts.runId;
228
+ if (runId) {
229
+ for (const warning of validateDagRunIdFormat(runId).warnings) {
230
+ console.warn(`[run-dag] warning: ${warning}`);
231
+ }
232
+ }
233
+ else {
234
+ runId = await buildDagRunId(spec, { cwd: opts.cwd });
235
+ }
236
+ const state = createInitialRunState(spec, opts, ranks, runId);
237
+ const activeRunDir = getDagRunDir(opts.cwd, "active", state.runId);
238
+ const completedRunDir = getDagRunDir(opts.cwd, "completed", state.runId);
239
+ const pausedRunDir = getDagRunDir(opts.cwd, "paused", state.runId);
240
+ // R-A2: non-execution modes use dedicated lifecycles; only execute enters active/.
241
+ const lifecycleDir = state.executionMode === "dry-run"
242
+ ? "dry-run"
243
+ : state.executionMode === "init-only"
244
+ ? "init-only"
245
+ : "active";
246
+ const runDir = getDagRunDir(opts.cwd, lifecycleDir, state.runId);
247
+ await prepareRunDir(runDir);
248
+ await writeRunSpec(runDir, spec);
249
+ // Freeze the running controller identity as a run-owned fact before the
250
+ // first canonical state write, reusing the identity resolved for preflight.
251
+ state.controllerIdentityRef = await captureControllerIdentity({
252
+ runDir,
253
+ identity: runningIdentity,
254
+ });
255
+ // Resolve and snapshot all skill profiles before any node executes.
256
+ try {
257
+ const snapshot = await createSkillSnapshot({
258
+ runId: state.runId,
259
+ spec,
260
+ cwd: opts.cwd,
261
+ mode: "run-start",
262
+ });
263
+ state.skillSnapshotRef = await writeSkillSnapshot(runDir, snapshot);
264
+ }
265
+ catch (error) {
266
+ throw new Error(`failed to create run-start skill snapshot: ${error instanceof Error ? error.message : String(error)}`);
267
+ }
268
+ await writeRunState(runDir, state);
269
+ if (opts.workerAssociation) {
270
+ await writeJsonAtomic(path.join(runDir, ".runtime", "worker-association.json"), opts.workerAssociation);
271
+ }
272
+ await notifyRunObserver(opts.observer, "onRunStart", state);
273
+ try {
274
+ const startCheckpoint = await captureWorkspaceCheckpoint(opts.cwd);
275
+ await writeWorkspaceCheckpoint(runDir, WORKSPACE_CHECKPOINT_START_REL, startCheckpoint);
276
+ }
277
+ catch (error) {
278
+ console.warn(`[run-dag] warning: failed to write workspace start checkpoint: ${error instanceof Error ? error.message : String(error)}`);
279
+ }
280
+ if (opts.dryRun || opts.initOnly) {
281
+ return {
282
+ title: state.title,
283
+ runId: state.runId,
284
+ status: state.status,
285
+ ranks,
286
+ nodes: state.nodes,
287
+ runDir,
288
+ };
289
+ }
290
+ try {
291
+ return await executeDagCheckpoint({
292
+ spec,
293
+ state,
294
+ ranks,
295
+ runDir,
296
+ cwd: opts.cwd,
297
+ maxConcurrent,
298
+ executeNode: opts.executeNode,
299
+ observer: opts.observer,
300
+ abortSignal: opts.abortSignal,
301
+ activeRunDir,
302
+ completedRunDir,
303
+ pausedRunDir,
304
+ });
305
+ }
306
+ finally {
307
+ }
308
+ }
309
+ export async function runDagContinuation(opts) {
310
+ const { maxConcurrent } = resolveEffectiveMaxConcurrent(Math.max(1, opts.maxConcurrent ?? 4), opts.spec.budget);
311
+ const state = opts.state;
312
+ state.status = "running";
313
+ const resumedAt = new Date().toISOString();
314
+ state.runner = {
315
+ pid: process.pid,
316
+ hostname: hostname(),
317
+ startedAt: resumedAt,
318
+ heartbeatAt: resumedAt,
319
+ };
320
+ const activeRunDir = getDagRunDir(opts.cwd, "active", state.runId);
321
+ const completedRunDir = getDagRunDir(opts.cwd, "completed", state.runId);
322
+ const pausedRunDir = getDagRunDir(opts.cwd, "paused", state.runId);
323
+ return executeDagCheckpoint({
324
+ spec: opts.spec,
325
+ state,
326
+ ranks: state.ranks,
327
+ runDir: opts.runDir,
328
+ cwd: opts.cwd,
329
+ maxConcurrent,
330
+ executeNode: opts.executeNode,
331
+ observer: opts.observer,
332
+ abortSignal: opts.abortSignal,
333
+ activeRunDir,
334
+ completedRunDir,
335
+ pausedRunDir,
336
+ });
337
+ }
338
+ export async function resumeDagRun(opts) {
339
+ const located = await locateDagRun(opts.cwd, opts.runId);
340
+ if (!located) {
341
+ throw new Error(`dag run not found: ${opts.runId}`);
342
+ }
343
+ if (located.lifecycle === "completed") {
344
+ throw new Error(`dag run ${opts.runId} is already completed`);
345
+ }
346
+ if (located.lifecycle === "paused") {
347
+ throw new Error(`dag run ${opts.runId} is paused; approve before resume`);
348
+ }
349
+ const { runDir, state, spec } = await requireActiveDagRun(opts.cwd, opts.runId);
350
+ if (state.status === "paused") {
351
+ throw new Error(`dag run ${opts.runId} is paused; approve before resume`);
352
+ }
353
+ if (isTerminalDagRunStatus(state.status)) {
354
+ throw new Error(`dag run ${opts.runId} is already terminal (status=${state.status})`);
355
+ }
356
+ assertFrozenEvaluationBinding(spec, state);
357
+ assertFrozenBudget(spec.budget, state.budget, state.runId);
358
+ // Phase 0.5: refuse resume of pre-v4 writer DAGs; revalidate live binding.
359
+ const { assertDagSpecAllowsNewWriterExecution, assertTaskContractBindingConsistent, } = await import("./task-contract-binding.js");
360
+ assertDagSpecAllowsNewWriterExecution(spec);
361
+ await assertTaskContractBindingConsistent({ repoRoot: opts.cwd, spec });
362
+ // Runtime contract + controller identity must be re-verified before executing
363
+ // any remaining node on resume; drift fails closed.
364
+ const runningIdentity = resolveRunningControllerIdentity();
365
+ if (!runningIdentity) {
366
+ throw new Error("running controller identity could not be resolved; refuse to resume an unpinned DAG run");
367
+ }
368
+ assertRuntimeContractCompatible(spec, {
369
+ ...DAG_CONTROLLER_CAPABILITIES,
370
+ controllerVersion: runningIdentity.packageVersion,
371
+ });
372
+ await verifyControllerIdentityForResume({
373
+ runDir,
374
+ state,
375
+ });
376
+ const decisionNodeId = state.humanDecisionNodeId;
377
+ if (!decisionNodeId) {
378
+ throw new Error(`dag run ${opts.runId} has no human decision checkpoint; was it approved?`);
379
+ }
380
+ try {
381
+ await readHumanApprovalArtifact(runDir, decisionNodeId);
382
+ }
383
+ catch {
384
+ throw new Error(`dag run ${opts.runId} is missing human-approval.json for node ${decisionNodeId}`);
385
+ }
386
+ // Validate or backfill before mutating runner/status for this resume attempt.
387
+ try {
388
+ const prepared = await prepareSkillSnapshotForContinuation({
389
+ runDir,
390
+ runId: state.runId,
391
+ spec,
392
+ state,
393
+ cwd: state.cwd,
394
+ ref: state.skillSnapshotRef,
395
+ });
396
+ if (prepared.backfilled) {
397
+ console.warn(`[dag resume] warning: run ${state.runId} has no skill snapshot ref; creating a legacy-resume-backfill that freezes remaining nodes only`);
398
+ state.skillSnapshotRef = prepared.ref;
399
+ await writeRunState(runDir, state);
400
+ }
401
+ }
402
+ catch (error) {
403
+ throw new Error(`skill snapshot validation failed on resume: ${error instanceof Error ? error.message : String(error)}`);
404
+ }
405
+ const { maxConcurrent } = resolveEffectiveMaxConcurrent(Math.max(1, opts.maxConcurrent ?? 4), spec.budget);
406
+ state.status = "running";
407
+ const resumedAt = new Date().toISOString();
408
+ state.runner = {
409
+ pid: process.pid,
410
+ hostname: hostname(),
411
+ startedAt: resumedAt,
412
+ heartbeatAt: resumedAt,
413
+ };
414
+ const activeRunDir = getDagRunDir(opts.cwd, "active", state.runId);
415
+ const completedRunDir = getDagRunDir(opts.cwd, "completed", state.runId);
416
+ const pausedRunDir = getDagRunDir(opts.cwd, "paused", state.runId);
417
+ try {
418
+ return await executeDagCheckpoint({
419
+ spec,
420
+ state,
421
+ ranks: state.ranks,
422
+ runDir,
423
+ cwd: state.cwd,
424
+ maxConcurrent,
425
+ executeNode: opts.executeNode,
426
+ observer: opts.observer,
427
+ // Resume path intentionally has no abortSignal field on ResumeDagRunOptions yet.
428
+ activeRunDir,
429
+ completedRunDir,
430
+ pausedRunDir,
431
+ });
432
+ }
433
+ finally {
434
+ }
435
+ }
436
+ async function executeDagCheckpoint(input) {
437
+ const { spec, state, ranks, runDir: initialRunDir, cwd, maxConcurrent, completedRunDir, pausedRunDir, } = input;
438
+ let runDir = initialRunDir;
439
+ let stateWriteQueue = Promise.resolve();
440
+ const persistState = async (options) => {
441
+ stateWriteQueue = stateWriteQueue.then(() => writeRunState(runDir, state, options));
442
+ await stateWriteQueue;
443
+ };
444
+ const runnerLivenessPolicy = resolveLivenessPolicy(spec.defaults?.livenessPolicy);
445
+ const heartbeatTimer = setInterval(() => {
446
+ if (!state.runner)
447
+ return;
448
+ // Runner lease only — never counts as meaningful Pi progress.
449
+ state.runner.heartbeatAt = new Date().toISOString();
450
+ const tasksByIdForPolicy = new Map(spec.tasks.map((task) => [task.id, task]));
451
+ for (const node of Object.values(state.nodes)) {
452
+ if (node.status !== "RUNNING")
453
+ continue;
454
+ // Lease clock is separate from meaningful activity.
455
+ node.lastLeaseAt = state.runner.heartbeatAt;
456
+ const task = tasksByIdForPolicy.get(node.id);
457
+ const policy = resolveLivenessPolicy(spec.defaults?.livenessPolicy, task?.livenessPolicy);
458
+ const evaluation = evaluateNodeLiveness({
459
+ node,
460
+ policy,
461
+ runnerHeartbeatAt: state.runner.heartbeatAt,
462
+ });
463
+ node.livenessStatus = evaluation.status;
464
+ // Intentionally do NOT refresh lastActivityAt / lastMeaningfulProgressAt
465
+ // from the runner lease timer.
466
+ }
467
+ void persistState().catch(() => { });
468
+ }, runnerLivenessPolicy.heartbeatIntervalMs);
469
+ heartbeatTimer.unref();
470
+ await persistState();
471
+ const interruptController = new AbortController();
472
+ const expectedRunnerIdentity = runnerIdentityFromState(state);
473
+ const interruptWatcher = expectedRunnerIdentity
474
+ ? startInterruptWatcher({
475
+ runDir,
476
+ runId: state.runId,
477
+ expectedRunnerIdentity,
478
+ controller: interruptController,
479
+ })
480
+ : undefined;
481
+ const abortSignal = mergeAbortSignals(input.abortSignal, interruptController.signal);
482
+ // Graceful terminal persistence: an outer SIGTERM/SIGINT (operator hard
483
+ // timeout, supervision layer, or shell wall-clock) must not leave the run
484
+ // orphaned in RUNNING with a dead heartbeat. Persist a terminal failed
485
+ // state with an explicit terminalReason before exiting so downstream
486
+ // liveness/doctor tooling sees a diagnosable terminal instead of an orphan.
487
+ let terminalSignal;
488
+ const shutdownOnSignal = (signal) => {
489
+ if (terminalSignal)
490
+ return;
491
+ terminalSignal = signal;
492
+ clearInterval(heartbeatTimer);
493
+ if (state.runner)
494
+ state.runner.heartbeatAt = new Date().toISOString();
495
+ state.status = "failed";
496
+ state.finishedAt = new Date().toISOString();
497
+ state.terminalReason = `runner terminated by ${signal} before run completion`;
498
+ console.warn(`[run-dag] received ${signal}; persisting terminal state and exiting`);
499
+ const exit = () => process.exit(signal === "SIGINT" ? 130 : 143);
500
+ // Best-effort atomic persist with a hard exit deadline so a stuck write
501
+ // queue cannot keep the process alive past the supervisor's kill window.
502
+ const hardExit = setTimeout(exit, 5000);
503
+ hardExit.unref();
504
+ void persistState()
505
+ .catch(() => { })
506
+ .finally(() => {
507
+ clearTimeout(hardExit);
508
+ exit();
509
+ });
510
+ };
511
+ const onSigTerm = () => shutdownOnSignal("SIGTERM");
512
+ const onSigInt = () => shutdownOnSignal("SIGINT");
513
+ process.once("SIGTERM", onSigTerm);
514
+ process.once("SIGINT", onSigInt);
515
+ try {
516
+ const tasksById = new Map(spec.tasks.map((task) => [task.id, task]));
517
+ const baseExecuteNode = input.executeNode ??
518
+ createDagNodeExecutor({
519
+ runDir,
520
+ runId: state.runId,
521
+ spec,
522
+ });
523
+ const executeDynamicNode = async (dynamicInput) => {
524
+ const { task } = dynamicInput;
525
+ if (task.dynamicExpansion) {
526
+ return executeDynamicMapExpansion({
527
+ ...dynamicInput,
528
+ expansion: task.dynamicExpansion,
529
+ executeDynamicNode,
530
+ });
531
+ }
532
+ if (task.dynamicCondition) {
533
+ return executeDynamicCondition({
534
+ task,
535
+ condition: task.dynamicCondition,
536
+ tasksById: dynamicInput.tasksById,
537
+ state: dynamicInput.state,
538
+ });
539
+ }
540
+ if (task.dynamicLoopUntil) {
541
+ return executeDynamicLoopUntil({
542
+ ...dynamicInput,
543
+ loop: task.dynamicLoopUntil,
544
+ executeDynamicNode,
545
+ });
546
+ }
547
+ return executeDynamicReduction({
548
+ task,
549
+ reduction: task.dynamicReduction,
550
+ state: dynamicInput.state,
551
+ runDir: dynamicInput.runDir,
552
+ });
553
+ };
554
+ const deferTerminalCloseout = state.convergence !== undefined && tasksById.has("closeout-pi");
555
+ const convergenceRanks = deferTerminalCloseout
556
+ ? ranks
557
+ .map((rank) => rank.filter((nodeId) => nodeId !== "closeout-pi"))
558
+ .filter((rank) => rank.length > 0)
559
+ : ranks;
560
+ const terminalCloseoutRanks = deferTerminalCloseout
561
+ ? ranks
562
+ .map((rank) => rank.filter((nodeId) => nodeId === "closeout-pi"))
563
+ .filter((rank) => rank.length > 0)
564
+ : [];
565
+ const executeRanks = (selectedRanks) => executeDagRanksOnce({
566
+ state,
567
+ ranks: selectedRanks,
568
+ tasksById,
569
+ maxConcurrent,
570
+ persistState,
571
+ runDir,
572
+ abortSignal: input.abortSignal,
573
+ createExecuteNodeForRank: (rankWriterNodeIds) => buildRankAwareExecuteNode({
574
+ baseExecuteNode,
575
+ customExecuteNode: input.executeNode,
576
+ rankWriterNodeIds,
577
+ tasksById,
578
+ meta: { runDir, runId: state.runId, spec },
579
+ }),
580
+ executeScheduledNode: async (nodeId, executeNode, onPause) => {
581
+ if (abortSignal?.aborted)
582
+ return;
583
+ if (isHardBudgetBreached(state.budgetLedger))
584
+ return;
585
+ const preBreach = preflightBudgetOrBreach(state);
586
+ if (preBreach && isHardBudgetBreached(state.budgetLedger)) {
587
+ await writeBudgetLedgerArtifacts(runDir, state.budgetLedger);
588
+ await persistState();
589
+ return;
590
+ }
591
+ await executeDagNode({
592
+ nodeId,
593
+ tasksById,
594
+ state,
595
+ spec,
596
+ cwd,
597
+ runDir,
598
+ executeNode,
599
+ executeDynamicNode,
600
+ observer: input.observer,
601
+ persistState,
602
+ onPause,
603
+ });
604
+ const node = state.nodes[nodeId];
605
+ if (node && (node.status === "FINISHED" || node.status === "ERROR")) {
606
+ recordFinishedNodeBudget(state, node);
607
+ await writeBudgetLedgerArtifacts(runDir, state.budgetLedger);
608
+ await persistState();
609
+ }
610
+ },
611
+ });
612
+ let pausedByNodeId;
613
+ while (true) {
614
+ pausedByNodeId = await executeRanks(convergenceRanks);
615
+ if (pausedByNodeId) {
616
+ break;
617
+ }
618
+ if (isHardBudgetBreached(state.budgetLedger)) {
619
+ break;
620
+ }
621
+ const convergenceDecision = await runConvergencePassController({
622
+ spec,
623
+ state,
624
+ tasksById,
625
+ runDir,
626
+ cwd,
627
+ persistState,
628
+ });
629
+ if (convergenceDecision.pausedByNodeId) {
630
+ pausedByNodeId = convergenceDecision.pausedByNodeId;
631
+ break;
632
+ }
633
+ if (convergenceDecision.retry) {
634
+ continue;
635
+ }
636
+ break;
637
+ }
638
+ if (!pausedByNodeId &&
639
+ terminalCloseoutRanks.length > 0 &&
640
+ state.convergence?.terminalReason &&
641
+ !isHardBudgetBreached(state.budgetLedger)) {
642
+ // Convergence closeout is a terminal phase, not an ordinary descendant
643
+ // rank. Running it only after the controller records terminalReason avoids
644
+ // stale success handoffs on intermediate request-revision passes while
645
+ // still producing a truthful failure handoff for max-passes/non-retry.
646
+ pausedByNodeId = await executeRanks(terminalCloseoutRanks);
647
+ }
648
+ interruptWatcher?.stop();
649
+ // Stop heartbeats before terminal archive. A late heartbeat writing
650
+ // state.json under completed/ trips the completed-facts write guard and
651
+ // makes run-dag exit non-zero after every node already finished.
652
+ clearInterval(heartbeatTimer);
653
+ await stateWriteQueue;
654
+ state.finishedAt = new Date().toISOString();
655
+ const runDirBeforeTransfer = runDir;
656
+ await writeBudgetLedgerArtifacts(runDir, state.budgetLedger);
657
+ if (pausedByNodeId) {
658
+ state.status = "paused";
659
+ await finalizeRunOwnedInterrupt({
660
+ runDir,
661
+ state,
662
+ paused: true,
663
+ interruptAborted: interruptController.signal.aborted,
664
+ });
665
+ await persistState();
666
+ await notifyRunObserver(input.observer, "onRunFinish", state);
667
+ runDir = await moveToPausedRunDir(runDir, pausedRunDir);
668
+ }
669
+ else {
670
+ const { recoveryPending } = await finalizeTerminalRunStatus(state, spec.tasks.length, runDir, cwd);
671
+ await finalizeRunOwnedInterrupt({
672
+ runDir,
673
+ state,
674
+ paused: false,
675
+ interruptAborted: interruptController.signal.aborted,
676
+ });
677
+ await persistState();
678
+ if (recoveryPending) {
679
+ // Recovery coordinator (phase 3c AC-2/AC-3): materialize the reserved
680
+ // child and run it synchronously. Dynamic import avoids a static
681
+ // runner ↔ frontend-recovery-run module cycle. stageRecoveryChild
682
+ // locates the parent via the canonical active/ layout, so recovery
683
+ // only fires when this run is still the canonical active run dir
684
+ // (direct runDagContinuation callers using an arbitrary runDir keep
685
+ // the previous scheduler-layer skip semantics).
686
+ const canonicalActiveDir = getDagRunDir(cwd, "active", state.runId);
687
+ if (path.resolve(runDir) === path.resolve(canonicalActiveDir)) {
688
+ const { stageRecoveryChild } = await import("./frontend-recovery-run.js");
689
+ const staged = await stageRecoveryChild({
690
+ cwd,
691
+ parentRunId: state.runId,
692
+ });
693
+ // stageRecoveryChild CAS-advanced the parent's on-disk lineage
694
+ // (child-staging → child-running + childRunId). Refresh the in-memory
695
+ // copy so the terminal persistState below does not regress the parent
696
+ // back to stale child-staging.
697
+ const parentOnDisk = await readDagRunState(runDir);
698
+ state.frontendRecoveryState = parentOnDisk.frontendRecoveryState;
699
+ const childState = await readDagRunState(staged.childRunDir);
700
+ const childSpec = await readDagRunSpec(staged.childRunDir);
701
+ await runDagContinuation({
702
+ cwd,
703
+ spec: childSpec,
704
+ state: childState,
705
+ runDir: staged.childRunDir,
706
+ maxConcurrent,
707
+ executeNode: input.executeNode,
708
+ observer: input.observer,
709
+ abortSignal,
710
+ });
711
+ }
712
+ }
713
+ await notifyRunObserver(input.observer, "onRunFinish", state);
714
+ if (!recoveryPending) {
715
+ try {
716
+ const terminalCheckpoint = await captureWorkspaceCheckpoint(cwd);
717
+ await writeWorkspaceCheckpoint(runDir, WORKSPACE_CHECKPOINT_TERMINAL_REL, terminalCheckpoint);
718
+ }
719
+ catch (error) {
720
+ console.warn(`[run-dag] warning: failed to write workspace terminal checkpoint: ${error instanceof Error ? error.message : String(error)}`);
721
+ }
722
+ runDir = await moveToCompletedRunDir(runDir, completedRunDir);
723
+ }
724
+ }
725
+ await relocateRunArtifactPaths({
726
+ runDir,
727
+ oldRunDir: runDirBeforeTransfer,
728
+ nodes: state.nodes,
729
+ });
730
+ if (state.convergence) {
731
+ relocateConvergenceArtifactPaths(state.convergence, runDirBeforeTransfer, runDir);
732
+ }
733
+ await writeBudgetLedgerArtifacts(runDir, state.budgetLedger);
734
+ await persistState({ allowCompletedFactsWrite: true });
735
+ return {
736
+ title: state.title,
737
+ runId: state.runId,
738
+ status: state.status,
739
+ ranks,
740
+ nodes: state.nodes,
741
+ runDir,
742
+ };
743
+ }
744
+ finally {
745
+ clearInterval(heartbeatTimer);
746
+ interruptWatcher?.stop();
747
+ process.removeListener("SIGTERM", onSigTerm);
748
+ process.removeListener("SIGINT", onSigInt);
749
+ }
750
+ }
751
+ async function finalizeRunOwnedInterrupt(input) {
752
+ const request = await readInterruptRequest(input.runDir);
753
+ if (!request)
754
+ return;
755
+ if (request.status === "settled" || request.status === "needs-reconcile") {
756
+ return;
757
+ }
758
+ const hasUnconfirmed = Object.values(input.state.nodes).some((node) => node.failureCategory === "termination-unconfirmed");
759
+ if (hasUnconfirmed || input.paused) {
760
+ await markInterruptNeedsReconcile({
761
+ runDir: input.runDir,
762
+ outcome: hasUnconfirmed
763
+ ? "termination-unconfirmed"
764
+ : "paused-before-settle",
765
+ });
766
+ return;
767
+ }
768
+ if (input.interruptAborted &&
769
+ request.status === "acknowledged" &&
770
+ (input.state.status === "failed" ||
771
+ input.state.status === "partial_failed" ||
772
+ input.state.failureCategory === "controller-interrupted")) {
773
+ await settleDagInterrupt({
774
+ runDir: input.runDir,
775
+ outcome: "controller-interrupted",
776
+ });
777
+ return;
778
+ }
779
+ if (request.status === "requested") {
780
+ await markInterruptNeedsReconcile({
781
+ runDir: input.runDir,
782
+ outcome: "runner-did-not-acknowledge",
783
+ });
784
+ return;
785
+ }
786
+ await markInterruptNeedsReconcile({
787
+ runDir: input.runDir,
788
+ outcome: "run-exited-before-interrupt-settled",
789
+ });
790
+ }
791
+ async function notifyRunObserver(observer, event, state) {
792
+ try {
793
+ await observer?.[event]?.(state);
794
+ }
795
+ catch {
796
+ // Observers are derived views; they must not affect canonical DAG execution.
797
+ }
798
+ }
799
+ const SUCCESSFUL_CONVERGENCE_TERMINAL_REASONS = new Set([
800
+ "review-pass",
801
+ "hard-verify-pass",
802
+ ]);
803
+ /**
804
+ * Intermediate soft-verify failures may be excluded from terminal error
805
+ * aggregation only when repair + final hard verify succeeded and, when a review
806
+ * gate is present, convergence ended in review-pass. Historical node status is
807
+ * never rewritten.
808
+ */
809
+ function collectSupersededIntermediateFailures(state) {
810
+ const supersededIds = new Set();
811
+ const supersededFailures = [];
812
+ const soft = state.nodes["soft-verify-shell"];
813
+ if (!soft || soft.status !== "ERROR") {
814
+ return { supersededIds, supersededFailures };
815
+ }
816
+ const repair = state.nodes["repair-pi"];
817
+ const hard = state.nodes["hard-verify-shell"];
818
+ if (repair?.status !== "FINISHED" || hard?.status !== "FINISHED") {
819
+ return { supersededIds, supersededFailures };
820
+ }
821
+ const observesReview = Boolean(state.nodes["review-gate-shell"]);
822
+ const terminalReason = state.convergence?.terminalReason;
823
+ if (observesReview) {
824
+ if (terminalReason !== "review-pass") {
825
+ return { supersededIds, supersededFailures };
826
+ }
827
+ }
828
+ else if (terminalReason && terminalReason !== "hard-verify-pass") {
829
+ return { supersededIds, supersededFailures };
830
+ }
831
+ // Evidence: at least one successful repair pass after soft failure, with hard verify finished in terminal state.
832
+ const hasRepairEvidence = !state.convergence?.enabled ||
833
+ state.convergence.passHistory.some((pass) => pass.reason === "hard-verify-failed" ||
834
+ pass.reason === "review-request-revision" ||
835
+ pass.status === "retrying") ||
836
+ repair.status === "FINISHED";
837
+ if (!hasRepairEvidence) {
838
+ return { supersededIds, supersededFailures };
839
+ }
840
+ supersededIds.add("soft-verify-shell");
841
+ supersededFailures.push({
842
+ nodeId: "soft-verify-shell",
843
+ preservedStatus: "ERROR",
844
+ supersededBy: ["repair-pi", "hard-verify-shell"],
845
+ pass: state.convergence?.currentPass,
846
+ reason: "intermediate-soft-verify-covered-by-repair-and-final-hard",
847
+ });
848
+ return { supersededIds, supersededFailures };
849
+ }
850
+ function isSuccessfulConvergenceTerminal(state) {
851
+ const reason = state.convergence?.terminalReason;
852
+ if (!reason)
853
+ return true;
854
+ return SUCCESSFUL_CONVERGENCE_TERMINAL_REASONS.has(reason);
855
+ }
856
+ function buildFrontendRecoveryIntent(state, failureSource) {
857
+ const existing = state.frontendRecoveryState;
858
+ const requestId = existing?.requestId ?? randomUUID();
859
+ return {
860
+ schemaVersion: 1,
861
+ phase: "child-staging",
862
+ requestId,
863
+ recoveryRootRunId: existing?.recoveryRootRunId ?? state.runId,
864
+ parentRunId: state.runId,
865
+ ...(existing?.childRunId ? { childRunId: existing.childRunId } : {}),
866
+ attemptId: existing?.attemptId ?? `recovery-${requestId}`,
867
+ attemptIndex: existing?.attemptIndex ?? 0,
868
+ continuationCount: existing?.continuationCount ?? 0,
869
+ ...(failureSource ? { failureSource } : {}),
870
+ revision: (existing?.revision ?? 0) + 1,
871
+ };
872
+ }
873
+ function buildCandidateContractInvalidResult(state, result, artifactHash) {
874
+ const recovery = state.frontendRecoveryState;
875
+ return {
876
+ schemaVersion: 1,
877
+ outcome: "candidate-contract-invalid",
878
+ origin: {
879
+ kind: "frontend-prewrite-gate",
880
+ parentRunId: recovery?.parentRunId ?? state.runId,
881
+ ...(recovery?.childRunId ? { childRunId: recovery.childRunId } : {}),
882
+ requestId: recovery?.requestId ?? "",
883
+ failedNodeId: result.selectedPlanNodeId,
884
+ },
885
+ failureClass: {
886
+ code: "candidate-contract-invalid",
887
+ classification: result.classification,
888
+ reason: result.failureReason ?? "candidate contract invalid",
889
+ },
890
+ evidenceRefs: [
891
+ {
892
+ runId: state.runId,
893
+ relativePath: FRONTEND_PREWRITE_RESULT_SOURCE_ARTIFACT,
894
+ sha256: artifactHash,
895
+ },
896
+ ],
897
+ };
898
+ }
899
+ function buildWriterPartialWriteBlockedResult(state, failedNodeId, reason) {
900
+ const recovery = state.frontendRecoveryState;
901
+ return {
902
+ schemaVersion: 1,
903
+ outcome: "auto-recovery-blocked",
904
+ origin: {
905
+ kind: "frontend-writer",
906
+ parentRunId: recovery?.parentRunId ?? state.runId,
907
+ ...(recovery?.childRunId ? { childRunId: recovery.childRunId } : {}),
908
+ requestId: recovery?.requestId ?? "",
909
+ failedNodeId,
910
+ },
911
+ failureClass: {
912
+ code: "writer-transient-partial-write",
913
+ classification: "transient",
914
+ reason,
915
+ },
916
+ evidenceRefs: [],
917
+ };
918
+ }
919
+ function settleFrontendRecovery(state, outcome) {
920
+ const recovery = state.frontendRecoveryState;
921
+ if (!recovery)
922
+ return;
923
+ recovery.phase = "settled";
924
+ if (!state.frontendRecoveryResult) {
925
+ state.frontendRecoveryResult = {
926
+ schemaVersion: 1,
927
+ outcome,
928
+ origin: {
929
+ kind: "frontend-prewrite-gate",
930
+ parentRunId: recovery.parentRunId,
931
+ ...(recovery.childRunId ? { childRunId: recovery.childRunId } : {}),
932
+ requestId: recovery.requestId,
933
+ failedNodeId: "",
934
+ },
935
+ evidenceRefs: [],
936
+ };
937
+ }
938
+ }
939
+ export async function finalizeTerminalRunStatus(state, taskCount, runDir, cwd) {
940
+ const repoRoot = cwd ?? path.resolve(runDir, "..", "..", "..", "..");
941
+ // Terminal override: a denied frontend writer must never surface as a
942
+ // mechanical partial_failed just because prewrite FINISHED while the writer
943
+ // was SKIPPED. Fail closed on retryable-invalid/blocked before aggregation.
944
+ let recoveryPending = false;
945
+ const skipFrontendRecovery = state.failureCategory === "controller-interrupted";
946
+ const hasFrontendWriter = Object.keys(state.nodes).some((id) => FRONTEND_WRITER_NODE_IDS.includes(id));
947
+ if (hasFrontendWriter && !skipFrontendRecovery) {
948
+ const admission = await readFrontendPrewriteResult(runDir);
949
+ if (admission.ok) {
950
+ if (admission.result.classification === "blocked") {
951
+ state.status = "failed";
952
+ return { recoveryPending: false };
953
+ }
954
+ if (admission.result.classification === "retryable-invalid") {
955
+ const continuationCount = state.frontendRecoveryState?.continuationCount ?? 0;
956
+ if (continuationCount >= 1) {
957
+ // Continuation quota exhausted: a second retryable-invalid candidate
958
+ // is authoritative candidate-contract-invalid → forced failed.
959
+ state.frontendRecoveryResult = buildCandidateContractInvalidResult(state, admission.result, admission.artifactHash);
960
+ state.status = "failed";
961
+ return { recoveryPending: false };
962
+ }
963
+ // Root continuation still available: record the recovery intent and let
964
+ // mechanical aggregation settle partial_failed/failed. The parent keeps
965
+ // phase != settled (recovery in progress) and no final root manifest.
966
+ state.frontendRecoveryState = buildFrontendRecoveryIntent(state);
967
+ recoveryPending = true;
968
+ }
969
+ }
970
+ }
971
+ // Phase 5: writer transient partial write → rollback + recovery intent. Only
972
+ // for frontend-implementation writers with a remaining root continuation, and
973
+ // only when the rollback journal (captured before the provider call) restores
974
+ // cleanly; otherwise the run stays failed with auto-recovery-blocked.
975
+ if (hasFrontendWriter && !recoveryPending && !skipFrontendRecovery) {
976
+ const writerNodeId = FRONTEND_WRITER_NODE_IDS.find((id) => {
977
+ const node = state.nodes[id];
978
+ return (node &&
979
+ node.status === "ERROR" &&
980
+ isFrontendWriterTransientPartialWrite({
981
+ failureCategory: node.failureCategory,
982
+ }));
983
+ });
984
+ if (writerNodeId) {
985
+ const continuationCount = state.frontendRecoveryState?.continuationCount ?? 0;
986
+ if (continuationCount < 1) {
987
+ const { rollbackFrontendWriter } = await import("./frontend-writer-recovery.js");
988
+ const rollback = await rollbackFrontendWriter({
989
+ cwd: repoRoot,
990
+ parentRunId: state.runId,
991
+ });
992
+ if (rollback.ok) {
993
+ state.frontendRecoveryState = buildFrontendRecoveryIntent(state, "frontend-implement-pi");
994
+ recoveryPending = true;
995
+ }
996
+ else {
997
+ state.frontendRecoveryResult = buildWriterPartialWriteBlockedResult(state, writerNodeId, rollback.reason);
998
+ state.status = "failed";
999
+ return { recoveryPending: false };
1000
+ }
1001
+ }
1002
+ }
1003
+ }
1004
+ const finishedCount = Object.values(state.nodes).filter((n) => n.status === "FINISHED").length;
1005
+ const { supersededIds, supersededFailures } = collectSupersededIntermediateFailures(state);
1006
+ if (state.convergence && supersededFailures.length > 0) {
1007
+ state.convergence.supersededFailures = supersededFailures;
1008
+ }
1009
+ // Prefer map keys: DagNodeRecord may not always mirror the map key on `.id`.
1010
+ const effectiveErrorCount = Object.entries(state.nodes).filter(([nodeId, n]) => n.status === "ERROR" && !supersededIds.has(nodeId)).length;
1011
+ const supersededErrorCount = Object.entries(state.nodes).filter(([nodeId, n]) => n.status === "ERROR" && supersededIds.has(nodeId)).length;
1012
+ const conditionSkippedCount = Object.values(state.nodes).filter((n) => n.status === "SKIPPED" && isConditionSkippedReason(n.skippedReason)).length;
1013
+ const successTerminal = isSuccessfulConvergenceTerminal(state);
1014
+ // Superseded intermediate ERRORs remain ERROR in history but count as settled
1015
+ // for terminal aggregation only (they do not inflate effectiveErrorCount).
1016
+ if (effectiveErrorCount === 0 &&
1017
+ successTerminal &&
1018
+ finishedCount + conditionSkippedCount + supersededErrorCount === taskCount) {
1019
+ state.status = "finished";
1020
+ }
1021
+ else if (finishedCount > 0) {
1022
+ state.status = "partial_failed";
1023
+ }
1024
+ else {
1025
+ state.status = "failed";
1026
+ }
1027
+ // Terminal recovery bookkeeping for a child attempt: a child that finished
1028
+ // recovered settles its own lineage; any other child terminal settles as
1029
+ // auto-recovery-blocked (phase 3 performs no further recovery).
1030
+ const recovery = state.frontendRecoveryState;
1031
+ if (recovery && recovery.attemptIndex >= 1) {
1032
+ if (state.status === "finished") {
1033
+ settleFrontendRecovery(state, "recovered");
1034
+ }
1035
+ else if (!state.frontendRecoveryResult) {
1036
+ settleFrontendRecovery(state, "auto-recovery-blocked");
1037
+ }
1038
+ }
1039
+ return { recoveryPending };
1040
+ }
1041
+ function concurrentSiblingWriteSetsForNode(rankWriterNodeIds, nodeId, tasksById) {
1042
+ if (rankWriterNodeIds.length <= 1)
1043
+ return [];
1044
+ return rankWriterNodeIds
1045
+ .filter((id) => id !== nodeId)
1046
+ .map((id) => tasksById.get(id)?.writeSet ?? [])
1047
+ .filter((writeSet) => writeSet.length > 0);
1048
+ }
1049
+ function buildRankAwareExecuteNode(input) {
1050
+ if (input.customExecuteNode) {
1051
+ return input.baseExecuteNode;
1052
+ }
1053
+ return async (nodeInput) => {
1054
+ const isPiWriter = nodeInput.task.executor === "pi" &&
1055
+ nodeInput.task.toolProfile === "write" &&
1056
+ Boolean(nodeInput.model);
1057
+ if (!isPiWriter) {
1058
+ return input.baseExecuteNode(nodeInput);
1059
+ }
1060
+ const siblingWriteSets = nodeInput.task.writePolicy === "exclusive"
1061
+ ? concurrentSiblingWriteSetsForNode(input.rankWriterNodeIds, nodeInput.task.id, input.tasksById)
1062
+ : [];
1063
+ return executeDagPiNode({ ...nodeInput, model: nodeInput.model }, {
1064
+ ...input.meta,
1065
+ concurrentSiblingWriteSets: siblingWriteSets.length > 0 ? siblingWriteSets : undefined,
1066
+ writeGuardAttribution: siblingWriteSets.length > 0 ? "best-effort" : "per-node",
1067
+ });
1068
+ };
1069
+ }