@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,6 +1,13 @@
1
+ import { randomBytes } from "node:crypto";
1
2
  import { readFile } from "node:fs/promises";
3
+ import { executeArtifactRevisionContinuation, planArtifactRevisionContinuation, } from "../workflows/dag/context-transfer/operator-actions.js";
2
4
  import { isDagRerunPromptOverrideEnabled } from "../shared/dag-prompt-override.js";
3
- import { executeDagRerun, planDagRerun, } from "../workflows/dag/rerun-run.js";
5
+ import { workerContinuationAuthorityV1Schema, } from "../shared/context-transfer.js";
6
+ import { openConsoleAppData } from "../infrastructure/console/app-data.js";
7
+ import { buildArtifactOverrideSet, consumeArtifactRevision, readArtifactRevision, readArtifactRevisionCandidate, acquireArtifactRevisionLease, releaseArtifactRevisionLease, EXECUTE_REVISION_LEASE_TTL_MS, } from "../infrastructure/console/artifact-revision-store.js";
8
+ import { buildArtifactBindingGraph } from "../workflows/dag/artifact-bindings.js";
9
+ import { locateDagRun, readDagRunSpec } from "../workflows/dag/lifecycle.js";
10
+ import { executeDagRerun, planDagRerun, readOperatorRequestReplay, } from "../workflows/dag/rerun-run.js";
4
11
  export function parseDagRerunArgs(args) {
5
12
  if (args.length === 0) {
6
13
  throw new Error("usage: dag rerun --run-id <id> --from-node <node-id> --plan [--json] | dag rerun --run-id <id> --from-node <node-id> --plan-hash <hash> --request-id <key> --reason <text> [--json]");
@@ -111,6 +118,10 @@ async function loadPromptOverrides(specs, mode) {
111
118
  return overrides;
112
119
  }
113
120
  export async function runDagRerun(repoRoot, rawArgs) {
121
+ if (rawArgs.some((arg) => arg === "--artifact-revision" || arg.startsWith("--artifact-revision="))) {
122
+ await runArtifactRevisionRerun(repoRoot, rawArgs);
123
+ return;
124
+ }
114
125
  const parsed = parseDagRerunArgs(rawArgs);
115
126
  let promptOverrides;
116
127
  const hasOverrides = parsed.promptOverrideSpecs.length > 0 ||
@@ -163,3 +174,197 @@ export async function runDagRerun(repoRoot, rawArgs) {
163
174
  }
164
175
  }
165
176
  }
177
+ function readFlag(args, name) {
178
+ const exact = args.indexOf(name);
179
+ if (exact >= 0)
180
+ return args[exact + 1];
181
+ const prefix = `${name}=`;
182
+ return args.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);
183
+ }
184
+ function parseWorkerContinuationAuthority(raw) {
185
+ if (raw === undefined)
186
+ return undefined;
187
+ let parsed;
188
+ try {
189
+ parsed = JSON.parse(raw);
190
+ }
191
+ catch {
192
+ throw new Error("dag rerun --worker-continuation must be valid JSON");
193
+ }
194
+ const result = workerContinuationAuthorityV1Schema.safeParse(parsed);
195
+ if (!result.success) {
196
+ throw new Error(`dag rerun --worker-continuation is invalid: ${result.error.issues[0]?.message ?? "schema mismatch"}`);
197
+ }
198
+ return result.data;
199
+ }
200
+ function executeLeaseHolder(requestId) {
201
+ // The request id identifies the idempotency envelope, not a live process.
202
+ // A unique invocation holder prevents two concurrent direct CLI invocations
203
+ // with the same request id from treating each other as a lease renewal.
204
+ return `cli-execute:${requestId}:${randomBytes(12).toString("hex")}`;
205
+ }
206
+ /**
207
+ * Hold the staging lease across candidate read + continuation execution so a
208
+ * concurrent discard/second execute fails with LEASE_HELD and a crashed
209
+ * process leaves a stale, TTL-takeover-able lease instead of silent races.
210
+ * The acquire/renew here also refreshes the sliding window before the long
211
+ * child run starts.
212
+ */
213
+ async function withExecuteRevisionLease(appData, requestId, revisionId, operation) {
214
+ const holder = executeLeaseHolder(requestId);
215
+ await acquireArtifactRevisionLease({
216
+ appData,
217
+ revisionId,
218
+ holder,
219
+ ttlMs: EXECUTE_REVISION_LEASE_TTL_MS,
220
+ });
221
+ try {
222
+ return await operation(holder);
223
+ }
224
+ finally {
225
+ await releaseArtifactRevisionLease({
226
+ appData,
227
+ revisionId,
228
+ holder,
229
+ }).catch(() => { });
230
+ }
231
+ }
232
+ export async function runArtifactRevisionRerunCore(repoRoot, rawArgs, cliOptions) {
233
+ const allowed = new Set([
234
+ "--run-id",
235
+ "--artifact-revision",
236
+ "--plan-hash",
237
+ "--request-id",
238
+ "--reason",
239
+ "--worker-continuation",
240
+ ]);
241
+ for (let index = 0; index < rawArgs.length; index += 1) {
242
+ const arg = rawArgs[index];
243
+ if (arg === "--plan" || arg === "--json")
244
+ continue;
245
+ const name = arg.split("=", 1)[0];
246
+ if (!allowed.has(name))
247
+ throw new Error(`unknown artifact revision rerun flag: ${arg}`);
248
+ if (!arg.includes("="))
249
+ index += 1;
250
+ }
251
+ const parentRunId = readFlag(rawArgs, "--run-id")?.trim();
252
+ const revisionId = readFlag(rawArgs, "--artifact-revision")?.trim();
253
+ const planOnly = rawArgs.includes("--plan");
254
+ if (!parentRunId || !revisionId) {
255
+ throw new Error("dag rerun artifact revision requires --run-id and --artifact-revision");
256
+ }
257
+ const appData = openConsoleAppData({
258
+ repoRoot,
259
+ ...(cliOptions?.appDataRoot ? { appDataRoot: cliOptions.appDataRoot } : {}),
260
+ });
261
+ const planHash = readFlag(rawArgs, "--plan-hash")?.trim();
262
+ const requestId = readFlag(rawArgs, "--request-id")?.trim();
263
+ const reason = readFlag(rawArgs, "--reason")?.trim();
264
+ const workerContinuation = parseWorkerContinuationAuthority(readFlag(rawArgs, "--worker-continuation"));
265
+ if (!planOnly && (!planHash || !requestId || !reason)) {
266
+ throw new Error("dag rerun artifact revision execute requires --plan-hash, --request-id, and --reason");
267
+ }
268
+ if (!planOnly) {
269
+ // Replay-first (B4): a prior execute may have consumed the revision and
270
+ // the staging record may already have been reconciled away. The persisted
271
+ // operator request is the authoritative idempotent result and must be
272
+ // honored before any dependency on the revision metadata. A replay that
273
+ // does not match the requested parent/planHash is a reuse conflict, not a
274
+ // valid idempotent answer (SF2).
275
+ const replay = await readOperatorRequestReplay(repoRoot, requestId, {
276
+ parentRunId,
277
+ planHash,
278
+ });
279
+ if (replay) {
280
+ return {
281
+ payload: replay,
282
+ exitCode: replay.ok
283
+ ? 0
284
+ : replay.errorCode === "RERUN_PLAN_DRIFT"
285
+ ? 3
286
+ : replay.errorCode === "INELIGIBLE"
287
+ ? 2
288
+ : 1,
289
+ };
290
+ }
291
+ }
292
+ const revision = await readArtifactRevision(appData, revisionId);
293
+ if (!revision || revision.parent.runId !== parentRunId) {
294
+ throw new Error("ARTIFACT_REVISION_EXPIRED");
295
+ }
296
+ const located = await locateDagRun(repoRoot, parentRunId);
297
+ if (!located)
298
+ throw new Error(`dag run not found: ${parentRunId}`);
299
+ const declaration = buildArtifactBindingGraph(await readDagRunSpec(located.runDir)).artifacts.find((item) => item.producerNodeId === revision.parent.nodeId &&
300
+ item.path === revision.parent.artifactPath);
301
+ if (!declaration)
302
+ throw new Error("ARTIFACT_BINDING_UNAVAILABLE");
303
+ const artifactOverrides = buildArtifactOverrideSet(revision);
304
+ if (planOnly) {
305
+ if (planHash || requestId || reason) {
306
+ throw new Error("dag rerun --plan cannot be combined with execute flags");
307
+ }
308
+ const plan = await planArtifactRevisionContinuation({
309
+ cwd: repoRoot,
310
+ parentRunId,
311
+ artifactId: declaration.artifactId,
312
+ artifactOverrides,
313
+ stagingRevisionSha256: revision.candidate.sha256,
314
+ ...(workerContinuation
315
+ ? { workerContinuationAuthority: workerContinuation }
316
+ : {}),
317
+ });
318
+ return { payload: { ok: plan.eligible, plan }, exitCode: plan.eligible ? 0 : 2 };
319
+ }
320
+ if (revision.state === "consumed") {
321
+ // Replay was not found above, so this is a crashed consume without a
322
+ // persisted result — refuse rather than re-execute a consumed revision.
323
+ throw new Error("ARTIFACT_REVISION_EXPIRED: revision already consumed and no operator replay exists for this request");
324
+ }
325
+ const result = await withExecuteRevisionLease(appData, requestId, revision.revisionId, async (leaseHolder) => {
326
+ const candidateBytes = await readArtifactRevisionCandidate({ appData, revision });
327
+ return executeArtifactRevisionContinuation({
328
+ cwd: repoRoot,
329
+ parentRunId,
330
+ artifactId: declaration.artifactId,
331
+ artifactOverrides,
332
+ stagingRevisionSha256: revision.candidate.sha256,
333
+ candidateBytes,
334
+ planHash: planHash,
335
+ requestId: requestId,
336
+ reason: reason,
337
+ ...(workerContinuation
338
+ ? { workerContinuationAuthority: workerContinuation }
339
+ : {}),
340
+ consumeRevision: async ({ revisionId: consumedId, expectedSha256 }) => {
341
+ await consumeArtifactRevision({
342
+ appData,
343
+ revisionId: consumedId,
344
+ expectedSha256,
345
+ holder: leaseHolder,
346
+ });
347
+ },
348
+ });
349
+ });
350
+ return {
351
+ payload: result,
352
+ exitCode: result.ok
353
+ ? 0
354
+ : result.errorCode === "RERUN_PLAN_DRIFT"
355
+ ? 3
356
+ : result.errorCode === "INELIGIBLE"
357
+ ? 2
358
+ : 1,
359
+ };
360
+ }
361
+ async function runArtifactRevisionRerun(repoRoot, rawArgs) {
362
+ const { payload, exitCode } = await runArtifactRevisionRerunCore(repoRoot, rawArgs);
363
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
364
+ if (exitCode !== 0) {
365
+ const failure = payload;
366
+ const message = failure.message ?? failure.errorCode ?? `artifact rerun failed with exit ${exitCode}`;
367
+ process.stderr.write(`${message}\n`);
368
+ process.exitCode = exitCode;
369
+ }
370
+ }
@@ -14,19 +14,6 @@ const GITIGNORE_BLOCK_START = "# LOOP_AGENT_INIT_START";
14
14
  const GITIGNORE_BLOCK_END = "# LOOP_AGENT_INIT_END";
