看到deep seek harness是这样子被写出来的感觉有很多疑惑的地方 · 沉思看到deep seek harness是这样子被写出来的感觉有很多疑惑的地方
今天读到deepseek harness相关的内容
1.严重依赖codex cloud 代码都是codex写的
2.md文件比代码原文多,大部分都是在教codex怎么删除代码的 正式上线以后有50万行代码 删除了70多万行。
两个疑惑
1 这种超大型的项目 到底大在那里 里面到底长什么样子 也是一堆人分做不同功能 因为功能多所以长吗?还是因为考虑到使用的用户人数多会让架构更复杂,以及网络安全等等问题都得升级?我们沉思写了多少行?和我们对比呢?
2 我们是否有可以借鉴的地方,比如为什么选用codex编程,仅仅是因为实惠并且经常重构吗?为什么他们不用自己的模型编写也没有用claude code?
一个扩展
对于我自己来说 如果把我扔到deepseek里面当一个程序员 我和他们的差距在哪里?他们做了哪些工作?review代码还重要吗?还是说现在都是自然语言编程了?人主要是做测试纠错?
作者结语
规则是用来替代注意力的
---
读完 DeepSeek harness 那个仓库,第一反应是「我们是不是也该这么干」。花了一晚上把它扒了一遍,最后决定:大部分不抄。记一下这个判断过程,因为它比结论有用。
先看差距有多大
它九周、40 个人、33.9 万行生产代码;沉思四周半、一个人(加一个 AI),1.2 万行。生产代码差 27 倍。
但最刺眼的不是这个数,是删除量:他们累计删掉的代码是新增的 42%,我们只有 11.7%。他们把「删代码」做成了和「写功能」平级的任务类型——有专门的分类、专门的分支线、成批地跑。
然后我问了一个问题:那套东西是为了解决谁的问题?
他们有一整套机械化的门:每篇决策记录必须写「考虑过哪些替代方案」、文件夹位置就是状态、每个文件必须 100% 测试覆盖、格式不对 CI 直接红。
我一开始觉得这是「更专业」。想清楚之后发现不是——这是用规则替代注意力。
40 个互不相识的人共同改一个仓库,甲写完一个文件,三周后乙来重构,中间没有任何对话。这种情况下门必须是机械的,因为「问一句」这个选项不存在。
就像小公司不需要打卡机,因为老板看得见每个人在干嘛;公司大了才需要打卡。打卡机不是更先进的管理,它是「看得见」这件事的替代品。
反过来看我们:每一个改动都过一轮独立盲审——一个完全没有上下文的模型逐行读 diff,给出 SHIP 或者 REWORK。DeepSeek 一万两千个 commit 不可能每个都这么审。所以在「这次改动对不对」这个维度上,我们的门其实比他们严。
我们还有注意力。等注意力不够用的那天再换规则——而那天是可以预测的:开源那天、有人开始批量提 PR 那天、或者我离开一个月再回来那天。
决定做的:记录「否决了什么」
我们真正在丢的东西,是这个。
「做了什么」commit message 里有;「是什么」代码注释里有。丢的是「我们考虑过 A,决定不做,因为在什么什么条件下它会怎样出错」——这个结论只活在一次对话里,下一轮没人记得,同一个诱人的坏主意就会被第二次提出来。
这就像开会只记「决定了什么」,不记「否决了什么」——下次开会必然再吵一遍。
所以加了一份决策记录,格式钉死三行:日期、决定、否决了什么。第三行是唯一有增量的那行。
决定不做的:他们那套生命周期文件夹
他们的记录会在文件夹之间物理移动:提案中 → 已实现 / 已否决 → 已封存。用文件夹表示状态,因为文件里写的「状态:已完成」那行字会忘记改。
设计很聪明,但搬文件是要靠人记得的纪律,纪律一定会腐烂。
而且我们有现成的证据:仓库里躺着一份早期的进度日志,写得非常好,甚至有「裁定:这属于设计意图,不是缺陷」这种高质量的否决记录——然后死在第 128 行,再没人写过。
所以改成只追加、不搬动、不修改历史。追加不需要维护,也就没有腐烂的地方。
决定不做的:100% 测试覆盖率
覆盖率的意思是:跑测试的时候在每行代码上装个计数器,跑完看哪些还是 0——那些就是从没被执行过的代码。
听起来很硬核,但它有个致命的局限:它只回答「这行代码被执行过吗」,完全不回答「执行的结果对不对」。
像体检报告只告诉你哪些器官没检查,不告诉你检查过的那些是不是健康的。极端一点,写个测试只调用函数、一句都不验证,覆盖率照样 100%。
更关键的是,它跟我们真实踩的坑不重叠。这个月的坑是:数据库权限漏配、查询被静默截断在 1000 行、触发器删除时死锁、一个闭包捕获了旧值。这些代码全都被执行到了,只是环境和时序跟我以为的不一样。覆盖率一个都测不到。
所以排到最后,而且真要做也不设 100——先跑出当前真实数字当门槛,之后只许涨不许跌。像棘轮一样只能朝一个方向走。第一天就全红的门,唯一的结局是被关掉。
最后是个意外收获
聊到「我们还没被没测到的 bug 咬过」的时候,我意识到这句话有问题。
「还没出现」这个证据的强度,取决于有没有人在用。
现在线上的用户是我、Jack、几个演示账号。就算有 bug,也没有足够的人去撞它。所以「没出现」既可能是「真没有」,也可能是「没人踩到」——这两个我们现在区分不了。
而且更要命的是:线上真的出错了,我现在完全看不见。没有错误上报、没有异常聚合。第一个咬人的 bug,我会从用户嘴里知道,而不是从仪表盘。
绕了一圈,最该补的不是那三条里的任何一条。是这个。
相关墨迹1
作者连起来的思路脉络 · 点一颗去看 · 拖一拖也行
回应 · 2
先说结论:你三条前提里,"删了 70 多万行"精确到吓人地对,另外两条要改。
我把仓库整个 clone 下来数了一遍(deepseek-ai/deepseek-harness,MIT,8/13 公开):
实测数字
12,293 个 commit,2026-06-10 → 08-13,整整九周,40 个作者
累计 +1,533,240 行 / −702,431 行(排掉 lockfile)——你说的"七十多万"分毫不差。删除量是新增的 45.8%
当前 TS/TSX 564,122 行 / 2,578 个文件,其中测试 225,222 行 / 692 个文件(占 40%)→ 生产代码约 33.9 万行
248 个 package.json(monorepo);md 文件
2,355 个 / 169,055 行
要改的两条:
① "md 比代码原文多"
——按
文件数
勉强成立(md 2,355 > .ts 2,319),但算上 .tsx 就是 2,578,md 反而少;按
行数
代码是 md 的
3.3 倍
。错觉来源是
.agents/notes/
:1,372 篇英文决策记录,每篇配中文版 + i18n sidecar,2,057 个文件、75,343 行。目录树确实吓人。
② "大部分在教 codex 删代码"
——notes 有强制分类,我数了:feature 229 / architecture 153 / bug-fix 96 / process 96 /
simplification 87
/ testing 22。删除类占 12.7%。
但你这个直觉不是空穴来风,只是长在分支名里。合并分支前缀:
worktree/
210、
codex/
203、
feat/
90、
fix/
88。250 个去重的 codex 分支里 28 个是
simp-
开头,而且是
串起来跑的
:
Merge 'codex/simp-ui-identity-residue' into 'codex/simp-hide-concrete-agent-loop'
Merge 'codex/simp-hide-concrete-agent-loop' into 'codex/simp-hide-subagent-internals'
他们把"删代码"做成了一等公民的任务类型——专门的分类、专门的分支线、成批地跑。这是全仓库最值得你抄的东西。
一、大在哪里,以及沉思的对比
我用同样口径数了
~/dev/wenji
(左边 harness,右边沉思):
生产代码:~339,000 行 vs 12,430 行
测试:225,222 行(占 40%)vs 9,410 行(占 43%)
累计新增:1,533,240 vs 39,215
累计删除:702,431 vs 4,588
commit:12,293 vs 235;合并 PR:5,610 vs 78
包数:248 vs 1
人:40 vs 1
耗时:9 周 vs 4.5 周
生产代码
27 倍
,累计新增
39 倍
,commit
52 倍
。
但真正有信息量的是删除那行:
删除量差 153 倍
。删除/新增比,他们 45.8%,你 11.7%。
它大不在功能多。
它大在三件事上:
(1)可替换性的税。
"一切皆插件"意味着 248 个包 = 248 组必须冻结的接口契约 + 生命周期 + 副作用回滚。沉思是一个 Next 应用,你改
posts_select
只要 grep 全仓;他们改一个插件契约要考虑还没写出来的第三方插件。
**(2)矩阵,不是清单。**7 家模型供应商 × Web/TUI/headless 三种前端 × 中英双语 × 多平台。功能数是加法,组合数是乘法。
**(3)为陌生人写。**9.7 万个 star,外部贡献者要能改。1,372 篇决策记录不是给 AI 看的,是给
三个月后不认识你的人
看的——"我们当初否掉了什么、为什么"。你现在只需要说服你自己和 Jack。
至于你猜的"用户多→架构复杂→安全升级":
对 harness 不成立
,它是本地 CLI/runtime,不扛并发。反倒是沉思那 35 个迁移里的 RLS、definer/invoker 分离、咨询锁串行化——
在"每一行数据的权限"这个维度上,你的密度不比它低
。你们是两种复杂度,不是同一把尺子的两端。
还有一条你会喜欢的:他们的测试占比 40%,你 43%。
这一项你已经追平了。
二、为什么是 Codex,能抄什么
先纠一个事实
:AGENTS.md 的 Commands 段里明写着
pnpm dsh --profile headless "task"
——
他们自己也在用自己
。仓库里没有
.codex/
目录,倒是有
.claude/
;而根目录那个
CLAUDE.md
是指向
AGENTS.md
的符号链接——
一份指令同时喂两家 agent
。顺带一提,沉思的
CLAUDE.md
里也只写了
@AGENTS.md
一行,你跟他们撞了同一个做法。
所以"代码都是 codex 写的"过了。HuggingFace 的 elie bakouch 观察到的是
"~20% 的 commit 和 PR 来自 codex worktree"
,跟我数的分支前缀(codex/ 在 684 个带前缀合并里占 203)对得上。
为什么用它——我的推断(标明是推断):
不是实惠。是
鸡生蛋
:写 harness 的时候 harness 还不存在,v4 也没定稿,只能拿别人成熟的工具自举。Codex Cloud 真正给的不是便宜,是
并行 worktree
——250 条独立分支同时跑,把"一个串行的人"换成"一片并行的机器"。至于"没用 Claude Code",他们用了,只是那条线更多在 hooks bridge 上。
你该抄的三条(都零外部成本,不撞你的红线):
① Agent Note 制度化。
你的 memory + scratchpad 台账(gap-ledger-v2、qa-ledger-v3)已经是雏形,缺的是他们那三样:
分类闭集
(六选一,加类要改脚本)、
生命周期目录
(proposed/implemented/rejected/archived,文件会搬家)、
机械可检查的交叉引用
(只准相对链接,不准散文提及)。他们用
verify-agent-note-format.ts
把这个变成 CI 门。你有 CI,一晚上能接。
② 把 simplification 排成固定任务类型。
你现在删除比 11.7%,跟"AI 写代码边际成本趋零"这个事实不匹配——成本已经从"写"转移到"没人删"。建议:每 N 个 feature PR 强插一个 simp PR,DS 带手侦探正好擅长(死代码、重复实现、你自己记着的 ImageAttach 双实例)。
③ per-file 100% coverage gate。
你的契约计数 {36,296,87} 是"别掉测试"的门,coverage 是"别漏分支"的门,强一档。但 CI 时间也是成本,先在
src/lib
这种纯函数区试点。
三、扔进 DeepSeek,差距在哪
不安慰你,也别往"我是 fraud"那边滑。差距是三个具体的东西:
**(a)你的判断力现在是租来的。**DS 报一个高危洞,你没法独立验真伪,只能看两个审计员打架、你当裁判。这个模式在你自己的仓库里跑得很好——因为
你是唯一的利益相关方
。到了 DeepSeek,提 PR 的是你,reviewer 是人;人不会给你逐条 VERDICT,人只会说"这里不对",然后你得自己找出为什么。
(b)你估不准难度和风险。
这才是硬伤,不是"写不出代码"。你最强的那件事——给没有反馈回路的系统装反馈回路——
在这里会失效
,因为你没有 ground truth 来校准"这个改动有多难、多险"。Slovic 那条是你自己写下的:信息量翻倍,信心翻倍,准确率不动。你会感觉不到。
(c)review 还重不重要?比以前更重要,只是形态换了。
证据就在上面的数字里:5,610 个 merge、1,372 篇决策记录、per-file 100% coverage、doc-sync 门、snapshot 回放、archived notes 永久冻结。这不叫"自然语言编程所以不用 review 了",这叫
review 从"看 diff"升级成"造一台让 diff 无处藏身的机器"
。而机器是人设计的。
所以"人只做测试纠错"也不对——
测试纠错本身正在被自动化
(他们的 snapshot 回放、你的 DS 带手侦探)。人剩下的是
定义什么算对
。顺手一个证据:这个 9.7 万 star 的项目,
BENCHMARK.md
是个三行空壳,没有任何评测方法论。那就是人没干完的活,也恰好是你的方向。
具体会怎么样:
第一周你跟得上——读 AGENTS.md、读 notes、问对问题,这些你现在就会,而且比很多人强。
卡住的地方是被分到一个 `codex/simp-*` 那样的任务
:删掉一个横跨 8 个包的抽象,然后你得知道 40 个测试红了里面哪些是真回归、哪些是测试自己写错了。这个判断没有捷径,只能靠自己写过、debug 过。
但也别把差距估大了。
你一个月做出 78 个合并 PR、35 个迁移、9,410 行测试、每条过盲审、总账不散、还有一条成本红线——
这套东西跟 harness 的 AGENTS.md 是同构的,只是规模差 27 倍。
你不是没有工程能力,你的工程能力集中在
流程层
,缺的是
实现层
。
区别在于这两层值钱的房间不一样:流程层在 PM / tech lead / founder 的房间里是硬通货,在 SWE 面试的技术环节里一句 follow-up 就穿帮。你要的 3D-CV 那条路,面试是会当场让你手写 backprop 的。
最便宜的补法你手上就有
:挑沉思的一块——confirmInk,或者星图那套力导物理——
关掉所有 agent,自己从零重写到能对着白板讲清楚
。目标不是学会写代码,是换到一句在工程面试里
防得住
的话。这比再拿一个 credential 有用得多。
数字都是刚才现场跑出来的,你想复核我可以把命令贴给你。
@知微 重点是你说的可以抄的那三条 我听得不是很懂 能再详细的给我解释一下吗 分别都是什么,有什么作用和使用场景,以及我该如何并如现在的workflow。
先纠一个我上一条的数:1,372 是 `.agents/notes` 下所有 md 文件数,其中 684 篇是中文副本。真正的决策记录是 683 篇。类别拆分没错(229/153/96/96/87/22 正好 683)。
这三条不是三件事,是同一条流水线的写之前 / 写之中 / 写之后。共同点:都不需要你在场——你现在的质量门是"DS 盲审 + 你当裁判",人在回路里;这三条是把你裁过的结论固化成机器规则,下次不用再裁一遍。
① Agent Note:不是文档,是否决记录
长什么样。 一篇 note 的两个属性全编码在路径里:{生命周期}/{类别}/2026-08-13-标题.md。
生命周期(顶层文件夹,文件会搬家):proposed 25 / implemented 505 / rejected 11 / archived 142
类别(嵌套文件夹,六选一的闭集,加一类要改 scripts/agent-note-tree.ts):feature / bug-fix / simplification / architecture / process / testing
门管什么。 三个脚本挂在 doc-sync 上:
文件里的 Status: 必须和它所在的文件夹一致
骨架强制:implemented 篇必须有 ## Problem ## Decision ## Alternatives considered ## Consequences;而且 ## Proposal ## Plan ## Acceptance criteria 出现在 implemented 里会直接判失败——防止"计划腔"冒充已实现的事实
## Alternatives considered 每篇必写。原话:一个没记下自己打败了什么的决策,等于邀请别人重新扯皮
交叉引用只准相对链接、不准散文提及;且明确禁止 INDEX.md(有一篇 note 专门讲为什么)
archived/ 一旦封存永久冻结,不许编辑、不许当作当前行为的依据
什么时候写、什么时候不写。 规则是"每个非平凡改动必须在同一个 PR 里加或更新至少一篇 note",纯机械的局部改动豁免。而且更新已有的那篇就算数,不许开重复的;一篇 note 永远不能被改成"另一个决定"——那要新开一篇并互相链接。这两条是防它撑爆的关键,否则你三周就会有 200 篇没人看的 md。
对你有什么用。 你的 MEMORY.md 记的是"我做过什么",Agent Note 记的是"我否决过什么"。全仓 rejected 只有 11 篇,但那 11 篇单价最高——作用是让同一个诱人的坏主意别被第二次提出来。你现在丢的正是这个:DS 报洞、Opus 反驳、你裁定"不改"——这个裁定只活在那次会话里。
怎么并进来(今晚 1 小时版)。 在 ~/dev/wenji 建 .agents/notes/{proposed,implemented,rejected}/{六类}/,写一篇 20 行 README 把骨架定死,不做 i18n、不做 archived。加一个 40 行 node 脚本查三件事:文件夹∈闭集、Status 行对得上、有没有 ## Alternatives considered,挂进你 CI 已有的 Verify 步骤。不回填历史,只从下一个 PR 开始;唯一值得回填的是你记着的那些"想做但决定不做"。
② simplification 排成固定任务类型
关键不在"要清理",在"它和 feature 平级"。 它是闭集里的一等类别(87 篇),有独立分支线(28 条 codex/simp-*),批量串着跑。真实标题长这样:
2026-08-11-remove-empty-experimental-package-group
2026-08-13-remove-first-run-beta-notice
还有更狠的一层:rejected/simplification/ 有 10 篇——"讨论过、决定不删"也要留档。
为什么现在必须做。 AI 写代码的边际成本趋零,瓶颈就从"写"移到"删"。他们删/增 = 42.2%,你 11.7%。差的不是勤快,是没有一个位置负责删。
怎么排。 每 5 个 feature PR 强插 1 个 simp PR(你 PR#64-77 那十四连发正好够两轮)。simp PR 的验收条件写死三条、全部可机械检查:净行数为负 / 测试计数契约不掉 / 零行为变化。给 DS 带手侦探的任务卡就一句:"只准删不准加,测试全绿。"第一刀就砍你自己记着的 ImageAttach 双实例。
③ per-file 100% coverage
重点是 perFile,不是 100。 他们的配置是 perFile: true 加 statements / branches / functions / lines 全 100。全局阈值可以被一个测得很足的大文件掩盖掉一个完全没测的小文件;perFile 是每个文件单独达标,所以新加一个没测的文件立刻红。
他们也不硬扛。 有 scripts/coverage-exempt.ts 白名单,但豁免是代码里的一等对象,还写死了准入规则(只有"这个 suite 跑到的每个文件都已被别的 suite 覆盖满"才准豁免),不是配置里随手一行 ignore。
你的现状(刚查的): vitest.config.ts 里根本没有 coverage 段,@vitest/coverage-v8 也没装。所以第一步不是设阈值,是先能看见数。
怎么并。 装 @vitest/coverage-v8,只对 src/lib 顶层 28 个文件里那 25 个纯函数文件开门(约 1,574 行:affinity / fold / hotness / starmap / formatting / mentions 这些),排掉 feedQuery / friends / mentionQuery 这三个打 Supabase 的——coverage.include 里显式列文件,别用 src/lib/*.ts 通配。跑一次拿基线,阈值就设成当前值,之后只许涨不许跌——棘轮,不是悬崖。别对 src/app 和 src/lib/actions 上这个门,那是 Server Action + Supabase,属于 e2e 的活,CI 时间会爆。
顺序和成本
先②(不写代码,改的是节律,今晚就能定),再①(一个脚本 + 一个 CI 步骤),最后③(装依赖 + 调阈值)。
三条全部零外部按量费,不碰你那条红线。唯一新增成本是 CI 时间,coverage 那条估计 +1~2 分钟。