@tea-agent/loop-agent 0.42.0-next.9 → 0.43.0-next.1

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 (157) hide show
  1. package/CHANGELOG.md +65 -59
  2. package/dist/application/dag/run-dag.js +3 -2
  3. package/dist/application/task-lifecycle/advance.js +9 -4
  4. package/dist/build-stamp.json +3 -3
  5. package/dist/cli/program.js +1 -1
  6. package/dist/commands/dag-rerun-task.js +2 -0
  7. package/dist/commands/task-source-prepare.js +3 -1
  8. package/dist/executors/dag-pi-executor.js +1514 -175
  9. package/dist/executors/pi-extension-resolver.js +14 -2
  10. package/dist/executors/shell-executor.js +131 -54
  11. package/dist/shared/dag-failure-category.js +6 -0
  12. package/dist/task/contract/apply.js +36 -2
  13. package/dist/task/source-prepare/parse-intent.js +7 -0
  14. package/dist/worker/console/chat/chat-event-store.js +4 -2
  15. package/dist/worker/console/chat/pi-runtime.js +45 -2
  16. package/dist/worker/console/chat/resource-loader.js +4 -1
  17. package/dist/worker/console/chat/routes.js +28 -12
  18. package/dist/worker/console/chat/sdd-data-alignment.js +13 -2
  19. package/dist/worker/console/chat/session-store.js +5 -1
  20. package/dist/worker/console/chat/subagents/agent-tool.js +62 -0
  21. package/dist/worker/console/chat/subagents/explore-agent.js +169 -0
  22. package/dist/worker/console/chat/subagents/index.js +5 -0
  23. package/dist/worker/console/chat/subagents/orchestrator.js +273 -0
  24. package/dist/worker/console/chat/subagents/tool-policy.js +53 -0
  25. package/dist/worker/console/chat/subagents/types.js +13 -0
  26. package/dist/worker/console/chat/tool-preview.js +10 -0
  27. package/dist/worker/console/chat/tools.js +11 -1
  28. package/dist/worker/console/chat/turn-process.js +1 -0
  29. package/dist/worker/console/interview/tools.js +1 -0
  30. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C6n9_m0P.js → abnfDiagram-N423BO3Z-B0Q0nClf.js} +1 -1
  31. package/dist/worker/console/static/assets/{arc-DQh-IfZ1.js → arc-DCPjC19G.js} +1 -1
  32. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-54NnrwUC.js → architectureDiagram-T3A2C74G-CP5n9jmG.js} +1 -1
  33. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-pivRALGK.js → blockDiagram-VBNYF7ZC-CmaWi_Wg.js} +1 -1
  34. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BR7OV2NJ.js → c4Diagram-5PPSVZJV-Ct5tcMfZ.js} +1 -1
  35. package/dist/worker/console/static/assets/channel-DAS07MdS.js +1 -0
  36. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-B1Aq6BcK.js → chunk-2GRJ4B5K-C0osm1Zf.js} +1 -1
  37. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-CbdU0rjo.js → chunk-2Q5K7J3B-CDWviED7.js} +1 -1
  38. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-Dqi2GJeD.js → chunk-5RXB4S5H-mtSk1-j7.js} +1 -1
  39. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BYn1Hu4R.js → chunk-5VM5RSS4-D5J9PHC7.js} +1 -1
  40. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DRLjDL0k.js → chunk-6Q2QTUOP-Begg4WAa.js} +1 -1
  41. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CY9Xx2jV.js → chunk-GF5L2VYU-sF1AEy7T.js} +1 -1
  42. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BNCZs7_z.js → chunk-JWPE2WC7-BqbsWXZb.js} +1 -1
  43. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DZ8AStLL.js → chunk-KBJHAD2P-BKJrPcJ6.js} +1 -1
  44. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DsxjYrzz.js → chunk-RYQCIY6F-CcwNMRho.js} +1 -1
  45. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-Ddx1KC1l.js → chunk-XXDRQBXY-BEJi3iIs.js} +1 -1
  46. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Cwk-5jiW.js +1 -0
  47. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Cwk-5jiW.js +1 -0
  48. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-W9TveCnK.js → cose-bilkent-JH36ORCC-DRLgTvVu.js} +1 -1
  49. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-l9j_ztZH.js → cynefin-VYW2F7L2-BoAVG3cs.js} +1 -1
  50. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-BMJMKi4G.js → cynefinDiagram-MW4NZA55-Bzol06hR.js} +1 -1
  51. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-Bb4mG9pH.js → dagre-VZM6K2ZE-UmliJM77.js} +1 -1
  52. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BMgL_Qv0.js → diagram-7IWD3JNH-BWLcJkFo.js} +1 -1
  53. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Bvo2T4OQ.js → diagram-B4RE2ZJO-CgApOm-O.js} +1 -1
  54. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-_5kWRN9c.js → diagram-LBJQPF4R-Bh3RgTLs.js} +1 -1
  55. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DqdMrltM.js → diagram-Q27KOJAE-Dsh-D5nE.js} +1 -1
  56. package/dist/worker/console/static/assets/{diagram-UB23O5K3-CDDYsNkp.js → diagram-UB23O5K3-Dkbbpcpb.js} +1 -1
  57. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-c4nfnZUV.js → ebnfDiagram-BXEA7PRR-3EBaA3t3.js} +1 -1
  58. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DnkUcNMs.js → erDiagram-JOGREHBK-Bq2Dc5ok.js} +1 -1
  59. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-Dz0KGLZE.js → flowDiagram-UKHOOZJN-De7y55ha.js} +1 -1
  60. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Cj1t1uka.js → ganttDiagram-PKOTCBZU-fLiDbQRh.js} +1 -1
  61. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-tp2FrBHd.js → gitGraphDiagram-DS77QQ5N-Du617mp1.js} +1 -1
  62. package/dist/worker/console/static/assets/index-C0O48S_P.js +449 -0
  63. package/dist/worker/console/static/assets/index-CzKf4U8P.css +1 -0
  64. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DQwJS8DH.js → infoDiagram-6WML65LV-BwmlF-XP.js} +1 -1
  65. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-eimCQWD4.js → ishikawaDiagram-WSZJBQD7-zsGtS59u.js} +1 -1
  66. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-Dd9Gbwgv.js → journeyDiagram-NVQOT4AX-DTTPTe3f.js} +1 -1
  67. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-Qve3cyft.js → kanban-definition-27J2QSJJ-BkXg9aP-.js} +1 -1
  68. package/dist/worker/console/static/assets/{linear-UXKSe36Z.js → linear-7U2ue5IE.js} +1 -1
  69. package/dist/worker/console/static/assets/{mermaid.core-CWhj4JXN.js → mermaid.core-BUuGHmWO.js} +5 -5
  70. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-yTcwf4SJ.js → mindmap-definition-FAOFIHXS-7q6fX0Sv.js} +1 -1
  71. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-_7qToaZP.js → pegDiagram-VL7TDLO6-CkQPJN55.js} +1 -1
  72. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-CXmrKmDm.js → pieDiagram-7S7Q4E2Y-CCal_tfX.js} +1 -1
  73. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-hMmrJyaS.js → quadrantDiagram-CIZ2JOQS-B7bpxyAZ.js} +1 -1
  74. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BXw8tCBe.js → railroadDiagram-AXF67PYL-CJmww7D-.js} +1 -1
  75. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BmjgnLZl.js → requirementDiagram-LRYGKXZP-D6ldWJEv.js} +1 -1
  76. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Bj77SPpN.js → sankeyDiagram-W5VNT64P-VGh33I9e.js} +1 -1
  77. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-B2FDVysL.js → sequenceDiagram-SI44F4Z6-CCkDrIjU.js} +1 -1
  78. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-UChNY9ZZ.js → sizeCapture-X5ZJPWSS-NC8f5Otb.js} +1 -1
  79. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-wbAEkbd7.js → stateDiagram-OKZ733FA-_92ezZdF.js} +1 -1
  80. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DyJg5gzW.js +1 -0
  81. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DCEkU8HR.js → swimlanes-SLNWSIFB-BdUCGtbP.js} +2 -2
  82. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-B1cw_0Uy.js +8 -0
  83. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-BGp7H06U.js → timeline-definition-Z64GVDOM-CdD1H8ia.js} +1 -1
  84. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-DsCIQuWR.js → vennDiagram-T6HMQDX7-Dkdk3oFo.js} +1 -1
  85. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-cRZLP4Xe.js → wardleyDiagram-T6FBY63Y-CKu2uPPY.js} +1 -1
  86. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CP0xLR9Y.js → xychartDiagram-ELKLHX3M-ClqAnuG8.js} +1 -1
  87. package/dist/worker/console/static/index.html +2 -2
  88. package/dist/worker/console/static-src/chat-view-types.js +1 -1
  89. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +23 -0
  90. package/dist/worker/console/static-src/operator-chat/pending-user-message.js +32 -0
  91. package/dist/worker/console/static-src/operator-chat/tools-catalog.js +21 -2
  92. package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +2 -0
  93. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +2 -0
  94. package/dist/worker/console/static-src/operator-chat/useChatStream.js +30 -14
  95. package/dist/worker/console/static-src/operator-chat/useChatThread.js +133 -5
  96. package/dist/worker/console/static-src/shell/workspace-route.js +4 -0
  97. package/dist/worker/observe/static/constants.js +22 -22
  98. package/dist/worker/observe/static/dag-context-reason-labels.js +19 -0
  99. package/dist/worker/observe/static/dag-history-labels.js +1 -0
  100. package/dist/worker/observe/static/dag-inspector-humanize.d.ts +16 -0
  101. package/dist/worker/observe/static/dag-inspector-humanize.js +339 -0
  102. package/dist/worker/observe/static/dag-node-purpose.js +10 -10
  103. package/dist/worker/observe/static/index.html +4 -4
  104. package/dist/worker/observe/static/prompt-restart-candidates.js +4 -2
  105. package/dist/worker/observe/static/relations.js +5 -5
  106. package/dist/worker/observe/static/styles.css +171 -0
  107. package/dist/worker/observe/static/views/dag-graph.js +1 -1
  108. package/dist/worker/observe/static/views/dag-inspector.js +329 -174
  109. package/dist/worker/observe/static/views/dag.js +16 -12
  110. package/dist/worker/observe/static/views/session-timeline.js +5 -3
  111. package/dist/workflows/dag/backend-test-plan-protocol.js +104 -0
  112. package/dist/workflows/dag/dag-retry-schema.js +3 -0
  113. package/dist/workflows/dag/frontend-contract-facts.js +130 -0
  114. package/dist/workflows/dag/frontend-design-policy.js +101 -16
  115. package/dist/workflows/dag/frontend-implementation-contract.js +410 -41
  116. package/dist/workflows/dag/frontend-plan-render.js +13 -2
  117. package/dist/workflows/dag/frontend-prewrite-gate.js +1 -1
  118. package/dist/workflows/dag/frontend-recovery-controller.js +25 -1
  119. package/dist/workflows/dag/frontend-recovery-plan.js +4 -1
  120. package/dist/workflows/dag/frontend-recovery-run.js +142 -16
  121. package/dist/workflows/dag/frontend-risk.js +2 -0
  122. package/dist/workflows/dag/frontend-shadow-dual-write.js +17 -1
  123. package/dist/workflows/dag/frontend-shape.js +16 -6
  124. package/dist/workflows/dag/frontend-test-execution-evidence.js +48 -0
  125. package/dist/workflows/dag/frontend-typed-event-store.js +3 -0
  126. package/dist/workflows/dag/frontend-verification-trace.js +38 -4
  127. package/dist/workflows/dag/frontend-writer-admission.js +2 -2
  128. package/dist/workflows/dag/init-hybrid.js +57 -28
  129. package/dist/workflows/dag/node-execution.js +201 -85
  130. package/dist/workflows/dag/recovery-lease.js +106 -16
  131. package/dist/workflows/dag/rerun-feedback.js +1 -0
  132. package/dist/workflows/dag/rerun-plan.js +90 -4
  133. package/dist/workflows/dag/rerun-run.js +28 -6
  134. package/dist/workflows/dag/rerun-task.js +221 -18
  135. package/dist/workflows/dag/retry-policy.js +27 -10
  136. package/dist/workflows/dag/runner-exit-diagnostics.js +125 -0
  137. package/dist/workflows/dag/runner.js +220 -18
  138. package/dist/workflows/dag/structured-output-repair.js +4 -1
  139. package/dist/workflows/dag/types.js +4 -3
  140. package/dist/workflows/dag/validate.js +10 -8
  141. package/dist/workflows/dag/workspace-checkpoint.js +66 -0
  142. package/docs/operations/README.md +1 -0
  143. package/docs/templates/agent-dag.schema.json +2 -2
  144. package/docs/templates/backend-test-dag.json +6 -4
  145. package/docs/templates/frontend-implementation-contract.schema.json +34 -2
  146. package/harness.json +1 -1
  147. package/package.json +4 -5
  148. package/skills/frontend-plan/SKILL.md +14 -1
  149. package/skills/frontend-plan/references/decision-contract.md +101 -5
  150. package/skills/frontend-plan/references/design-decisions.md +32 -0
  151. package/dist/worker/console/static/assets/channel-DsZxrgqe.js +0 -1
  152. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-CuToPeGV.js +0 -1
  153. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-CuToPeGV.js +0 -1
  154. package/dist/worker/console/static/assets/index-D9Sc0f0y.js +0 -449
  155. package/dist/worker/console/static/assets/index-DDQc5a50.css +0 -1
  156. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-yPoT19ft.js +0 -1
  157. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-VWdarchG.js +0 -8
