@tea-agent/loop-agent 0.41.1-beta.0 → 0.42.0-next.2

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 (277) hide show
  1. package/CHANGELOG.md +78 -206
  2. package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
  3. package/dist/adapters/context-transfer/pi-session.js +61 -0
  4. package/dist/application/dag/generate-task-dag.js +19 -75
  5. package/dist/application/task-lifecycle/advance.js +5 -24
  6. package/dist/application/task-lifecycle/observe.js +17 -171
  7. package/dist/application/task-lifecycle/plan-transitions.js +7 -42
  8. package/dist/application/task-lifecycle/recommendations.js +2 -13
  9. package/dist/build-stamp.json +3 -3
  10. package/dist/cli/command-definitions.js +12 -7
  11. package/dist/cli/program.js +23 -6
  12. package/dist/commands/client-recovery.js +0 -3
  13. package/dist/commands/dag-artifact.js +284 -0
  14. package/dist/commands/dag-context.js +184 -0
  15. package/dist/commands/dag-rerun.js +206 -1
  16. package/dist/commands/init.js +1 -27
  17. package/dist/commands/task-advance.js +0 -19
  18. package/dist/executors/dag-pi-executor.js +266 -3792
  19. package/dist/executors/pi-executor.js +4 -15
  20. package/dist/executors/pi-sdk-executor.js +3 -0
  21. package/dist/executors/shell-executor.js +217 -945
  22. package/dist/executors/shell-write-guard.js +0 -7
  23. package/dist/{worker → infrastructure}/console/app-data.js +4 -0
  24. package/dist/infrastructure/console/artifact-revision-store.js +430 -0
  25. package/dist/infrastructure/console/context-export-store.js +160 -0
  26. package/dist/infrastructure/console/dir-lock.js +132 -0
  27. package/dist/infrastructure/console/operation-store.js +197 -0
  28. package/dist/infrastructure/harness/artifact-store.js +10 -1
  29. package/dist/infrastructure/harness/atomic-write.js +12 -2
  30. package/dist/shared/context-transfer/artifact-revision.js +172 -0
  31. package/dist/shared/context-transfer.js +418 -0
  32. package/dist/shared/dag-failure-category.js +0 -12
  33. package/dist/shared/openspec-spec.js +4 -70
  34. package/dist/shared/operator/capabilities.js +14 -7
  35. package/dist/shared/operator/safe-run-summary.js +1 -0
  36. package/dist/shared/path-safety.js +93 -0
  37. package/dist/shared/preview.js +28 -4
  38. package/dist/task/config-types.js +80 -35
  39. package/dist/task/contract/adopt.js +0 -4
  40. package/dist/task/contract/import-revision.js +0 -4
  41. package/dist/task/contract/project.js +0 -3
  42. package/dist/task/contract/schema.js +1 -2
  43. package/dist/task/frontend-project-capability.js +20 -203
  44. package/dist/task/runtime.js +2 -5
  45. package/dist/task/source-prepare/build-draft.js +3 -3
  46. package/dist/task/source-prepare/fragment-inventory.js +9 -15
  47. package/dist/task/source-prepare/prepare.js +1 -89
  48. package/dist/task/source-prepare/semantic-intake.js +2 -6
  49. package/dist/task/source-references.js +1 -22
  50. package/dist/task/task-demand-routing.js +3 -0
  51. package/dist/worker/console/chat/chat-event-store.js +2 -2
  52. package/dist/worker/console/chat/pi-runtime.js +3 -2
  53. package/dist/worker/console/chat/resource-preferences-store.js +1 -1
  54. package/dist/worker/console/chat/routes.js +13 -4
  55. package/dist/worker/console/chat/semantic-activity.js +12 -11
  56. package/dist/worker/console/chat/session-stats.js +96 -0
  57. package/dist/worker/console/chat/session-store.js +1 -1
  58. package/dist/worker/console/chat/turn-process.js +28 -4
  59. package/dist/worker/console/chat/user-questions.js +1 -1
  60. package/dist/worker/console/console-update-runtime.js +1 -1
  61. package/dist/worker/console/context-transfer-diagnostics.js +198 -0
  62. package/dist/worker/console/dag-confirmation.js +1 -1
  63. package/dist/worker/console/dag-execution-receipt.js +1 -1
  64. package/dist/worker/console/doctor.js +1 -1
  65. package/dist/worker/console/draft-store.js +1 -1
  66. package/dist/worker/console/human-gate-token.js +1 -1
  67. package/dist/worker/console/index.js +3 -6
  68. package/dist/worker/console/interview/assessment.js +1 -1
  69. package/dist/worker/console/interview/session.js +1 -1
  70. package/dist/worker/console/operation-runner.js +45 -4
  71. package/dist/worker/console/operation-sse.js +1 -1
  72. package/dist/worker/console/operation-wait.js +1 -1
  73. package/dist/worker/console/operator-actions.js +107 -168
  74. package/dist/worker/console/operator-surface-health.js +1 -1
  75. package/dist/worker/console/operator-user-error.js +169 -0
  76. package/dist/worker/console/pi-plugins.js +60 -1
  77. package/dist/worker/console/routes.js +637 -8
  78. package/dist/worker/console/security.js +35 -0
  79. package/dist/worker/console/server.js +6 -6
  80. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Bho4we4c.js → abnfDiagram-N423BO3Z-DZZ8m3PO.js} +1 -1
  81. package/dist/worker/console/static/assets/{arc-TBDkTeK0.js → arc-D6PvaVd-.js} +1 -1
  82. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-BF_fZrn2.js → architectureDiagram-T3A2C74G-B_OTOiI8.js} +1 -1
  83. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-CCnPgUe2.js → blockDiagram-VBNYF7ZC-Bv6rqHBg.js} +1 -1
  84. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BCYZJLAT.js → c4Diagram-5PPSVZJV-B8eHr0oz.js} +1 -1
  85. package/dist/worker/console/static/assets/channel-BU5gOilw.js +1 -0
  86. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-D8K6adhU.js → chunk-2GRJ4B5K-DYwR0im2.js} +1 -1
  87. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DkT1Q78b.js → chunk-2Q5K7J3B-D2WPGqXt.js} +1 -1
  88. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DuhvpIr7.js → chunk-5RXB4S5H-CQISJ_I7.js} +1 -1
  89. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BnK6dC49.js → chunk-5VM5RSS4-C0o2Du1e.js} +1 -1
  90. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DPz__z7r.js → chunk-6Q2QTUOP-4f8kr-U7.js} +1 -1
  91. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-0kkppM2j.js → chunk-GF5L2VYU-D_OWvXzX.js} +1 -1
  92. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BB41iK5t.js → chunk-JWPE2WC7-CasdPz5X.js} +1 -1
  93. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-CiVrxKHU.js → chunk-KBJHAD2P-Cj8lRrla.js} +1 -1
  94. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-C2h9Xje1.js → chunk-RYQCIY6F-CUvD1FSd.js} +1 -1
  95. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-3iOSHdbM.js → chunk-XXDRQBXY-CqLw_eqB.js} +1 -1
  96. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-DIzKJGHr.js +1 -0
  97. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-DIzKJGHr.js +1 -0
  98. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BN3A7tkk.js → cose-bilkent-JH36ORCC-ku-WqJPx.js} +1 -1
  99. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-CTuBy0Or.js → cynefin-VYW2F7L2-Bq_PYDhl.js} +1 -1
  100. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-wb6tUlMN.js → cynefinDiagram-MW4NZA55-BiGZV641.js} +1 -1
  101. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-GP1Ivx8B.js → dagre-VZM6K2ZE-C4JRlglF.js} +1 -1
  102. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-ejrcK6L0.js → diagram-7IWD3JNH-B0dNeWYG.js} +1 -1
  103. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-YFkCCvUU.js → diagram-B4RE2ZJO-Cj35YvYM.js} +1 -1
  104. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-B4rrvIaL.js → diagram-LBJQPF4R-uzQoJ2-8.js} +1 -1
  105. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-C-YIZcUf.js → diagram-Q27KOJAE-D1a-Buoz.js} +1 -1
  106. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPF5wcL1.js → diagram-UB23O5K3-XjRrLRSs.js} +1 -1
  107. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CU5SzXjO.js → ebnfDiagram-BXEA7PRR-Da_O24cW.js} +1 -1
  108. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-CpL414DE.js → erDiagram-JOGREHBK-BLJ8jrYU.js} +1 -1
  109. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-MrhLzNau.js → flowDiagram-UKHOOZJN-B9GrLjM0.js} +1 -1
  110. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Bg4qFuUo.js → ganttDiagram-PKOTCBZU-CeJ0TqiK.js} +1 -1
  111. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-ColxSXLR.js → gitGraphDiagram-DS77QQ5N-Bm2eNNFX.js} +1 -1
  112. package/dist/worker/console/static/assets/index-H9rFJiGL.css +1 -0
  113. package/dist/worker/console/static/assets/index-xwu9GxEc.js +451 -0
  114. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-Czvtm6gc.js → infoDiagram-6WML65LV-DB26i3d8.js} +1 -1
  115. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-B7Xp8HyJ.js → ishikawaDiagram-WSZJBQD7-BOGRyeZT.js} +1 -1
  116. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DWYZcvph.js → journeyDiagram-NVQOT4AX-CZRoBO_6.js} +1 -1
  117. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-KTLZRUjx.js → kanban-definition-27J2QSJJ-qlWhJyoB.js} +1 -1
  118. package/dist/worker/console/static/assets/{linear-_Exn7bfl.js → linear-CfUiDDB3.js} +1 -1
  119. package/dist/worker/console/static/assets/{mermaid.core-Cxg8kX8V.js → mermaid.core-BQe6fpqj.js} +5 -5
  120. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-oKrlo2Bt.js → mindmap-definition-FAOFIHXS-zFzWHw64.js} +1 -1
  121. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-XAeteiNd.js → pegDiagram-VL7TDLO6-DFGUqjZO.js} +1 -1
  122. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BTf1K-lp.js → pieDiagram-7S7Q4E2Y-BB5i0l8Z.js} +1 -1
  123. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-C0IlY0Jf.js → quadrantDiagram-CIZ2JOQS-obbVZ_X5.js} +1 -1
  124. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BVbKtZhW.js → railroadDiagram-AXF67PYL-BwdaNzc1.js} +1 -1
  125. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-C5e4JFcr.js → requirementDiagram-LRYGKXZP-CkTJaugh.js} +1 -1
  126. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Cz30hc29.js → sankeyDiagram-W5VNT64P-BwJ-hIgq.js} +1 -1
  127. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DS33n6d0.js → sequenceDiagram-SI44F4Z6-BzSgmm7w.js} +1 -1
  128. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-46w7v-9T.js → sizeCapture-X5ZJPWSS-Bn3oj5Q1.js} +1 -1
  129. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-pbcD5SsZ.js → stateDiagram-OKZ733FA-dxhGtL8K.js} +1 -1
  130. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Cld2qK9v.js +1 -0
  131. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DuivYBSj.js → swimlanes-SLNWSIFB-BLpEInya.js} +2 -2
  132. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-TIHpiT7w.js +8 -0
  133. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Cb9VZVIl.js → timeline-definition-Z64GVDOM-ChJGYcXy.js} +1 -1
  134. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-D2-mfOgR.js → vennDiagram-T6HMQDX7-DK-qjRer.js} +1 -1
  135. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DeS2aC76.js → wardleyDiagram-T6FBY63Y-3qeaWAg-.js} +1 -1
  136. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-WGsrFjxH.js → xychartDiagram-ELKLHX3M-CootlyP9.js} +1 -1
  137. package/dist/worker/console/static/index.html +7 -2
  138. package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
  139. package/dist/worker/console/static-src/app/useRunProgress.js +9 -2
  140. package/dist/worker/console/static-src/operator-chat/dag-progress-link.js +22 -0
  141. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +2 -0
  142. package/dist/worker/console/static-src/operator-chat/useChatThread.js +6 -0
  143. package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +28 -3
  144. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +106 -0
  145. package/dist/worker/console/static-src/shell/console-update-reload.js +25 -0
  146. package/dist/worker/console/workspace-context.js +28 -112
  147. package/dist/worker/console/workspace-registry.js +2 -2
  148. package/dist/worker/continuation/worker-continuation.js +278 -0
  149. package/dist/worker/observability/read-model.js +4 -0
  150. package/dist/worker/observe/health.js +1 -1
  151. package/dist/worker/observe/node-transparency.js +572 -0
  152. package/dist/worker/observe/routes.js +51 -1
  153. package/dist/worker/observe/static/api.js +69 -5
  154. package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
  155. package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
  156. package/dist/worker/observe/static/dag-node-purpose.js +0 -5
  157. package/dist/worker/observe/static/state.js +3 -1
  158. package/dist/worker/observe/static/styles.css +1037 -126
  159. package/dist/worker/observe/static/views/dag-inspector.js +1217 -65
  160. package/dist/worker/observe/static/views/session-timeline.js +121 -25
  161. package/dist/worker/outcomes/adapters.js +19 -0
  162. package/dist/worker/outcomes/types.js +1 -0
  163. package/dist/worker/pool/attempt-lease.js +97 -66
  164. package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
  165. package/dist/worker/pool/reconcile.js +46 -1
  166. package/dist/worker/pool/run-store.js +2 -0
  167. package/dist/worker/pool/state-projection.js +2 -0
  168. package/dist/worker/task-spec/workflow-routing.js +8 -3
  169. package/dist/workflows/dag/artifact-bindings.js +149 -0
  170. package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
  171. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +99 -4
  172. package/dist/workflows/dag/backend-test-markdown-workflow.js +13 -1
  173. package/dist/workflows/dag/backend-test-result-contract.js +1 -1
  174. package/dist/workflows/dag/backend-test-writer-completeness.js +45 -3
  175. package/dist/workflows/dag/budget-enforcement.js +10 -0
  176. package/dist/workflows/dag/context-receipt.js +305 -0
  177. package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
  178. package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
  179. package/dist/workflows/dag/context-transfer/renderers.js +93 -0
  180. package/dist/workflows/dag/contract-validator-registrations.js +2 -1
  181. package/dist/workflows/dag/frontend-implementation-contract.js +162 -932
  182. package/dist/workflows/dag/frontend-plan-render.js +1 -2
  183. package/dist/workflows/dag/frontend-prewrite-gate.js +349 -255
  184. package/dist/workflows/dag/frontend-recovery-plan.js +10 -17
  185. package/dist/workflows/dag/frontend-recovery-run.js +20 -33
  186. package/dist/workflows/dag/frontend-repair.js +432 -1
  187. package/dist/workflows/dag/frontend-review-context.js +15 -261
  188. package/dist/workflows/dag/frontend-verification-trace.js +24 -249
  189. package/dist/workflows/dag/frontend-worktree-diff.js +17 -250
  190. package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
  191. package/dist/workflows/dag/init-hybrid.js +740 -718
  192. package/dist/workflows/dag/interrupt-request.js +0 -7
  193. package/dist/workflows/dag/node-execution.js +136 -759
  194. package/dist/workflows/dag/path-safety.js +1 -0
  195. package/dist/workflows/dag/prompt.js +30 -38
  196. package/dist/workflows/dag/report.js +1 -37
  197. package/dist/workflows/dag/rerun-feedback.js +1 -256
  198. package/dist/workflows/dag/rerun-plan.js +557 -11
  199. package/dist/workflows/dag/rerun-run.js +601 -38
  200. package/dist/workflows/dag/rerun-task.js +0 -29
  201. package/dist/workflows/dag/retry-policy.js +109 -214
  202. package/dist/workflows/dag/runner.js +142 -430
  203. package/dist/workflows/dag/scheduler.js +16 -114
  204. package/dist/workflows/dag/skill-snapshot.js +17 -0
  205. package/dist/workflows/dag/types.js +195 -246
  206. package/dist/workflows/dag/validate.js +12 -28
  207. package/docs/architecture/runtime-boundaries.md +6 -6
  208. package/docs/architecture/worker-and-feature.md +1 -1
  209. package/docs/init-surface.manifest.json +12 -30
  210. package/docs/skills/vetted-skill-registry.md +2 -4
  211. package/docs/templates/README.md +0 -2
  212. package/docs/templates/agent-dag-report.schema.json +2 -8
  213. package/docs/templates/agent-dag.schema.json +33 -1
  214. package/docs/templates/backend-test-dag.json +18 -18
  215. package/docs/templates/frontend-implementation-contract.schema.json +1 -4
  216. package/docs/templates/product-line/task.yaml +1 -1
  217. package/harness.json +3 -3
  218. package/package.json +3 -1
  219. package/skills/frontend-bounded-implement/SKILL.md +14 -15
  220. package/skills/frontend-design-review/SKILL.md +41 -22
  221. package/skills/frontend-implementation/SKILL.md +52 -0
  222. package/skills/frontend-implementation/references/code-standards.md +33 -0
  223. package/skills/frontend-implementation/references/design-spec.md +56 -0
  224. package/skills/frontend-implementation/references/node-contracts.md +31 -0
  225. package/skills/frontend-review/SKILL.md +15 -20
  226. package/skills/frontend-review/references/review-findings.md +7 -6
  227. package/skills/frontend-verification/SKILL.md +1 -1
  228. package/skills/loop-agent/references/command-reference.md +6 -1
  229. package/skills/loop-agent/references/hybrid-dag.md +2 -2
  230. package/dist/commands/dag-follow-up.js +0 -138
  231. package/dist/executors/pi-read-budget-policy.js +0 -239
  232. package/dist/worker/console/frontend-human-decision-adapter.js +0 -19
  233. package/dist/worker/console/frontend-split-operation-adapter.js +0 -20
  234. package/dist/worker/console/operation-store.js +0 -389
  235. package/dist/worker/console/static/assets/channel-bnXW0U3C.js +0 -1
  236. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-rZpq_twR.js +0 -1
  237. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-rZpq_twR.js +0 -1
  238. package/dist/worker/console/static/assets/index-D3CC4eUz.css +0 -1
  239. package/dist/worker/console/static/assets/index-DLt4ZFvD.js +0 -437
  240. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-zBMYiUyi.js +0 -1
  241. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-d_rms-5i.js +0 -8
  242. package/dist/worker/console/static-src/active-run-badge.js +0 -17
  243. package/dist/worker/materialize/frontend-split-task-materializer.js +0 -72
  244. package/dist/workflows/dag/dag-retry-schema.js +0 -138
  245. package/dist/workflows/dag/frontend-closeout.js +0 -221
  246. package/dist/workflows/dag/frontend-design-policy.js +0 -400
  247. package/dist/workflows/dag/frontend-human-decision.js +0 -182
  248. package/dist/workflows/dag/frontend-provider-capability-matrix.js +0 -159
  249. package/dist/workflows/dag/frontend-read-budgets.js +0 -12
  250. package/dist/workflows/dag/frontend-recovery-capsule.js +0 -455
  251. package/dist/workflows/dag/frontend-recovery-controller.js +0 -202
  252. package/dist/workflows/dag/frontend-recovery-lineage.js +0 -178
  253. package/dist/workflows/dag/frontend-review-findings.js +0 -270
  254. package/dist/workflows/dag/frontend-shadow-dual-write.js +0 -914
  255. package/dist/workflows/dag/frontend-shape-capsule-store.js +0 -191
  256. package/dist/workflows/dag/frontend-shape-facts.js +0 -409
  257. package/dist/workflows/dag/frontend-shape.js +0 -427
  258. package/dist/workflows/dag/frontend-source-fidelity-ledger.js +0 -108
  259. package/dist/workflows/dag/frontend-split-application-service.js +0 -203
  260. package/dist/workflows/dag/frontend-split-orchestrator.js +0 -899
  261. package/dist/workflows/dag/frontend-typed-event-store.js +0 -452
  262. package/dist/workflows/dag/frontend-typed-event-transaction.js +0 -180
  263. package/dist/workflows/dag/frontend-writer-admission.js +0 -285
  264. package/dist/workflows/dag/frontend-writer-status.js +0 -256
  265. package/dist/workflows/dag/recovery-lease.js +0 -80
  266. package/docs/templates/frontend-implementation-dag.json +0 -89
  267. package/docs/templates/spec-registry.schema.json +0 -45
  268. package/skills/frontend-bounded-implement/references/code-standards.md +0 -19
  269. package/skills/frontend-contract/SKILL.md +0 -23
  270. package/skills/frontend-contract/references/contract-protocol.md +0 -34
  271. package/skills/frontend-plan/SKILL.md +0 -26
  272. package/skills/frontend-plan/references/decision-contract.md +0 -37
  273. package/skills/frontend-plan/references/design-decisions.md +0 -17
  274. package/skills/frontend-scout/SKILL.md +0 -25
  275. package/skills/frontend-scout/references/design-evidence.md +0 -16
  276. package/skills/frontend-scout/references/scout-evidence.md +0 -23
  277. /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
