Files
deepseek-harness/.agents/notes/implemented/bug-fix/2026-07-20-code-mode-result-card-completeness.zh.md
T
2026-07-21 18:38:22 +08:00

3.5 KiB

Agent Note: 保证 Code Mode 结果卡片内容完整

Status: implemented

English | 中文

问题

外层 run_code 工具会持久化完整的渲染内容,但编辑器的卡片展示逻辑忽略了这些内容,转而根据仅含日志的 presentationMeta 投影重新构建卡片正文。仅有结果的运行看似正确,是因为展示逻辑未提供正文时,ACP 和 TUI 会回退到 tool/result.content。只要程序输出一条日志,展示逻辑就会提供非空内容,回退随即停止,返回值便会从完成态卡片中消失。当已捕获的日志使陈旧投影变为非空时,输出落盘策略最终生成的头尾预览也会受到同一职责拆分的影响。

嵌套 Code 调用从不生成自己的卡片。因此,仅仅为了重建这一张不完整卡片而给外层调用生成元数据,还掩盖了每次外层调用只生成一张卡片的预期边界。

决策

run_code 输出渲染器继续作为面向模型的外层内容的唯一所有者。它先渲染已捕获的日志,然后渲染返回值、显式的无输出标记,或规范工具流水线生成的失败内容。Post-execute 策略与输出落盘机制可以在内容持久化之前替换它。

run_code.presentResult 会把最终的 result.content 转交给一张通用结果卡片。它有意省略标题,使待完成卡片保留程序文本。多余的仅含日志的 presentationMeta 投影被移除:tool/result.content 是持久、可回放且经过 post-policy 处理的投影,也是卡片中结果内容的唯一来源。

嵌套分发保持不变。带有 exec.parent 标记的调用会发出有界的 tool/code-dispatch 诊断,但不会生成与 tool/call 或 tool/result 对应的界面卡片,因此一次外层 run_code 调用仍然只会生成一张卡片。

测试

展示逻辑的单元测试覆盖仅有日志、仅有结果、日志与结果并存、无输出和结果落盘时的内容。另一个具有集成测试形态的单元测试会触发真实的运行时失败,先让它经过规范注册表形成结果,再交给展示逻辑。成功场景证明陈旧元数据无法替换最终内容;失败场景则保护内容的完整转发,同时不声称它复现了最初由元数据触发的缺陷。

无密钥的 ACP 与 TUI Code Mode 快照会执行一个外层程序:程序进行两次嵌套 bash 调用,记录 captured output,并返回 CODE_ONE+CODE_TWO。两个界面都只显示一张完成态外层卡片,其中包含这两行内容,且没有嵌套卡片。

备选方案

**把返回值追加到日志元数据:**不予采纳。元数据会与渲染器重复,并且需要为每一种 JSON 根另行维护稳定的格式化契约;post-policy 内容替换或输出落盘预览仍然会被遗漏。

**把展示元数据与 result.content 合并:**不予采纳。渲染内容已经包含日志;合并会造成重复,还需要依赖脆弱的去重逻辑。

**为每次嵌套分发创建一张卡片:**不予采纳。中间值有意只存在于执行期间,永远不面向模型。多张卡片会暴露实现轨迹,而不是模型与用户调用的单次 Code Mode 操作。

影响

ACP 和 TUI 会显示模型接收、回放持久化的同一份完整内容,其中包括 post-policy 输出落盘预览。新的 run_code 结果不再携带可选的日志元数据,但无需提升会话格式版本:展示逻辑会忽略该字段并读取记录中持久化的渲染内容,因此现有记录仍然有效。