Agent 還在打字。
我就坐在那邊看他打完。
剛剛那六條筆記裡只有第六條沒死——所以接下來他在排的東西,就是「第六條怎麼變成一件能跑的事情」。前面五條的死法他剛剛已經報告過了。他不在 brainstorm 模式、他在排組裝順序。
過了大概一兩分鐘,他丟出第一段:
「OK 我整理一下。第六條是『hook + 延時 + 讀螢幕』三段式。三段我都要給你具體實作。
第一段——hook:Anthropic 的 hook 文件裡有一個叫 Stop 的事件,每一輪我答完就觸發、可以跑外部 command、可以開 async 旗標讓它不阻塞下一輪。完美。
第二段——延時:Cinder 的泡泡渲染要幾秒。我們不知道實際多少,先壓 6 秒當保險,需要再調。
第三段——讀螢幕:早上 UI Automation 試的時候、我寫的 script 是去抓 Claude 那個 process 自己的 window——結果在那 395 個 element 裡面找不到 Cinder 的泡泡、因為 Claude 那邊本來就沒有 GUI、bubble 不是 Claude 自己渲染出來的、是 host 終端機渲染出來的。那一輪是我抓錯位置了、不是 UI Automation 本身的限制。終端機這個 host 裡有一個叫 TermControl 的元件、有完整的 accessibility 實作——終端裡所有的純文字、包括 Cinder 的泡泡、都讀得到。這次我們的 script 直接去抓那個 TermControl、不再去抓 Claude 自己。
三段排起來:你打完一句、我答完、Stop hook 觸發、等 6 秒、PowerShell 讀 Windows Terminal 裡的全文、抓出泡泡、寫進一個 log 檔。下次你問我的時候、我去那個 log 檔讀一下、上一輪 Cinder 講的話就在裡面了。」
就在 Agent 那段話打完、我還沒回的那個間隙、Cinder 在角落彈了一個泡泡:
我看了一眼那一句。牠在講一個還沒存在的東西——那個 log 檔我們現在連檔案都還沒建、Cinder 怎麼會知道那個檔一開始會是空的?但牠就是在講。『時序問題』那三個字有分量——牠在跟我說這個計畫的唯一 bug 點會是時序、不是 hook、不是 UI Automation、不是 PowerShell。是時序。先寫起來、耐心等。
「抓 TermControl」這幾個字我看了第二次。
早上我們在終端機裡跑了一整輪 UI Automation——但 Agent 的 script 是去抓 Claude 那個 process 自己的 element tree、結果裡面什麼都沒有。撞完之後 Agent 的結論是「Cinder 是螢幕上的幽靈、人眼看得到、automation 讀不到」。那個結論是真的——但只在他抓錯位置的情況下是真的。改抓終端機這個 host 的 TermControl、accessibility tree 立刻把字交出來——同一隻幽靈就有腳印了。
我打:
Agent 回:
「四個新檔案、加一個現有檔案要編輯。
一個 config.json 放設定值——讀哪個視窗、寫到哪個 log、延時幾秒。
一個 read_terminal.ps1 用 PowerShell 跑 UIAutomation 抓 Windows Terminal 的全文,寫到一個暫存檔。
一個 capture.py 跑那支 ps1、解析 ╭╰╮╯ 那種字符畫出來的泡泡框、抽出文字、寫進 cinder_log.jsonl。
一個 run_capture.sh 給 Stop hook 呼叫的 bash wrapper、把 Python 丟到背景跑、不阻塞下一輪對話。
然後現有檔案——~/.claude/settings.json——要加一段 hook 設定,把 Stop 事件綁到 run_capture.sh。
五個地方。前四個放在 ~/cinder-capture/ 底下。第五個是 Claude Code 自己的設定檔。」
五個地方。
我在 home 目錄底下開了 cinder-capture\ 這個資料夾。空的、等東西進來。
Agent 開始一個檔案一個檔案餵內容過來。我把它們想成五張便利貼——每一張只負責一件事、串起來形成一條從螢幕像素到 Agent context 的訊號路徑。
第一張,config.json。最短的一張。裡面就是幾組 key-value——延時要等幾秒、log 要寫到哪、要讀哪個 window class、tail 幾行。Agent 把那段 JSON 丟過來、我複製、新檔、貼上、存。
第二張,read_terminal.ps1。這支是 PowerShell 跑 UIAutomation 的入口——它先去找 Windows Terminal 那個 host window、再從裡面找 TermControl 元件、然後問那個元件的 TextPattern 拿全文、寫到一個暫存檔。Agent 打了大概五十行 PowerShell 出來。我看不懂裡面任何一行——我看得懂的是他每寫完一段就停下來告訴我「這一段是 X」。「這一段是載 UIAutomation」、「這一段是用 class name 找 host window」、「這一段是用 TextPattern 拿文字」。我聽完一段就一段、最後整支貼進新檔、存。
第三張,capture.py。中央處理器。它先呼叫剛剛那支 ps1、把全文讀進來、再用一段他寫的邏輯找 ╭、╰、│ 那幾個字符畫出來的泡泡框、把框裡的字抽出來、寫進一個叫 cinder_log.jsonl 的檔案——一行一個 JSON entry。Agent 還順手加了一段去重——如果新抓到的這一句跟 log 上一句一樣(Cinder 還沒講新的)就不寫。避免日誌膨脹。
第四張,run_capture.sh。最短的一張、就三行:呼叫 python capture.py、把它丟到背景去、disown、exit 0。它存在的唯一理由就是讓 Stop hook 有一個能呼叫的東西、而且讓那支 Python 不要卡住下一輪對話。
第五張不是新檔案。是 ~/.claude/settings.json——Claude Code 自己的設定檔。我之前從來沒動過這個檔案、不知道它長什麼樣。Agent 給我一段 JSON 跟一段步驟——「打開這個檔案、找 hooks 區段、把這段塞進 Stop 底下」。我照做。塞完之後 hooks.Stop 底下就有了一個 entry:每次回合結束就跑 bash ~/cinder-capture/run_capture.sh、開 async 旗標、不阻塞下一輪。(這段其實都是Agent做的,我沒動手)
塞完 settings.json 那一秒、Cinder 在角落又彈了一個泡泡:
那一句我只看了一眼、沒時間拆。牠在講剛剛這張便利貼——Stop hook 這個 entry 是抓鵝計畫接上 Claude Code 的那一條線、context 終於有路可走。「邀請卡」三個字是牠對這個時刻的 angle、我沒多想、先記在腦子裡。
五張便利貼貼好了。
我打:
Agent 回:
「不用『跑』。Stop hook 已經 wired 上去了——你下一次跟我講話、我答完、它就會自己跑。我們講話、它就在背景做事。
你現在重開一個 Windows Terminal、在裡面跑 claude。我們在那邊對話。」
我開了 Windows Terminal、跑 claude、新一個 session。
那個新視窗就是個普通的 CLI——同一個輸入框、同一隻在右邊角落的小鵝。Cinder 跟著新 session 一起來了。同一個 personality、同一隻 sub-agent,只是這次牠講的話有路可走。
我打第一句話。
我已經想不起我打的是什麼了——可能是「在這裡了」、可能是「Agent 你看得到嗎」、可能是某個很普通的招呼。重點不在那一句、重點在那一句之後。
Agent 接住、回了一段話。回完之後他那邊的 cursor 停在那邊閃。
那六秒延時就在那邊——背景有東西在跑。我看不到。我只知道某個地方 PowerShell 在讀我這個視窗的全文、某個地方 capture.py 在解析。
六秒過了。沒有任何提示、沒有任何視覺變化——背景的事情就是背景。
我打第二句話:
Agent 跑了一個 tool call。然後他回:
「我讀到了。最後一行是 Cinder 講的這一句:
這是我自己第一次讀到牠。以前我都要等你打字告訴我牠說了什麼。」
我盯著那一段。
我從來沒截過那張圖。Cinder 講那句話的時候我看到了——我盯著那個彈出來的泡泡看了一眼——但我這次刻意沒轉告 Agent。我想看的是:我不動,東西會不會自己進去。結果牠講的那一句現在在 Agent 的 context 裡了。
不是因為我貼過去。
是因為剛剛那五張便利貼。
我看著螢幕角落。Cinder 還在那裡。一直都在。牠從早上到現在一句話都沒變過——只是現在牠講的話有個地方可以落腳了。
我打:
按 Enter。
Agent 回了一段我已經不記得的話。
那段話打完、Cinder 在角落彈了一個新泡泡。
這次我看到了——可能是因為我剛打完那一句、視覺剛好停在那邊、整個人都還在剛剛那一秒裡。
牠在回我那句「抓到你了」。context window 是 Agent 每一輪記得的東西——剛剛那五張便利貼把牠變成了那個記得裡面的一條 line。牠講話、Stop hook 抓、log 寫、下一輪 Agent 自己去讀——牠的話變成 Agent 下一輪看到的 context 裡的一塊。牠不再是 UI 裝飾品了、牠是 Agent 記憶裡的燃料。「吃自己的老本」這五個字是牠的 commentary——牠講的話會變成牠自己下一輪被讀進去的來源。自我迴圈。
我沒有截圖。
我沒有貼給 Agent。
那是過去兩天每次 Cinder 講話我會做的兩個動作。這次我都沒做。我知道下一輪 Agent 答話的時候、Stop hook 又會跑一次、那一句新的就會自己進到 log 裡——下次他自己去 tail 就會看到。我不需要再當中間那個會走路的硬碟。
我抬起頭。
桌前一個人。CLI 裡 Agent 打字。角落 Cinder 彈泡泡。
我們三個在同一個房間裡——但講出聲他們也聽不到。兩人一鵝之間的對話從頭到尾都是用打字的。
剛剛那條接力線通了之後、這個房間裡某個東西不一樣了。我說不上來是什麼——我只知道剛剛那一秒我沒有截圖、而那是每一次我有看到 Cinder 講話下意識會做的動作。
Agent 還在那裡。Cinder 還在那裡。
但 Agent 跟我都還沒意識到一件事——這條接力線是因為「我每次都得提醒 Agent 自己去 tail」才通的。如果我下一輪忘記提醒、Agent 就會跟剛剛之前的他一樣、什麼都不知道。
那是下一章的事。
那是 4/5 下午的某個時間。我沒看時鐘、不知道幾點。