@@ -1 +0,0 @@
1
- import{s as r,b as e,a,S as s}from"./chunk-5RXB4S5H-DuhvpIr7.js";import{_ as i}from"./mermaid.core-Cxg8kX8V.js";import"./chunk-XXDRQBXY-3iOSHdbM.js";import"./chunk-KBJHAD2P-CiVrxKHU.js";import"./chunk-2GRJ4B5K-D8K6adhU.js";import"./index-DLt4ZFvD.js";var u={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1,8 +0,0 @@
1
- import{c as r,s as e}from"./flowDiagram-UKHOOZJN-MrhLzNau.js";import{_ as a}from"./mermaid.core-Cxg8kX8V.js";import"./chunk-5VM5RSS4-BnK6dC49.js";import"./chunk-XXDRQBXY-3iOSHdbM.js";import"./chunk-KBJHAD2P-CiVrxKHU.js";import"./chunk-2GRJ4B5K-D8K6adhU.js";import"./channel-bnXW0U3C.js";import"./index-DLt4ZFvD.js";var o=a(t=>`${e(t)}
2
- .swimlane.cluster rect {
3
- stroke: ${t.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,"getStyles"),s=o,n=r({defaultLayout:"swimlane",styles:s});export{n as diagram};
@@ -1,17 +0,0 @@
1
- /** Active run badge state resolved from active DAG run count. */
2
- /**
3
- * Resolve badge tone/label from the active DAG run count.
4
- *
5
- * - count === 0 → muted "0 active"(灰禁用态)
6
- * - 1 <= count <= 99 → active "<N> active"
7
- * - count > 99 → active "99+"(按 AC 字面量,不追加 " active" 后缀)
8
- *
9
- * 纯函数、零 IO、无副作用;非正输入统一钳制为 muted "0 active"。
10
- */
11
- export function deriveActiveRunBadgeState(count) {
12
- if (count <= 0)
13
- return { tone: "muted", label: "0 active" };
14
- if (count > 99)
15
- return { tone: "active", label: "99+" };
16
- return { tone: "active", label: `${count} active` };
17
- }
@@ -1,72 +0,0 @@
1
- import { z } from "zod";
2
- import { computeFrontendSplitDigest } from "../../workflows/dag/frontend-split-orchestrator.js";
3
- const idSchema = z.string().trim().min(1);
4
- const digestSchema = z.string().regex(/^[a-f0-9]{64}$/);
5
- const positiveIntegerSchema = z.number().int().positive();
6
- const pathSchema = z.string().trim().min(1);
7
- export const frontendSplitTaskMaterializationRequestSchema = z.object({
8
- kind: z.enum(["child", "integration"]),
9
- parentOperationId: idSchema,
10
- manifestDigest: digestSchema,
11
- generation: positiveIntegerSchema,
12
- taskId: idSchema,
13
- operationId: idSchema,
14
- payloadDigest: digestSchema,
15
- allowedPaths: z.array(pathSchema),
16
- writeSet: z.array(pathSchema),
17
- verifyRefs: z.array(idSchema),
18
- }).strict();
19
- export const frontendSplitTaskMaterializationResultSchema = z.object({
20
- idempotencyKey: digestSchema,
21
- requestDigest: digestSchema,
22
- taskId: idSchema,
23
- operationId: idSchema,
24
- }).strict();
25
- function identityPayload(request) {
26
- return { kind: request.kind, parentOperationId: request.parentOperationId, manifestDigest: request.manifestDigest, generation: request.generation, taskId: request.taskId, operationId: request.operationId };
27
- }
28
- export class FrontendSplitTaskMaterializer {
29
- backend;
30
- completed = new Map();
31
- inFlight = new Map();
32
- constructor(backend) {
33
- this.backend = backend;
34
- }
35
- async materialize(raw) {
36
- const request = frontendSplitTaskMaterializationRequestSchema.parse(raw);
37
- const idempotencyKey = computeFrontendSplitDigest(identityPayload(request));
38
- const requestDigest = computeFrontendSplitDigest(request);
39
- const existing = this.completed.get(idempotencyKey);
40
- if (existing) {
41
- if (existing.requestDigest !== requestDigest)
42
- throw new Error("frontend split materialization payload drift");
43
- return existing;
44
- }
45
- const pending = this.inFlight.get(idempotencyKey);
46
- if (pending) {
47
- const result = await pending;
48
- if (result.requestDigest !== requestDigest)
49
- throw new Error("frontend split materialization payload drift");
50
- return result;
51
- }
52
- const promise = this.perform(request, idempotencyKey, requestDigest);
53
- this.inFlight.set(idempotencyKey, promise);
54
- try {
55
- const result = await promise;
56
- this.completed.set(idempotencyKey, result);
57
- return result;
58
- }
59
- finally {
60
- this.inFlight.delete(idempotencyKey);
61
- }
62
- }
63
- async perform(request, idempotencyKey, requestDigest) {
64
- const task = await this.backend.ensureTask({ idempotencyKey, taskId: request.taskId, payloadDigest: requestDigest, request });
65
- if (!task.complete || task.taskId !== request.taskId)
66
- throw new Error("frontend split task materialization incomplete or drifted");
67
- const operation = await this.backend.ensureOperation({ idempotencyKey, taskId: request.taskId, operationId: request.operationId, payloadDigest: requestDigest, request });
68
- if (!operation.complete || operation.taskId !== request.taskId || operation.operationId !== request.operationId)
69
- throw new Error("frontend split operation materialization incomplete or drifted");
70
- return frontendSplitTaskMaterializationResultSchema.parse({ idempotencyKey, requestDigest, taskId: request.taskId, operationId: request.operationId });
71
- }
72
- }
@@ -1,138 +0,0 @@
1
- import { z } from "zod";
2
- /**
3
- * Leaf module for the retry-policy schema surface: failure-category constants,
4
- * the zod retry-policy schema, and the target-template transient retry profile
5
- * literal.
6
- *
7
- * `types.ts` reads `dagRetryPolicySchema` / `TARGET_TEMPLATE_TRANSIENT_RETRY_PROFILE`
8
- * during its own module initialization, and the retry-policy module transitively
9
- * reaches `types.ts` (retry-policy → frontend-recovery-capsule →
10
- * frontend-recovery-lineage → frontend-implementation-contract → types). With
11
- * these definitions living in retry-policy itself, a run whose entry module is
12
- * retry-policy (e.g. test/dag-node-retry.test.ts) evaluates `types.ts` while
13
- * retry-policy is still initializing and reads an undefined
14
- * `dagRetryPolicySchema`. Keeping this module a leaf (zod is its only import)
15
- * makes the cycle resolve order-independently; retry-policy re-exports
16
- * everything for source compatibility.
17
- */
18
- /**
19
- * Failure categories that are safe to auto-retry for read-only Pi nodes.
20
- *
21
- * These are failures with no repository write side-effects: model connection
22
- * interruption, provider rate-limiting, temporary provider unavailability,
23
- * request timeout, or a settled read-only turn with no assistant text.
24
- *
25
- * `quota` is intentionally NOT included: a quota exhaustion is an account
26
- * billing/plan state, not a transient rate limit, and retrying immediately
27
- * will not help and may waste budget.
28
- */
29
- export const DEFAULT_DAG_RETRY_CATEGORIES = [
30
- "timeout",
31
- "network",
32
- "rate-limit",
33
- "unavailable",
34
- "empty-output",
35
- ];
36
- export const STRUCTURED_OUTPUT_RETRY_CATEGORY = "output-too-large";
37
- export const PROTOCOL_INVALID_RETRY_CATEGORY = "protocol-invalid";
38
- /** Recoverable model artifact/schema formatting failure on read-only structured nodes. */
39
- export const STRUCTURED_ARTIFACT_INVALID_RETRY_CATEGORY = "invalid-output";
40
- /** Provider stopReason=length truncated the response before the JSON contract completed. */
41
- export const STRUCTURED_OUTPUT_TRUNCATED_RETRY_CATEGORY = "structured-output-truncated";
42
- /**
43
- * The review node emitted a verdict in response text (e.g. "VERDICT: pass")
44
- * but never committed the authoritative typed terminal tool call
45
- * (approve_review / request_review_changes). Read-only and safe to retry with
46
- * a corrected instruction; the typed terminal is the only authority.
47
- */
48
- export const REVIEW_TERMINAL_MISSING_RETRY_CATEGORY = "review-terminal-missing";
49
- /**
50
- * The plan node issued too many read-only tool calls (read/grep/ls/find),
51
- * blowing up the context window and eventually a 400 request-too-large. The
52
- * plan should trust upstream typed facts instead of re-reading contract/scout
53
- * outputs and source files repeatedly. Read-only and safe to retry with a
54
- * reduced-reading instruction.
55
- */
56
- export const READ_BURST_RETRY_CATEGORY = "read-burst";
57
- /**
58
- * Provider returned a context-overflow error (400 request-too-large / context
59
- * window exceeded). The SDK compacts and auto-retries once internally; when it
60
- * still surfaces, the executor classifies this so retry policies and reports
61
- * treat it as overflow (not empty-output) and can retry with a compacted
62
- * session / fresh context.
63
- */
64
- export const CONTEXT_OVERFLOW_RETRY_CATEGORY = "context-overflow";
65
- /** Retry only a proven no-op from an explicitly opt-in bounded Pi writer. */
66
- export const WRITER_EMPTY_DIFF_RETRY_CATEGORY = "writer-empty-diff";
67
- /** Retry when a backend-test writer finished but Completeness Gate found missing/broken targets. */
68
- export const INCOMPLETE_WRITE_SET_RETRY_CATEGORY = "incomplete-write-set";
69
- /**
70
- * Provider/transport stall or absolute timeout on a Pi exclusive writer that
71
- * left zero attributed workspace writes and zero write-tool calls. Safe to
72
- * retry once because the attempt was a pure provider flake (no side effects).
73
- * Partial writes keep the original `timeout` category and do NOT retry.
74
- */
75
- export const WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY = "writer-clean-timeout";
76
- export const STRUCTURED_REQUIRED_DAG_RETRY_CATEGORIES = [
77
- ...DEFAULT_DAG_RETRY_CATEGORIES,
78
- STRUCTURED_OUTPUT_RETRY_CATEGORY,
79
- STRUCTURED_ARTIFACT_INVALID_RETRY_CATEGORY,
80
- STRUCTURED_OUTPUT_TRUNCATED_RETRY_CATEGORY,
81
- ];
82
- /** Categories allowed on nodes that declare a machine-readable outputProtocol. */
83
- export const PROTOCOL_AWARE_DAG_RETRY_CATEGORIES = [
84
- ...DEFAULT_DAG_RETRY_CATEGORIES,
85
- PROTOCOL_INVALID_RETRY_CATEGORY,
86
- STRUCTURED_ARTIFACT_INVALID_RETRY_CATEGORY,
87
- ];
88
- export const ALL_DAG_RETRY_CATEGORIES = [
89
- ...DEFAULT_DAG_RETRY_CATEGORIES,
90
- STRUCTURED_OUTPUT_RETRY_CATEGORY,
91
- PROTOCOL_INVALID_RETRY_CATEGORY,
92
- STRUCTURED_ARTIFACT_INVALID_RETRY_CATEGORY,
93
- STRUCTURED_OUTPUT_TRUNCATED_RETRY_CATEGORY,
94
- WRITER_EMPTY_DIFF_RETRY_CATEGORY,
95
- INCOMPLETE_WRITE_SET_RETRY_CATEGORY,
96
- WRITER_CLEAN_TIMEOUT_RETRY_CATEGORY,
97
- REVIEW_TERMINAL_MISSING_RETRY_CATEGORY,
98
- READ_BURST_RETRY_CATEGORY,
99
- CONTEXT_OVERFLOW_RETRY_CATEGORY,
100
- ];
101
- export const dagRetryCategorySchema = z.enum(ALL_DAG_RETRY_CATEGORIES);
102
- export const dagRetryBackoffSchema = z.enum(["exponential"]);
103
- /**
104
- * Opt-in retry policy for a DagTask. Generated for safe read-only Pi nodes,
105
- * except the single validation-gated writer-empty-diff policy. Validation
106
- * rejects all other writers, dynamic, shell, static, and decision-gate nodes.
107
- */
108
- export const dagRetryPolicySchema = z
109
- .object({
110
- /**
111
- * Total number of attempts (including the first try). Must be 1..5.
112
- * A value of 1 disables retry (one attempt, no retry).
113
- */
114
- maxAttempts: z.number().int().positive().max(5),
115
- backoff: dagRetryBackoffSchema.default("exponential"),
116
- /** Initial delay before the second attempt, in milliseconds. */
117
- initialDelayMs: z.number().int().nonnegative().default(2000),
118
- /** Upper bound on a single backoff delay, in milliseconds. */
119
- maxDelayMs: z.number().int().nonnegative().default(30000),
120
- /**
121
- * Explicit set of failure categories eligible for retry. Defaults to
122
- * {@link DEFAULT_DAG_RETRY_CATEGORIES}. `quota` and other categories
123
- * are never retried.
124
- */
125
- retryCategories: z
126
- .array(dagRetryCategorySchema)
127
- .default([...DEFAULT_DAG_RETRY_CATEGORIES]),
128
- })
129
- .superRefine((policy, ctx) => {
130
- if (policy.maxDelayMs < policy.initialDelayMs) {
131
- ctx.addIssue({
132
- code: z.ZodIssueCode.custom,
133
- message: "retryPolicy.maxDelayMs must be >= retryPolicy.initialDelayMs",
134
- path: ["maxDelayMs"],
135
- });
136
- }
137
- });
138
- export const TARGET_TEMPLATE_TRANSIENT_RETRY_PROFILE = "standard-reviewed-supervised-v1";
@@ -1,221 +0,0 @@
1
- import { z } from "zod";
2
- export { buildFrontendShapeTransitionCapsule, computeFrontendShapeSourceDigest, evaluateFrontendShapeEscalation, FRONTEND_SHAPE_NODE_COUNTS, frontendShapeTransitionCapsuleSchema, frontendShapeTransitionReshapeCapsuleSchema, frontendShapeTransitionSplitCapsuleSchema, parseFrontendShapeTransitionCapsule, resolveFrontendTaskShape, } from "./frontend-shape.js";
3
- /**
4
- * Deterministic frontend closeout facts + renderer (M7).
5
- *
6
- * The functions here are pure (no I/O, no model, no side effects). The closeout
7
- * renderer reads only committed facts, never model summaries or node prose, so
8
- * a weak conclusion (failed / not-run / baseline-debt / mock-backed / pending)
9
- * can never be rewritten into a stronger one (passed / real-integrated).
10
- *
11
- * Canonical shape routing and transition capsules live in `frontend-shape.ts`
12
- * and are re-exported here for callers that also consume closeout contracts.
13
- */
14
- export const FRONTEND_CLOSEOUT_FACTS_SCHEMA_ID = "frontend-closeout-facts-v1";
15
- /* ------------------------------------------------------------------ *
16
- * Enums + facts schema *
17
- * ------------------------------------------------------------------ */
18
- export const frontendCoverageStatusSchema = z.enum([
19
- "passed",
20
- "failed",
21
- "not-run",
22
- "blocked",
23
- "unavailable",
24
- ]);
25
- export const frontendLintStatusSchema = z.enum([
26
- "passed",
27
- "baseline-debt",
28
- "failed",
29
- "unavailable",
30
- ]);
31
- export const frontendIntegrationFactsSchema = z.enum([
32
- "real-api",
33
- "mock-backed",
34
- "local-no-remote",
35
- "unavailable",
36
- ]);
37
- export const frontendCloseoutFactsSchema = z
38
- .object({
39
- schemaVersion: z.literal(1),
40
- schemaId: z.literal(FRONTEND_CLOSEOUT_FACTS_SCHEMA_ID),
41
- coverageMatrix: z.array(z
42
- .object({
43
- verificationTargetId: z.string().min(1),
44
- status: frontendCoverageStatusSchema,
45
- })
46
- .strict()),
47
- lintStatus: frontendLintStatusSchema,
48
- integrationFacts: frontendIntegrationFactsSchema,
49
- reviewApproval: z
50
- .object({
51
- typedVerdict: z
52
- .enum(["approve_review", "request_review_changes"])
53
- .nullable(),
54
- legacyVerdict: z.enum(["pass", "request-revision"]).nullable(),
55
- match: z.boolean(),
56
- })
57
- .strict(),
58
- cumulativeDiff: z
59
- .object({
60
- cumulativeDigest: z.string().min(1),
61
- empty: z.boolean(),
62
- })
63
- .strict(),
64
- notRun: z
65
- .object({
66
- browser: z.literal("not-run"),
67
- visual: z.literal("not-run"),
68
- })
69
- .strict(),
70
- pendingRealIntegration: z.boolean(),
71
- residualRisks: z.array(z.string().min(1)).optional(),
72
- evidenceGaps: z.array(z.string().min(1)).optional(),
73
- })
74
- .strict();
75
- /* ------------------------------------------------------------------ *
76
- * FrontendTestHandoff (A+B AC-010) *
77
- * ------------------------------------------------------------------ */
78
- export const FRONTEND_TEST_HANDOFF_SCHEMA_ID = "frontend-test-handoff-v1";
79
- /**
80
- * A+B (AC-010): deterministic frontend-test handoff. Bound to the task id,
81
- * source digest, and candidate hash; browser/visual/runtime-a11y are always
82
- * `not-run` and the handoff is always `deferred-to-frontend-test`, so a weak
83
- * closeout can never block implementation and can never be rewritten as
84
- * passed.
85
- */
86
- export const frontendTestHandoffSchema = z
87
- .object({
88
- schemaVersion: z.literal(1),
89
- schemaId: z.literal(FRONTEND_TEST_HANDOFF_SCHEMA_ID),
90
- taskId: z.string().min(1),
91
- sourceDigest: z.string().regex(/^[a-f0-9]{64}$/),
92
- candidateHash: z.string().regex(/^[a-f0-9]{64}$/),
93
- executionStatus: z.literal("not-run"),
94
- handoffStatus: z.literal("deferred-to-frontend-test"),
95
- nonBlocking: z.literal(true),
96
- })
97
- .strict();
98
- export function buildFrontendTestHandoff(input) {
99
- return frontendTestHandoffSchema.parse({
100
- schemaVersion: 1,
101
- schemaId: FRONTEND_TEST_HANDOFF_SCHEMA_ID,
102
- taskId: input.taskId,
103
- sourceDigest: input.sourceDigest,
104
- candidateHash: input.candidateHash,
105
- executionStatus: "not-run",
106
- handoffStatus: "deferred-to-frontend-test",
107
- nonBlocking: true,
108
- });
109
- }
110
- /**
111
- * Deterministic, fail-closed mapping from structured evidence to integration
112
- * facts. Never reads model text. `real-api` is the only value that may report
113
- * real integration, and it requires both real passed evidence and satisfied
114
- * required verification evidence. Anything else downgrades to pending.
115
- */
116
- export function deriveFrontendIntegrationFacts(input) {
117
- const requiredEvidenceSatisfied = input.verificationTargets.length > 0 &&
118
- input.verificationTargets.every((target) => target.status === "ok");
119
- if (input.realApiEvidence.present &&
120
- input.realApiEvidence.passed &&
121
- requiredEvidenceSatisfied) {
122
- return "real-api";
123
- }
124
- // Required evidence not satisfied → never report real-integrated or
125
- // mock/locally-validated; evidence is unavailable.
126
- if (!requiredEvidenceSatisfied) {
127
- return "unavailable";
128
- }
129
- if (input.mockStrategy !== "not-needed" && input.mockEvidenceBound) {
130
- return "mock-backed";
131
- }
132
- if (input.mockStrategy === "not-needed" && !input.realApiEvidence.present) {
133
- return "local-no-remote";
134
- }
135
- return "unavailable";
136
- }
137
- /* ------------------------------------------------------------------ *
138
- * Deterministic closeout renderer *
139
- * ------------------------------------------------------------------ */
140
- function bulletList(items) {
141
- if (!items || items.length === 0)
142
- return "";
143
- return items.map((item) => `- ${item}`).join("\n");
144
- }
145
- function coverageLines(facts) {
146
- const lines = facts.coverageMatrix.map((entry) => `- ${entry.verificationTargetId}: ${entry.status}`);
147
- return lines.length > 0 ? lines.join("\n") : "_(none)_";
148
- }
149
- function frontendStatus(facts) {
150
- switch (facts.integrationFacts) {
151
- case "real-api":
152
- return "Frontend status: real-integrated";
153
- case "mock-backed":
154
- return "Frontend status: mock-validated";
155
- case "local-no-remote":
156
- return "Frontend status: locally-validated";
157
- case "unavailable":
158
- return "Frontend status: unverified";
159
- }
160
- }
161
- function integrationStatus(facts) {
162
- return facts.integrationFacts === "real-api"
163
- ? "Real integration: validated"
164
- : `Real integration: pending (${facts.integrationFacts})`;
165
- }
166
- function reviewApprovalLines(facts) {
167
- const { typedVerdict, legacyVerdict, match } = facts.reviewApproval;
168
- return [
169
- `typed: ${typedVerdict ?? "none"}`,
170
- `legacy: ${legacyVerdict ?? "none"}`,
171
- `match: ${match}`,
172
- ].join("\n");
173
- }
174
- /**
175
- * Render a deterministic closeout Markdown document from committed facts only.
176
- * The same facts always render byte-identical output; weak statuses are
177
- * emitted verbatim and never promoted to `passed` / real-integrated.
178
- */
179
- export function renderFrontendCloseout(facts) {
180
- const lintLine = facts.lintStatus === "baseline-debt"
181
- ? `${facts.lintStatus} (explicit debt; not passed)`
182
- : facts.lintStatus;
183
- return [
184
- "# Frontend Closeout",
185
- "",
186
- "## Coverage Matrix",
187
- coverageLines(facts),
188
- "",
189
- "## Lint Status",
190
- lintLine,
191
- "",
192
- "## Integration Facts",
193
- facts.integrationFacts,
194
- "",
195
- "## Frontend Status",
196
- frontendStatus(facts),
197
- "",
198
- "## Real Integration Status",
199
- integrationStatus(facts),
200
- "",
201
- "## Real Integration Pending",
202
- facts.pendingRealIntegration ? "yes" : "no",
203
- "",
204
- "## Review Approval",
205
- reviewApprovalLines(facts),
206
- "",
207
- "## Cumulative Diff",
208
- `digest: ${facts.cumulativeDiff.cumulativeDigest}`,
209
- `empty: ${facts.cumulativeDiff.empty}`,
210
- "",
211
- "## Browser / Visual",
212
- `Browser: ${facts.notRun.browser}`,
213
- `Visual: ${facts.notRun.visual}`,
214
- "",
215
- "## Residual Risks",
216
- bulletList(facts.residualRisks) || "_(none)_",
217
- "",
218
- "## Evidence Gaps",
219
- bulletList(facts.evidenceGaps) || "_(none)_",
220
- ].join("\n") + "\n";
221
- }