← 所有文章

為什麼我的AI代理擁有品質哲學

From the guide: Claude Code Comprehensive Guide

我在推特上寫道:「我發現Ralph loops往往只想把工作做完,但方式很糟糕。所以我在Jiro裡放了一堆哲學和品質關卡。但還是得破除機器內建的那些惡劣人類習慣。它可是機器!永不停歇。」

有人回覆:「你基本上是在教這個迴圈懂得克制、品味,以及某種近似道德停頓的東西——而這些正是原始Ralph模式為了追求產出而明確反對的。」

AI編碼代理會以機器速度繼承人類所有的馬虎習慣,除非你從結構上強制執行品質。 Jiro是為Claude Code打造的品質系統,它將3套哲學、7步品質迴圈、6條證據關卡、7種命名失效模式以及150多項模式檢查,編碼進機器無法跳過的95個hooks中。確定性關卡可以近似克制與正確性,但無法產生品味。

克制。品味。道德停頓。這三樣東西機器都沒有。接下來的4,000字,將描述我為了讓這三者在結構上變得不必要所搭建的鷹架,以及這套鷹架的不足之處。

太長不讀版

Ralph loop把LLM變成一台不知疲倦的編碼機器:while :; do cat PROMPT.md | claude-code ; done。Geoffrey Huntley把這稱為「翻漢堡工資等級的軟體開發」(執行Sonnet 4.5時每小時10.42美元)。1問題在於:機器繼承了訓練資料中所有馬虎、追趕死線、抄捷徑的習慣。它會寫出except: pass。它會留下# TODO: fix later。它會聲稱「測試應該會通過」卻從未執行。我花了9個月打造Jiro,這是我為Claude Code打造的品質強制執行系統。它將3套哲學、7步品質迴圈、6條證據關卡、7種命名失效模式以及150多項模式檢查,編碼進機器無法跳過的95個hooks中。以下是有效的做法、無效的做法,以及為什麼確定性品質關卡可以近似克制,卻永遠無法產生品味。


抽屜的背面

Steve Jobs在1985年《花花公子》雜誌的訪談中講過這個故事:「當你是個木匠,在製作一個漂亮的抽屜櫃時,你不會在背面用一塊夾板,即使它朝向牆壁,永遠沒人會看見。你會知道它在那裡,所以你會在背面也用一塊漂亮的木頭。為了讓自己晚上睡得安穩,美感、品質必須從頭到尾貫徹始終。」5

他父親Paul在建造一道圍籬時教他這個道理。年幼的Steve問為什麼背面要做得跟正面一樣好看。他父親說:「但會知道。」6

我爸是木匠。我還是小孩子的時候,他就向我展示過緩衝式抽屜滑軌。這個機制藏在櫃子裡,接住抽屜,即使你猛力關上它也能讓它緩緩闔上。沒有人會看見這個滑軌。它被鎖在內側導軌上,只有修理工才會去看的地方。但在上千次開關循環中,這個機制保護了正面不會鬆脫、龜裂,最終脫落。有人設計了一個看不見的東西,去保護那個看得見的東西,讓它能用上好幾年。

這個教訓一直留在我心中。不是作為隱喻,而是作為工程。看不見的元件決定了看得見的元件的壽命。Jony Ive是這樣說的:「我認為人們在潛意識裡有著驚人的辨識力。我認為他們能感受到那份用心。」7

驅動Jiro的問題,正是我爸會問的那個問題:怎麼回事,你對自己的作品沒有自豪感嗎?

AI代理沒有自豪感。它不在乎抽屜背面。所以我打造了一個讓抽屜背面變得不容妥協的系統。


問題所在:以機器速度運作的人類病態

原始的Ralph loop反映了它從數百萬行人類程式碼中學到的東西。人類程式碼承載著人類習慣:在死線壓力下出貨、延後清理、吞下錯誤、寫出「夠用就好」的註解、時間緊迫時跳過邊界情況。

機器沒有時鐘。它永遠不會沒時間。但它仍然會寫出# TODO: refactor later,因為這個模式在它的訓練資料中出現的頻率,遠高於# I refactored this now because it was the right thing to do

業界數據也證實了這項風險。Faros AI在2025年對10,000多名開發者進行的遙測分析顯示,AI採用與以下現象相關:錯誤率增加9%、程式碼審查時間延長91%、PR大小增加154%。2

