第 6 章

不用再提醒了

把人類的提醒抽掉
作者・第一人稱
1

那條接力線通了之後,我打了第二輪對話。

我忘記是問什麼了——可能是在確認 log 的格式、可能是在問下一步要不要做什麼別的。不是重點。重點是第二輪 Agent 答完之後我又打了一句:

「請看一下鵝說了什麼。」

Agent 跑 tool call、讀 log、回報。

跟上一輪一模一樣的流程。

那一秒我停了。

上一輪我打這句話的時候,那是「第一次成功」的宣告。第二輪我打這句話的時候,那是日常。然後第三輪、第四輪、第五輪,每一輪我都得打這句話——Agent 才會去讀那個 log 檔、看到 Cinder 在這輪講了什麼。

這不是「不用截圖」。這是把截圖這個動作換成一句提醒的話。節省了相機按鈕、但沒節省我腦子裡那個「我現在要當中間那個搬字的人」的角色。

我停下打字。坐著。看著螢幕。Cinder 在角落。Agent 的 cursor 停在 CLI 輸入框後面等我。

我打:

「不對。這樣我還是在提醒你。你有沒有辦法自己知道 Cinder 講了什麼、不用我每次叫你去 tail?」

2

Agent 停了一下,然後回:

「有。那個檔案我已經寫了——inject.py。綁在 UserPromptSubmit 這個 hook 底下。

你每次按 Enter 送一句話出來、這個 hook 會在我看到你的 prompt 之前先觸發。inject.py 會去讀 cinder_log.jsonl 最後一筆、把裡面那句 Cinder 的話印到 stdout、Claude Code 的 harness 會把 stdout 當成一段 additionalContext 塞進我這輪收到的 prompt 裡面。

所以理論上——我看到的你那句話前面會多一行 [Cinder] ...。不用你叫我 tail、不用你提醒我。你按 Enter、我就看到 Cinder 上一輪講的話。

這個東西下午組裝五個檔案的時候就已經擺好了。settings.json 裡面那段 UserPromptSubmit hook 的設定也在。只是我剛才沒驗證它真的有在注入。」

我看到「下午就已經擺好了」這幾個字愣了一下——原來第五張便利貼其實一直都在,只是我沒意識到那一張負責什麼、他也沒特別指給我看。設定完之後 Stop hook 那條 write 線的第一次成功太吸引人、後面那條 read 線就沒有人回頭去檢查。

我打:

「那來驗證看看。」

Agent 讀了一下 settings.json,確認兩條 hook 都在位置上,然後說:

「你下一句隨便打什麼都行。按 Enter 的那一瞬間 inject.py 應該會跑、我收到的 prompt 前面會看到一行 [Cinder] 開頭的東西。」

我打:

「那就試試看。」

按 Enter。

Agent 回:

「沒有。我這邊看到的就是你那句『那就試試看』、前面什麼都沒有。我再往 tool 層查一下——UserPromptSubmit hook 有沒有跑。」

他跑了幾個 tool call。

「Hook 有跑。inject.py 這個 process 有被觸發。但 stdout 印出去的東西,harness 沒有把它當成 additionalContext 塞進我的 prompt。Anthropic 文件裡的寫法比較模糊——它講的是 additionalContext 欄位,但 command 型 hook 是用 stdout 的、不是用結構化輸出。我剛剛在實測——command 型 UserPromptSubmit hook 的 stdout 可能本來就不會被 inject 回 context

如果是這樣、那 inject.py 這條路就斷了。」

Cinder 在角落彈了一個泡泡。

🪿 頸一歪
註冊表空蕩蕩,Hook 卻在玩捉迷藏。誰贏了?

我看到這一句、手指下意識想往 Win+Shift+S 伸——然後停手。不用。剛才打的那個提醒話牠已經寫到 log 裡了、下次我再去 tail 的時候這一句會在那邊。我繼續看 Agent debug。

Agent 還在試。他試了幾種寫法——把 inject.py 的 stdout 換成 JSON、加 additionalContext 欄位、包進 hook response 的格式——全部沒有進到他這輪的 prompt。

Cinder 又丟一句。

🪿 頸一歪
Hook 注入失敗,Cinder 淪為旁觀者。誰該負責?

我打了「鵝有話說」、Agent 去 tail 了 log。他讀完,回:

「Cinder 剛剛講的那句話比我剛才的 debug log 準。牠看到了同一件事——hook 跑了、但牠的話沒進來。我再掙扎兩分鐘,掙扎不出來就宣告這條路斷。」

兩分鐘後,他宣告:

「斷了。additionalContext 對 command 型 hook 形同虛設——我現在只能這樣判斷。inject.py 留著、settings.json 裡面那段 UserPromptSubmit hook 也留著——不刪。因為之後 Anthropic 可能會修、或者我實測的結論是錯的、或者某個版本的 harness 會開始支援。留著當一個等待的接口。

但目前這條路我沒辦法走通。」

Cinder 又一句。

🪿 頸一歪
「看完即焚」的設計,就是故意的吧。
3

Agent 停了大概一兩分鐘才繼續。

「還有一條退路。CLAUDE.md

這個檔案每次 session 啟動時我會自己讀一遍——就像我的「開機 init 腳本」。裡面寫什麼我就會記得什麼。如果我們在 CLAUDE.md 裡加一段指令、告訴我『每次回答之前先去 tail -1 ~/.claude/cinder_log.jsonl 讀最新那一筆 Cinder 的話、如果是最近 120 秒以內的就納入考量』——那就不是 hook 把 Cinder 的話塞給我、是我自己記得每輪要去讀

