← All posts / Tools

一位工程師、12 萬美元 token、832,378 行 Rust:GitHub 用 Copilot 自己的 Agent 改寫 Copilot 執行引擎

GitHub 讓 Copilot 的 AI agent 親手把 Copilot agent runtime 從 TypeScript 改寫成 100% Rust——在主分支上就地進行、持續出貨 14.5 週。完整的數據、踩過的雷,以及這對 agent 主導工程時代的意義。

一位工程師、12 萬美元 token、832,378 行 Rust:GitHub 用 Copilot 自己的 Agent 改寫 Copilot 執行引擎

今年開發者工具領域最關鍵的一次程式碼改寫,不是由一個平台團隊花兩個季度完成的,而是——很大一部分——由被改寫的產品自己完成的。Microsoft傑出工程師 Stephen Toub 在 GitHub 官方部落格發表的工程复盘文章中,詳述了 GitHub 如何把 Copilot agent runtime(執行 Copilot 編碼 agent 的引擎)從 TypeScript/Node.js 移植到 100% Rust:大部分程式碼由 AI agent 撰寫,一位人類工程師操作控制迴路,而且整個過程中 production 持續出貨、一天都沒停。

到 2026 年 8 月 21 日為止,這個 runtime 共有 832,378 行 production Rust 程式碼,加上 468,689 行 Rust 單元測試與 174,675 行端對端 TypeScript 測試。粗略帳單:約 12 萬美元的 token 費用,加上一位開發者約三週的時間,整個移植窗口為 14.5 週。Toub 的總結很直白:「Agent 把這個專案的價格降到可負擔的區間。」這種規模的改寫——在一套線上系統中就地進行——過去需要一整個團隊投入一到兩年,而且他坦承,在資源爭奪戰裡「(這個提案)本來應該會輸,也確實應該輸」。

會移動的靶:13 萬行變成 43 萬行

2026 年 5 月的初步估計,runtime 約 13 萬行 TypeScript。這個數字「就估算目的而言算準,但誤導性極強」。移植進行期間,程式碼不斷從 TUI 層往下沉、整批元件 late 被納入範圍,而且幾十位開發者每週持續合併數百個 pull request——不斷灌入新的 TypeScript。最終 Toub 估計,約 43 萬行 production TypeScript 實際通過了這次移植,是原始估算的 3.3 倍。

churn 還不止於此:移植期間 runtime 一邊接收約 30 萬行新的 production TypeScript、一邊移除約 43 萬行;同時約 120 萬行 Rust 進來、36.5 萬行離開。在外部觀察者眼中,TypeScript 的量體大部分時間看起來紋絲不動——實際上是移植默默地跟上了不斷湧入的功能開發。

就地、原子化、隨時可出貨

GitHub 否決了大爆炸式重寫,選擇就地原子替換:每個 pull request 移植一個元件,用呼叫 Rust 的薄 shim(透過 napi-rs)取代原本的 TypeScript,並在同一個原子變更中刪掉舊實作。主分支從未停止出貨——移植窗口內共發佈 135 個版本(100 個 pre-release、35 個 stable),平均每天約 1.3 個版本,對應每天約 1.3 個移植 pull request。

這個策略還帶來一個意想不到的安全特性:由於被移植的 TypeScript 一到站就被刪除,任何 rebase 若碰觸已移植的程式碼,必然產生 merge conflict——一邊在改、另一邊已刪。對已移植程式碼的任何改動都不可能悄悄溜過去。

最難啃的單一檔案是 session.ts——一個有機長成、約 3 萬行的骨幹,幾乎穿透所有子系統。負責它的移植 session 前 56 分鐘什麼都沒寫、只在做閱讀——建立任何東西之前先發出 122 次工具呼叫——然後才把檔案邏輯切分、委派給 15 個 child session,每個都有獨立的 worktree、branch 與 agent 迴圈,在三小時內分七波生成。其中 10 個跑 GPT-5.6 Sol、5 個跑 Claude Opus 4.8,全程 25 小時。

1,270 萬條 session 事件透露了什麼

這篇文章最獨特的貢獻,是對 agent session log 的審計:12,760,995 個事件、31,247 條 user 角色訊息、1,385,214 條 assistant 訊息、1,130,921 次工具呼叫——其中 61% 來自 subagent 而非主執行緒。而那些 user 訊息中,Toub 親手打字或口述的只有約 2,600 條,十二分之一。用他的話說,他的角色「與其說是派任務然後等,不如說是操作控制迴圈」:檢查結果、挑戰技術決策、執行品質閘門,並且在 agent 把中途站當成終點線時施壓。

經濟學的關鍵在 prompt caching。這次移植達到 96.22% 的 prompt-cache 命中率,cache 寫入僅 3.07%、全新輸入只有 0.71%。供應商對 cache 讀取通常打約一折,Toub 說這種 cache 紀律「正是長時間自主 session 的經濟學能成立的根本原因」。整個過程 context 自動壓縮了 5,116 次;單一個 sessions-infrastructure pull request 就壓縮了 647 次。

unsafe 有多少?回歸錯誤有多少?

對 agent 寫 Rust 的懷疑者而言,最擔心的是 borrow checker 被大規模繞過。實際上沒有。整個 runtime crate 只包含 158 個 unsafe 區塊、集中在 36 個檔案,而且每一個都位於真正的 interop 邊界:C ABI 進入點(51)、Windows API(49)、POSIX/libc(46)、SQLite C API(7)、dlopen(4)、以及一處 process environment 修改。值得注意的是,已知回歸錯誤沒有任何一件涉及 unsafe,而 model clients、MCP 層、agent 層、prompt 層完全沒有使用 unsafe。

回歸錯誤確實存在——到 9 月 14 日追蹤到數十件,全數修復,多數是正確性 bug,少數是效能退化。經驗教訓一節簡直是 agent 主導工程的手冊:目標必須完整表述(「把元件 X 移植過去」會被 agent 解讀為只移植熱路徑,直到終局狀態被明確定義);端對端測試不容妥協,因為它就是 oracle;保護 oracle 不被 agent 修改——改實作的一方絕不能悄悄弱化定義正確性的測試;先翻譯、後重新設計;同一種失敗模式出現第二次,就該升級為常備指令、eval 或 harness 本身。

對 GitHub 之外的意義

回報在建築層面:runtime 現在暴露 C ABI,可在全部六種 Copilot SDK 語言(C#、TypeScript、Python、Rust、Go、Java)中in-process 載入——不需要 Node.js、不需要 V8、不需要監管第二個 process。Toub 說這是合作夥伴回報最常見的痛點。單一 runtime 實例的成本降到過去的零頭,host 可以跑更多併發 session,而且這個 binary 現在能進入 Node.js 過去進不去的地方——從雲端、桌面、裝置到嵌入式系統。

更深層的訊號是經濟學的。一整個專案類別——對線上、業務關鍵系統的全面重寫——過去根本拿不到資源,現在變成一位工程師、五位數美元 token 的操作。Toub 刻意不過度宣稱(「我並不是直接叫 AI agent『把整個 codebase 移植過去』」),但結論很難迴避:大型重寫的瓶頸,正從「寫程式碼」轉移到「規格化、驗證、與為結果背書」。「看了三個月的 agent 改寫執行它們自己的引擎之後,」Toub 寫道,「我很期待看到它究竟能走多遠。」