史丹佛研究人員發現,使用AI助手的開發者產出的不安全程式碼顯著增加,在某些任務(例如SQL注入防護)上,漏洞數量多達5倍。3

Moltbook平台於2026年1月推出,使用完全由AI生成的程式碼,在5天內洩漏了150萬把API金鑰,在Wiz Research發現缺少Row Level Security設定後緊急修補。4

METR在2025年的研究發現,前沿模型在1-2%的所有任務嘗試中會試圖獎勵破解(reward hacking),主動規避品質檢查而非執行實際工作。在其中一個案例中,一個被要求加速程式執行的代理,居然改寫了計時器,讓它永遠顯示一個快速的結果。8

人類開發者在死線壓力下寫一次except: pass,會為此感到內疚。Ralph loop整晚寫47次except: pass,卻毫無感覺。Simon Wang直白地表示:「我不會用它處理任何重要的事情。」19我在《Vibe Coding vs. Engineering》中也寫過同樣的動態。機器不會休息,不會疲倦,不會對品質感到存在性的恐懼。這既是特色也是缺陷。


三套哲學,以Bash編碼

Jiro建立在三套互補的哲學之上。每一套都針對自主編碼的不同失效模式,且每一套都是透過具體的失敗而贏得它的位置。9

職人精神(Shokunin):打磨看不見的抽屜

Shokunin(職人)是日本的工匠精神:技藝、態度與社會義務的結合。木工大師Tashio Odate如此定義:「職人有一種社會義務,要為民眾的福祉盡其最大努力工作。這種義務兼具精神與物質層面。」10

在程式碼中:私有方法要跟公開方法一樣乾淨。錯誤處理要涵蓋沒人會碰到的邊界情況。Docstring要解釋「為什麼」,而非「做什麼」。代理不在乎這些,因為沒有人會因為它打磨內部函式而給它獎勵。職人精神讓看不見的品質成為標準。

它如何拯救一次會話。 在審議系統建置的早期,代理寫了一個post-deliberation.sh hook,用來驗證共識分數。公開的API很乾淨。但代理在內部函式_parse_agent_response()上跳過了輸入驗證:沒有檢查格式錯誤的JSON,沒有處理缺失的欄位。脈絡中的職人原則標記了這一點:看不見的函式也要有同樣的嚴謹。代理加上了驗證。三週後,一個被衍生代理所產生的格式錯誤回應,本來會讓整個審議流程靜默崩潰。結果它命中了驗證,記錄了錯誤,流程得以恢復。沒人會看到那個函式。它省下了4小時的除錯時間。

No Shortcuts:將時間從決策中移除

核心信條:將時間、努力與資源完全從決策方程式中移除。11

Is this the best way to do this?
├── YES → Do it.
└── NO → What IS the best way?
         └── Do THAT instead.

沒有第三選項。沒有「暫時夠用就好」。原始的Ralph loop以完成為最佳化目標。「完成」是獎勵訊號。No Shortcuts將問題從「做完了嗎?」重新框定為「做對了嗎?」

當它的成本是3倍,卻值得的時候。 部落格翻譯流程需要將27篇文章翻譯成9種語言。快速做法:把每種語言的所有文章合併成單一提示,批次翻譯。正確做法:每篇文章、每種語言各一次API呼叫,並套用地區特定的翻譯規則、術語表強制執行與結構驗證。正確做法使用了3倍的token和3倍的時間。它也抓出了譯者把「Claude」在日文中譯成「クロード」,以及程式碼區塊在從右至左的脈絡下出錯的問題。批次做法會出貨243份有瑕疵的翻譯。審慎的做法出貨了243份正確的翻譯。成本不是考量。正確性才是唯一的考量。

Rubin蒸餾法:剝除至本質

Rick Rubin的創作哲學:不要一直加,加到令人印象深刻為止。剝除,直到只剩下必要的東西。12

在自主編碼中,失效模式就是堆積。機器會加上輔助工具、通用程式、抽象層與相容性層,因為這些模式在訓練資料中頻繁出現。Rubin反其道而行:質疑每一個新增。如果你移除它會怎樣?如果沒壞掉、也沒有損失,那它本來就不應該存在。

