尧图精选

DeepSeek-Reasonix 桌面端“本轮结果“:回合级净变化统计与检查验证的完整实现解析

🕒 发布时间:2026/9/12 9:40:25 📁 来源:尧图网络
DeepSeek-Reasonix 桌面端本轮结果回合级净变化统计与检查验证的完整实现解析【免费下载链接】DeepSeek-ReasonixDeepSeek-native AI coding agent for your terminal. Engineered around prefix-cache stability — leave it running.项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Reasonix导读当一轮执行结束、模型在回答中声明已完成修改时用户凭什么相信它DeepSeek-Reasonix 桌面端在回答下方渲染的本轮结果Turn Results面板回答了这个问题它基于宿主在回合结束时冻结的检查点快照展示已确认的文件净变化与实际执行的检查状态并且明确区分已记录的检查与对整个任务完成度的评分。本文以 docs/TURN_RESULTS.zh-CN.md 为骨架结合仓库中的后端冻结逻辑internal/checkpoint/turn_changes.go、事件回执协议internal/eventwire/receipt.go与前端归约器desktop/frontend/src/lib/turnResult.ts等源码证据完整讲解该功能的语义设计、统计边界、实现兼容性策略与可复现的验证方法。什么是本轮结果一轮turn执行产生文件改动或检查记录后桌面端在回答下方显示本轮结果分别展示已确认的文件净变化只统计本回合内、由宿主冻结并校验过的真实差异实际检查状态只反映已记录在案的检查命令的执行结果。一个需要反复强调的设计前提是检查通过仅描述已记录的检查不是对整个任务完成度的评分。它回答的是这一轮具体动了哪些文件、跑过哪些验证命令而不是任务是否整体达成。这一界限从文档到源码一以贯之例如前端归约器在 desktop/frontend/src/lib/turnResult.ts 中将检查状态归纳为running | failed | interrupted | stale | passed | none | unknown七种其中stale过期与interrupted中断都是独立于通过/失败的状态正是为了让用户区分检查确实失败与检查没能干净地完成。三个只读入口结果卡片提供三类查看入口全部仅用于查看不执行、不重跑、不安排任何检查也不需要新增配置入口作用查看差异打开该轮结束时保存的差异快照patch而非对当前磁盘实时 diff查看检查详情展示命令、退出码、过期或中断状态以及可展开的完整日志当前工作区全部差异返回原有工作区视图查看包括其他轮次和外部修改在内的当前变化仅查看的语义在源码中有硬性保障Store.TurnChanges(turn)返回的是冻结结果frozen result其注释明确指出reading history never touches the workspace且返回值是与存储可变状态分离的克隆见 internal/checkpoint/turn_changes.go。也就是说无论用户怎么翻历史卡片都不会触发对工作区的任何写入或重算。差异查看净变化Net Change的精确语义查看差异是整个功能的核心。它展示的是该轮结束时保存的差异其统计规则值得逐条拆解因为它们直接决定了用户对数字的信任度同一文件多次修改只计一次以本轮首次捕获的内容为基线baseline后续修改与之对比最终呈现的是一份这一轮开始时 → 这一轮结束时的净差异而不是工具调用次数的加总改回原样不增加行数如果在轮内先增后删、最终回到基线该文件不会出现在净变化中用户原有的未提交修改属于基线用户在智能体介入前就存在的脏文件改动不会被算作智能体本轮新增的改动。这是净变化最容易被误解的一点——它统计的是本轮造成的净变化而非工作区相对 HEAD 的全部差异。上述语义在后端FreezeTurnChanges中通过前后快照对比实现每一轮捕获文件的前镜像before content与后镜像after fingerprint只有前后身份不一致CompareIdentity返回非空的文件才进入差异构建流程且只有本轮前不存在→本轮后存在Create、本轮前存在→本轮后不存在Delete或内容/模式变化Modify三种情形会被记录见 internal/checkpoint/turn_changes.go。如果前镜像与后镜像完全一致直接跳过不产生任何行数——这正是改回原样不增加行数的实现来源。二进制与权限变化不虚构行数二进制文件和仅权限mode变化的文件有独立标识不虚构行数Binary标记二进制文件经 internal/fileutil/encoding 的编码探测后判定ModeOnly标记内容相同但权限位变化的文件两者都在TurnFile结构体中独立存在见 internal/checkpoint/turn_changes.go此时Added/Removed行数不参与统计展示。移动rename文件沿用已有捕获机制记录的路径不额外推断重命名——也就是说移动不会被猜成删除 A 新建 B而是如实呈现捕获到的路径变化。检查详情命令、退出码与日志的可信来源查看检查详情展示的是宿主实际执行并记录的检查命令包括命令本身退出码exitCode过期stale或中断interrupted状态可展开的日志。其中验证中…状态有严格的门槛只有宿主识别为检查且已进入执行的命令才会显示。从协议层看检查记录以ReceiptVerification形式存在于回合回执中包含Command、Passed、Stale、Interrupted、ExitCode以及用于日志关联的ToolCallID与ToolResultID见 internal/eventwire/receipt.go。前端在归一化时会做防御性校验passed true (exitCode undefined || exitCode 0)才被认定为通过见 desktop/frontend/src/lib/turnResult.ts避免标记通过但退出码非零的矛盾数据被渲染。日志的稳定标识与供应商复用防护日志并非从模型输出里抓取而是从已有本地会话记录读取同时校验两把钥匙工具调用 IDtoolCallId轮次结束时关联的稳定消息 IDtoolResultId。这把稳定消息 ID的校验非常关键即使供应商provider后续复用了工具调用 ID旧卡片也不会读到新日志——因为消息 ID 不匹配。这从协议结构上杜绝了历史卡片内容被新轮次数据污染的竞态。来源有歧义、尚未产生或已被清理时界面会明确提示不可用如改动统计不可用检查信息不完整而不是显示成零改动或检查通过。日志单次显示上限为2 MiB仅保留末尾部分时会提示截断。这一上限与后端TurnChangesBudget 2 20即 2 MiB保持同一量级见 internal/checkpoint/turn_changes.go。统计范围与历史诚实面对未知部分统计的语义部分统计partial coverage表示无法可靠归属所有修改或内容超出了捕获及差异处理的大小限制。此时已确认的数量仍会显示未知部分不会通过 Git HEAD、工具调用次数或变更回执数量来猜测。这一原则在后端体现为Coverage三态complete/partial/unknown加Reasons原因列表。FreezeTurnChanges在遇到以下任一情况时都会把覆盖度降级为partial并记录原因见 internal/checkpoint/turn_changes.go 与 internal/checkpoint/checkpoint.go原因触发条件snapshot_unavailable快照载荷已过期或指纹缺失无法对比ownership_unknown无法确认文件是否由本轮写入前后身份缺失active_writer冻结时仍有活跃写入者无法独占屏障size_limit内容或补丁超出 2 MiB 预算file_unavailable捕获当前路径失败external_change后镜像指纹与轮内记录不一致外部修改result_not_saved持久化失败前端展示层同样维护三态turnChangeText在coverage unknown时显示改动未知coverage partial时在统计后追加部分统计标记见 desktop/frontend/src/lib/turnResult.ts并明确差异算法的近似计数不作为精确统计展示。历史卡片的冻结语义历史卡片保留当时的统计打开旧轮次不会按当前磁盘内容重新计算差异。这与Store.TurnChanges返回冻结克隆的实现完全一致——历史读取与当前工作区状态解耦因此若 checkpoint 详情已被清理摘要仍保留并提示详情不可用旧会话缺少结果元数据时显示改动统计不可用检查信息不完整不会显示成零改动或检查通过。换句话说UI 对没有数据与数据为零做了严格区分——前者如实告知缺失后者才表示确认没有变化。从normalizeTurnChanges的防御性归一化非法数字一律归零、非法 coverage 一律归unknown见 desktop/frontend/src/lib/turnResult.ts可以看出这种未知就是未知的语义在前端渲染管线里同样被强制执行。实现与兼容性在既有协议上做加法turn_done.receipt 的可选扩展宿主在既有的turn_done.receipt中增加可选的diff与检查来源字段使用既有的检查分类和执行策略模型提示词、工具 schema 和执行权限均保持不变。回执的协议结构见 internal/eventwire/receipt.go为type CompletionReceipt struct { Diff *checkpoint.TurnChanges json:diff,omitempty Interrupted bool json:interrupted,omitempty Verdict string json:verdict Changes []ReceiptChange json:changes,omitempty Verifications []ReceiptVerification json:verifications,omitempty Gaps []ReceiptGap json:gaps,omitempty Risks []string json:risks,omitempty }差异摘要包含轮次turn、不可变结果 IDid格式为{turn}:{timeUnixNano}见 internal/checkpoint/turn_changes.go、覆盖范围coverage、文件列表files以及增删行数added/removed。一个重要的传输约束事件和历史摘要不携带补丁正文patch。TurnChanges.Summary()会显式清空所有文件的Patch字段见 internal/checkpoint/turn_changes.go补丁只在需要时按需从存储中读取。这既控制了事件流的体积也避免补丁内容在历史重放中被反复复制。Checkpoint 冻结非阻塞写屏障 指纹校验Checkpoint 在本轮结束、下一轮尚不能开始的窗口内保存结果复用原有非阻塞写入屏障TryEnterExclusive并校验写入后的指纹若屏障未被占有!owned或仍有活跃写入者len(s.activeWriters) 0记录active_writer缺口不强行生成统计对每个文件先校验后镜像指纹CompareIdentity确认没有外部修改external_change再生成差异持久化失败会追加result_not_saved缺口见 internal/checkpoint/turn_changes.go。2 MiB 预算与磁盘预算每轮参与处理的内容与保留补丁共限 2 MiBTurnChangesBudget超出时文件以size_limit缺口标记补丁以(diff omitted: ...前缀省略并设置Uncounted/Unavailable见 internal/checkpoint/turn_changes.go差异算法的近似计数不作为精确统计展示结果沿用 checkpoint 的清理策略补丁元数据纳入磁盘预算——因此历史详情可能被清理但摘要保留。前端复用与隔离桌面端复用已有显示记录与持久事件重放不另起一套渲染体系结果卡通过共同的轮次投影放在回答之后并保留稳定组件 ID便于重放与更新定位会话、标签页和结果标识隔离延迟返回的差异与日志——切换会话后上一会话的迟到响应不会串入当前标签页这也是回归测试清单中切换会话后的迟到响应一项要验证的行为。验证方法从单元测试到可视化夹具回归测试覆盖清单回归测试覆盖以下场景可在 internal/checkpoint/turn_changes_test.go、internal/control/turn_result_test.go、internal/eventwire/turn_result_test.go 与 desktop/workspace_turn_changes_test.go 中继续深入多次修改的净变化、无变化、原有脏文件用户基线、删除、二进制、权限变化并发与外部写入、大小限制重新打开旧轮次、旧版本读取legacy 格式兼容中断和失败轮次、检查退出码、日志稳定标识历史显示重放、重复事件、并行检查切换会话后的迟到响应。可视化夹具/bench/turn-result.html在desktop/frontend运行pnpm dev然后按 Vite 输出的网址打开/bench/turn-result.html入口见 desktop/frontend/bench/turn-result.html。该页面使用真实的 Transcript、状态归约器reducer、结果面板和差异组件执行数据为模拟数据host stub见 desktop/frontend/bench/turn-result.tsx可切换场景成功、失败、未检查、过期stale、中断、执行中、部分统计、旧格式legacy、历史history并验证主题深浅色、窄面板280px/410px 宽度切换和数据清理模拟数据已清理按钮添加?transcriptRenderModewindowed可验证同一结果在窗口化列表中的显示。此页面截图用于证明界面与交互真实存储、指纹校验和控制层结束流程由独立后端测试证明——这是验证策略上的明确分工前端夹具证明长什么样、怎么交互后端测试证明数据从哪来、是否可信。小结本轮结果是 DeepSeek-Reasonix 桌面端把智能体的自我声明转化为宿主可验证事实的关键一环净变化语义基线、去重、回改归零、用户脏文件豁免保证了统计的归属性coverage 三态与缺口原因列表保证了统计的诚实性冻结快照 指纹校验 稳定消息 ID保证了历史数据的不可变性与隔离性而turn_done.receipt 的可选扩展与前端复用则保证了向后兼容——旧会话、旧格式在缺少元数据时如实降级提示而不会被误显示为零改动或检查通过。对使用者而言这套设计意味着看到已确认的净变化 N −M时可以确信它是本轮造成、经宿主校验的真实结果看到检查通过时可以确信它对应的是实际执行过的命令日志而任何无法确认的部分界面会明确地告诉你不知道而不是假装成没有。【免费下载链接】DeepSeek-ReasonixDeepSeek-native AI coding agent for your terminal. Engineered around prefix-cache stability — leave it running.项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Reasonix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →