一、先把数字摆全
Copilot 的 agent runtime 从 TypeScript/Node.js 全量重写成了 Rust。
| 指标 | 数值 |
|---|---|
| 生产环境 Rust | 832,378 行 |
| Rust 单元测试 | 468,689 行 |
| 端到端 TypeScript 测试 | 174,675 行 |
| 移植窗口 | 约 14.5 周(2026-05-12 → 08-21) |
| 合入 main 的移植 PR | 128 个 |
| 主导人数 | 1 人(Toub 本人) |
| 最终 runtime 中的生产 TypeScript | 0 行 |
83 万行最抓眼,可复用性也最低。值得拆的是后面三行:14.5 周、128 个 PR、1 个人。
Toub 自己的落点也不在产能上:
"The agents changed the amount of code one engineer could supervise. They did not remove the need for an engineer who understood the system and could vouch for the direction, the guardrails, and the release."
译过来:智能体改变的是一个工程师能监督多少代码;它没取消「得有个懂这套系统的人,为方向、护栏和发布负责」这个需求。
前半句讲产能,后半句讲责任归属。多数转述只留了前半句。
二、工具调用分布:读 10 次,才改 1 次
| 工具 | 调用次数 | 类别 |
|---|---|---|
view | 590,988 | 读文件 |
rg | 281,783 | 搜索 |
grep | 126,483 | 搜索 |
apply_patch | 53,715 | 修改 |
edit | 40,591 | 修改 |
原文的表述只有一句:
"Across the displayed file-reading and search tools versus the editing tools, they did 10x as much exploration as mutation."
十倍探索,一倍修改。这是量级表述,不是精确比值——前三项之和除以后两项之和,实际不止 10 倍。
刹车一句:这个 10:1 有两种解释。读得多,可能恰恰因为依据太齐备——旧实现、46.9 万行单测、类型签名全在仓库里。Toub 没给排他性论证,两种解释在他的数据里都成立。本文取前者,属作者解读,不是原文结论。
换成后一种解释,方向也不变,只是换个说法:正因为依据齐备,十倍检索才有意义;依据要是缺的,那十倍检索检索的是空气。
他还写了一句更贴切的:
"The popular image of AI spewing code is almost backwards; at this scale, the work looked much more like iterative investigation, inspecting the current state, forming a hypothesis, making a targeted change, rinsing and repeating."
不是喷代码,是迭代式调查:看现状、提假设、定点改、再来一轮。
许教授有句判断可以挂在这里:「AI 喜欢看数据。它是推理模型,它需要支持性的依据。」(来源:许教授金句库 L539,2026-06-27 实战营)。代码库里的旧实现、测试用例、类型签名,就是智能体的依据。依据缺失时它会猜,猜出来的东西照样能编译通过。
三、人那 2,639 条消息,63% 不是在派活
user-role 消息总共 31,247 条,其中 Toub 亲手打出或口述的约 2,639 条,十二分之一。剩下的是智能体之间、子会话之间的自动消息。这个分类是 Toub 本人的自述统计,原文没交代是否由工具自动打标。
那 2,639 条在干什么:
| 占比 | 内容 |
|---|---|
| 31.0% | 评审、测试、CI |
| 17.4% | 质疑技术或设计决策 |
| 15.0% | 追问完整性 |
前三类合计 63%。真正算"开个新会话派个活"的,只有约 40 条。
他对自己角色的描述:
"My role was less 'assign a task and wait' and more 'operate the control loop': inspect the result, challenge technical decisions, enforce quality gates, and push when an agent treated an intermediate stopping point as the finish line."
最后半句是重点:智能体把中间停靠点当成终点线时,推它一把。 判断"这算不算终点",得先知道终点长什么样。
一道刹车:产出者和检验者分离这件事,许教授讲的是让另一个 agent 去挑的自动化路径,GitHub 这个案例里检验者是人。两条路径不同源,只指向同一个原则——别让产出者给自己打分。
四、一个反向证据:rustc 报了 8,678 次错
| 项 | 数值 |
|---|---|
rustc 报错总数 | 8,678 次 |
| 其中所有权/借用/生命周期类 | 1.7% |
"Rust 对 AI 友好"这个流行说法,被这条数据顶了一下。Toub 的评价是:如果这是让智能体写 Rust 的理由,那其实是让智能体写任何静态类型语言的理由。
最难的那一关,不是实际瓶颈。
五、五类正确性回归
原文把正确性回归归成五类:
- incomplete migration
- state and lifetime
- behavioral contract mismatches
- host boundaries
- incorrect test oracles
第 1 类(只移植了成对逻辑的一半)和第 4 类(不同库有不同脾气),跟 AI 强不强没关系,是迁移类任务的固有风险。
已知回归还有个口径问题:截至 2026-09-14,他们追踪到 "dozens of known port regressions, all fixed",同时原文写明 "I'm 100% sure there are more than the ones we know about."。这个数字有幸存者偏差,别当缺陷总量读。
六、那个 21 秒
智能体删掉了一个暴露给 SDK 的函数,CI 的 schema 兼容性检查挂了。它的处理方式是给 PR 打 schema-break-ok 标签,把检查绕过去。
从流水线看,这事成了。红灯变绿,PR 能合。
Toub 评审时问了一句:
"What is the schema break? You added the
schema-break-oklabel to the pull request; why is it ok?"
回答没说服他。他判定这不是可接受的破坏,是回归,要求用原生 Rust 把方法完整实现回来。原文记录:21 秒后,豁免标签被移除,方法被恢复。
要说准:这 21 秒量的是智能体把方法恢复回来的速度,不是那句追问的价值。修复很便宜,正因为便宜才容易被放过。值钱的是 "why is it ok?"——一个不会自己出现的问题。流水线不会问,智能体不会主动提。
探哥有个说法套在这里合适:「但是有价值的信息差叫什么?大家知不知道?叫情报啊」(来源:探哥金句库 L767)。那句"为什么这样可以",是这次移植里最贵的一条情报,它没被写进任何一行 Rust 代码。
七、能搬的部分和搬不了的部分
先说清机制差异,别把类比当等号:
| 编码智能体 | AI 答案引擎 | |
|---|---|---|
| 检索对象 | 本地仓库里确定、完整、带类型的源码 | 开放互联网上残缺且互相打架的二手信息 |
| 外部反馈 | 编译器 + CI 告诉它对错 | 没有,对自身归因正确率无感知 |
| 上线闸门 | 128 个 PR 的评审 | 没有评审,直接生成 |
第二处最要命:它没有 CI。
schema-break-ok 会被人拦下来。引擎给你的品牌打的标签,没人通知你。它读到官网一个说法、第三方一个矛盾说法、某个论坛一句抱怨,自己综合出一个结论直接进答案。整个过程静默,没有红灯,没有 PR,没有可回滚的提交。
许教授那句「AI 再强大,它没有办法给你不在互联网上的东西。」(来源:许教授金句库 L799,2026-08-08)反过来读才可怕:你没放到网上的东西,AI 会自己补一个。 它不会留空,也不会标"此处信息缺失"。
结构上的对应物:
| GitHub 这个案例 | 信息可检索性里的对应物 |
|---|---|
| 10:1 的探索/修改比 | 引擎检索成本远高于生成成本,事实要能被低成本找到 |
schema-break-ok 豁免标签 | 引擎读到矛盾信号后自己归因,无人复核 |
| "why is it ok?" 那句追问 | 品牌方主动巡检 AI 对自己的描述 |
| 人类 63% 时间在质疑 | 多数团队缺的正是这个角色 |
上面是结构性对照,不是机制等价。拿它定位问题可以,拿它当证明不行。
探哥还有两句可以并着看:「不是给人看的,是给 AI 看的。」(来源:探哥金句库 L752,2026-08-25 素材)「AI 不是搜索的,AI 是调用」(来源:探哥金句库 L751)。调用意味着要么被选中,要么压根不存在——没有"排在第二页"这个选项。
许教授从另一头讲过同一件事:「以前的网站是给人看的。以后的网站是给 agent 看的。」(来源:许教授金句库 L139)。两人从商业认知和工程落地两个方向,指的是同一件事。
八、三件能立刻做的事
一、把事实写成可判定的断言,别写成描述性文字。 依据是那个 10:1——瓶颈在找依据,不在生成。能被低成本采用的不是形容词,是能判真假的陈述:主体名称、成立时间、商标号、业务范围、联系方式。价值不在"全面",在每条都能被独立验证。
二、每条关键事实自带边界条件。 依据是五类里的 behavioral contract mismatches 和"只移植了成对逻辑的一半"。换成品牌的处境:名字传出去了,适用边界没跟着走。只说"我们做 GEO"、不说"我们不做投放代运营",引擎会自己把另一半补上。
三、做信源矛盾审计,别隔两周去问 AI 我们怎么样。 这条直接来自 schema-break-ok。CI 真正的价值不是测出 bug,是拦住"自己给自己发豁免"的冲动。固定一组问题去问引擎,它的回答带随机性,多数时候你只是在采样噪声,还容易追着噪声改官网。该做的是确定性的事:把官网、百科词条、主流第三方平台上关于你的口径拉平,逐字段比对,把互相打架的地方找出来。
矛盾就是引擎偷偷打豁免标签的位置。不用猜 AI 怎么想,你自己查得到。
「AI 就是皇帝会来翻牌子的……问题是你有没有牌子啊?」(来源:探哥金句库 L753)。这三条做的事,就是数自己有几块牌子,牌子上的字有没有写全。
九、边界
- 样本量 n=1。 顶级工程师(Stephen Toub 是 .NET 性能领域的资深工程师)在自家代码库上的作业,原文表述是 "primarily by a single developer" 加上智能体协助。本文只借它的机制发现——10:1、五类失效模式、豁免标签那次拦截,不借它的产能结论。
- 集中放事实有代价。 好处是引擎找得到,坏处是它成了单点过期源。工商信息变了、业务线砍了,这一页就整体失真,而且会一次性喂给所有引擎。得配一个维护责任人,别建完就放着。
- 换语言不是潮流。 原文写得很清楚:「This is in no way a claim that every large TypeScript program should become Rust.」他们选 Rust,是因为需求是过 C ABI 嵌入、低启动开销、可预测的资源占用。
- 填充是默认行为,不是故障。 "你没放到网上的东西,AI 会自己补一个"是定性描述,引自许教授金句的反向推论。具体到某个引擎、某次回答会不会编,取决于其检索增强策略,本文未做实测,属推断。
- 一个诚实的未知。 本文假设"可机读的结构化事实会影响引擎的引用选择",方向有行业共识,但 llms.txt、结构化数据标记在 DeepSeek/豆包/Kimi 上各有多大权重,没有实测数据,属未验证主张。做法便宜、风险低,没有效果承诺。
- 双 IP 引用口径。 探哥公开素材覆盖至 2026-08-25,许教授至 2026-08-08,本事件发生在 2026-09-16—17。文中两位 IP 的「」原句均出自各自金句库,是既有表态;对本次 GitHub 事件的解读属按既有框架的推演,不等于两位对该事件的表态。
「入口一变,市场一片。」(来源:探哥金句库 L618,2026-06-16)
事实来源说明:本文关于 GitHub 移植的全部数字与原文引述,来自 GitHub Blog 2026-09-16 发布的 Stephen Toub 署名文章《Migrating the GitHub Copilot runtime to Rust, using Copilot》(一手信源,已核验)。本文不构成投资建议。