@tea-agent/loop-agent 0.42.0-next.15 → 0.42.0-next.16

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 (32) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/application/task-lifecycle/advance.js +9 -4
  3. package/dist/build-stamp.json +3 -3
  4. package/dist/commands/task-source-prepare.js +3 -1
  5. package/dist/executors/dag-pi-executor.js +825 -65
  6. package/dist/executors/shell-executor.js +103 -35
  7. package/dist/shared/dag-failure-category.js +6 -0
  8. package/dist/task/contract/apply.js +36 -2
  9. package/dist/task/source-prepare/parse-intent.js +7 -0
  10. package/dist/workflows/dag/dag-retry-schema.js +3 -0
  11. package/dist/workflows/dag/frontend-design-policy.js +1 -1
  12. package/dist/workflows/dag/frontend-risk.js +2 -0
  13. package/dist/workflows/dag/frontend-shadow-dual-write.js +16 -1
  14. package/dist/workflows/dag/frontend-shape.js +16 -6
  15. package/dist/workflows/dag/frontend-test-execution-evidence.js +48 -0
  16. package/dist/workflows/dag/frontend-verification-trace.js +32 -0
  17. package/dist/workflows/dag/init-hybrid.js +9 -10
  18. package/dist/workflows/dag/node-execution.js +124 -72
  19. package/dist/workflows/dag/rerun-feedback.js +1 -0
  20. package/dist/workflows/dag/rerun-plan.js +90 -4
  21. package/dist/workflows/dag/rerun-run.js +7 -0
  22. package/dist/workflows/dag/retry-policy.js +16 -10
  23. package/dist/workflows/dag/runner-exit-diagnostics.js +125 -0
  24. package/dist/workflows/dag/runner.js +67 -7
  25. package/dist/workflows/dag/structured-output-repair.js +4 -1
  26. package/dist/workflows/dag/validate.js +10 -8
  27. package/dist/workflows/dag/workspace-checkpoint.js +66 -0
  28. package/docs/templates/agent-dag.schema.json +2 -2
  29. package/package.json +1 -1
  30. package/skills/frontend-plan/SKILL.md +6 -1
  31. package/skills/frontend-plan/references/decision-contract.md +69 -18
  32. package/skills/frontend-plan/references/design-decisions.md +32 -0
package/CHANGELOG.md CHANGED
@@ -11,6 +11,18 @@
11
11
 
12
12
  ### 改进
13
13
 
14
+ - DAG 退出诊断改用只读异常监视器,避免诊断逻辑改变宿主异常策略或中断其他并发 run 的取证;退出码使用实际 exit 事件参数。
15
+ - 前端分片 VT 归一化同步处理 `replaces` 引用,避免重试修正因分片前缀不同而无法覆盖旧事实。
16
+ - 强化 DAG 恢复与契约幂等:重跑计划不会复用 imported 节点读取的漂移输入、缺失/未完成节点,并且仅在 Git HEAD 相同、rename 与治理输入清单可完整判定时放行 scoped drift;`stopReason=length` 的 transport 别名可正确重试。契约 no-op 写入 request ledger 但不伪造事务,重复请求携带新 payload 会被拒绝,且 no-op prepare 不再无谓刷新 DAG。
17
+ - 修复契约重复 prepare 空转的问题(实测一次 8.6 小时的流水线里 7 次契约修订只有 3 个不同内容 hash,无内容变化的重复提交每次都走完整事务提交 → 契约投影 → DAG spec 生成 → strict validation → writeSet gate 审查):apply 现在做内容级 no-op 短路——投影结果与已记录契约及磁盘观测哈希完全一致时直接返回当前 ref,不递增 revision、不写日志化事务;writeSet gate digest 绑定 contractRevision+canonicalHash,hash 不变则已批准的 gate 继续有效,不再重复审批。磁盘漂移(observed ≠ ref)不走短路,仍是修复投影。
18
+ - 修复 workspace-drift 一刀切阻断 `dag rerun --from-node` 的问题:整指纹对比细化为内容级逐路径对比,漂移全部落在重跑子图自身 readSet/writeSet 内时放行(`workspace-drift-scoped`,重跑本就会重读/重写这些路径);其余情况(导入事实复用节点的输入漂移、无法判定路径的旧 checkpoint)保持严格阻断,高风险写者续跑路径维持整指纹严格判定不变。契约同 hash 重投影不再改写文件,与此叠加后恢复路径不再被无意义漂移阻断。
19
+ - superseded run 现在可作为 `dag rerun --from-node` 的事实供体:操作员取代的是 run 整体,其 FINISHED 只读上游节点(contract/scout 等)经既有导入机制继承,不再因父 run 被取代就强制全量重跑;writer 进重跑子图、决策门禁、未解决 ERROR 在闭包外等不安全场景各自的原有阻断不变。
20
+ - 修复前端 Plan coverage 会话提前停止导致会话数翻倍的问题(run 3 实测每会话平均仅 1.7 个 record 调用即写结论,把一个切片的活摊到两个会话):coverage 段指令与 COVERAGE BATCH 提示现在明确「切片穷尽才算完成」——本会话分配到的每个需求都必须有已提交的 coverage facts(verification targets 或 evidence gap)才能收尾,批量提交直至穷尽,提前停止会把剩余项拖成 MISSING-FACT 修复会话;MISSING-FACT 队列降级为校验兜底而非主要补齐机制。
21
+ - 修复前端 Plan 重试梯级遮蔽修复指令的问题:invalid-output / structured-output-truncated 的账本修复指引现在优先于 compact-terminal-first 等梯级话术。此前 length 失败把重试梯级单调升到 compact-terminal-first 后,后续 invalid-output 重试拿到的是「保持已提交账本完整」的档位指令,与「重提交修正后的 record_* facts」这一唯一治愈动作正面冲突,修复指引成为死代码;修复指引同步补上 duplicate/replace 语义(duplicate 收据是修正邀请而非禁令,replace=true 为同 id 全量替换,回填反向引用不属于重推导已提交事实)。`skills/frontend-plan` 新增跨段引用规则与 Bidirectional VT cross-reference invariant 小节:跨切片引用已提交 VT 时当场以同 id + replace=true 回填,双向引用在提交时即闭合,不再拖到 attempt 末尾的双向检查才暴露。
22
+ - 修复 DAG Pi 节点把 provider `stopReason=length` 的输出/上下文截断误判为 `empty-output` 失败的问题:仅 `empty-output` 基础上的长度截断会改判为专门的 `output-limit` 可重试类别(raw 类别保留诊断),已有精确修复指令的类别(output-too-large / invalid-output / protocol-invalid / structured-output-truncated / writer 类)原样保留,避免通用指令遮蔽任务专属修复提示;`output-limit` 通用增量指令(从已提交 typed facts 与现有工作区只补未完成部分、每个生成单元产出后立即校验格式并在当节点修复)作为兜底排在所有精确分支之后,前端规划梯级(compact-terminal-first 正是 length 场景的领域档位)与结构化冻结修复路径优先。只读/结构化/前端规划/后端测试补全策略的默认重试额度从 3 次提升到 5 次;旧 artifact 中的 `writer-thinking-exhausted` / `planner-thinking-exhausted` 终态标签仅作历史保留(Console/报告展示映射同步归入 executor 容量类),新执行不再产生。
23
+ - 前端 Scout 在中高复杂度任务中并行收集 target surface 与 design evidence;大型 Plan 将 requirement coverage 按批次并行映射,再按固定顺序归并到唯一 reducer,保持 Contract → Scout → Plan 依赖与确定性终态,同时缩短最长串行等待。
24
+ - 前端 Verify bundle 会在同一次执行中按工作目录和冻结命令去重:static、behavior、Mock、lint lane 复用相同命令结果,同时为每个 lane 保留独立证据,避免重复启动耗时的 typecheck/test/build 进程。
25
+ - 前端 Micro/Small shape 路由不再把 `test/`、`e2e/`、`docs/` 等验证或文档根目录误计为业务跨域;`src/**` + `test/**` 的局部 UI 改动现在可以正确命中轻量拓扑,真实跨包路径仍保持升级。
14
26
  - 修复前端 Plan 漏读独立行为证据、重试丢失已重新录入的 UX 名称的问题;必交付文件改由 Contract 显式声明并绑定原始来源,避免把允许修改或参考路径误判为交付义务。缺失交付物和 UX 名称冲突现在可在 Plan 提交前发现并修正,发布 schema 同步支持组件覆盖与复用证据字段。