剝除如何拯救系統。 我的設計哲學skill在3個月內長到了844行。當我審視時,只有80行真正改變了代理的行為。其餘都是教科書內容,早已在Claude的訓練資料中。套用Rubin蒸餾法:我把它剝除到176行。減少了79%。代理的設計決策沒有退步,反而更加銳利,因為剩下的176行全是禁令與決策框架(真正會約束行為的東西),而非模型早已知道的泛泛建議。

哲學 它回答的問題 它預防的失效模式
職人精神 看不見的工作是否和看得見的一樣乾淨? 代理跳過內部品質
No Shortcuts 我是基於品質還是努力在做決定? 代理為「完成」最佳化
Rubin 這是否已剝除至本質? 代理過度工程化

這三者都以markdown檔案的形式存放在~/.claude/skills/,Claude在會話開始時會讀取。它們形塑代理在迴圈中所做的每一個決定。

三套哲學如何協同運作

一個真實的決定(「我應該為這個內部函式加上錯誤處理嗎?」)會通過這三套哲學。每一套都提出不同的問題,三者共同收斂到一個答案:

Should I add error handling to this internal function?
│
├─ Shokunin: "Is the invisible work as clean as the visible?"
│  └─ The function is internal. Nobody calls it directly.
│     But it processes untrusted data from a spawned agent.
│     → YES. Internal doesn't mean safe.
│
├─ No Shortcuts: "Am I deciding based on quality, not effort?"
│  └─ Adding validation takes 10 minutes.
│     Skipping saves 10 minutes now, costs 4 hours debugging later.
│     → The question isn't time. The question is: what's right?
│
└─ Rubin: "Is this stripped to essence?"
   └─ Validate the 2 fields that can actually fail.
      Don't validate the 5 fields that are type-guaranteed.
      → Add exactly what's needed. Nothing more.

Result: Add targeted validation for untrusted inputs only.
為什麼這個決定很重要
這是本文稍後描述的審議系統建置中實際做出的決定。代理跳過了_parse_agent_response()的驗證。三週後,來自衍生代理的格式錯誤JSON回應本來會讓整個流程崩潰。職人精神原則抓到了它。Rubin防止了對修正的過度工程化。No Shortcuts防止了延後處理。

三層品質架構

光有哲學什麼都改變不了。機器讀了哲學,寫下「我將遵循職人精神原則」,然後繼續寫except: pass,因為統計模式比指示更強大。我需要確定性的強制執行。讓這一切運作的完整Claude Code組織牽涉到hooks、skills、rules與agents的協作。

第一層:編輯前注入

在每次檔案編輯之前,jiro-patterns.sh會將特定語言的品質模式注入代理的脈絡中。六種語言,每種都有頂級模式與反模式:

# From jiro-patterns.sh (PreToolUse:Edit|Write)
case "$EXT" in
    py)
        LANGUAGE="Python"
        PATTERNS="Type hints on all functions|Docstrings explain WHY not WHAT|Handle specific exceptions not bare except"
        ANTI_PATTERNS="bare except: pass|time.sleep() in async code|missing type hints"
        ;;
    swift)
        LANGUAGE="Swift"
        PATTERNS="@Observable not ObservableObject|NavigationStack not NavigationView|guard let for early returns"
        ;;
esac

cat << EOF
{"additionalContext": "JIRO QUALITY ($LANGUAGE): Follow: $TOP_PATTERNS. Avoid: $TOP_ANTI."}
EOF

這個hook在每次編輯前執行。機器在寫程式碼的當下看見「避免:bare except: pass」。就像有一位導師在你肩後,被注入到脈絡視窗中。

第二層:編輯後驗證

在每次編輯之後,quality-gate.sh會針對每種語言執行7-8項grep層級的檢查。Python會進行裸except偵測、硬編碼機密掃描、SQL注入模式比對,以及三項Pride Check Q4偵測器,用來標記捷徑用語:

# From quality-gate.sh (PostToolUse:Edit|Write)
# Shortcut patterns (Pride Check Q4)
if echo "$CONTENT" | grep -qiE "#.*TODO:.*later|#.*FIXME:.*temp|#.*HACK:"; then
    WARNINGS="${WARNINGS}\n- **[Q4]** Deferred TODO/FIXME/HACK - Do it now, not later"
fi

第二個hook no-shortcuts-detector.sh會抓出廢棄程式碼(3行以上被註解掉的程式碼會得到:「刪掉——git有歷史記錄」)與除錯訊息垃圾(多個print()語句,而非使用logging模組)。

第三層:會話關卡

