WEKEN NEWS 週末哥的數據記錄
claude codethin harness fat skillsai agent架構skill設計

Thin Harness, Fat Skills對照一套真實在跑的Claude Code設定:五個概念,三個對得上、一個對一半

直接回答

Garry Tan的Thin Harness, Fat Skills框架(原文出處:Garry Tan 的 gbrain 專案文件,2026-04-11 版)五個核心概念,逐條對照一套實際在跑的Claude Code設定(2026-09-21實數),三個對得上甚至做得更細、Thin Harness只對一半:167個skill(36個自己寫)、19支hook、24份規則檔共1343行、738個記憶檔。唯一對不上的是diarization,框架講的讀多份既有文件、抓出說的跟做的落差、輸出一頁判斷摘要,這套設定裡沒有一支skill在做這件事。

週末哥

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,是這套設定裡真的缺的一塊。

常見問題

Thin Harness, Fat Skills是什麼意思?
Garry Tan提出的AI agent架構原則,原文文件自己標的版本資訊是updated 2026-04-11、status draft-v4。核心主張:harness(跑模型的程式本身)只做四件事,在迴圈執行模型、讀寫檔案、管理context、強制安全規則,其餘判斷力全部寫進skill file(可重複使用的markdown流程文件)。反面模式叫fat harness,特徵是40多個工具定義吃掉半個context window。
這套Claude Code設定符合Thin Harness的薄到什麼程度?
一半符合。負責強制安全的hook有19支,多數是腳本,不吃model context,符合框架定義。但兩份CLAUDE.md都沒做到框架講的CLAUDE.md大約200行、只放指向其他文件的指標:一份34行是工具使用守則不是路由,一份260行是行動規則、品質把關這些規則本體,也不是純索引。
Resolvers在Claude Code設定裡長什麼樣子?
最貼近的例子是記憶索引檔MEMORY.md。記憶資料夾裡有700個頂層md檔(含子資料夾738個),但MEMORY.md主檔只有5531 bytes、65行,因為有hook擋著不准把單則記憶寫進主檔案,逼新知識寫進子檔案再回主檔加一行連結。另外規則資料夾裡的架構說明檔把什麼時候該讀哪一層拆成六層、按需載入,是resolver定義任務類型X出現時載入文件Y的完整規格版。
diarization這個概念,為什麼在這套設定裡找不到對應?
diarization指的是模型讀完關於同一主題的多份既有文件,寫出一頁結構化判斷,專門抓說的跟實際在做的之間的落差。掃過這套設定裡167個skill的名稱跟description,最接近的形狀是外部引入的competitor-profiling,但它只讀競品網址本身,不是抓說的跟做的落差。存檔機制的知識萃取只處理單次session自己的對話內容,wk-tool-radar是對外發布的工具評估文章,三個都不是讀多份既有文件找矛盾的那個動作。
要驗證自己的Claude Code設定符不符合這個框架,第一步該數什麼?
先數三個數字:skill資料夾裡有幾個skill、自己寫的佔幾個;settings.json的hooks區塊裡有幾支command,決定deterministic層有多厚;常載的CLAUDE.md加規則檔案總共幾行,決定harness實際上薄不薄。這三個數字比感覺準,數字對不上框架的理想值,才知道要改哪一塊。