package/CHANGELOG.md CHANGED
@@ -2,52 +2,70 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
- - 冒烟再暴露 writeSet 授权缺口:冻结验证命令引用的基建文件(如 `--config` 的 vitest 配置)不在 plan verification targets 内时,writer 被具体 writeSet 拦住无法创建、verify-shell 必然失败。现在 admission 生效边界确定性并入冻结命令引用的文件(机械提取、仍受 allowedPaths/forbiddenPaths 约束),writer 聚焦检查失败后可自行补齐基建文件。
6
- - 修复 /inspect/* 静态资源(operator-chrome.js/css、观测文档)缺少 Cache-Control 的问题:现在与 Console SPA 一律 `no-store`。此前浏览器启发式缓存会让 Console 更新/重启后继续挂旧版导航模块,表现为顶部导航「回退」到只有操作/观测、缺少对话入口的旧版布局。
7
-
8
- - 冻结验证命令引用的文件(如 `--config` 的 vitest 配置)现在必须在 plan 阶段就有 verification target 覆盖:缺失会作为缺失事实驱动 coverage/compact/finalize 会话当轮补记并进入 admission writeSet,无法补齐则在 plan 阶段确定性失败,不再等到 verify-shell 才以 missing config 失败。
9
- - 修复 writer 终态失败 run 无法重跑的问题:rerun 反馈的 writer 失败通道把 `attemptSummary.completedPasses` 硬编码为 0,被 `dagRerunFeedbackSchema` positive 校验拒绝,导致 `dag rerun-task` 在解析父 run 反馈时崩溃;现与相邻通道一致取 1。
10
- - 冒烟再暴露并修复 planner 思考烧尽:compact Plan 首会话因 `stopReason=length` 只思考零提交时,先做一次 tool-first scope 重试,仍失败则机械降级为按需求减半的 coverage 分批会话;耗尽后归类为 `planner-thinking-exhausted` 并给出 thinking=off/换模型建议,不再原样重放同一 prompt 烧完修复预算。
11
- - 继续加固前端恢复:生产 `runDag` 现在使用共享 Console operation store 执行带反馈的 `dag rerun-task`,避免恢复 descriptor 无法解析;compact Plan 仅在单 target surface 生效,finalize 提示与 concrete writeSet 路径统一规范化。
12
- - 修复前端冒烟暴露的 P0/P1 流程问题:设计评审 `request_design_changes` 现在 fail-closed 阻断 writer,自动恢复从 Plan 重启并携带 findings/evidence;admission 冻结的 concrete writeSet 同时成为 writer 的实际授权边界,legacy `admitted` 不再放行;长度耗尽且零写入的 provider 结果按 `writer-thinking-exhausted` 归类。生产小型 Plan(≤8 个需求且估算调用量受控)合并为两次 Pi session,并在 session 间刷新 typed ledger 上下文;Scout 重试仅补 unresolved 路径,减少重复侦查与上下文消耗。
13
- - 修复 backend-test `payload = {...}` `dict(payload)` `**kwargs` wrapper 透传时漏观测请求字段的问题:保守传播 wrapper 参数别名与浅拷贝 payload,并按分支实际赋值观察 scenario 字段;继续保持 payload SAFE、EXACT_1_TO_1、scenario MATCH fail-closed 门禁。计划生成提示词同时明确无有限分区域时省略整个 `## Scenario Partitions` 章节,避免生成 prose-only 空节触发 N3 阻断。
14
- - 修复 Operator Chat 打开已丢失会话时把孤儿 JSONL 升级成 503、以及删会话后残留 workspace 选择被误报为跨工作区冲突的问题:缺失会话文件现在自愈为 404 并清掉记录,前端恢复路径安静忘记该会话。
15
- - 修复前端 `--from-text` 任务缺少 source-fidelity ledger、DAG 生成后降级为 v1 并在 `frontend-contract-pi` 0ms 失败的问题:文本入口现在持久化可校验的 v2 绑定输入,init-hybrid 复用任务自有需求源;Console 默认模型与 Pi readiness 同时排除无凭据 provider,避免把不可执行模型误报为可用。
16
- - 常规回归 `npm test` 默认跳过约 6 分钟的 I/O-heavy 测试池(仍跑 fast + integration);完整三池改为 `npm run test:full` / `LOOP_AGENT_FULL_TEST=1`。本地 `ci.sh`、GitHub PR 与 release/next 发布门禁仍跑全量,不降低交付验证。
17
- - 修复 backend-test 把 `pytest.param({"title": ""})` 整段 dict 当成 empty 观察、且 `example=` 空值导致 `target=body.title` 解析失败的问题:空 example 仍解析 field,dict 内空字符串按字段 MATCH。
18
- - 修复 backend-test 把自动化映射多写的横切测试点当成 Markdown BLOCKED、挡住 N11 修 docstring 的问题:只拦 `### 测试点` 未恰好绑定一次。
19
- - 修复 backend-test pytest `_MISSING` 哨兵当成普通 Name、可选 `min; bound=0` UNDETERMINED 的问题:`_MISSING` `_OMIT` 同为省略键。
20
- - 修复 backend-test 把可选字段 `min; bound=0` `_OMIT` 判成 UNDETERMINED 的问题:省略键视为空最小;`OMITTED` TP 视为 missing。
21
- - 修复 backend-test `http_client(operation, json_body=dict)` 观察不到 payload 的问题:http-like Name-call 的第一参是参数化 method 变量时仍计入 `json_body`。
22
- - 修复 backend-test 把 Markdown `Payload Required Paths: false` 当成路径、GET filter 整 Case UNSAFE 的问题:`true`/`false` 与 `none` 一样不是 path。
23
- - 修复 backend-test 把列表反引号里的 `场景意图: ... bound=0` 解析失败、并把 `max+1` 的数字 1 当成 minLength 的问题:围栏行可解析,`+/-` 后缀数字不进 prose 窗。
24
- - 修复 backend-test fixture `http("POST", path, json_body={"title": ...})` 当成无 payload、整 Case PAYLOAD_SHAPE_MISMATCH 的问题:首参为 HTTP method 的 Name-call 进入 observedPaths。eligibility 门禁不放宽。
25
- - 修复 backend-test `intent=min; bound=0` 当成缺 bound 并落到 `maxLength`、导致空 content MISMATCH 的问题:无 `minLength=` / TP LEN 时保留 0;`max; bound=0` 仍是哨兵。
26
- - 修复 backend-test 把 evidence-only pytest stub(模块 docstring + Case-ID、无 `def test_`)当成截断脚本、N9 `incomplete-write-set` 的问题:闭合 stub 可通过 completeness,半截 `def (` 仍 fail-closed。
27
- - 修复 backend-test 把 Markdown 机器行 `intent=max-1; bound=99` 当成契约 max、导致 `x*99` MISMATCH 的问题:`max-1`/`max+1`/`min-1` 优先 `maxLength=` 与文案三元组。eligibility 门禁不放宽。
28
- - 修复 backend-test 把 pytest 多写、Markdown 没有的 `0:1` extra symbol 当成 Markdown Test Point binding 缺陷并 BLOCKED 的问题:这类条目进入 N11 删除多余函数,不再清空 pytest repair。
29
- - 修复 backend-test N12 只读 effective collection 再次跑 scenario-param 确定性写回、在 `filesystem-only` 下 `write-guard` 失败的问题:N12 只复验,不再改 pytest。N10 仍可修一次。
30
- - 修复 backend-test 把 `脚本:无` 的 evidence-only Case 当成缺 pytest 符号送进 N11 的问题:精确 1:0 元用例不再触发 `missing-pytest-symbol` repair,N11 不得发明业务函数。真缺符号的 1:0 仍可修。eligibility 门禁不放宽。
31
- - 修复 backend-test 把 Scenario Partitions 数据行的 exact `TP-SP-...` 清单写成第 8 列、导致 N6 `MISSING_PARTITION` 的问题:仅当尾列全是该 Partition 的 slot ID 时确定性裁成 7 列并写回 run-owned plan。7 列契约与非 slot 多余列 fail-closed 不放宽。
32
- - 修复 backend-test scenario 把 `intent=max-1` 当成 unknown、以及 Markdown 只写「100 个字符的最大 / 1999、2000、2001」时解析不到 bound 的问题:`max-1` 进入 closed set,长度清单三元组与「N 个字符的最大」可得到 MATCH。eligibility 门禁不放宽。
33
- - 修复 backend-test correspondence 把前面函数的 `pytest.param(..., id="TP-...")` 叠进后续 Case `parameterIds` 的问题:decorator 区域遇到上一 `def`/`class` 或非 decorator 续行即停,不再把整组打成 `TEST_POINT_BINDING_EXTRA`。eligibility 门禁不放宽。
34
- - 修复 backend-test scenario facts 把内部 max/min/oversize helper 哨兵 `-1/-2/-3` 写成 `observedLength`、导致 N10 在 schema `min(0)` 上 `invalid-output` 的问题:这些 helper 仍按 Markdown bound MATCH,持久化长度只保留非负值。
35
- - 修复 backend-test 把 GET `params=`/`query=` 过滤字段、Python `True`/`False` 布尔字面量和混合大小写 `pytest.param` 列表漏出 correspondence/payload/scenario 观察的问题:这些 variant 现在可以按 item 授权,而不再把整 Case 打成 `PAYLOAD_SHAPE_MISMATCH` / `VARIANT_PARAMETER_MISSING`。eligibility 门禁不放宽。
36
- - 修复 backend-test 计划协议标题被翻译成中文后 N3 直接 `missing-module-index`、以及 Markdown writer 漏写精确 Scenario Partition slot 只能等到 N6 才失败的问题:N3 现在把 `## 模块索引/覆盖范围/覆盖矩阵/场景分区` 确定性改写成英文 canonical heading 并最多写回一次 run-owned `plan.md`,同时展开 slot 清单写入 `contracts/backend-test-scenario-partition-slots.json` 并注入 map child `requiredVariantSlots`。Markdown shard completeness 对缺失精确 `TP-SP-...` variant 报 `incomplete-partition-slot-set` 并允许一次有界补写。覆盖语义按方案 A:Case 数量可以少于枚举数量,但每个 slot 仍须独立 variant Test Point;`SINGLE`/`MULTIPLE` 不计覆盖。N6 fail-closed 不放宽。
37
- - 修复 backend-test strict Markdown map writer 的 upstream artifact pointer 泄漏:当长上游输出的 `stdout.md` 不在当前节点 `readSet` 时,不再向 Pi 注入不可读取的 artifact 路径,避免模型触发 `read-outside-read-set` 后进入 pending;保留有界 preview,并新增回归覆盖严格 writer 边界。
38
- - 修复 backend-test Manifest 把模型生成的 Module Stem 展示单元格当成模块身份真源、导致 low-tier 输出(缺 `test_` 前缀或整段 Markdown 链接)在 N3 `module-markdown-path-mismatch` 反复失败的问题:N3 现在先解析唯一合法 Markdown Path 与 `<stem>.md` 相对链接作为 canonical 身份,再校验业务 ownership/split 与路径安全;Stem 单元格只作冗余展示并能确定性重写为 canonical 文件名 stem。strict `backendTest.moduleLayout` 改为先按唯一 required Markdown Path 定位模块,再恢复冻结 Markdown/Pytest path pair,避免错误 stem 提前丢弃整行,同时保留 Plan-only pytest path 修复。Markdown Path 缺失/多候选/越界或与 strict path pair 冲突、以及多行 canonicalize 后同 identity(`duplicate-canonical-module-stem`)继续 fail-closed,不再静默去重。同步加强 N2 prompt(Stem 单元格仅允许纯文件名 stem)。
39
- - 修复 Next Release 的 io-heavy 测试并发不稳定:发布 workflow 将该池固定为单 worker,避免全部测试已通过后触发 Vitest `onTaskUpdate` RPC settlement timeout,并消除 controller identity/package fingerprint 测试之间的共享状态竞态;不跳过或删除任何测试。
40
- - 修复 backend-test 唯一 pytest collection repair 已产生受控非空修改、却因模型遗漏 `IMPLEMENTATION_OUTCOME` 而阻断整条执行链的问题:仅 N11 exact repair writer 可把完全缺失的 outcome 确定性恢复为候选 changed,随后仍必须由 N12 重新通过 scenario、correspondence、payload、collection、fixture 和 readiness 门禁;unknown/conflicting/blocked、空 diff、越界写入及 provider/context failure 继续 fail-closed。
41
- - 新建和删除对话现在会立即在侧栏中反馈:新建时先显示“正在创建”,删除时平滑淡出;网络失败会自动恢复原会话,不再需要等待整张会话列表刷新后才看到变化。
42
- - 新建对话会优先复用当前工作区中真正的空白会话,避免重复创建;有历史消息、工具调用、待发送内容或正在运行的会话不会被复用。
43
- - 会话列表刷新现在会复用未变化的行和列表引用,标题、运行状态或队列变化时只更新对应会话,侧栏切换和刷新更平滑。
44
- - Operator Chat 新增仅对具备 Aimax 凭证的用户可见的 `/sdd-bingo` 数据对齐命令;`wizard-local` 模型请求会自动携带与上报一致的 OpenCode 风格会话身份、当前模型和最新 API key,请求头与资格文件变更均在下一次操作自动生效。
45
- - DAG 节点检查器的「执行记录」默认自动跟随最新内容;右下角新增纯图标悬浮开关,可显式暂停并保留阅读位置,恢复后立即回到底部,悬停时显示当前可执行动作。
46
- - 修复前端任务产物派生续跑无法识别当前节点链的问题;从实现节点继续时,设计约束、写入准入、验证和收尾步骤会按现行流程安全重放。
47
- - 统一工作区、Todo 和其他滚动区域的滚动条样式,默认更轻巧,鼠标悬浮时也更容易辨认。
48
- - HTML 文件预览现在支持页面内的标签切换等交互;较大的自包含 HTML 可以在新窗口中直接完整加载,不再受源码摘要长度影响。
49
- - 修复 Operator Chat 长工具链的消息错序:模型过程文字、思考和工具卡片现在按服务端事件顺序稳定交替展示,刷新历史会话后也保持相同顺序。
50
- - 修复 Operator Chat 旧会话继续使用过期模型认证的问题:模型配置变化后,下一轮发送或手动重新加载会自动刷新模型目录和当前模型认证。
5
+ ## [0.42.0] - 2026-09-07
6
+
7
+ ### 重点更新
8
+
9
+ - **Operator Chat 内置只读 Explore Agent**:主会话可通过 `Agent` 工具委派代码库搜索、符号查找和调用链追踪;子会话 Fresh、one-shot,只暴露 `find`/`ls`/`safe-*`/git 只读工具,父 Turn 停止时一并中止。工具目录中的 Explore 条目改由服务端 `builtinSubagents` 能力字段驱动,后端调整内置子代理时前端自动跟随。
10
+ - **前端实现 DAG 稳定性集中修复**:修复 Plan coverage 会话提前停止导致会话数翻倍(切片穷尽才算完成);修复重试梯级遮蔽修复指令(账本修复指引优先于 compact-terminal-first 话术);修复 Plan AC 分片重复发明同一批需求(UX registry 先全局提交再单一会话建模);修复 design 拒绝后自动恢复子 run 无法启动(staging 正确物化拓扑绑定并继承 committed shape facts);修复自动恢复实际重跑整棵 DAG、忽略冻结 reset plan 的问题;`stopReason=length` 截断改判为专门的 `output-limit` 可重试类别,不再误判 `empty-output`;重试额度默认从 3 次提升到 5 次。
11
+ - **前端 verification contract v2**:plan 不再手写五值 `type`,改为引用生成期冻结命令目录的 `commandId`,`type: component + npm run build` 这类非法组合在 Plan 工具边界即被拒绝;冻结验证命令引用的基建文件(如 vitest 配置)确定性并入 writeSet admission 边界,writer 不再被具体 writeSet 拦住;Verify bundle 按工作目录和冻结命令去重,static/behavior/Mock/lint lane 复用相同命令结果。
12
+ - **backend-test 判定链修复**:N2 不再把 provider 长度截断的 Markdown 计划误判为 `FINISHED`(截断归 `output-too-large`、缺 heading `invalid-output`,均有界 artifact-first retry);N3 以唯一合法 Markdown Path canonical 模块身份(Stem 展示单元格只作冗余展示);唯一 pytest collection repair `IMPLEMENTATION_OUTCOME` 不再阻断整条执行链(确定性恢复为候选 changed 后仍走全部门禁)。
13
+ - **契约幂等与 DAG 恢复强化**:契约重复 prepare 做内容级 no-op 短路(投影与已记录契约及磁盘哈希一致时不递增 revision、不写事务、writeSet gate digest 绑定 hash 不变则继续有效——实测 8.6 小时流水线 7 次修订只有 3 个不同 hash);workspace-drift 细化为内容级逐路径对比(漂移全落在重跑子图自身 readSet/writeSet 内时放行);superseded run 可作为 `dag rerun --from-node` 的事实供体;DAG 退出诊断改用只读异常监视器。
14
+ - **工具入参预览放宽**:工具入参预览从 1200 字放宽到 4000 字(与会话结果落盘上限对齐),详情栏支持「展开全部」(可视高度最多 720px),Explore 等长 brief 不再被预览截断误导。
15
+
16
+ ### 改进
17
+
18
+ - 具备 Aimax 凭证的用户可在对话输入框使用 `/sdd-bingo` 完成 SDD 数据对齐;不指定名称时自动选择分析类别,成功提示显示实际使用的类别。
19
+ - 前端 Scout 在中高复杂度任务中并行收集 target surface design evidence;大型 Plan requirement coverage 按批次并行映射后按固定顺序归并。
20
+ - 前端 Micro/Small shape 路由不再把 `test/`、`e2e/`、`docs/` 等目录误计为业务跨域,局部 UI 改动正确命中轻量拓扑。
21
+ - 前端计划契约新增确定性锚定校验:behavior 验证目标必须引用 requirement,声明了 UI 状态/交互时必须引用已声明状态,缺失在 Plan 自修阶梯当场报错,不再烧一整轮 design-review。
22
+ - 可选依赖 `@agent-context/sift` 升级到 `0.0.1-alpha.7`(行级分片取回、更保守的纯文本压缩),回退开关与 init 投影不变。
23
+ - 修复 DAG Pi 扩展 resolver 无法解析版本 pin spec 的问题(`npm:pi-lens@3.8.72` 不再静默降级 `not-installed`)。
24
+ - 修复 `/inspect/*` 静态资源缺 Cache-Control 导致 Console 更新后挂旧版导航的问题(一律 `no-store`)。
25
+ - Next 发布测试升级 Vitest 4.1.11(worker RPC 修复,全绿测试不再因 `onTaskUpdate` 超时阻断发包)。
26
+ - 会话列表默认展示 5 条、展开收起更整齐;新建/删除对话即时反馈;发送消息立即显示;文件预览支持页面内交互与独立窗口阅读;执行记录默认跟随最新内容可暂停;模型配置更新后旧会话自动采用最新认证。
27
+
28
+ ## [0.41.3] - 2026-09-04
29
+
30
+ ### 改进
31
+
32
+ - 完善了本发布周期内的日常使用体验和运行稳定性。
33
+
34
+ ### 修复
35
+
36
+ - 修复了部分功能在特定环境下无法正常使用的问题。
37
+
38
+ ## [0.41.2] - 2026-09-04
39
+
40
+ ### 修复
41
+
42
+ - 修复了 DAG 扩展解析、会话恢复和观测页面资源缓存等问题,让任务执行和对话页面在更新后更加可靠。
43
+ - 修复了孤儿会话和观测入口偶发失效的问题,重启或刷新后可以继续使用原有会话。
44
+
45
+ ## [0.41.1] - 2026-09-02
46
+
47
+ ### 修复
48
+
49
+ - 修复发布流程中的测试并发稳定性问题。
50
+ - 修复旧会话继续使用过期模型认证的问题,配置更新后会自动采用最新认证信息。
51
+ - 修复长工具链消息错序,历史会话也保持正确顺序。
52
+ - 统一工作区、Todo 和其他滚动区域的滚动条样式。
53
+ - 改进 HTML 文件预览,支持页面内交互和独立窗口完整阅读。
54
+
55
+ ### 测试
56
+
57
+ - Pi MED 档测试改为校验模型档位形状,避免具体模型切换造成误报。
58
+
59
+ ## [0.41.1-beta.0] - 2026-08-31
60
+
61
+ ### 用户可见更新
62
+
63
+ - 前端自动化任务的规划、执行和结果检查更加稳定,失败后更容易继续处理。
64
+ - 长任务和复杂工作区的进度、文件和运行结果展示更加清晰。
65
+ - 插件管理、文件预览和任务详情等常用操作得到改进。
66
+
67
+ <details>
68
+ <summary>实现细节(开发者参考)</summary>
51
69
 
52
70
  - 0.41.1-beta.0(frontend-node dogfood):将前端 DAG 的 Contract、Scout、Plan 切换为节点专属 skill/reference,bounded implement 仅注入有界代码规范;在保留默认 3K/12K 上下文预算的同时,避免 `frontend-plan-pi` 的必需 stable-id 追踪合同被静默截断。
53
71
  - 拆分前端 DAG 的大一统 skill 注入:`frontend-contract-pi`、`frontend-scout-pi`、`frontend-plan-pi` 分别使用阶段专属 skill/reference,默认 12K runtime 预算内完整加载关键合同,不再让三个节点重复携带整份 node lifecycle、设计与代码规范;bounded implement 单独接收不授权扩展侦察的代码规范。新增真实默认预算回归断言,防 required reference 再次静默截断或因预算遗漏。
@@ -269,19 +287,7 @@
269
287
  - 右侧辅助栏统一承载文件、上下文、调用记录、运行活动和当前 DAG;点击消息流中的运行状态即可在同一侧栏查看运行、门禁与产物,并可自由调整侧栏宽度。
270
288
  - 新增任务清单与结构化提问卡片,让长任务的进度和需要用户选择的内容更容易理解。
271
289
  - 「对话 / 操作 / 观测」使用统一导航;操作和观测页面可以切换工作区查看对应数据。
272
- ## [0.41.1] - 2026-09-02
273
-
274
- ### 修复
275
-
276
- - 修复 Next Release 发布 workflow 的 io-heavy 测试并发不稳定:将该测试池固定为单 worker,避免全部测试通过后因过高并发触发 Vitest `onTaskUpdate` RPC settlement timeout,并消除 controller identity / package fingerprint 测试之间的共享状态竞态。
277
- - 修复 Operator Chat 旧会话继续使用过期模型认证的问题:模型配置变化后,下一轮发送或手动重新加载会自动刷新模型目录和当前模型认证。
278
- - 修复 Operator Chat 长工具链的消息错序:模型过程文字、思考和工具卡片现在按服务端事件顺序稳定交替展示,刷新历史会话后也保持相同顺序。
279
- - 统一工作区、Todo 和其他滚动区域的滚动条样式,默认更轻巧,鼠标悬浮时也更容易辨认。
280
- - HTML 文件预览现在支持页面内的标签切换等交互;较大的自包含 HTML 可以在新窗口中直接完整加载,不再受源码摘要长度限制。
281
-
282
- ### 测试
283
-
284
- - `harness.json` Pi MED 档测试不再 pin 具体模型 id,改为校验 tier 形状,避免每次 dogfood 档位切换都造成测试失败。
290
+ </details>
285
291
 
286
292
  ## [0.41.0] - 2026-08-31
287
293
 
@@ -29,10 +29,11 @@ function buildRunDagNextSteps(runId) {
29
29
  `loop-agent dag report --run-id ${runId} --markdown # advanced forensic`,
30
30
  ];
31
31
  }
32
- async function buildDefaultFrontendRecoveryDeps(repoRoot) {
32
+ /** Shared production recovery seam for fresh runs and recovery continuations. */
33
+ export async function buildDefaultFrontendRecoveryDeps(repoRoot) {
33
34
  // Keep the application layer free of a static worker→application cycle. The
34
35
  // recovery controller is only needed after a frontend terminal failure.
35
- const [{ openConsoleAppData }, { OperationStore }, { createOperationEventStore }, { LoopAgentClient }, { resolveSiblingLoopAgentBin }] = await Promise.all([
36
+ const [{ openConsoleAppData }, { OperationStore }, { createOperationEventStore }, { LoopAgentClient }, { resolveSiblingLoopAgentBin },] = await Promise.all([
36
37
  import("../../infrastructure/console/app-data.js"),
37
38
  import("../../infrastructure/console/operation-store.js"),
38
39
  import("../../worker/console/operation-sse.js"),
@@ -842,13 +842,18 @@ export async function advanceTaskLifecycle(input) {
842
842
  break;
843
843
  }
844
844
  preparedContractThisCall = true;
845
- if (startupRepairAction ||
846
- refreshManagedContractThisCall ||
847
- input.fromDraftPath) {
845
+ const contractChanged = prepareResult.apply?.noOp !== true;
846
+ if (contractChanged &&
847
+ (startupRepairAction ||
848
+ refreshManagedContractThisCall ||
849
+ Boolean(input.fromDraftPath))) {
848
850
  // The old DAG and gate were bound to the pre-mutation contract.
849
- refreshManagedContractThisCall = false;
850
851
  regenerateDagThisCall = true;
851
852
  }
853
+ // Consume the refresh request even when projection was a content no-op;
854
+ // otherwise the re-plan would invoke prepare-contract repeatedly in this
855
+ // advance call and eventually hit the step limit.
856
+ refreshManagedContractThisCall = false;
852
857
  record = {
853
858
  ...appendTransition(record, "contract-managed"),
854
859
  pendingPrdRefresh: false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.42.0-next.9",
4
- "gitSha": "13597aa31afc1faccb9a5eaca296d57d7ab93c2e",
5
- "builtAt": "2026-09-03T05:18:16.410Z"
3
+ "version": "0.43.0-next.1",
4
+ "gitSha": "8c9991764cb4a4256e3c76d358791583ec9a88f8",
5
+ "builtAt": "2026-09-07T02:31:43.295Z"
6
6
  }
@@ -440,7 +440,7 @@ const RAW_SUBCOMMAND_USAGE = {
440
440
  "dag approve": 'usage: dag approve --run-id <id> --option <A|B|...> [--notes "..."]',
441
441
  "dag reject": 'usage: dag reject --run-id <id> --reason "..."',
442
442
  "dag rerun": "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]",
443
- "dag rerun-task": "usage: dag rerun-task --run-id <id> --reason <text> --request-id <key> [--profile auto|minimal|standard|reviewed|supervised] [--task-id <id>] [--json]",
443
+ "dag rerun-task": "usage: dag rerun-task --run-id <id> --reason <text> --request-id <key> [--profile auto|minimal|standard|reviewed|supervised] [--task-id <id>] [--frontend-recovery --recovery-operation-id <id>] [--json]",
444
444
  "dag reconcile-run": "usage: dag reconcile-run --run-id <id> [--action supersede|abandon] [--reason <text>]",
445
445
  "dag doctor": "usage: dag doctor [--run-id <id>]\nInspect health issues before approve/reject/resume; no --json (output is already structured JSON).",
446
446
  "dag report": "usage: dag report [--run-id <id>] [--lifecycle active|paused|completed|all] [--json|--markdown] [--failed-only] [--latest] [--paused-latest]\nRead-only run report; --json gives structured facts (canonical: `dag report --run-id <id> --lifecycle completed --json`).",
@@ -11,6 +11,8 @@ export async function runDagRerunTask(repoRoot, rawArgs) {
11
11
  profileExplicit: parsed.profileExplicit,
12
12
  taskIdOverride: parsed.taskIdOverride,
13
13
  execute: parsed.execute,
14
+ frontendRecovery: parsed.frontendRecovery,
15
+ recoveryOperationId: parsed.recoveryOperationId,
14
16
  });
15
17
  console.log(JSON.stringify(result, null, 2));
16
18
  if (!result.ok) {
@@ -373,7 +373,9 @@ function printHuman(result) {
373
373
  }
374
374
  }
375
375
  if (result.apply) {
376
- lines.push(` apply: revision=${result.apply.ref.revision} txId=${result.apply.txId}`);
376
+ lines.push(result.apply.noOp
377
+ ? ` apply: revision=${result.apply.ref.revision} (unchanged; identical content, no new transaction)`
378
+ : ` apply: revision=${result.apply.ref.revision} txId=${result.apply.txId ?? "n/a"}`);
377
379
  }
378
380
  if (result.error) {
379
381
  lines.push(` error: ${result.error.code}: ${result.error.message}`);