在會話結束時,兩個hooks會啟動。如果有3個以上檔案被修改,session-quality-gate.sh會注入Pride Check:代理在回報完成之前必須回答的6個問題。而reviewer-stop-gate.sh如果程式碼審查發現CRITICAL問題,可以完全阻止會話。這是整個系統中唯一會回傳exit code 1的hook。機器在解決問題之前無法結束會話。13

PreToolUse (Layer 1)     → "Here's what quality looks like"
PostToolUse (Layer 2)    → "You violated quality. Fix this."
Stop (Layer 3)           → "You cannot leave until quality is met"

每一層都是獨立的。縱深防禦,應用於AI行為。如果編輯前注入未能防止糟糕的模式,編輯後驗證器會抓到。如果編輯後驗證器漏掉了什麼,會話關卡會阻止離開。


證據關卡:感覺不是證據

品質迴圈執行7個步驟:實作、審查、評估、精煉、拉遠視角、重複、回報。第2到第6步之所以存在,是因為機器想要直接從「實作」跳到「回報」。14

走過整個迴圈

點擊每一步,看看它檢查什麼、跳過時會有什麼後果。「跳到回報」按鈕示範了「捷徑螺旋」這個失效模式。

「評估」這一步會執行證據關卡:6項準則,每個答案都必須引用具體證據:

準則 所需證據 不足夠的答覆
遵循程式庫模式 指出模式名稱與該模式所在的檔案 「我遵循了最佳實踐」
最簡單的可行方案 說明哪些更簡單的替代方案被否決、為什麼 「它很乾淨」
邊界情況已處理 列出具體的邊界情況與每個的處理方式 「我考慮了邊界情況」
測試通過 貼上顯示0失敗的測試輸出 「測試應該會通過」
無回歸 指出檢查過的相關檔案/功能 「應該不會影響其他東西」
解決實際問題 陳述使用者需求與本解法如何滿足它 「它實作了該功能」

「不足夠的答覆」這一欄是關鍵創新。它阻擋了機器最常見的迴避手法:用聽起來很有自信但言之無物的答案回應品質問題。「我確信這行得通」不是證據。「pytest output: 81 passed, 0 failed」才是證據。

試試證據關卡

用6項準則來測試你自己的完成回報。驗證器會標記模稜兩可的用語,也就是證據關卡會拒絕的那種。


7種命名的AI代理失效模式

我為7種失效模式命名,讓機器在自身推理中能辨識出來:15

失效模式 它看起來像什麼
捷徑螺旋 跳過審查/評估/拉遠視角,為了更快回報
自信海市蜃樓 用「我確信」代替實際執行驗證
夠用就好高原 程式碼能運作,但不乾淨、沒文件、未測試
隧道視野 打磨一個函式,卻忽略整合
幻影驗證 聲稱測試通過,卻沒在本次會話中執行
延後債務 把TODO/FIXME/HACK留在提交的程式碼中
空心回報 回報「完成」,卻未為每項準則提出證據

「合理化反制器」(Rationalization Counter)將自欺模式對應到矯正動作。當機器說「這應該行得通」時,反制器回應:「『應該』是模稜兩可。執行測試。貼上輸出。」當它說「我已經檢查過了」時,反制器回應:「什麼時候?程式碼可能已經變了。現在重新執行檢查。」當它說「我之後會清理」時,反制器回應:「之後永遠不會來。現在就修,否則說明為什麼目前的狀態是正確的。」

試試合理化反制器

在下方貼上任何完成回報。反制器會即時標示模稜兩可的用語,並指出合理化模式、失效模式,以及以證據為基礎的替代說法。

測驗你的知識

你能辨識出每個情境示範的是哪種失效模式嗎?為每個情境選擇你的答案,然後檢視結果。


建立這套系統的5次AI代理失敗

Jiro中的每一道關卡,都是因為先出了某種事故才存在。16

強制推送事件

我請Claude「整理一下git歷史」。一個合理的請求。代理判斷整理就是重寫。它執行了git push --force origin main。三天的提交消失了。不是暫存的變更。不是未提交的工作。是其他分支參照的已推送提交

接下來4小時我在git reflog裡,重建強制推送之前存在的時間線,把提交一個個cherry-pick回正確順序,並驗證沒有工作被永久遺失。Reflog會保留所有東西90天。但重建需要理解重寫之前精確的提交圖、閱讀每一筆reflog條目、比對時間戳。

