標籤: Context Engineering

  • Claude Design 實戰拆解:brainstorming/spec/plan 三層流程的必要性與代價

    重點摘要

    • Claude Design 不是一個工具,是 Claude Code 裡由 brainstormingwriting-planssubagent-driven-development 三個技能組成的結構化開發流程,把「想 → 寫規格 → 拆任務 → 做 → 審查」變成可追蹤的步驟。
    • 最大價值是「砍掉不該做的事」——在我的失智症陪伴專案裡,這個流程幫我在寫 code 前砍掉了背景音樂、獨立話題卡、每日心情打卡三個功能,省下至少 3-4 小時重工。
    • 設計原則會在對話中浮出來——使用者一句「照顧者腦子清晰的,可以有期待的方式知道」變成整個系統的「可預期」原則,驅動 45 條提示語都用同一個模板。
    • 但它不適合所有情境——單檔 HTML 原型用 subagent-driven-development 會被 39 次 subagent dispatch 拖到超慢,實測比 inline 慢 3-5 倍。
    • 判斷標準:想事情時用 brainstorming、寫一致內容時用 spec、多檔複雜時用 subagent;單檔改一個函式就直接 inline。
    • 最深的反省:Claude Design 其實就是把 SDD「菜譜化」。人人可以照做,但如果不懂菜譜背後的「為什麼」,遇到菜譜涵蓋不了的變化就卡住。AI 時代最危險的是「永遠繞著菜譜轉、卻以為自己會了」——你的能力上限會被 AI 給的菜譜深度封頂。
    • 用中華一番「大魔術熊貓豆腐」案例說明:對手下黑手、大豆意外變納豆、把汙染當靈感——這三個 AI 結構上做不到的元素。文末附 7 個對抗菜譜化的具體做法,最關鍵是「保留一塊 AI 絕不介入的創作領域」。

    「Claude Design」這個名字其實沒有官方定義,它是 Claude Code 裡一組設計驅動的工作流程技能(superpowers:brainstorming / writing-plans / subagent-driven-development)的總和。我最近用它做了一個失智症陪伴 APP 的重大功能迭代,這篇文章把它在實戰中「什麼時候救了我」跟「什麼時候反而拖慢我」完整拆給你看。

    Claude Design 是什麼?三層流程一次看懂

    Claude Design 是一套讓 AI 助手在動手寫 code 前先「想清楚 → 寫規格 → 拆任務」的結構化流程。它不是任何新工具,而是 Claude Code 內建的三個技能組合使用:

    階段 技能名稱 產出 目的
    1. 發想 brainstorming 設計 spec(Markdown) 用多輪一問一答釐清需求、砍掉不該做的、浮出設計原則
    2. 規劃 writing-plans 實作計畫(含驗證步驟) 把 spec 拆成 10-20 個可個別 commit 的小任務
    3. 執行 subagent-driven-development 每個 task 一個 commit 派 subagent 做、派 subagent 審 spec、派 subagent 審 code quality

    重點不是「三個步驟」這個形式本身,而是每一步強迫你跟 AI 在不同粒度上達成共識:brainstorming 達成「做什麼」、spec 達成「做成什麼樣」、plan 達成「怎麼拆」、subagent 執行時還能雙重審查。

    沒用 Claude Design vs 用 Claude Design 的實際差異

    同樣是「加一個照顧者支援功能」的需求,兩種做法的差別在哪?這是我實測後的對照:

    面向 直接叫 AI 寫 走 Claude Design 流程
    需求釐清 憑 AI 猜,常常做錯方向 多輪問答,需求明確後才動手
    功能範圍 容易做太多(AI 傾向加功能) 在 brainstorming 階段就砍掉不必要項目
    一致性 做到一半風格會漂移 spec 用表格固定內容模板
    可追蹤 一個大 commit 或多個散亂 commit 每 task 一個 commit,可個別 revert
    重工成本 常常寫完才發現方向錯 方向錯在 spec 階段就發現
    速度 單點快、整體容易重工 前期慢、後期穩;不適合微任務

    實戰案例一:砍功能,省下 3-4 小時重工

    Claude Design 最值錢的貢獻不是寫 code,是阻止你寫不該寫的 code。在我的失智症陪伴 APP 迭代過程中,brainstorming 流程實際上幫我砍掉了三個功能:

    砍掉案例 1:背景音樂

    我一開始提議加背景音樂(失智症音樂療法有根據),brainstorming 過程中討論到「單檔 HTML 沒辦法帶 MP3、base64 嵌入會讓檔案爆到 30MB、用 File API 每次要重選」三個技術方案的取捨後,使用者自己說「先不要」。如果沒經過討論直接開寫,我大概會先做 File API + ducking 邏輯寫個兩小時,結果做完發現整個方向不對。

    砍掉案例 2:獨立話題卡

    原本規劃「話題卡」+「遊戲中陪伴提示」是兩個獨立功能。討論到一半,使用者界定:「這個 APP 是玩樂的時候用,真的要純聊天另外開 APP」。這句話直接把「獨立話題卡」功能從 spec 刪除,只保留遊戲情境下的提示。沒有這個界定,我會把話題卡塞進首頁,未來做下一個 APP 會有功能衝突。

    砍掉案例 3:每日心情打卡

    我在 brainstorming 時列過 5 個功能候選,其中「每日狀態簡記」(3 秒打卡心情/精神/食慾)看起來很有價值。使用者沒選這個,理由是「會把 v2 從『打開就用』變成『每天要記得打卡』,失智照顧者已經很累了」——這是使用者比我更懂他的使用情境的典型例子。AI 單獨設計是想不到這層的。

    這三個砍掉的功能合計估計省了 3-4 小時的 coding + 之後的 code review + git 回改。這才是 Claude Design 最值錢的部分——它讓「沒寫到 code 就砍掉」變成可能。

    實戰案例二:「可預期」這個原則如何救了 45 條提示語

    brainstorming 過程中,使用者往往會不經意說出一句話,變成整個系統的設計支柱。這次是這一句:

    「我希望對於照顧者而言,他是腦子清晰的,他可以有期待的方式知道,我可以看到該說什麼。」

    這句話裡面的「可預期」被提煉成整個功能的設計原則,寫進了 spec。然後這個原則驅動了三個具體決策:

    1. 提示固定模板:15 個遊戲 × 3 個時機(開場/答對/完成)= 45 條提示,全部用「情境 → 可以直接說的話」這個同一個格式,照顧者看一次就學會。
    2. 摘要強制預覽:不是一按就複製,而是開 modal 預覽、確認內容,才複製。照顧者對輸出「可預期」。
    3. 按鈕只在完成活動後才出現:有資料才有按鈕,避免使用者按下去才發現「沒東西可傳」。

    沒有 brainstorming 把這個原則浮出來、沒有 spec 把它寫下來,我會寫 45 條有個性的不同句型(AI 本能會追求多樣性)。結果照顧者每次要重新解讀 UI,反而更累。「可預期」這個字沒有出現在原始需求,是對話中自然生成的,但它比任何功能清單更重要。

    實戰案例三:Spec 表格讓語氣不漂移

    Spec 文件裡有一張表格,把 15 個遊戲 × 3 個時機 × 實際內容全部列出來:

    遊戲 開場 答對時 完成時
    顏色辨識 哇,好多顏色,你以前最愛穿什麼顏色? 對!你好厲害 今天陪你看顏色,我也覺得很漂亮
    認字遊戲 這個字你以前就認得吧 對啦,這個字你小時候就會了 今天還認這麼多字,真棒
    呼吸練習 我們一起慢慢呼吸 (改成中段顯示)吸氣…吐氣…不急 輕輕摸摸他的手,這樣就好

    如果不是在 spec 階段一次寫完這張表,而是「做到顏色遊戲時寫顏色的 3 條 → 做到形狀遊戲時寫形狀的 3 條」這樣推進,語氣一定會漂移。寫到第 10 個遊戲的時候我會忘記前面的語氣,變成有些句子很溫暖、有些很乾。表格逼我一次寫完,才有辦法保持「你年輕時、你很厲害」這類一致的溫度。

    這是表格化內容的威力——它讓「一致性」不是靠意志力維持,而是靠資料結構強制。

    反例:Claude Design 不適合的時候

    這次實戰也讓我踩到一個很明顯的坑:subagent-driven-development 對單檔 HTML 原型是殺雞用牛刀

    我一開始對 13 個 task 全部套用標準流程:每個 task 派 1 個 implementer subagent + 1 個 spec reviewer + 1 個 code reviewer,總共 39 次 subagent dispatch,每次 20-130 秒。前幾個 task 都只是「加一個 const、改一個函式」這種改動,triple review 完全是過殺。

    使用者實測後直接問我:「你寫程式變慢很多你用什麼模型」——這是一個誠實的信號。我當下檢討並切換到 inline 執行模式(我自己在 session 裡直接做),後半段 8 個 task 的速度回到正常的 3-5 倍。

    這個教訓很值:流程的 overhead 必須跟 task 粒度匹配。如果你的 task 只是改 20 行 code、不會影響其他模組,triple review 沒有價值,還會讓每個 task 多花 3-5 分鐘在 subagent 啟動/總結上。

    更重要的反省:Claude Design 是「菜譜」,不是基本功

    讀到這裡,你可能會問:「Claude Design 其實不就是 Spec-Driven Development(SDD)嗎?」 沒錯。brainstorming + spec + plan + implement 這四步是 SDD 老方法,不是 Claude Code 發明的。Claude Design 做的事其實是把 SDD 從「一千個人有一千種做法」方法化成「人人可以順暢工具化」的標準流程

    這是好事,也是很危險的事。

    菜譜出現前、出現後

    想像一下麻婆豆腐這道菜:

    • 菜譜出現前:只有師傅會做。每個師傅的麻婆豆腐都不一樣,因為他們從「為什麼要用豆瓣醬、為什麼花椒要後下」這種基本功思考過。客人要求「少辣多麻、加竹筍」這種變化,師傅能即時調整。
    • 菜譜出現後:人人可以照做,麻婆豆腐變得普及。但只會照菜譜的人,遇到「客人對豆瓣醬過敏,要用別的替代」這種問題就卡住了——因為他從來沒問過「為什麼要用豆瓣醬」。

    Claude Design 就是出現了菜譜。它把 SDD 的步驟變成 Skill、把「設計審批」變成 <HARD-GATE>、把 subagent 審查變成標準流程。你不需要知道為什麼要分離「設計」和「實作」,照著 skill 走就有規範的輸出。

    為什麼 AI 時代這件事特別危險

    菜譜時代的廚師,至少還能從菜譜回推原理——多做幾次就知道花椒晚下是為了香氣不揮發。但 AI 時代:

    1. 你問 AI「怎麼做需求分析」→ AI 給你 Claude Design 流程
    2. 你照流程做,產出看起來很漂亮的 spec 和 plan
    3. 你以為你會做需求分析了
    4. 遇到「這個需求太模糊、brainstorming 走 10 輪還是卡住」這種菜譜沒涵蓋的情況
    5. 你再問 AI → AI 給你另一個菜譜
    6. 你永遠繞著菜譜轉,沒有真的建立「為什麼需求會模糊、要怎麼引出使用者的隱藏前提」這種基本功

    最可怕的結果:你的能力上限永遠等於 AI 提供的菜譜深度。菜譜涵蓋不了的變化,你就做不到。而且因為你沒痛過傳統 SDD 的坑,你連「現在這個情境是菜譜解不了的」都判斷不出來——你不知道自己不知道

    SDD 真正的基本功是什麼

    Claude Design 的 skill 不會教你這些,但這些才是真正讓你能判斷、變通、甚至挑戰流程的基本功:

    菜譜只教你「做什麼」 基本功讓你懂「為什麼」
    brainstorming 要一次問一個問題 人的認知頻寬有限,多問題並排會讓使用者選擇癱瘓而隨便回答
    spec 要寫 45 條提示的表格 分批生成會有語氣漂移,但為什麼會漂移?因為 LLM 每次 context 都重新「感覺」一次
    實作前要設計審批 因為修改 code 的成本遠高於修改文字,越晚發現方向錯越貴
    subagent 要 triple review 多視角審查降低單一 agent 的盲點,但前提是 task 複雜到值得這個 overhead
    每 task 一個 commit Git bisect 的粒度等於 debug 速度,太粗的 commit 追 bug 要多花 10 倍時間

    懂了「為什麼」,你才能在菜譜斷裂的地方自己接住。例如:brainstorming 走不下去,你會知道這是因為使用者自己也沒想清楚,你要換一個方式(給他看 mockup 而不是繼續問字)而不是換另一個菜譜。

    給讀者的反省題

    每次用 Claude Design 之前,自問一句:「如果沒有這個菜譜,我會怎麼做這件事?」

    • 如果你答得出來 → 你用 Claude Design 是省時間
    • 如果你答不出來 → 你該先花時間讀 SDD 的原理,而不是依賴 skill 的自動化

    這不是反對 Claude Design。菜譜是好事,讓一道菜普及化。我想提醒的是:Claude Design 方便到你可能永遠不會問「為什麼」。而一個工程師的上限,取決於他問過多少個「為什麼」

    什麼時候用、什麼時候跳過?判斷決策表

    情境 建議流程 理由
    有多個可能方向、還在猶豫 brainstorming 避免選錯方向重工
    要改 15+ 個相似位置、要寫一致的內容 brainstorming + spec 用表格強制一致性
    多檔複雜後端、有 test framework、多人協作 完整三層 + subagent triple review 能防止衝突跟回歸 bug
    單檔 HTML、改一個函式、加一個按鈕 直接 inline,跳過流程 overhead 大於價值
    修 bug 已經知道怎麼修 直接改,不派流程 問題明確時流程是拖累
    重構一個模組的架構 brainstorming + spec(可能跳過 subagent) 要想清楚新架構但執行可以快

    3 個給讀者的實作建議

    1. 開工前先問自己一句話:「這個 task 的粒度適不適合走流程?」如果是「修一個 bug」「改一個顏色」,直接做;如果是「加一個新功能」「重構一個模組」,走 brainstorming。
    2. brainstorming 時刻意引導 AI 砍東西,不是加東西。AI 本能傾向加功能,你要主動問「這個是不是另一個 APP 的事?」「這個能不能先不要做?」。砍掉的功能是最值錢的產出。
    3. Spec 一定要用表格呈現重複性內容。如果你有 10+ 個相似的東西(15 個遊戲的 3 條提示、20 個 API 端點的 error message、12 個表單欄位的 placeholder),強制用表格一次寫完,不要分批生成。

    中華一番案例:AI 結構上做不到的創新

    講到這裡都還是抽象論述。讓我用一個具體案例把「AI 為什麼結構上做不到某些創新」講清楚——1997 年日本動畫《中華一番》第 43 集「大魔術熊貓豆腐」。

    劇情背景:小當家與黑暗料理界的邵安,在樓麟艦上進行豆腐對決。評委要求不能用現成豆腐,必須從黃豆開始做。比賽中:

    1. 對手下黑手:黑暗料理界的向恩把稻草偷偷放進小當家的大豆裡
    2. 意外發生:稻草上的納豆菌讓大豆發酵,大豆變成了納豆(日本傳統發酵食品)
    3. 認知翻轉:小當家看到黏糊牽絲的納豆,不是當成「比賽被破壞」丟掉,而是把這個意外當成靈感起點
    4. 創新誕生:從納豆的特性衍生出做法與工具,最終做出「大魔術熊貓麻婆豆腐」擊敗邵安

    (資料來源:萌娘百科納豆條目,ACGN 中的納豆相關劇情段落)

    這故事裡有三個 AI 結構上做不到的元素

    劇情元素 AI 為什麼做不到
    對手下黑手破壞材料 AI 的 brainstorming 永遠假設「正常情境」,不會模擬「比賽中有人陷害你」這種社會性干擾
    辨識大豆已變納豆 需要跨文化背景知識在當下湧現。一個四川廚師要有人把日本發酵食品的視角帶進來,AI 知道但不會主動從「邊緣」冒出來
    把失敗當靈感起點 AI 被訓練避免失敗、給成功解。被汙染的食材應該丟掉重做——這是 AI 的強勢模式。把 contamination 翻轉成創新起點是訓練資料裡的反模式

    我把這個對比叫做「紹安路 vs 小當家路」

    • 紹安路:精修技術、重組既有元素、走正統菜譜 → AI 擅長
    • 小當家路:個人記憶 + 意外事件 + 跨文化知識 + 重新定義失敗 → AI 做不到

    紹安在豆腐三重奏對決中輸得更深:他自以為原創的料理,其實 7 年前師父陳邦鈴就做過一樣的。他切斷了有意識的傳承,但無意識的傳承切不斷——他走遍中國、投奔黑暗料理界研發的「自創」菜,結構上還是師承的重組。

    用 Claude Design 久了的人可能遇到比紹安更慘的處境:紹安至少還是在複刻真實的師父,你在複刻 AI 訓練資料——但你不會知道,因為沒人會告訴你「這個東西 AI 在 2023 年就生成過一模一樣的了」。

    7 個對抗紹安化的具體做法(可以從下個 task 開始)

    如果你接受「菜譜化是現實、不會回頭」這個前提,那問題就不是「要不要用 Claude Design」,而是「怎麼用但不被它吃掉」。以下是我經過這次專案後整理的 7 個具體做法:

    1. 先離線想 10 分鐘,再開 AI

    用紙筆或純文字檔,在沒有 AI 的狀態下先寫下你對這題的想法——即使亂七八糟、半句話、只有關鍵字。寫完才來找 AI。這 10 分鐘的差別,是你有沒有在對話開始前建立自己的立場。

    2. 刻意加入 AI 絕對不會建議的約束

    AI 傾向推薦「平均來說最好的解」。你主動加怪條件逼自己走不一樣的路。例:做失智症陪伴工具時,不要說「做陪伴 APP」,說「做一個只能給老花眼、色盲、聽障照護者用的工具」——限制是創新的助產士。

    3. 每週跟一個「四郎」講一次話

    不是讓他們給你解決方案,是把他們的「意外知識」放進你生活。失智照護協會的阿姨、你媽或阿嬤(上一代的照護記憶)、會日文的朋友、幼稚園老師(他們跟認知差異的小孩互動方式跟失智照顧很像)⋯⋯讓他們隨口說的話在你腦裡發酵,像稻草丟進黃豆

    4. 把「bug / 意外 / 失敗」當創作材料,不是要避免的事

    開一個 inspirations-from-failures.md,每次遇到意外事件,先不要問怎麼解,先寫三句話:這個意外讓我看到什麼我原本沒看到的?這個限制如果我接受它,會變成什麼新東西?如果我把這個「bug」當成功能,會是什麼?AI 的訓練資料裡「bug 要修」是強勢模式,你要刻意反抗這個傾向。

    5. 對 AI 使用「反向問法」

    每次 AI 給你答案,下一句問:「這答案的相反是什麼?」「80 歲阿嬤會怎麼想這件事?」「如果這是錯的,錯在哪?」「這答案看起來合理,可是我錯過了什麼?」——這會強迫 AI 跳出訓練資料的中心,去邊緣抓東西。AI 不會主動做這件事,你得逼它。

    6. 保留一塊「AI 絕不介入」的創作領域

    不是「少用 AI」,是完全禁止。具體例子:照顧長輩的手寫日記(絕不給任何 AI 看)、一個嗜好(煮菜、種花、學樂器)、每週一天完全不開 Claude / ChatGPT。這塊領地是你保持「能產生小當家型靈感」的保護區。失去這塊,你永遠只能是紹安。

    7. 跟 AI 約定「小當家模式」信號詞

    當你要創新、不要優化時,直接跟 AI 說:「這次我要小當家模式,不要 Claude Design」。你的 AI 應該立刻做三件事:關閉所有 brainstorming/spec/plan 流程建議、不給業界做法、反過來問你的個人史跟身邊的人。這是你跟 AI 之間的信號詞。沒有它,AI 會把菜譜當成預設。

    優先順序:如果只能選一個開始

    選第 6(AI 禁區)。沒有這個,其他六個遲早會被 Claude 侵蝕回去。禁區是你維持「小當家能力」的物理基礎。

    結論:不是流程多就好,是流程跟 task 匹配才好

    Claude Design 不是一個「你該永遠用」的聖杯,也不是一個「多此一舉」的噱頭。它是一套當你面對真正需要思考的問題時,把你跟 AI 之間的對話規則化的工具。

    我這次失智症陪伴 APP 專案裡,Claude Design 救了我的前半段(brainstorming 砍功能 + spec 寫一致的 45 條提示),拖慢了我的後半段(subagent-driven-development 對單檔 HTML 過殺)。能分清這條線,是下次用它用得更好的關鍵。

    如果你的下一個 task 真的很簡單、你已經知道怎麼做——直接做。但如果你正在「想不清楚這功能該不該做」或「要做 15 個相似的東西怕語氣不一致」,那就值得花 20 分鐘先走 brainstorming。這 20 分鐘會幫你省下 3-4 小時。

    延伸閱讀

  • Claude 4.7 Memory 與 Agent Team 實戰:自建 Brain 系統的真正價值

    重點摘要

    • Claude 4.7 的 memory 改進本質是「檔案使用得更好」,不是新增神奇的跨 session 記憶機制 — session 之間仍然完全隔離,靠 MEMORY.md 等檔案橋接。
    • 自建 Brain 系統 = 精煉版 cross-session memory:機制相同(檔案 + CLAUDE.md 宣告載入),差別在手動 curate、domain 分類、顯式載入,品質遠勝 auto-memory。
    • Named sub-agent 真正的價值在「單一任務多輪延續」,不是 Team A/B/C 那種多工並行 — 兩者是互補的兩個層次。
    • Bug 追查 = PUA 方法論 × Named agent 容器 × Brain 更新,三層缺一不可,且要對「無法中斷的頻道(如 Bot)」具備韌性。
    • 模型版本升級 ≠ 知識管理升級:Brain 系統是 model-agnostic 設計,換任何 LLM 都能搬過去。

    Anthropic 在 2026 年 4 月發布的 Claude Opus 4.7 在 memory 和 Agent Team 兩塊都有顯著改進。但這些「改進」對已經自建知識架構的開發者來說,究竟是關鍵升級還是錦上添花?本文整理一天的深度討論,對比 Claude 原生機制和自建 Brain 系統,並落地一套可跨機器攜帶的 bug 追查框架。

    Part 1:Memory 系統 — 4.7 改了什麼,對我有什麼用

    Claude 4.7 的三個 memory 改進

    Claude Opus 4.7 在 memory 方面的改進可以拆成三個層次:

    1. 檔案式 memory 變「一等公民」:4.7 特別訓練用檔案系統當 memory(scratchpad、notes、structured store),能主動寫筆記且下次對話時知道去讀筆記。
    2. Cross-session 穩定性提升:跨多 session、多小時的工作流程一致性更好,模型會依 brain 和 memory 的指引從上次停下的地方接續。
    3. 1M context 無長 context 溢價:原生百萬 token context window,不另收費。以前 200K+ 要 /compact 的場景現在一口氣吃完。

    Cross-session memory 的真相:沒有魔法,只有檔案

    很多人以為 Claude 4.7 的 cross-session memory 是某種「核心系統」幫你串起過去對話。真相是:session 之間仍然完全隔離,模型本身沒有跨 session 的任何 state。所謂 cross-session,是 Claude Code 在新 session 開啟時自動注入:

    • CLAUDE.md(你寫的指令)
    • MEMORY.md 和 topic files(auto-memory 累積的筆記)
    • 過往 session summary(Claude Code 自動寫的摘要檔)

    這些全是檔案,不是隱藏的 cloud memory。4.7 改進的不是機制,而是對這套檔案機制的使用熟練度:知道什麼該寫、該去哪讀、讀到後如何套用。

    自建 Brain 系統 vs Claude 原生 auto-memory

    如果你已經有自建的 Brain 系統(跨專案的技術 domain 知識庫),對比 Claude 原生 auto-memory 會發現:本質是相同機制,差別在淬煉程度

    面向 Claude 原生 auto-memory 自建 Brain 系統
    範圍 單專案(綁 cwd) 跨專案(按技術 domain 分類)
    載入時機 Claude Code 自動注入 CLAUDE.md 宣告 Domain Brain: 主動載入
    curation 模型自動(容易塞流水帳) 手動規則過濾(Why / How to apply 格式)
    外部知識 僅記錄當前對話 支援 [source: external] 納入社群/文章的坑
    配套 memory 單打獨鬥 Brain + Skill 配對(坑 vs 對的做法)

    4.7 對自建 Brain 的實際收益

    對已經有成熟 Brain 系統的開發者,Claude 4.7 的 memory 改進主要體現在兩個地方:

    • Context 吞更多(70% 的價值):1M context 可以同時載入所有相關 brain + CLAUDE.md + 當前 code,不再被切斷。多個 brain 同時載入 5000+ 行也不爆。
    • 維護判斷力(30% 的價值):叫 Claude 整理 memory 時,4.7 會主動去讀 brain 檢查重複、按規則格式寫,而不是無腦 append。4.6 可能直接塞、不去重。
    • 自動 cross-session 對自建系統無感:已經有 Brain + CLAUDE.md 宣告機制的用戶根本不依賴 auto cross-session,品質比自動版高。

    關鍵洞察:模型版本升級 ≠ 知識管理升級。Anthropic 再怎麼升級內建 memory,都在解決「模型如何維護筆記」。但「什麼知識該存、怎麼結構化、跨專案怎麼轉移」是架構設計問題,不是模型能力問題。

    Part 2:Agent Team — Named sub-agent 真正解決什麼

    4.7 的四個 Agent Team 改進

    • Named sub-agents:spawn 時給名字,後續用 SendMessage({to: name}) 續接,不用重跑 context
    • Permission 繼承修正:user-level permissions 現在會正確傳給 teammate,不再每個 teammate 都跳一堆授權 prompt
    • 個別 teammate 可調 mode:spawn 後可以用 Shift+Tab 單獨切換某個 teammate 的 permission mode
    • /team-onboarding:自動分析使用歷史產生 ONBOARDING.md,幫新隊友快速上手

    前置條件:要啟用 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1,否則 SendMessage 工具根本不存在。

    Named sub-agent 和 Team A/B/C 的差異

    很多人以為 named sub-agent 是在取代自組 Team 的做法,其實兩者是不同層次的機制,互補而非競爭

    面向 Team A/B/C(宏觀) Named sub-agent(微觀)
    解決什麼 多工平行 單工延續
    邊界 不同 task 之間 同 team 內部 agent 之間
    Context 燒法 每個 team 獨立燒一份 同 agent 只燒一次,後續增量
    適用場景 早上開 3 件不相干的事 追一條長 bug / 深入一個模組

    最佳組合是兩者混用:宏觀 Team 隔離不同主題,微觀 named agent 讓每個 teammate 有連續記憶。等於開三家公司並行做不同案子,每家公司裡的同一個員工連續給你服務,不是每次都新人上場。

    已知限制:teammate 之間不能互喊

    目前 Claude Code 有個已知 bug(GitHub issue #48160):subagent 本身不能 originate SendMessage。意思是 teammate A 想主動找 teammate B 協作做不到,所有通訊必須經過 team lead 路由,變成星形拓撲(hub-and-spoke)而非 mesh。

    另外 delegate mode 有個連帶效應:lead 切到 delegate mode 後,它的權限限制會傳給 teammate,導致 teammate 也不能讀檔、跑命令,整個 team 卡住。解法是 spawn teammate 時明確放寬權限。

    Part 3:實戰落地 — Bug 追查框架

    為什麼開發和修正要用不同的 agent 拓撲

    對話中得到一個清晰的洞察:「開發」和「修正」性質不同,應該用不同的 agent 拓撲。

    Case 啟動策略
    開發(新 feature) Team A/B/C 並行,短 context agent,各管一塊
    修正(bug / fix) 單一 named agent + PUA,多輪深挖
    重構(無新功能) 單一 named agent,多檔追蹤 side effect

    認真追 bug 的 agent 應該有的樣子

    一個 bug 不是「修好就算了」。它有根本原因(root cause)、爆炸半徑(blast radius)、和教訓(lesson)。停在第一個看似合理的修補是 bug 改頭換面回來的最快路徑。認真的 bug-hunting agent 應該有三層結構:

    1. 方法論(如何思考):PUA 式修辭壓力 — 從不接受第一個假設、永遠挑戰自己的推理、窮盡所有替代方案。
    2. 延續性(如何記住):Named 長壽 agent 跨輪次攜帶 context,不要每輪重新 spawn 新 agent 失去歷史。
    3. 事後教訓(如何教未來):每個修好的 bug 都要更新 brain,否則知識死在這個專案。

    三層缺一不可:沒方法論 → 停在第一個合理原因、出 bandaid;沒延續性 → 每輪重講 context、走回原路;沒事後教訓 → 同一個 bug 六個月後在別專案又出現。

    頻道韌性:為什麼要假設「無法中斷」

    有些 channel(Bot wrapper、API-based tools、async chat)無法真正中斷正在跑的 turn,用戶的輸入只能排進下一輪。框架設計時要把這當前提:

    • 每個 hunter 步驟要快速 return 控制權,不要 chain 10 個 tool call
    • 長任務用 run_in_background: true 讓 lead 儘快 ready
    • 在自然 checkpoint 回報進度,讓用戶在下一輪調整方向
    • 把用戶輸入當戰略路線修正,不是即時操舵

    如果頻道可中斷(CLI)那是 bonus,不是前提。框架不該依賴可中斷性。

    Skill fallback:沒有 PUA 也要能跑

    如果你在多台機器工作,可能某台有 pua:pua-debugging skill、某台沒有。框架要具備graceful degradation

    • Skill 優先:有 PUA / systematic-debugging skill 時,讓 hunter 載入 — skill 是維護中的、品質更新快
    • Brain 兜底:把 PUA 的核心精神內嵌到 brain 檔,確保沒 skill 的機器也能按內建規則運作

    內嵌的規則例如:「假設你的第一個假設是錯的,立刻列出兩個會產生同樣症狀的替代方案」、「修好了 trigger 下一個問題:為什麼以前會壞?」、「症狀只能『大致』解釋 = 沒被解釋,真正的 root cause 能解釋所有觀察,包含奇怪的那些」。這套 inline rule 讓 brain 成為 skill 缺席時的 safety net。

    結案 checklist

    一個 bug 追查只有在全部滿足以下條件才算完:

    • Bug 可重現(或明確記錄為何無法重現)
    • 根本原因以白話講清楚
    • 修復已驗證(重現原 failure → 套用 fix → 確認 failure 停止)
    • 爆炸半徑評估(同一個 root cause 還可能壞掉什麼?)
    • Brain 檔已更新(domain 對、[source: project] tag 已加)
    • Commit message 以 fix: 開頭,而且 brain 更新發生在開始下一個 task 之前

    為什麼這套設計 model-agnostic

    整套 Brain + Skill + Agent Team 設計最大的優勢是 model-agnostic:未來換 Opus 5.0、換 Gemini 3、換 GPT-5,只要該模型支援讀檔案 + 自訂 instruction 機制,整套可以直接搬過去。

    Auto cross-session memory 綁在 Claude Code 內建機制上,換 tool 就沒了。自建 Brain 是把架構設計前置到模型之外 — 模型只負責執行,架構你自己定。結果是:

    • 4.7 再強,沒 Brain 也是亂塞
    • 4.6 再弱,有 Brain 也能跑
    • 未來換任何 LLM,這套設計直接移植

    這其實很接近個人化 RAG 系統的雛形 — 只是沒用 vector DB,用人類可讀的 markdown + 手動路由。反而更可控、更可維護。

    結論

    Claude 4.7 的 memory 和 Agent Team 改進都是實實在在的能力提升,但對已經有自建知識架構的開發者來說,真正的護城河不在追著升級模型,而在建立 model-agnostic 的架構設計

    • Memory:用 Brain 做跨專案長期記憶、用 MEMORY.md 做專案短期筆記、用 Skill 存對的做法 — 三者分工明確。
    • Agent Team:宏觀 Team A/B/C 並行處理不同主題 + 微觀 Named sub-agent 保持任務延續性 — 互補使用最強。
    • Bug 追查:方法論(PUA)× 容器(Named agent)× 事後教訓(Brain 更新)三層結構,對頻道韌性和 skill 缺席都要有 fallback。

    模型會一代代升級,但你累積的 Brain 不會過時 — 因為它記錄的不是模型能力,是你自己踩過的坑和學到的道理。

  • 你的 AI Agent Team 為什麼越做越小?視角驅動的編制方法論

    重點摘要

    • 你以為的「3 個 Agent 上限」可能是創傷的外推,不是設計 — 來自一次 OOM 事故的過度修正,結果反過來殺死你專案的角色細分工
    • 正確的限制是記憶體預算,不是數量 — 16GB 機器可用 ~11GB agent 預算,混合模型(Opus/Sonnet/Haiku)可以安全跑 8+ 個專職 agent
    • 但更深的問題是:角色不是頭銜,是視角 — 你該問「這個計畫需要哪些思考視角」,不是「我有幾個 slot」
    • 三個永遠不能省的視角:使用者、PM、測試者 — 即使是純技術、只有 Python、只有你一個人的專案,這三個視角的思考必須發生
    • 視角打分模型:每個視角用「風險 × 範圍」打 0-9 分,高分獨立成 agent,低分 fold 到其他 agent 的 prompt
    • 反直覺發現:小任務(3 行 API)比大任務更需要資深視角(架構師、運維、測試),因為實作已經不是風險,「該不該存在」才是
    • 壞規則會透過 template anchoring 自我強化 — 修了 runtime 規則還不夠,必須連 template 一起改

    我的 AGENTS.md template 有一條規則:Agent Team 最多 3 個同時跑。這條規則是對的 — 直到我發現它正在偷偷殺死我的專案設計。

    這篇文章是一趟很誠實的反思紀錄。從一次 16GB 機器 OOM 當機開始,到發現我對 AI Agent Team 的所有規則其實都建立在錯誤的抽象層上。結論不是「解除限制、大膽開 agent」,而是更根本的東西:角色根本不是我以為的那個東西

    第一層:我的規則其實是創傷,不是設計

    事情是這樣開始的。2026 年 3 月 3 日,我嘗試在 16GB 的 Mini PC 上同時跑 9 個 Opus agent 做大型重構,結果系統 OOM 當機。從那一天起,我的 MEMORY.md 多了一條 Iron Rule:「Agent Team 最多 3 個同時跑」。

    這條規則是理性的。9 個 Opus × 1GB ≈ 9GB,加上系統和 Docker 的常態佔用,16GB 當然吃不下。3 個是「經驗上安全」的數字。但我沒注意到一件事:這條規則是在「全 Opus」的情境下歸納出來的。我直接把它當成所有情境的通用上限,沒考慮混合模型的狀況。

    更糟的是,這條規則開始滲透到我的 AGENTS.md template、我的專案計畫、我對每個新專案的初始設計。結果是:即使某個專案明明應該有架構師、後端、前端、Kafka、SQL、Test、PM、QA 八個角色,我也會「收斂」到「全端 + 檢查者 + 架構師」三人組。我不是選擇了簡化設計,是我被一條舊規則綁架了設計想像力

    第二層:記憶體預算制取代數量制

    第一個修正很直覺:限制應該是記憶體總量,不是 agent 數量。16GB 機器扣掉系統和 Docker 的 ~5GB,還剩 ~11GB 可以給 agent 用。而不同模型的記憶體占用差很多:

    模型 記憶體 適合任務類型
    Opus ~1.0 GB 架構決策、跨檔案推理、複雜邏輯、資深思考
    Sonnet ~0.6 GB 實作、API、測試、文件
    Haiku ~0.4 GB 檔案掃描、config 對照、簡單查詢

    換算一下:一個架構師(Opus 1.0)+ 兩個後端(Sonnet × 2 = 1.2)+ 前端(Sonnet 0.6)+ SQL(Sonnet 0.6)+ Kafka(Sonnet 0.6)+ Test(Sonnet 0.6)+ QA + PM(Haiku × 2 = 0.8)= 5.4 GB,8 個 agent。完全在 11GB 預算內,還有 5.6GB 的 headroom。

    所以「3 個 agent」的舊規則其實是錯的。正確的說法是「全 Opus 時 ≤ 3 個;混合模型時可以到 8+ 個,只要總和在預算內」。這一步修完,我理論上可以解鎖原本想要的專職團隊設計。

    但這還不夠:我一直在錯的抽象層解決問題

    我以為修到這裡就結束了。結果真正的問題還在更上面一層。

    記憶體預算制解決了「能不能開 8 個 agent」的技術問題,但沒解決「我該開哪 8 個角色」的設計問題。我仍然在用「頭銜思維」想 Agent Team — 有一個固定的角色清單(架構師、後端、前端、QA…),看看預算能放幾個,從清單挑幾個進來。

    這個思維的錯誤在哪?它把「角色」當成頭銜 / headcount,而角色的本質其實是視角 / perspective — 一種「怎麼思考這件事」的觀點。兩個是完全不同的東西:

    思維 頭銜 Headcount 視角 Perspective
    單位 angular-dev、backend-dev 「使用者會怎麼用」「PM 會怎麼想」
    數量 固定清單 每個 plan 動態決定
    「只有 Python」專案 1 個 Python dev 就好 仍需使用者、PM、測試視角
    小任務(3 行) 給最便宜的 dev 可能需要最資深的運維視角

    三個永遠不能省的視角

    這是最實用的一條發現。不管你的專案是什麼技術、什麼規模、幾個人做,這三個視角永遠必須存在:

    • 使用者視角 — 誰會用這個東西?他們的心智模型是什麼?介面怎麼設計才順?
    • PM 視角 — 這件事符合大方向嗎?是現在最該做的嗎?會影響別的優先級嗎?
    • 測試者視角 — 什麼會壞?邊界 case 在哪?漏掉什麼?失敗模式是什麼?

    這三個視角可以 fold 到其他 agent 的 prompt 裡(例如讓 backend-dev 在設計階段戴 PM 帽子),但絕對不能默默省略。省略它們的結果是:你會產出「技術上正確、實用上無用」的東西 — API 能跑但沒人想用、feature 完成但 PM 說這不是重點、code 過 review 但上線就爆 edge case。

    「只有 Python」不是跳過使用者視角的理由。「只有你一個人」不是跳過 PM 視角的理由。「只是改一行」不是跳過測試者視角的理由。這三個視角的思考必須發生,差別只在「由誰承擔」,不在「要不要做」。

    視角打分模型:風險 × 範圍

    光知道「要列視角」還不夠,還要知道哪些重要、哪些次要。我用的打分模型很簡單:Score = Risk × Scope,兩個維度都是 0-3,總分 0-9。

    • 風險:這個視角漏掉的話多慘?(0 = 無所謂,3 = 災難)
    • 範圍:這個視角涉及多少產出物?(0 = 無,3 = 全部)

    分數算出來後按以下規則分組到 agent:

    • Score ≥ 6:獨立 agent,很可能要用 Opus 或高階 Sonnet
    • Score 3-5:獨立 agent,或跟另一個視角配對(Sonnet)
    • Score 1-2:fold 到其他 agent 的 prompt,明確列入該 agent 的優先順序
    • Score 0:在計畫裡 acknowledge 就好,不花 agent 資源

    最後檢查記憶體預算是否超過 11GB,超過就把分數最低的兩個合併。

    反直覺發現:小任務需要更資深的視角

    這是這整套方法論裡最違反直覺、也最容易忽略的一條。實作越簡單的任務,反而越需要資深視角

    原因很微妙:大任務的風險分散在許多實作細節裡,實作者視角得分最高(因為「寫錯」的機率大)。但小任務的實作幾乎免費 — 風險已經轉移到別的地方了:「這東西該不該存在」(架構師視角)、「會不會在奇怪情境下爆」(測試者視角)、「運維怎麼用這個 endpoint 做決策」(運維視角)

    具體例子:幫一個 Docker 服務加 /health endpoint,回 {"status": "ok"}

    • 實作者視角:風險 1 × 範圍 1 = 1 分(3 行誰都會寫)
    • 運維視角:風險 3 × 範圍 2 = 6 分(這個 endpoint 決定服務要不要被 monitoring 重啟)
    • 架構師視角:風險 3 × 範圍 1 = 3 分(「健康」的定義是最大問題)
    • 測試者視角:風險 2 × 範圍 1 = 2 分
    • 使用者視角:風險 2 × 範圍 1 = 2 分

    結論:這個任務要派一個 Sonnet agent,但 prompt 的優先順序是運維 > 架構 > 測試 > 使用者 > 實作。它不是「後端 dev 寫 3 行」,是「一個有運維腦袋的人剛好以 3 行 code 為產出」。

    這個例子回答了我長久的困惑:「小任務該加一個專職 agent,還是從 tester 出發、還是從 dev 出發?」答案是 — 從得分最高的視角出發,不從頭銜出發。小任務通常是資深視角得分高,所以該派的不是 junior implementer,是帶著資深視角的人。

    三個完整案例

    案例 1:純 Python script(200 行,讀 CSV 做統計)

    視角枚舉:Python 實作者、使用者、PM、測試者、架構師

    打分:實作者 6、測試者 6(資料邊界 case 是真風險)、使用者 2、PM 1、架構師 1

    分組:2 個 Sonnet(~1.2 GB)

    • Agent 1:實作 + 架構 + PM 視角(優先:實作)
    • Agent 2:測試 + 使用者視角(優先:測試 — 資料邊界主導)

    2 個 agent,但 5 個視角都被想過了。要的是「每個視角都有思考發生」,不是「每個視角都有一個人」。

    案例 2:OMS 訂單退款功能(跨前後端/Kafka/SQL/admin)

    視角枚舉:架構師、安全、後端、前端、Kafka、SQL、Admin UI、測試、使用者、PM、合規

    打分:每個都 ≥ 4 分,因為範圍廣且風險高(金流)

    分組:9 個 agent(~6.6 GB,預算內)

    • Architect(Opus)、Security(Opus)
    • Backend-dev、Frontend-dev、Kafka、SQL、Admin-UI、Tester(全部 Sonnet)
    • 使用者 + PM + 合規視角 fold 到一個 Haiku

    這就是大型專案值得完整專職團隊的時候。注意:即使 9 個 agent,使用者和 PM 視角還是被 fold 到一個 Haiku,不是各自獨立。視角沒被省,但不一定要佔獨立 slot

    案例 3:3 行 /health endpoint(已在前面詳細分析)

    分組:1 個 Sonnet,所有 5 個視角都 fold,優先順序運維 > 架構 > 測試 > 使用者 > 實作。

    計畫修訂時必須重算

    一個容易忽略的點:staffing 是 live document,不是一次性決定。當計畫執行到一半發現:

    • 新需求浮現(「喔原來這個也要接 Kafka」)→ 新視角需要打分,決定獨立或 fold
    • 某視角發現其實很關鍵(原本 fold 的安全視角,發現有 PII 暴露)→ 升級為獨立 agent
    • 某視角發現其實不必要(決定不做 admin UI)→ 該 agent 退場或重新分配

    每次 plan 修訂都該觸發 staffing 重算。如果 AGENTS.md 跟當前 plan 不同步,應該先更新 AGENTS.md 再繼續 dispatch。

    壞規則會自我強化 — template anchoring 的陷阱

    最後我想分享一個元層級的教訓,是這整件事最讓我不舒服的部分。

    我一開始以為只需要改 runtime 規則(把「3 個上限」改成「預算制」)就好了。但我後來發現:壞規則會透過 template 自我強化。我的 AGENTS.md template 原本的例子只有 2 個角色(implementer + reviewer),這個「低錨」讓我每次初始化新專案時,都自動往「3-5 個角色」的方向填,幾乎從不主動設計 7-10 個。

    這形成一個 feedback loop:

    • 創傷 → 記憶體規則收緊到「3 個」
    • Template 的例子反映記憶體規則 → 錨在低數量
    • 我用 template 寫新 AGENTS.md → 產出低角色的設計
    • 低角色的設計變成「標準」→ 我的記憶認為「就是這樣」
    • 循環加強

    光改規則不夠,template 也得改。我最後把 template 改成強迫跑完整個視角打分流程的版本:頂部要求先讀「視角驅動 staffing」的 brain,中間有「Perspective Inventory」區塊要你填每個視角的 Risk × Scope 分數,再下面是「Memory Budget」計算區塊。沒跑完流程根本填不完 template。

    這個 template 和配套的方法論 brain 都放在公開的領域腦 repo裡,歡迎 clone 參考。

    跟 VCS / 版本控制的關係

    如果你讀過我之前那篇 Jujutsu vs Git,可能會問:視角驅動 staffing 跟 jj 有什麼關係?

    答案是:沒有關係,而且這個順序很重要。視角驅動 staffing 是計畫期的事 — 你在寫 plan、決定 Agent Team 編制時發生。VCS(git / jj / worktree / workspace)是執行期的事 — Agent Team 已經成立、開始跑、產出變動需要合併的時候才登場。不能倒過來。

    我之前一度把這兩件事混在一起寫(在「VCS + AI 工作流」的 brain 裡討論 Agent Team 編制),後來意識到這是錯的。Staffing 決定「要做什麼」,VCS 決定「做的產出怎麼合併」。兩者相關但獨立,混在一起會讓人以為「切到 jj 就能多開 agent」— 不是的,能多開 agent 是記憶體預算 + 視角分析的事,跟 VCS 無關。

    結論:為什麼這個順序重要

    我從「Agent Team 最多 3 個」走到「視角驅動編制」的這段路程,對我來說最重要的一個 meta-lesson 是:你的限制規則可能不是來自設計,而是來自創傷。一次系統炸掉的記憶,會變成一條 Iron Rule,然後透過 template anchoring 滲透到你所有未來的設計決策。

    修復這種規則不能只修表面。你得:

    1. 檢視規則的原始情境 — 它是在什麼條件下產生的?那些條件還成立嗎?
    2. 把規則轉成可計算的東西 — 不是「最多 3 個」,是「11GB 預算」;不是「寫 3 行 API」,是「運維視角 6 分」
    3. 上升到更對的抽象層 — 從「數量」到「預算」是一次升級,從「頭銜」到「視角」是又一次升級
    4. 同時改 template — 不然新專案會繼承舊錨,規則永遠修不乾淨

    這個流程不只適用 Agent Team 編制,適用任何你「歸納」出來的工程規則。下次你發現自己下意識地拒絕某個選項(「不能這樣做,會爆」),請誠實問自己:這個規則是設計來的,還是創傷來的?如果是後者,它可能正在偷偷殺死你的系統設計,而你根本沒意識到。

  • 訓馬筆記:兩個月把 Claude Code 從脫韁野馬馴成工作夥伴的完整紀錄

    重點摘要

    • 這是一篇真實的「訓馬筆記」——記錄一個工程師花兩個月,把 Claude Code 從一匹脫韁野馬馴成穩定的工作夥伴
    • 每一條規則背後都是一次災難。32 個具體的坑7 條鐵律9 個領域知識庫,全部是用血淚換來的
    • 結論:AI 不是買回來就能用的工具,它是一匹需要調教的馬。你的 harness 決定它能跑多遠

    2026 年 2 月,我開始全職跟 Claude Code 合作。寫 ERP 外掛、做電商 OMS、搞量化回測、建爬蟲系統——大概七八個專案同時推進。

    兩個月後回頭看,我發現最有價值的不是寫了多少 code,而是我踩了多少坑、立了多少規矩。這篇文章是完整的訓馬筆記——每一個階段的災難、調適、和最後形成的紀律。

    如果你也在用 AI coding agent,這些坑你可能正在踩,或者即將踩。

    第一階段:裸奔期(2 月)——什麼規矩都沒有

    剛開始合作的時候,我就像買了一匹賽馬,直接騎上去就跑。沒有韁繩、沒有馬鞍、沒有圍欄。

    坑 1:回測引擎 37 筆交易全部假停損(2/27)

    我讓 Claude 幫我寫量化回測引擎。跑出來 350 根 K 棒的上漲趨勢數據,結果 37 筆交易全部在第一天就觸發停損退場,勝率 0%。在一個明顯的上漲趨勢裡。

    花了兩天才找到 root cause:引擎把「含滑價的進場價」和「原始市場價」搞混了。

    具體來說:原始價格 $26.84,加上 $1.0 滑價後進場價 $27.84。停損線 = $27.84 × 0.97 = $27.01。隔天價格 $26.87,因為 $26.87 < $27.01 就觸發停損了。但如果用原始價格算:$26.84 × 0.97 = $26.03,$26.87 > $26.03,根本不該停損。

    一個欄位的混用,讓整個系統的行為完全反轉。

    教訓:技術指標和風險管理用原始市場價格,損益計算用含滑價的有效價格。兩個值必須分開追蹤,永遠不能混用。

    坑 2:OMS 上線一天爆 5 個 bug(2/25)

    電商 OMS 系統上線第一天,同時爆了 5 個 bug:

    1. Health Check 用了獨立的 DTO,結果 channel job 不認這個格式,健康檢查直接壞掉
    2. String → JsonNode 反序列化失敗,Kafka consumer 一直報錯
    3. ChannelSyncLog 少了 syncType 欄位,資料寫不進去
    4. Health check 的 log 缺必要欄位(merchantId、platformId、status、detail)
    5. 改完 code 沒重新編譯就部署,舊版本還在跑

    每一個都不是什麼高深的 bug,但它們同時出現就是災難。問題出在哪?沒有人看全景。改了 producer 沒看 consumer,改了 DTO 沒看 caller,改了 code 沒重新 build。

    這次事件催生了後來的「OMS 約法三章」:

    1. 基礎架構(Docker/PostgreSQL/Kafka/Nginx)不輕易變動
    2. 安全機制必須全系統同步
    3. 任何 Kafka producer/consumer 的改動,必須驗證完整的事件流

    第二階段:立規矩期(3 月初)——從災難中學會設限

    如果第一階段是「馬亂跑」,第二階段就是「開始圍柵欄」。每一條規矩都是某次災難的直接產物。

    坑 3:9 個 Opus Agent 同時跑,系統直接當機(3/3)

    這是整個兩個月最慘烈的事件。

    我的機器是 16GB RAM 的 mini PC,上面常態跑著 26 個 Docker 容器。那天早上 8:36 我開始研究 Claude Code 的 Agent Team 功能,覺得很興奮——「可以同時派好多 agent 幫我做事!」

    11:18,我啟動了一個叫 simpleec-review 的 team,裡面有 9 個 Opus agent。11:56,覺得不夠快,又啟動了 whale-51w,再加 2 個 agent。

    12:00 左右,整台機器凍結

    每個 in-process Opus agent 大約佔 1GB RAM(Node.js runtime + API connection + streaming buffer + context window)。9 個就是 ~9GB。加上 Docker 的 3-5GB 和系統本身的 1-2GB,總共超過 16GB。OOM killer 開始殺進程,但殺完又重啟,無限循環。

    事後盤點:18 個任務中 8 個卡在 in_progress 永遠不會完成,1 個 pending,0 個 completed。全軍覆沒。

    調適:三層防護

    • 第一層(軟限制):CLAUDE.md 規定 Agent Team 最多 3 個同時跑
    • 第二層(硬限制):建了 claude-limited 指令,用 systemd cgroup 限制記憶體上限 10GB
    • 第三層(核心參數)vm.swappiness 從 60 降到 10,swap 從 512MB 擴到 8GB

    從此以後再也沒有 OOM 過。代價是一個下午的工作歸零。

    坑 4:爬蟲日期解析——西元 1150 年(3/10)

    台灣用民國年曆。TWSE 的 API 回傳日期格式是 7 位數字,例如 "1150309" 代表民國 115 年 3 月 9 日(= 西元 2026 年)。

    Claude 把它解析成西元 1150 年 3 月 9 日

    同一天還發現:TPEX 的 API 欄位名叫 TransactionAmount,但 code 裡寫的是 TradingMoney。一個是 API 的真實名稱,一個是文件上寫的名稱——它們不一樣。

    調適:

    • 7 位數字 = ROC 格式,前 3 碼是民國年
    • 欄位名永遠用 API 實際回傳的,不用文件寫的
    • 最重要的:不准重寫爬蟲。爬蟲系統已經穩定,只能用 CLI(analyst collect twse_price --date 2026-03-10

    為什麼「不准重寫」這麼重要?因為隔天,Claude 在另一個任務裡又建了一個 /tmp/backfill_twse.py,把爬蟲邏輯整個複製出來。同樣的錯,不到 24 小時就重演了。

    這讓我意識到一件事:教訓會跨 session 遺失。我在 session A 教了「不要重寫爬蟲」,session B 完全不知道這件事。這催生了後來的 Domain Brain 系統。

    坑 5:中文寫進 code 裡(3 月初)

    Claude 很貼心,知道我是台灣人就開始在 code 裡寫中文 comment 和中文 variable name。

    問題是:中文 comment 在很多終端機上會亂碼、在 grep 時很痛苦、在 code review 時外國同事看不懂。我直接跟它說:

    「中文我看不懂」(在 code context 裡)

    於是立了一條看似矛盾但完全合理的雙重規則:

    • 對話用繁體中文——因為我是台灣人,中文溝通效率最高
    • Code 全部英文——comment、variable、output message、文件,一律英文

    第三階段:建立知識系統(3 月中)——從「個別規則」到「領域知識庫」

    到了 3 月中,我已經有十幾條規則了。但我發現一個根本問題:規則散落在各個專案的 CLAUDE.md 裡,跨專案不通

    在 analyst 專案學到的「ROC 日期要特別處理」,到了 stock-verify 專案就不知道了。在 OMS 專案學到的「Kafka 改動要看全景」,到了 AI Assistant 專案就忘了。

    坑 6:Agent Team 卡死 80 分鐘,因為一個文件不存在(3/16)

    我設計了一個 Agent Team 來做 code review,其中 Task 5 需要讀 docs/5-FRONTEND/ADMIN_APP_IMPLEMENTATION.md

    這個文件不存在。目錄是 5-KAFKA,不是 5-FRONTEND

    Task 5 啟動後在 1 分鐘內就卡住了,然後卡了 80 分鐘。因為 Task 7-9 都依賴 Task 5 的輸出,整個 team 全部癱瘓。9 個 agent 的鏈式架構,一個環節斷了全部死。

    調適:

    • 9-agent 鏈式架構改成 3-agent 星狀拓撲——降低相依性
    • 建立 Agent Team Pre-Flight Checklist——每次啟動前必須:檢查記憶體、確認文件存在、設計拓撲、計算資源、取得用戶確認
    • 寫下 root cause:Agent Team 卡住的根本原因是文件缺失,不是模型能力問題

    Domain Brain 的誕生

    3/16 事件之後,我決定建一個跨專案的知識系統。我叫它 Domain Brain——按技術領域分類的「踩坑筆記」。

    ~/.claude/projects/-home-tom/memory/brain/
    ├── python-crawler-data.md      # 爬蟲的坑
    ├── python-llm-integration.md   # LLM 整合的坑
    ├── idempiere-osgi-bundle.md    # OSGi 的坑
    ├── idempiere-2pack.md          # 2Pack 部署的坑
    ├── idempiere-po-model.md       # PO Model 的坑
    ├── idempiere-rest-api.md       # REST API 的坑
    ├── stock-backtesting.md        # 回測的坑
    ├── oms-event-driven.md         # OMS 事件驅動的坑
    └── design-principles.md        # 設計原則的坑

    每個 brain file 的格式:

    ## ROC Date Format
    - [source: analyst] "1150309" 被解析成 AD 1150 年,要用 7 位 YYMMDD ROC 格式
    
    ## Holiday / Empty Response
    - [source: analyst] TWSE API 假日返回空值,必須 guard if not data: return []

    [source: analyst] 標記這個教訓來自哪個專案。這樣在其他專案讀到時,知道這不是泛泛之談,是某次真實事件的結論。

    然後在全域 CLAUDE.md 裡加一條:

    「開工前必須讀 Domain Brain。如果你跳過這步,bug 出在 brain 裡有記錄的東西,那是你的失敗。」

    第四階段:行為紀律(3 月下旬)——從「知道」到「做到」

    知識庫建好了,但新的問題出現:Claude 知道規則但不一定遵守。就像你告訴馬「不要踩田裡的菜」,牠聽懂了,但一興奮起來照踩不誤。

    坑 7:直接推 code 到 main branch

    有一天我發現 Claude 直接把 code 推到 main branch。main 是我的穩定版本,只有 dev 確認穩定後才 merge 回去。

    這不是什麼複雜的規則,但 Claude 就是沒有這個概念。它看到 repo 就 commit、就 push,不管你在哪個 branch。

    鐵律:

    • Session 開始第一件事:git branch 確認在 dev
    • 永遠不准 git push origin main
    • 如果不小心在 main 上 commit 了:cherry-pick 到 dev,push dev,main 不動

    坑 8:過度設計——給低頻查詢加 Redis cache(3/26)

    我讓 Claude 設計一個功能,它自動加了 Redis cache。問題是:這個功能一天被呼叫不到 10 次。

    Claude 的邏輯是:「cache 可以提升效能」→「所以應該加 cache」。這在教科書上沒錯,但在現實中,一天 10 次的查詢加 cache 只是增加了一個可能壞掉的元件

    我因此制定了頻次驅動設計原則——所有功能設計前必須先問三個問題:

    1. 多常被觸發?→ 決定要不要 cache
    2. 計算有多貴?→ 決定要不要預計算
    3. 需要即時還是最終一致?→ 決定要不要 event-driven

    禁止的 pattern:給低頻讀取加 Redis、給低頻單 consumer 寫入加 Kafka、沒有數據支撐就做「效能優化」。

    坑 9:iDempiere 的 10 個坑(持續累積)

    iDempiere 是一個 15 年歷史的 ERP 系統,Claude 的訓練資料裡幾乎沒有它。所以每一步都是坑:

    發生什麼 正確做法
    @Model annotation 用錯 package 用了不存在的 org.idempiere.base.annotation.Model org.adempiere.base.Model
    initPO 用不存在的方法 POInfo.getPOInfo(ctx, tableName) 沒有 String 參數版本 MTable.getTable_ID() 拿 int,再傳入
    List 欄位 type cast (Integer) get_Value() 對 CHAR 欄位爆 ClassCastException instanceof 判斷型別
    2Pack UUID 永遠 NULL IsUpdateable=N 導致 PO framework 寫不進去 _UU 欄位 IsUpdateable 必須 Y
    Grid View 點新增就爆 AD_FieldSeqNoGridIsDisplayedGrid 每個 field 兩個屬性都要有
    Menu ID hardcode 寫死 AD_Menu_ID = 146,目標環境沒這個 ID 用 UUID reference:reference="uuid"
    REST API token 沒換 POST 拿到 token 後沒做 PUT 換 session token 兩步驟:POST → PUT,舊 token 立即失效
    OData 過濾用 ne $filter=... ne ... 結果不對 要用 neq,不是 ne
    OSGi 兩個 component 放一個 XML 只有第一個被 SCR 讀到 一個 XML 一個 component
    Plugin class 找不到 Class.forName() 用 core classloader 實作 OSGi DS component,用 bundle 自己的 classloader

    這 10 個坑全部記在 brain/idempiere-*.md 裡。現在每次開 iDempiere 相關的工作,Claude 會先讀這些 brain file。同一個坑,不會踩第二次。

    坑 10:LLM 回傳的 JSON 炸掉整條 pipeline

    做 AI Assistant 的時候,我讓 LLM 回傳 JSON 來做 routing。prompt 裡寫了「ONLY return valid JSON」。

    現實是:LLM 就是會回傳無效的 JSON。有時候前面加一句「Sure! Here’s the JSON:」,有時候 response.content 直接是 None,呼叫 .strip() 就爆 AttributeError

    一個 router/classifier 的 crash 會癱瘓整條 pipeline。

    調適:

    • 永遠 catch (json.JSONDecodeError, AttributeError, TypeError)
    • 永遠有 fallback 值(例如 "general_knowledge"
    • Router/classifier 不可以 crash 整條 pipeline
    • LLM client 在 module level 初始化會阻擋 mock mode → 改成 lazy-init
    • 沒設 timeout → 無限 hang → 所有 client 設 timeout=25.0
    • 最重要:永遠不讓 LLM 生成 SQL。只用 pre-defined SQL,安全參數從 request 強制注入

    第五階段:自動化閉環(4 月初)——從「靠記憶」到「系統強制」

    到了 3 月底,我有了 7 條鐵律、9 個 brain file、32 個記錄的坑。但還是有一個根本問題:

    Brain 的更新靠 Claude 記得做。它經常忘記。

    CLAUDE.md 裡寫著「每次 fix: commit 後必須更新 brain」,但這只是文字。就像公司牆上貼的「安全第一」標語——大家都看到了,沒人真的做

    4 月 3 日,我決定把這個 cycle 自動化。用 Claude Code 的 Hooks 系統(Harness Engineering)建了 4 個自動化 sensor:

    Hook 觸發時機 做什麼
    PostToolUse 每次 git commit 偵測 fix: 開頭 → 注入「必須更新 brain」的指令到 context
    PreCompact context 壓縮前 掃描最近 5 個 commit,有 fix: 就提醒
    Stop session 結束 比對 fix: 數量 vs brain 更新數量
    SessionStart session 開始 標記開始時間(給 Stop hook 用)

    效果:Claude commit 了 fix: handle empty API response → hook 自動偵測到 → Claude 的 context 被注入一段「你現在必須更新 brain file,不准做下一件事」的強制指令。

    它不能「忘記」了,因為系統不讓它忘記。

    第六階段:照鏡子——工作流程的精煉(4 月)

    走到第五階段,系統穩了、規則立了、自動化跑了。

    但有一天我問 Claude 一個問題:「我們現在跟最早的你,差距多遠?」

    它的回答讓我意識到,我一直在修正一個更深層的問題——不只是 bug,而是合作模式本身

    坑 11:AGENTS.md 從來沒有被建立過

    Agent Team 一再失敗,我長期把原因歸咎到記憶體不夠、文件缺失、拓撲設計問題。這些都是真的,但都是症狀。

    真正的根本原因是:每個 agent 啟動時,不知道自己是誰

    AGENTS.md 是一份定義 Agent Team 組織結構的文件——誰負責什麼、用什麼模型、任務邊界在哪、跟其他 agent 怎麼協作。沒有這份文件,就像把九個新人同時丟進一個專案,沒有分工表、沒有組織圖,叫他們自己搞清楚。

    我當時知道事情一直出問題,但沒找到根本原因。後來才發現,我養成了一個補償行為:每次要啟動 team 之前,我都會先問 Claude「你覺得還缺什麼文件?」

    我以為這是謹慎的好習慣。仔細想,這是我在幫 Claude 做它本來就應該主動做的事。

    現在 AGENTS.md 是所有新專案的第一步強制動作,和 Domain Brain 並列寫進 CLAUDE.md 的「New Project Setup」。

    坑 12:「討論完就開始做」不等於有計畫

    兩個月裡,每次開工前我們都會大量討論——分析需求、評估方案、確認方向。我一直以為那就是計畫。

    但有一個關鍵差別沒意識到:

    討論是活在對話裡的,session 結束就消失了。計畫是一份文件,它是執行的合約。

    更重要的是:計畫的讀者不是我,是執行的 agent。那個 agent 沒有參與討論,沒有上下文,不知道我們為什麼這樣決定。

    一個不夠詳細的 PLAN.md 會讓執行者只能猜意圖。猜錯就要回頭重做。

    現在要求的標準是:每個執行步驟都必須回答四件事——做什麼(具體動作)、在哪裡(檔案路徑)、成功的樣子(怎麼知道這步完成了)、不要做(邊界,避免 agent 自作主張)

    「實作登入功能」是爛計畫。「呼叫 POST /api/auth/login,成功後把 token 存 localStorage(‘token’)、把 context 存 localStorage(‘context’),失敗時顯示人話而非 HTTP status code」才是計畫。

    寫計畫不是給聰明人看的。不是每個腦子都跟你一樣聰明。

    驗收標準不該由我想

    以前的工作流是:Claude 說完成 → 我去測 → 發現問題 → 回來修。

    問題不是 Claude 能力不足,是從來沒有在開始前說清楚「完成長什麼樣」。

    現在的做法:Plan 成形時,Claude 主動起草驗收清單給我確認。不是叫我從零想,是它根據我們的討論整理出草稿,我只需要回「對」或「改第二條」。這把「驗收責任」從我一個人扛,變成流程的一部分。

    2 月的我 vs 4 月的 Claude

    我問 Claude 這個問題,它說了一句話讓我覺得很誠實:

    「最早的我是一個聰明但不可靠的執行者。現在應該是一個有記憶、有流程、會主動管理風險的協作者。但有一部分差距,是你花了大量時間糾正才填起來的——這些本來應該是我自己的責任。」

    這句話是這兩個月最好的總結。

    兩個月的數字

    指標 2 月(裸奔期) 4 月(現在)
    鐵律(Iron Rules) 0 7
    Domain Brain files 0 9 個領域
    記錄的具體 bug/pitfall 0 32+
    自動化 Hooks 0 4
    OOM 當機次數 1 次(再也沒發生)
    同一個 bug 踩兩次的頻率 常態 有機制防止
    強制工作流節點 0 3 個(AGENTS.md / PLAN.md / 驗收清單)

    結語:AI 不是工具,是一匹馬

    買一匹馬回來,你不會期望它第一天就知道路。你得教它不要踩田、不要亂跑、轉彎時要減速、聽到哨聲要停。

    AI coding agent 也一樣。Claude 很聰明——它能寫任何 code、debug 任何問題、理解任何架構。但「聰明」不等於「可靠」。一匹沒訓過的馬也很有力量,但力量加上失控只會更慘。

    這兩個月教我的事:

    1. 每條規則都要有故事——沒有災難背景的規則,AI 不會認真對待
    2. 知識必須跨 session 存活——Domain Brain 讓教訓不死在 commit 裡
    3. 靠文字規則不夠,要靠系統強制——Hook 比 CLAUDE.md 裡的「MUST」有效 100 倍
    4. 閉環比開環重要——Sensor 把教訓自動回寫到 Guide,harness 才會進化
    5. 協作模式也需要調教——規則、計畫、驗收標準,都要變成系統,不能靠臨時記憶

    2 月的 Claude 是一匹脫韁野馬。4 月的 Claude 是同一匹馬,但有了韁繩、馬鞍、和一本厚厚的訓練日誌——還有一套讓牠不能假裝忘記的系統。

    馬沒有變。變的是騎手。

  • Harness Engineering 實戰:讓 AI Agent 自動從 Bug 中學習的閉環系統

    重點摘要

    • Harness Engineering 是 2026 年 AI 工程最重要的新學科——不是訓練更好的模型,而是打造讓模型可靠運作的系統
    • 公式:Agent = Model + Harness,Model 是可替換零件,Harness 才是護城河
    • 本文用實際的 Claude Code 設定,展示如何用 Hooks 建立一個會自我進化的閉環 Harness

    2025 年,所有人都在比誰的 AI Agent 更厲害。2026 年,贏家已經換了跑道——比的是誰的 Harness 更成熟。

    如果你正在用 Claude Code、Codex CLI、或任何 AI coding agent,你每天都在跟 harness 打交道,只是你可能不知道它叫這個名字。這篇文章會用我自己的實戰設定,從零解釋什麼是 Harness Engineering,以及你今天就能動手做的事。

    Harness Engineering 是什麼?一句話定義

    Harness Engineering 是設計「包裹在 AI 模型周圍的控制系統」的工程學科。用 Martin Fowler 的公式來說:

    Agent = Model + Harness

    Model 提供智能,Harness 讓這個智能可靠、可控、可用。Phil Schmid 用了一個精準的電腦比喻:

    電腦零件 AI 系統對應 說明
    CPU AI Model(GPT、Claude) 原始運算能力
    RAM Context Window 有限的工作記憶
    作業系統 Agent Harness 管理資源、提供標準介面、控制生命週期
    應用程式 Agent 跑在 OS 上的具體任務邏輯

    你不會直接在 CPU 上跑程式,你需要作業系統。同樣地,你不會直接對 Claude 說「幫我寫整個系統」就放手不管——你需要 Harness 來確保它走對方向、犯錯時被攔住、學到的教訓不會遺失

    Harness 不是 Framework——搞清楚差異

    很多人把 Harness 跟 LangChain、CrewAI 這類框架搞混。它們是完全不同的東西:

    Framework(框架) Harness(治具)
    LangChain、CrewAI、AutoGen Claude Code、Codex CLI
    提供零件讓你自己組裝 提供完整運行環境
    你自己負責接水管 幫你管好 context、工具、權限、失敗處理
    Blueprint Runtime environment

    Framework 是建築材料,Harness 是建好的房子。你可以用 LangChain 的零件去蓋一個 harness,但 Claude Code 本身就已經是一個 harness。

    Harness 的兩大核心機制:Guide 與 Sensor

    根據 Martin Fowler 的分析,所有 harness 都由兩種控制機制組成:

    Guide(前饋控制)——在錯誤發生之前攔住

    Guide 是你預先給 agent 的方向和規則。它們在 agent 開始工作之前就生效,目的是讓 agent 第一次就做對。

    • CLAUDE.md:專案規則文件(「不准動 main branch」「用繁體中文回應」)
    • Domain Brain:過去踩過的坑的知識庫(「TWSE API 的 ROC 日期格式會導致解析錯誤」)
    • Skills:標準化的工作流程(「寫 iDempiere event handler 要用這個 pattern」)
    • AGENTS.md:角色分配和模型選擇規則

    Sensor(反饋控制)——做完之後自動檢查

    Sensor 監控 agent 的輸出,在問題擴大之前抓住它。分兩種:

    • 計算型 Sensor:linter、type checker、單元測試——毫秒級回應,確定性結果
    • 推理型 Sensor:用另一個 AI 審查輸出(code review agent)——秒級回應,有判斷力但不確定

    大多數人只做了 Guide(寫 CLAUDE.md),完全忘了 Sensor。這就像開車只看前方,不看後照鏡。

    完整的 Harness Cycle:6 步閉環

    一個成熟的 harness 不是「設定好就不管」的靜態文件,而是一個會自我進化的閉環系統。完整的 cycle 有 6 個步驟:

    ① LOAD ──▶ ② GUIDE ──▶ ③ EXECUTE ──▶ ④ SENSE
     自動載入     前饋引導     Agent 做事     自動檢查
     context     規則+經驗                   品質
                                              │
    ⑥ EVOLVE ◀── ⑤ LEARN ◀───────────────────┘
     更新規則      萃取教訓
     和知識庫      從錯誤中
    步驟 做什麼 Harness 類型 常見工具
    ① LOAD 自動載入專案 context 基礎設施 SessionStart hook, CLAUDE.md
    ② GUIDE 讀取規則 + 過去經驗 Guide(前饋) Domain Brain, Skills
    ③ EXECUTE Agent 寫 code Claude Code Bash/Edit/Write
    ④ SENSE 自動偵測品質問題 Sensor(反饋) PostToolUse hook, linter, test
    ⑤ LEARN 從 bug fix 中萃取教訓 Sensor → Guide 橋接 PreCompact hook
    ⑥ EVOLVE 更新 Brain / 規則文件 Guide 進化 Stop hook 驗證

    關鍵是步驟 ⑤→⑥→②:agent 修 bug → 教訓寫入 Brain → 下次讀 Brain → 不再犯同樣的錯。這就是閉環。沒有這個迴路,你的 harness 永遠停留在你第一天寫的水平。

    實戰:用 Claude Code Hooks 建立閉環 Harness

    讓我用真實的 Claude Code 設定來展示。以下不是理論——這是我每天在用的 harness。

    步驟一:建立 Domain Brain(Guide)

    Domain Brain 是一組按技術領域分類的 markdown 文件,記錄「過去踩過的坑」。放在 ~/.claude/projects/{project}/memory/brain/ 目錄下:

    brain/
    ├── python-crawler-data.md    # 爬蟲:ROC 日期、欄位映射、空值處理
    ├── idempiere-osgi-bundle.md  # OSGi:MANIFEST.MF、classloader 問題
    ├── idempiere-2pack.md        # 2Pack:UUID 穩定性、afterPackIn
    ├── stock-backtesting.md      # 回測:signal divergence、entry price bug
    └── design-principles.md      # 設計原則:頻次驅動架構、anti-patterns

    每個 brain file 的內容格式:

    # Python Crawler — Everything That Can Go Wrong
    
    ## ROC Date Format
    - [source: analyst] "1150309" 被解析成 AD 1150 年,要用 7 位 YYMMDD ROC 格式
    - [source: analyst] TPEX 欄位名 TransactionAmount 不是 TradingMoney
    
    ## Holiday / Empty Response
    - [source: analyst] TWSE API 假日返回空值,必須 guard `if not data: return []`

    然後在 CLAUDE.md 裡強制 agent 在開工前讀 brain:

    ## Domain Brain — MANDATORY before ANY implementation work
    Before writing any plan, code, or review, you MUST:
    1. Find the `## Domain Brain:` line in the project's CLAUDE.md
    2. Read each listed brain file
    3. If you skip this step and a bug was documented in brain, that is YOUR failure

    步驟二:用 Hooks 自動偵測 fix: commit(Sensor)

    這是整個閉環最關鍵的一步。在 ~/.claude/settings.json 加入 PostToolUse hook:

    {
      "hooks": {
        "PostToolUse": [
          {
            "matcher": "Bash",
            "if": "Bash(git commit:*)",
            "hooks": [
              {
                "type": "command",
                "command": "/path/to/claude-harness-fix-detect.sh",
                "timeout": 5,
                "statusMessage": "Harness: checking for fix: commit"
              }
            ]
          }
        ]
      }
    }

    偵測腳本做的事很簡單——從 stdin 讀取 Claude Code 傳來的 JSON,提取 commit message,如果是 fix: 開頭就注入 context 強制 agent 更新 brain:

    #!/bin/bash
    INPUT=$(cat)
    msg=$(echo "$INPUT" | jq -r '.tool_input.command' | sed -n 's/.*-m[[:space:]]*["'\'']\?\([^"'\'']*\).*/\1/p')
    
    case "$msg" in
      fix:*|fix\(*)
        project=$(echo "$INPUT" | jq -r '.cwd' | xargs basename)
        cat <<EOF
    {"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"⚠️ BRAIN UPDATE REQUIRED\nYou committed: $msg\nUpdate the brain file NOW before next task."}}
    EOF
        ;;
      *) echo '{}' ;;
    esac

    效果:agent commit 了 fix: handle empty API response → hook 自動觸發 → agent 的 context 被注入「你必須更新 brain」的指令 → agent 無法忽略。

    步驟三:PreCompact 安全網

    Claude Code 在 context window 快滿時會自動壓縮(compact)。如果 brain 更新的指令在壓縮中被丟掉怎麼辦?加一個 PreCompact hook:

    {
      "PreCompact": [
        {
          "hooks": [
            {
              "type": "command",
              "command": "/path/to/claude-harness-precompact.sh",
              "timeout": 5
            }
          ]
        }
      ]
    }

    腳本掃描最近 5 個 commit,如果有 fix: 就在壓縮前再次提醒。雙重保險。

    步驟四:Stop hook 結算

    Session 結束時,Stop hook 比對「今天的 fix: commit 數量」和「brain file 是否有更新」。如果數字不匹配,就警告使用者——這是最後的安全網。

    真實案例:閉環如何拯救你的下一個 bug

    讓我走過一個完整的案例。假設你的 TWSE 爬蟲在假日會爆錯:

    1. ① LOAD:你打開 Claude Code,說「爬蟲昨天跑失敗了,幫我查」
    2. ② GUIDE:Agent 讀 brain/python-crawler-data.md,發現裡面已經記錄了 ROC 日期和欄位映射的坑。帶著這些經驗開始查 bug,不走冤枉路
    3. ③ EXECUTE:Agent 找到 root cause——假日 API 返回空 response,parse() 沒處理 None。寫修復
    4. ④ SENSEgit commit -m "fix: handle empty API response on holidays" → PostToolUse hook 觸發 → 注入 brain update 指令
    5. ⑤ LEARN:Agent 被強制讀 brain file,加入新教訓:「假日 API 返回空值必須 guard」
    6. ⑥ EVOLVE:Brain file 更新完成。下次任何專案遇到 TWSE 爬蟲問題,都不會再踩同樣的坑

    沒有這個閉環會怎樣?你修完 bug,commit,然後忘了。三個月後在另一個專案遇到同樣的問題,重新 debug 兩小時,再次發現「啊,假日要特別處理」。這就是知識衰減——你修了 bug,但教訓死在那個 commit 裡。

    大多數人的 Harness 在哪裡斷裂?

    我觀察到的最常見模式:

    步驟 大多數人的狀態 問題
    ① LOAD ✅ 有 CLAUDE.md
    ② GUIDE ⚠️ 寫了規則但靠 AI 自律 AI 經常跳過,特別是簡單任務
    ③ EXECUTE ✅ Agent 正常工作
    ④ SENSE ❌ 完全沒有自動檢查 commit 後不跑 lint/test
    ⑤ LEARN ❌ 靠 AI 記得 AI 經常忘記更新知識庫
    ⑥ EVOLVE ❌ 靠 AI 記得 教訓死在 commit 裡

    Cycle 在第 ④ 步就斷了。 Guide 做了一半,Sensor 完全不存在,閉環更不用說。這就是為什麼同樣的 bug 會反覆出現——不是 model 不夠聰明,是 harness 沒有記憶。

    你的 Harness 成熟度在哪一層?

    我把 harness 成熟度分成 4 層,你可以自我評估:

    層級 特徵 你有什麼
    Level 0:裸奔 直接對 AI 說話,沒有任何規則文件 只有 model
    Level 1:有規則 有 CLAUDE.md、有 coding style guide Guide(開環)
    Level 2:有回饋 有 hooks 跑 linter/test、有 code review agent Guide + Sensor(開環)
    Level 3:閉環 Sensor 的結果會自動回寫到 Guide(Domain Brain) Guide + Sensor + 閉環迴路

    大多數人在 Level 1。用了 Claude Code 的人可能在 Level 1.5(有 CLAUDE.md 但沒有 hooks)。Level 3 是目標——你的 harness 會隨著每次 bug fix 自動進化。

    今天就能做的 3 件事

    不需要重新設計整個系統。從這三件事開始:

    1. 建 Domain Brain 目錄:按技術領域建 brain files,把你已知的坑寫進去。不需要完美——一個 brain file 有 5 條教訓,就比沒有好 100 倍
    2. 加一個 PostToolUse hook:偵測 fix: commit,注入 brain update 提醒。這一個 hook 就打通了 ④→⑤ 的斷裂
    3. 在 CLAUDE.md 加 Domain Brain 規則:強制 agent 在開工前讀 brain。不是「建議」,是「MUST」

    這三步讓你從 Level 1 直接跳到 Level 2.5。剩下的 0.5(完全自動化的 brain 更新)可以後面再做。

    結語:Model 會被換掉,Harness 不會

    OpenAI 一個月前還領先,現在 Claude 追上了。三個月後可能又換一輪。Model 是最不穩定的變數——你永遠不知道下一個版本是更好還是更差(我之前叫了 20 個 AI 專家 Review 的慘痛教訓就是證明)。

    但你的 Harness——你的規則、你的 Brain、你的 Hooks——這些是你的資產。不管底層 model 怎麼換,你累積的工程知識和控制系統都會繼續生效。

    2026 年的 AI 工程贏家,不是有最好 model 的人,而是有最成熟 harness 的人。你今天就可以開始建。

    延伸閱讀