@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,1277 @@
1
+ import path from "node:path";
2
+ import { createHash } from "node:crypto";
3
+ import { readFile } from "node:fs/promises";
4
+ import { writeDagNodeJsonArtifact, writeTextArtifactFile, } from "../infrastructure/harness/artifact-store.js";
5
+ import { executePiStep, } from "./pi-executor.js";
6
+ import { buildPiWriterToolPolicyContext, createPiWriterCustomTools, } from "./pi-writer-tool-policy.js";
7
+ import { cleanupPlaywrightCliDefaultSession, createPlaywrightCliTool, PI_COMMAND_CAPABILITY_REGISTRY, resolveCaseIdFromWriteSet, resolveEvidenceDirFromWriteSet, } from "./pi-playwright-cli-tool.js";
8
+ import { dagCommandPolicyAllows, resolveDagCommandPolicy, } from "../workflows/dag/types.js";
9
+ import { redactPromptForLog, truncateOutput, } from "../shared/output-truncation.js";
10
+ import { GitStatusUnavailableError, pathsChangedDuringRun, readGitStatusPorcelain, recoverRootNulArtifact, snapshotGitStatusPathFingerprints, snapshotGitStatusPorcelain, validateShellWriteGuard, } from "./shell-write-guard.js";
11
+ import { isWriterEmptyDiffRetryCandidate, isWriterTransportRetryCandidate, INCOMPLETE_WRITE_SET_RETRY_CATEGORY, WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY, WRITER_EMPTY_DIFF_RETRY_CATEGORY, } from "../workflows/dag/retry-policy.js";
12
+ import { assessBackendTestMdPlanCompleteness, assessBackendTestMdWriterCompleteness, assessBackendTestPytestPlanCompleteness, assessBackendTestPytestWriterCompleteness, assessBackendTestShardChildCompleteness, backendTestWriterProgressRoleForTask, classifyBackendTestWriterCompletenessFailure, isBackendTestCompletenessRetryCandidate, isBackendTestMdPlanTask, isBackendTestPytestPlanTask, isBackendTestShardChildTask, writeBackendTestWriterProgressArtifacts, } from "../workflows/dag/backend-test-writer-completeness.js";
13
+ import { resolveBackendTestLayout } from "../workflows/dag/backend-test-layout.js";
14
+ import { redactSecrets, truncateUtf8Preview } from "../shared/preview.js";
15
+ /**
16
+ * Writer classification for a length-stopped thinking-only attempt: the model
17
+ * exhausted its output budget thinking but never issued a write/edit tool call
18
+ * and produced zero attributed diff. This is a terminal, non-retryable
19
+ * diagnosis (the same prompt + model will hit the same budget wall); the
20
+ * recommendation is a model switch plus a fresh run. It must NOT mask a
21
+ * recoverable partial-write-set (incomplete-write-set) upgrade.
22
+ */
23
+ export const WRITER_THINKING_EXHAUSTED_CATEGORY = "writer-thinking-exhausted";
24
+ function readWriterThinkingExhaustionEvidence(result) {
25
+ const wider = result;
26
+ return {
27
+ ...(typeof wider.stopReason === "string"
28
+ ? { stopReason: wider.stopReason }
29
+ : {}),
30
+ ...(typeof wider.thinkingObserved === "boolean"
31
+ ? { thinkingObserved: wider.thinkingObserved }
32
+ : {}),
33
+ ...(typeof wider.writeToolCallCount === "number"
34
+ ? { writeToolCallCount: wider.writeToolCallCount }
35
+ : {}),
36
+ };
37
+ }
38
+ /**
39
+ * Pure classification predicate for writer-thinking-exhausted (AC-002).
40
+ * Requires ALL of: empty-output base category, stopReason exactly "length",
41
+ * thinking observed, zero write/edit tool calls, and a confirmed empty
42
+ * run-attributed diff. Recoverable partial writes stay incomplete-write-set
43
+ * because the caller only consults this predicate when the completeness gate
44
+ * did not upgrade the category.
45
+ */
46
+ export function isWriterThinkingExhausted(result, mapped, changeManifestChangedFiles) {
47
+ if (mapped.ok)
48
+ return false;
49
+ if (mapped.failureCategory !== "empty-output")
50
+ return false;
51
+ const evidence = readWriterThinkingExhaustionEvidence(result);
52
+ if (evidence.stopReason !== "length")
53
+ return false;
54
+ if (evidence.thinkingObserved !== true)
55
+ return false;
56
+ if ((evidence.writeToolCallCount ?? 0) !== 0)
57
+ return false;
58
+ if (changeManifestChangedFiles === undefined)
59
+ return false;
60
+ if (changeManifestChangedFiles.length !== 0)
61
+ return false;
62
+ return true;
63
+ }
64
+ export const DAG_PI_READONLY_TOOLS = ["read", "grep", "find", "ls"];
65
+ /** Bounded writer tools include bash; edit/write remain policy-wrapped via SDK customTools. */
66
+ export const DAG_PI_WRITE_TOOLS = [
67
+ "read",
68
+ "edit",
69
+ "write",
70
+ "grep",
71
+ "find",
72
+ "ls",
73
+ "bash",
74
+ ];
75
+ export const DEFAULT_DAG_PI_PROVIDER = "wizard-local";
76
+ const WRITER_OUTCOME_PROTOCOL_LINE = "IMPLEMENTATION_OUTCOME:";
77
+ export const DAG_PI_MODEL_PROVIDERS = {
78
+ "gpt-5.3-codex-spark": "wizard-local",
79
+ "gpt-5.5": "wizard-local",
80
+ "glm-5.2": "wizard-local",
81
+ "deepseek-v4-flash": "deepseek",
82
+ "deepseek-v4-pro": "deepseek",
83
+ };
84
+ const SAFE_PI_STEPS = new Set([
85
+ "analyze",
86
+ "plan",
87
+ "verify",
88
+ "retrospective",
89
+ "spec",
90
+ ]);
91
+ const PI_WRITE_STEPS = new Set([...SAFE_PI_STEPS, "implement"]);
92
+ const ROLE_TO_PERSONA = {
93
+ planner: "planner",
94
+ scout: "scout",
95
+ implementer: "planner",
96
+ reviewer: "reviewer",
97
+ supervisor: "supervisor",
98
+ verifier: "verifier",
99
+ closeout: "closeout",
100
+ };
101
+ const PI_STEP_PERSONA_ALIASES = {
102
+ analyze: "scout",
103
+ plan: "planner",
104
+ verify: "verifier",
105
+ retrospective: "closeout",
106
+ spec: "planner",
107
+ generic: "planner",
108
+ scout: "scout",
109
+ planner: "planner",
110
+ reviewer: "reviewer",
111
+ supervisor: "supervisor",
112
+ verifier: "verifier",
113
+ closeout: "closeout",
114
+ };
115
+ const PERSONA_TO_EXECUTOR_STEP = {
116
+ closeout: "retrospective",
117
+ planner: "plan",
118
+ reviewer: "analyze",
119
+ scout: "analyze",
120
+ supervisor: "analyze",
121
+ verifier: "verify",
122
+ };
123
+ const PI_WRITE_ROLE_TO_STEP = {
124
+ planner: "plan",
125
+ scout: "analyze",
126
+ implementer: "implement",
127
+ reviewer: "analyze",
128
+ supervisor: "analyze",
129
+ verifier: "verify",
130
+ closeout: "retrospective",
131
+ };
132
+ const PI_WRITE_STEP_ALIASES = {
133
+ analyze: "analyze",
134
+ plan: "plan",
135
+ verify: "verify",
136
+ retrospective: "retrospective",
137
+ spec: "spec",
138
+ generic: "plan",
139
+ scout: "analyze",
140
+ planner: "plan",
141
+ reviewer: "analyze",
142
+ supervisor: "analyze",
143
+ verifier: "verify",
144
+ closeout: "retrospective",
145
+ implement: "implement",
146
+ implementer: "implement",
147
+ };
148
+ /** Map DAG `piStep` / `role` to a DAG persona for read-only Pi nodes. */
149
+ export function resolveDagPiPersona(task) {
150
+ if (task.piStep) {
151
+ const mapped = PI_STEP_PERSONA_ALIASES[task.piStep.trim().toLowerCase()];
152
+ if (mapped)
153
+ return mapped;
154
+ }
155
+ if (task.role) {
156
+ return ROLE_TO_PERSONA[task.role];
157
+ }
158
+ return "planner";
159
+ }
160
+ function resolvePiExecutorStep(persona) {
161
+ return PERSONA_TO_EXECUTOR_STEP[persona];
162
+ }
163
+ function isDagPiWriteTask(task) {
164
+ return task.executor === "pi" && task.toolProfile === "write";
165
+ }
166
+ /** Map DAG `piStep` / `role` to a safe workflow step for read-only Pi or bounded write. */
167
+ export function resolveDagPiStepName(task) {
168
+ if (isDagPiWriteTask(task)) {
169
+ if (task.piStep) {
170
+ const mapped = PI_WRITE_STEP_ALIASES[task.piStep.trim().toLowerCase()];
171
+ if (mapped)
172
+ return mapped;
173
+ }
174
+ if (task.role) {
175
+ return PI_WRITE_ROLE_TO_STEP[task.role];
176
+ }
177
+ return "implement";
178
+ }
179
+ return resolvePiExecutorStep(resolveDagPiPersona(task));
180
+ }
181
+ export function resolveDagPiToolNames(task) {
182
+ if (!isDagPiWriteTask(task))
183
+ return [...DAG_PI_READONLY_TOOLS];
184
+ const tools = [...DAG_PI_WRITE_TOOLS];
185
+ // Pi SDK activates custom tools only when they are in this explicit list.
186
+ // Command capabilities (playwright_cli) stay capability-gated; read-only nodes never get command tools.
187
+ if (dagCommandPolicyAllows(task.commandPolicy, "playwright-cli")) {
188
+ tools.push("playwright_cli");
189
+ }
190
+ return tools;
191
+ }
192
+ export function buildDagPiUserMessage(task, persona, step) {
193
+ const role = task.role ?? "unspecified";
194
+ const writePolicy = task.writePolicy ?? "read-only (default)";
195
+ if (isDagPiWriteTask(task)) {
196
+ const outcomeInstruction = task.writerOutcomePolicy
197
+ ? [
198
+ "The first non-empty response line must be exactly IMPLEMENTATION_OUTCOME: changed, IMPLEMENTATION_OUTCOME: already-satisfied, or IMPLEMENTATION_OUTCOME: blocked. The runner measures your diff mechanically from git status snapshots taken before and after this node: code pasted into the response text is NOT an implementation and yields an empty diff. Use changed only after actually calling write/edit tools that persist files to disk; use already-satisfied only when the contract is already met and no file changed; use blocked when implementation cannot proceed. Claiming changed without a persisted diff fails this node as invalid-output.",
199
+ task.writerOutcomePolicy.requireChangedFiles
200
+ ? "This generation node requires a non-empty bounded diff; already-satisfied cannot complete it successfully."
201
+ : undefined,
202
+ ]
203
+ .filter((value) => Boolean(value))
204
+ .join(" ")
205
+ : undefined;
206
+ return [
207
+ `You are executing hybrid DAG node "${task.id}" (role=${role}, piStep=${step}, writePolicy=${writePolicy}).`,
208
+ "The system prompt contains the full DAG envelope: objective, constraints, upstream context, and task.",
209
+ "Use write tools only for the bounded implementation requested by this node.",
210
+ "The upstream plan node's output is a BLUEPRINT, not a deliverable: reading it never satisfies this node. You MUST materialize the plan into actual working-tree changes by calling write/edit tools before claiming changed. A detailed plan that names every file, test, or snippet still requires you to write those files yourself.",
211
+ "Forbidden paths bound the writeSet, not the task: when the task only requires writing inside the writeSet (e.g. adding tests that call existing public APIs), a forbidden src/** does not make the task impossible — do NOT claim blocked merely because some path you never need to write is forbidden. blocked is only for when you genuinely cannot produce the required writeSet changes.",
212
+ outcomeInstruction,
213
+ `Allowed paths: ${(task.allowedPaths ?? []).join(", ") || "(none declared)"}.`,
214
+ `Write set: ${(task.writeSet ?? []).join(", ") || "(none declared)"}.`,
215
+ `Forbidden paths: ${(task.forbiddenPaths ?? []).join(", ") || "(none declared)"}.`,
216
+ "Preserve unrelated files. Do not edit outside allowedPaths/writeSet. Never write forbiddenPaths, .harness/dag-runs/**, or undeclared root artifacts/**.",
217
+ "Return concise Markdown with changed files, verification performed or still required, and residual risks.",
218
+ "Do not wrap the output in code fences and do not add conversational preamble.",
219
+ ]
220
+ .filter((value) => Boolean(value))
221
+ .join(" ");
222
+ }
223
+ // Decision Gate nodes must emit a mandatory DECISION_ENVELOPE_JSON fenced block;
224
+ // do not inject the global no-fence instruction that would conflict with outputContract.
225
+ if (task.decisionGate?.enabled === true) {
226
+ return [
227
+ `You are executing hybrid DAG node "${task.id}" (role=${role}, piPersona=${persona}, piStep=${step}, writePolicy=${writePolicy}).`,
228
+ "The system prompt contains the full DAG envelope: objective, constraints, upstream context, and task.",
229
+ "Use read-only tools only. Do not edit, write, or commit repository files.",
230
+ "Return your conclusion as Markdown that includes exactly one ```DECISION_ENVELOPE_JSON fenced block (info string DECISION_ENVELOPE_JSON, not json) matching the Decision Envelope schema, plus a short evidence/risk summary.",
231
+ "Follow the node outputContract for the mandatory fenced block. Do not add conversational preamble outside the required Markdown structure.",
232
+ ].join(" ");
233
+ }
234
+ return [
235
+ `You are executing hybrid DAG node "${task.id}" (role=${role}, piPersona=${persona}, piStep=${step}, writePolicy=${writePolicy}).`,
236
+ "The system prompt contains the full DAG envelope: objective, constraints, upstream context, and task.",
237
+ "Use read-only tools only. Do not edit, write, or commit repository files.",
238
+ "Return your conclusion as plain Markdown text suitable for downstream DAG nodes.",
239
+ "Do not wrap the output in code fences and do not add conversational preamble.",
240
+ ].join(" ");
241
+ }
242
+ export function resolveDagPiModelConfig(modelReference, options) {
243
+ const separatorIndex = modelReference.indexOf("/");
244
+ const qualified = separatorIndex >= 0;
245
+ const provider = qualified
246
+ ? modelReference.slice(0, separatorIndex)
247
+ : (DAG_PI_MODEL_PROVIDERS[modelReference] ?? DEFAULT_DAG_PI_PROVIDER);
248
+ const model = qualified
249
+ ? modelReference.slice(separatorIndex + 1)
250
+ : modelReference;
251
+ if (!provider || !model) {
252
+ throw new Error(`invalid DAG Pi model reference "${modelReference}": expected non-empty provider/model`);
253
+ }
254
+ const explicitThinking = options?.thinking?.trim();
255
+ const thinking = explicitThinking ??
256
+ (provider === "wizard-local" && model === "gpt-5.5" ? "low" : undefined);
257
+ return {
258
+ provider,
259
+ model,
260
+ ...(thinking ? { thinking } : {}),
261
+ };
262
+ }
263
+ const SUMMARY_STDOUT_MAX = 4_000;
264
+ const SUMMARY_STDERR_MAX = 2_000;
265
+ export function buildPiPromptRedactedMarkdown(prompt) {
266
+ const redacted = redactPromptForLog(prompt);
267
+ return [
268
+ "# Pi prompt (redacted)",
269
+ "",
270
+ `- ${redacted}`,
271
+ "",
272
+ "Full prompt text is not stored. See node `result.summary.md` for execution metadata.",
273
+ "",
274
+ ].join("\n");
275
+ }
276
+ export function buildPiResultSummaryMarkdown(input) {
277
+ const stdout = truncateOutput(input.result.stdout, SUMMARY_STDOUT_MAX);
278
+ const stderr = truncateOutput(input.result.stderr || "", SUMMARY_STDERR_MAX);
279
+ const lines = [
280
+ "# Pi execution summary",
281
+ "",
282
+ "## Run metadata",
283
+ "",
284
+ "| Field | Value |",
285
+ "|-------|-------|",
286
+ `| channel | ${input.context.channel} |`,
287
+ `| dagRunId | ${input.context.dagRunId} |`,
288
+ `| dagNodeId | ${input.context.dagNodeId} |`,
289
+ `| cwd | ${input.context.cwd} |`,
290
+ `| model | ${input.model} |`,
291
+ `| piPersona | ${input.persona} |`,
292
+ `| piStep | ${input.step} |`,
293
+ `| ok | ${input.result.ok} |`,
294
+ `| failureCategory | ${input.result.failureCategory} |`,
295
+ `| backend | ${input.result.backend ?? "(unknown)"} |`,
296
+ `| sdkAttempted | ${input.result.sdkAttempted ?? false} |`,
297
+ `| durationMs | ${input.result.durationMs} |`,
298
+ `| tokensUsed | ${input.result.tokensUsed} |`,
299
+ `| parsedEvents | ${input.result.parsedEvents} |`,
300
+ "",
301
+ "## Prompt reference",
302
+ "",
303
+ `- ${redactPromptForLog(input.prompt)}`,
304
+ "",
305
+ "## Assistant output",
306
+ "",
307
+ ];
308
+ if (input.result.assistantText.trim()) {
309
+ lines.push("```markdown", input.result.assistantText, "```", "");
310
+ }
311
+ if (stdout.text.trim()) {
312
+ lines.push("### raw stdout", "", "```text", stdout.text, "```", "");
313
+ if (stdout.truncated)
314
+ lines.push("_(stdout truncated)_", "");
315
+ }
316
+ if (stderr.text.trim()) {
317
+ lines.push("### stderr", "", "```text", stderr.text, "```", "");
318
+ if (stderr.truncated)
319
+ lines.push("_(stderr truncated)_", "");
320
+ }
321
+ return lines.join("\n");
322
+ }
323
+ export async function writePiExecutorArtifacts(artifactsDir, input) {
324
+ const promptPath = path.join(artifactsDir, "prompt.redacted.md");
325
+ const summaryPath = path.join(artifactsDir, "result.summary.md");
326
+ await writeTextArtifactFile(promptPath, buildPiPromptRedactedMarkdown(input.prompt));
327
+ await writeTextArtifactFile(summaryPath, buildPiResultSummaryMarkdown(input));
328
+ return { promptPath, summaryPath };
329
+ }
330
+ async function resolveValidatedFrontendBaseUrlFromContext(workspaceRoot, runDir) {
331
+ try {
332
+ const capability = JSON.parse(await readFile(path.join(runDir, "preflight-frontend-browser-tool-shell", "frontend-browser-capability.json"), "utf8"));
333
+ if (capability.status !== "ready" ||
334
+ capability.structuredToolName !== "playwright_cli") {
335
+ throw new Error("invalid capability artifact");
336
+ }
337
+ }
338
+ catch {
339
+ throw new Error("browser-command-capability-unavailable: missing or invalid frontend browser capability artifact");
340
+ }
341
+ const contextPath = path.join(workspaceRoot, "testcase", "frontend", "rag", "context.md");
342
+ let markdown;
343
+ try {
344
+ markdown = await readFile(contextPath, "utf8");
345
+ }
346
+ catch {
347
+ throw new Error("browser-command-capability-unavailable: missing frontend context.md after environment preflight");
348
+ }
349
+ const patterns = [
350
+ /baseUrl\s*[:=]\s*["'`]?((?:https?):\/\/[^\s"'`<>]+)/i,
351
+ /base[-_ ]url\s*[:=]\s*["'`]?((?:https?):\/\/[^\s"'`<>]+)/i,
352
+ /playwright-cli open --browser=chrome\s+((?:https?):\/\/[^\s"'`<>]+)/i,
353
+ ];
354
+ let rawBaseUrl;
355
+ for (const pattern of patterns) {
356
+ const match = markdown.match(pattern);
357
+ if (match?.[1]) {
358
+ rawBaseUrl = match[1].replace(/[)\]},.;]+$/, "");
359
+ break;
360
+ }
361
+ }
362
+ if (!rawBaseUrl || !/environmentProbe\s*[:=]\s*reachable/i.test(markdown)) {
363
+ throw new Error("browser-command-capability-unavailable: frontend context URL is missing or not environment-validated");
364
+ }
365
+ let parsed;
366
+ try {
367
+ parsed = new URL(rawBaseUrl);
368
+ }
369
+ catch {
370
+ throw new Error("browser-command-capability-unavailable: invalid frontend context origin");
371
+ }
372
+ if ((parsed.protocol !== "http:" && parsed.protocol !== "https:") ||
373
+ parsed.username ||
374
+ parsed.password ||
375
+ parsed.search ||
376
+ parsed.hash ||
377
+ /(?:^|\.)(?:www\.)?[^.]*(?:prod|production)/i.test(parsed.hostname)) {
378
+ throw new Error("browser-command-capability-unavailable: unsafe frontend context origin");
379
+ }
380
+ return parsed.toString();
381
+ }
382
+ const DEFAULT_DAG_PI_WRITE_GUARD_DEPENDENCIES = {
383
+ readGitStatusPorcelain,
384
+ recoverRootNulArtifact,
385
+ };
386
+ export async function executeDagPiNode(input, meta, piStepFn = executePiStep, writeGuardDependencies = DEFAULT_DAG_PI_WRITE_GUARD_DEPENDENCIES) {
387
+ const started = Date.now();
388
+ const persona = resolveDagPiPersona(input.task);
389
+ const step = resolveDagPiStepName(input.task);
390
+ const isWriteTask = isDagPiWriteTask(input.task);
391
+ if (isWriteTask && input.task.finalWriteSetApproval) {
392
+ const binding = input.task.finalWriteSetApproval;
393
+ const resolved = input.task.resolvedFinalWriteSetApproval;
394
+ if (!resolved ||
395
+ resolved.approvalSourceNodeId !== binding.approvalSourceNodeId ||
396
+ !/^[a-f0-9]{64}$/.test(resolved.approvalDigest)) {
397
+ return {
398
+ ok: false,
399
+ stdout: "",
400
+ stderr: "final-write-set-approval-invalid: writer authorization was not resolved before Pi execution",
401
+ failureCategory: "final-write-set-approval-invalid",
402
+ durationMs: Date.now() - started,
403
+ };
404
+ }
405
+ }
406
+ const allowedSteps = isWriteTask ? PI_WRITE_STEPS : SAFE_PI_STEPS;
407
+ if (!allowedSteps.has(step)) {
408
+ return {
409
+ ok: false,
410
+ stdout: "",
411
+ stderr: `unsafe pi step mapping: ${step}`,
412
+ failureCategory: "invalid-output",
413
+ durationMs: 0,
414
+ };
415
+ }
416
+ let beforeStatus;
417
+ let beforePathFingerprints;
418
+ /** tools-only: keep SDK path sandbox; skip git baseline + post-diff write-guard hard fail. */
419
+ const skipGitWriteGuard = isWriteTask && input.task.writeGuardPolicy === "tools-only";
420
+ if (isWriteTask && !skipGitWriteGuard) {
421
+ try {
422
+ beforeStatus = await writeGuardDependencies.readGitStatusPorcelain(input.cwd, { phase: "pi-writer-before" });
423
+ const beforeSnapshot = snapshotGitStatusPorcelain(beforeStatus);
424
+ beforePathFingerprints = await snapshotGitStatusPathFingerprints(input.cwd, beforeSnapshot);
425
+ await persistWriterGitBaseline({
426
+ runDir: meta.runDir,
427
+ nodeId: input.task.id,
428
+ beforeStatus,
429
+ beforeSnapshot,
430
+ beforePathFingerprints,
431
+ });
432
+ }
433
+ catch (error) {
434
+ await persistGitWriteGuardDiagnostics(meta.runDir, input.task.id, error);
435
+ return {
436
+ ok: false,
437
+ stdout: "",
438
+ stderr: `writer Git baseline unavailable before Pi execution: ${error instanceof Error ? error.message : String(error)}`,
439
+ failureCategory: "write-guard",
440
+ durationMs: Date.now() - started,
441
+ };
442
+ }
443
+ }
444
+ const reportActivity = input.reportActivity;
445
+ const attempt = input.attempt ?? 1;
446
+ const bridgeActivity = reportActivity
447
+ ? (kind, at) => {
448
+ reportActivity({
449
+ attempt,
450
+ kind,
451
+ at: at ?? new Date().toISOString(),
452
+ });
453
+ }
454
+ : undefined;
455
+ let writerToolPolicy;
456
+ const commandPolicy = resolveDagCommandPolicy(input.task.commandPolicy);
457
+ const allowsPlaywrightCli = dagCommandPolicyAllows(input.task.commandPolicy, "playwright-cli");
458
+ let playwrightToolContext;
459
+ if (allowsPlaywrightCli && !isWriteTask) {
460
+ return {
461
+ ok: false, stdout: "", stderr: "pi command capability requires an explicit bounded write tool profile", failureCategory: "tool-policy", durationMs: Date.now() - started,
462
+ };
463
+ }
464
+ if (isWriteTask || allowsPlaywrightCli) {
465
+ try {
466
+ const customTools = [];
467
+ if (isWriteTask) {
468
+ const policyContext = buildPiWriterToolPolicyContext({
469
+ repoRoot: input.cwd,
470
+ allowedPaths: input.task.allowedPaths,
471
+ writeSet: input.task.writeSet,
472
+ forbiddenPaths: input.task.forbiddenPaths,
473
+ writePolicy: input.task.writePolicy,
474
+ });
475
+ customTools.push(...(await createPiWriterCustomTools(policyContext)));
476
+ }
477
+ if (commandPolicy.mode === "capability-allowlist") {
478
+ for (const capability of commandPolicy.capabilities) {
479
+ const factory = PI_COMMAND_CAPABILITY_REGISTRY[capability];
480
+ if (!factory) {
481
+ throw new Error(`unknown command capability: ${capability}`);
482
+ }
483
+ if (capability === "playwright-cli") {
484
+ const caseId = resolveCaseIdFromWriteSet(input.task.writeSet) ??
485
+ input.task.id;
486
+ const evidenceDir = resolveEvidenceDirFromWriteSet(input.task.writeSet) ??
487
+ `testcase/frontend/evidence/${caseId}`;
488
+ playwrightToolContext = {
489
+ repoRoot: input.cwd,
490
+ runDir: meta.runDir,
491
+ nodeId: input.task.id,
492
+ caseId,
493
+ evidenceDir,
494
+ baseUrl: await resolveValidatedFrontendBaseUrlFromContext(input.cwd, meta.runDir),
495
+ inputRoot: "testcase/frontend/fixtures",
496
+ };
497
+ // Cleanup must be confirmed before a new case; otherwise default-session
498
+ // isolation is unknown and no Pi invocation is permitted.
499
+ const preCleanup = await cleanupPlaywrightCliDefaultSession(playwrightToolContext, undefined, "pre-start");
500
+ if (!preCleanup.ok) {
501
+ throw new Error(`browser-command-capability-unavailable: pre-start cleanup failed (${preCleanup.errorClass ?? "unknown"})`);
502
+ }
503
+ customTools.push(await createPlaywrightCliTool(playwrightToolContext));
504
+ }
505
+ else {
506
+ customTools.push(await factory(playwrightToolContext));
507
+ }
508
+ }
509
+ }
510
+ if (customTools.length > 0) {
511
+ writerToolPolicy = { requireSdk: true, customTools };
512
+ }
513
+ }
514
+ catch (error) {
515
+ return {
516
+ ok: false,
517
+ stdout: "",
518
+ stderr: `pi writer/command tool policy unavailable before Pi execution: ${error instanceof Error ? error.message : String(error)}`,
519
+ failureCategory: "tool-policy",
520
+ durationMs: Date.now() - started,
521
+ };
522
+ }
523
+ }
524
+ let result;
525
+ try {
526
+ // Phase 5 (P1-9): capture the writeSet baseline BEFORE the writer provider
527
+ // call so a transient partial write can be rolled back and recovered via a
528
+ // staged child. Only frontend-implementation writers; a failed capture is a
529
+ // hard fail (no baseline → no rollback → no recovery). Dynamic import avoids
530
+ // an executor ↔ scheduler static cycle.
531
+ if (isWriteTask &&
532
+ (input.task.id === "frontend-implement-pi" ||
533
+ input.task.id === "frontend-repair-pi") &&
534
+ (input.task.writeSet?.length ?? 0) > 0) {
535
+ try {
536
+ const { captureFrontendWriterAttemptIntent } = await import("../workflows/dag/frontend-writer-recovery.js");
537
+ await captureFrontendWriterAttemptIntent({
538
+ cwd: input.cwd,
539
+ runDir: meta.runDir,
540
+ writeSet: input.task.writeSet,
541
+ });
542
+ }
543
+ catch (error) {
544
+ return {
545
+ ok: false,
546
+ stdout: "",
547
+ stderr: `frontend writer attempt baseline capture failed: ${error instanceof Error ? error.message : String(error)}`,
548
+ failureCategory: "write-guard",
549
+ durationMs: Date.now() - started,
550
+ };
551
+ }
552
+ }
553
+ result = await piStepFn({
554
+ attachedFiles: [],
555
+ modelConfig: resolveDagPiModelConfig(input.model, input.thinking ? { thinking: input.thinking } : undefined),
556
+ prompt: input.prompt,
557
+ repoRoot: input.cwd,
558
+ step,
559
+ toolNames: resolveDagPiToolNames(input.task),
560
+ userMessage: buildDagPiUserMessage(input.task, persona, step),
561
+ sessionEventsPath: path.join(meta.runDir, input.task.id, "session-events.jsonl"),
562
+ // Absolute max wall clock from adaptive liveness policy (defaults to 4h).
563
+ timeoutMs: input.timeoutMs,
564
+ stallTimeoutMs: input.stallTimeoutMs,
565
+ abortGraceMs: input.abortGraceMs,
566
+ ...(writerToolPolicy ? { writerToolPolicy } : {}),
567
+ onActivity: bridgeActivity
568
+ ? (activity) => {
569
+ if (activity.kind === "lease" ||
570
+ activity.kind === "synthetic-heartbeat") {
571
+ return;
572
+ }
573
+ bridgeActivity(activity.kind, activity.at);
574
+ }
575
+ : undefined,
576
+ });
577
+ }
578
+ catch (error) {
579
+ if (playwrightToolContext) {
580
+ try {
581
+ await cleanupPlaywrightCliDefaultSession(playwrightToolContext, undefined, "post-execution");
582
+ }
583
+ catch {
584
+ // best-effort
585
+ }
586
+ }
587
+ throw error;
588
+ }
589
+ if (playwrightToolContext) {
590
+ try {
591
+ await cleanupPlaywrightCliDefaultSession(playwrightToolContext, undefined, "post-execution");
592
+ }
593
+ catch {
594
+ // best-effort controller cleanup must not mask the primary result
595
+ }
596
+ }
597
+ const context = {
598
+ channel: "dag",
599
+ cwd: input.cwd,
600
+ dagRunId: meta.runId,
601
+ dagNodeId: input.task.id,
602
+ };
603
+ await writePiExecutorArtifacts(path.join(meta.runDir, input.task.id), {
604
+ prompt: input.prompt,
605
+ model: input.model,
606
+ context,
607
+ result,
608
+ persona,
609
+ step,
610
+ });
611
+ const mapped = mapPiResultToDagNodeResult(result, input.task.writerOutcomePolicy
612
+ ? WRITER_OUTCOME_PROTOCOL_LINE
613
+ : input.task.firstProtocolLine);
614
+ if (!isWriteTask) {
615
+ return mapped;
616
+ }
617
+ let writeGuardOk = true;
618
+ let writeGuardViolations = [];
619
+ let changeManifestAfterStatus;
620
+ let changeManifestChangedFiles;
621
+ if (beforeStatus !== undefined) {
622
+ let recoveryEvidence;
623
+ let removalPendingRecheck;
624
+ try {
625
+ let afterStatus = await writeGuardDependencies.readGitStatusPorcelain(input.cwd, { phase: "pi-writer-after" });
626
+ let afterSnapshot = snapshotGitStatusPorcelain(afterStatus);
627
+ let afterPathFingerprints = await snapshotGitStatusPathFingerprints(input.cwd, afterSnapshot);
628
+ // Benign tool artifact recovery: a new untracked bounded regular file
629
+ // literally named `nul` at the repository root is removed with
630
+ // the Node file API, then git status is recaptured so the guard,
631
+ // outcome validation and change manifest only ever see the
632
+ // sanitized diff. Every non-matching candidate stays fail-closed.
633
+ if (afterSnapshot.has("nul")) {
634
+ const recoverRootNulArtifactFn = writeGuardDependencies.recoverRootNulArtifact ??
635
+ recoverRootNulArtifact;
636
+ const recovery = await recoverRootNulArtifactFn({
637
+ rootCwd: input.cwd,
638
+ beforeSnapshot: snapshotGitStatusPorcelain(beforeStatus),
639
+ afterSnapshot,
640
+ afterPathFingerprints,
641
+ candidateAuthorized: validateShellWriteGuardFromDiff({
642
+ changedFiles: ["nul"],
643
+ task: input.task,
644
+ concurrentSiblingWriteSets: meta.concurrentSiblingWriteSets,
645
+ }).ok,
646
+ });
647
+ const beforeStatusSha256 = createHash("sha256")
648
+ .update(beforeStatus)
649
+ .digest("hex");
650
+ const afterStatusSha256 = createHash("sha256")
651
+ .update(afterStatus)
652
+ .digest("hex");
653
+ if (recovery.action === "removed") {
654
+ const evidenceBase = {
655
+ candidatePath: "nul",
656
+ reason: recovery.reason,
657
+ action: "recovered",
658
+ result: "removed",
659
+ observedSizeBytes: recovery.observedSizeBytes,
660
+ removedAt: recovery.removedAt,
661
+ beforeStatusSha256,
662
+ afterStatusSha256,
663
+ };
664
+ removalPendingRecheck = evidenceBase;
665
+ const recheckedStatus = await writeGuardDependencies.readGitStatusPorcelain(input.cwd, {
666
+ phase: "pi-writer-after-recheck",
667
+ });
668
+ const recheckedSnapshot = snapshotGitStatusPorcelain(recheckedStatus);
669
+ afterStatus = recheckedStatus;
670
+ afterSnapshot = recheckedSnapshot;
671
+ afterPathFingerprints = await snapshotGitStatusPathFingerprints(input.cwd, recheckedSnapshot);
672
+ recoveryEvidence = {
673
+ ...evidenceBase,
674
+ recheck: {
675
+ statusSha256: createHash("sha256")
676
+ .update(recheckedStatus)
677
+ .digest("hex"),
678
+ nulStillPresent: recheckedSnapshot.has("nul"),
679
+ },
680
+ };
681
+ removalPendingRecheck = undefined;
682
+ }
683
+ else if (recovery.action === "skipped") {
684
+ recoveryEvidence = {
685
+ candidatePath: "nul",
686
+ reason: recovery.reason,
687
+ action: "skipped",
688
+ result: "kept",
689
+ ...(recovery.observedSizeBytes === undefined
690
+ ? {}
691
+ : { observedSizeBytes: recovery.observedSizeBytes }),
692
+ beforeStatusSha256,
693
+ afterStatusSha256,
694
+ recheck: {
695
+ statusSha256: afterStatusSha256,
696
+ nulStillPresent: true,
697
+ },
698
+ };
699
+ }
700
+ else {
701
+ recoveryEvidence = {
702
+ candidatePath: "nul",
703
+ reason: recovery.reason,
704
+ action: "failed",
705
+ result: "removal-failed",
706
+ observedSizeBytes: recovery.observedSizeBytes,
707
+ errorDetail: recovery.errorDetail,
708
+ beforeStatusSha256,
709
+ afterStatusSha256,
710
+ recheck: {
711
+ statusSha256: afterStatusSha256,
712
+ nulStillPresent: true,
713
+ },
714
+ };
715
+ writeGuardOk = false;
716
+ writeGuardViolations = [
717
+ `nul artifact removal failed: ${recovery.errorDetail}`,
718
+ ];
719
+ }
720
+ }
721
+ const changedFiles = pathsChangedDuringRun(snapshotGitStatusPorcelain(beforeStatus), afterSnapshot, beforePathFingerprints, afterPathFingerprints);
722
+ changeManifestAfterStatus = afterStatus;
723
+ changeManifestChangedFiles = changedFiles;
724
+ // Phase 5: record the attempt changed paths/hashes into the rollback
725
+ // intent so a transient partial write can be CAS-restored.
726
+ if ((input.task.id === "frontend-implement-pi" ||
727
+ input.task.id === "frontend-repair-pi") &&
728
+ (input.task.writeSet?.length ?? 0) > 0) {
729
+ try {
730
+ const { recordFrontendWriterAttempt } = await import("../workflows/dag/frontend-writer-recovery.js");
731
+ await recordFrontendWriterAttempt({
732
+ cwd: input.cwd,
733
+ runDir: meta.runDir,
734
+ changedPaths: changedFiles,
735
+ });
736
+ }
737
+ catch {
738
+ // best-effort: a missing intent (no baseline captured) is a no-op
739
+ }
740
+ }
741
+ const guard = validateShellWriteGuardFromDiff({
742
+ changedFiles,
743
+ task: input.task,
744
+ concurrentSiblingWriteSets: meta.concurrentSiblingWriteSets,
745
+ });
746
+ writeGuardOk = writeGuardOk && guard.ok;
747
+ writeGuardViolations = [...writeGuardViolations, ...guard.violations];
748
+ }
749
+ catch (error) {
750
+ await persistGitWriteGuardDiagnostics(meta.runDir, input.task.id, error);
751
+ if (removalPendingRecheck) {
752
+ // The artifact was already deleted but the recheck read failed:
753
+ // record the recovery facts with the recheck failure so the
754
+ // evidence trail stays complete while the node remains failed.
755
+ recoveryEvidence = {
756
+ ...removalPendingRecheck,
757
+ recheck: {
758
+ failed: true,
759
+ errorDetail: boundedRecoveryErrorDetail(error),
760
+ },
761
+ };
762
+ }
763
+ writeGuardOk = false;
764
+ writeGuardViolations = [
765
+ `git status unavailable: ${error instanceof Error ? error.message : String(error)}`,
766
+ ];
767
+ }
768
+ if (recoveryEvidence) {
769
+ await persistBenignToolArtifactRecovery({
770
+ runDir: meta.runDir,
771
+ nodeId: input.task.id,
772
+ evidence: recoveryEvidence,
773
+ });
774
+ }
775
+ }
776
+ let writerOutcomeViolation;
777
+ if (mapped.ok && input.task.writerOutcomePolicy) {
778
+ if (changeManifestChangedFiles === undefined) {
779
+ writerOutcomeViolation =
780
+ "writer outcome validation failed: actual diff is unavailable";
781
+ }
782
+ else {
783
+ const outcomeValidation = validateWriterImplementationOutcome(mapped.assistantText || mapped.stdout, changeManifestChangedFiles, {
784
+ requireChangedFiles: input.task.writerOutcomePolicy.requireChangedFiles === true,
785
+ allowMissingChangedOutcomeWhenDiffPresent: isBackendTestCompletenessRetryCandidate(input.task),
786
+ });
787
+ if (!outcomeValidation.ok) {
788
+ writerOutcomeViolation = outcomeValidation.reason;
789
+ }
790
+ }
791
+ }
792
+ if (writeGuardOk &&
793
+ beforeStatus !== undefined &&
794
+ changeManifestChangedFiles !== undefined) {
795
+ await persistWriterChangeManifest({
796
+ runDir: meta.runDir,
797
+ nodeId: input.task.id,
798
+ writerNodeId: input.task.id,
799
+ effectiveWriteSet: input.task.writeSet ?? [],
800
+ approvalSourceNodeId: input.task.resolvedFinalWriteSetApproval?.approvalSourceNodeId,
801
+ approvalDigest: input.task.resolvedFinalWriteSetApproval?.approvalDigest,
802
+ changedFiles: changeManifestChangedFiles,
803
+ beforeStatus,
804
+ afterStatus: changeManifestAfterStatus ?? "",
805
+ });
806
+ }
807
+ let completenessFailure;
808
+ if (writeGuardOk &&
809
+ isBackendTestCompletenessRetryCandidate(input.task)) {
810
+ try {
811
+ const writerRole = backendTestWriterProgressRoleForTask(input.task.id);
812
+ const backendLayout = resolveBackendTestLayout(meta.spec.backendTestLayout
813
+ ? {
814
+ testRoot: meta.spec.backendTestLayout.testRoot,
815
+ markdownRel: meta.spec.backendTestLayout.markdownRel,
816
+ scriptRel: meta.spec.backendTestLayout.scriptRel,
817
+ }
818
+ : undefined);
819
+ const progress = isBackendTestShardChildTask(input.task)
820
+ ? await assessBackendTestShardChildCompleteness({
821
+ workspaceRoot: input.cwd,
822
+ role: writerRole === "pytest-generate" ? "pytest-generate" : "md-generate",
823
+ writeSet: input.task.writeSet ?? [],
824
+ })
825
+ : isBackendTestMdPlanTask(input.task)
826
+ ? await assessBackendTestMdPlanCompleteness(input.cwd, backendLayout)
827
+ : isBackendTestPytestPlanTask(input.task)
828
+ ? await assessBackendTestPytestPlanCompleteness(input.cwd, backendLayout)
829
+ : writerRole === "pytest-generate"
830
+ ? await assessBackendTestPytestWriterCompleteness(input.cwd, backendLayout)
831
+ : await assessBackendTestMdWriterCompleteness(input.cwd, backendLayout);
832
+ await writeBackendTestWriterProgressArtifacts({
833
+ runDir: meta.runDir,
834
+ progress,
835
+ attempt: input.attempt ?? 1,
836
+ maxAttempts: input.task.retryPolicy?.maxAttempts ?? 3,
837
+ });
838
+ if (progress.status !== "PASS") {
839
+ const classified = classifyBackendTestWriterCompletenessFailure(progress);
840
+ // A recoverable partial write set (missing/broken files) always wins
841
+ // over empty-output / invalid-output / writer-empty-diff: it carries
842
+ // the concrete target paths the continuation attempt needs.
843
+ if (classified.recoverable) {
844
+ completenessFailure = {
845
+ failureCategory: INCOMPLETE_WRITE_SET_RETRY_CATEGORY,
846
+ detail: `backend-test completeness gate ${progress.status}: targets=${progress.targetPaths.join(",") || "(none)"}; issues=${progress.issues.map((issue) => issue.detail).join("; ") || "none"}`,
847
+ };
848
+ }
849
+ else if (mapped.ok && !writerOutcomeViolation) {
850
+ // Non-recoverable completeness issue only overrides a clean
851
+ // successful path; on an already-failed attempt, keep the
852
+ // executor's original category so retries reflect the real
853
+ // cause (empty-output / invalid-output / writer-empty-diff).
854
+ completenessFailure = {
855
+ failureCategory: "invalid-output",
856
+ detail: `backend-test completeness gate ${progress.status}: targets=${progress.targetPaths.join(",") || "(none)"}; issues=${progress.issues.map((issue) => issue.detail).join("; ") || "none"}`,
857
+ };
858
+ }
859
+ }
860
+ }
861
+ catch (error) {
862
+ completenessFailure = {
863
+ failureCategory: "invalid-output",
864
+ detail: `backend-test completeness gate crashed: ${error instanceof Error ? error.message : String(error)}`,
865
+ };
866
+ }
867
+ }
868
+ if (mapped.ok && writeGuardOk && !writerOutcomeViolation && !completenessFailure) {
869
+ return mapped;
870
+ }
871
+ const writerThinkingExhausted = isWriterThinkingExhausted(result, mapped, changeManifestChangedFiles);
872
+ const stderrParts = [mapped.stderr];
873
+ if (!writeGuardOk) {
874
+ stderrParts.push(`write guard failed: ${writeGuardViolations.join(", ")}`);
875
+ }
876
+ if (writerOutcomeViolation) {
877
+ stderrParts.push(writerOutcomeViolation);
878
+ }
879
+ if (completenessFailure) {
880
+ stderrParts.push(completenessFailure.detail);
881
+ }
882
+ if (writerThinkingExhausted) {
883
+ stderrParts.push(`${WRITER_THINKING_EXHAUSTED_CATEGORY}: stopReason=length, thinking observed, 0 write tool calls, 0 attributed diff; recommend a model switch and a new run`);
884
+ }
885
+ if (meta.writeGuardAttribution === "best-effort") {
886
+ stderrParts.push("write guard note: concurrent rank writers use best-effort per-node attribution; keep same-rank writeSet entries disjoint");
887
+ }
888
+ // Pure provider stall/timeout with zero workspace side effects is eligible
889
+ // for a single writer transport retry (implement-pi flake resilience).
890
+ // Partial writes, tool calls, or write-guard failures keep raw `timeout`.
891
+ const writerCleanTimeout = !mapped.ok &&
892
+ mapped.failureCategory === "timeout" &&
893
+ writeGuardOk &&
894
+ !completenessFailure &&
895
+ !writerThinkingExhausted &&
896
+ isWriterTransportRetryCandidate(input.task) &&
897
+ changeManifestChangedFiles !== undefined &&
898
+ changeManifestChangedFiles.length === 0 &&
899
+ readWriterThinkingExhaustionEvidence(result).writeToolCallCount === 0;
900
+ return {
901
+ ...mapped,
902
+ ok: false,
903
+ stderr: stderrParts.filter(Boolean).join("\n\n"),
904
+ failureCategory: mapped.ok
905
+ ? writeGuardOk
906
+ ? completenessFailure
907
+ ? completenessFailure.failureCategory
908
+ : changeManifestChangedFiles?.length === 0 &&
909
+ isWriterEmptyDiffRetryCandidate(input.task) &&
910
+ isChangedWriterImplementationOutcome(mapped.assistantText || mapped.stdout)
911
+ ? WRITER_EMPTY_DIFF_RETRY_CATEGORY
912
+ : "invalid-output"
913
+ : "write-guard"
914
+ : // When the attempt already failed with a writer-style category
915
+ // (empty-output / invalid-output / writer-empty-diff) but the workspace
916
+ // shows a recoverable partial write set, prefer incomplete-write-set so
917
+ // the continuation is retryable and carries the embedded target paths.
918
+ // Provider/transport failures (quota, auth, network, timeout,
919
+ // rate-limit, unavailable) keep their original category so a provider
920
+ // outage is never masked as a recoverable local write problem — except
921
+ // clean timeouts with zero attributed writes, remapped below.
922
+ writeGuardOk &&
923
+ completenessFailure?.failureCategory ===
924
+ INCOMPLETE_WRITE_SET_RETRY_CATEGORY &&
925
+ (mapped.failureCategory === "empty-output" ||
926
+ mapped.failureCategory === "invalid-output" ||
927
+ mapped.failureCategory === WRITER_EMPTY_DIFF_RETRY_CATEGORY)
928
+ ? INCOMPLETE_WRITE_SET_RETRY_CATEGORY
929
+ : // writer-thinking-exhausted: a length-stopped thinking-only attempt with
930
+ // zero write tool calls and zero attributed diff is terminal and
931
+ // non-retryable; recommend a model switch + fresh run. Only applies on
932
+ // the empty-output base category so provider/transport failures keep
933
+ // their original category, and only when the completeness gate did not
934
+ // upgrade to incomplete-write-set above.
935
+ writerThinkingExhausted
936
+ ? WRITER_THINKING_EXHAUSTED_CATEGORY
937
+ : writerCleanTimeout
938
+ ? WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY
939
+ : mapped.failureCategory,
940
+ durationMs: mapped.durationMs || Date.now() - started,
941
+ };
942
+ }
943
+ export function validateWriterImplementationOutcome(text, changedFiles, options) {
944
+ const parsed = parseWriterImplementationOutcome(text);
945
+ const diagnostics = writerOutcomeDiagnostics(text, parsed, changedFiles.length);
946
+ if (parsed.kind === "missing" &&
947
+ options?.allowMissingChangedOutcomeWhenDiffPresent === true &&
948
+ changedFiles.length > 0) {
949
+ return { ok: true, outcome: "changed" };
950
+ }
951
+ if (parsed.kind !== "valid") {
952
+ return {
953
+ ok: false,
954
+ reason: `writer outcome validation failed: ${parsed.kind} outcome; ${diagnostics}; expected IMPLEMENTATION_OUTCOME: changed, IMPLEMENTATION_OUTCOME: already-satisfied, or IMPLEMENTATION_OUTCOME: blocked`,
955
+ };
956
+ }
957
+ const outcome = parsed.outcome;
958
+ if (outcome === "blocked") {
959
+ return {
960
+ ok: false,
961
+ reason: `writer outcome validation failed: IMPLEMENTATION_OUTCOME: blocked cannot complete successfully; ${diagnostics}`,
962
+ };
963
+ }
964
+ if (outcome === "changed" && changedFiles.length === 0) {
965
+ return {
966
+ ok: false,
967
+ reason: `writer outcome validation failed: changed outcome has an empty diff; ${diagnostics}`,
968
+ };
969
+ }
970
+ if (outcome === "already-satisfied" && changedFiles.length > 0) {
971
+ return {
972
+ ok: false,
973
+ reason: `writer outcome validation failed: already-satisfied outcome has a non-empty diff; ${diagnostics}`,
974
+ };
975
+ }
976
+ if (options?.requireChangedFiles === true && changedFiles.length === 0) {
977
+ return {
978
+ ok: false,
979
+ reason: `writer outcome validation failed: node requires a non-empty diff; ${diagnostics}`,
980
+ };
981
+ }
982
+ return { ok: true, outcome };
983
+ }
984
+ function parseWriterImplementationOutcome(text) {
985
+ const lines = text.split(/\r?\n/);
986
+ const candidates = [];
987
+ for (const [lineIndex, line] of lines.entries()) {
988
+ const localizedOutcome = localizedWriterImplementationOutcome(line);
989
+ if (localizedOutcome) {
990
+ candidates.push({
991
+ lineIndex,
992
+ value: localizedOutcome,
993
+ outcome: localizedOutcome,
994
+ });
995
+ continue;
996
+ }
997
+ const nextLine = lines[lineIndex + 1];
998
+ const normalized = normalizeProtocolLine(line, WRITER_OUTCOME_PROTOCOL_LINE, nextLine);
999
+ if (normalized === undefined)
1000
+ continue;
1001
+ const value = normalized.slice(WRITER_OUTCOME_PROTOCOL_LINE.length).trim();
1002
+ const outcome = isWriterImplementationOutcome(value) ? value : undefined;
1003
+ candidates.push({
1004
+ lineIndex,
1005
+ value,
1006
+ outcome,
1007
+ });
1008
+ }
1009
+ if (candidates.length === 0) {
1010
+ return { kind: "missing", candidates };
1011
+ }
1012
+ if (candidates.some((candidate) => candidate.outcome === undefined)) {
1013
+ return { kind: "unknown", candidates };
1014
+ }
1015
+ const outcomes = new Set(candidates.map((candidate) => candidate.outcome));
1016
+ if (outcomes.size !== 1) {
1017
+ return { kind: "conflicting", candidates };
1018
+ }
1019
+ return {
1020
+ kind: "valid",
1021
+ outcome: candidates[0].outcome,
1022
+ candidates,
1023
+ };
1024
+ }
1025
+ function localizedWriterImplementationOutcome(line) {
1026
+ const normalized = normalizedProtocolValue(line);
1027
+ const match = /^(?:实现|实施)结果\s*[::]\s*(已变更|已更改|已修改|已满足|无需变更|已阻塞|阻塞)$/u.exec(normalized);
1028
+ if (!match)
1029
+ return undefined;
1030
+ switch (match[1]) {
1031
+ case "已变更":
1032
+ case "已更改":
1033
+ case "已修改":
1034
+ return "changed";
1035
+ case "已满足":
1036
+ case "无需变更":
1037
+ return "already-satisfied";
1038
+ case "已阻塞":
1039
+ case "阻塞":
1040
+ return "blocked";
1041
+ default:
1042
+ return undefined;
1043
+ }
1044
+ }
1045
+ function isWriterImplementationOutcome(value) {
1046
+ return (value === "changed" || value === "already-satisfied" || value === "blocked");
1047
+ }
1048
+ function isChangedWriterImplementationOutcome(text) {
1049
+ const parsed = parseWriterImplementationOutcome(text);
1050
+ return parsed.kind === "valid" && parsed.outcome === "changed";
1051
+ }
1052
+ function writerOutcomeDiagnostics(text, parsed, changedFiles) {
1053
+ const firstNonEmpty = text
1054
+ .split(/\r?\n/)
1055
+ .map((line) => line.trim())
1056
+ .find(Boolean) ?? "(empty)";
1057
+ const candidateSummary = parsed.candidates.length === 0
1058
+ ? "none"
1059
+ : parsed.candidates
1060
+ .slice(0, 4)
1061
+ .map((candidate) => candidate.outcome
1062
+ ? `${candidate.outcome}@line${candidate.lineIndex + 1}`
1063
+ : `unknown(${boundedWriterDiagnostic(candidate.value)})@line${candidate.lineIndex + 1}`)
1064
+ .join(",");
1065
+ return `firstNonEmpty=${boundedWriterDiagnostic(firstNonEmpty)}; candidates=${candidateSummary}; changedFiles=${changedFiles}`;
1066
+ }
1067
+ function boundedWriterDiagnostic(value) {
1068
+ return JSON.stringify(truncateUtf8Preview(redactSecrets(value), 160));
1069
+ }
1070
+ export function mapPiResultToDagNodeResult(result, firstProtocolLine) {
1071
+ const assistantText = canonicalizeProtocolFirstLine(result.assistantText, firstProtocolLine);
1072
+ return {
1073
+ ok: result.ok,
1074
+ stdout: assistantText || result.stdout,
1075
+ stderr: result.stderr,
1076
+ failureCategory: result.failureCategory,
1077
+ durationMs: result.durationMs,
1078
+ assistantText,
1079
+ backend: result.backend,
1080
+ sdkAttempted: result.sdkAttempted,
1081
+ tokensUsed: result.tokensUsed,
1082
+ parsedEvents: result.parsedEvents,
1083
+ stopReason: readWriterThinkingExhaustionEvidence(result).stopReason,
1084
+ };
1085
+ }
1086
+ function canonicalizeProtocolFirstLine(assistantText, firstProtocolLine) {
1087
+ if (!assistantText || !firstProtocolLine)
1088
+ return assistantText;
1089
+ const lines = assistantText.split(/\r?\n/);
1090
+ let protocolIndex = -1;
1091
+ let protocolNextLineIndex = -1;
1092
+ let protocolLine = "";
1093
+ for (const [index, line] of lines.entries()) {
1094
+ const nextLine = lines[index + 1];
1095
+ const normalized = normalizeProtocolLine(line, firstProtocolLine, nextLine);
1096
+ if (normalized !== undefined) {
1097
+ protocolIndex = index;
1098
+ if (normalizeProtocolLine(line, firstProtocolLine) === undefined &&
1099
+ nextLine !== undefined &&
1100
+ normalizedProtocolValue(nextLine) !== "") {
1101
+ protocolNextLineIndex = index + 1;
1102
+ }
1103
+ protocolLine = normalized;
1104
+ break;
1105
+ }
1106
+ }
1107
+ if (protocolIndex < 0)
1108
+ return assistantText;
1109
+ if (protocolIndex === 0) {
1110
+ const remaining = lines.slice(protocolNextLineIndex === 1 ? 2 : 1);
1111
+ return [protocolLine, ...remaining].join("\n");
1112
+ }
1113
+ const before = lines.slice(0, protocolIndex);
1114
+ const after = lines.slice(protocolIndex + 1);
1115
+ if (protocolNextLineIndex === protocolIndex + 1) {
1116
+ after.shift();
1117
+ }
1118
+ while (before.at(-1)?.trim() === "" && after.at(0)?.trim() === "") {
1119
+ after.shift();
1120
+ }
1121
+ const bodyLines = [...before, ...after];
1122
+ while (bodyLines.at(0)?.trim() === "")
1123
+ bodyLines.shift();
1124
+ while (bodyLines.at(-1)?.trim() === "")
1125
+ bodyLines.pop();
1126
+ return bodyLines.length > 0
1127
+ ? `${protocolLine}\n\n${bodyLines.join("\n")}`
1128
+ : protocolLine;
1129
+ }
1130
+ function normalizeProtocolLine(line, firstProtocolLine, nextLine) {
1131
+ const normalizedLine = stripMarkdownLineDecorations(line);
1132
+ if (!firstProtocolLine)
1133
+ return normalizedLine;
1134
+ const label = firstProtocolLine.replace(/[::]\s*$/, "").trim();
1135
+ const labelPattern = label
1136
+ .split(/[_\-\s]+/)
1137
+ .filter(Boolean)
1138
+ .map(escapeRegExp)
1139
+ .join("[_\\-\\s]+");
1140
+ if (!labelPattern)
1141
+ return undefined;
1142
+ const direct = normalizedLine.match(new RegExp(`^${labelPattern}\\s*[::]\\s*(.+)$`, "i"));
1143
+ if (direct) {
1144
+ const value = normalizedProtocolValue(direct[1] ?? "");
1145
+ return value ? `${firstProtocolLine} ${value}` : undefined;
1146
+ }
1147
+ // Writers sometimes place a short delivery sentence before the protocol
1148
+ // line. Accept the protocol token when it appears inline, while preserving
1149
+ // the candidate value so template repetitions still fail as unknown or
1150
+ // conflicting outcomes.
1151
+ const inline = normalizedLine.match(new RegExp(`${labelPattern}\\s*[::]\\s*(.+)$`, "i"));
1152
+ if (inline) {
1153
+ const value = normalizedProtocolValue(inline[1] ?? "");
1154
+ return value ? `${firstProtocolLine} ${value}` : undefined;
1155
+ }
1156
+ const splitValue = normalizedLine.match(new RegExp(`^${labelPattern}\\s*[::]?\\s*$`, "i"));
1157
+ if (splitValue && nextLine !== undefined) {
1158
+ const value = normalizedProtocolValue(nextLine);
1159
+ return value ? `${firstProtocolLine} ${value}` : undefined;
1160
+ }
1161
+ return undefined;
1162
+ }
1163
+ function normalizedProtocolValue(value) {
1164
+ let normalized = stripMarkdownLineDecorations(value);
1165
+ normalized = normalized.replace(/^[::]\s*/, "").trim();
1166
+ normalized = normalized.replace(/[。.!;;,,]+$/u, "").trim();
1167
+ normalized = stripMarkdownLineDecorations(normalized);
1168
+ return normalized;
1169
+ }
1170
+ function stripMarkdownLineDecorations(line) {
1171
+ let trimmed = line.trim();
1172
+ trimmed = trimmed.replace(/^(?:>\s*)+/, "");
1173
+ trimmed = trimmed.replace(/^(?:[-*+]\s+|\d+[.)]\s+)/, "");
1174
+ const emphasized = trimmed.match(/^(\*{1,3}|_{1,3}|`{1,3})\s*(.*?)\s*\1$/);
1175
+ trimmed = (emphasized?.[2] ?? trimmed).trim();
1176
+ return trimmed;
1177
+ }
1178
+ function escapeRegExp(value) {
1179
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1180
+ }
1181
+ async function persistWriterGitBaseline(input) {
1182
+ const fingerprintEntries = [...input.beforePathFingerprints.entries()].sort(([left], [right]) => left.localeCompare(right));
1183
+ const baseline = {
1184
+ schemaVersion: 1,
1185
+ nodeId: input.nodeId,
1186
+ phase: "pi-writer-before",
1187
+ capturedAt: new Date().toISOString(),
1188
+ statusSha256: createHash("sha256").update(input.beforeStatus).digest("hex"),
1189
+ dirtyPaths: [...input.beforeSnapshot.keys()].sort(),
1190
+ pathFingerprintsSha256: createHash("sha256")
1191
+ .update(JSON.stringify(fingerprintEntries))
1192
+ .digest("hex"),
1193
+ };
1194
+ await writeDagNodeJsonArtifact(input.runDir, input.nodeId, "write-guard-baseline.json", baseline);
1195
+ }
1196
+ async function persistGitWriteGuardDiagnostics(runDir, nodeId, error) {
1197
+ if (!(error instanceof GitStatusUnavailableError))
1198
+ return;
1199
+ await writeDagNodeJsonArtifact(runDir, nodeId, "git-write-guard-diagnostics.json", error.diagnostics);
1200
+ }
1201
+ function boundedRecoveryErrorDetail(error) {
1202
+ const detail = error instanceof Error ? error.message : String(error);
1203
+ return detail.length <= 1000
1204
+ ? detail
1205
+ : `${detail.slice(0, 1000)}...[truncated]`;
1206
+ }
1207
+ /**
1208
+ * Persist bounded run-owned evidence for a recognized repository-root `nul`
1209
+ * candidate: candidate path, reason, action, result and recheck facts plus
1210
+ * status hashes. Never records environment variables or secrets.
1211
+ */
1212
+ async function persistBenignToolArtifactRecovery(input) {
1213
+ const artifact = {
1214
+ schemaVersion: 1,
1215
+ nodeId: input.nodeId,
1216
+ candidatePath: input.evidence.candidatePath,
1217
+ reason: input.evidence.reason,
1218
+ action: input.evidence.action,
1219
+ result: input.evidence.result,
1220
+ ...(input.evidence.observedSizeBytes === undefined
1221
+ ? {}
1222
+ : { observedSizeBytes: input.evidence.observedSizeBytes }),
1223
+ ...(input.evidence.errorDetail
1224
+ ? { errorDetail: input.evidence.errorDetail }
1225
+ : {}),
1226
+ ...(input.evidence.removedAt
1227
+ ? { removedAt: input.evidence.removedAt }
1228
+ : {}),
1229
+ beforeStatusSha256: input.evidence.beforeStatusSha256,
1230
+ afterStatusSha256: input.evidence.afterStatusSha256,
1231
+ recheck: input.evidence.recheck,
1232
+ };
1233
+ await writeDagNodeJsonArtifact(input.runDir, input.nodeId, "benign-tool-artifact-recovery.json", artifact);
1234
+ }
1235
+ /**
1236
+ * Validate the writer's observed diff against its declared write boundary.
1237
+ * Inlined mirror of runPostRunWriteGuard that reuses the already-computed diff
1238
+ * so the change manifest and the guard share one source of truth.
1239
+ */
1240
+ function validateShellWriteGuardFromDiff(input) {
1241
+ return validateShellWriteGuard({
1242
+ changedPaths: input.changedFiles,
1243
+ writePolicy: input.task.writePolicy,
1244
+ writeSet: input.task.writeSet,
1245
+ allowedPaths: input.task.allowedPaths,
1246
+ forbiddenPaths: input.task.forbiddenPaths,
1247
+ concurrentSiblingWriteSets: input.concurrentSiblingWriteSets,
1248
+ allowSiblingWriteSetAttribution: input.task.writePolicy === "exclusive" &&
1249
+ (input.concurrentSiblingWriteSets?.length ?? 0) > 0,
1250
+ });
1251
+ }
1252
+ /**
1253
+ * Persist the writer's actual changeset as a run-owned artifact so the
1254
+ * project governance context resolver can attribute exactly this run's
1255
+ * writes (not final `git status`, which may include pre-existing changes).
1256
+ */
1257
+ async function persistWriterChangeManifest(input) {
1258
+ const manifest = {
1259
+ schemaVersion: 1,
1260
+ writerNodeId: input.writerNodeId,
1261
+ effectiveWriteSet: [...input.effectiveWriteSet],
1262
+ ...(input.approvalSourceNodeId
1263
+ ? { approvalSourceNodeId: input.approvalSourceNodeId }
1264
+ : {}),
1265
+ ...(input.approvalDigest
1266
+ ? { approvalDigest: input.approvalDigest }
1267
+ : {}),
1268
+ changedFiles: input.changedFiles,
1269
+ beforeStatusSha256: createHash("sha256")
1270
+ .update(input.beforeStatus)
1271
+ .digest("hex"),
1272
+ afterStatusSha256: createHash("sha256")
1273
+ .update(input.afterStatus)
1274
+ .digest("hex"),
1275
+ };
1276
+ await writeDagNodeJsonArtifact(input.runDir, input.nodeId, "change-manifest.json", manifest);
1277
+ }