@tea-agent/loop-agent 0.37.0 → 0.37.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -6
- package/CHANGELOG.md +71 -144
- package/README.md +1 -1
- package/bin/loop-agent.js +1 -37
- package/dist/application/task-lifecycle/advance.js +0 -1
- package/dist/application/task-lifecycle/observe.js +0 -15
- package/dist/application/task-lifecycle/plan-transitions.js +0 -15
- package/dist/cli/command-definitions.js +0 -7
- package/dist/cli/program.js +3 -8
- package/dist/commands/init-upgrade.js +19 -351
- package/dist/commands/init.js +67 -14
- package/dist/commands/run-dag-progress.js +0 -14
- package/dist/commands/task-advance.js +3 -33
- package/dist/executors/dag-pi-executor.js +30 -47
- package/dist/executors/pi-sdk-executor.js +0 -34
- package/dist/executors/shell-executor.js +95 -6
- package/dist/shared/operator/capabilities.js +13 -200
- package/dist/shared/package-metadata.js +0 -42
- package/dist/task/contract/project.js +0 -4
- package/dist/task/source-prepare/completeness.js +0 -53
- package/dist/task/source-prepare/parse-intent.js +12 -82
- package/dist/task/source-prepare/prepare.js +5 -102
- package/dist/task/source-prepare/semantic-intake.js +23 -144
- package/dist/worker/console/chat/artifact-card.js +1 -8
- package/dist/worker/console/chat/chat-event-store.js +0 -152
- package/dist/worker/console/chat/human-gate-card.js +1 -9
- package/dist/worker/console/chat/operation-card.js +2 -71
- package/dist/worker/console/chat/pi-runtime.js +62 -111
- package/dist/worker/console/chat/routes.js +10 -43
- package/dist/worker/console/chat/session-store.js +1 -9
- package/dist/worker/console/chat/shortcuts.js +7 -9
- package/dist/worker/console/chat/turn-process.js +23 -204
- package/dist/worker/console/chat/workspace-landing.js +1 -2
- package/dist/worker/console/operation-runner.js +6 -155
- package/dist/worker/console/operator-actions.js +14 -391
- package/dist/worker/console/operator-user-error.js +0 -4
- package/dist/worker/console/recovery-cta.js +3 -50
- package/dist/worker/console/static/assets/index-HX1pbOyl.css +1 -0
- package/dist/worker/console/static/assets/index-M0BLEBfh.js +56 -0
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +9 -13
- package/dist/worker/console/static-src/app/useOperatorActions.js +2 -4
- package/dist/worker/console/static-src/app/useRecoveryActions.js +56 -65
- package/dist/worker/console/static-src/app/useRecoveryConsole.js +1 -73
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +30 -114
- package/dist/worker/console/static-src/operator-chat/refs.js +0 -3
- package/dist/worker/console/static-src/operator-chat/spatial-overlay.js +1 -2
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +13 -67
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +6 -12
- package/dist/worker/console/static-src/operator-chat/useComposer.js +8 -45
- package/dist/worker/console/static-src/operator-chat/workspace-layout-mode.js +3 -7
- package/dist/worker/loop-agent/loop-agent-client.js +3 -17
- package/dist/worker/observability/read-model.js +0 -20
- package/dist/worker/observe/spec-evidence.js +8 -3
- package/dist/worker/observe/static/operator-chrome.d.ts +0 -1
- package/dist/worker/observe/static/operator-chrome.js +3 -10
- package/dist/worker/observe/static/views/dag-inspector.js +71 -6
- package/dist/worker/observe/static/views/dag.js +0 -12
- package/dist/worker/preflight.js +1 -2
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +707 -37
- package/dist/workflows/dag/backend-test-case-manifest.js +4 -0
- package/dist/workflows/dag/backend-test-markdown-workflow.js +109 -7
- package/dist/workflows/dag/backend-test-module-stem.js +5 -0
- package/dist/workflows/dag/backend-test-pytest-collection.js +345 -24
- package/dist/workflows/dag/backend-test-scenario-param.js +890 -164
- package/dist/workflows/dag/backend-test-writer-completeness.js +47 -16
- package/dist/workflows/dag/dynamic-runtime/map.js +24 -8
- package/dist/workflows/dag/dynamic-runtime/shared.js +1 -9
- package/dist/workflows/dag/frontend-implementation-contract.js +39 -233
- package/dist/workflows/dag/frontend-prewrite-gate.js +61 -364
- package/dist/workflows/dag/frontend-repair.js +18 -219
- package/dist/workflows/dag/frontend-verification-trace.js +32 -47
- package/dist/workflows/dag/init-hybrid.js +82 -165
- package/dist/workflows/dag/node-execution.js +0 -89
- package/dist/workflows/dag/recovery-recommendation.js +0 -58
- package/dist/workflows/dag/runner.js +15 -333
- package/dist/workflows/dag/scheduler.js +3 -257
- package/dist/workflows/dag/types.js +9 -130
- package/docs/README.md +3 -3
- package/docs/architecture/evolution.md +67 -102
- package/docs/templates/backend-test-dag.json +50 -32
- package/docs/templates/init-managed-agents.md +2 -5
- package/harness.json +2 -2
- package/package.json +3 -9
- package/skills/loop-agent/SKILL.md +0 -1
- package/skills/loop-agent/references/command-reference.md +0 -4
- package/dist/build-stamp.json +0 -6
- package/dist/commands/dag-request-interrupt.js +0 -20
- package/dist/worker/console/chat/assistant-content.js +0 -121
- package/dist/worker/console/chat/semantic-activity.js +0 -477
- package/dist/worker/console/operation-run-facts.js +0 -190
- package/dist/worker/console/operation-wait.js +0 -355
- package/dist/worker/console/recovery-error-copy.js +0 -198
- package/dist/worker/console/static/assets/abnfDiagram-N423BO3Z-DSvF6RXQ.js +0 -1
- package/dist/worker/console/static/assets/arc-DuI4ogtJ.js +0 -1
- package/dist/worker/console/static/assets/architectureDiagram-T3A2C74G-DdBbgD4y.js +0 -36
- package/dist/worker/console/static/assets/blockDiagram-VBNYF7ZC-xQC2HELm.js +0 -132
- package/dist/worker/console/static/assets/c4Diagram-5PPSVZJV-DPMSgwIZ.js +0 -10
- package/dist/worker/console/static/assets/channel-DLVz9TYW.js +0 -1
- package/dist/worker/console/static/assets/chunk-2GRJ4B5K-WTEKTxin.js +0 -1
- package/dist/worker/console/static/assets/chunk-2Q5K7J3B-B6vZ0Pv_.js +0 -1
- package/dist/worker/console/static/assets/chunk-5RXB4S5H-BrerNAix.js +0 -231
- package/dist/worker/console/static/assets/chunk-5VM5RSS4-D_ch2aaI.js +0 -15
- package/dist/worker/console/static/assets/chunk-6Q2QTUOP-VvfacNrq.js +0 -88
- package/dist/worker/console/static/assets/chunk-GF5L2VYU-B-uGFIg2.js +0 -206
- package/dist/worker/console/static/assets/chunk-JWPE2WC7-BlysCtod.js +0 -1
- package/dist/worker/console/static/assets/chunk-KBJHAD2P-BjAUAfcT.js +0 -1
- package/dist/worker/console/static/assets/chunk-RYQCIY6F-BeZnBmb-.js +0 -1
- package/dist/worker/console/static/assets/chunk-XXDRQBXY-Bbfe3UJG.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BeAuGcO9.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BeAuGcO9.js +0 -1
- package/dist/worker/console/static/assets/cose-bilkent-JH36ORCC-BKJQnYVM.js +0 -1
- package/dist/worker/console/static/assets/cynefin-VYW2F7L2-B1wtI3hU.js +0 -166
- package/dist/worker/console/static/assets/cynefinDiagram-MW4NZA55-DCF6DBSu.js +0 -62
- package/dist/worker/console/static/assets/cytoscape.esm-yzknjiTM.js +0 -321
- package/dist/worker/console/static/assets/dagre-VZM6K2ZE-BJyNGRlP.js +0 -4
- package/dist/worker/console/static/assets/defaultLocale-DX6XiGOO.js +0 -1
- package/dist/worker/console/static/assets/diagram-7IWD3JNH-B7j1-VsZ.js +0 -30
- package/dist/worker/console/static/assets/diagram-B4RE2ZJO-BREJ140a.js +0 -3
- package/dist/worker/console/static/assets/diagram-LBJQPF4R-CDPHmHGH.js +0 -24
- package/dist/worker/console/static/assets/diagram-Q27KOJAE-BtZLrez1.js +0 -24
- package/dist/worker/console/static/assets/diagram-UB23O5K3-mzybu8oU.js +0 -41
- package/dist/worker/console/static/assets/ebnfDiagram-BXEA7PRR-Dk3I2uO6.js +0 -1
- package/dist/worker/console/static/assets/erDiagram-JOGREHBK-BT97u_tQ.js +0 -85
- package/dist/worker/console/static/assets/flowDiagram-UKHOOZJN-CMOtYzui.js +0 -156
- package/dist/worker/console/static/assets/ganttDiagram-PKOTCBZU-DiNydkuY.js +0 -292
- package/dist/worker/console/static/assets/gitGraphDiagram-DS77QQ5N-Cwt6fLkl.js +0 -106
- package/dist/worker/console/static/assets/graph-DOmOIIwC.js +0 -1
- package/dist/worker/console/static/assets/index-DQxiso1w.js +0 -325
- package/dist/worker/console/static/assets/index-_j0Hzo69.css +0 -1
- package/dist/worker/console/static/assets/infoDiagram-6WML65LV-AsGIGKKB.js +0 -2
- package/dist/worker/console/static/assets/init-Gi6I4Gst.js +0 -1
- package/dist/worker/console/static/assets/ishikawaDiagram-WSZJBQD7-BL8ITZh3.js +0 -70
- package/dist/worker/console/static/assets/journeyDiagram-NVQOT4AX-VPKAUX8M.js +0 -139
- package/dist/worker/console/static/assets/kanban-definition-27J2QSJJ-BL56hfGp.js +0 -89
- package/dist/worker/console/static/assets/layout-D-LzfAck.js +0 -1
- package/dist/worker/console/static/assets/linear-BmSG3nIZ.js +0 -1
- package/dist/worker/console/static/assets/map-DxJ2ADlA.js +0 -1
- package/dist/worker/console/static/assets/mermaid.core-DWGK9kwP.js +0 -308
- package/dist/worker/console/static/assets/mindmap-definition-FAOFIHXS--vvKLjo0.js +0 -96
- package/dist/worker/console/static/assets/ordinal-Cboi1Yqb.js +0 -1
- package/dist/worker/console/static/assets/pegDiagram-VL7TDLO6-B41mxb2-.js +0 -1
- package/dist/worker/console/static/assets/pieDiagram-7S7Q4E2Y-DTlu77sw.js +0 -39
- package/dist/worker/console/static/assets/quadrantDiagram-CIZ2JOQS-Bk5A7alv.js +0 -7
- package/dist/worker/console/static/assets/railroadDiagram-AXF67PYL-Csf9jzQy.js +0 -1
- package/dist/worker/console/static/assets/requirementDiagram-LRYGKXZP-CeptoSNx.js +0 -84
- package/dist/worker/console/static/assets/sankeyDiagram-W5VNT64P-A-DLCLer.js +0 -40
- package/dist/worker/console/static/assets/sequenceDiagram-SI44F4Z6-22VbPdOI.js +0 -162
- package/dist/worker/console/static/assets/sizeCapture-X5ZJPWSS-DWvAyBC9.js +0 -1
- package/dist/worker/console/static/assets/stateDiagram-OKZ733FA-qICZ75yT.js +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DzKvfHTX.js +0 -1
- package/dist/worker/console/static/assets/swimlanes-SLNWSIFB-xi7lcMyp.js +0 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Cxqr_qM1.js +0 -8
- package/dist/worker/console/static/assets/timeline-definition-Z64GVDOM-Bu6Nl6O2.js +0 -120
- package/dist/worker/console/static/assets/vennDiagram-T6HMQDX7-BzMz4Bn9.js +0 -34
- package/dist/worker/console/static/assets/wardleyDiagram-T6FBY63Y-CxaJnzc5.js +0 -78
- package/dist/worker/console/static/assets/xychartDiagram-ELKLHX3M-5JK-omQK.js +0 -7
- package/dist/worker/console/static/fonts/katex/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/worker/console/static/fonts/katex/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/worker/console/static-src/operator-chat/activity-journey.js +0 -125
- package/dist/worker/console/static-src/operator-chat/activity-rail-presentation.js +0 -73
- package/dist/worker/console/static-src/operator-chat/activity-references.js +0 -20
- package/dist/worker/console/static-src/operator-chat/slash-palette-layout.js +0 -24
- package/dist/worker/console/static-src/operator-chat/slash-palette-nav.js +0 -141
- package/dist/worker/console/static-src/operator-chat/useActivityRailTransition.js +0 -59
- package/dist/worker/observability/interrupt-eligibility.js +0 -264
- package/dist/workflows/dag/contract-output-registry.js +0 -14
- package/dist/workflows/dag/contract-validator-registrations.js +0 -8
- package/dist/workflows/dag/frontend-recovery-plan.js +0 -73
- package/dist/workflows/dag/frontend-recovery-root-manifest.js +0 -123
- package/dist/workflows/dag/frontend-recovery-run.js +0 -539
- package/dist/workflows/dag/frontend-writer-recovery.js +0 -106
- package/dist/workflows/dag/frontend-writer-rollback.js +0 -821
- package/dist/workflows/dag/interrupt-request.js +0 -559
package/AGENTS.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
- Shell 搜索优先 `rg`,按名找文件优先 `fd`;脚本用 Git Bash / 兼容 Bash。
|
|
25
25
|
- 用 loop-agent 迭代本仓库时,控制器必须来自已发布 npm 包(记录实际版本);启动后不要中途升级;不要用工作区 `npm link` / `npm run dev` 控制可能改 CLI/runtime/package 的任务。
|
|
26
26
|
- 反复出现的约束固化为文档、脚本、检查、测试或模板;禁止占位实现(除非 contract 标明脚手架)。
|
|
27
|
-
- 非微小实现:`exec-plan` 不能替代 Agent DAG;除非用户要求 one-shot 或计划记录 escape hatch,否则改实现前完成 `task advance`(PRD +
|
|
27
|
+
- 非微小实现:`exec-plan` 不能替代 Agent DAG;除非用户要求 one-shot 或计划记录 escape hatch,否则改实现前完成 `task advance`(PRD + 结构化路径边界)、writeSet gate 审查与 `task advance --approve-gate`。
|
|
28
28
|
- **实现默认 DAG,主会话不直接改代码**:只要是实现/修复/行为或展示语义变更(含 observe 文案映射、runtime status、schema、executor、CLI 等),主会话只做 Orient / 建 task / dry-run / validate / writeSet 审查 / 执行与监视 DAG,**不得**自己改 `src/**`、`test/**` 等交付面。仅当用户**明确授权**主会话直接处理(例如「直接改」「主会话改」「one-shot」「不用 DAG」)时,才允许主会话写入;授权后仍须记录边界、allowedPaths 与验证证据。纯答疑、读代码、查状态、提交/推送已有 diff、或用户点名的文档微调(如本文件规则)不在此限。
|
|
29
29
|
- 不要自行引入外部 SDD/spec-first 等强制平行治理树;以本文件与 `docs/` 为准(ADR 0006)。
|
|
30
30
|
|
|
@@ -49,12 +49,10 @@
|
|
|
49
49
|
|
|
50
50
|
启动 loop-agent DAG 流程后,主 agent 应自主推进到整个流程结束,不要中途请求无谓的人工确认(如“要我现在执行 DAG 吗?”)。只要 dry-run / validate / writeSet 审查通过就应直接执行并跑完全部 ranks;遇到真问题(契约不一致、writeSet 越界、verify 失败且超出 maxFixLoops、用户明显未授权的高风险动作)才停。即便 profile 是 supervised/reviewed,也不默认在 review-gate 主动停下等人——控制器会在需要人工 approve 时自行提示,主 agent 的职责是推动流程跑完。
|
|
51
51
|
|
|
52
|
-
DAG 执行期间主 agent
|
|
52
|
+
DAG 执行期间主 agent 必须持续轮询监视直到 run 结束(FINISHED / FAILED / 需要 approve),不能轮询一次就停下等用户;轮询间隔应合理(避免频繁唤醒浪费 token,也不得住一个节点上赌一次就走)。判活必须用可靠方式:看 `state.json` 的 `runner.heartbeatAt` 是否持续刷新 + `session-events.jsonl` 是否在增长 + `dag doctor` 的 `liveness` 字段,不要只用 `tasklist /FI "PID eq X"` 这类过滤语法在 Git Bash 下会误报 DEAD,从而错判一个正常工作的 run 为 orphaned。遇到疑似 stall 先按 `docs/runtime/agent-dag-runner.md` 查 `lastMeaningfulProgressAt` / provider 活动,有真实进展就继续等,绝不盲目 supersede。持续监视过程中,主 agent 可在合适节点(例如 rank/节点状态变化、进入 verify/closeout、出现 stall 嫌疑或需要 approve 时)向用户做简短进度汇报(当前节点、状态、是否有风险),避免长时间静默;汇报是告知,不是请求确认,不得因此停下流程。
|
|
53
53
|
|
|
54
54
|
DAG 执行期间,主 agent 不得修改 writeSet 外的任何工作区文件(包括 AGENTS.md、docs、根配置等)。bounded writer 节点的 write guard 用「节点运行期间的工作区 diff」作为越界证据,不区分改动来自 pi 还是主会话——主会话在 pi 节点跑的时候改了 writeSet 外文件,会让 write guard 把账算到 pi 头上、判节点 ERROR、下游 cascade skip。需要改文档/约束时,要么在 DAG 启动前改完,要么等 run 结束后改;务必与 DAG 写入节点在时间上互斥。排查任务路由问题时优先用 `resolveTaskDagTemplateSelection` / `classifyTaskDemand` 等纯函数探针或 `--output` 指定临时路径,不要反复 `dag execute --dry-run` / 无必要的 lifecycle 探测。dry-run 不执行节点;若确需预演,检查命令返回的 `.harness/dag-runs/dry-run/<runId>/` `runDir`,它不进入 active overview,也不能作为 `dag resume` 目标。优先用纯函数探针或 `task status`。
|
|
55
55
|
|
|
56
|
-
失败恢复与契约漂移:run 失败后先 `dag report` / `dag doctor`,优先 `dag rerun --from-node`(含 unsafe shell 节点的子图会判不 eligible,属预期;此时改契约后同 task 重新 advance / `dag rerun-task`)。直接编辑 `source/需求.md` / `执行约束.md` 会使契约进入 `externally-modified`,后续 advance 会拒用新内容(DIRTY_SOURCE / hash 不一致);合法收编用 `task contract adopt --task <id> --expected-revision <n> --expected-observed-hash <hash> --request-id <id> --request-payload-sha256 <sha>`(hash 从 `task status --json` 的 `contract.observedCanonicalHash` 取),或改 PRD 后重新 importPrd 走完整重投影;禁止手改 `lifecycle.json` / `.transactions/` 绕过。
|
|
57
|
-
|
|
58
56
|
## 项目地图
|
|
59
57
|
|
|
60
58
|
- `CONTEXT.md`:术语表
|
|
@@ -96,8 +94,6 @@ npm run build
|
|
|
96
94
|
node bin/loop-agent.js --help
|
|
97
95
|
```
|
|
98
96
|
|
|
99
|
-
- 改 `src/**` 后必须先 `npm run build` 再用 `bin/loop-agent.js`:bin 内置 stale-dist 守卫(src 比 dist 新即硬失败,`--ignore-stale-dist` 逃生),`--version` 会显示构建 git SHA,发布/自测前用它确认跑的是目标改动。
|
|
100
|
-
|
|
101
97
|
文档站变更:`npm run docs:build`。init / architecture / skill entry / pack 定向验证见 verification-matrix。
|
|
102
98
|
|
|
103
99
|
## 交接
|
package/CHANGELOG.md
CHANGED
|
@@ -2,112 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
-
## [0.37.0] - 2026-08-16
|
|
6
|
-
|
|
7
|
-
### 新增
|
|
8
|
-
|
|
9
|
-
- markdown syntax highlight, math formulas and mermaid diagrams; operate entry lands on chat
|
|
10
|
-
- label rerun titles with round number from -rN id suffix
|
|
11
|
-
- enter-DAG action, artifact rail projection, zh changelog
|
|
12
|
-
- surface compaction progress and timeline summary
|
|
13
|
-
- floating auto-dismiss toasts replace in-flow error alerts
|
|
14
|
-
- add running spinners to session titles and stop button
|
|
15
|
-
- show context ratio, semantic cache icons, align process entry typography
|
|
16
|
-
- show context usage and semantic cache labels in usage bar
|
|
17
|
-
- stream live turn process in strict order
|
|
18
|
-
|
|
19
|
-
### 修复
|
|
20
|
-
|
|
21
|
-
- isolate interrupt kernel behind worker adapter
|
|
22
|
-
- constrain session title width so hover tooltip engages
|
|
23
|
-
- backfill operation link for semantic activity refs
|
|
24
|
-
- fail fast on non-canonical newTask ids with suggested fix
|
|
25
|
-
- accept projected references and normalize PRD headings
|
|
26
|
-
|
|
27
|
-
## [0.36.2] - 2026-08-16
|
|
28
|
-
|
|
29
|
-
### 修复
|
|
30
|
-
|
|
31
|
-
- exempt changelog history from task-pool-root scan
|
|
32
|
-
- exempt gitignore managed-block doc references in task-pool-root check
|
|
33
|
-
|
|
34
|
-
## [0.36.1] - 2026-08-16
|
|
35
|
-
|
|
36
|
-
### 新增
|
|
37
|
-
|
|
38
|
-
- cooperative live DAG interrupt and recovery UX
|
|
39
|
-
|
|
40
|
-
### 修复
|
|
41
|
-
|
|
42
|
-
- move interrupt eligibility to observability to honor kernel import boundary
|
|
43
|
-
- retry semantic intake across Pi tiers with 300s timeout
|
|
44
|
-
|
|
45
|
-
## [0.36.0] - 2026-08-15
|
|
46
|
-
|
|
47
|
-
### 新增
|
|
48
|
-
|
|
49
|
-
- 新增任务旅程活动栏,把任务创建、人工门禁、多次运行、失败和恢复记录聚合在同一张卡片中
|
|
50
|
-
- 强化 Operator Chat 的 DAG 恢复能力,运行失败后可以直接查看原因、恢复路径和后续动作
|
|
51
|
-
- 会话删除改为列表行内二次确认,减少误删,也不再被浏览器原生弹窗打断
|
|
52
|
-
- Operator Chat 可以持续监督长时间运行的 DAG,直到任务结束、失败或确实需要人工处理
|
|
53
|
-
- 优化斜杠命令面板的卡片布局和键盘操作,在较小窗口中也能完整浏览和选择命令
|
|
54
|
-
- 运行状态、恢复提示和关键操作文案统一为自然中文,减少内部状态码和生硬英文直接暴露给用户
|
|
55
|
-
|
|
56
|
-
### 修复
|
|
57
|
-
|
|
58
|
-
- 任务推进期间的监督更加可靠,减少因短暂静默或状态更新延迟造成的误判
|
|
59
|
-
- 运行器心跳不再提前唤醒 `operationWait`;Markdown 写入统一使用安全编辑工具,降低误覆盖风险
|
|
60
|
-
- 写入目录文档时必须同步更新对应索引,避免内容已经生成却无法从目录入口找到
|
|
61
|
-
- PRD 验收标准支持更多常见中文标题写法,不再因括号、破折号或措辞差异漏掉验收条件
|
|
62
|
-
- 要求执行节点真正生成计划文件;没有触碰禁写路径时,不再错误声称任务受阻
|
|
63
|
-
- 恢复重跑可以正确读取 `dag report` 返回的运行列表,不再因为响应结构差异误判为不可恢复
|
|
64
|
-
- 变更范围统一以 Git 工作区的真实差异为准,不再根据模型回复文字推测是否修改过文件
|
|
65
|
-
- Operator 自定义工具可以正常进入 Pi SDK 会话,不再被工具白名单意外过滤
|
|
66
|
-
- 斜杠命令面板会根据实际可用高度自动调整,不再被窗口边缘裁切
|
|
67
|
-
- 补齐 Operator Chat 的本地命令处理、动态命令降级和错误提示等交互缺口
|
|
68
|
-
|
|
69
|
-
## [0.35.3] - 2026-08-15
|
|
70
|
-
|
|
71
|
-
### 新增
|
|
72
|
-
|
|
73
|
-
- Console 默认进入「对话」页面;创建新任务时先分析需求和依赖,再进入正式任务流程
|
|
74
|
-
- 计划中的文件验证会优先落到允许写入的范围内,命令级检查则使用稳定的静态验证入口
|
|
75
|
-
- Recovery 页面新增恢复链路和最终结果展示,能够看清一次失败是如何被接管和收敛的
|
|
76
|
-
- 前端实现 DAG 增加恢复根清单,并去除重复统计,恢复报告更清晰
|
|
77
|
-
- 写入节点支持部分写入回滚和子任务恢复,局部失败不再轻易污染后续执行
|
|
78
|
-
- 写入节点遇到短暂故障时可以回退到稳定基线,再决定重试或恢复
|
|
79
|
-
- 调度器增加激活门禁和恢复触发条件,只有满足执行条件的子任务才会进入运行
|
|
80
|
-
- 新增分阶段创建子任务的基础能力,为后续恢复和分批执行提供统一入口
|
|
81
|
-
- 补齐恢复状态、恢复结果和终态恢复意图的数据结构,前后端对失败状态的理解保持一致
|
|
82
|
-
- 产出节点新增契约自检,并强化长时间运行时的稳定性和异常收敛能力
|
|
83
|
-
- 统一写入节点的公共辅助逻辑,修复判断改为结构化结果,不再依赖模糊文本
|
|
84
|
-
- 精简前端实现 DAG 的第一阶段,在正式写入前完成结果合并和写入准入检查
|
|
85
|
-
|
|
86
|
-
### 修复
|
|
87
|
-
|
|
88
|
-
- 规范证据面板不再单列 openspec,统一为「规范已读取/规范检索」
|
|
89
|
-
- 恢复全量测试稳定性:没有 `python3` 时自动使用可用 Python,统一构建版本格式,并处理 Node 弃用警告造成的干扰
|
|
90
|
-
- 修正续跑候选测试数据,使 `failureCode` 与真实失败语义一致,避免变基后出现错误判断
|
|
91
|
-
|
|
92
|
-
## [0.35.2] - 2026-08-15
|
|
5
|
+
## [0.37.1-beta.0] - 2026-08-16
|
|
93
6
|
|
|
94
7
|
### 重点更新
|
|
95
8
|
|
|
96
|
-
-
|
|
97
|
-
|
|
98
|
-
### 新增
|
|
99
|
-
|
|
100
|
-
- 对话时间线新增内联可折叠「处理详情」区块,集中展示模型思考与工具调用摘要,回合结束后自动折叠
|
|
101
|
-
- turn-process 保留 SDK thinking blocks,流式传输与持久化均携带思考内容
|
|
9
|
+
- 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
|
|
10
|
+
- 强化 backend-test correspondence、scenario-param、Markdown/pytest writer、collection repair、日志审计和 Windows pytest argfile 执行链,稳定区分 controller TestBug、generated TestBug 与真实 API ProductBug
|
|
102
11
|
|
|
103
12
|
### 改进
|
|
104
|
-
|
|
105
|
-
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
13
|
+
- backend-test correspondence 只分析目标请求实际绑定的 body/payload,忽略 `scenario` 元数据与 setup-only payload;对 `scenario["body"]` 保留字段 shape,并把 intentional invalid enum 交由 scenario-param 门禁判断;同时识别下划线前缀 pytest 参数集合与带说明的 `Payload Contract: none(…)`,避免零 eligible 的 payload/parameter 误阻断
|
|
14
|
+
- backend-test correspondence 继续解析模块内 transport wrapper 的位置 payload 与 wrapper 构造 body,并清理 `Payload Enum` 值后的中文说明,避免 PUT/lifecycle 合法载荷误报;Markdown/pytest writer 同步禁止臆测响应 ID 类型,并在路径 ID 类型未声明时使用 create-delete 派生的合法 missing ID,避免把测试资产缺陷误分类为产品 400/404 缺陷
|
|
15
|
+
- 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
|
|
16
|
+
- 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
|
|
17
|
+
- 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 解包
|
|
18
|
+
- backend-test collection repair 把 upstream 的 `Repair paths: testcase/...` 直接视为完整权威路径证据并读取/编辑该文件;禁止猜测根级 `contracts/**` 或 DAG run 目录,也禁止 read tool 已成功返回文件后反事实声称路径不存在并提前 blocked
|
|
19
|
+
- 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
|
|
20
|
+
- backend-test generated-local collection repair 从 HIGH 路由降为 MED,在保留 write guard 与 requireChangedFiles 的同时避开连续多轮 grok repair hallucinated blocked/changed-without-write,改由稳定 writer 路由执行有界单文件修复
|
|
21
|
+
- writer outcome 协议确定性归一化显式中文 `实现结果:已变更|已满足|已阻塞` 到 canonical `IMPLEMENTATION_OUTCOME`,仍拒绝无标签 prose、未知值和冲突值,不根据 diff 猜测语义
|
|
22
|
+
- scenario-param 识别 `"x" * _TITLE_MAX_LENGTH` 等长度表达式与 helper 常量名相乘形式
|
|
23
|
+
- correspondence 忽略 pytest payload 中的 `expect`/`echo_*` 辅助键,避免把 DTO 外 helper 字段误判为 PAYLOAD_SHAPE_MISMATCH
|
|
24
|
+
- scenario-param 解析 `bound=LEN100` 机器行、解引用 `_STATUS_ACTIVE` 等 Python 字符串常量,并把 `NOMINAL` 长度样本从 min/max 纠正为 nominal
|
|
25
|
+
|
|
26
|
+
- 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` 边界
|
|
27
|
+
- scenario-param 兼容 `empty` 意图下的 omit/`missing-key`,规范化 `custom-literal` 外包引号与可见空白符,并把 `max+1`/`min`/`max` 的裸数字位置参数按长度 token 比较(含 oversized 数字本身);`custom-literal:trim` 视为 padded whitespace 语义标签
|
|
28
|
+
- backend-test writer 合同明确:`enum-invalid` 必须使用具体非法字面量且禁止 `_OMIT`/missing-key;`custom-literal:trim|ACTIVE|ARCHIVED` 必须使用真实 padded/enum 字面量,禁止 `filter-active` 类描述性伪值
|
|
29
|
+
- scenario-param 识别 `_*_MAX_LENGTH` / `_*_OVER_LENGTH` 等长度 helper 名,明确 `custom-literal:trim` 不能是全空白,并把无 pytest.param 的 request-level/health nominal 记为 MATCH 以免污染 eligibility
|
|
111
30
|
|
|
112
31
|
## [0.35.1] - 2026-08-15
|
|
113
32
|
|
|
@@ -137,49 +56,6 @@
|
|
|
137
56
|
- 修复 PRD 三件套上传时工程边界缺失以 EMPTY_ALLOWED_PATHS blocking 卡死、semantic intake 拒绝接管、契约永不 apply 的问题
|
|
138
57
|
- 修复文字录入「请参照这三个prd路径XXX」只物化一句话、引用文件从未导入的问题
|
|
139
58
|
- 修复 semantic intake attempt marker 一次性失败后永不重试的问题:新的 PRD 导入会重置 marker,失败可随新证据重试
|
|
140
|
-
- Operator Chat DAG recovery P0 收敛:`operationWait` 默认仅由 meaningful progress 或终态唤醒,同时保留 `wakeOn=all` 诊断兼容;operation 终态原子保存并安全投影受信任的 `runSummary`/`dagRunId`,Operation Card 与 prompt 可直接消费失败节点、category 和 recovery 摘要;独立 review 后补齐所有 allowlisted 文本字段中的 Windows drive、UNC 与 POSIX absolute-path 子串脱敏,且不暴露 raw result、CLI 参数、绝对 artifact path 或 secrets。
|
|
141
|
-
- 修复 terminal `run-failed + gate=null` 仍建议 `task advance` 的无进展循环;task status 与 Operation Card 现在停止盲目 resume/retry,并只提供合法的 Inspect/外部恢复导航。
|
|
142
|
-
- 为 Console shortcut palette 的动态高度 custom property 声明 `62vh` 默认值,保留 ChatComposer inline override 与既有 fallback,并维持 `shell-ui-boundary` 未定义 token 检查强度。
|
|
143
|
-
|
|
144
|
-
## [0.35.1-beta.0] - 2026-08-14
|
|
145
|
-
|
|
146
|
-
### 重点更新
|
|
147
|
-
|
|
148
|
-
- Operator Chat 新增长跑 DAG 自主监督能力,通过只读 `operationWait`、canonical heartbeat 与有界退避持续监控后台 operation 至真实终态
|
|
149
|
-
- `task advance --approve-gate --json` 新增 stderr 周期进度,同时保证 stdout 保持单一最终 JSON
|
|
150
|
-
- `loop-agent init` 收敛 managed `.gitignore` 与运行态目录迁移评估,并保留项目自有 Pi routing
|
|
151
|
-
- Operator Chat `/` 命令面板升级为响应式 3/2/1 列卡片网格,补齐参数命令、动态目录与键盘/IME 行为
|
|
152
|
-
|
|
153
|
-
### 新增
|
|
154
|
-
|
|
155
|
-
- Operator Chat 长跑 DAG 监督 P0-P2:新增只读、model-callable、无需 Human Gate 的 `operationWait` action/tool(复用 operation event store 的 `listFrom`/`subscribe`,订阅先于复查防竞态;已有事件/终态/needs-reconcile 立即返回,首个新事件立即 settle,超时返回 `timedOut:true` 摘要而非命令失败,NOT_FOUND/EVENT_CURSOR_EXPIRED 确定性错误;所有路径单次 settle 并清理 timer/listener)。
|
|
156
|
-
- Console operation runner 将 sibling CLI 的 `LoopAgentClient` heartbeat 投影为 canonical `kind: "heartbeat"` operation event(含 `at`、`elapsedMs` 与 operation/action/run/task 安全摘要);写入失败不终止 sibling CLI/DAG 执行,不改变 DAG runner lease heartbeat 频率。
|
|
157
|
-
|
|
158
|
-
### 改进
|
|
159
|
-
|
|
160
|
-
- `task advance --approve-gate --json` 运行 DAG 时周期进度只写 stderr(`--quiet` 可关闭),stdout 保持单个 `OperatorCommandResultV1` JSON;新增 `--progress-interval-ms`(下限 1000ms,与 `dag execute` 同语义)与 `--quiet` 参数;observer 仅在 approve 且非 dry-run 时创建,所有终态/异常路径 `finally` dispose,不留 timer。
|
|
161
|
-
- Operator Chat 长跑监督合同统一为 60 → 90 → 120 → 180 秒退避(状态变化后重置 60 秒,疑似 stall 用 30–60 秒复查);base prompt 与 managed init `AGENTS.md` 模板明确:长跑 DAG 必须经 `prepareDagExecution → runDag → operationId` 由 Console operation 后台持有,禁止前台 Bash 直接 `task advance --approve-gate`、禁止管道 `tail`/`head`、禁止模型自行拼接 `nohup`/`Start-Process`/`start`。
|
|
162
|
-
|
|
163
|
-
### Init / Upgrade
|
|
164
|
-
|
|
165
|
-
- `loop-agent init` 的 managed `.gitignore` block 收敛为四条目录级规则(`.harness/`、`.agents/`、`.task-pool/`、`.worktrees/`):删除旧细粒度规则与反向放行;`scripts/` 与 `ai_workspace/loop-agent/` 保持可提交。旧格式 block 仍由 `check-update` 确定性报告 `refresh-managed-block`,`update --apply-safe` / `upgrade` 应用后收敛,block 外用户规则原样保留。
|
|
166
|
-
- full init 不再生成 `.harness/**/.gitkeep` 占位文件(目录照常创建)。
|
|
167
|
-
- `init upgrade` 在 managed block 收敛后生成只读 gitignore 迁移评估(`.harness/init-upgrades/<run-id>/gitignore-migration.json`):inventory 已跟踪的 `.harness/**` 与 `.agents/**`,建议 index-only 的 `git rm -r --cached --ignore-unmatch` 命令(只改 index、保留工作区文件);`.agents` 已跟踪内容触发审查暂停,非 Git 仓库 / git 查询失败 / 存在 staged 条目时 fail closed,controller 不自动修改 Git index。
|
|
168
|
-
|
|
169
|
-
### Operator Chat
|
|
170
|
-
|
|
171
|
-
- 会话历史删除改为 pi-web 式列表行内二次确认:首次点击垃圾桶只在原行显示“删除 / 取消”,不再弹出浏览器原生确认框;同一时刻仅允许一行确认,切换会话、点击取消或按 `Escape` 可撤销,删除中显示忙碌态并阻止重复请求,同时保留原 DELETE confirmation token、失败提示和当前会话清理合同。
|
|
172
|
-
- 修复 Operator Chat 斜杠命令面板在紧凑布局或低高度窗口中顶部被 `.oc-main` 裁切的问题:面板打开后按主工作区顶边与 Composer 锚点之间的真实可用空间动态收缩,并在窗口、VisualViewport 与 Composer 尺寸变化时重算;面板头部保持可见,候选列表继续独立滚动,同时保留原有 `62vh / 520px` 安全上限与无测量回退。
|
|
173
|
-
- Operator Chat 斜杠命令面板完成 UI-12 响应式卡片网格:Operator / Pi Web / Extensions / Prompts / Skills 分组按现有 `comfortable / compact / narrow` 容器模式渲染 3 / 2 / 1 列,卡片仅显示真实命令名与最多两行描述;面板头部固定、候选区独立滚动、分组标题 sticky,长命令不会撑宽页面。键盘支持四方向几何导航与最小滚动,hover、`aria-selected`、`aria-activedescendant` 保持同源;IME composition 与结束后 100ms 保护阻止误导航/误接受,完整描述通过 `aria-describedby` 关联。补足 1/2/3 列、跨分组和 shuffled globalIndex 回归测试,并以真实浏览器验证三档列数、无横向溢出及 Operator/extension/prompt/skill 补全路径。
|
|
174
|
-
- 修复 Operator Chat 命令面板缺口:`/name` 与 `/compact` 参数走本地重命名/压缩路径,palette Enter/Tab 对参数命令进入可编辑前缀,动态 Extension/Skill/Prompt 冲突按优先级保留最高来源,动态目录 fail-soft 时保留本地命令并展示可重试 warning;会话标题 tooltip 水平夹紧视口,单条 Markdown 渲染失败仅该消息降级为纯文本。
|
|
175
|
-
|
|
176
|
-
## [0.35.1-beta.4] - 2026-08-15
|
|
177
|
-
|
|
178
|
-
> 观察面板规范证据不再单列 openspec:读取与检索统一为「规范已读取 / 规范检索」,空态文案同步中性化(beta,发布到 `beta` dist-tag)。
|
|
179
|
-
|
|
180
|
-
## [0.35.1-beta.3] - 2026-08-14
|
|
181
|
-
|
|
182
|
-
> frontend-implementation DAG 优化 v9 全六阶段 + Console 展示层(beta,发布到 `beta` dist-tag)。
|
|
183
59
|
|
|
184
60
|
## [0.35.0] - 2026-08-13
|
|
185
61
|
|
|
@@ -339,6 +215,57 @@
|
|
|
339
215
|
- 会话创建期间侧栏与 Landing 页共享 busy 状态反馈,抑制双击导致的重复创建
|
|
340
216
|
- 删除正在初始化的会话不会被迟到的后台初始化任务复活,初始化失败统一返回 HTTP 503 错误码
|
|
341
217
|
|
|
218
|
+
## [0.33.7-beta.2] - 2026-08-13
|
|
219
|
+
|
|
220
|
+
### Fixed
|
|
221
|
+
- scenario-param 解析 `bound=LEN100`、解引用 `_STATUS_ACTIVE` 等 Python 字符串常量,识别 `"x" * _TITLE_MAX_LENGTH` 长度表达式
|
|
222
|
+
- correspondence 忽略 pytest payload 中的 `expect`/`echo_*` 辅助键,避免假 PAYLOAD_SHAPE_MISMATCH
|
|
223
|
+
|
|
224
|
+
### Changed
|
|
225
|
+
- my-webapp 五轮 backend-test 全流程 live campaign 归档(R1–R5 均 finished;R5 correspondence PASS)
|
|
226
|
+
|
|
227
|
+
## [0.33.7-beta.1] - 2026-08-12
|
|
228
|
+
|
|
229
|
+
### Fixed
|
|
230
|
+
- scenario-param 识别 `_*_MAX_LENGTH` / `_*_OVER_LENGTH` 等长度 helper 名,明确 `custom-literal:trim` 不能是全空白,并把无 pytest.param 的 request-level/health nominal 记为 MATCH 以免污染 eligibility
|
|
231
|
+
- backend-test writer 合同明确:`enum-invalid` 必须使用具体非法字面量且禁止 `_OMIT`/missing-key;`custom-literal:trim|ACTIVE|ARCHIVED` 必须使用真实 padded/enum 字面量;max/min/max+1 应用长度表达式/helper
|
|
232
|
+
|
|
233
|
+
### Changed
|
|
234
|
+
- 归档 R108–R110 live campaign 证据与 residual 收紧结果
|
|
235
|
+
|
|
236
|
+
## [0.33.7-beta.0] - 2026-08-11
|
|
237
|
+
|
|
238
|
+
### 重点更新
|
|
239
|
+
|
|
240
|
+
- backend-test 收口 source-fidelity P0:绑定 source coverage、有界 Markdown/pytest 同步、item-level eligibility 与单次 eligible 业务执行;my-webapp R107 16 节点 finished
|
|
241
|
+
|
|
242
|
+
### 新增
|
|
243
|
+
|
|
244
|
+
- backend-test 新增绑定 source references 的来源覆盖事实、Markdown 一轮增量同步和 pytest correspondence 一轮有界修复,在业务测试体执行前保留 initial/effective/residual 证据
|
|
245
|
+
- backend-test 新增 item-level execution eligibility:只授权 payload-safe 的 pytest items,excluded items 与真实业务失败分开展示
|
|
246
|
+
|
|
247
|
+
### 改进
|
|
248
|
+
|
|
249
|
+
- 将 backend-test Markdown/pytest map 的默认总 token 预算从 `600000` 提升到 `3000000`,降低多模块生成时过早触发 `dynamic map token budget exhausted` 的概率;仍保持预算耗尽 fail-closed
|
|
250
|
+
- Coverage Matrix 接受 `R400001` 等错误码 Rule Key,并保留单元格内 `ACTIVE|ARCHIVED` 未转义枚举管道符,避免合法行被拆成 10 列后整表丢弃
|
|
251
|
+
- scenario-param 按 TP 精确匹配多行 `场景意图`,保留 `ACTIVE` 大小写字面量,识别 `"a" * N` 长度表达式与空白 `empty`,request-level `nominal` 允许 `None` 查询过滤;避免把合法 payload 误判为 MISMATCH 并错误排除 eligible items
|
|
252
|
+
- backend-test 支持 evidence-only 元用例:Markdown 显式声明 `脚本/primary symbol=无` 且仅绑定 assertion/cross-cutting TP 时,不再强制 1:1 pytest 符号,也不再把其算作 MISSING_PYTEST/SCRIPT_MISMATCH
|
|
253
|
+
- generated pytest 内的 `ScopeMismatch`/setup fixture 失败若完全归因于 `testcase/**` 映射脚本,则归为 REPAIRABLE 并进入唯一一轮 collection repair,不再直接 BLOCKED
|
|
254
|
+
- scenario-param 观测跳过 `pytest.param("TP-...", value, id="TP-...")` 的前导 TP 标签,并支持长度意图用数字位置参数表达
|
|
255
|
+
|
|
256
|
+
### 修复
|
|
257
|
+
|
|
258
|
+
- 修复 readiness 错误信息截断与无效 Coverage Matrix 状态语义,避免超长错误或 advisory 矩阵状态误阻断后续节点
|
|
259
|
+
- 修复 scenario 排除项未绑定 payload 字段、request-level 不确定性被误升级为硬失败的问题
|
|
260
|
+
|
|
261
|
+
## [0.33.6-beta.0] - 2026-08-11
|
|
262
|
+
|
|
263
|
+
### 修复
|
|
264
|
+
|
|
265
|
+
- 修复 backend-test correspondence scanner 将下一 Case 的分隔注释误归入前一个 pytest function region,造成虚假的 `MULTIPLE_PYTEST`、script mismatch 和额外 Test Point;现在按函数实际缩进边界隔离 body,并只从精确 `Case-ID:` 元数据或 primary symbol 绑定 Case
|
|
266
|
+
- 修复 backend-test 将 README 其他区域的 Markdown 链接误提取为业务模块、允许 `a401606` 等 opaque/hash-like stem 和异常多模块进入 map 的问题;现在只解析唯一 `## Module Index`,非法、mixed 或超过 8 个模块时 README-only 有界重试并由 manifest fail-closed
|
|
267
|
+
- 修复 backend-test map 总 token 预算耗尽后只生成部分 Markdown/pytest 资产但 parent 仍可能显示成功的问题;budget-blocked child 现在使 backend map 明确 ERROR,并保留 expected/finished/blocked/token 事实
|
|
268
|
+
|
|
342
269
|
## [0.33.6] - 2026-08-11
|
|
343
270
|
|
|
344
271
|
### 重点更新
|
package/README.md
CHANGED
|
@@ -110,7 +110,7 @@ agent-worker console doctor --repo .
|
|
|
110
110
|
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
-
访问 Console <http://127.0.0.1:8790/>;**Operator Chat Official** 是 Console
|
|
113
|
+
访问 Console <http://127.0.0.1:8790/>;**Operator Chat Official** 是 Console 内的主引导交互。构建时设置 `VITE_OPERATOR_CHAT_DEFAULT_LANDING=chat` 可将 Chat 作为默认 landing;flag 未开启时仍默认进入 Tasks,旧 Task Ops tab 始终保留。顶部「检视」以及 `/inspect/` 提供只读 Dashboard、DAG、时间线与 artifacts;`loop-agent …` / `agent-worker …` CLI direct path 仍是受治理 fallback。当前状态为 **code ready, dogfood pending/unmet**,不宣称已替代 openCode 或其他外部主会话。
|
|
114
114
|
|
|
115
115
|
## 核心边界
|
|
116
116
|
|
package/bin/loop-agent.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { existsSync
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
5
|
|
|
@@ -13,42 +13,6 @@ if (!existsSync(cliEntry)) {
|
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
/**
|
|
17
|
-
* Stale-dist guard: when running from a source checkout (src/ present), refuse
|
|
18
|
-
* to silently execute a dist/ that predates the latest source edit. The
|
|
19
|
-
* classic failure mode is editing src/** and running the bin without
|
|
20
|
-
* `npm run build`, which executes the previous build. Suppress with
|
|
21
|
-
* --ignore-stale-dist when intentionally running a stale build.
|
|
22
|
-
*/
|
|
23
|
-
const srcDir = join(packageRoot, "src");
|
|
24
|
-
const ignoreStale = process.argv.includes("--ignore-stale-dist");
|
|
25
|
-
if (ignoreStale) {
|
|
26
|
-
process.argv = process.argv.filter((arg) => arg !== "--ignore-stale-dist");
|
|
27
|
-
}
|
|
28
|
-
if (!ignoreStale && existsSync(srcDir)) {
|
|
29
|
-
const distCliMtime = statSync(cliEntry).mtimeMs;
|
|
30
|
-
let newestSrcMtime = 0;
|
|
31
|
-
const walk = (dir) => {
|
|
32
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
33
|
-
const full = join(dir, entry.name);
|
|
34
|
-
if (entry.isDirectory()) {
|
|
35
|
-
walk(full);
|
|
36
|
-
} else {
|
|
37
|
-
const mtime = statSync(full).mtimeMs;
|
|
38
|
-
if (mtime > newestSrcMtime) newestSrcMtime = mtime;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
walk(srcDir);
|
|
43
|
-
if (newestSrcMtime > distCliMtime) {
|
|
44
|
-
console.error(
|
|
45
|
-
`loop-agent: dist/ is stale relative to src/ (a source file is newer than ${cliEntry}).\n` +
|
|
46
|
-
` Run \`npm run build\` before using the bin, or pass --ignore-stale-dist to run the stale build intentionally.`,
|
|
47
|
-
);
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
16
|
try {
|
|
53
17
|
await import(pathToFileURL(cliEntry).href);
|
|
54
18
|
} catch (error) {
|
|
@@ -1045,7 +1045,6 @@ export async function advanceTaskLifecycle(input) {
|
|
|
1045
1045
|
cwd: input.repoRoot,
|
|
1046
1046
|
initOnly: false,
|
|
1047
1047
|
dryRun: false,
|
|
1048
|
-
...(input.observer ? { observer: input.observer } : {}),
|
|
1049
1048
|
...(input.maxConcurrent !== undefined
|
|
1050
1049
|
? { maxConcurrent: input.maxConcurrent }
|
|
1051
1050
|
: {}),
|
|
@@ -396,21 +396,6 @@ function deriveNextFromSnapshot(input) {
|
|
|
396
396
|
command: `loop-agent task status ${input.taskId} --json`,
|
|
397
397
|
};
|
|
398
398
|
}
|
|
399
|
-
if (input.lifecycleState === "run-failed" && !input.gate) {
|
|
400
|
-
// Terminal failed run without an open gate: task advance cannot make
|
|
401
|
-
// progress on a terminal run state (no determinate no-progress loop).
|
|
402
|
-
// Point the operator at external recovery diagnostics instead.
|
|
403
|
-
return {
|
|
404
|
-
kind: "external-action",
|
|
405
|
-
description: "The latest DAG run failed and is terminal; task advance cannot progress it. Read the run report (loop-agent dag report --run-id <runId> --json), then follow the recovery guidance (eligible node rerun / same-task recovery) or fix the root cause before advancing.",
|
|
406
|
-
};
|
|
407
|
-
}
|
|
408
|
-
if (input.lifecycleState === "run-succeeded" && !input.gate) {
|
|
409
|
-
return {
|
|
410
|
-
kind: "external-action",
|
|
411
|
-
description: "The latest DAG run succeeded; task advance cannot progress it. Run promotion/closeout via the lifecycle closeout path or archive the task.",
|
|
412
|
-
};
|
|
413
|
-
}
|
|
414
399
|
return {
|
|
415
400
|
kind: "advance",
|
|
416
401
|
command: `loop-agent task advance ${input.taskId} --json`,
|
|
@@ -229,21 +229,6 @@ function deriveNext(snapshot, gate, approveGate) {
|
|
|
229
229
|
if (snapshot.lifecycleState === "evidence-closed") {
|
|
230
230
|
return { kind: "none" };
|
|
231
231
|
}
|
|
232
|
-
// Keep planner semantics aligned with observe (AC-001): a terminal failed
|
|
233
|
-
// run without an open gate must not recommend task advance — advance cannot
|
|
234
|
-
// progress a terminal run state.
|
|
235
|
-
if (snapshot.lifecycleState === "run-failed" && !gate) {
|
|
236
|
-
return {
|
|
237
|
-
kind: "external-action",
|
|
238
|
-
description: "The latest DAG run failed and is terminal; task advance cannot progress it. Read the run report (loop-agent dag report --run-id <runId> --json), then follow the recovery guidance (eligible node rerun / same-task recovery) or fix the root cause before advancing.",
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
if (snapshot.lifecycleState === "run-succeeded" && !gate) {
|
|
242
|
-
return {
|
|
243
|
-
kind: "external-action",
|
|
244
|
-
description: "The latest DAG run succeeded; task advance cannot progress it. Run promotion/closeout via the lifecycle closeout path or archive the task.",
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
232
|
return {
|
|
248
233
|
kind: "advance",
|
|
249
234
|
command: `loop-agent task advance ${snapshot.taskId} --json`,
|
|
@@ -32,7 +32,6 @@ import { runDagApprove } from "../commands/dag-approve.js";
|
|
|
32
32
|
import { runDagReject } from "../commands/dag-reject.js";
|
|
33
33
|
import { runDagReconcileTasks } from "../commands/dag-reconcile-tasks.js";
|
|
34
34
|
import { runDagReconcileRun } from "../commands/dag-reconcile-run.js";
|
|
35
|
-
import { runDagRequestInterrupt } from "../commands/dag-request-interrupt.js";
|
|
36
35
|
import { runDagRerunTask } from "../commands/dag-rerun-task.js";
|
|
37
36
|
import { runDagRerun } from "../commands/dag-rerun.js";
|
|
38
37
|
import { runDagResume } from "../commands/dag-resume.js";
|
|
@@ -130,7 +129,6 @@ const DAG_SUBCOMMANDS = [
|
|
|
130
129
|
"report",
|
|
131
130
|
"closeout-draft",
|
|
132
131
|
"reconcile-run",
|
|
133
|
-
"request-interrupt",
|
|
134
132
|
"rerun",
|
|
135
133
|
"rerun-task",
|
|
136
134
|
"reconcile-tasks",
|
|
@@ -551,11 +549,6 @@ export const COMMAND_DEFINITIONS = [
|
|
|
551
549
|
await runDagReconcileRun(repoRoot, reconcileRunArgs);
|
|
552
550
|
return;
|
|
553
551
|
}
|
|
554
|
-
if (subcommand === "request-interrupt") {
|
|
555
|
-
const interruptArgs = rest.filter((arg) => Boolean(arg));
|
|
556
|
-
await runDagRequestInterrupt(repoRoot, interruptArgs);
|
|
557
|
-
return;
|
|
558
|
-
}
|
|
559
552
|
if (subcommand === "rerun") {
|
|
560
553
|
const rerunArgs = rest.filter((arg) => Boolean(arg));
|
|
561
554
|
await runDagRerun(repoRoot, rerunArgs);
|
package/dist/cli/program.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
3
|
import { Command } from "commander";
|
|
4
|
-
import {
|
|
4
|
+
import { readPackageVersion } from "../shared/package-metadata.js";
|
|
5
5
|
import { resolveAdapter } from "../adapters/index.js";
|
|
6
6
|
import { runCoverageAudit } from "../commands/coverage-audit.js";
|
|
7
7
|
import { runCoverageReport } from "../commands/coverage-report.js";
|
|
@@ -11,7 +11,6 @@ import { runDagFinalVerification } from "../commands/dag-final-verification.js";
|
|
|
11
11
|
import { runDagInitHybrid } from "../commands/dag-init-hybrid.js";
|
|
12
12
|
import { runDagReconcileTasks } from "../commands/dag-reconcile-tasks.js";
|
|
13
13
|
import { runDagReconcileRun } from "../commands/dag-reconcile-run.js";
|
|
14
|
-
import { runDagRequestInterrupt } from "../commands/dag-request-interrupt.js";
|
|
15
14
|
import { runDagRerunTask } from "../commands/dag-rerun-task.js";
|
|
16
15
|
import { runDagRerun } from "../commands/dag-rerun.js";
|
|
17
16
|
import { runDagReject } from "../commands/dag-reject.js";
|
|
@@ -332,9 +331,6 @@ async function runDagAction(repoRoot, subcommand, rest) {
|
|
|
332
331
|
case "reconcile-run":
|
|
333
332
|
await runDagReconcileRun(repoRoot, args);
|
|
334
333
|
return;
|
|
335
|
-
case "request-interrupt":
|
|
336
|
-
await runDagRequestInterrupt(repoRoot, args);
|
|
337
|
-
return;
|
|
338
334
|
case "rerun":
|
|
339
335
|
await runDagRerun(repoRoot, args);
|
|
340
336
|
return;
|
|
@@ -360,7 +356,7 @@ async function runDagAction(repoRoot, subcommand, rest) {
|
|
|
360
356
|
throw new Error("usage: dag decision <inspect|validate> --run-id <id> [--node-id <node-id>]");
|
|
361
357
|
}
|
|
362
358
|
default:
|
|
363
|
-
throw new Error("usage: dag <init-hybrid|execute|validate|workflow-plan|workflow-validate|workflow-compile|approve|reject|resume|status|doctor|report|closeout-draft|reconcile-run|
|
|
359
|
+
throw new Error("usage: dag <init-hybrid|execute|validate|workflow-plan|workflow-validate|workflow-compile|approve|reject|resume|status|doctor|report|closeout-draft|reconcile-run|rerun|rerun-task|reconcile-tasks|final-verification|decision> ...");
|
|
364
360
|
}
|
|
365
361
|
}
|
|
366
362
|
function compactArgs(args) {
|
|
@@ -497,7 +493,6 @@ function addDagCommand(program, defaultRepoRoot) {
|
|
|
497
493
|
"report",
|
|
498
494
|
"closeout-draft",
|
|
499
495
|
"reconcile-run",
|
|
500
|
-
"request-interrupt",
|
|
501
496
|
"rerun",
|
|
502
497
|
"rerun-task",
|
|
503
498
|
"reconcile-tasks",
|
|
@@ -552,7 +547,7 @@ export function buildLoopAgentProgram(options) {
|
|
|
552
547
|
program
|
|
553
548
|
.name("loop-agent")
|
|
554
549
|
.description("Loop Agent task and DAG automation CLI")
|
|
555
|
-
.version(
|
|
550
|
+
.version(readPackageVersion(path.dirname(path.dirname(path.dirname(fileURLToPath(import.meta.url))))) ?? "0.0.0", "-V, --version", "display version")
|
|
556
551
|
.showHelpAfterError()
|
|
557
552
|
.option("--repo-root <path>", "repository root")
|
|
558
553
|
.option("--adapter <name>", "harness adapter name")
|