15
15
  const INIT_SURFACE_STATE_PATH = ".harness/init-surface.json";
16
16
  const DEFAULT_GOVERNANCE_ROOT = "ai_workspace/loop-agent";
17
- function buildSpecRegistry() {
18
- return `${JSON.stringify({
19
- version: 1,
20
- roots: [],
21
- discovery: {
22
- enabled: true,
23
- maxDepth: 3,
24
- maxFiles: 100,
25
- maxBytes: 1048576,
26
- timeoutMs: 2000,
27
- },
28
- }, null, 2)}\n`;
29
- }
30
17
  const CORE_DOC_FILES = [
31
18
  { source: "README.md", target: "README.md" },
32
19
  {
@@ -623,7 +610,7 @@ if (
623
610
  (assessment.status === "passed" && assessment.currentExitCode !== 0) ||
624
611
  (assessment.status === "baseline-debt" && assessment.currentExitCode === 0)
625
612
  ) fail();
626
- if (!assessment.baselineRef || assessment.baselineRef.nodeId !== "frontend-writer-admission-shell") fail();
613
+ if (!assessment.baselineRef || assessment.baselineRef.nodeId !== "frontend-lint-baseline-shell") fail();
627
614
  const baselineRaw = readContained(assessment.baselineRef.path);
628
615
  if (sha256(baselineRaw) !== assessment.baselineRef.sha256) fail();
629
616
  let baseline;
@@ -1325,9 +1312,6 @@ async function buildDesiredSurfaceContent(input) {
1325
1312
  }), null, 2)}\n`,
1326
1313
  };
1327
1314
  }
1328
- if (manifestPath === "docs/spec-registry.json") {
1329
- return { content: buildSpecRegistry() };
1330
- }
1331
1315
  if (manifestPath === OPENCODE_TRANSIENT_RETRY_PLUGIN_PATH) {
1332
1316
  return { content: buildOpenCodeTransientRetryPluginSource() };
1333
1317
  }
@@ -1725,8 +1709,6 @@ async function listRelativeFiles(rootPath) {
1725
1709
  async function expectedLegacyInitFileSha(input) {
1726
1710
  if (input.legacyPath.startsWith("docs/")) {
1727
1711
  const doc = input.legacyPath.slice("docs/".length);
1728
- if (doc === "spec-registry.json")
1729
- return sha256Text(buildSpecRegistry());
1730
1712
  const generated = buildGeneratedCoreDoc({
1731
1713
  doc,
1732
1714
  projectName: input.projectName,
@@ -2725,14 +2707,6 @@ export async function initializeLoopAgentProject(options) {
2725
2707
  targetRelativePath: path.join(governanceRoot, "templates"),
2726
2708
  written,
2727
2709
  });
2728
- await writeTextIfMissing({
2729
- repoRoot,
2730
- relativePath: path.join(governanceRoot, "spec-registry.json"),
2731
- content: buildSpecRegistry(),
2732
- merge,
2733
- written,
2734
- skipped,
2735
- });
2736
2710
  if (profile === "full") {
2737
2711
  // Project repo-local skills live only under `.agents/skills/`.
2738
2712
  // The package still ships `skills/` as the built-in fallback source.
@@ -377,25 +377,6 @@ export async function runTaskAdvance(repoRoot, args) {
377
377
  intervalMs: options.progressIntervalMs,
378
378
  });
379
379
  }
380
- // Idempotent client-recovery surface install before any DAG run: the Pi
381
- // context-overflow extension / OpenCode plugins / project .pi settings
382
- // are normally installed by `loop-agent init`, but an upgraded or
383
- // non-init-created project may lack them. Installing here (missing-only)
384
- // ensures the overflow compact+retry recovery path is always present,
385
- // independent of how the project was created. Best-effort: a failure to
386
- // install never blocks the run.
387
- if (options.approveGate && !options.dryRun) {
388
- try {
389
- const { runClientRecovery } = await import("./client-recovery.js");
390
- // mode "project" installs only project-owned surfaces
391
- // (.pi/extensions + .opencode/plugins + .pi/settings.json),
392
- // never the user home; installs are missing-only.
393
- await runClientRecovery({ repoRoot, mode: "project" });
394
- }
395
- catch {
396
- // best-effort; do not fail the run over a recovery-surface install
397
- }
398
- }
399
380
  const result = await advanceTaskLifecycle(toUseCaseInput(repoRoot, taskId, options, progress?.observer));
400
381
  const outcome = mapOutcome(result);
401
382
  const gateStop = result.lifecycleState === "awaiting-write-set-approval" &&