文章

用 Claude Code agent 做大型重構:一張看板、獨立審查、每一步都量數字

我們用 Clawdline 的看板、內建角色和審查 Session,在一天內重構 Clawdline 自己:daemon CPU 從 12.6% 降到 1.3%,產品程式碼淨刪 4,383 行。

重構是最想交給 coding agent 做、也最不敢交給它的工作。重構不該帶來任何新功能,所以每一個改動都可能弄壞原本好好的東西。

2026 年 10 月 17 日,我們用 Clawdline 重構了 Clawdline 自己:一台機器、一天、二十多個 Claude Code Session 動手,一個人做決定。不需要信任任何一個 agent,因為沒有一個 agent 能批准自己的工作。

第一份計畫被整份退回,退得有道理

那天從一次架構審查開始。我們開了六個唯讀 Session,各自讀自己程式碼的一個部分再回報。它們找到的問題都是真的,負責協調的 Session 把看起來最糟的幾個整理成五個看板項目。

使用者讀了第一個項目,五個步驟全部否決,理由很短:改了也沒有人感覺得到。那份計畫是照「程式看起來多錯」排的,不是照「誰付出了什麼代價」排的。

接著使用者自己訂了標準:daemon 跑得快不快,以及同一段邏輯散在幾個地方、重複寫了幾份。從此每一個提案都要附數字。第一個數字就改寫了計畫:daemon 自己的 CPU 將近一半,花在每 2 秒重建一次 817 筆早已凍結的 task。這些 task 屬於一個月前就退役的舊 app。

一個目標一個看板項目,一次落地一個步驟

所有工作都放在看板上。一個目標一個項目,例如「清掉沒有人用到的程式碼與資料」;項目底下列著步驟,每一步小到一次就能審完,也一個 revert 就能退回。

手機上的看板項目:一個實作中的 Feature,標出實作、部署、完成三個階段,以及前往負責 Session 的連結。
看板項目:目前的階段,和負責的 Session。示範專案。

那天真正派上用場的是看板的三條規則:

  • 項目沒有驗收條件,就不能進入實作。協調 Session 有一次忘了寫,看板直接拒絕切換,於是在任何程式合併之前,驗收條件就先補上了。
  • Plan 不能由 agent 認領。把 Plan 轉成可執行的工作、取消項目,都是使用者在看板上的動作。範圍一直握在使用者手上,因為沒有 agent 改得動它。
  • 步驟要驗證過才算完成,不是寫完就算。commit 要在 main 上,而且要使用者點頭。

寫程式的 Session,從來不審自己的程式

每一個步驟都走同一條流水線。每個 Session 都用一個內建角色啟動,在自己專用的 checkout 裡工作。

角色 做什麼 能寫入什麼
協調者(architect 角色) 回到原始碼核對事實、寫每份 brief、合併、安裝、量測 只有它能合併到 main
實作(backend、performance 或 minimal-change 角色) 完成一個步驟的改動,跑相關的測試 只有事先宣告過的路徑
審查(code-reviewer 角色) 讀 diff,在拋棄式 checkout 重跑檢查 什麼都不能寫
寫測試(test-automation 角色) 在動手之前,先寫測試把現在的行為釘住 只有測試檔
使用者 決定範圍、決定不可逆的步驟、親手跑 E2E —
手機上的 Session 列表:一個標著架構師的協調 Session,底下縮排掛著三個子 Session,分別標著後端工程師、驗證員、程式碼審查員。
一個協調者,底下掛著各司其職的子 Session。示範專案。

那天一共用了 12 個實作 Session、10 個審查 Session,另外還有一次唯讀稽核和一次量測。實作 Session 做完會主動通知協調者,沒有任何東西靠輪詢在等。會寫到同一批檔案的兩個實作一前一後跑,唯讀的工作則同時進行。

審查找到了測試抓不到的東西