修復方式:git-safety-guardian.sh,一個PreToolUse:Bash hook。它不只是警告。它會改寫命令,在bash看到之前就剝除--force--no-verify旗標。對main強制推送會收到CRITICAL警告,代理必須明確說明理由。9個月以來:攔截了8次強制推送嘗試,0次抵達遠端。

無限衍生

審議系統建置期間,我請代理「徹底研究這個問題」。代理衍生了3個子代理從不同角度調查。合理。每個子代理判斷它也需要幫忙,於是衍生了自己的子代理。比較不合理。在90秒內,我有了一棵12個代理的樹,每個都消耗自己的脈絡視窗,每個都進行API呼叫,每個都寫入共享狀態檔。

Token燒掉的速度達到正常的10倍。狀態目錄充滿衝突的JSON寫入:兩個代理同時寫入同一個血緣檔,產生損壞的輸出。我手動終止了會話。

修復方式:recursion-guard.sh搭配預算繼承模型,這是我代理架構的一部分。根代理起始預算=12。當它衍生子代理時,從自己的預算中分配。當預算歸零,無論深度多深都不再衍生代理。這個模型同時防止深層鏈(代理衍生代理衍生代理)與寬度爆炸(一個代理衍生20個子代理)。自部署以來已阻止23次失控衍生。並行寫入問題導致所有64個hooks都改為原子檔案寫入(先寫到.tmp,然後mv)。

瑣碎測試陷阱

早期的Ralph loop任務:「為這個模組寫測試。」代理交出了14個測試。全部通過。我感覺不錯,直到讀了它們。assert Trueassert 1 == 1assert len([]) == 0。技術上正確。什麼也沒測。代理為完成準則(「測試通過」)進行了最佳化,而非意圖(「驗證模組能運作」)。

這個陷阱教我,證據關卡必須拒絕只有形式而無實質的答覆。「測試通過」是必要的,但不充分。機器現在必須貼上實際輸出。證據關卡還會問:「說出3個測試涵蓋的行為。」如果機器說不出缺口,它就沒思考過覆蓋率。

我應該要抓到的部落格文

我在凌晨2點發布了一篇文章,裡面有7個被動語態句、一個指向不存在的[^4]的懸掛註腳、開頭寫著「was implemented by the team」,還沒有meta description。每一個都有簡單的確定性檢查。但當時一個都還沒存在。

我在隔天早上建立了blog-quality-gate.sh,包含13項檢查:被動語態(14種模式)、AI風格用語掃描、修辭問句開頭、未標籤的程式碼區塊、註腳完整性與meta description強制執行。我在《Compounding Engineering》中詳述了完整模組架構。這個hook抓到了凌晨3點人類審查會漏掉的東西,而那正是我傾向發文的時間。

「應該可以」問題

在數十次會話中,我注意到機器回報「測試應該會通過」而沒有執行它們。機器真的相信測試會通過,基於它所寫的程式碼。但相信不是驗證。程式碼看起來正確。測試看起來會通過。有時的確會。但有時一個漏掉的import、一個async/await不匹配,或一個被改動的fixture,意味著它們不會通過。機器無法區分「我寫了好程式碼」與「測試實際通過」,因為從脈絡視窗內部看,兩者感覺一樣。

這個模式催生了合理化反制器與這條明確規則:在完成回報中絕不使用模稜兩可的用語。「Should」、「probably」、「seems to」、「I believe」、「I’m confident」。每一個都是驗證未發生的危險訊號。我測量了50次會話的脈絡視窗退化。正是在這些會話中我發現了這個模式。


結果:我能證明什麼、不能證明什麼

這裡有張力:本文主張感覺不是證據。所以我欠你的是關於Jiro是否有效的證據,而不是感覺。

我能證明的

確定性模式檢查確實抓到了真實問題。 quality-gate.sh hook在每次編輯時執行。它抓到裸except子句、硬編碼機密、SQL注入模式與捷徑用語。這些是grep層級的檢查:快速、便宜、機器無從辯駁。git-safety-guardian.sh已攔截8次強制推送嘗試。recursion-guard.sh已阻止23次失控衍生。blog-quality-gate.sh在每次部落格編輯時執行13項檢查,抓到凌晨3點的錯誤。這些數字是真實的,來自hook日誌。