15
27
  - 修复前端 DAG 的 Plan 按 AC 分片重复发明同一批需求、交互和 UI 状态的问题:Contract 的 canonical requirement 文本与来源片段改由 runtime 从冻结 ledger 写入,Plan 先基于全部需求提交一次全局 UX registry,再在单一全局 UX 会话中建模组件、状态和交互;来源声明的 UI 状态必须完整闭合,复用既有组件必须提供真实存在的文件证据,交付文件完整性与逐状态/交互组件覆盖由确定性 gate 校验。
16
28
  - 修复顶部一级「观测」入口被恢复工作区残留的 DAG 或上次观测对象劫持的问题:现在点击该入口始终回到当前 Workspace 的运行总览,具体 DAG 仍通过「全屏观测」等显式入口打开。
@@ -842,13 +842,18 @@ export async function advanceTaskLifecycle(input) {
842
842
  break;
843
843
  }
844
844
  preparedContractThisCall = true;
845
- if (startupRepairAction ||
846
- refreshManagedContractThisCall ||
847
- input.fromDraftPath) {
845
+ const contractChanged = prepareResult.apply?.noOp !== true;
846
+ if (contractChanged &&
847
+ (startupRepairAction ||
848
+ refreshManagedContractThisCall ||
849
+ Boolean(input.fromDraftPath))) {
848
850
  // The old DAG and gate were bound to the pre-mutation contract.
849
- refreshManagedContractThisCall = false;
850
851
  regenerateDagThisCall = true;
851
852
  }
853
+ // Consume the refresh request even when projection was a content no-op;
854
+ // otherwise the re-plan would invoke prepare-contract repeatedly in this
855
+ // advance call and eventually hit the step limit.
856
+ refreshManagedContractThisCall = false;
852
857
  record = {
853
858
  ...appendTransition(record, "contract-managed"),
854
859
  pendingPrdRefresh: false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.42.0-next.15",
4
- "gitSha": "24307deeb4a0504439576bc846a9ee4cc3d30e55",
5
- "builtAt": "2026-09-05T09:48:22.747Z"
3
+ "version": "0.42.0-next.16",
4
+ "gitSha": "6b1f979e6267e8c74d6022d7671fe4875e083c04",
5
+ "builtAt": "2026-09-06T12:19:37.563Z"
6
6
  }
@@ -373,7 +373,9 @@ function printHuman(result) {
373
373
  }
374
374
  }
375
375
  if (result.apply) {
376
- lines.push(` apply: revision=${result.apply.ref.revision} txId=${result.apply.txId}`);
376
+ lines.push(result.apply.noOp
377
+ ? ` apply: revision=${result.apply.ref.revision} (unchanged; identical content, no new transaction)`
378
+ : ` apply: revision=${result.apply.ref.revision} txId=${result.apply.txId ?? "n/a"}`);
377
379
  }
378
380
  if (result.error) {
379
381
  lines.push(` error: ${result.error.code}: ${result.error.message}`);