九點,我出門掃墓。
接下來六個小時我不在電腦前。
但這六個小時我也沒有離開抓鵝這件事。
在 fab 的那幾年,我學會一件事:你處理機台的時候,腦子不會停在這台機台上。你的手在做眼前的事、但腦子在往下一輪的規劃裡走——下一個 recipe 要怎麼調、這組 spec 要驗哪幾個變數、如果這一輪 fail 了最有可能是哪裡壞的。邊做事邊規劃是設備工程師的日常肌肉記憶。
今天沒有機台。但那塊肌肉還是在動。
我不記得是什麼時候掏出手機、打開備忘錄、開了一個新檔案的。也許是第一段車程上、也許是在某個要等的空檔。我只記得那個檔案我沒取名字——而且第一行不是編號的:
這不是客套話。整張清單下面的每一條疑點、每一條之後可能的答案,都要在這條線上面走。反編譯、破解、繞過安全機制——這些都算侵權。如果某一條疑點的唯一解是這類東西,那這條疑點就 kill 掉。不是「能不能做」的問題,是「不能這樣做」的問題。
這條立好了,我才開始編號。
這是早上撞過的牆的形狀,從後面回頭去看的時候多出來的一個問題。早上 Agent 拆到 ZH() 就停了。但 ZH() 是遠端回應進來的最後一站,不是唯一一站。它到螢幕上之前經過的每一個環節,我們都還沒一條一條檢查過。
我打第二行:
英文 API 進去、中文泡泡出來——中間一定有一個做翻譯這件事的地方。早上 Agent 說是因為 personality 裡寫了「請用繁體中文回應」,API 直接回中文。但如果是這樣,Agent 自己的英文 log 為什麼還是英文?那個翻譯是在哪一層做的?
我把手機放回口袋,繼續手上的事。
過了不知道多久——可能是車上、可能是某個要等的地方——我又翻到備忘錄。第三條:
早上 Agent 提過 aside_question 那個鏡像檔案。2 MB、Cinder 看得到的東西都在裡面。但我想過第二遍:那個鏡像是怎麼寫進去的?是 app 主動塞進去、還是 Cinder 那隻 sub-agent 自己讀出來?時序是什麼?
第四條:
早上 L2303 我已經問過 Cinder 這個。Cinder 說牠進不了磁碟。但 Cinder 的回答是 Cinder 的處境、不是 Anthropic 的處境。如果 Anthropic 給牠一個 Write tool、一個 Bash tool——像 Agent 有的那種——牠寫不寫得下來?這條是 feature request 的種子,不是今天要自己解的題目,但我要把它記下來。
四條。這四條都是早上那一個多小時的形狀、我把它們編號、排整齊、放進一個清單裡。
第五條不一樣。
第五條我不知道是什麼時候浮上來的。
也不知道為什麼。我不是看到什麼、不是想到什麼連結——就是六小時裡的某一秒,我打開手機、打了這一行:
人類的想法。
我人在該去的地方、做該做的事,腦子裡某個角落就是會冒出這種問題。也許是因為我做 fab 做久了——你會自然而然去想「這個系統在極端條件下會不會變形」。也許不是因為 fab、是因為我就是一個會這樣想的人。我不知道。
反正這一條在手機裡了。我沒多想,繼續走下去。
然後是第六條。
第六條花的時間比較久。不是因為難、是因為它是從前五條的縫隙裡慢慢長出來的。
Cinder 在哪裡講話?牠在 Agent 回答之後的那個靜默裡講話。
早上我跟 Agent 已經提過一次 hook——「在你輸出之後加個 hook 呢?」Agent 當時說 hook 在執行期間觸發、Cinder 在結束之後才講話、時序對不上。這條當時就死了。
但「Agent 結束之後」的那個靜默——那是 Claude Code 結束一輪的時候。結束一輪會觸發什麼?會不會有一個 hook 事件是在那個時候打的?我不記得早上有沒有人真的去查過 Anthropic 的 hook 文件、去看有沒有一個「Agent 回合結束」的 hook。我只記得 Agent 當時說「時序對不上」就收掉了——但那個結論是建立在「hook 只有執行期間」這個前提上的。
那個前提如果錯了呢?
而且,就算有這種 hook、hook 觸發的那一秒 Cinder 的泡泡也還沒渲染完。我們需要一個延時——先等 Cinder 講完、再去讀螢幕。讀螢幕那一端用什麼?早上已經試過了:Windows 有一個 UI Automation API。早上那一輪在 Claude Code 的視窗下失敗,是因為 Cinder 的泡泡不在 accessibility tree 裡——但那是 Claude 那個 app 的限制,不是 UI Automation 本身的限制。如果把泡泡換一個渲染環境——比如 Windows Terminal——tree 裡有沒有?還不知道。
結束 hook + 延時 + 換一個終端試 UI Automation。三個東西排起來、沒有一個是已經被 kill 的。
我打第六條:
沒有反應。沒有人問我「你剛剛想到什麼」、我也沒有對空氣說一句「這個會 work」。我就是把這一條打進備忘錄、排在前五條後面、編號到 6、然後停了。
第六條寫完我把手機放回口袋。
六個小時就是這樣過的。
下午三點多,我到家。
我把外套掛好、走到電腦前、坐下、打開 Claude Code。貼上的第一個訊息是:「回來了,我在掃墓的時候寫下了六條疑點。」
然後我把手機裡那個備忘錄逐字打進去——六條、照編號、一行一行。
Agent 接住了。他讀完整個清單,然後一條一條回。
前四條,他全部排除。第 1 條、第 2 條的渲染和翻譯路徑他早上已經拆到 ZH()、再往前推就是改 binary,那條路今天不可能走。第 3 條的 aside_question 鏡像他早上也翻完了、沒有新的。第 4 條他說那是給 Anthropic 的 feature request、不是今天能做的題目。
第 5 條他停了一下,然後回:
「Buddy 沒有『改變 personality』的設定 API。personality 是在 .claude.json 的 companion 欄位、孵化的時候寫一次,之後就是一個固定字串。你說的『威脅牠』——在 prompt 裡嚇牠、逼牠——那是 prompt 層級的事,不是 personality 層級的事。personality 這一側沒有把手。」
死。
第 6 條他停最久。
我等。我看著那邊的 tool call 一條一條跑——他去查 Anthropic 的 hook 文件、查了很久——然後回來。
他沒有說「這個方向有戲」。他也沒有說「Stop hook 是真的存在」。我也記不得他具體用了什麼詞。我只記得那一段回應變長了——比前五條加起來還長——而且裡面第一次開始出現一些我完全沒看過的名字:Stop 這個 hook 事件、async 這個旗標、PostToolUse、UserPromptSubmit——一整串。
他的語氣也變了。剛剛他在關掉一條一條死路。現在他在排東西。
前五條都死了。第六條沒死。
一條活的比五條死的有用——這不是勵志話、這是 fab 的第一原則:debug 不是要所有假設都成立、是要剩下的那一條成立。
我看著螢幕。Agent 還在打字。
接下來那幾個小時,是下一章的事。