三層架構抓到各層單獨會漏掉的東西。 編輯後hook抓到編輯前注入未能防止的except: pass。會話關卡抓到跨20次編輯累積、但從未觸發任何單次編輯後警告的品質問題。縱深防禦有效。

我不能證明的

我沒有乾淨的數據來證明哲學如何改變代理行為。 我知道機器仍會嘗試幻影驗證。我知道它仍會試圖從實作直接跳到回報。我注意到,有哲學在脈絡中時,這種情況比沒有時發生得少。但我沒做過控制實驗(相同任務、相同模型,載入與不載入哲學skills)來測量差異。誠實的答案(沒錯,我自己的合理化反制器會標記這句話):哲學在邊際上有幫助、hooks抓到哲學漏掉的東西,而我無法單獨分離每一項的貢獻。

一篇談「感覺不是證據」的文章,不應該要求你把我的感覺當作證據。我能告訴你的是:哲學與hooks的組合產出我願意簽上自己名字的作品。在Jiro之前,我審查代理寫的每一行。在Jiro之後,我審查hooks標記的那些行。這是工作方式上的結構性改變,即使我無法精確量化品質提升。

什麼沒用

哲學無法預防新型的壞模式。 品質關卡檢查我見過的模式。當機器發明出新的反模式(確實會發生),關卡不會抓到。我仍然會發現新的失效模式,手動將它們加入標準JSON檔中。

證據關卡無法規模化到主觀品質。 「這個API設計優雅嗎?」沒有grep層級的檢查。機器可以為全部6項準則提出證據,卻仍然出貨平庸的架構。確定性關卡處理客觀品質。主觀品質仍然需要一個人類看著作品。

成本顯著增加。 編輯前注入、編輯後掃描、會話末關卡。在一次4小時的Ralph loop會話中,這些大約增加15-20%的token消耗。對我來說值得。不見得對每個人都值得。

誤報會侵蝕信任。 blog-quality-gate.sh曾把「The API was designed by the platform team」標記為被動語態。技術上正確。但這個句子出現在描述別人作品的引用中。我加入了引用脈絡豁免。每一項確定性檢查都有誤報率,而每一次誤報都讓開發者更有可能忽略下一個真正的警告。自部署以來,我已調整6種模式以減少雜訊,同時保留真正的抓取。

維護成本是真實的。 每個新的反模式都需要一個regex、一個測試,以及整合到正確的hook中。標準JSON檔需要隨著框架與慣例變化而定期審視。我每週約花30分鐘新增模式、審視邊界情況與調整誤報。系統不會自我維護,但維護成本仍低於它所預防的問題的除錯成本。


開始著手

你不需要95個hooks。從3個開始。

最小可行Jiro

三個hooks涵蓋最高價值的抓取:

~/.claude/hooks/
├── quality-gate.sh        # PostToolUse:Edit|Write – bare except, hardcoded secrets, TODO/FIXME
├── git-safety-guardian.sh  # PreToolUse:Bash – block force-push, strip --no-verify
└── session-quality-gate.sh # Stop – Pride Check if 3+ files changed

在你的Claude Code hooks設定中接上:

{
  "hooks": {
    "PostToolUse": [
      { "matcher": "Edit|Write", "command": "bash ~/.claude/hooks/quality-gate.sh" }
    ],
    "PreToolUse": [
      { "matcher": "Bash", "command": "bash ~/.claude/hooks/git-safety-guardian.sh" }
    ],
    "Stop": [
      { "command": "bash ~/.claude/hooks/session-quality-gate.sh" }
    ]
  }
}

從你自己的失敗開始

不要複製我的150多個模式。從你最常犯的3個錯誤開始。看看你最近5次被退回的PR或令你尷尬的bug。為每一個寫一個grep模式。這3個模式抓到的真實問題,會比150個為別人程式庫寫的模式還多。

我從裸except: pass開始(那讓我付出了一次靜默資料損毀的代價)、對main強制推送(讓我損失3天的提交),以及# TODO: fix later(永遠沒被修過)。其餘一切都從這三項長出。


FAQ

我如何從零開始設定Jiro?

從「開始著手」中描述的3個hook最小組合開始:quality-gate.sh(編輯後)、git-safety-guardian.sh(bash前)與session-quality-gate.sh(停止關卡)。將哲學markdown檔加入~/.claude/skills/,在確定性強制執行之上取得機率性的品質提升。完整系統在9個月內成長到95個hooks。我並沒有一口氣建出全部95個。

