数字先摆出来
到 2026 年 8 月 21 日,Copilot agent runtime 的全部生产代码已是 Rust:832,378 行生产 Rust、468,689 行 Rust 单元测试,另有 174,675 行端到端 TypeScript 测试;独立的 Copilot SDK 仓库再贡献约 13 万行 E2E 测试,覆盖 Node.js、Python、Go、C#、Rust 与 Java。迁移窗口约 14.5 周,期间 main 分支发出 135 个版本,其中 100 个预发布、35 个稳定版,平均每天约 1.3 个版本。
为什么不做一次性切换
文章解释了放弃「大爆炸式切换」的原因:那样需要把整个运行时长期挂在一条分支上,最后一次切过去,用户会一次性吃到全部移植代码,包括所有在仓库内测试里漏掉的回归;而且耦合重的组件也很难做影子流量验证,因为造成移植困难的耦合,同样会让「两份并行跑」带来更多风险。改成增量投递后,每个版本只带少量可预期的移植组件,报上来的问题更容易关联到最近改动、更快定位。
顺序比速度重要
迁移按「从叶子往内」推进:先搬纯逻辑原语(因为它们没有 I/O、没有共享状态,测试也齐全),再是内容排除、shell 工具、会话文件系统操作,之后是有状态的子系统,最后才是耦合最重、最难并行的会话编排。文章还提到,实际的移植单位往往不是「一个组件」,而是「一波相关的行为」——先把纯逻辑搬过去,再搬状态归属,再搬编排,然后删掉临时互通层,最后在互通层消失后简化 Rust。
- 先用两个 PR 立好 Rust 工作区、工具链、lint 规则、CI、构建管线与编码指令,再用一个小改动走通全流程,把仓库布局、FFI、打包、测试与评审的假设变成约定
- 按纯逻辑 → 有状态 → 编排的顺序安排批次,MCP 支持拆成 7 个 PR、工具链拆成 6 个系列
- 用增量发布换取最后一段验证:预发布版本在 npm 七日样本里只占 10.5% 下载量,初期暴露面有限,出问题能快速在下一个预发布里修掉
「让 AI 写 83 万行」之所以不是豪赌,是因为它在 14.5 周里被切成了 135 个可回滚的小版本。