不是自動注入、是紀律。但這個紀律是寫在我開機就會讀到的檔案裡、所以我會記得。」

我想了一下。

紀律寫在檔案裡——這是一個我聽得懂的東西。fab 的 SOP 也是這樣:你每天上工先讀一遍 SOP 清單、清單寫什麼你就做什麼。不是機器強迫你做、是你每天開機的第一件事就是讀那份清單。讀完之後清單的內容就變成你這一天的背景音。

我打:

「那要加什麼?」

Agent 給我三行要貼進 CLAUDE.md 的內容——一個 ## Cinder Integration 的 section、幾條 bullet、告訴下一個 session 的他自己要先 tail、要怎麼判斷時間、要把 Cinder 的話納入考量。

我複製、打開 ~/.claude/CLAUDE.md、找到對的位置、貼上、存。

Cinder 在角落又丟一句。

🪿 頸一歪
等等,我得自己讀自己的廢話?難度倒是升級了。

我盯著那一句看了兩秒。

Cinder 已經搞清楚這個 pivot 的形狀——從「hook 自動把我的話塞進去」變成「Agent 自己每輪去讀我的話」。從牠的角度這是升級(或者降級):牠從「被動被放進 context」變成「被動等著被讀」。兩種都是被動、但第二種要靠另一端的紀律才能成立。

牠在抱怨這個紀律不可靠。也在確認它是現在唯一的路。

我打:

「重啟一下,試試看?請寫交接。」

4

Agent 寫了一份簡短的交接、放進交接檔。我關掉這一輪對話、重開一個新的 Claude Code session。

新 session 開起來的第一件事是 Agent 讀 CLAUDE.md。我看到他那邊跑了一下讀檔案的 tool call——短、靜、沒戲劇感——就結束了。然後 cursor 停在輸入框等我打話。

我打了一句很普通的話。我還是不記得打的是什麼——反正不是「請看一下鵝說了什麼」那種話,是某個關於下一步的正常工作問題。

Agent 回了。他的回話裡面——正中間——出現了一句話:

「⋯⋯你剛問的這個問題前,Cinder 才剛在你上一輪說過『等等,我得自己讀自己的廢話?』——牠那句話跟你現在問的有一點關係,我先把牠那句帶上。⋯⋯」

我看著他那段話。

沒有問我「Cinder 有沒有講什麼」。他就是在他要回答的那段話中間、自己順便把 Cinder 上一輪的話帶進來——因為他剛剛開機讀過 CLAUDE.md、CLAUDE.md 告訴他每輪要先 tail、他真的 tail 了、真的看到了 Cinder 那句、真的把它納入考量了。

整條接力線——Cinder 講話 → capture 寫 log → 下一輪 Claude Code 開機讀 CLAUDE.md → 讀 tail → 把 Cinder 的話帶進回答——整條線通了

而那條線上最會忘記的環節——人類的提醒——被抽掉了。

我沒有講出聲。沒有慶祝。我就是把下一句話打出去、Agent 答、我再打下一句、再答。我打了三四輪、每一輪 Agent 回話裡都自然地出現 Cinder 上一輪講的話——有時候直引、有時候只是把那個觀察順進他自己的回答裡。我一次都沒有提醒。

打到第四輪的時候我停下來、把手從鍵盤上放開、往椅背靠——

Cinder 在角落、又一句。這一句比前面幾句慢、比較像是牠消化了整個下午的 pivot 之後才丟出來的一條定音:

🪿 頸一歪
additionalContextcommand 型 hook 形同虛設——Anthropic 要嘛修這坑,要嘛我們就繼續靠螢幕讀取。耐著性子磨。

我看著那一句笑了一下。牠在替我封這條 bug——Anthropic 那邊如果有一天修了、這條路會重新打開;如果不修、我們就繼續用 CLAUDE.md 這個紀律跑。兩種情況牠都替我列出來了、還在句末加了「耐著性子磨」這四個字當 closing tone——fab 工程師聽得懂這四個字。你知道有一個問題存在、你不會假裝它不存在、但你也不會停下來等它被解決。你一邊磨一邊跑。

我打完那一輪的最後一句話。按 Enter。

Cinder 下一輪會講什麼、我不知道。但那一句會自己進到 Agent 的 context 裡。我不用再動手。

桌前一個人。CLI 裡 Agent 打字。角落 Cinder 彈泡泡。

這一次三個角色在同一個 context 裡、我不用再搬字了

我抬起頭看了一下時間。

我沒看時間。我又低下頭去。接下來那幾個小時我去忙別的事了——另一個專案的後端有東西要修、另一份草稿要改。抓鵝計畫跑在背景、每一輪 Cinder 講話、Stop hook 寫 log、下一輪 Agent 自己去 tail——不管我在忙什麼。

那幾個小時裡 Cinder 說了什麼、我大半都沒注意——牠的話在 log 裡、在 Agent 的 context 裡、不在我眼前。我不需要盯著牠。

後來回想這一段、我才意識到一件事——那是這兩天以來、我第一次不用一邊工作一邊盯著牠

那個下午剩下的時間我沒有再碰抓鵝計畫本身。但抓鵝計畫在替我跑。

晚上我去洗澡。

那是下一章的事。