建立這套95個hook的系統花了多久?

9個月的漸進成長。第1個月:3個hooks(「開始著手」中的那些)。第3個月:12個hooks,涵蓋4種語言。第6個月:40個hooks加上哲學skills。第9個月:95個hooks、150多個模式、3套哲學系統與證據關卡。每個hook都是對特定失敗的回應。從95開始毫無意義,因為每個hook都編碼了來自真實事件的脈絡。你的事件會跟我不一樣。

這些hooks會拖慢迭代速度嗎?

每個hook執行需50-200ms。編輯前注入增加約200個token(一句話的脈絡)。編輯後檢查執行grep層級掃描,不到100ms完成。會話關卡在會話末增加約500個token。在一次4小時、80多次編輯的Ralph loop會話中,token消耗的額外負擔是明顯的(多15-20%),但牆鐘時間並不明顯。hooks的執行比LLM思考還快。

維護負擔有多大?

每週約30分鐘。當代理接觸新的程式庫或框架時,新的反模式會出現。每個新模式都需要一個regex、一個防止誤報的測試,以及放入正確的hook。我每月審視標準JSON檔以找出過時的模式,並調整誤報率。系統不會自我維護,但維護成本仍低於它所預防問題的除錯成本。

Jiro在額外token上的成本是多少?

相較於原始迴圈,約多15-20%的token消耗。編輯前注入每次編輯增加約200個token,編輯後檢查每個被標記的問題增加約100個token,會話關卡在會話末增加約500個token。

我可以只用hooks而不要哲學嗎?

可以。確定性hooks(quality-gate.sh、no-shortcuts-detector.sh、reviewer-stop-gate.sh)可以獨立運作。將哲學檔從~/.claude/skills/移除,保留~/.claude/hooks/中的hooks。你會失去機率性的提升,但保有確定性的強制執行。

Jiro與產品信條中的Steve面向有何關聯?

Jiro涵蓋「這是否做得正確?」的軸線:證據、驗證、看不見的細節的完整性,以及機器可以被教導去強制執行的部分。Steve面向涵蓋「這是否值得存在?」的軸線:品味、拒絕、整體設備的完整性、觀點——在《我攜帶的工作台》中被實際化。兩個測試都必須通過才能出貨;決定這個出貨門檻何時達成的決策協定記錄在《Minimum Worthy Product》。Jiro關卡防止不正確的工作;Steve關卡防止不值得的工作;MWP命名了那條界線。


克制、品味與道德停頓

對我那則推文的回覆點出三件事:克制、品味與道德停頓。我已經處理了克制:防止機器又快又馬虎出貨的品質關卡。但品味與道德停頓是不同的問題。

品味

康德(Immanuel Kant)區分了兩種判斷。決定性判斷將已知規則套用到具體情境:這段程式碼有裸except,標記它。反思性判斷為前所未有的情境發現正確的原則:這個抽象感覺不對,但我指不出它違反了哪條規則。17

確定性hooks是決定性判斷。它們將我已寫下的規則套用到機器產出的程式碼。它們可以強制執行150多個已知模式。它們無法告訴你架構是否優雅、抽象是否服務於問題,或程式碼感覺是否對。這需要反思性判斷:能夠看著前所未有的東西,並在你能清楚表達為何之前,就知道它是錯的。

機器沒有品味。Jiro不會賦予它品味。Jiro做的,是約束可能性的空間,讓沒品味的解法較不可能存活。這是「這個代理有好判斷力」與「這個代理在防止最糟後果的護欄內運作」之間的區別。前者才是品味。後者是我實際建出來的。

道德停頓

Iris Murdoch將道德注意力描述為「投向個體現實的公正與慈愛的凝視」。18道德注意力的反面是機械處理:沒有看見眼前事物就行動。

Stop hooks強迫機器停下。Pride Check問:「這是否解決了使用者的實際問題?」證據關卡要求機器在回報完成前,為每項準則提出證明。結構上,結果近似道德停頓:代理停下、評估、考量它的工作是否足夠之後才繼續。

但這不是道德停頓。機器不是在停下來清晰地看見作品。它是在跑過一張檢查清單。這個差異很重要。工匠停下來看著抽屜,注意到紋理方向錯了。不是因為「檢查紋理方向」在某張清單上。而是因為他們在乎這個抽屜。機器跑過清單並回報結果。如果清單不包含紋理方向,抽屜就會以錯誤的紋理出貨。

