文章

Claude Code agent 一邊重構,一邊修你從手機回報的 bug

用 Clawdline 重構 Clawdline 的第二輪:使用者從手機回報四個 bug,小隊平行修好;還有一次審查,擋下了一個比原本 bug 更糟的修正。

第一輪講的是使用者出門時,一組 Claude Code Session 怎麼重構 Clawdline。2026 年 10 月 18 日的第二輪不一樣:使用者回來了,小隊在做事的同時,使用者也一直拿著手機在用這個產品。

這讓工作變了樣。bug 會在重構做到一半時冒出來,來源是一張截圖、一句說明。小隊的進度沒有因此變慢,而且沒有任何一個修正,是只憑某個 Session 自己說了算就送到手機上的。

一張截圖變成待辦,待辦變成一個 Session

使用者在手機截圖上圈出問題、送出來,Clawdline 就把它掛到負責協調的 Session 上,成為一筆待辦。協調者先回到原始碼確認,把查證過的事實寫成 brief,再交給一個新的 Session 去修。

手機上新增 Session 待辦的畫面:文字寫著某一列沒有縮排在行程底下,附上的圖片是一張用紅筆圈出問題的手機截圖。
從手機回報的 bug,變成一筆 Session 待辦。示範專案;紅圈畫在截圖上。

同一個下午,這件事發生了四次:

使用者看到的 實際的問題
Plan 轉成工作後,多了一堆不是工作的步驟 Plan 裡的分析被當成待辦清單解析
child Session 有時沒有縮排在 root 底下 任務清單最久四分鐘才重讀一次
排程頁說在線的 Mac 離線了 頁面自己在重連,卻把這件事算成 Mac 離線
明明有 Session,卻說「沒有可用的 Session」 清單還沒載入,對話框就先畫了空清單

每個修正都從一個「在舊程式上會失敗」的測試開始。重構照常在旁邊進行,因為每個 Session 都在自己專用的 checkout 裡工作,互不干擾。

一次審查,擋下了比 bug 更糟的修正

縮排問題的第一版修正,測試全部通過。接著獨立審查者試著把它弄壞,結果真的弄壞了:root 的分頁關掉、新的 Session 又用到同一個終端機編號時,child 會被掛到錯的 Session 底下。

child 掛錯地方,比沒有縮排更糟,所以這個修正沒有合併。另一個 Session 接手這份審查、審查附上的探測測試和原本的分支,把三個問題都修好,再由第二位審查者逐一確認。上線後,協調者在有 child 執行的情況下看了十分鐘 daemon log:沒有任何一個 child 找不到 parent。

這種模式一整天都沒變:審查者自己設計會弄壞程式的改動,只要有一個沒被測試抓到,合併前就先補上測試。使用者不需要自己去讀 diff。

刪掉舊程式之前,先把它的答案錄下來

這一輪最大的改動,是把大約 2,600 行手寫的解碼程式,換成由一張表自動產生的程式。手機上的每一個操作都會經過這裡。

刪除任何東西之前,先有一個 Session 把舊程式對 142,267 種輸入的回答全部錄下來,新程式必須給出一模一樣的答案。之後審查者再把新舊兩版都送進真正的訊息橋接層,比對了 303,581 行輸出,每一個位元組都相同。

舊程式刪掉之後才寫的測試,只能描述新程式。先錄下來,舊的行為才能留下來當尺。

不用請使用者截圖,也能診斷手機

使用者也回報手機無法直連 Mac。從手機上問網路細節又慢又不可靠,所以小隊做了一個自己看得到的方法。

現在每一次直連嘗試,兩端各會留下一行紀錄,用同一個 id 對起來:各自提供了哪幾類網路候選、過濾掉幾個、連線檢查什麼時候開始,以及最後卡在哪一步。不寫任何位址、埠號或憑證。安全審查者試了十五種刻意設計的候選格式,想讓它洩漏,結果一個都沒有成功。

部署後不到一分鐘,第一批紀錄就進來了,而且已經看出一條線索:手機有提供 IPv6 候選,Mac 卻把自己的 IPv6 候選全部丟掉了。接下來的設計,會以選項的形式交給使用者決定,不會替使用者直接改掉。

工作可以來自別的 Session,範圍仍由使用者決定

另一個正在調查同一個連線問題的 Session,傳了一個看板項目給協調者,後來又請它多加一個修正,兩則訊息都說使用者已經同意。

協調者兩次都還是直接問了使用者,用的是手機上一個簡短的選項提問。別的 agent 傳來的訊息是資訊,不是授權。回答只花了幾秒,看板上的範圍就是使用者自己選的那一個。

手機上的 Session 對話,出現另一個 Session 傳來的訊息,標著它的名稱,請這個 Session 接手一個看板項目,並說負責人已經同意。 同一個 Session 停下來等使用者回答,問要不要現在接手這個項目,附三個點一下就能回答的選項。
左:另一個 Session 請它接手。右:接手前先問使用者。示範專案。

小隊也遇到一件不是自己造成的事:另一個 Session 的 commit 讓主分支的 CI 變紅,推送被擋下。協調者先在本機重跑失敗的測試,再只重跑 CI 上失敗的那個 job,轉綠之後才推送。

第二輪多證明了什麼

第一輪證明了小隊做得了事,這一輪證明它禁得起打斷:從手機回報的新 bug,跟重構平行變成有人負責的工作;審查抓到測試漏掉的東西;刪程式之前先把行為釘住;使用者把時間花在做選擇,不用盯進度。

項目、步驟與待辦的操作在看板指南;派工、審查與落地的順序在工作流程指南;為什麼沒有 Session 能自己蓋「已落地」的章,可以讀「做完了」其實有四種意思。