@tea-agent/loop-agent 0.39.0-beta.1 → 0.39.0-beta.11

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 (338) hide show
  1. package/AGENTS.md +4 -1
  2. package/CHANGELOG.md +349 -97
  3. package/README.md +9 -5
  4. package/bin/loop-agent.js +7 -3
  5. package/dist/application/task-lifecycle/advance.js +12 -0
  6. package/dist/application/task-lifecycle/recommendations.js +13 -2
  7. package/dist/build-stamp.json +3 -3
  8. package/dist/cli/command-definitions.js +23 -5
  9. package/dist/cli/program.js +21 -2
  10. package/dist/cli/update/notifier.js +2 -2
  11. package/dist/cli/update/runtime-activity.js +1 -29
  12. package/dist/cli.js +2 -1
  13. package/dist/commands/client-recovery.js +3 -0
  14. package/dist/commands/dag-follow-up.js +138 -0
  15. package/dist/commands/dag-rerun.js +55 -1
  16. package/dist/commands/init-model-catalog.js +464 -0
  17. package/dist/commands/init-upgrade.js +265 -97
  18. package/dist/commands/init.js +455 -28
  19. package/dist/commands/inspect-next.js +8 -0
  20. package/dist/commands/task-advance.js +19 -0
  21. package/dist/executors/dag-pi-executor.js +2370 -64
  22. package/dist/executors/pi-executor.js +11 -2
  23. package/dist/executors/pi-extension-resolver.js +233 -0
  24. package/dist/executors/pi-playwright-cli-tool.js +74 -28
  25. package/dist/executors/pi-read-budget-policy.js +239 -0
  26. package/dist/executors/pi-sdk-executor.js +225 -33
  27. package/dist/executors/pi-writer-tool-policy.js +57 -1
  28. package/dist/executors/shell-executor.js +1258 -224
  29. package/dist/executors/shell-write-guard.js +14 -0
  30. package/dist/executors/workspace-write-snapshot.js +68 -0
  31. package/dist/infrastructure/harness/atomic-write.js +23 -0
  32. package/dist/shared/dag-failure-category.js +150 -0
  33. package/dist/shared/dag-prompt-override.js +27 -0
  34. package/dist/shared/openspec-spec.js +70 -4
  35. package/dist/shared/operator/capabilities.js +39 -0
  36. package/dist/shared/playwright-cli-command-policy.js +15 -0
  37. package/dist/shared/update/console-notifier.js +100 -0
  38. package/dist/{cli → shared}/update/npm-client.js +70 -15
  39. package/dist/{cli → shared}/update/state.js +41 -13
  40. package/dist/task/config-types.js +50 -5
  41. package/dist/task/contract/apply.js +11 -1
  42. package/dist/task/contract/constants.js +2 -0
  43. package/dist/task/contract/hash.js +3 -0
  44. package/dist/task/contract/observe.js +25 -4
  45. package/dist/task/contract/paths.js +2 -1
  46. package/dist/task/contract/project.js +18 -1
  47. package/dist/task/contract/schema.js +4 -1
  48. package/dist/task/contract/transaction.js +12 -0
  49. package/dist/task/frontend-project-capability.js +199 -18
  50. package/dist/task/source-prepare/completeness.js +188 -0
  51. package/dist/task/source-prepare/fragment-inventory.js +477 -0
  52. package/dist/task/source-prepare/index.js +3 -0
  53. package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
  54. package/dist/task/source-prepare/ledger-review.js +214 -0
  55. package/dist/task/source-prepare/ledger.js +545 -0
  56. package/dist/task/source-prepare/parse-intent.js +24 -4
  57. package/dist/task/source-prepare/prepare.js +298 -1
  58. package/dist/task/source-prepare/semantic-intake.js +25 -5
  59. package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
  60. package/dist/task/source-prepare/types.js +22 -0
  61. package/dist/task/source-references.js +22 -1
  62. package/dist/worker/cli.js +18 -2
  63. package/dist/worker/console/chat/chat-event-store.js +75 -5
  64. package/dist/worker/console/chat/context-panel.js +7 -0
  65. package/dist/worker/console/chat/deferred-turn.js +12 -0
  66. package/dist/worker/console/chat/operation-card.js +8 -1
  67. package/dist/worker/console/chat/pi-console-config.js +81 -10
  68. package/dist/worker/console/chat/pi-runtime.js +331 -18
  69. package/dist/worker/console/chat/provider-error.js +98 -0
  70. package/dist/worker/console/chat/routes.js +395 -59
  71. package/dist/worker/console/chat/session-stats.js +179 -0
  72. package/dist/worker/console/chat/session-store.js +93 -63
  73. package/dist/worker/console/chat/todos.js +115 -0
  74. package/dist/worker/console/chat/tool-preview.js +42 -0
  75. package/dist/worker/console/chat/turn-process.js +20 -55
  76. package/dist/worker/console/chat/user-questions.js +266 -0
  77. package/dist/worker/console/chat/workspace-landing.js +79 -0
  78. package/dist/worker/console/console-handoff.js +82 -0
  79. package/dist/worker/console/console-update-and-init.js +115 -0
  80. package/dist/worker/console/console-update-runtime.js +84 -0
  81. package/dist/worker/console/dag-execution-receipt.js +33 -0
  82. package/dist/worker/console/draft-store.js +49 -0
  83. package/dist/worker/console/frontend-human-decision-adapter.js +19 -0
  84. package/dist/worker/console/frontend-split-operation-adapter.js +20 -0
  85. package/dist/worker/console/index.js +3 -0
  86. package/dist/worker/console/inspect-split.js +18 -0
  87. package/dist/worker/console/native-directory-picker.js +13 -0
  88. package/dist/worker/console/operation-run-facts.js +19 -3
  89. package/dist/worker/console/operation-store.js +227 -7
  90. package/dist/worker/console/operator-actions.js +388 -0
  91. package/dist/worker/console/operator-surface-health.js +1 -0
  92. package/dist/worker/console/operator-user-error.js +2 -2
  93. package/dist/worker/console/prd-intake-bridge.js +13 -0
  94. package/dist/worker/console/routes.js +355 -3
  95. package/dist/worker/console/security.js +67 -13
  96. package/dist/worker/console/server.js +609 -164
  97. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C4kVYweA.js → abnfDiagram-N423BO3Z-CXj_GnSb.js} +1 -1
  98. package/dist/worker/console/static/assets/{arc-Bj2M8iO5.js → arc-BZp6JAp7.js} +1 -1
  99. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CLlXe4-6.js → architectureDiagram-T3A2C74G-DfpcEuYU.js} +1 -1
  100. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-psEp5xH0.js → blockDiagram-VBNYF7ZC-_Gf0xadb.js} +1 -1
  101. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DeKcOCGJ.js → c4Diagram-5PPSVZJV-Ct2QPCmv.js} +1 -1
  102. package/dist/worker/console/static/assets/channel-3TxJgYaH.js +1 -0
  103. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-K0C744p1.js → chunk-2GRJ4B5K-BfklkzKl.js} +1 -1
  104. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-xbNw4J9-.js → chunk-2Q5K7J3B-Dy25vZJV.js} +1 -1
  105. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-DjLaSDUO.js → chunk-5RXB4S5H-BFlCRZep.js} +1 -1
  106. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-CtiPlKel.js → chunk-5VM5RSS4-op3oVxIE.js} +1 -1
  107. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DZtolir7.js → chunk-6Q2QTUOP-C0R7rzF2.js} +1 -1
  108. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CPcdNeew.js → chunk-GF5L2VYU-Bt44TCGy.js} +1 -1
  109. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-NgHc6V37.js → chunk-JWPE2WC7-_uEE_XFx.js} +1 -1
  110. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DQ_T-hg8.js → chunk-KBJHAD2P-C3TOYGZ9.js} +1 -1
  111. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DgLsxcVP.js → chunk-RYQCIY6F-Cz60oBPV.js} +1 -1
  112. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-UrVoM9z1.js → chunk-XXDRQBXY-8Bik0qis.js} +1 -1
  113. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BHIkXpp3.js +1 -0
  114. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BHIkXpp3.js +1 -0
  115. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CLkYvTb3.js → cose-bilkent-JH36ORCC-C2QIOA4a.js} +1 -1
  116. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BwT_xKrE.js → cynefin-VYW2F7L2-CSH_yUUd.js} +1 -1
  117. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Bi9tuzif.js → cynefinDiagram-MW4NZA55-BDLw2XFM.js} +1 -1
  118. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BCIqkWBV.js → dagre-VZM6K2ZE-CcD9ZtF4.js} +1 -1
  119. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dip6l9_Z.js → diagram-7IWD3JNH-DqwtkBsI.js} +1 -1
  120. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B-xkh_wK.js → diagram-B4RE2ZJO-BWVEcqsC.js} +1 -1
  121. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DZO0kTt_.js → diagram-LBJQPF4R-M-WAbtQi.js} +1 -1
  122. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-D6ZplNbZ.js → diagram-Q27KOJAE-DKW7SixP.js} +1 -1
  123. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BPekbhoS.js → diagram-UB23O5K3-PHHPPtrj.js} +1 -1
  124. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BtmaJpK5.js → ebnfDiagram-BXEA7PRR-BQD-B4RX.js} +1 -1
  125. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-6DS0Xc44.js → erDiagram-JOGREHBK-BFvULb51.js} +1 -1
  126. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CihnROSm.js → flowDiagram-UKHOOZJN-Bw-aXTCb.js} +1 -1
  127. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CZC4zOE2.js → ganttDiagram-PKOTCBZU-BGKw04Qx.js} +1 -1
  128. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Dq1fhzGN.js → gitGraphDiagram-DS77QQ5N-RqKaPR-I.js} +1 -1
  129. package/dist/worker/console/static/assets/index-B_D8rbWc.js +407 -0
  130. package/dist/worker/console/static/assets/index-BdNx6fj0.css +1 -0
  131. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DlSl4BGx.js → infoDiagram-6WML65LV-YO5dnzrJ.js} +1 -1
  132. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-snnzFl_U.js → ishikawaDiagram-WSZJBQD7-Bi1VZHMq.js} +1 -1
  133. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-BDE7qpMx.js → journeyDiagram-NVQOT4AX-Bszls1DD.js} +1 -1
  134. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-CD2Ci04G.js → kanban-definition-27J2QSJJ-PhzeaZ09.js} +1 -1
  135. package/dist/worker/console/static/assets/{linear-DdnapKIH.js → linear-BsjbDoXi.js} +1 -1
  136. package/dist/worker/console/static/assets/{mermaid.core-BVjAT9b8.js → mermaid.core-0B7NnWKk.js} +5 -5
  137. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-D0yJk-zA.js → mindmap-definition-FAOFIHXS-BJr4Fj-q.js} +1 -1
  138. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BVo9tFP-.js → pegDiagram-VL7TDLO6-moC4fpGB.js} +1 -1
  139. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DnOV-mZ_.js → pieDiagram-7S7Q4E2Y-BEw37-2c.js} +1 -1
  140. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CzUJo58i.js → quadrantDiagram-CIZ2JOQS-Cq6LyasU.js} +1 -1
  141. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Bvikrolh.js → railroadDiagram-AXF67PYL-DUCMcK0D.js} +1 -1
  142. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-DtaSVCap.js → requirementDiagram-LRYGKXZP-C3upTZm7.js} +1 -1
  143. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-C2c9A0wW.js → sankeyDiagram-W5VNT64P-BI_gMsCW.js} +1 -1
  144. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DmXJcU7r.js → sequenceDiagram-SI44F4Z6-YFOIRzfN.js} +1 -1
  145. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-B4GUFW92.js → sizeCapture-X5ZJPWSS-dOnB7UDD.js} +1 -1
  146. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-Dsad2MXf.js → stateDiagram-OKZ733FA-BXUniaIh.js} +1 -1
  147. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-Cdi6UhLa.js +1 -0
  148. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DGq48Fbi.js → swimlanes-SLNWSIFB-2tA4wTNu.js} +2 -2
  149. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D-RJBbb0.js +8 -0
  150. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CSSi6OFf.js → timeline-definition-Z64GVDOM-DO0HkJXC.js} +1 -1
  151. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BqyzPrWv.js → vennDiagram-T6HMQDX7-DvIOzixv.js} +1 -1
  152. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DlznVb6S.js → wardleyDiagram-T6FBY63Y-DXDZ0cTj.js} +1 -1
  153. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CfBcgJ_K.js → xychartDiagram-ELKLHX3M-B32Ark0D.js} +1 -1
  154. package/dist/worker/console/static/index.html +2 -2
  155. package/dist/worker/console/static-src/active-run-badge.js +17 -0
  156. package/dist/worker/console/static-src/app/console-types.js +68 -4
  157. package/dist/worker/console/static-src/app/useConsoleShell.js +30 -12
  158. package/dist/worker/console/static-src/app/useOperatorActions.js +41 -6
  159. package/dist/worker/console/static-src/app/useRecoveryConsole.js +45 -10
  160. package/dist/worker/console/static-src/app/useRunProgress.js +47 -0
  161. package/dist/worker/console/static-src/app/useTaskWizard.js +74 -2
  162. package/dist/worker/console/static-src/night/useNightBoard.js +8 -5
  163. package/dist/worker/console/static-src/operator-chat/cards/failure-category-advice.js +25 -0
  164. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +141 -8
  165. package/dist/worker/console/static-src/operator-chat/compaction-message.js +79 -0
  166. package/dist/worker/console/static-src/operator-chat/details-dag-actions.js +122 -0
  167. package/dist/worker/console/static-src/operator-chat/input-history.js +76 -0
  168. package/dist/worker/console/static-src/operator-chat/mutation-gate.js +1 -1
  169. package/dist/worker/console/static-src/operator-chat/refs.js +3 -0
  170. package/dist/worker/console/static-src/operator-chat/runtime-selection-labels.js +27 -0
  171. package/dist/worker/console/static-src/operator-chat/spatial-overlay.js +1 -2
  172. package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +25 -0
  173. package/dist/worker/console/static-src/operator-chat/turn-submission.js +16 -3
  174. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +181 -87
  175. package/dist/worker/console/static-src/operator-chat/useChatStream.js +183 -48
  176. package/dist/worker/console/static-src/operator-chat/useChatThread.js +177 -8
  177. package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
  178. package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +63 -9
  179. package/dist/worker/console/static-src/operator-chat/useWorkspaceBrowserGate.js +4 -0
  180. package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +3 -3
  181. package/dist/worker/console/static-src/pages/tasks/run-id-resolution.js +79 -0
  182. package/dist/worker/console/static-src/pages/tasks/run-ownership-verify.js +23 -0
  183. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +110 -0
  184. package/dist/worker/console/static-src/shell/useWorkspaces.js +299 -0
  185. package/dist/worker/console/static-src/shell/workspace-route.js +339 -0
  186. package/dist/worker/console/workspace-context.js +344 -0
  187. package/dist/worker/console/workspace-registry.js +214 -0
  188. package/dist/worker/loop-agent/loop-agent-client.js +7 -3
  189. package/dist/worker/materialize/frontend-split-task-materializer.js +72 -0
  190. package/dist/worker/materialize/harness-task-lineage.js +5 -2
  191. package/dist/worker/observability/init-runtime-activity.js +26 -0
  192. package/dist/worker/observability/read-model.js +22 -0
  193. package/dist/worker/observe/node-input.js +160 -3
  194. package/dist/worker/observe/node-process.js +377 -0
  195. package/dist/worker/observe/routes.js +224 -3
  196. package/dist/worker/observe/server.js +4 -0
  197. package/dist/worker/observe/shell-handler-keys.js +34 -0
  198. package/dist/worker/observe/static/api.js +90 -4
  199. package/dist/worker/observe/static/app.js +18 -70
  200. package/dist/worker/observe/static/constants.js +8 -1
  201. package/dist/worker/observe/static/dag-history-labels.js +4 -0
  202. package/dist/worker/observe/static/dag-node-purpose.d.ts +6 -0
  203. package/dist/worker/observe/static/dag-node-purpose.js +208 -0
  204. package/dist/worker/observe/static/format.js +60 -0
  205. package/dist/worker/observe/static/index.html +6 -1
  206. package/dist/worker/observe/static/inspect-workspace.js +307 -0
  207. package/dist/worker/observe/static/markdown-render.js +20 -1
  208. package/dist/worker/observe/static/operator-chrome.css +145 -20
  209. package/dist/worker/observe/static/operator-chrome.d.ts +20 -3
  210. package/dist/worker/observe/static/operator-chrome.js +330 -96
  211. package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
  212. package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
  213. package/dist/worker/observe/static/router.d.ts +46 -0
  214. package/dist/worker/observe/static/router.js +25 -1
  215. package/dist/worker/observe/static/state.d.ts +50 -0
  216. package/dist/worker/observe/static/state.js +184 -1
  217. package/dist/worker/observe/static/styles.css +395 -0
  218. package/dist/worker/observe/static/views/dag-graph.js +4 -2
  219. package/dist/worker/observe/static/views/dag-inspector.js +1067 -9
  220. package/dist/worker/observe/static/views/dag.d.ts +13 -0
  221. package/dist/worker/observe/static/views/dag.js +14 -5
  222. package/dist/worker/observe/static/views/dashboard.js +6 -4
  223. package/dist/worker/observe/static/views/failures.js +5 -2
  224. package/dist/worker/observe/static/views/night.js +2 -2
  225. package/dist/worker/observe/static/views/pool.js +1 -0
  226. package/dist/worker/observe/static/views/run.js +3 -1
  227. package/dist/worker/observe/static/views/session-timeline.js +78 -9
  228. package/dist/worker/observe/static/views/task.js +56 -1
  229. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +49 -3
  230. package/dist/workflows/dag/backend-test-markdown-workflow.js +176 -1
  231. package/dist/workflows/dag/backend-test-pytest-collection.js +98 -14
  232. package/dist/workflows/dag/backend-test-writer-completeness.js +17 -17
  233. package/dist/workflows/dag/contract-output-registry.js +15 -0
  234. package/dist/workflows/dag/contract-validator-registrations.js +1 -2
  235. package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
  236. package/dist/workflows/dag/dynamic-runtime/map.js +2 -1
  237. package/dist/workflows/dag/failure-category.js +7 -116
  238. package/dist/workflows/dag/frontend-closeout.js +221 -0
  239. package/dist/workflows/dag/frontend-design-policy.js +400 -0
  240. package/dist/workflows/dag/frontend-human-decision.js +182 -0
  241. package/dist/workflows/dag/frontend-implementation-contract.js +538 -166
  242. package/dist/workflows/dag/frontend-plan-render.js +24 -0
  243. package/dist/workflows/dag/frontend-prewrite-gate.js +388 -392
  244. package/dist/workflows/dag/frontend-provider-capability-matrix.js +159 -0
  245. package/dist/workflows/dag/frontend-recovery-capsule.js +455 -0
  246. package/dist/workflows/dag/frontend-recovery-controller.js +202 -0
  247. package/dist/workflows/dag/frontend-recovery-lineage.js +178 -0
  248. package/dist/workflows/dag/frontend-recovery-plan.js +17 -10
  249. package/dist/workflows/dag/frontend-recovery-run.js +33 -20
  250. package/dist/workflows/dag/frontend-repair.js +7 -424
  251. package/dist/workflows/dag/frontend-review-context.js +288 -14
  252. package/dist/workflows/dag/frontend-review-findings.js +270 -0
  253. package/dist/workflows/dag/frontend-risk.js +15 -2
  254. package/dist/workflows/dag/frontend-shadow-dual-write.js +814 -0
  255. package/dist/workflows/dag/frontend-shape-capsule-store.js +191 -0
  256. package/dist/workflows/dag/frontend-shape-facts.js +409 -0
  257. package/dist/workflows/dag/frontend-shape.js +427 -0
  258. package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
  259. package/dist/workflows/dag/frontend-split-application-service.js +203 -0
  260. package/dist/workflows/dag/frontend-split-orchestrator.js +899 -0
  261. package/dist/workflows/dag/frontend-test-case-checklist.js +30 -4
  262. package/dist/workflows/dag/frontend-test-case-manifest.js +11 -4
  263. package/dist/workflows/dag/frontend-test-case-quality.js +11 -16
  264. package/dist/workflows/dag/frontend-test-environment-probe.js +230 -0
  265. package/dist/workflows/dag/frontend-test-html-report.js +3 -1
  266. package/dist/workflows/dag/frontend-test-l5-report.js +3 -1
  267. package/dist/workflows/dag/frontend-test-layout.js +159 -0
  268. package/dist/workflows/dag/frontend-test-markdown.js +61 -0
  269. package/dist/workflows/dag/frontend-test-result-contract.js +188 -42
  270. package/dist/workflows/dag/frontend-test-standard-scenarios.js +70 -0
  271. package/dist/workflows/dag/frontend-typed-event-store.js +452 -0
  272. package/dist/workflows/dag/frontend-typed-event-transaction.js +180 -0
  273. package/dist/workflows/dag/frontend-verification-trace.js +52 -17
  274. package/dist/workflows/dag/frontend-worktree-diff.js +250 -17
  275. package/dist/workflows/dag/frontend-writer-admission.js +272 -0
  276. package/dist/workflows/dag/frontend-writer-status.js +244 -0
  277. package/dist/workflows/dag/init-hybrid.js +1072 -660
  278. package/dist/workflows/dag/interrupt-request.js +10 -3
  279. package/dist/workflows/dag/lifecycle.js +3 -3
  280. package/dist/workflows/dag/node-execution.js +552 -58
  281. package/dist/workflows/dag/prompt.js +44 -19
  282. package/dist/workflows/dag/recovery-lease.js +80 -0
  283. package/dist/workflows/dag/report.js +37 -1
  284. package/dist/workflows/dag/rerun-feedback.js +124 -1
  285. package/dist/workflows/dag/rerun-plan.js +144 -5
  286. package/dist/workflows/dag/rerun-run.js +81 -6
  287. package/dist/workflows/dag/rerun-task.js +29 -0
  288. package/dist/workflows/dag/retry-policy.js +318 -8
  289. package/dist/workflows/dag/runner.js +429 -122
  290. package/dist/workflows/dag/scheduler.js +114 -16
  291. package/dist/workflows/dag/structured-output-repair.js +712 -0
  292. package/dist/workflows/dag/types.js +338 -31
  293. package/dist/workflows/dag/upstream-artifacts.js +0 -4
  294. package/dist/workflows/dag/validate.js +92 -32
  295. package/docs/README.md +2 -0
  296. package/docs/architecture/evolution.md +45 -0
  297. package/docs/init-surface.manifest.json +9 -0
  298. package/docs/operations/README.md +1 -1
  299. package/docs/operations/local-development-environment.md +21 -0
  300. package/docs/templates/README.md +2 -1
  301. package/docs/templates/agent-dag-report.schema.json +8 -2
  302. package/docs/templates/agent-dag.schema.json +63 -1
  303. package/docs/templates/backend-test-dag.json +265 -237
  304. package/docs/templates/frontend-implementation-contract.schema.json +684 -24
  305. package/docs/templates/frontend-test-case-checklist.md +2 -2
  306. package/docs/templates/frontend-test-dag.json +8 -10
  307. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +1 -1
  308. package/docs/templates/init-managed-agents.md +13 -3
  309. package/docs/templates/spec-registry.schema.json +45 -0
  310. package/harness.json +1 -1
  311. package/package.json +7 -1
  312. package/scripts/next-info.mjs +356 -0
  313. package/scripts/next-publish-gate.mjs +238 -0
  314. package/scripts/release-source-binding.mjs +251 -0
  315. package/skills/codebase-scout/SKILL.md +1 -1
  316. package/skills/fe-test-ui-scout/SKILL.md +65 -0
  317. package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
  318. package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
  319. package/skills/frontend-bounded-implement/SKILL.md +8 -14
  320. package/skills/frontend-design-review/SKILL.md +20 -41
  321. package/skills/frontend-implementation/SKILL.md +3 -4
  322. package/skills/frontend-implementation/references/design-spec.md +15 -10
  323. package/skills/frontend-implementation/references/node-contracts.md +23 -13
  324. package/skills/frontend-review/SKILL.md +22 -14
  325. package/skills/frontend-review/references/review-findings.md +6 -7
  326. package/skills/loop-agent/references/command-reference.md +12 -4
  327. package/skills/loop-agent/references/hybrid-dag.md +8 -1
  328. package/skills/playwright-cli/SKILL.md +23 -1
  329. package/skills/playwright-cli-case-generator/SKILL.md +29 -8
  330. package/dist/worker/console/static/assets/channel-CPF4N7pf.js +0 -1
  331. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C2DwA_Y1.js +0 -1
  332. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C2DwA_Y1.js +0 -1
  333. package/dist/worker/console/static/assets/index-DTZOKgAn.js +0 -404
  334. package/dist/worker/console/static/assets/index-Ya5FE7cD.css +0 -1
  335. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-B8FB_cNk.js +0 -1
  336. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CrZYaWfx.js +0 -8
  337. package/dist/worker/console/static-src/operator-chat/activity-rail-presentation.js +0 -73
  338. package/dist/worker/console/static-src/operator-chat/useActivityRailTransition.js +0 -59