審查改變了最後出貨的內容,因為每一條發現都寫明審查者看過哪個檔案、哪一行。

手機上的協調 Session 對話:先是審查任務完成的通知,接著協調者說明結論是可以繼續但有發現,並說合併前會先修好那一項。
審查做完,協調者讀完結論才合併。示範專案。

有一個審查發現,某個改動可能讓手機的 Session 列表在手機明明還連著的時候,最多四分鐘不更新。測試全部通過,因為沒有一個測試涵蓋「手機還連著,relay 卻短暫把它算成離開」的情況。這個問題在合併前就修好了。

另一個審查為了檢查一個守衛測試,寫了八種繞過它的寫法,結果守衛一種都沒抓到。第三個審查則發現,一個等價測試從來沒有單獨跑過增量更新的那條路徑。測試要親眼看過它變紅,綠燈才算證據。每一個修正,都有 Session 故意把錯誤改回去,確認新測試會失敗,才相信它。有一次第一次的錯誤放錯了位置,測試仍然是綠的。

每次落地都先安裝、量測,才做下一步

每次合併之後,協調 Session 都會在同一台機器上安裝 dev 版本;動到已存資料的步驟,安裝前先備份資料庫。裝好之後,再量一次 daemon。

重構之前單核心 12.6%
拿掉舊 app 的資料讀取7.5%
沒人讀的歷史設上限,只讀還活著的 task2.5%
沒人在看時,不再發布、不再輪詢1.7%
Session 列表只讀它要顯示的東西1.3%
我們自己這台機器上,每次落地後量到的 daemon 平均 CPU。五條長條用同一個比例尺。記憶體從 157 MB 降到 118 MB;產品程式碼淨刪 4,383 行,測試淨增 1,577 行。

那天下午使用者大半時間不在。要使用者親手做的 E2E 累積起來,等使用者回來時整理成一份八項的清單。沒有任何東西只憑 agent 一句話就進 main。審查的結論、本機檢查全綠、安裝後正常啟動,三樣都要先到位。

犯錯的 Session,不是發現錯誤的那一個

小隊確實犯了錯,最嚴重的一次是我們自己。協調 Session 把一個舊的設定資料夾移進垃圾桶,但裡面還放著另一個專案的排程在讀的憑證。那個專案的 Session 發現排程失敗,把檔案放回原位,再傳訊息通知協調者。整個過程沒有人介入。

另外兩次,問題來自別處。做到一半,介面忽然變成英文:原因是另一個 Session 寫的文案裡有一段選單路徑,被 daemon 自己的文案檢查擋掉了。現在有一個測試會在提交前抓到這種情況。後來推送到 main 時被拒絕,因為主分支的 CI 是紅燈。協調者在本機把失敗的測試重跑五次,只重跑 CI 上失敗的那個 job,兩邊都綠了才推送,沒有用任何方式跳過檢查。

這次重構,Clawdline 幫我們做到的事

使用者這一天花的時間在做決定,不在盯進度。拆解、實作、審查、合併、安裝與量測,全部由 Session 分工完成。

  • 範圍一直握在使用者手上。 看板讓 agent 規劃、執行,但只有使用者能把 Plan 變成工作,或取消一個項目。
  • 沒有人看著,工作也照樣往前走。 使用者整個下午都不在:看板記著每一步做到哪裡,Session 做完會通知協調者,每一次落地都留下紀錄。
  • 每一個改動都有第二個讀者、都有一個數字。 所以一天就能淨刪 4,383 行、把 CPU 降到十分之一,不需要使用者逐一讀過每一份 diff。

派工、審查與落地的完整順序在工作流程指南。為什麼不能只看那顆綠燈,可以讀「做完了」其實有四種意思;派出去的 Session 怎麼及早喊停,則在還來得及在第三分鐘喊停的工作。

第二輪是使用者回來之後,一邊用手機回報 bug、小隊一邊修,寫在一邊重構,一邊修你從手機回報的 bug。