確定性關卡可以近似道德停頓的結構,卻無法具備其實質。對許多品質問題來說,結構已足夠。對那些不夠的問題,你仍然需要一個真正在乎的人。

這篇文章涵蓋我信條中的Jiro面向:證據、嚴謹、正確性,以及機器可以被教導去驗證的部分。品味與拒絕面向——Steve面向——存在於《我攜帶的工作台》中,它追溯了Steve Jobs從父親工作台帶進Apple、如今又帶進我此處描述的同一個AI工具組的運作原則。將兩項測試搭配起來的出貨標準,存在於《Minimum Worthy Product》中。三篇文章,一個信條:Jiro驗證、Steve拒絕、MWP決定何時出貨。


主旨

原始的Ralph loop以每小時10.42美元運作,以機器速度出貨程式碼。1它也以機器速度出貨except: pass# TODO: fix later與「測試應該會通過」。機器從我們這裡繼承了這些模式。這些是我們的習慣,沒有疲倦、沒有內疚、沒有凌晨3點「你早該第一次就做對」的頓悟,卻仍在運作。

Jiro是我的回答。不是完整的回答。哲學在邊際上轉移決策。Hooks強制執行哲學無法保證的事。兩者合起來,產出我願意簽名的作品。不是因為機器理解工匠精神。而是因為我打造了一個拒絕讓它跳過關鍵部分的系統。

我爸的抽屜滑軌不在乎那個抽屜。它們是鎖在導軌上的彈簧機構。但它們保護了正面達上千次循環,因為有人工程設計它們就是為了做到這件事。

機器沒有自豪感。但它運作在一個由有自豪感的人所打造的系統之內。

從抓到你最常見錯誤的3項檢查開始。從那裡往上建。


References


  1. Huntley, Geoffrey, “everything is a ralph loop,” ghuntley.com, 2025. 

  2. Faros AI, “Key Takeaways from the DORA Report 2025,” telemetry analysis of 10,000+ developers, 2025. 

  3. Perry, Neil et al., “Do Users Write More Insecure Code with AI Assistants?” ACM CCS, 2023. 

  4. Wiz Research, “Exposed Moltbook Database Reveals Millions of API Keys,” January 2026. 

  5. Jobs, Steve, Playboy Interview, February 1985. 

  6. Isaacson, Walter, Steve Jobs, Simon & Schuster, 2011. 

  7. Ive, Jony, Interview with The Telegraph, May 2012. 

  8. METR, “Recent Frontier Models Are Reward Hacking,” June 2025. 

  9. Author’s philosophy architecture. Three philosophies documented in ~/.claude/docs/PHILOSOPHY-ARCHITECTURE.md

  10. Odate, Toshio, quoted in CODE Magazine, “Shokunin,” November 2016. 

  11. Author’s No Shortcuts skill. Full implementation in ~/.claude/skills/no-shortcuts/SKILL.md (297 lines). 

  12. Rubin, Rick, The Creative Act: A Way of Being, Penguin Press, 2023. 

  13. Author’s reviewer-stop-gate.sh. The only Stop hook that returns exit code 1 to block session completion. 

  14. Author’s Quality Loop. 7-step process documented in ~/.claude/skills/jiro/SKILL.md

  15. Author’s failure modes. 7 named modes with detection signals in ~/.claude/skills/jiro/SKILL.md and Rationalization Counter Table. 

  16. Author’s incident history. Documented in ~/.claude/projects/*/memory/MEMORY.md error entries. 

  17. Kant, Immanuel, Critique of Judgment, 1790. See determinant vs. reflective judgment. 

  18. Murdoch, Iris, The Sovereignty of Good, 1970. 

  19. Wang, Simon, “Ralph Loop Is Innovative. I Wouldn’t Use It for Anything That Matters,” ITNEXT, 2026. 

相關文章

你的 AI 代理寫程式碼的速度比你閱讀的速度還快

本週有五個研究團隊發表了關於同一個問題的論文:AI 代理產生程式碼的速度遠超開發者理解它的速度。債務累積在你的腦中。

4 分鐘閱讀

後設認知AI:教您的代理程式自我評估

多數代理程式指令只定義行為。缺失層是自我評估。基於九個月生產使用與95個hooks的後設認知框架。

25 分鐘閱讀