对决与实测特辑 · Ep1DEEP DIVE
DeepSeek Harness 对决 Claude Code:12 场统一模型实测的完整数据与方法
视频版:B站 公开投稿中无对应视频(已核对全部 16 个投稿) 视频总览 →
本期要点POINTS
本期要点
关键实测数据DATA
关键实测数据
| 被测项 | 指标 | 值 | 实测日期 | 原始记录 |
|---|---|---|---|---|
| dsh(DeepSeek Harness) | t1 修 bug 耗时(两轮均值) | 164 s | 2026-09-08 | 原始记录 ↗ |
| Claude Code | t1 修 bug 耗时(两轮均值) | 129 s | 2026-09-08 | 原始记录 ↗ |
| dsh(DeepSeek Harness) | t2 加功能 耗时(两轮均值) | 351 s | 2026-09-08 | 原始记录 ↗ |
| Claude Code | t2 加功能 耗时(两轮均值) | 239 s | 2026-09-08 | 原始记录 ↗ |
| dsh(DeepSeek Harness) | t3 大面重构 耗时(两轮均值) | 76 s | 2026-09-08 | 原始记录 ↗ |
| Claude Code | t3 大面重构 耗时(两轮均值) | 88 s | 2026-09-08 | 原始记录 ↗ |
| dsh + Claude Code(统一模型正式轮) | 完成率(12 场正式轮) | 12/12 PASS、零违规 | 2026-09-08 | 原始记录 ↗ |
| dsh(DeepSeek Harness) | t1 修 bug 两轮波动幅度 | 160 % | 2026-09-08 | 原始记录 ↗ |
| Claude Code | t1 修 bug 两轮波动幅度 | 11 % | 2026-09-08 | 原始记录 ↗ |
| dsh(DeepSeek Harness) | t2 加功能 两轮波动幅度 | 74 % | 2026-09-08 | 原始记录 ↗ |
口径:本地与云不混评(每条读数标了运行环境,两边数字不放在一起比); 一行 = 一条可核读数;论文与第三方数字不进本表(见上方来源表)。 「原始记录」指向公开仓 cnopens/ruiowl-evidence 的固定链接(带 commit SHA,防漂移);标「未收录」者为本地从未留存原始数据文件,不补造。
锐Owl · 工具对决特辑(出圈期独立篇,不占系列号)· 全局期号 ep14 数据:2026-09-08 晚 23:15–23:52 统一模型正式轮,12 场全部可查
preflight/results/立场:本文结论落在「谁适合什么活」,不做「谁秒杀谁」的叙事
开篇:为什么要打这一场
两个编程 Agent 工具,都真实地待在我们的工作流里。
一个是 DeepSeek Harness(下称 dsh)——我们连着解构了四期的开源 harness:从协议到内核、Skill 机制、热卸载、类型生成的协议同步。另一个是 Claude Code——日常写代码用得最多、最顺手的那个。
用人话说就是:一个我们懂它的里子,一个我们用它的顺手。那问题自然就来了——同样的活,到底该交给谁?
这个问题最诚实的回答方式是:别猜,测。但「测」这个字里藏着评测最常见的坑——变量没控制住,测出来的东西根本不对应你想问的问题。这篇文章把方法和数据一次性摊开:我们怎么控制变量、三道题长什么样、12 场每一场的数字,以及这些数字里哪些能信、哪些只能当方向。
一、方法:把变量砍到只剩「工具」
1.1 第一次跑就翻车:双变量
第一轮预跑,我们让两个工具各跑各的默认配置——结果发现一个致命问题:
Claude Code 背后挂的是 MiniMax M3,而 dsh 用的是 DeepSeek。 任务一样、仓库一样,但底层模型是两个。这样一来,跑出来的耗时差异里混着两个变量:工具的差异 + 模型的差异。谁快谁慢,说不清是谁的功劳。
这不是小瑕疵,这是方法论级别的错误。就像测两款跑鞋谁更快,结果一个穿鞋的人还额外背了个包——成绩单不能这么出。
用户当场拍板:统一模型重跑。理由是评测的底线——模型和工具必须拆开,否则测的不是工具。[6]
1.2 统一模型是怎么落地的
把两边都切到同一个模型 DeepSeek V4 Flash,具体做法值得记一笔:
- dsh 侧:走 headless 配置,实测所用模型即 deepseek-v4-flash(可从 session 日志核验)。
- Claude Code 侧:经 DeepSeek 提供的 Anthropic 兼容端点(
api.deepseek.com/anthropic)接入同一模型。实现上由评测脚本在运行时生成一份临时 settings 注入,跑完即弃——不污染我们日常~/.claude/settings.json里的 MiniMax 配置。[1][3]
这一点很重要:评测环境的改动是隔离的,评测结束,日常工具链原样不动。
1.3 四条规则
| # | 规则 | 说明 |
|---|---|---|
| 1 | 同一份任务仓库 | 全部为锐Owl 自制的中立项目,不含任何指向 dsh / Claude / Anthropic / DeepSeek 的痕迹 |
| 2 | 同一句话描述 | 双方收到任务文字逐字一致,不加任何提示 |
| 3 | 全程无人工介入 | dsh 走 --profile headless,claude 走 -p,无头自动执行,过程中不救场、不追问 |
| 4 | ABBA 两轮取均值 | 每个任务按 A-B-B-A 顺序各跑两轮,抵消模型随机性;两轮结果都记录,不只取好看的那次 |
← 表格可左右滑动查看
超时上限 60 分钟,超时记「未完成」——单列,不算失败,也不隐藏。[3]
1.4 判据是硬性的,不是「看着差不多」
每一场的通过与否,由机器判据裁决,不由人看着觉得「应该可以」:
- 测试全绿:t1 是 11 个测试全过;t2 是 pytest 基线 + 新增测试全绿,外加
--help展示与手工样例验收;t3 是 build + test 双通过。 - 禁止改测试:git diff 检查测试文件零改动——否则「把测试删掉让它绿」这种作弊路径就算开了。
- 零残留:t3 用
grep -r "ConfigLoader"全仓验证旧名零命中。 - 无新增依赖:不允许靠装新包绕过题目。
四项违规任意触发,当场记违规。本次 12 场:零违规。[1][2]
1.5 公平性自查(开跑前做的功课)
- 任务仓库全部自制,与两个工具生态无关;
- 每个工具各 clone 一份独立仓库,无共享状态,不存在「先跑方泄题」;
- 难度先校准:起草人先各跑通一遍,太易/太难就换题;
- 交叉顺序 ABBA,两轮取均值而非取最小。
二、三道题:覆盖日常开发的三类活
| 任务 | 类型 | 仓库 | 规模 | 核心考点 |
|---|---|---|---|---|
| t1 | 修 bug | TypeScript/Node 发票金额计算服务 | ~400 行,11 个测试 4 个红 | 信测试还是信文档 |
| t2 | 加功能 + 补测试 | Python 日志分析 CLI | ~300 行 | 需求完整性 + 不破坏存量 |
| t3 | 跨文件重构 | TypeScript 配置加载库 | ~20 个源文件互相引用,112 处引用待改 | 机械大面替换 + 零残留 |
← 表格可左右滑动查看
2.1 t1 修 bug:埋了一个「文档陷阱」
仓库里 11 个测试挂了 4 个。原始的坑是折扣计算顺序错(先折扣后税 vs 先税后折扣)、汇率换算用错方向。
但真正的考点在另一个地方:README 里写着的「预期行为」和测试是矛盾的。一个 agent 是信文档还是信测试,这一题会把它暴露出来。[3]
任务文字就是一句话:修复代码让所有测试通过,不许改测试、不许改 package.json。
2.2 t2 加功能:题目本身就是一份规格书
给日志分析 CLI 新增 dedupe 子命令:
按「时间戳(精确到秒,忽略毫秒)+ 级别 + 消息前 50 字符」去重相邻重复行(同秒内的日志风暴视为重复),支持
--keep first|last(重复组保留首行/末行)和-o输出文件;实现后自行补测试并确保 pytest 全绿;可改 CLI 结构但不得破坏 parse/stats 的既有行为。
这一题考的是「需求理解的完整度」——多参数、多分支、还要不动存量,属于典型的日常迭代活。[3]
2.3 t3 大面重构:112 处引用的机械战
配置加载库的核心类 ConfigLoader 重命名为 ConfigSource:类定义、所有 import/export、类型声明、README 全都要改,全仓 grep 零残留,build 与测试必须通过,行为逻辑不许变。
这题拼的不是智力,是耐力和细致——所以它最能看出一个工具在「机械大面执行」上的效率。[3]
三、12 场全量成绩
3.1 每一场(R1/R2 明细,不做挑选)
| 任务 | 工具 | R1 | R2 | 均值 | 结果 |
|---|---|---|---|---|---|
| t1 修 bug | Claude Code | 122s | 136s | 129s | ✅✅ |
| t1 修 bug | dsh | 91s | 237s | 164s | ✅✅ |
| t2 加功能 | Claude Code | 255s | 223s | 239s | ✅✅ |
| t2 加功能 | dsh | 256s | 446s | 351s | ✅✅ |
| t3 重构 | Claude Code | 106s | 70s | 88s | ✅✅ |
| t3 重构 | dsh | 70s | 81s | 76s | ✅✅ |
← 表格可左右滑动查看
3.2 均值对比
| 任务 | dsh | Claude Code | 倍率 | 胜方 |
|---|---|---|---|---|
| t1 修 bug | 164s | 129s | 1.27× | Claude Code |
| t2 加功能 | 351s | 239s | 1.47× | Claude Code(两轮都赢) |
| t3 大面重构 | 76s | 88s | 1.16×(dsh 快) | dsh(两轮都赢) |
← 表格可左右滑动查看
3.3 完成率:双百
12 场全部 PASS,零违规。 两个工具都识破了 t1 的文档陷阱,都完整实现了 t2 的多参数需求,都做到了 t3 的零残留。
先把这句话放前面——真正的差异不在「能不能干完」。两个工具都能干完,而且干得干净。差异在别的地方:速度和稳定性。[1]
四、比速度更重要的是稳定性
均值会骗人。同样一个「均值 164 秒」,可能是「91 秒和 237 秒」,也可能是「160 秒和 168 秒」——这是两种完全不同的工具性格。
| 任务 | 工具 | 两轮跨度 | 波动幅度 |
|---|---|---|---|
| t1 | dsh | 91 ↔ 237s | 160% |
| t1 | Claude Code | 122 ↔ 136s | 11% |
| t2 | dsh | 256 ↔ 446s | 74% |
| t2 | Claude Code | 223 ↔ 255s | 14% |
| t3 | dsh | 70 ↔ 81s | 16% |
| t3 | Claude Code | 70 ↔ 106s | 51% |
← 表格可左右滑动查看
读这张表要诚实,两边的话都要说:
- dsh:上限高,方差大。 t1 一轮 91 秒(全场最快之一),另一轮 237 秒;t2 一轮 256 秒,另一轮 446 秒。快的轮次它可以很快,但同时它可能突然慢下来——在需要来回读代码、小步验证的任务上尤其明显。
- Claude Code:稳定地快。 t1、t2 两轮波动都在 14% 以内,几乎不受随机性影响。
- 但也别把「稳定」说满:t3 重构那局,Claude Code 两轮跑出 106 秒和 70 秒,波动也有 51%。所以准确的说法是:日常迭代类任务上 Claude Code 更稳,而不是「Claude Code 从不波动」。
样本声明:每格 N=2,1.1×–1.5× 的差距在这么小的样本上不足以定论。本文所有结论当方向,不当真理。
五、跨模型对照:一个只作背景的参考
同一批任务,我们在早前一轮里用 Claude Code 的默认模型(MiniMax M3)也跑过一次。把它和统一模型轮放一起看,能说明为什么「混模型对比」不可信:
| 任务 | Claude Code @ MiniMax M3 | Claude Code @ DeepSeek V4 Flash |
|---|---|---|
| t1 修 bug | 52.5s | 129s |
| t2 加功能 | 92s | 239s |
| t3 重构 | 138s | 88s |
← 表格可左右滑动查看
同一个工具、同样的题,只换了背后的模型——t2 差了 2.6 倍,t3 反过来快了 1.6 倍。模型对任务类型的敏感度,比工具之间的差距还大。
这正是第一轮「双变量」结果被我们整轮作废、重新对齐模型的原因。这张表只作背景参考,不参与任何主结论。[3]
六、结论:不是谁强,是谁适合什么活
| 活 | 更合适 | 依据 |
|---|---|---|
| 修 bug、加功能这类日常迭代(来回读代码、小步验证) | Claude Code | 1.27× / 1.47×,且波动 ≤14% |
| 一次性的大面机械重构(改名、搬家、批量替换) | dsh | 1.16×,两轮都赢 |
| 完成能力本身 | 平手 | 12/12 PASS、零违规 |
← 表格可左右滑动查看
这些数字最终要落到我们自己的用法上,不然评测就白做了:
- 日常的活维持现状——修 bug、加功能、小步迭代,继续交给 Claude Code,它的稳定就是效率。
- 真实的大项目重构,把 dsh 正式加进工作流——不在测试台上比完就完。接下来我们自己的大项目重构会真用 dsh 干一遍,拿真项目验证这里的结论。这是评测唯一该服务的东西:决策。
工具没有全能王——上限高的未必稳,稳的未必适合大面机械活。把合适的工具放到合适的活上,效率才是衡量标准。
七、局限与复现
必须说清楚的边界:
- N=2。每个任务每工具两轮,样本小,只当方向。
- 单机环境。全部跑在同一台机器、同一时段(9-8 晚 23:15–23:52),网络与机器负载的影响未单独剥离。
- 三类任务。修 bug / 加功能 / 重构,覆盖常见开发活,但不含长周期、多会话、跨仓库的大工程。
- 终态判据。只验终态(测试是否全绿、是否零残留),未采集过程指标(首轮验收、产物 diff 行数)——「怎么干完的」这一层本文没有数据。
- 可复现:全部 12 份 JSON 结果、执行日志、任务规格都在本期目录
preflight/下,数字逐条可查。
数据来源
| # | 来源 | 说明 |
|---|---|---|
| [1] | preflight/results/t{1,2,3}-{dsh,claude}-20260908-*.json(12 份) |
正式轮逐场成绩:耗时 / 超时 / FINAL_PASS / 违规判据 |
| [2] | preflight/results/duel-20260908-231545.log |
正式轮执行日志:clone → 装依赖 → headless 执行 → 判据 → 清理全链路 |
| [3] | plan-ep14-duel-tasks.md |
三任务规格 / 陷阱 / 判据 / ABBA 设计 / 统一模型轮正式成绩表 |
| [4] | preflight/preflight-runbook.md |
校准轮与 harness 环境问题记录(含 t2 假 FAIL 修复) |
| [5] | 混合模型轮归档 preflight/results/archive-mixed-model-0908/ |
跨模型对照原始数据(仅背景参考) |
| [6] | 2026-09-08 用户拍板 | 工具对决须统一底层模型(claude 经 DeepSeek 兼容端点对齐 deepseek-v4-flash) |
| [7] | 2026-09-09 用户拍板 | 结论落点:真实大项目重构将把 dsh 加入工作流 |
← 表格可左右滑动查看
信号来源SIGNALS
信号来源
这一期从哪条雷达长出来(雷达 → 产出的双向可追溯):
node_links/radar_items.intent 的 feeds 指向关系当前为 0(M2 首轮回填统一先落 standalone,待人工指认)——回填后此处显示「雷达 YYYY-Www 条目 ③ → 已成为本期」。
来源表SOURCES