Garry Tan的Thin Harness, Fat Skills框架五個核心概念,逐條對照一套實際在跑的Claude Code設定(2026-09-21實數),三個對得上甚至做得更細、Thin Harness只對一半:167個skill(36個自己寫)、19支hook、24份規則檔共1343行、738個記憶檔。唯一對不上的是diarization,框架講的讀多份既有文件、抓出說的跟做的落差、輸出一頁判斷摘要,這套設定裡沒有一支skill在做這件事。
這個對照的起點是Garry Tan引用Steve Yegge的說法:用AI coding agent的人,生產力是現在用Cursor、聊天型工具的人的10到100倍,比2005年的Google工程師高上千倍。Tan認為關鍵不是model,是Thin Harness, Fat Skills這套架構。下面把他講的五個核心概念,逐條拿去對照週末哥自己在跑的一套Claude Code設定。
查證來源
來源:Garry Tan 的 gbrain 專案內文件(2026-04-11 版)。
1. Fat Skill Files:167個skill,36個自己寫
原文定義:「A skill file is a reusable markdown procedure that teaches the model HOW to do something. Not WHAT to do.」,翻成白話就是skill file是可重複使用的markdown流程,教模型怎麼做,不是做什麼,運作起來像函式呼叫,吃參數。
這套設定的skills資料夾用ls數,167個。裡面前綴wk-(週末哥自己寫的)有36個,其餘大多是成批引入的外部skill,例如od-系列將近60個design skill,一次從別人的repo批次匯入。每個wk-skill的frontmatter description欄位就是觸發詞加使用時機,跟Tan講的skill的description本身就是resolver是同一件事。舉例,wk-ad-report這個skill觸發詞是「廣告報表」「Meta廣告報表」,同一個skill餵不同的xlsx進去,產出完全不同的報表,這就是同一個skill加不同參數等於完全不同能力。
對得上。
這套Claude Code設定裡有167個skill,36個是自己寫的(wk-前綴),其餘是成批引入的外部skill。每個skill的description欄位同時當觸發詞跟參數說明,符合Tan講的skill file像函式呼叫的定義。
2. Thin Harness:一份34行,一份260行
原文定義:「The harness is the program that runs the LLM. It does four things: runs the model in a loop, reads and writes your files, manages context, and enforces safety.」反面模式的描述是:「40+ tool definitions eating half the context window, God-tools with 2-to-5-second MCP round-trips.」
這套設定裡負責強制安全的是hook。settings.json裡數command,19支,分布在四種事件:SessionStart 4支負責讀語氣資料、載入個人偏好、捲記憶檔案;UserPromptSubmit 3支負責存檔提醒、TG自動react、網頁類字眼提醒;PreToolUse 11支負責擋文案格式、擋記憶主檔亂長、提醒讀PROGRESS.md;Stop 1支。這19支多數是python或node腳本(也有一支是powershell),跑在model的context之外,符合強制安全這條。
但管理context這條,兩份CLAUDE.md都沒有做到Tan原文那條參考線:「CLAUDE.md about 200 lines. Just pointers to documents」,也就是CLAUDE.md大約200行,只放指向其他文件的指標。其中一份34行,內容是CodeGraph工具的使用守則,不是指向其他文件的路由;另一份260行,裡面是行動規則、Karpathy四原則、品質把關、指令路由表,是規則本體不是純索引。規則資料夾裡24個檔案共1343行,但不是全部都常載:7份設了paths frontmatter只在特定路徑才載入,真正每個session一開場就跟兩份CLAUDE.md一起載入的,是沒設paths的17份,用wc -l加總是518行,加兩份CLAUDE.md的294行,合計812行常載內容。
對半,hook那一半對得上;兩份CLAUDE.md都沒做到框架講的純路由指標,一份是規則本體,一份是工具使用守則。
3. Resolvers:MEMORY.md自己就是活的範例
原文定義:「A resolver is a routing table for context. When task type X appears, load document Y first.」
這套設定裡最貼近這個定義的是記憶系統。規則資料夾裡的架構說明檔把什麼時候該讀哪一層拆成六層、按需載入,跟Tan講的任務類型X出現時先載入文件Y是同一個邏輯。
記憶檔案本身就是活的驗證。memory資料夾裡.md檔案,頂層700個,含子資料夾738個,但主索引MEMORY.md還是只有5531 bytes、65行。MEMORY.md自己在檔案裡寫著上一次瘦身後是3629 bytes,四個月後長回33804 bytes、156條,代表光靠紀律守不住這個薄度,後來改成規則:新記憶一律寫進子檔案,主檔案只加一行連結,另外寫死一支hook擋著不准往主檔案塞內容。資料量再怎麼長,索引本身都不會跟著長。
對得上,而且比框架原文的一句話定義做得更細,寫成六層判斷流程,還靠hook而不是紀律守住。
記憶資料夾裡有700個頂層md檔(含子資料夾738個),但主索引MEMORY.md只有5531 bytes、65行。有一支hook擋著不准把單則記憶寫進主檔案,逼新知識寫進子檔案再回主檔加一行連結,這是resolver保持薄的做法。
4. Latent vs Deterministic:19支hook裡藏的分工
原文定義:「Latent space is where intelligence lives…Deterministic is where trust lives. Same input, same output. Every time.」Tan舉的例子是幫800人排晚餐座位,讓模型構思主題可以,讓它排座位就會出現看起來合理但完全錯的結果,有固定正確答案的事要交給確定性演算法。
這套設定裡最直接對應的是規則要放哪一層的判斷本身。規則資料夾裡的架構說明檔寫了這條邏輯:同一條規則反覆沒被執行時,第一順位是改結構讓錯誤無從發生,第二順位是搬進hook用結束碼直接擋,第三順位才是把規則寫得更詳細,而且明講第三順位最後一名,而且通常沒用。這剛好是Tan那句別把確定性問題硬塞進潛在空間的反向應用:與其靠模型每次自己記得某條規則,不如寫成腳本在PreToolUse攔下來,結果每次都一樣。19支hook裡,處理文案格式、時間換算、載入動畫這幾類提醒的腳本做的就是這件事,把原本要靠模型記住的規則,變成腳本檢查,符合或不符合就是二元結果。
對得上,而且延伸到規則本身要放latent還是deterministic這一層判斷,框架原文沒有明講到這麼細。
5. Diarization:找不到對應的skill
原文定義:「The model reads everything about a subject and writes a structured profile. Read 50 documents, produce 1 page of judgment.」Tan舉的例子是一個創辦人說自己在做「Datadog for AI agents」,但讀完GitHub commit、應用程式碼、顧問紀錄後發現八成的提交其實都在計費模組,跟講的完全不是同一件事。
diarization是五個概念裡唯一沒查到對應skill的一個。掃過167個skill的名稱跟description,最接近的形狀是外部引入的competitor-profiling,它讀競品的URL寫出結構化的profile,但只看競品網址本身,不是讀關於同一主體的多份既有文件去抓說的跟做的落差,所以不算真正對得上。再遠一點的參考,存檔機制裡的知識萃取,session結束時把這次對話學到的東西按準則分流進對應記憶檔;wk-tool-radar,研究一個工具寫成一篇評估文章。但前者只處理這一次session自己說了什麼,不是讀多份既有的外部文件;後者是對外發布評估文章,不是抓說的跟做的這種內部落差。三個都不是Tan定義的diarization。
對不上,是167個skill裡明確的一塊空白。
結論:三個對得上、一個對一半、一個是真的缺口
逐條對完,Fat Skill Files、Resolvers、Latent vs Deterministic對得上,Thin Harness只有hook那一半乾淨,兩份CLAUDE.md都沒做到純路由。Diarization完全沒有對應skill,是這套設定裡真的缺的一塊。