package/CHANGELOG.md CHANGED
@@ -2,14 +2,94 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
- ### 变更
6
-
5
+ - 收敛前端 `frontend-plan-pi` 的职责与上下文:Plan 只把 Contract/Scout 的冻结事实映射为 typed decision patch(需求→实现/验证、组件/状态/Mock/依赖与真实证据缺口),不再重复任务源、完整 JSON Schema、受保护 skeleton、逐 AC 回显模板或 bad/good 教学示例。Schema、字段别名、路径与命令校验继续由 typed tools 和 deterministic runtime 持有;Plan 的同名 `record_target_surface` 改为只接受 routes 的 `record_route_selection`,文件归属仍只来自 Scout/runtime。初始 prompt 不再教学别名,validator 失败重试才附加对应 canonical 字段指引;保留冻结验证命令、Mock 约束、字段摘要和组件选型约束,并新增回归断言防止大段 Schema 回注。
6
+
7
+ - 前端 `frontend-plan-pi` 的读预算统一为软停止:达到 40 次读取、文件数或字节数预算时不再把节点改判 `read-burst`,也不返回截断的仓库内容;工具只返回“停止探索、使用已注入 facts 并 finalize_plan”的短指引。Plan 保留精确 `read` 用于上游截断 artifact,`grep/find/ls` 继续由 Scout 节点承担仓库发现,避免第 41 次读取或大文件触发无意义失败。
8
+
9
+ - 补齐前端 Scout→Plan 的发现闭环:Scout 必须提交带 `complete/blocked` 状态、未决路径和运行时新鲜路径证据的 target surface;空表面、未决路径或无证据时在 Scout 节点内重试,Plan 不再接手盲搜。Plan 仍可为具体组件/状态/测试决策读取 Scout 已确认路径或上游运行产物,但读取未确认仓库路径会返回收敛指引而非让节点失败,`grep/find/ls` 继续不可用。
10
+
11
+ - 修复前端 DAG 的新增组件选型契约:任务源/PRD 明确要求新增的组件现在以 `decision=new` 携带可追溯的 PRD `specReference` 通过 schema、design policy 与兼容 prewrite gate;OpenSpec 候选与读取证据校验仅约束 `specified` 组件,避免 `TaskSourceBadge` 一类计划在 writer 前自相矛盾地失败。
12
+
13
+ - 前端 DAG 的注入合同与运行时对齐:design review、final review 与 bounded writer skills 不再要求 `VERDICT:` 或 `IMPLEMENTATION_OUTCOME:` 首行;design/review 改以 committed typed terminal 为唯一权威,writer 状态由 write events、累计 diff、write guard、requirement coverage 与 focused checks 派生。同步修正旧拓扑文档、必读 node-contract reference 的预算和累计 diff 回归断言,避免模型按已删除的 revision/repair 链工作。
14
+
15
+ - 前端 taskKind 分类漂移修复(合并后冒烟暴露):semantic-intake 模型提示词只列了 `backend-test / frontend-test / standard`,没提 `frontend-implementation`——模型把「实现组件 + 附带测试」的 PRD 误分类为 frontend-test(走了 browser-test RAG DAG 模板,报 allowedPaths 未覆盖 testcase/frontend)。提示词补全 taskKind 全集并明确区分:实现组件(含自带测试)是 frontend-implementation;frontend-test 只用于对既有功能的纯浏览器/UI 自动化测试。同时 source fidelity 不再把 PRD「背景」段误判为 executable(fragment-inventory other 章节固定 context-only,`EXECUTABLE_HINT_RE` 过度匹配「需要」导致 SOURCE_FIDELITY_HIGH_RISK_UNCOVERED 阻塞的回归)。
16
+
17
+ - 根 `tsconfig.json` 补 `jsx: "react-jsx"`(规范冒烟暴露):`test/**` 下的前端测试 import `static-src/**/*.tsx`(JSX 组件)时,根 tsc(无 jsx 配置)报 `TS6142: '--jsx' is not set` 导致 typecheck 失败——之前只能靠组件避免 JSX 语法或测试用 readFile 读源码绕过。补配置后测试可直接 import/渲染 JSX 组件,与 `src/worker/console/tsconfig.json` 的 static-src 编译约定一致;服务端 `src/**` 无 `.tsx` 不受影响。
18
+
19
+ - 前端 design-review 拒绝纳入自动恢复(方向 A 姊妹实现):`request_design_changes`(definite finding)不再让 writer-admission blocked 变成 terminal failed——runner 终态判定识别 committed design fact 后生成 recovery trigger(new-dag,从 plan 重启)+ 渲染 design findings PRD 草稿 + `deriveDagRerunFeedback` 增加 design typed-fact 通道(findings 注入下一轮 `<rerun_feedback>`),受同一 `frontendRecoveryQuota` 控制;无 design fact 的 blocked admission 仍保持 terminal failed。design-review 发现"AC 未被契约/测试锚定"这类真问题会在写代码前自动进入修正轮,而非一次失败即停。
20
+ - 前端 DAG 两个闭环补齐(P0-1 / P2-4):
21
+ - **P0-1 前端 recovery 配额可配置**:`task.json frontendRecovery.maxContinuations`(默认 1,可配 2-5)冻结进 DAG spec(`spec.frontendRecovery`),runner 的 `finalizeTerminalRunStatus` 4 处硬编码 `< 1` 改为按配额判定——verify 偶发失败导致 run 真失败的场景可放宽到 2-3 次自动恢复,不必人工介入。
22
+ - **P2-4 `dag follow-up` 命令**:`loop-agent dag follow-up <parent-run-id> [--task-id <id>] [--execute] [--profile <p>]`——读取 parent run 的 `contracts/frontend-review-findings-prd.md`,createTask + importPrd(taskKind=frontend-implementation + PRD 内容)生成下游修复任务,`--execute` 直接 advance 走前端 DAG。review findings 从"只落文件的草稿"变成"一步进入下一轮 DAG 的任务",闭环补齐。
23
+ - frontend-plan-pi 重试上限从 5 收紧到 3(`FRONTEND_PLAN_LADDER_RETRY_POLICY.maxAttempts`):每次 attempt 都是完整跑一遍 plan(读上下文 + 提交 record_* ledger),5 次在坏情况下等于 5 倍 plan token 成本;3 次仍覆盖常见失败(invalid-output 格式滑动、read-burst、传输类),四档阶梯只部分可遍历即判 non-converging,减少单节点无限烧 token 风险。
24
+
25
+ - 前端 review `request_review_changes` 不再被静默当作成功(方向 A):`frontend-review-pi` 提交 typed `request_review_changes` 时,run 终态判定为「未通过」(`partial_failed` + `terminalReason=review-request-changes`,即使全部节点 FINISHED 也不显示成功),committed findings 自动渲染为 run-owned 下游任务 PRD 草稿 `contracts/frontend-review-findings-prd.md`(含 issueCategory/evidenceRefs/findings/restartPhase 指引),并生成 recovery trigger(issueCategory→failureOwner 映射,new-dag)。`deriveDagRerunFeedback` 新增 typed-fact 通道:无文本 verdict、无 convergence 的 frontend 场景也能把 committed `request_review_changes` findings 注入下一轮 `<rerun_feedback>`,问题不再丢失、下一轮从 restartPhase 定点修复而非重复流程。
26
+ - 前端 review findings PRD 草稿携带修复范围路由信号(方向 A 补充):`deriveFrontendReviewFixScope` 从 committed findings 确定性推导建议 shape(单文件无远程 API→micro、同目录集中多文件→small、跨目录/API 信号→standard)与建议 complexity、目标文件、建议 allowedPaths;PRD 标题改为「修复 review 发现(<shape>):<目标文件>」,正文新增「修复范围(供下一轮任务生成路由)」段(含 small 信号词,如「单文件局部修复」「无远程接口」),下一轮任务以该 PRD 生成 DAG 时,`resolveFrontendTaskShape` 能把小修复路由到 micro=7/small=10 节点拓扑,而非默认 11 节点 standard 全流程。
27
+ - 前端 shape 分类 API 否定词覆盖中文空格形式(冒烟暴露边界):`无 API/网络调用`、`无 API` 等表述不再被误判为远程 API 信号(原 `\b(...)\b` 对 CJK 开头无词边界),`resolveFrontendTaskShape` 与 `deriveFrontendReviewFixScope` 的 hasApiSignal 判定同步修正——带「无 API/无接口」声明的单文件小修复正确路由 micro/small,而非误升级 standard。
28
+ - 深度合入 origin/main(source e68dfbe1):以 frontend-node typed-tools 拓扑为基底移植 main 硬化——canonical artifact 消费、fail-closed 无验证 marker、风险分级细化(DEPENDENCY_INSTALL_LANGUAGE)、`HARNESS_DAG_RERUN_PROMPT_OVERRIDE` prompt override、Pi SDK 运行时依赖 0.83.0 与 `engines node>=22.19.0`、next-release scripts 入包;废弃节点(verify-assess/reverify/repair-pi/plan-revision/final-design-review/lint-baseline shell)能力确认被当前流程覆盖后裁剪对应实现(repair-gate 机制、lint-baseline shell 类型),plan retry 文案对齐 committed ledger;affected 392 + M2-M9 303 测试全绿,fast 3909/3910、integration 397/398(各 1 个 fn 既有失败)。
29
+
30
+ ### 重点更新
31
+
32
+ - backend-test 的 pytest repair 现在继续使用 run-owned plan,不再搜索测试目录 README;correspondence finding 会直接指向 docstring、参数 ID、符号、脚本或 payload 的修复位置,collection/scenario repair 与 generated-local Python 写边界保持一致,并在单次 Pi 会话达到 24 轮或 80K 最大 usage snapshot 前受控返回 partial failure。
33
+
34
+ - Operator Chat 多次输入排队对齐 DSH Web:运行中的连续输入改为持久化 FIFO 队列,不再用后一条覆盖前一条;单条直接展示,多条默认折叠为数量栏,展开后逐行提供内联编辑、删除和插话发送。队列 Dock 使用与 DSH 一致的外层定位与内层面板结构,标题固定、仅消息列表滚动,并在编辑或请求期间锁定折叠操作。编辑/删除以消息 ID + revision 做并发保护,插话复用 Pi `steer` 注入当前回合,其余消息继续按顺序在回合结束后自动发送;队列通过会话快照与 SSE 权威数组恢复,刷新或 Console 重启不丢失。
35
+ - Operator Chat 右侧辅助栏统一上下文与调用记录:输入框的上下文环、调用记录入口现在复用文件/DAG 侧栏;「文件」常驻,「上下文 / 调用记录」按入口临时添加并支持独立 `×` 关闭,关闭后回到文件 Tab;点击已选入口可收起侧栏,切换到上下文时同步开启注入状态,收起时仅关闭注入而保留上下文数据。上下文与工具调用内容改为内嵌布局,不再叠加独立弹窗、遮罩、焦点陷阱或重复关闭按钮,并补充 Tab 切换与侧栏开合动画;修复折叠态右侧展开按钮无法恢复侧栏的问题。
36
+ - Operator Chat 手动 compact 消息流对齐 DSH Web:压缩中在时间线显示状态行,完成后显示默认折叠的 `compact` 摘要边界,点击可展开完整 Markdown 压缩结果;compact 事件通过 SSE 与 session 详情快照双路径恢复,使用事件 ID 去重,刷新/重新进入会话不丢失。Pi compaction 会把摘要写入 session context,后续模型请求继续使用压缩后的上下文。
37
+ - Operator Chat 对齐 DSH Web Todo 能力:新增 `todo_write` 整表替换工具与内容校验,Todo 状态通过会话事件持久化并支持刷新恢复;新一轮开始自动清空,输入框上方展示默认折叠的任务面板(待处理虚线圆环、进行中旋转圆环与完成勾选),消息流使用专用“更新任务清单”摘要行;手动压缩上下文时会把当前完整 Todo 列表合并进压缩指令,避免摘要遗漏仍在执行的任务。
38
+ - Todo 压缩续跑保护:保留 Pi 默认压缩算法,在手动、阈值或上下文溢出压缩成功后的同一轮下一次模型请求前,临时注入当前完整 Todo 内容与状态;下一轮按 DSH 生命周期清空,避免旧任务串入新对话。
39
+ - Operator Chat 的 `ask_user_question` 提问卡片进一步对齐 DSH Web:问题协议新增 Markdown `detail` 说明;选项标签、推荐标记与描述按同一行自然换行,多选仅由 checkbox 表达勾选而不再整行强高亮;自定义回答按单选编辑图标/多选 checkbox 区分,并使用最多六行的镜像自增高输入框;卡片滚动、悬浮/选中动画、窄屏间距和无障碍 tooltip 同步 DSH 行为。
40
+ - Console 多工作区作用域模型收敛(2026-08-26):对话页顶部不再渲染工作区切换器,工作区添加/选择/新建会话只保留在左侧 Workspace browser;会话按创建工作区持久归属,打开会话后的对话、文件与仓库能力请求全部路由该 session 的 owning workspaceId,与当前全局 active workspace 无关,切换 Operate/Inspect 活动工作区不再泄漏跨工作区数据;新建会话必须携带已知 workspaceId,缺失或未知时前后端一致 fail closed(400 `WORKSPACE_REQUIRED` / 404 `WORKSPACE_NOT_FOUND`),绝不回退默认工作区;Operate 顶部切换工作区为硬作用域边界——中止旧 operation SSE、清空 taskId/dagRunId/operationId/确认态并以新 workspaceId 重新加载;readiness、recovery candidates、night jobs/doctor/morning/ticker 与全部 Observe GET 改为显式 `?workspaceId=` 作用域(`/api/health` 保持进程级),Observe 工作区切换严格按 abort old → clear old → set scope → route/reload new 原子顺序执行,消除旧作用域请求新路由的竞态窗口。
41
+
42
+ - Operator Console 顶栏以对话页为统一基准:Logo 与工作区入口固定在左侧,「对话 / 操作 / 观测」使用视口居中的三等分胶囊与 190ms 横向滑动选中态;切换页面时复用同一个滑块 DOM 节点,避免顶栏更新中断过渡而闪到终点,也不再因仓库身份、状态胶囊或不同内容宽度发生位移;原“仓库身份”改为消费唯一多工作区控制器的工作区下拉,保持列表顺序,切换后停留在当前主页面,并让对话、操作请求与观测数据继续携带同一 `workspaceId`。
43
+ - Operator Chat 右侧文件工作台对齐 `dsh-better-sidebar@0.16.1`:辅助栏宽度不再受固定 520px 上限限制,拖拽宽度随视口钳制并跨会话持久化;文件打开后采用左侧预览、右侧文件树布局,树宽可在 160–480px 间独立拖动。文件 Tab 内置关闭按钮,「预览 / 源文件」与「新窗口打开」收为右侧紧凑工具区;Tab 悬浮、选中与键盘焦点统一为整行反馈,不再出现文件名和关闭按钮各自高亮;预览滚动条同步模型选择器的低对比细滚动条样式。
44
+ - Operator Chat 工具执行状态进一步对齐 DSH Web:成功后不再显示“完成”标签,错误时以红色状态点和错误首行替换普通图标、参数摘要,运行中以低对比扫光表达状态;Think 与工具行统一为 14/24,Think 正文继承界面正文字体,Bash/代码输出保留 12/18 等宽字体;折叠态显示语义图标、悬浮时切换展开箭头,未知工具使用 Sparkle 图标;状态文字继续通过无障碍文本提供,错误详情仍默认展开,右侧“工具调用记录”诊断面板保持不变。
45
+ - Operator Chat 输入框把模型与推理等级合并为一个 DSH 风格入口:根菜单分为“模型 / 推理等级”,模型仍按供应商分组,`Auto` 同时显示 Pi 当前实际档位。
46
+ - Operator Chat 输入框下方统计栏对齐 DSH Web:移除长期硬编码的 `轮/步 —`、`LLM —`、`首 token —` 等占位,改由服务端从持久会话事件投影真实轮数、步骤数、LLM/工具耗时与 token/cache 汇总,刷新或切换历史会话后仍可恢复;新回复同时记录每个 assistant step 的首 token、解码时长和输出 token,结束后自动刷新并展示平均 TTFT 与 tok/s。展示按 DSH 使用 `|` 分组、组内 `·`,没有可靠证据的整组直接隐藏,超长单行省略并保留完整悬浮文本。
47
+ - Operator Chat 消息流对齐 DSH Web:彻底移除历史回合中的“处理详情”聚合入口以及残留的 `Assistant process` 展示容器,Think、进展、阶段性正文、Bash/Read/Search/Edit/Web/MCP 等工具调用与最终回答作为轮次下的同级节点,按真实事件顺序直接展示;Think 与工具行显式左对齐,不再继承全局按钮的横向居中,运行中 Think 展开、历史 Think 折叠,右侧“工具调用记录”诊断面板继续保留。回答正文、Think、工具行与代码输出同步采用 DSH 的字号和行高基准。
48
+ - Operator Chat Markdown 表格对齐 DSH Web:三列及以下表格在 748px 正文列内自动换行,四列及以上表格扩展利用整个消息视口;宽表静止时不再常驻横向滚动条,只有内容确实溢出且鼠标悬浮或键盘聚焦时才显示,窄视口自动回退为列内安全滚动。
49
+ - 新增源码仓库专用 `npm run console:dev`:浏览器继续固定使用 8790 的真实同源接口与 mutation gate,8790 仅把前端模块代理给内部 loopback Vite;CSS 原地 HMR、TSX 自动整页刷新,后台类型检查不阻塞视觉循环,Console 后端依赖变化只重启受监督源码子进程。正式 build、发布包与 init surface 不变。
50
+ - Operator Chat 左侧会话行按 DSH Web 保留 2px 相邻间距,选中/悬浮背景不再黏连;工作区行隔离鼠标点击焦点,鼠标移开即恢复,仅键盘 `focus-visible` 与打开菜单时保留聚焦反馈;Console mutation gate 修正同端口 `localhost`、`127.0.0.1` 与 `[::1]` 回环别名误判,并把新建会话的安全闸错误转换为可操作中文提示。
51
+ - Operator Chat 左侧工作区与会话的悬浮/键盘聚焦状态改为行级隔离:会话仍归属工作区分组,但悬浮或聚焦会话时不再连带高亮工作区行、切换工作区图标或显示工作区操作按钮;工作区自身的悬浮卡片和菜单保持原行为。
52
+ - Operator Console 收敛为常驻单壳:一级导航改为「对话 / 操作 / 观测」。对话与操作工作区保活不卸载;观测工作区首次动态挂载 `inspect-workspace.js`,切走 `setActive(false)` 暂停轮询。对话模式没有二级页签时直接隐藏空标签带与折叠按钮,不覆盖操作/观测已有的折叠偏好。产品观测入口(Night 深链、Recovery 全屏、InspectSplitPanel、对话卡片)一律写入 Console canonical hash(`/#/inspect...`),独立 `/inspect/#/...` 仅作兼容入口。
53
+ - Console DAG 检查器「提示词重启」面板改为与检查器一致的卡片层级:版本选择复用自定义下拉;编辑模式与页签同款分段按钮;提交按钮用品牌橙药丸并吸底;追加/替换编辑区放到底稿前面,长底稿默认折叠以免把操作挤出视口。
54
+ - Console「操作」模式新增人类专用的“更新并初始化”入口:默认更新 npm `latest` 稳定版,也可明确选择 `next` 预发布版;先 fail-closed 检查活跃 DAG/Worker/Chat/Console 操作与 npm 来源,再精确安装并验证所选版本、仅执行 `init update --apply-safe`,并以 hash-bound handoff 在原端口接棒新 Console。`latest` 保持稳定版且拒绝回退,`next` 仅在人工选择时允许精确 prerelease;渠道写入 operation 审计身份。Inspect 与模型工具均不能触发该写入操作。启动时不再在终端询问更新,页面会在接棒后自动刷新并通过新的 `consoleInstanceId` 识别实例。
55
+ - 修复 Console 四处评审缺陷(合并前收口):① 向导「运行」进度块接通——`runDag` 只返回 operationId,原实现读的 `recovery.dagRunId` 在向导路径永远为空;现在确认页先快照基线 run、进入运行页后轮询 `observeLink`,以 (taskId, operationId) 任一变化为失效信号(operationId 覆盖「重新运行」按钮——它不改变向导步骤;taskId 覆盖运行步骤中手动改任务 ID 的场景,失效时基线一并重置,避免沿用上一任务的 run):新派发/切任务会清掉旧选中 run 并重新解析,**只接受与当前任务基线不同的新 run**;从 Recovery 带回的共享选中 run 先做归属校验——`GET /api/dag-runs/:id` 详情响应新增 `taskId` 投影(源自 run.json 的 `taskContractBinding`→`sourceBinding`→Hybrid 标题,与 observeLink/candidates 同一绑定真源,不受候选列表 limit 截断影响;404 视为失效选中、无绑定视为不可判定),非本任务的 run 不展示;校验全程由 effect 生命周期栅栏保护——任务/运行/选中在异步校验期间变化时,旧响应直接丢弃、不会改写新状态;校验暂不可用时按有界退避(2s→30s,约 2 分钟)自动重试而非被动等待状态变化,重试计划为纯函数并有行为测试;**展示层另有闸门**——进度面板与运行操作只消费「本解析器已采纳/已验证」的 run(组件 state),未验证期间(校验中、重试中、give-up 后)进度面板保持空缺,不会即时或永久显示其他任务的 DAG;「打开检视」「侧栏预览」两个入口同样双重门禁(按钮无已验证 run 即禁用 + 处理器复核 verifiedRunId),共享的 openInspectSplit 解析器不再能带出未验证的外来 run。解析决策本身抽取为纯状态机 `pages/tasks/run-id-resolution.ts`(首跑/重跑/切任务/外来选中/基线门控五类迁移),Effects 只做薄适配,主流程「确认页基线快照 → runDag 派发 → observeLink 轮询 → 新 run 采纳」有完整行为测试。基线快照为三态(成功/权威无运行/暂不可查),**查询失败不会被当成「没有历史运行」**——快照重试期间基线保持未知、探测轮询等待,不会把旧运行误判为新运行;新 run 创建失败或注册较慢时进度面板宁可空缺也不把上一次已终止的 DAG 当作当前运行(轮询上限 5 分钟后安静停止)。② 失败建议数据契约修正——旅程卡原先把原始 run 级 `failureCategory` 直接查归一化建议表(`missing-api-key`/`nonzero-exit` 等永远查不中,节点分类又在安全投影中被丢弃);现在纯分类核心下沉 `src/shared/dag-failure-category.ts`(console↔workflows 双向共享叶,不破坏 console 禁止 import workflows 的边界测试),服务端投影把 run 级与节点级分类都归一化输出(success/skipped 不出),卡片按「失败节点分类优先、run 级兜底」取值,失败卡始终有可操作建议。③ Recovery interrupt 资格轮询在运行中档位同步刷新 run 状态——原先状态只在选中时读一次,运行中的 run 结束后仍永久保持 4 秒快轮询;现在 4 秒档附带轻量 `GET /api/dag-runs/:id` 刷新 `effectiveStatus`,终态后自动退到 30 秒。④ Inspect 紧凑检视一次瞬时刷新失败不再永久显示错误——成功刷新回合会清除上一轮 error 横幅。
56
+ - Operator Chat 输入框两项交互增强:① **↑/↓ 历史输入召回**——每次发送的文本进入输入历史(连续重复折叠、上限 100 条),光标在首行按 ↑ 逐条向旧回溯、按 ↓ 向新前进,越过最新一条时恢复回溯前**未发送的草稿**(草稿不会被历史浏览冲掉);多行文本中部的方向键仍是普通光标移动,IME 组词与 @文件/命令面板打开时不抢占。② **运行中排队下一轮指令**——当前回合运行中 Enter 不再被吞掉,消息作为「排队消息」绑定当前 Turn(服务端 `PUT deferred-turn` 从仅限 stopping 放开为 running/stopping,错误码 `TURN_NOT_STOPPING`→`TURN_NOT_ACTIVE`),当前回合结束(正常完成或停止)后自动发送;排队条提供「立即发送」(停止当前回复并立即发出)、「编辑」(移回输入框改写后再排)、「删除」三种操作,运行中输入框右侧提供排队发送按钮(与停止按钮并列);排队条单行展示(状态 + 省略号预览 + 操作按钮一行),输入框默认一行高(自动增高上限 280px 不变)。
57
+ - 向导「运行」面板结构化与预期管理(A2/C9):新增实时运行进度块——节点完成计数与百分比进度条(含 progressbar 无障碍语义)、当前运行节点名称与已运行时长、失败节点与错误摘要,数据来自 `/api/dag-runs/:id` 每 5 秒轮询并在终态自动停止;`effectiveStatus=running-suspected-stall` 时显示橙色「疑似停滞」提示条(建议打开检视查看节点活动或到恢复页协作中止/诊断),把 20–40 分钟长跑的「日志噪音等待」变为有阶段感、可判断的等待。原始 SSE 事件日志默认折叠为「原始事件日志(最近 80 条)」,需要排查时再展开。
58
+ - Console 前端三项体验优化(P0/P2):① Recovery 页 DAG 紧凑检视侧栏(InspectSplitPanel)从一次性快照改为实时刷新——运行中每 5 秒自动拉取节点/事件并新增「进行中/已结束」刷新状态行,到达终态(finished/failed/partial_failed/superseded/abandoned)自动停止轮询,刷新轮不清空既有内容避免闪烁;② Chat 任务旅程卡失败态新增按归一化 failureCategory 的可操作「建议」行(validation/executor/write-guard/timeout/auth/human-required/human-rejected/shell-command/static-error/decision-envelope/unknown 各映射到具体下一步:从失败节点重跑、修正契约后重新生成、跳「模型与认证」页等),不再只报「原因分类为 X」;③ Recovery 页 interrupt 资格轮询退避:选中 run 已终态(含 interrupted)时从 4 秒降到 30 秒,运行中保持 4 秒。
59
+ - Console 对话页 Models 面板的模型管理增强:以弹框形式增/改/删 Pi 的模型条目,支持 6 个定义字段(id、name、contextWindow、maxTokens、input、reasoning)。新增时 Provider 用下拉选择、其余字段自动补默认值;编辑时 Provider 只读且仅在原位置就地替换,只改表单内字段、不覆盖配置里页面未展示的其它字段(如 cost/compat);不读写 API key(凭据走 Pi CLI)。编辑已存在的模型不再被移到最后。(该能力仅在对话页提供,设置页不再重复入口。)
60
+ - 修复 `markdown-traceability` pipeline 未将冻结 `backendLayout` 传给 `validateBackendMarkdownTraceability`,自定义 layout 下不再回落默认 `testcase/md` ENOENT;新增回归用例以非默认 nested layout(`testRoot=testcase/elb/remote`、`markdownRel=md`)执行真实 shell pipeline,traceability 从自定义 Markdown 目录读取并 PASS,默认 layout 行为不变。(验证:`npm run typecheck`、`npx vitest run test/backend-test-markdown-workflow.test.ts test/backend-test-layout.test.ts`、`npm run build`、`git diff --check`。)
61
+ - backend-test 快速补强(backend-test-fast-failclosed-attribution):两处 fail-open 缺口已 fail-closed。① 当前轮次 Markdown 作用域严格依赖唯一有效 `## Module Index`——README 缺失 / 不可读 / `## Module Index` 重复(或缺标题)/ 唯一但空或不可解析任一状态,`markdownFiles` 与 coverage `markdownModuleFiles` 均返回空作用域而非回退全目录扫描,历史 `.md` 不再渗入 Case/coverage/partition facts,`resolveBackendTestManifestModules` 新增可区分 `manifestStatus`(valid/missing/unreadable/duplicate/empty-unparsable)与 `moduleIndexHeadingCount`,`validateBackendMarkdownCases` 与 `analyzeBackendTestCaseCoverage` 为非法状态各推 FAIL finding,默认与自定义 `backendTest` 布局一致。② collection 分类器不再凭 `__NNN_*` 裸 import 名称单独判 REPAIRABLE:inventory 构建时预计算每个 mapped script 的裸本地 helper import 证据(`scriptBareImports`),只有「存在同名 generated-local helper asset 且 mapped script 源码确实 import 该裸模块」才判 REPAIRABLE 并给精确 repairPaths;无 helper asset / mapped script 无对应 import / 无法精确归因一律 `BLOCKED`(`missing-generated-local-helper-without-evidence`。真第三方模块缺失保持 BLOCKED,不通过 PYTHONPATH/sys.path/conftest/ImportError fallback 绕行。(验证:`npm run typecheck`、backend-test 四聚焦 vitest、`npm run build`、`git diff --check`。)
62
+ - backend-test 后续修复(backend-test-fast-manifest-import-fix):Markdown 用例校验与 coverage 分析改为按 README `## Module Index` 清单限定本轮有效模块资产——未声明旧 `.md`(如 legacy.md)不再进入 Case/coverage/partition 统计,报告改为显式非静默 unmanifested advisory;“清单声明但文件缺失” fail-closed 明确失败,默认与自定义 `backendTest` 布局统一生效。generated pytest 裸本地 helper import(`from __551_manager_helpers import ...`)在 writer completeness gate 判为 recoverable 并给出精确 mapped 脚本 target path;collection 分类器对可归因到 mapped 资产的裸本地 helper `ModuleNotFoundError` 判 REPAIRABLE 并提供精确 repairPaths,真正第三方依赖缺失仍保持 BLOCKED。不放宽 self-contained、writeSet、forbiddenPaths、skip/xfail、断言与单次业务执行约束(验证:`npm run typecheck`、backend-test 聚焦 vitest、`npm run build`、`git diff --check`)。
63
+ - 前端风险分级细分 manifest 触及语义:`allowedPaths` 含 `package.json`/lockfile 或需求文本提到 package.json 不再单独触发 `new-dependency` high-risk(改一行 script、调构建参数的任务不再被顶到强制全门禁并误标高风险),只有任务文本同时出现安装语言(npm install / yarn add / pnpm add / 新增依赖等)才升级;仅路径触及时记 `new-dependency:manifest-path-without-install-language` 拒绝信号,审计可溯。
64
+ - 前端验证 fallback 生成期诚实化:真实项目无可读取的 `package.json` scripts 且未探测到本地 tsc 时,不再注入必然失败的 `npm run typecheck` / `npm run build` / `npm test`(纯静态 / vanilla JS 站点原会在 verify 阶段假失败),改为执行显式 no-op 标记命令(`No frontend verification command configured`,进入冻结命令集可被 contract 引用,trace 如实记录 not-run),并写生成期 advisory 提示用 `--verify` 或执行约束显式声明验证命令后重新生成 DAG。无 repoRoot 的单测 fixture 保留历史 generic fallback。**标记不构成验证证据(fail-closed)**:verification trace 将绑定标记的 target 判为失败、只含标记的 static 证据判为 unavailable,repair 分类归为 non-repairable `contract`,verify 节点以 `frontend verification unavailable` 硬失败阻断 review/closeout——无真实验证命令的 run 无法走完绿灯链。
65
+ - frontend-test `passed` 回执链改按 dispatch 序号判序(B-HASH-01):`summarizePlaywrightCliReceipts` 先按 `sequence` 排序再判 open→find→cleanup 连续链;并行 `find`/`screenshot` 按完成时间落盘导致的乱序不再误杀执行已通过的 case(Wave 1 实测 4 条 passed 被改判 `browser-command-evidence-missing`)。真 gap / 重复序号仍 fail-closed。
66
+ - `tool-policy` 失败归一为 `executor`(B-REC-03):前端 preflight 能力拒绝(缺 `@playwright/cli` JS entry、allowlist 拒绝)不再落 `unknown`→`manual-review`+`humanRequired`;`dag report` 给出 `rerun-after-fix`,Console `standaloneTaskRerun` 的 R2 gate 放行 run-failed 同 task 整单重跑,无需人工决策门或 sibling task。
67
+ - Operator Chrome Band1 模式切换入口补显式 `aria-label`(B-FIND-01,方案 A):`操作`/`观测` mode link 原为 inline-flex 裸文本节点,不参与 name-from-content,a11y snapshot 序列化为无名 link,`find` 无法断言;补 `aria-label` 后实测 `find "观测"` 1 命中、click 后 `find "运行总览"` 1 命中,AC-FE-CHROME-003 恢复可见断言路径。
68
+ - Inspect 异常 Task 页空态文案统一(B-FIND-02):`failures.js` 运行时空态由 `当前没有失败或阻塞的 Task。` 改回与静态 `#failures-empty`、页面标题及回归目录 AC-FE-INS-004 一致的 `当前没有异常 Task`,消除静态/运行时文案漂移;实测新文案 find 1 命中、旧文案 0 命中。
69
+
70
+ - 前端实现 DAG 收口到 typed tools 协议与唯一 writer + admission 四态:plan 通过 `submit_plan_ledger` 提交设计终态,design/final review 用 `approve_design|request_design_changes`、`approve_review|request_review_changes` committed typed tool 取代 `VERDICT:` 首行;`frontend-writer-admission-shell` 派生并冻结 writeSet、pre-writer baseline 与 admission digest,仅 `admitted` 放行唯一常规 writer。验证失败改为 terminal 并物化 `frontend-verify-failure-v1`(failureClass/failureOwner/restartPhase)供 recovery/operation 模型路由,删除同 run repair 分支;新增 split orchestrator 与 Micro 7 / Small 10 / Standard-High 11 拓扑 shape 路由,frontend-test 浏览器/视觉/runtime-a11y 认证保留为非阻断 handoff 收口。
71
+ - 前端 OpenSpec 证据链收紧:cited 任务源引用与能力发现共用 `harness.json.governanceRoot`;新 DAG 冻结候选 SHA-256,规范内容漂移阻断 writer;引用块必须唯一,提供 section/line 时校验 heading/行范围;有组件/主题规范且存在可见 UI 时,至少一项 `specified` 选型必须绑定该规范桶。
72
+ - 前端规范候选/必读集解耦:`frontendOpenspec.specRoots` 支持任务级可配置目录,任务准备期会将提示中明确声明的「规范目录 `...`」固化进契约;cited DAG 新增只读 `frontend-spec-select-pi`,逐项选择 required/relevant/irrelevant,仅 required 进入 prewrite 强制读取/引用,显式 requiredReadPaths 与任务源引用不可降级;scan-strict 保持全量读取。
73
+ - 前端规范根增加软链接别名映射:对 `ai_workspace -> …/ai_doc` 等配置根,任务源中的真实目标目录名会在生成/准备期映射回仓库内逻辑根;候选、哈希和读取证据不记录仓库外绝对路径,重名别名 fail-safe 地不自动映射。
74
+ - 发布一次性 dogfood 包 `0.39.0-beta.0`(`beta`):只用于验证本次前端 DAG 规范选择与软链接别名改动;不改变 `latest`、`next` 或 release train。
75
+ - `next-release.yml` 防重复发布守卫补充幂等语义:`mode=recover`(dist-tags.next 已指向出自本 HEAD 的 tarball)时,手动 `workflow_dispatch` 重入不再撞 duplicate publish 硬失败,改为写 summary 后干净退出(§5.1 规则 4);非 recover 的重复发布仍硬失败。
76
+
77
+ - frozen repair 工具审计改为按 attempt 段扫描(B1):`session-events.jsonl` 跨 attempt 共享追加,attempt>1 的 `auditRepairAttemptToolUse` 现在只审本 attempt 字节段(newline 对齐),planner attempt 1 的 ls/find 不再被误判给 repair 轮;repair prompt 显式声明 read-only 工具契约与 allowlist 边界(B2),并内嵌 openspec-citations 输出格式正例;`LOOP_AGENT_IGNORE_STALE_DIST=1` 环境变量旁路 stale-dist guard(B3),Console spawn 的 sibling CLI 可继承。
78
+ - frontend plan/revision 结构化输出改为冻结 repair context + hash-bound canonical artifact:attempt>1 不再重放完整 planner prompt;成功后 stdout 只保留 artifact 路径,design review / prewrite 只消费已校验 artifact,不再从节点文本 merge。失败分类补齐 `structured-repair-exhausted` / `governance-blocked`,并修正 `structured-output-truncated` / `output-too-large` 的归一化映射。
7
79
  - 将 `@earendil-works/pi-ai` 与 `@earendil-works/pi-coding-agent` 从可选依赖提升为精确 pin 的运行时依赖 `0.83.0`,将运行时直接导入的 `typebox` 精确声明为 `1.3.7`,并在根包声明 Node.js `>=22.19.0`。安装 `@tea-agent/loop-agent` 会默认装上 Pi SDK(含 `--omit=optional` 场景);`@cursor/sdk` 仍保持 optional。availability / readiness 探针、隔离 tarball canary、发布包契约测试与安装/本地环境说明同步对齐。
8
80
  - backend-test Scenario Partition 仅接受绑定源有限 enum/分类集合的 GET/list query/path 轴;非法 Domain(空/重复/保留 token、无有限域、与 OpenAPI enum 不一致)报 `INVALID_PARTITION_DOMAIN` / `NO_FINITE_DOMAIN` / `PARTITION_SOURCE_MISMATCH` 根因,不再生成空后缀 `TP-SP-...-`、重复 slot,也不再级联 `MISSING_*_SLOT`。N6 对这些根因码 fail-closed;合法源分区缺槽仍阻断。N2 禁止为自由串/主键/required-only/boundary-only 建分区;N5 允许删除无源非法 Partition 及其派生槽位。
9
81
  - npm `next` 渠道发布改为提交数节流:main push 仅当距上次 next 发布的 source commit ≥ 5 个 commit 时才自动发布(新增 `scripts/next-publish-gate.mjs`,读已发布 tarball build-stamp 对比 HEAD);不足阈值时 workflow 绿色跳过,手动 `workflow_dispatch` 不受限(切 release 线前强制出包 / 紧急补发)。发布文档真源 §4.1/§5.1/§7/§12 同步。
82
+ - 前端 split orchestrator 的 aggregate closeout 补齐 `frontendTestHandoffRefs` 与 `remainingRisks`:`finalize` 经新增确定性读取 port `loadChildCloseoutFacts` 聚合各 child 非阻断 frontend-test handoff 与 `residualRisks`,两者纳入 aggregate digest;伪造/缺失 childId、重复 handoff ref 均被拒,无 UI 可见需求的 child 空数组合法。形态决议落档为 operation 级确定性 finalize(无独立 shell 节点、无 `aggregating-closeout` phase 枚举),console 仍不实现第二套聚合逻辑。
10
83
 
11
84
  ### 新增
12
85
 
86
+ - Frontend source fidelity 生产 Pi 接线(2026-08-24-source-fidelity-production-pi-wiring):真实 `task advance` 的 prepare-contract 主路径与 semantic-intake retry 路径现在对 `frontend-implementation` 任务注入生产 reconciliation executor 与独立 reviewer(`src/task/source-prepare/source-fidelity-pi.ts`):叙述性/歧义片段按标题顺序串行、逐块 `budgetChars=4000` 有界调用,结构化显式 AC/checklist/table 片段仍走 `isStructuredMappableFragment` 代码映射且零 Pi 调用;context-only/duplicate/conflict 在 reconciliation 完成后的独立阶段由 Pi reviewer 审核(`LEDGER_REVIEW_MAX_REVISIONS=1`,第二次拒绝 fail closed)。接线侧门 = `taskKind === 'frontend-implementation'`(`input.taskKind` 优先,缺省回退 `loadTaskConfig`),ineligible 不接线、行为不变。模型队列镜像 semantic-intake(MED→HIGH→LOW + Pi SDK 目录),单次尝试沿用有界超时,工具面仅只读 read/grep/find/ls;模型输出经 validateOutput + zod 严格校验,无效 JSON/schema、越界 canonical ID、排除类 disposition 缺理由、队列空、执行失败/超时一律以稳定 `SOURCE_FIDELITY_*` 阻断码 fail closed,生产路径无确定性 reviewer 回退。Mock 策略 not-needed(无 HTTP API 面,Pi 为 CLI/SDK 模型路径,不添加 Mock 文件/依赖);聚焦测试在 Pi 执行边界打桩(`vi.mock` / 可注入 `executePi` 桩,默认仍为真实 `executePiStep`),覆盖生产生命周期接线、reconcile→review 调用序、结构化零调用、fail-closed 阻断码与 ineligible 零调用。
87
+ - Frontend 原始需求完整性门禁修复 v2(source fidelity ledger repair):① DAG 绑定改读 Task Contract 已持久化的 `source/requirement-ledger.json`(与 intake/apply/prewrite 同一份受管账本的原始字节/hash/inputDigest),删除从 materialized reference path 重建 ledger 的逻辑;缺失/损坏/漂移 fail closed(`SOURCE_FIDELITY_LEDGER_MISSING`/`SOURCE_FIDELITY_LEDGER_STALE`)。② `dagSourceBindingSchema` 拆为 v1(strict 拒绝 ledger 字段)与 v2(schemaVersion=2,`ledgerPath`/`ledgerSha256`/`inputDigest`/`requirementToFragments` 全部必填)的 discriminated union,禁止 v1+optional 冒充 v2;契约级 sourceBinding 增加 all-or-none 约束。③ canonical source identity 单一边界:ledger `sourceDocuments[].path` 与 DAG 侧 `serializeDagTaskSourcePath`/`resolveDagTaskSourcePath` 一致(repo-root relative),路径不再二次转换进入 digest。④ 确定性分片补全:Markdown 表格数据行独立切分、跨文档稳定哈希 `REQ-SRC-*` ID(消除 per-document counter reset 碰撞、文档枚举顺序无关)、V4 `#### AC-*` 标题式显式 ID 原样保留并关联正文、fragment ID 防伪造校验。⑤ 顺序 reconciliation(`ledger-reconciliation.ts`):可注入 executor 显式接口,仅叙述性/歧义 chunk 调用、按标题顺序串行、逐块有界,失败/无效返回/identity 越界 fail closed。⑥ 独立 reviewer(`ledger-review.ts`):context-only/duplicate/conflict 独立审核(不同调用阶段),最多一次有界修订,低风险 context-only 仅 reviewer pass 放行、高风险始终阻断。⑦ human resolution 真正生效:与当前 inputDigest + conflict/fragment identity 匹配且 human-confirmed 的 resolution 解除 blocking conflict/unresolved 并保留 audit,stale/伪造/未确认不生效。⑧ Console/Observe 展示 v2 binding 语义(`binding=v2`、ledger sha256、inputDigest)与稳定 failure code;`GET /api/tasks/:id/ledger` 增加绑定语义字段(向后兼容)。
88
+ - Operator Chat 时间线左缘新增「用户消息锚点栏」:每个用户输入一枚横向小条(12×3px 微圆角),紧凑等距排列并在时间线高度内垂直居中;条数超出栏高时相邻锚点自动聚合为稍宽的聚合条(悬停展开「N 条聚合输入」逐条列表,时间 + 单行预览,逐条点击定位)。悬停时小条向对话一侧平滑伸长(12→18px)并变橙,浮窗右侧弹出(白底圆角,正文最多 3 行、超出省略号,附序号与时间);单击平滑滚动定位到对应消息(精确停靠在视口顶部偏移 8px);覆盖视口顶部的锚点保持高亮。空会话自动隐藏;历史分页/流式更新/窗口缩放时自动重算(rAF 节流)。
89
+ - frontend-test 产物根可配置:`task.json.frontendTest.testRoot` 缺省仍为 `testcase/frontend`,省略时生成的 DAG 路径与历史默认根一致;自定义根(如 `qa/frontend-test`)在编译期冻结并驱动 writer、gate、playwright 围栏与 `allowedPaths`。`.harness/**` 等隐藏/治理树在生成期拒绝。
90
+ - 实验能力「编辑失败节点提示词后从节点重跑」默认开放:无需环境变量即可使用 `dag rerun --prompt-override <nodeId>@<file>`(全文替换)与 `--prompt-override-append <nodeId>@<file>`(追加指令:保留冻结原提示词,末尾追加 `<operator_addendum>` 块);`HARNESS_DAG_RERUN_PROMPT_OVERRIDE=0|false|off` 保留为紧急关闭开关。仅限 ERROR 且位于 reset closure 内的节点;mode + base/最终 prompt sha256 计入 planHash(execute 漂移即 `PLAN_DRIFT`),父 run spec 冻结、provenance(含 mode)落 `continuation.promptOverrides`。Console 新增 `dagPromptOverrideConfig` 开关探测 action,`dagRerunPlan`/`dagRerun` 接受 `promptOverrides`(`{nodeId, prompt, mode?}`);Inspect DAG 节点 inspector 新增「提示词重启」tab——默认「追加指令」模式(只读底稿 + 追加编辑器),可切换「全文替换(高级)」,预检通过展示执行估算,提交后续跑并跳转新 run,全程不离开图页;默认开启时 `/inspect` 只注入 **scoped** 变体凭据(独立 cookie + `__INSPECT_MUTATION_TOKEN__`,与 Console 通用 token 互不可重放),mutations 路由对 inspect 凭据仅放行 `dagRerunPlan`/`dagRerun`(其余 action 403 `ACTION_NOT_IN_INSPECT_SCOPE`),Inspect 不获得通用写能力;显式关闭时不注入任何 token、tab 不出现,检视面保持严格只读。
91
+ - 观察面 DAG Inspector 节点详情适配 Pi 扩展:执行器输入摘要展示节点声明的 `piExtensions` 短 id;新增「Pi 扩展运行事实」展示 `pi-extensions.json` 的 resolved(包名@版本)与 missing 降级原因(缺包降级不再静默);产物未生成/损坏时降级提示不阻断接口,绝对路径不外泄。
92
+ - 后端实现 DAG(standard / review-gated / supervised)的 Pi 节点支持按桶显式加载本机 Pi 导航扩展:读侧节点(除 closeout)加载 `pi-codegraph` + `pi-lens`,写侧节点只加载 `pi-codegraph`(pi-lens 的 `ast_grep_replace` 可绕过 writeSet,不加载);前端/测试模板与省略字段节点保持扩展全关。扩展发现始终关闭,只经白名单解析 `~/.pi/agent` 与项目 `.pi` settings 的已装包(缺包降级不失败,产物 `pi-extensions.json` 记录 requested/resolved/missing);session 后 pin 工具面剔 builtin 同名、deny 面与写工具,writer 的 `edit`/`write` 仍为 policy-wrapped;`.codegraph/**` index 同步不再计入 write-guard 越界。
13
93
  - Pi SDK 终态 session-events JSONL 顶层增加可选 `finish_reason`:仅当 `message_end` / `turn_end` / `assistant_message` 明确携带非空终止原因时由序列化层提升,不伪造默认值,也不回流 `stopReason` 诊断。
14
94
  - `backendTest` 布局配置纳入 Task Contract managed 注入面:`task advance` 新增 `--backend-test <json>`,可在公共任务生命周期内把 `testRoot`/`markdownRel`/`scriptRel`/`sharedSetupDoc`/`mode`/`gapDoc`/`executeScope` 写进 `task.json`,不再需要手工编辑(手工编辑会让任务漂移成 `externally-modified` 并拒绝 `--approve-gate`)。给出即整体替换、省略即保留既有配置(历史手写配置因此自愈)、`'{}'` 为显式清空回默认布局;重复 advance 幂等,契约保持 `managed`。`task contract diff` 把值变更标 routine `BACKEND_TEST_CONFIG_CHANGED`、丢键/清空额外标 elevated `BACKEND_TEST_CONFIG_WEAKENED`。
15
95
  - Operator Chat 文件预览抽屉新增图标「新窗口打开」:用当前已加载内容在独立浏览器窗口打开全页阅读视图,窗口内可切换「预览 / 查看原文」(带宽高的 `window.open` popup,Markdown 排版、HTML 铺满视口的空 sandbox iframe、JSON pretty-print / 其它文本等宽滚动);打开成功后断开 `opener` 且不立刻 revoke Blob,避免空白页;弹窗被拦截时 header 附近报错且不关闭抽屉
@@ -21,7 +101,7 @@
21
101
  - `design-review` / `final-design-review` 提示改为消费契约 JSON(注入契约字段摘要),不再要求读取 plan prose
22
102
  - Console「模型与认证」页新增模型矩阵编辑器:展示并允许编辑 `harness.json executors.pi` 的 LOW/MED/HIGH 三档模型;输入框从 readiness 结构化投影 `piModelMatrix` 预填(provider/model 或裸 model id),本地内联校验(空串 / `default` 哨兵 / 畸形 `provider/`、`/model`、`a//b`)非法时禁用保存;保存经既有 `POST /api/operator/v1/operations` 派发 `savePiModelMatrix`,复用 HTTP 层 `evaluateMutationGate`(boot capability cookie + `x-loop-console-confirmation` 头 + Origin/Host/Sec-Fetch-Site),读全文档后原子写 tmp+fsync+rename(保留 `$schema` 与其余字段),成功后自动重测 readiness 并对活动 Chat session 触发 `/sessions/:id/reload`(409 `PI_SESSION_BUSY` 给出可恢复提示)
23
103
  - `GET /api/operator/v1/readiness` 的 probe 新增 `piModelMatrix` 结构化投影(向后兼容,不改动既有 `modelsMessage`)
24
- - 组件选型规范合规(ADR 0016):契约 schema 新增可选 `uiComponentChoices[]`(`{ purpose, component, decision(specified|reuse-existing|new), specReference{path,section,line}|null, rationale }`),`specified` 必须给非空 `specReference`、`new` 不得携带、空串拒绝;`schemaVersion` 保持 1;`docs/templates/frontend-implementation-contract.schema.json` 同步
104
+ - 组件选型规范合规(ADR 0016):契约 schema 新增可选 `uiComponentChoices[]`(`{ purpose, component, decision(specified|reuse-existing|new), specReference{path,section,line}|null, rationale }`);`specified` 必须给 OpenSpec `specReference`,任务源要求新增的 `new` 必须给 PRD `specReference`,空串拒绝;`schemaVersion` 保持 1;`docs/templates/frontend-implementation-contract.schema.json` 同步
25
105
  - `frontend-prewrite-gate` 新增三个 `retryable-invalid` failureCode:`component-spec-reference-invalid`(specReference.path 非受支持规范路径)、`component-spec-not-cited`(未在 openspec-citations 引用块引用或未真实读取)、`component-choices-missing`(组件/主题候选桶非空且契约有 UI 可见工作而 `uiComponentChoices` 缺失/空)
26
106
  - gate 配置新增可选 `componentSpecCandidatePaths`(旧 DAG 缺字段兼容);`init-hybrid` 从 `designEvidence.classified.component ∪ theme ∪ rule.components` 冻结注入,capability context 强调组件/主题桶语义,plan/revision/design-review/final-design-review 提示加入硬规则与 BAD/GOOD 示例
27
107
  - `frontend-plan.md` 新增 `Component Selection (spec conformance)` 章节(纯函数确定性渲染,缺省 `_(not specified)_`)
@@ -31,8 +111,25 @@
31
111
  - `src/shared/openspec-spec.ts` 新增 `extractTaskSourceOpenspecPaths` 纯函数(反引号内联、markdown 链接目标、裸路径 token → 归一化 → spec 过滤 → 治理子树排除 → 去重排序)
32
112
  - 生成期把 `openspecPolicy` 与候选来源元数据(`openspecCandidateSources.declared` / `taskSourceCited` / `scanStrict`)冻结进 prewrite gate 配置;`task advance` 的 advisories 说明当前模式与候选来源
33
113
 
34
- ### 改进
35
-
114
+ - 右侧辅助栏统一承载文件、上下文、调用记录、运行活动和当前 DAG;点击消息流中的运行状态即可在同一侧栏查看运行、门禁与产物,并可自由调整侧栏宽度。
115
+ - 新增任务清单与结构化提问卡片,让长任务的进度和需要用户选择的内容更容易理解。
116
+ - 「对话 / 操作 / 观测」使用统一导航;操作和观测页面可以切换工作区查看对应数据。
117
+
118
+ ### 改进
119
+
120
+ - Windows 上读取运行中的 DAG `state.json` / `run.json` / `interrupt.json` 时,对原子替换窗口内的短暂文件占用与半成品 JSON 做有界重试;Console 协作中止不再因杀毒软件或文件系统竞争偶发误报输入非法。I/O preflight 测试同步采用与该资源分组一致的 60 秒上限,避免进程启动压力造成假失败。
121
+ - 检查器「提示词重启」只读态的提示词卡片会撑满剩余高度并在卡片内滚动,不再在面板底部留下大块空白;失败节点的可编辑布局不变。
122
+ - DAG 节点表「备注」改为节点用途简介(是什么、做什么、目的),不再重复节点 ID;失败节点仍显示错误摘要。检查器标题与图节点悬浮提示同步展示同一句说明。
123
+ - 实验「提示词重启」会为 Pi 节点的每次失败 attempt 保存独立、脱敏且 64 KiB 有界的提示词候选;Inspector 始终展示提示词版本选择框,新 run 会列出冻结原始提示词与全部失败尝试(含自动重试产生的恢复提示词),历史 run 未保存候选时明确说明,成功尝试不混入。提示词卡片右上角提供复制图标并以勾选图标反馈成功;已截断候选复制时明确标记为截断预览,并保持只读、禁止直接提交,避免用不完整提示词发起续跑。选择失败候选会载入「全文替换」编辑器;即使节点后续自动重试成功,历史失败候选仍可只读切换查看。
124
+ - DAG 节点检查器「执行过程」按执行器分流:Pi 仍看 session-events;有命令的 shell 展示 `shell-command-receipt` 与 stdout/stderr;`frontendBrowserToolPreflight` 等内部处理器展示步骤回执(历史 run 可从 capability / attempt 产物合成)。空态不再把 shell/static 误说成「暂无过程日志」。节点输入补充 named handler 名称。脚本仍属于节点输入,不假装已执行。
125
+ - DAG 节点检查器「节点输出」在整段内容为完整 JSON 对象或数组时改为缩进代码块展示,不再把紧凑 `JSON.stringify` 挤成一段 Markdown 段落;截断或非法 JSON、普通 Markdown 仍走原阅读器。
126
+ - frontend DAG 的 materialized source references 恢复统一的有界 excerpt 与按需 read 指针,不再把 requirement/acceptance 文档全文复制进每个相关节点,也不再强制 contract/plan 重读全部绑定源文件,降低长需求在多节点中的重复上下文占用。
127
+ - frontend-test prepare-package 会从 `docs/templates/`、`harness.json` `governanceRoot`/templates 以及 init 投影的 `ai_workspace/loop-agent/templates/` 拷贝标准场景;full init 目标仓不再静默落到仅含 `STD-FE-SMOKE-ENTRY` 的 fallback。
128
+ - frontend-test 环境探测区分 connection-refused(curl 7)与 HTTP 4xx/5xx,并提示先启动本地前端后再从 probe 节点续跑;不再把所有不可达都写成同一句 `frontend-base-url-unreachable`。
129
+ - frontend-test 报告解析用例 Markdown 的 `##`/`###` 标题与有序列表(`测试步骤` / `预期结果` / `前置条件与重置`);缺 `测试目的` 时回退到用例 H1,避免主 HTML 出现空步骤。
130
+ - `dag rerun --from-node` 把尚未启动的 writer/map 视为首次执行;frontend-test probe 这种失败的 exclusive shell 可以带着下游未跑节点续跑,不必整图 `standaloneTaskRerun`。
131
+ - Pi SDK 节点在 stall watchdog(默认 15 分钟无 provider 活动)触发后,会先 abort 当前等待,并在同一会话自动发送一次「继续」;仅 abort 已确认且尚未调用 write 工具时恢复,失败仍判 timeout。绝对墙钟超时与 CLI 后端不走这条恢复。
132
+ - DAG 节点检查器「执行过程」时间线默认隐藏原始协议事件(`message_start` / `message_end`),按钮文案为「展开原始协议事件」;用户可点选展开,同会话内选择会保持。
36
133
  - Operator Chat 的乐观停止现在把“视觉已停止”和 Turn ownership 分开:Abort 获得可靠终态前明确显示“正在停止”,此时可为原会话保存一条服务端持久化的“停止后发送”消息;后一次覆盖前一次,切换会话、刷新页面或 Console 重启不会丢失,旧 Turn 结束后复用正常 Turn 准入路径自动发送,并以固定 `clientRequestId` 防止重复执行。
37
134
  - Operator Chat 修复快速终止时“停止后发送”与普通发送之间的准入空洞:发送路径改读实时 ownership;若 deferred 请求恰好撞上旧 Turn 终态,会先按服务端状态对账,再使用同一 `clientRequestId` 自动转为普通发送,不再要求用户刷新重试或丢失本次提交。
38
135
  - `dag rerun-task` 现在会把父 run 最后一轮仍未解决的 `verify-pi` / review 反馈、证据引用和修订轮次带入新完整 DAG;planner、implementer 与 verifier/reviewer 必须修复或举证说明不再适用,不能仅因文件已存在就返回 `already-satisfied`。Console 同步区分「自动修订」「从失败节点恢复」「带反馈重新执行任务」。
@@ -51,132 +148,311 @@
51
148
  - 侧栏文件树实时刷新:agent 回合结束、浏览器标签页回到前台、手动点「刷新」时重拉根目录+全部已展开目录(此前手动刷新只拉根目录,子目录永远旧缓存)。
52
149
  - Skills / Packages / Models 面板不再把 Pi 的 warning / collision 原文堆在列表上方:改成标题条一颗摘要芯片(如「14 条提示」),点开按「需要处理 / 名称不规范 / 同名未生效」分组,文案用自然语言,路径只显示末两段;名称不规范的技能在列表旁标「提示」,详情里说明「现在这样也能用」。加载失败仍单独成组,可点「再读一次」。
53
150
  - Skills / Packages 双栏改为左右各自滚动;资源弹窗挂到 `document.body`,按顶部对话导航的实时高度在剩余视口居中,不再被 sticky 顶栏挡住上沿。
151
+ - 标准、评审和监督型 DAG 现在会在当前运行中重试短暂的验证故障;写入节点只有在确认工作区完全未变更时才会重试,避免因网络波动重新执行整条任务。
152
+ - 后端测试支持自定义目录、公共前置说明、查询场景分区和增量补缺模式;相关布局可通过 `task advance --backend-test` 纳入受管任务契约,不再需要手工修改 `task.json`。
153
+
154
+ - 裸 `agent-worker console` 在 listen 前会按本机自然日询问一次 npm `latest` 升级;继承当前 npm registry,失败不阻断启动,Console URL 仍只写 stdout。
155
+ - npm `next` 发布成功后会更新 `npm-next` 分支锚点;可用 `loop-agent inspect next` 查看已发布版本、源码提交、构建时间和本地尚未发布的提交。
156
+ - Operator Chat 的文件预览可在新窗口中打开,并可切换排版预览与原始内容;弹窗被浏览器拦截时会保留当前抽屉并给出提示。
157
+ - Pi SDK 的会话事件可透出模型明确返回的结束原因,便于诊断截断、停止和异常结束。
158
+
159
+ - 初始化模型配置新增 Pi/OpenCode 脱敏目录:代码只暴露白名单模型元数据和凭据就绪状态,执行初始化的模型结合目标项目自主选择并直接写入 LOW/MED/HIGH;只有实质歧义才询问用户。
160
+ - npm `next` 自动发布改为每累计 5 个提交触发一次,减少无意义构建;手动发布仍可随时执行。
161
+ - `dag rerun-task` 会继承上一轮尚未解决的验证和评审反馈,避免新一轮忽略旧问题或误判为已经完成。
162
+ - DAG 恢复入口会根据失败类型区分“从节点继续”和“完整重跑”,并避免把失败节点改写成成功状态。
163
+ - Operator Chat 停止会话时会显示真实进度;用户可预先提交一条“停止后发送”的消息,刷新页面或重启 Console 也不会丢失。
164
+ - Operator Chat 的命令说明和参数提示与实际能力保持一致,减少选错恢复入口或误用占位参数。
165
+ - 测试套件按 CPU、内存、平台和当前 DAG 压力动态分配资源,并减少重复启动进程,完整验证耗时更稳定。
166
+
167
+ - 后端测试的计划与生成阶段只读取任务明确绑定的需求、环境报告和本轮产物,减少无关仓库内容干扰结果,并让后续步骤继续使用同一份已确认计划。
168
+ - Operator Chat 的任务清单工具描述补齐多步骤与 DAG 使用纪律:开始前按具体步骤规划、保持进行中约束、完成后立即更新完整列表,并用面向用户的阶段呈现 DAG 进度,简单任务自动跳过。
169
+ - 正式发布会自动同步更新版本日志和文档站摘要;发布说明优先生成简洁自然的中文,生成服务不可用时也能安全完成发布。
170
+ - 输入框整合模型与推理等级选择,并只展示有真实数据的轮次、耗时、速度和缓存统计。
171
+ - 工作区、会话列表、文件标签和侧栏交互更加紧凑自然,折叠、切换和页面过渡更加流畅。
172
+ - 设置页改用自然中文展示当前工作区的模型状态,减少内部状态和重复信息。
173
+ - DAG 检查器简化节点说明、执行记录和提示词重启面板,长内容更容易阅读和定位。
174
+
175
+ ### 修复
176
+
177
+ - backend-test 用例覆盖分析的 payload 形状提取在无 `python` 可执行文件的环境(现代 macOS 只有 `python3`)静默降级为空结果,导致 payload 观测路径全空、`PAYLOAD_SHAPE_MISMATCH` 误报;解释器解析改为 POSIX 优先 `python3`、Windows 优先 `python`(与 scenario-param 语法校验一致),仅在解释器缺失时尝试下一候选,分析输入自身的失败不再重试。
178
+ - Inspector「执行过程」时间轴按「执行分次」选择过滤:session-events 是跨 attempt 共享追加的单文件,此前所有次执行的事件重合显示、切换顶部分次不生效;现在按 `agent_start` 边界分段,选中第 N 次执行只显示该段并标注「已按第 N 次执行过滤 · 共 M 次执行」,单次执行与 pass 选择保持全量展示,检测不到边界时显式提示并回退全量。
179
+ - 前端 plan/revision 的 `openspec-citations` fence 提取改为行锚定正则:直接闭合的空 fence(无候选行、紧跟关闭 fence)此前被判定为「不存在 citation 块」而进入格式重试循环,现在计为合法的唯一 citation 块;重复、损坏或非唯一的 fence 仍被拒绝。
180
+ - `npm test` 前置段失败导致后续段(io-heavy / integration)被跳过时,`scripts/run-tests.mjs` 显式输出警告与补跑命令,不再静默跳过(此前失败汇总会被误读为全量覆盖)。
181
+ - npm 包现在会包含 `inspect next` 运行时依赖的查询脚本,安装后的 CLI 不再因缺少包内文件而无法启动。
182
+ - 初始化更新改为一次扫描与规划:固定投影按 recorded ownership 确定性增删改,多个语义合并按单文件写边界串行排队,全部完成后只做一次最终验证;已完成的 `--status` / `--report` 只读取哈希锚定证据,不再重复运行项目脚本。`harness.json` 按属性结构演进并保留项目值,仍存在于 Pi 的 LOW/MED/HIGH 保持不变,只重选失效档位;fresh init、update 与 doctor 会在 Pi 无可用模型时提前阻断。
183
+ - CLI 新版本检查与 `init upgrade` 的版本门禁会从调用开始就使用 npm 当前配置:目标项目 `.npmrc`、用户级/全局 `npm config set registry`、环境变量与 scoped registry 均继续由 npm 按原生优先级解析;企业镜像失败时不会偷偷回退官方源,并以脱敏原因区分超时、npm 启动失败、查询失败和无效响应。
184
+ - 同一浏览器、同一 hostname、不同端口的多个 Operator Console 不再争用认证 Cookie;不同项目和同一项目的多个 Console 可以并行对话,往返页面无需刷新。Console 重启后旧页面仍会被安全拒绝,刷新后恢复。
185
+ - Markdown 表格只处理横向溢出,鼠标停在表格上时仍可正常上下滚动对话。
186
+ - Windows 上执行后端测试场景参数的 Python 语法检查时,会跳过不可用的 Microsoft Store 占位程序,避免错误回滚合法改动。
187
+ - 旧版前端 DAG 也能识别增量计划修订,不再因契约格式差异反复重试;无法合并的修订会提示重新生成 DAG。
188
+
189
+ - 修复重命名会话时输入框没有回显当前标题的问题。
190
+ - 修复停止回复后输入区恢复迟缓、排队消息偶发丢失,以及切换会话后旧状态残留的问题。
191
+ - 修复宽表格、文件预览、滚动条和窄屏布局中的多处显示异常。
192
+ - 修复部分 Windows 环境读取运行状态时的偶发失败,并提高前后端任务验证的可靠性。
193
+
194
+ ### 文档
195
+
196
+ - 整理 `0.36.0` 以来的更新日志,改为面向用户描述结果,并补齐 `0.38.0`、`0.38.1` 的正式发布记录。
197
+ - 新增检查以阻止纯英文条目、重复版本、版本倒序和非标准 `Unreleased` 标题。
198
+
199
+ ## [0.39.1] - 2026-08-25
200
+
201
+ ### 重点更新
202
+
203
+ - 前端实现流程会逐项核对原始需求与验收标准,减少长需求被遗漏、误解或静默排除的情况。
204
+ - Console 新增可选择稳定版或预发布版的更新入口,更新前会检查正在运行的任务,完成后自动恢复当前页面。
205
+
206
+ ### 新增
207
+
208
+ - DAG 检查器可以查看失败节点的提示词版本,并在确认后从选定内容重新执行。
209
+ - 后端测试会核对本轮文件清单与实际引用关系,避免历史文件或错误依赖混入测试结果。
210
+
211
+ ### 改进
212
+
213
+ - 设置页移除重复的模型配置入口,模型管理继续集中在对话页。
214
+ - 关键治理文档完成复核,当前能力、限制和操作方式保持一致。
215
+
216
+ ## [0.39.0] - 2026-08-23
217
+
218
+ ### 重点更新
219
+
220
+ - Operator Chat 支持通过方向键找回历史输入,并可在当前回复进行时预先排队下一条消息。
221
+ - 任务向导新增实时进度、当前节点、运行时长和失败摘要,长时间任务更容易判断是否正常推进。
222
+
223
+ ### 新增
224
+
225
+ - 前端测试支持自定义测试目录和文件布局,适配不同项目结构。
226
+
227
+ ### 改进
228
+
229
+ - 运行结束后会自动降低刷新频率,并为失败状态提供更直接的处理建议。
230
+ - npm 预发布包会记录准确版本,安装后显示的版本与实际发布制品保持一致。
231
+
232
+ ## [0.38.4] - 2026-08-23
233
+
234
+ ### 重点更新
235
+
236
+ - 初始化与升级流程更好地支持企业 npm 镜像、已有模型配置和一次性安全更新。
237
+ - Console 与 DAG 检查器补充了运行状态、失败节点和提示词重启等诊断能力。
238
+
239
+ ### 新增
240
+
241
+ - 新增 `inspect next`,可以查看当前 npm 预发布版本对应的源码和本地尚未发布的变化。
242
+ - 前端测试可以从项目治理目录和初始化模板读取标准场景,并提供更完整的执行报告。
243
+
244
+ ### 修复
245
+
246
+ - 修复 npm 包缺少运行文件、macOS Python 命令差异、Windows 场景检查和部分滚动显示问题。
247
+ - 修复前端计划引用、失败恢复和测试回执在复杂项目中的多处误判。
248
+
249
+ ## [0.38.3] - 2026-08-22
250
+
251
+ ### 重点更新
252
+
253
+ - Operator Chat 的文件预览可以在新窗口打开,并能在排版预览与原始内容之间切换。
254
+ - 长时间模型任务遇到输出截断或暂时停滞时,恢复过程更加可靠。
255
+
256
+ ### 新增
257
+
258
+ - 安装 loop-agent 时会默认包含 Pi 运行能力,减少额外配置步骤。
259
+ - DAG 检查器可以查看不同执行器的运行过程和更清晰的节点输出。
260
+
261
+ ### 改进
262
+
263
+ - 后端测试增强了自定义目录、场景分区和生成文件的校验。
264
+ - 文件浏览、结束原因和前端计划恢复信息更容易查看和诊断。
265
+
266
+ ## [0.38.2] - 2026-08-20
267
+
268
+ ### 重点更新
269
+
270
+ - 后端测试支持自定义输出目录、公共前置说明、查询场景分区和增量补缺模式。
271
+ - Operator Chat 的停止与后续发送更加可靠,停止过程中提交的下一条消息不会因刷新或重启丢失。
272
+
273
+ ### 改进
274
+
275
+ - DAG 重新执行时会继承上一轮尚未解决的验证和评审反馈,减少重复失败。
276
+ - 恢复入口会根据失败原因选择从节点继续或完整重跑,并给出更明确的操作建议。
277
+ - npm 预发布改为按提交数量节流,减少没有必要的重复发布。
278
+
279
+ ## [0.38.1] - 2026-08-18
280
+
281
+ ### 重点更新
282
+
283
+ - 前端实现计划统一使用结构化契约,修订只提交必要变更;系统会核对 OpenSpec 引用和组件选型依据,减少格式漂移、遗漏规范和无效返工。
284
+ - Operator Chat 增强了模型配置、MCP 工具、文件浏览和运行状态展示,常用操作更集中,长时间对话也更容易掌握上下文。
285
+
286
+ ### 新增
287
+
288
+ - Console「模型与认证」页支持查看和编辑 LOW、MED、HIGH 三档 Pi 模型;保存前会校验配置,保存后自动刷新模型状态和空闲会话。
289
+ - Operator Chat 支持扩展提供的 MCP 工具;侧栏可查看已配置服务和当前会话实际可用的工具。
290
+ - 文件预览改为侧边抽屉,可在排版预览和原始内容之间切换,不会打断当前对话。
291
+ - 前端计划会记录实施步骤、样式策略、依赖选择、剩余风险和真实集成缺口,并在写入前检查组件选型依据。
292
+
293
+ ### 改进
294
+
295
+ - 点击“停止”后对话会立即安静下来,并通过服务端状态对账确认最终结果,不再长时间停留在忙碌状态。
296
+ - 对话底部持续显示上下文占用;历史工具调用按所属回合展示,不再错误挂到下一条消息下。
297
+ - 文件树会在回合结束、页面回到前台或手动刷新时更新已展开目录,并支持直接引用整个目录。
298
+ - Skills、Plugins 和 Models 的提示改为分类摘要,列表支持独立滚动,弹窗不会再被顶部导航遮挡。
299
+ - Operator Chat 的恢复工具名称、参数和使用建议与实际能力保持一致,降低误选恢复方式的概率。
300
+ - 前端结构化输出过长或格式不完整时会有针对性地重试,减少因输出截断导致的整轮失败。
54
301
 
55
302
  ### 修复
56
303
 
57
- - 前端实现 DAG 的 plan/revision 改为 artifact-first:成功节点以 SHA-256 绑定的 canonical contract 或 merge-patch artifact 供 prewrite 与评审消费,citation/raw 仅保留引用;prewrite 对新记录先校验节点状态、schema、run 内路径和哈希,失败不再回退解析模型 prose。plan/revision 输出限制为 14 KiB、canonical contract 限制为 16 KiB,citation JSON 与主契约隔离解析;下游不再内联或截断完整契约,provider `stopReason=length` 改用紧凑恢复提示。
304
+ - 前端设计评审拓扑改串行:`frontend-design-review-pi` 依赖从 `frontend-plan-pi` 改为 `frontend-design-policy-shell`——确定性 policy 先物化 canonical 契约并判定(秒级,blocked 立即终止不浪费模型调用),模型 review 再基于物化契约评审(prompt 本就要求 canonical full-contract JSON 输入);避免 policy 失败时 review 白跑、以及 review 读到未物化的 plan 中间态。
305
+ - `design-evidence-conflict` 不再由 policy 阻断:`designEvidence.conflicts` 是模型如实披露的设计偏差(如任务要求的测试形态与冻结约束冲突),是否可接受应交由 design-review 的 `approve_design`/`request_design_changes` 裁决(`checkDesignApproval` 单独强制);policy 一刀切阻断会让如实上报偏差的诚实 plan 永远无法通过、且模型无法"修复"它正确识别的冲突。
306
+ - write guard 豁免 vite/vitest 运行时缓存:前端 writer 在执行验证(vitest)时写 `node_modules/.vite/vitest/results.json`(gitignored 工具缓存),不在 writeSet 内导致 write guard 误判越界(真实 DAG 冒烟暴露)。`isEphemeralToolCachePath` 增加 `node_modules/.vite/` 豁免;产品文件越界仍 fail-closed。
307
+ - 前端 writer-admission 的 worktree baseline 改为收集完整 workspace 清单:`captureFrontendWorktreeBaseline` 原用 `git status --porcelain`(只有变更文件),干净 git 仓库下 baseline 为空 → 必然 `baseline-empty` 卡死 writer-admission(真实 DAG 冒烟暴露)。改为 `git ls-files -co --exclude-standard`(全部被跟踪 + 未跟踪文件,排除 gitignored),作为 writer 修改对照的确定性快照;下游 freezeBaseline/admission digest 语义不变。
308
+ - 前端 writer-admission 的 writeSet 派生支持 glob 展开:契约 schema 允许 `targets.files` 含 glob(如 skeleton 从任务 allowedPaths 继承的 `src/**`),但 `deriveWriteSet` 只接受具体路径导致带 glob 的任务必在 writer-admission 卡死 `write-set-path-not-concrete`(真实 DAG 冒烟暴露)。新增 `expandFrontendGlobPaths`(git ls-files 枚举 workspace 文件 + glob 匹配展开),`deriveFrontendWriterAdmissionShell` 接收 `workspaceFiles` 后把 glob 展开为可写的具体文件;无文件清单(非 git 仓库)时 glob 仍 fail-closed。shell-executor 在调用处注入 `collectWorkspaceFiles`(git ls-files -co --exclude-standard)。
309
+ - 前端 policy 依赖授权与状态归属检查对齐计划语义(真实 DAG 冒烟暴露):`allowedDependencies` 不再硬编码空数组,`init-hybrid` 从目标项目 package.json 收集 dependencies+devDependencies 冻结进 run.json,plan 前置检查与 policy shell 用同一非空允许集;`checkDependencies` 对「零新增/不引入」等明确否定声明豁免 prose 分词(不再把「仅使用已声明的 react、vitest@2 工具链」里的词误报为未授权依赖),未声明的新依赖仍 fail-closed 拒绝,空允许集(manifest 不可读)跳过检查而非误报;`checkUiStateAttribution` 改为校验契约**已声明**状态的归属完整(applicable→expectedBehavior、non-applicable→notApplicableReason),不再强制 loading/empty/error/disabled 固定四名必须全部出现(模型无法在不 invent 状态的前提下补出不存在的状态,重试无法修复);plan prompt 补充 dependencyPolicy 声明格式指令。
310
+ - 前端 policy 前移的 canonical 状态归属检查修正:`checkUiStateAttribution` 不再无条件强制 loading/empty/error/disabled 四态全部存在——schema 与 prompt 明确允许纯逻辑修改 `uiStates: []`(不得 invent UI 状态),纯逻辑契约(无 uiStates 且无 interactions)豁免该检查,否则合法 plan 会在 policy 整链终止、且 plan 节点重试也无法修复(模型被禁止虚构状态);一旦契约声明任何 UI 可见工作(状态或交互),四态归属要求完整生效。
311
+ - 前端契约 required-with-fallback 字段(`designEvidence`)补齐收敛到唯一共享层 `completeCanonicalRequiredFields`:strict-shape 与 free-form 分支不再各自补齐(分支规则漂移曾同时造成 `designEvidence.source Required` 与 verification target 虚构 `["success","error"]` UI state 两类失败);verification target 未声明 UI 绑定时保持 `uiStates: []`,不再默认「成功/失败」态;`commandLabel` 缺失时不再 fallback 到 `npm run typecheck` / `npm run test:unit:fe`,留空交由冻结命令集 fail-closed 拒绝;plan prompt 增加 attribution 硬前置检查(interaction/uiState 必须被 `uiComponentChoices` 覆盖,缺失以 retryable 诊断失败)。同步 `docs/runtime/frontend-implementation-workflow.md` 的 `submit_plan_ledger` 旧协议残留为增量 `record_*` + 唯一 `finalize_plan`。
312
+ - 前端 plan facts 质量问题消化在节点内有界重试:coerce strict 分支补全部分 designEvidence(record_design_deviation 只产 conflicts 时不再死于 Required);policy 中可归因到 plan facts 的三类检查(依赖授权 / 交互与 UI 状态归属)前移进 plan 节点验证,带诊断重试修复,design-policy shell 保留最终权威
313
+ - `frontend-plan-pi` 的 typed facts schema 违规(如 verification target 引用未声明 UI state)接入 §5.1 Plan retry 阶梯:`FRONTEND_PLAN_LADDER_RETRY_POLICY.retryCategories` 增加 `invalid-output`,首次失败不再直接 terminal,而是在 normal 档带 `<retry_instruction>`(具体 schema 违规 reason + 修复指引)有界重试;fingerprint 与 5 次上限防线不变。
314
+ - 前端 DAG shell 门禁改消费 committed typed facts 确定性组装 canonical contract 并 fail-closed:`frontend-design-policy-shell` 与 `frontend-prewrite-gate` 的 admission 分析路径不再从 Plan/Contract 节点文本提取 fenced JSON(`extractFrontendImplementationJson` / `analyzeFrontendImplementationContract({fromNodeId})` 文本路径退役),改由新增纯函数 `buildContractFromCommittedFacts` 用 committed `plan-typed-facts.jsonl` ⊕ 运行期 skeleton 组装,经既有 `analyzeFrontendImplementationContract({rawContractText})` 严格 schema 校验;committed facts 缺失、schema 漂移或 finalize 缺失时返回明确 blocked/invalid-output,不回退文本解析;`init-hybrid` 在 `frontend-plan-pi` 冻结 `structuredContractOutput.skeleton`,并在 `frontend-design-review-pi` prompt 增加硬约束:不得对冻结验证命令(typecheck/test/build/lint 等)执行结果做权威断言(命令结果由 `frontend-verify-shell` 确定性认定),验证可行性疑虑仅作非阻断 verification concern,纯「命令会失败」预测不得归类为 `contract-requirement-gap`。
58
315
  - Console 对话中的 Markdown 表格只约束横向滚动,不再截断纵向滚动链;鼠标或触控板停在表格上时仍可继续上下滚动对话。
59
316
  - scenario-param 确定性 rewrite 的 Python 语法校验:Windows 优先 `python`,并把 Microsoft Store `python3` 空壳(非 0 且无语法诊断)视为解释器不可用后回退,避免误回滚合法 rewrite。
60
317
  - `frontend-plan-revision-pi` 节点级校验与 merge-patch 输出协议矛盾修复:新增 schemaId `frontend-implementation-contract-revision-patch-v1` 与格式级宽松校验 `validateFrontendRevisionPatchNodeOutput`(至少一个 `openspec-citations` 块 + 剥离引用块后恰好一个 JSON 对象,不做完整契约 schema 校验),revision 节点 `structuredContractOutput.schemaId` 切换(plan-pi 仍为 v1);node-execution 的 invalid-output retry 指令按 schemaId 分支,patch 协议提示 merge-patch delta + 引用块,消除「prompt 要求 patch、retry 要求完整契约」的 retryable 死循环;gate 仍是唯一权威合并/校验点(零改动)。ADR 0015 补「节点级校验」决策 7
61
- - `frontend-implementation-contract.schema.json` 的 `uiComponentChoices` items 补 `if/then` 决策语义(`specified` ⇒ `specReference` 必填非 null;`new` ⇒ `specReference` 为 null/缺失);`frontend-plan-render.ts` 空 `section` 不再渲染尾随 `#`;ADR 0016 增补「门禁边界」小节
318
+ - `frontend-implementation-contract.schema.json` 的 `uiComponentChoices` items 补 `if/then` 决策语义(`specified` ⇒ OpenSpec `specReference` 必填非 null;任务源要求新增的 `new` ⇒ PRD `specReference` 必填非 null);`frontend-plan-render.ts` 空 `section` 不再渲染尾随 `#`;ADR 0016 增补「门禁边界」小节
62
319
  - 前端 gate 内容驱动 revisionPatch 兼容 + verdict 归一化统一:旧 DAG(缺 `revisionPatch` 字段)但 revision 节点按协议输出 merge-patch 时,gate 按内容判定自动合并原始契约并走既有校验(不再因 `missing targets.files` 进入 retryable 死循环);patch 形态但无法合并(fallback 缺失/自身、原始节点不可读或非完整契约、apply 失败)→ `blocked` + 新增 `revision-patch-unmergeable`(错误信息含重新生成 DAG 指引);`normalizeVerdictCandidateLine` 增强 backtick 强调剥离,gate 的 `firstNonEmptyVerdictLine` 复用共享 normalize,runIf / output-protocol / gate 三处一致
63
320
 
64
- ### 文档
321
+ - 前端计划修订能正确识别增量补丁,不再因“提交完整契约”和“只提交变更”两套要求冲突而循环失败。
322
+ - OpenSpec 引用必须来自真实读取记录;缺失、移动或未引用的规范会在写入前给出明确提示。
323
+ - 初始化升级和并发写入不再把构建产物或临时文件误判为越界修改。
324
+ - Console 的授权失效、模型配置错误和资源诊断会显示可操作的中文提示,不再直接暴露内部错误。
325
+
326
+ ## [0.38.0] - 2026-08-17
65
327
 
66
- - 新增 `docs/decisions/0016-frontend-component-conformance.md`,并同步 `docs/runtime/frontend-implementation-workflow.md`、`docs/templates/frontend-implementation-contract.schema.json`、`skills/frontend-implementation/references/design-spec.md`、`skills/frontend-implementation/references/node-contracts.md`、`skills/frontend-design-review/references/review-checklist.md`、`CONTEXT.md`
67
- - 新增 `docs/decisions/0015-frontend-plan-json-only-contract.md`,并同步 `docs/runtime/frontend-implementation-workflow.md`、`docs/templates/frontend-implementation-contract.schema.json`、`skills/frontend-implementation/references/node-contracts.md`
68
- - 新增 `docs/decisions/0014-openspec-gate-claim-verification.md`,并同步 `docs/runtime/frontend-implementation-workflow.md`、`docs/templates/frontend-task-constraints.md`、`docs/templates/frontend-design-contract.md`、`skills/frontend-implementation/references/node-contracts.md`
328
+ ### 重点更新
329
+
330
+ - npm 发布改为 `next`、版本发布线和人工 `latest` 三个渠道,开发版本不再自动覆盖稳定版本。
331
+
332
+ ### 新增
333
+
334
+ - 主分支持续发布 npm `next`;发布分支维护对应版本线;`latest` 仅通过人工操作提升。
335
+ - 新增双周发布列车,可从指定 `next` 的源码提交创建发布分支,并绑定最终 tarball 与源码提交。
336
+
337
+ ### 改进
338
+
339
+ - 发布策略会同时校验分支、版本和目标渠道,不符合矩阵的发布会直接拒绝。
340
+ - 发布中断后可从已有分支、版本或标签继续,恢复时会核对预期源码提交,避免发布错误制品。
69
341
 
70
342
  ## [0.37.1-beta.0] - 2026-08-16
71
343
 
72
344
  ### 重点更新
73
345
 
74
- - backend-test live campaign R115–R141 收口:全新 R141 达到 readiness PASS、23/23 correspondence exact、146/146 Test Points、77/77 scenario MATCH、traceability PASS,并唯一执行 82 个真实 API pytest body
75
- - 强化 backend-test correspondence、scenario-param、Markdown/pytest writer、collection repair、日志审计和 Windows pytest argfile 执行链,稳定区分 controller TestBug、generated TestBug 与真实 API ProductBug
346
+ - 后端测试流程完成一轮真实项目验证:覆盖 146 个测试点和 77 个场景组合,并执行 82 个真实 API 测试,需求、用例与执行结果能够完整对应。
76
347
 
77
348
  ### 改进
78
349
 
79
- - backend-test correspondence 只分析目标请求实际绑定的 body/payload,忽略 `scenario` 元数据与 setup-only payload;对 `scenario["body"]` 保留字段 shape,并把 intentional invalid enum 交由 scenario-param 门禁判断;同时识别下划线前缀 pytest 参数集合与带说明的 `Payload Contract: none(…)`,避免零 eligible 的 payload/parameter 误阻断
80
- - backend-test correspondence 继续解析模块内 transport wrapper 的位置 payload 与 wrapper 构造 body,并清理 `Payload Enum` 值后的中文说明,避免 PUT/lifecycle 合法载荷误报;Markdown/pytest writer 同步禁止臆测响应 ID 类型,并在路径 ID 类型未声明时使用 create-delete 派生的合法 missing ID,避免把测试资产缺陷误分类为产品 400/404 缺陷
81
- - backend-test correspondence 可还原 `_apply_patch(_base_body(...), patch)` 等 transport-body 组合表达式,并把 setup wrapper payload 限定为有 body 契约时的 fallback;traceability 接受经递归脱敏和有界输出的结构化 request/response 日志,scenario-param 支持带显式例值的 string wrong-type;pytest writer/repair 同步禁止把 path/query/control `id` 混入 DTO patch
82
- - backend-test correspondence 识别模块级 `_post_case`/`_put_case` 参数工厂、factory TP 字面量与通过 `payload["field"] = value` 构造的 DTO shape,并避免空列表全局变量吞并后续参数集合;writer/repair 要求每个变体展开为直接 `pytest.param(..., id="TP-...")`,scenario readiness 不再依赖隐藏的动态参数行;traceability 允许窄 `urllib.error.URLError`/`httpx.RequestError` DELETE cleanup
83
- - backend-test correspondence 继续还原 `payload = _base_note_payload()` 形式的 builder-return dataflow,并把 intentional invalid enum 交给 scenario-param 而非 Case 聚合 payload gate;Markdown review 明确 GET/DELETE setup DTO 不得改写目标 no-body contract,pytest writer/repair 禁止把返回 scalar 的 helper 当 tuple 解包
84
- - backend-test collection repair 把 upstream 的 `Repair paths: testcase/...` 直接视为完整权威路径证据并读取/编辑该文件;禁止猜测根级 `contracts/**` 或 DAG run 目录,也禁止 read tool 已成功返回文件后反事实声称路径不存在并提前 blocked
85
- - backend-test 的 REPAIRABLE collection repair 现在强制 non-empty diff,禁止 `already-satisfied` 制造假修复;Markdown review 增加 `### 测试点` 与三类 binding union 的 exact-set 校验并删除 legacy alias;no-body Case 的 payload correspondence 忽略同一 journey 的 direct setup POST/PUT DTO
86
- - backend-test generated-local collection repair 从 HIGH 路由降为 MED,在保留 write guard 与 requireChangedFiles 的同时避开连续多轮 grok repair hallucinated blocked/changed-without-write,改由稳定 writer 路由执行有界单文件修复
87
- - writer outcome 协议确定性归一化显式中文 `实现结果:已变更|已满足|已阻塞` 到 canonical `IMPLEMENTATION_OUTCOME`,仍拒绝无标签 prose、未知值和冲突值,不根据 diff 猜测语义
88
- - scenario-param 识别 `"x" * _TITLE_MAX_LENGTH` 等长度表达式与 helper 常量名相乘形式
89
- - correspondence 忽略 pytest payload 中的 `expect`/`echo_*` 辅助键,避免把 DTO 外 helper 字段误判为 PAYLOAD_SHAPE_MISMATCH
90
- - scenario-param 解析 `bound=LEN100` 机器行、解引用 `_STATUS_ACTIVE` 等 Python 字符串常量,并把 `NOMINAL` 长度样本从 min/max 纠正为 nominal
350
+ - 请求体分析可识别常见包装函数、数据构造器、补丁合并和参数工厂,减少把测试准备数据误判为接口请求的问题。
351
+ - 场景参数校验增强了缺失值、空白、边界长度、非法枚举和辅助常量的识别,降低合法用例被误报的概率。
352
+ - 生成的 Markdown 和 pytest 用例必须使用明确且唯一的测试点编号,并避免猜测接口未声明的 ID 类型或响应结构。
353
+ - 修复流程会直接使用上游提供的测试文件路径,并要求产生真实改动,避免找错文件或“未修改却声称已修复”。
354
+ - 请求与响应日志支持有界脱敏记录,清理阶段可处理常见网络异常,排查失败原因更加可靠。
355
+ - 测试结果能够更稳定地区分控制器问题、生成用例问题和真实产品缺陷。
91
356
 
92
- - scenario-param 观测识别 `_OMIT`/omit sentinel 为合法 `missing`,跳过 `"2xx"`/`"400"` 期望码位置参数,解码 Python `\t`/`\n` 空白字面量,识别 `_TITLE_LEN1` 等长度 helper 名,支持 `custom-literal:whitespace-only|whitespace-padded` 语义标签,`enum-invalid` 接受具体非法字面量,并在 `min`/`LEN1` 意图下优先读取 TP 编码长度与 `minLength` 边界
93
- - scenario-param 兼容 `empty` 意图下的 omit/`missing-key`,规范化 `custom-literal` 外包引号与可见空白符,并把 `max+1`/`min`/`max` 的裸数字位置参数按长度 token 比较(含 oversized 数字本身);`custom-literal:trim` 视为 padded whitespace 语义标签
94
- - backend-test writer 合同明确:`enum-invalid` 必须使用具体非法字面量且禁止 `_OMIT`/missing-key;`custom-literal:trim|ACTIVE|ARCHIVED` 必须使用真实 padded/enum 字面量,禁止 `filter-active` 类描述性伪值
95
- - scenario-param 识别 `_*_MAX_LENGTH` / `_*_OVER_LENGTH` 等长度 helper 名,明确 `custom-literal:trim` 不能是全空白,并把无 pytest.param 的 request-level/health nominal 记为 MATCH 以免污染 eligibility
357
+ ## [0.37.0] - 2026-08-16
96
358
 
97
- ## [0.36.4-beta.0] - 2026-08-16
359
+ ### 新增
98
360
 
99
- > 前端 DAG 规范上下文确定性落地(beta,发布到 `beta` dist-tag)。
361
+ - Operator Chat 支持 Markdown 语法高亮、数学公式和 Mermaid 图表。
362
+ - 新增 DAG 操作入口与产物栏,可从对话中查看运行、门禁和交付结果。
363
+ - 对话中可查看上下文压缩进度、上下文占用和语义缓存状态。
364
+ - 当前回合的思考、工具调用和过程事件会按实际发生顺序实时展示。
100
365
 
101
- ### 新增
366
+ ### 改进
102
367
 
103
- - `discoverFrontendProjectCapability` 产出 `designEvidence.classified` 语义归类:按通用目录约定(`openspec/schemas/**`、`openspec/project-specs/templates/**`、`openspec/project-specs/rules/**`、`openspec/project-specs/ui/**`、`ai_workspace/**`)把规范路径分入稳定键 `schemas` / `codeTemplate` / `rule.*` / `theme` / `component` / `uiOther` / `advisoryOther`,并进入 zod schema 校验(分区恒等式:归类值集合 == `normativePaths` 集合),重复探测稳定,不硬编码具体项目文件名
104
- - 前端 contract/scout/plan/design-review 节点的 `subtask_prompt` 注入归类后的规范路径(含角色语义)并明确要求报告适用规则、命中路径/章节/行号、冲突与缺失
368
+ - 重跑标题会显示运行轮次,运行中的会话和停止按钮具有明确的状态标记。
369
+ - 错误提示改为自动消失的悬浮消息,不再挤压聊天区域。
105
370
 
106
371
  ### 修复
107
372
 
108
- - `frontend-prewrite-gate` 在 `openspecCandidatePaths` 非空时强制生效 plan/review 节点实际读取候选路径:未读 → `retryable-invalid` + 新增 `openspec-not-read` failureCode,错误信息列出未读路径;空候选(greenfield)不阻断。此前读取证据仅记录不阻断(advisory),本次真正 fail-closed
109
- - OpenSpec 候选发现止血:默认排除治理子树(`harness.json.governanceRoot` → 缺省 `ai_workspace/loop-agent`),移除固定 `slice(0, 40)` 截断,`openspec/**` 排序优先于 `ai_workspace/**`,仅保留 ≥200 的显式安全上限(命中时写入 `DagSpec.advisories`,非静默丢弃);`openspec-not-read` 失败原因增加实际读取路径/候选总数/排除统计与「重新生成 DAG」归因,生成后已删除/改名的候选改为 `candidate-missing-drift` 诊断而非误报「未读」
373
+ - 长会话标题能够稳定显示完整悬浮提示,相关活动也能定位到对应 Operation。
374
+ - 非规范的 `newTask` 编号会立即返回修正建议;PRD 标题和投影引用的识别更加宽容。
375
+ - 中断能力通过 Worker 边界调用,减少运行时模块之间的耦合。
110
376
 
111
- ### 文档
377
+ ## [0.36.4-beta.0] - 2026-08-16
112
378
 
113
- - `docs/templates/frontend-task-constraints.md` 把裸 `TODO` 改写为「探索协议 + 结果 schema + 缺失/冲突 fail-closed」,不再出现具体业务组件名或项目专属路径/命令
114
- - `docs/templates/frontend-task-requirement.md` 与 `docs/templates/frontend-design-contract.md` 把裸 `TODO` 改写为「编写协议」三要素(要写什么 / DAG 如何消费 / 缺失/冲突时 fail-closed),并新增 `test/frontend-template-no-todo.test.ts` 扫描三个前端模板断言无裸 `TODO`
115
- - `docs/runtime/frontend-implementation-workflow.md` 的项目规范归类清单改为通用目录约定 + 归类规则,删除写死的示例项目文件名
379
+ > 前端任务读取项目规范的能力进入 beta。
116
380
 
117
- ## [0.36.3-beta.0] - 2026-08-16
381
+ ### 新增
118
382
 
119
- > 前端 DAG Mock 治理收紧(beta,发布到 `beta` dist-tag)。
383
+ - 前端 DAG 会按模板、规则、主题和组件等用途整理项目规范,并把相关内容提供给契约、探索、计划和设计评审阶段。
120
384
 
121
- ### 改进
385
+ ### 修复
122
386
 
123
- - 前端 DAG 的 Mock 策略约束注入设计评审链:`mockContextBlock`(含冻结 allowlist 的「HARD CONSTRAINT」与修复路径)现在也注入 `frontend-design-review-pi` / `frontend-plan-revision-pi` / `frontend-final-design-review-pi`,消除「design-review 按项目规范要求 native、但生成期 allowlist 冻结为 not-needed、prewrite 硬阻断」的策略断环——评审链会明确提示这是生成期契约缺口(需声明 `frontendMock.verifyCommands` 或 `policy: "required"` 后重新生成 DAG)
124
- - 前端任务生成期 Mock 预警:新增 `DagSpec.advisories`,任务源提到接口/API/Mock 但 auto 模式把策略收窄为 `not-needed` 时,`task advance` 的 `warnings` 会给出可操作提示(声明 `frontendMock.verifyCommands` 或 `policy: required` 后重新生成 DAG),把契约缺口提前到生成期暴露
387
+ - 有适用规范时,计划和评审必须真实读取并引用;缺失、移动或删除的规范会给出清晰诊断,而不再笼统提示“未读取”。
388
+ - 规范发现不再静默截断前 40 个文件,同时会排除 loop-agent 自身的治理目录,减少漏读和误读。
125
389
 
126
- ### 新增
390
+ ### 文档
127
391
 
128
- - 版本发布改为三渠道:main 自动发布 npm `next`(`x.y.0-next.N`)、release 分支自动发布正式 patch 到 `release-x.y`、`latest` 仅由人工 GitHub Actions promotion 移动(支持 dry-run 与 CAS 校验)
129
- - 新增 `next-release.yml` / `cut-release-line.yml` / `release-line-publish.yml` / `promote-npm-latest.yml`,删除旧每日自动 latest 发布入口
130
- - 发布策略改为 branch + version + channel 矩阵(`scripts/release-channel-policy.mjs`),fail closed
131
- - 双周 Release Train:可从选定 next 的精确 source SHA 创建版本化 release 分支,带幂等恢复与单 tarball SHA-256 绑定
392
+ - 前端任务模板改为可执行的探索与失败处理说明,移除裸露的 `TODO` 和项目专属示例路径。
132
393
 
133
- ## [0.37.0] - 2026-08-16
394
+ ## [0.36.3-beta.0] - 2026-08-16
395
+
396
+ > 前端 Mock 治理与新发布渠道进入 beta。
134
397
 
135
398
  ### 新增
136
399
 
137
- - markdown syntax highlight, math formulas and mermaid diagrams; operate entry lands on chat
138
- - label rerun titles with round number from -rN id suffix
139
- - enter-DAG action, artifact rail projection, zh changelog
140
- - surface compaction progress and timeline summary
141
- - floating auto-dismiss toasts replace in-flow error alerts
142
- - add running spinners to session titles and stop button
143
- - show context ratio, semantic cache icons, align process entry typography
144
- - show context usage and semantic cache labels in usage bar
145
- - stream live turn process in strict order
400
+ - npm 发布分为 `next`、版本发布线和人工 `latest` 三个渠道,避免开发版本自动覆盖稳定版。
401
+ - 新增双周发布列车,可从指定 `next` 的源码提交创建发布分支,并校验最终 tarball 与源码一致。
146
402
 
147
- ### 修复
403
+ ### 改进
148
404
 
149
- - isolate interrupt kernel behind worker adapter
150
- - constrain session title width so hover tooltip engages
151
- - backfill operation link for semantic activity refs
152
- - fail fast on non-canonical newTask ids with suggested fix
153
- - accept projected references and normalize PRD headings
405
+ - 前端设计评审会同时考虑任务声明的 Mock 策略和验证命令,避免评审通过后才被写入门禁阻断。
406
+ - 当任务提到 API 或 Mock、但契约缺少验证方式时,系统会在 DAG 生成阶段给出修复建议。
154
407
 
155
408
  ## [0.36.2] - 2026-08-16
156
409
 
157
410
  ### 修复
158
411
 
159
- - exempt changelog history from task-pool-root scan
160
- - exempt gitignore managed-block doc references in task-pool-root check
412
+ - 仓库治理检查不再把更新日志历史或 `.gitignore` 托管说明误认为非法任务池路径。
161
413
 
162
414
  ## [0.36.1] - 2026-08-16
163
415
 
164
416
  ### 新增
165
417
 
166
- - cooperative live DAG interrupt and recovery UX
418
+ - 支持协作式中断正在运行的 DAG:当前节点安全结束后停止后续调度,并提供后续恢复入口。
167
419
 
168
420
  ### 修复
169
421
 
170
- - move interrupt eligibility to observability to honor kernel import boundary
171
- - retry semantic intake across Pi tiers with 300s timeout
422
+ - 语义导入会在不同 Pi 模型档位之间重试,单次最长等待 300 秒,降低单一模型暂时不可用造成的阻塞。
423
+ - 中断资格判断移到可观测层,避免破坏运行时模块边界。
172
424
 
173
425
  ## [0.36.1-beta.0] - 2026-08-16
174
426
 
175
- > 标准 DAG planner 输出超长紧凑重试(beta,发布到 `beta` dist-tag)。
427
+ > 标准 DAG 的计划阶段支持超长输出恢复。
428
+
429
+ ### 改进
430
+
431
+ - 契约或计划输出过长时会自动重试为精简版本,只保留实施步骤、写入范围和验证命令等必要信息。
432
+
433
+ ## [0.36.0] - 2026-08-15
434
+
435
+ ### 重点更新
436
+
437
+ - Operator Chat 可以持续监督长时间运行的 DAG,并在失败后展示原因、恢复路径和可执行的后续动作。
438
+ - 新增任务旅程卡,将任务创建、人工门禁、多次运行、失败和恢复记录集中展示。
439
+
440
+ ### 新增
441
+
442
+ - 会话删除改为列表内二次确认,减少误删并避免浏览器原生弹窗打断操作。
443
+ - 斜杠命令面板优化了卡片布局和键盘操作,在较小窗口中也能完整使用。
176
444
 
177
445
  ### 改进
178
446
 
179
- - 标准 DAG 的 planner 节点(`contract-pi` / `plan-pi`)输出超长(`output-too-large`)时自动紧凑重试:新增 `PLANNER_OUTPUT_LIMIT_RETRY_POLICY`(默认重试集合 + `output-too-large`),紧凑重试指令按节点类型区分——结构化契约节点只返回单个紧凑 JSON,普通计划节点返回最小计划(有序步骤、writeSet 边界、验证命令),并丢弃上游原文引用与长证据摘录
447
+ - 运行状态、恢复建议和关键操作统一使用自然中文,减少内部状态码直接暴露给用户。
448
+ - 任务监督更能容忍短暂静默和状态延迟,降低正常运行被误判为中断的概率。
449
+
450
+ ### 修复
451
+
452
+ - 恢复流程可正确读取运行报告,不再因响应结构差异误判为无法恢复。
453
+ - 变更范围以 Git 工作区的真实差异为准,不再根据模型回复推测是否修改过文件。
454
+ - PRD 验收标题支持更多常见写法;目录文档更新时会检查索引是否同步。
455
+ - Operator 自定义工具可正常进入 Pi SDK 会话,命令面板的高度和降级提示也更加稳定。
180
456
 
181
457
  ## [0.35.4-beta.0] - 2026-08-15
182
458
 
@@ -191,30 +467,6 @@
191
467
  - `docs/templates/frontend-task-constraints.md` 的 Mock 约束从 TODO 改为可落地契约:要求从项目**探索**实际存在的确定性 Mock 验证命令(不硬编码命令名)并声明到 `task.json.frontendMock.verifyCommands`,说明生成期 `allowedMockStrategies` 来源、`mock-strategy-outside-allowed` 是生成期契约问题(修复 = 补契约 + 重新生成 DAG,plan-revision 无法修复)
192
468
  - `docs/runtime/frontend-implementation-workflow.md` 的 task.json 输入标准补充 Mock 契约声明、命令探索与失败恢复指引
193
469
 
194
- ## [0.36.0] - 2026-08-15
195
-
196
- ### 新增
197
-
198
- - 新增任务旅程活动栏,把任务创建、人工门禁、多次运行、失败和恢复记录聚合在同一张卡片中
199
- - 强化 Operator Chat 的 DAG 恢复能力,运行失败后可以直接查看原因、恢复路径和后续动作
200
- - 会话删除改为列表行内二次确认,减少误删,也不再被浏览器原生弹窗打断
201
- - Operator Chat 可以持续监督长时间运行的 DAG,直到任务结束、失败或确实需要人工处理
202
- - 优化斜杠命令面板的卡片布局和键盘操作,在较小窗口中也能完整浏览和选择命令
203
- - 运行状态、恢复提示和关键操作文案统一为自然中文,减少内部状态码和生硬英文直接暴露给用户
204
-
205
- ### 修复
206
-
207
- - 任务推进期间的监督更加可靠,减少因短暂静默或状态更新延迟造成的误判
208
- - 运行器心跳不再提前唤醒 `operationWait`;Markdown 写入统一使用安全编辑工具,降低误覆盖风险
209
- - 写入目录文档时必须同步更新对应索引,避免内容已经生成却无法从目录入口找到
210
- - PRD 验收标准支持更多常见中文标题写法,不再因括号、破折号或措辞差异漏掉验收条件
211
- - 要求执行节点真正生成计划文件;没有触碰禁写路径时,不再错误声称任务受阻
212
- - 恢复重跑可以正确读取 `dag report` 返回的运行列表,不再因为响应结构差异误判为不可恢复
213
- - 变更范围统一以 Git 工作区的真实差异为准,不再根据模型回复文字推测是否修改过文件
214
- - Operator 自定义工具可以正常进入 Pi SDK 会话,不再被工具白名单意外过滤
215
- - 斜杠命令面板会根据实际可用高度自动调整,不再被窗口边缘裁切
216
- - 补齐 Operator Chat 的本地命令处理、动态命令降级和错误提示等交互缺口
217
-
218
470
  ## [0.35.3] - 2026-08-15
219
471
 
220
472
  ### 新增