← Loop Engineering 首頁

譯者註:本文翻譯自 Addy Osmani 的開放指南《Loop Engineering: Stop Asking Me What It Is》, 由 HuaShu 格式化為 IEEE 會議論文格式,原文免費提供。 原始 PDF 翻譯目的為方便中文讀者閱讀,如有疑義請以原文為準。

迴圈工程:設計自我提示代理系統的 Anthropic 攻略

Loop Engineering: The Anthropic Playbook for Designing Systems That Prompt Your Agents

一份自主運行迴圈設計的實地研究

A Field Study of Designing Loops That Run Themselves

摘要(Abstract)

在過去兩年中,一連串以「XX 工程(XX Engineering)」為名的術語緊隨著模型發布的步伐相繼出現。這份筆記探討了其中最新的術語——「迴圈工程(Loop Engineering)」。此術語於 2026 年 6 月由 Peter Steinberger、Boris Cherny 和 Addy Osmani 獨立提出,並由 Osmani 首次在書面中命名。與提示詞工程(Prompt engineering)、上下文工程(Context engineering)或安全裝置工程(Harness engineering)不同,迴圈工程並非教導從業者如何更好地完成工作,而是將從業者完全從具體工作中抽離。我們定義了此術語,將其歸為安全裝置(Harness)之上的第四層架構,並將迴圈的單次執行(Turn)拆解為五個動作——探索(Discovery)、交付(Handoff)、驗證(Verification)、持久化(Persistence)和排程(Scheduling)——以及實現這些動作的六大元件。我們特別關注生成者與評估者(Generator/Evaluator)的分離:從經驗來看,被要求為自己輸出評分的代理人(Agent)往往會自我讚美,而調整一個獨立且抱持懷疑態度的評估者,遠比讓生成者對自己的工作進行批判更具可行性。我們調查了實務中運行的三個迴圈,從一位工程師的早晨分類工作,到 Stripe 公司每週合併超過 1,300 個機器撰寫之拉取請求(Pull Request)的企業級流水線,並編錄了四個在無形中累積的代價——驗證債(Verification debt)、理解退化(Comprehension rot)、認知棄守(Cognitive surrender)和 Token 暴增(Token blowout)。最後,我們提供了建構第一個迴圈的具體方法。核心觀點是:迴圈使生成幾乎變得免費,而讓判斷力成為稀缺資源;由兩個人建構同一個迴圈,可能會產生截然相反的結果。

索引詞(Index Terms)——代理型 AI(Agentic AI)、軟體工程(Software engineering)、自主代理人(Autonomous agents)、編碼代理人(Coding agents)、生成者-評估者(Generator–evaluator)、排程(Scheduling)、自動化(Automation)。


I. 導言:迴圈工程的真諦(Introduction: What Loop Engineering Really Is)

提示詞工程課程依然熱銷,上下文工程的墨水未乾,而安全裝置工程才剛被記錄下來。如今,迴圈工程也悄然登場。在過去的一年裡,這些「XX 工程」術語幾乎與模型發布同步出現,人們難免會想對此嗤之以鼻。

但這一次有所不同。它並非關乎如何更好地完成工作,而是將從業者完全從具體工作中抽離。早期的術語都假設有一位人類坐在鍵盤前,逐行指導代理人。迴圈工程刪除了這個假設。從業者不再處於迴圈之內(Inside the loop),而是站在迴圈之外(Outside the loop)建構迴圈。

A. 一言以蔽之的定義(A One-Line Definition)

提出該術語並將其記錄下來的人是 Google Chrome 團隊的工程師 Addy Osmani。他的定義很簡短:迴圈工程是取代自己作為提示代理人的人,並設計出取而代之的系統。我們不再需要逐行餵給代理人指令,而是設計出一個自動為其提供指令的系統。這句話的重點在於「取代自己(Replacing yourself)」。這是一次位置的轉變——從作為引擎本身,轉變為設計引擎的人。我們所寫的不再是給代理人看的文字,而是能夠自動向代理人發送文字的系統。

B. 一週之內,三人點燃導火線(Within One Week, Three People Lit the Fuse)

這個術語並非憑空發明。在 2026 年 6 月的某一週內,數個團隊幾乎在同一時間遇到了同樣的問題。引爆點是 OpenClaw 的作者 Peter Steinberger 發表的一篇突破 800 萬瀏覽量的帖子:我們不應該再向編碼代理人(Coding agent)進行提示,而應該設計那些能夠提示它們的迴圈。幾乎在同一時間,Anthropic 負責 Claude Code 的主管 Boris Cherny 也在說同樣的話——他不再主動向 Claude 發出提示,而是運行一些迴圈來向 Claude 發出提示並弄清楚下一步該怎麼做,他的工作就是撰寫迴圈。6 月 7 日,Osmani 在其部落格上以《迴圈工程》(Loop Engineering)為題發表了文章,整合了 Steinberger 和 Cherny 的觀點,並在次日同步發布於 Substack。一次點火、一次迴響、一個命名,皆在一週之內完成。

將這三個陳述放在一起,它們指向同一個轉變:我們設計的對象已從代理人的單一行為,轉變為驅動代理人的整個系統。與之前的「直覺編碼(Vibe coding)」一樣,這個術語聽起來可能有些粗糙,但它將一種工作方式轉化為可供討論的實體。

C. 為何此術語在此時出現(Why the Term Arrived Now)

值得思考的是,為何三位事前未曾交流的從業者,會在同一週內想到同一個詞。答案是,周邊的工具已在不知不覺中跨越了臨界點。編碼代理人已變得足夠可靠,可以在無人看管的情況下完成非瑣碎的任務;排程原語(Scheduling primitives)已出現在各大安全裝置中;而單次代理人運行的成本已降得足夠低,以至於在定時器上重複運行不再顯得浪費。當所有零件都齊全時,將它們結合起來的舉措對所有人來說都變得顯而易見。名稱滯後於實務數個月:在任何人稱其為迴圈工程之前,人們就已經在撰寫迴圈了,就像在生成者/評估者分離有了正式名稱之前,團隊就已經在使用寫作者代理人(Writer agent)搭配審查者代理人(Reviewer agent)一樣。

這種「實務先行,命名在後」的模式值得銘記,因為它告訴讀者該去哪裡尋找下一個術語。它不會來自某次模型的發布,而是來自某個新功能變得足夠便宜、以至於先前不可想像的組合方式變成常態的那一刻。

D. 安全裝置之上一層(One Floor Above the Harness)

這個轉變可以簡化為兩句話。在舊世界中,你坐下來逐行提示代理人;它完成一件事後便會停下來,等待下一個指令。你是迴圈內部的人類時鐘,每一次滴答都必須來自人類。在新世界中,你設計了一個能夠自己滴答運行的系統——它依據定時器運行、產生助手來執行工作,並將自己的結果回饋給自己。

正如 Osmani 所說,迴圈工程位於安全裝置之上一層:下方的安全裝置負責武裝單次的代理人運行;上方的迴圈則使其一遍又一遍地自我運行。這是一種身分的轉變,從操作代理人的人,轉變為對其進行排程的人。價值的焦點從「知道如何指導」轉向「知道如何建構迴圈,以及如何在迴圈中放置一個可以說不(No)的檢查機制」——正如隨後章節所解釋的,最後一部分是最困難的。

[圖 1:四層堆疊架構(The Four-Layer Stack)。每一層關注的範圍都比其下方的層級更大;迴圈工程將安全裝置留下的「等待你」這一步驟自動化。圖中文字由下至上為:提示詞工程(Prompt engineering,為模型撰寫的字句)→ 上下文工程(Context engineering,此時放入視窗的內容)→ 安全裝置工程(Harness engineering,武裝單次運行:工具、動作與「完成」判定)→ 迴圈工程(Loop engineering,使其一遍又一遍自我運行)。範圍隨之向上一層增長。]

表 I

四層堆疊(The Four-Layer Stack)

層級(Layer) 關注對象(What it minds) 核心問題(Core question)
提示詞工程(Prompt eng.) 撰寫一個優質提示詞 我應該告訴模型什麼
上下文工程(Context eng.) 當前視窗中放入什麼內容 該檢索、摘要或清除什麼
安全裝置工程(Harness eng.) 武裝單次運行 使用哪些工具、哪些動作,什麼算完成
迴圈工程(Loop eng.) 對安全裝置進行排程 如何使其一遍又一遍地自我運行

II. 從提示詞到上下文,再到迴圈(From Prompt to Context to Loop)

這些「XX 工程」術語並非相互替代,而是層層疊加,每一層都關注著更大的範疇。表 I 展示了這四層架構。

每往上一層,關注的單元就大上一號:從一個句子,到一個視窗,到一次運行,最後到一個自我運行的迴圈。圖 1 將這四層展示為一個堆疊,其中迴圈坐落在安全裝置之上一層。

A. 四層架構(The Four-Layer Stack)

提示(Prompt) 是最底層,也是最廣為人知的。它關注該告訴模型什麼:字句、範例、角色、語氣。它的邊界是一次對話。問題在於,它假設人類每次都在場並親手遞交提示詞。

上下文(Context) 將問題從「我該說什麼」提升到「此時該將什麼放入這個視窗中,好讓模型能夠解決問題」。它關注模型的整個視野——要檢索什麼、如何進行摘要、該清除什麼過期資訊。一個充斥雜訊的視窗,即便是再完美的提示詞也是浪費。

安全裝置(Harness) 關注代理人在單次運行中需要攜帶什麼:哪些工具、哪些動作、何時載入上下文、如何從失敗中恢復,以及什麼狀態算完成。它武裝了單次運行,但並不使該運行重複。

迴圈(Loop) 則將「等待你」這一環節自動化消除。在具備前三層的情況下,代理人可以乾淨俐落地下載運行一次,然後停止。迴圈為其配備了定時器,使其能按計畫醒來,產生子代理人(Sub-agent)進行平行工作,並將自己的輸出作為下一輪的輸入。

B. 往上一層究竟增加了什麼(What One Floor Up Actually Adds)

有三個動詞將安全裝置與迴圈區分開來。定時運行:迴圈依據排程自行醒來,無需手動按鈕。產生助手:運轉中的迴圈會分拆出子代理人——一個負責起草變更,另一個則專職在審查中挑剔找出毛病。自我回饋:迴圈產出的內容會成為自己下一輪的輸入;昨天的發現被寫入檔案,今天早上它便讀取該檔案並繼續進行。這種跨越對話的記憶,正是使其成為迴圈而非僅僅是多次運行的單次任務的原因。

細粒度的劃分至關重要,因為每一層的失敗方式都不同,而能夠說「不」的檢查機制必須安裝在不同的地方。糟糕的提示詞會被當場發現;糟糕的上下文會顯現在錯誤的答案中。但在迴圈層,系統會在你睡覺時運行、修改你從未看過的代碼,並將自己的錯誤帶入下一輪——而這些錯誤可能好幾天都未被發現。層級越高,你距離現場就越遠,錯誤累積的時間也越長。這正是為什麼迴圈工程真正的難點從來不在於建構迴圈,而是在於在其中加入可以讓它停下來的機制。

C. 每層失效的爆炸半徑各不相同(Each Layer’s Failure Has a Different Blast Radius)

考慮同一個潛在錯誤——代理人誤讀了函數返回的內容——在各層級中的表現。在提示詞層,誤讀會在一輪對話中產生一個錯誤答案;人類會立刻看到並重寫提示詞。在上下文層,誤讀來自於載入到視窗中的過期文件;人類會注意到答案錯得非常有自信,進而清除上下文。在安全裝置層,代理人依據誤讀行動一次——也許它編輯了一個檔案——但運行結束,差異(Diff)清晰可見,人類會在任何內容交付上線前進行審查。在迴圈層,同樣的誤讀被寫入狀態檔案,次日清晨作為既定事實被重新讀取,並在此基礎上進行多輪構建。當有人注意到時,這個錯誤假設已成為承重結構。

這是迴圈工程中最重要的一種直覺:出錯的代價與該錯誤在被發現前所存活的輪數成正比,而迴圈在結構上就是一部將輪數最大化的機器。後續章節中的所有內容——評估者、人類檢查點、預算上限——其存在都是為了縮短錯誤發生到被發現之間的距離。

III. 單一迴圈的五個動作(The Five Moves of One Loop)

「迴圈」一詞很容易被誤解為無意義的原地空轉。每一次執行(Turn)都完成了具體的事情:尋找值得做的工作、交給代理人、驗證結果是否正確、保存狀態,然後決定下一步。忽略探索(Discovery)、交付(Handoff)、驗證(Verification)、持久化(Persistence)、排程(Scheduling)這五個動作中的任何一個,迴圈就無法運轉,或者只能原地打轉。圖 2 描繪了這五個動作,一輪的執行將會為下一輪提供養分。

[圖 2:單次執行的五個動作。排程(Scheduling)完成了這個循環——它將未完成的執行回饋到次日的運行中。驗證(Verification)則是那個可以說「不」的動作。]

表 II

五個動作映射至分類迴圈(Triage Loop)

動作(Move) 具體功用(What it does) 在分類迴圈中的具體表現(In the triage loop)
探索(Discovery) 自主尋找當前執行的工作 技能讀取 CI、議題及提交紀錄
交付(Handoff) 將任務交付至隔離環境中 每個發現皆開啟一個專屬工作區(Worktree)
驗證(Verification) 引入另一個代理人進行否定質疑 第二個子代理人對比測試進行審查
持久化(Persistence) 將狀態寫入對話之外的地方 產生 PR、更新工單並寫入狀態檔案
排程(Scheduling) 讓迴圈一輪接一輪運轉 早晨自動化獨立運行

A. 具體範例(A Concrete Example)

Osmani 為自己建構了一個清晨分類迴圈。早晨,自動化任務會自行啟動。一項分類技能(Triage skill)讀取昨天的失敗 CI 測試、依然敞開的議題(Issue)以及最近的提交紀錄,並將結果寫入 Markdown 檔案或 Linear 任務看板中。針對每一個值得採取行動的發現,它會開啟一個隔離的 Git 工作區(Worktree);一個子代理人起草修復,第二個子代理人對照專案的技能與測試進行審查。一個連接器(Connector)會自動開啟拉取請求並更新工單。任何它無法處理的事項都會進入收件匣(Inbox)等待人類處理,而狀態檔案得以保留,使次日的工作能夠承接今天的進度。整個過程不需要任何人工協助,然而它會在該停下來等待人類的地方精準停下。

B. 動作分解(The Moves)

探索 確定了這一輪執行應該做什麼。在上述範例中,分類技能讀取 CI 失敗、未解決議題和最近的提交。關鍵裝備在於讓代理人自己尋找工作,而不是被塞給一份清單。至關重要地,自動化觸發的是一項技能——成為永久知識的部分——而非貼在無人更新的 Cron 定時任務中的一大堆指令。探索決定了整個迴圈品質的天花板:若探索出來的工作毫無價值,那麼其他四個動作即便做得再漂亮,也是在為無用之事服務。

交付 將任務從排程系統移交到執行工作的代理人手中。每個值得做的事情都會獲得一個獨立的 Git 工作區,因此多個代理人可以在不同的目錄中修改代碼,而不會互相踩踏。任務切分得越乾淨,後續的驗證和合併就越容易。

驗證 是最容易偷工減料、卻也最不能省略的動作。在第一個子代理人起草好修復後,由第二個子代理人進行審查——使用不同的指令,有時甚至使用不同的模型。撰寫代碼的代理人對自己作業的評分往往過於寬鬆;專職挑毛角的評估者則能捕捉到第一個代理人說服自己放行的破綻。這就是「可以說不的機制(Thing that can say no)」。一個缺乏真實檢查的迴圈,不過是代理人對自己的盲目點點頭。

持久化 將結果落在對話之外、能保留下來的地方:透過連接器產生 PR 並更新工單,將無法處理的事情放入收件匣,並寫入記錄進度的狀態檔案。迴圈的記憶不能僅僅活在上下文視窗中;寫入 Markdown 或是看板的內容不會被遺忘。

排程 是將單次運行轉化為迴圈的關鍵。分類任務在每天早晨自動運行,狀態檔案則讓未完成的發現得以延續到次日,並能自動承接。正如 Osmani 所言,自動化正是讓迴圈成為真正的迴圈,而非僅僅是你手動運行了一次的腳本。表 II 總結了這五個動作。

IV. 六大元件:建構迴圈的基石(Six Parts: What a Loop Is Built From)

如果說「動作」描述了單輪執行中發生的事,「元件(Part)」則描述了要讓迴圈運轉起來必須具備的工具。兩者一一對應:探索依賴技能(Skill)、交付依賴工作區、驗證依賴子代理人、持久化依賴記憶(Memory)、排程依賴自動化(Automation)。

表 III

六大元件與五大動作的對應關係

元件(Part) 定義與功能(What it is) 對應的動作(Maps to move)
自動化(Automations) 依據排程或觸發器運行 排程(Scheduling)
工作區(Worktrees) 用於平行代理人的隔離目錄 交付(Handoff)
技能(Skills) 永久性的專案知識,用以償還意圖負債 探索(Discovery)
連接器(Connectors) 連結外部系統的 MCP 掛鉤 持久化 / 探索(Persistence / Discovery)
子代理人(Sub-agents) 將生成者與評估者分開 驗證(Verification)
記憶(Memory) 磁碟上的持久化狀態 持久化(Persistence)

自動化 讓迴圈得以自行運轉,掛載於排程或觸發器上。沒有排程,你手頭擁有的只是單次運行,而非迴圈。自動化應當觸發命名技能,而非 Cron 定時任務中的一大堆指令。排程有多種形式——本地排程(電腦必須保持開機)和雲端排程(即使電腦關機也能運行)。

工作區 是 Git 內建的機制,用於在單一倉庫中支援多個獨立的工作目錄。其價值隨平行度擴展:兩個代理人同時修改同一個檔案,與兩位工程師在同一行代碼上發生衝突一樣令人頭疼。工作區將平行處理從「雖可運行但混亂」轉化為「運行流暢且乾淨」。

技能 將專案知識永久保留在單一檔案(SKILL.md)中,使代理人無需在每輪都重新推導上下文。Osmani 將它們清償的代價命名為意圖負債(Intent debt):即反覆解釋「這個專案是什麼、規則是什麼、陷阱在哪裡」的經常性成本。技能可以被重複使用和維護,而一大堆提示詞則無法做到。

連接器(建構於模型上下文協定 [Model Context Protocol, MCP] 之上)將迴圈與外部世界連結——議題追蹤器、資料庫、測試 API、Slack。一個只能看到檔案系統的迴圈是一個極其局限的迴圈。連接器決定了迴圈的視野半徑,且為某個工具撰寫的連接器通常可以直接移植到另一個工具上使用。

子代理人 將負責撰寫的代理人與負責評判的代理人分開。當同一個代理人既當球員又當評估者時,評估者難免會偏心。出人意料的是,調整一個獨立評估者使其保持挑剔,遠比讓生成者對自己的工作苛刻要容易得多——這就是為什麼迴圈會保留一個額外的代理人,而不是讓單一代理人自我審計。

記憶 是保存在單次對話之外的磁碟持久化狀態——例如 Markdown 檔案或任務看板。一旦上下文視窗被清除,代理人將遺忘一切;為了讓迴圈今天能承接昨天的進度,記憶必須落在磁碟上。代理人會遺忘,但倉庫不會。記憶不同於上下文:上下文是代理人在本輪看到的內容,並會在重新整理時被清除;記憶則跨越輪數和天數持久存在。表 III 展示了六大元件與五大動作的映射關係。

擁有了這六個元件,迴圈便有了骨架:自動化使其運轉,工作區防止其內部衝突,技能避免其做重複工作,連接器拓寬其視野,子代理人使其能夠自我糾正,而記憶使其能夠記住進度。然而,這僅僅是個開始:相同的元件組合在不同的人手中,結果可能完全相反。

V. 生成者與評估者(Generator and Evaluator)

迴圈最難的部分不是讓代理人運行,而是在其中加入可以說「不」的機制——而撰寫代碼的代理人最不可能說出這個字。

[圖 3:生成者與評估者作為獨立的代理人。評估者不帶有生成者的自我說服傾向,預設抱持懷疑態度,並透過實際行動(如點擊、截圖、運行測試)而非僅僅閱讀代碼來進行評判。]

A. 它總是自我讚美(It Always Praises Itself)

Anthropic 的工程師 Prithvi Rajasekaran 在建構長期運行的代理人應用時觀察到:如果要求代理人為自己剛剛產出的內容打分,它往往會充滿自信地給予讚美,即使人類可以一眼看出其品質平庸。這不是聰明與否的問題,而是自己改自己考卷的弊端。編寫代碼的上下文已經塞滿了之所以這樣寫的種種理由,因此當代理人看著自己的輸出時,它看到的不是結果,而是導致該結果的自我說服鏈。在迴圈中,這種缺陷會被放大:如果每一次「這是否足夠好」都由剛剛撰寫代碼的代理人決定,它每輪都會對自己點點頭,運行得越久,偏離真實品質就越遠。

B. 訓練一個懷疑論者,而非修改一個謙虛的作者(Tune a Skeptic, Don’t Fix a Modest Author)

試圖讓生成者變得更具自我批判性,效果往往不佳。Rajasekaran 發現,調整一個獨立的評估者(Evaluator)使其保持懷疑,遠比讓生成者批判自己的工作更具可行性。這種差異是結構性的,而非字句調整的問題:你無法要求作者跳脫出自己的視角,但你可以引入另一個攜帶完全不同指令的代理人,從零開始審視代碼,而不帶任何先前的自我說服。這個想法借鑑自生成對抗網路(Generative Adversarial Network, GAN)——一個網絡負責建構,另一個網路負責挑毛病——並將其移植到撰寫的生成者與審查的評估者上。圖 3 展示了這種結構形成的迴圈。

C. 評估者應當行動,而非僅僅閱讀(The Evaluator Should Act, Not Just Read)

僅僅更換代理人是不夠的。如果評估者只閱讀代碼,它評判的只是「這段代碼看起來是否正確」,而非「運行起來是否正確」。在前端任務中,Rajasekaran 將評估者與 Playwright MCP 連結,使其能夠像 QA 工程師一樣打開頁面、點擊按鈕、截取螢幕畫面並檢查 DOM(文件物件模型)。這將評判依據從「這段 JSX 看起來不錯」轉變為「我點擊了按鈕,頁面跳轉了,這是截圖」。更換底層模型也有幫助:使用相同模型配上新指令往往仍會保留其盲點。社群中一個常見的校準準則是:告訴評估者在被證實正確之前,預設代碼是損壞的——預設態度應當是懷疑,而非信任。

D. 在產品中:基於 /goal 的停止條件(In a Product: /goal on the Stop Condition)

Claude Code 通過 /goal 將這種結構轉化為一項原語:給予代理人一個條件,並讓它一直運行直到該條件被滿足。一個具代表性的評估者設置和停止條件如下所示。

# Evaluator agent (.claude/agents/reviewer.md)
ROLE: Adversarial code reviewer.
ASSUME: this code is BROKEN until proven otherwise.
DO NOT praise. Find what fails.
CHECK, in order:
1. Does it run? (execute, don’t read)
2. Tests: run them, paste real output.
3. Edge cases the author skipped.
4. Does behavior match the ticket?
USE Playwright MCP: open the page, click,
screenshot, inspect the DOM. Judge behavior,
not intent.
VERDICT: PASS only if every check holds.
Otherwise REJECT + list each reason.
# Stop condition, judged by a fresh small model
/goal all tests in test/auth pass and the lint
step is clean

至關重要地,在每輪執行之後,一個快速的輕量模型會檢查條件是否成立;若不成立,則會運行新一輪執行,而非將控制權交還。任務是否完成由一個全新的模型決定,而不是由執行工作的那個模型說了算。這就是雙人控制原則(Maker-checker principle)——在銀行界已沿用數十年,即輸入大筆轉帳的人與審核轉帳的人必須為不同的人——在停止條件上的應用。(Codex 透過自動化加上代理人設定來實現相同的能力;人不應將 /goal 與僅僅在特定間隔重複運行的 /loop 混淆。)

迴圈的下限取決於其評估者。生成者的水平決定了迴圈能產出什麼,而評估者的水平則決定了它不會產出什麼。在結構上將生成與判斷分離、將評估者訓練為懷疑論者、使其透過實際行動進行驗證,並將最終決定權交給全新的模型——這四個步驟是提升迴圈「說不」能力的關鍵。

VI. 迴圈出錯的五種方式(Five Ways a Loop Goes Wrong)

在轉向運作良好的迴圈之前,有必要先編錄它們失敗的方式,因為失敗往往比成功更具啟發性,也更為常見。底下的每一種反模式(Anti-pattern)都對應著五個動作之一被忽略或做得糟糕。

[圖 4:每種反模式都是某個動作被略過的結果。這五種失敗與單次執行的五個動作一一對應:探索被略過(盲目迴圈)、交付被略過(糾纏迴圈)、驗證被略過(點頭迴圈 [Nodding Loop])、持久化被略過(失憶迴圈)、排程被略過(手動迴圈)。]

A. 點頭迴圈(The Nodding Loop)—— 略過驗證

這是最常見的失敗。迴圈在運行,代理人撰寫代碼,並且由同一個代理人宣告代碼完美。在沒有獨立檢查的情況下,每輪都會產生自我核准的輸出,迴圈以機器般的速度累積看似合理卻有瑕疵的錯誤。其症狀是:迴圈在數百輪執行中從未對自己說過一次「不」——這在任何真實的工作負載中都是統計上的不可能,因而證明了根本不存在真實的檢查機制。修復方法是採用前一節所述的生成者/評估者分離架構。

B. 失憶迴圈(The Amnesiac Loop)—— 略過持久化

迴圈發現了值得做的好工作,完成了它,然後卻忘記了它的發生,因為結果僅僅活在被清除掉的上下文視窗中。下一輪執行又重新發現了同樣的工作,或者更糟的是,重新做了一遍並與第一次的嘗試產生衝突。其症狀是:迴圈無法取得累積性的進度,每天早晨都從同一個起點重新開始。修復方法是在磁碟上保留一個狀態檔案——代理人會遺忘,但倉庫不會。

C. 手動迴圈(The Manual Loop)—— 略過排程

一個擁有四個優質動作但缺乏自動化的迴圈不能稱之為迴圈;它只是一個由人類手動運行隨後被遺忘的腳本。在建構完成的那天,它的表現令人印象深刻,但在注意力轉移的那天它便默默停擺。其症狀是:迴圈的最後一次運行停留在它被演示(Demo)的那一天。修復方法是引入一個不依賴人類記憶的真實觸發器(定時器或事件)。

D. 盲目迴圈(The Blind Loop)—— 略過探索

人類每天早晨依然在手動遞交工作給迴圈——「修復這三個錯誤」——因此迴圈只自動化了「執行(Doing)」,而沒有自動化「探索(Finding)」。這節省的時間遠比想像中要少,因為挑選該做什麼往往才是昂貴的部分。其症狀是:人類每天清晨仍要花費時間決定迴圈該做什麼。修復方法是將探索沉澱為一項技能,好讓迴圈能自行發掘工作。

E. 糾纏迴圈(The Tangled Loop)—— 略過交付

迴圈在平行運行多個代理人,卻讓它們修改同一個工作目錄,導致它們的編輯產生碰撞,合併過程變成一場無人能解的災難。此症狀僅在平行處理時顯現:單一代理人的迴圈看起來毫無問題,但在五個代理人同時運行的第一個早晨,問題便會爆發。修復方法是為每個任務分配一個隔離的工作區。圖 4 展示了這五種反模式與它們所違反的動作之映射關係。

這五種失敗並非獨立存在。一個缺乏驗證的迴圈往往也缺乏持久化,因為一個對檢查敷衍了事的團隊,通常對其他環節也同樣敷衍。在實務中,它們常成群出現:紀律嚴明的迴圈會安裝所有五個動作,而行事草率的團隊則只安裝探索和交付——這兩個能產生可見輸出的動作——並略過負責安全保障的其他三個動作。下一節將展示三個完整安裝了所有五個動作的真實迴圈。

VII. 在你入睡時運行的迴圈:三個真實案例(Loops That Run While You Sleep: Three Real Ones)

三個公開的案例在規模上大相徑庭,但共享同一個骨架:一個觸發器按下啟動鍵,一套約束條件使其保持在軌道上,最後由人類檢查點進行把關。「在你入睡時運行」從來不是取決於模型有多強——而是取決於這個骨架有多穩固。

A. 一位工程師的早晨(One Engineer’s Morning)

Osmani 在第三節中拆解的分類迴圈每天早晨都會自動運行。有一個細節值得再次強調:自動化調用的是一項技能,而非粘貼在排程中且無人會去更新的巨大指令區塊。這就是單人便可運行的迴圈樣貌——一個人、一部機器,每天早晨自動搞定繁雜的例行公事。

[圖 5:Stripe 的 Minions 流水線(Pipeline)。確定性閘門(藍色)與大語言模型(LLM)步驟(綠色)相互扣合;任何基於規則的任務都會被排除在概率性模型之外。可靠性來自於約束條件,而非模型大小。]

B. Stripe 的 Minions:每週 1,300 個 PR(Stripe’s Minions: 1,300 PRs a Week)

若要研究企業級規模,最佳案例是 Stripe 的 Minions 系統:正如 Stripe 工程師 Steve Kaliski 在《How I AI》播客中所描述,該系統每週合併超過 1,300 個拉取請求,且沒有一行代碼是人工撰寫的。其觸發方式非常輕量——在 Slack 中團隊成員提及(@)機器人,或是加上一個表情符號回應。

使其可靠的關鍵在於模型喚醒之前的準備階段:一個確定性編排器(Deterministic orchestrator)會首先組裝上下文,掃描連結、拉取 Jira 工單、尋找文件,並使用 Sourcegraph 加上 MCP 來定位相關代碼。讓 LLM 自行尋找上下文是最難控制的部分,因此這項工作(其規則可以被寫死編碼)被從模型手中剝離。任何確定性邏輯可以解決的事情,絕不交給概率性模型;在哪裡劃分這條界線,決定了迴圈是否可靠。

最反直覺的一點是:Minions 並非建構於更強大的模型之上。它是開源工具 Goose 的一個分支,其核心主張是:可靠性來自於約束條件的品質,而非模型的大小。它的架構將確定性閘門(Deterministic gates)與富有創造力的 LLM 步驟交織在一起,如圖 5 所示——代理人編寫代碼,一個寫死的流水線運行 Linter 且代理人無法跳過,代理人修復 Linter 報錯,接著一個確定性的步驟執行 Git 提交。其沙箱(Sandbox)是 EC2 上的 Devbox,基於「牛群而非寵物(Cattle not pets)」的理念運行:每個環境皆可隨意替換,因此上千個代理人得以同時運行而互不干擾。值得注意的是,這 1,300 個 PR 依然由人類進行審查——人類並未離場,只是轉換了辦公桌,從編寫代碼轉為審查代碼。

C. 「在你睡覺時運行」究竟依賴什麼(What “While You Sleep” Actually Relies On)

本地的 /loop 和桌面排程任務需要電腦保持開機;一旦關機,迴圈就會停止。若要在電腦關機時運行,正確答案是雲端例程(Cloud Routines)或 GitHub Actions 的排程觸發器。表 IV 對照了這些選項。想要高頻運行且能看到本地檔案?使用本地 /loop,代價是必須保持電腦開機。想要脫離本地狀態運行?選擇雲端排程,代價是至少一小時的執行間隔且每次都需要重新乾淨地克隆(Clone)代碼。沒有任何單一排程器能包辦一切。

表 IV

排程選項之對照

特性(Feature) 雲端排程(Cloud) 桌面排程(Desktop) 本地 /loop 指令
運行地點(Where it runs) 雲端 本地機器 本地機器
機器需開機?(Machine on?)
會話需開啟?(Session open?)
最小執行間隔(Min. interval) 1 小時 1 分鐘 1 分鐘
可見本地檔案?(See local files?)

對於廣泛流傳的數據需保持警惕:諸如「Claude Code 中約 90% 的代碼是其自身編寫的」或大規模遷移速度提升等說法,大多是二手摘要,應視為粗略參考。此處的三個案例皆源於一手資料,比聽起來令人驚嘆的單一數字更具參考價值。

D. 實務中如何選擇排程器(Choosing a Scheduler in Practice)

在本地排程與雲端排程之間做出選擇,並非依憑個人喜好,而是自然地源於一個問題:迴圈的工作是與本地機器綁定,還是可以離開本地? 兩個具體場景能讓這個規則清晰明瞭。假設一個迴圈必須每分鐘檢查一次本地的開發伺服器——這項工作只能在本地運行,因為雲端無法看到你筆記型電腦上的進程,且雲端執行的最小間隔不能低於一小時。現在反過來:假設一個迴圈需要在凌晨三點掃描倉庫中開啟的議題,並在合理的情況下開啟拉取請求——這項工作絕不應該與個人電腦綁定,因為筆記型電腦會被蓋上、會斷電,也會被攜帶出門。對於第二個場景,雲端排程或 CI 排程觸發器才是正確答案,它們運行在人類入睡時依然保持清醒的機器上。

需要避免的扭曲認知是,將本地重複運行視為「在你睡覺時運行」的全部。本地重複運行意味著「當我在場時,多運行幾輪」;雲端排程則意味著「即使我不在場,也能自動運行」。這是兩種不同的能力,混淆它們是人們合上電腦蓋子後,原以為自主運行的迴圈默默停擺、進而感到失望的原因。誠實的界定是:本地排程以需要保持電腦開機為代價,換取高頻率和對本地檔案的存取權;而雲端排程則以較粗的執行間隔和每次需要乾淨克隆為代價,換取真正的自主性。成熟的迴圈通常兩者並用——本地用於緊密的內部檢查,雲端用於通宵的全局掃描。

E. 同等能力,兩種工具鏈(The Same Capability, Two Toolchains)

本筆記中的指令以 Claude Code 為例,但其能力並非其所獨有。Codex 在不同的名稱下提供了相同的五大核心機制,且為其中一方編寫的連接器通常可以稍作修改後用於另一方。表 V 將它們排在一起,好讓讀者不會將指令名稱張冠李戴。這帶來的啟示是:迴圈工程是一套能力,而非單一產品。無論團隊使用哪種工具鏈,都需要問這六個元件是否齊備,而非提供它們的指令品牌是什麼。

表 V

跨工具鏈之相同能力對照表

核心能力(Capability) Claude Code 的實現 Codex 的實現
排程(Scheduling) /loop 背景工作者 自動化(Automations)分頁
運行至條件滿足(Run until met) /goal 自動化重複運行 + 評判
平行隔離(Parallel isolation) --worktree 背景工作區(Background worktree)
子代理人(Sub-agents) .claude/agents/ .codex/agents/
外部連接器(External conn.) MCP + 插件 MCP 連接器
顯式技能(Explicit skill) SKILL.md $skill-name
關機運行(Machine-off run) 雲端例程(Cloud Routines) 雲端(計劃中)

VIII. 代價:四張不會自動結帳的帳單(The Costs: Four Tabs That Don’t Clear Themselves)

一個會自我運行的迴圈,同時也是一個會自我出錯的迴圈。它運行得越歡快,出錯時就越悄無聲息。以下四種代價會在無形中累積,且在迴圈運行時都不會發出警報。

[圖 6:四種代價相互強化。未經驗證的輸出(Verification debt)會侵蝕理解(Comprehension rot),進而誘發認知棄守(Cognitive surrender),這使得迴圈運行時間更長並花費更多(Token blowout),進而產生更多未經驗證的輸出。]

這四種代價有一個共同特徵:在迴圈運行時保持沉默。迴圈工程最迷人之處在於它能讓一個人完成一個團隊的工作;而最危險之處也在於此,因為團隊會相互爭論,而一個人加上一堆迴圈則極易變成一個無人質疑的同溫層。

A. 債務複利累積的實際案例(A Worked Example of Compounding Debt)

想像一個在夜間開啟了 20 個 PR 且測試全部通過(綠燈)的迴圈。表面上看,這是一次巨大的勝利。但假設這 20 個 PR 中有 3 個包含了測試未覆蓋的隱蔽錯誤。在沒有獨立評估者的情況下,這 3 個 PR 被合併了——這就是驗證債。因為人類在沒有閱讀的情況下合併了 20 個 PR,他們對代碼庫的認知模型現在滯後了 20 個變更——這就是理解退化。因為迴圈運行得如此順暢,人類次日清晨完全停止了閱讀新的一批 PR——這就是認知棄守。又因為迴圈通宵孵化助手並自由重試,其帳單是預估的三倍——這就是 Token 暴增

這三個隱藏的錯誤現在存在於一個人類不再完全理解的代碼庫中,由一個已經停止審視的人類看守著,最終只有在其中一個錯誤暴露為線上故障時,才會被猛然發現。

這個實際案例的重點在於:這四種代價並非孤立的風險清單,而是同一個失敗呈現出的四個面孔。它們相互強化:迴圈產出未驗證的內容越多,人類理解得就越少;理解得越少,放棄得就越徹底;放棄得越徹底,迴圈在無人看管下運行的時間就越長,帳單也就越龐大。圖 6展示了這種自我強化的惡性循環。對抗這四者的防線是相同的:保持一個有能力說「不」的人類,並安裝一個人類不需要醒著也能運行的檢查機制。

IX. 保持工程師的身分,而非僅是按下啟動鍵的人(Stay the Engineer, Not Just the One Who Presses Go)

相同的迴圈,由兩個不同的人建構,最終會走向截然相反的終點——而關鍵的差異並不在於迴圈本身。正如 Osmani 所寫,兩個人可以建構相同的迴圈,卻得到相反的結果。其中一人利用迴圈在自己已經掌握的事情上加速:他們閱讀代碼,保持清晰的方向感,迴圈放大了他們原先就具備的判斷力。另一人則使用相同的迴圈,好讓自己再也不需要去理解代碼。六個月後,前者變得更強,而後者則成了一部自己無法解讀的機器的看門人。

迴圈並非其品質由工具本身決定的工具。它強大到能一成不變地放大你所帶給它的一切:帶來理解,它便放大理解;帶來懈怠,它便放大懈怠。它是一個忠實的乘號,而它所乘的對象正是你。

迴圈使生成變得極其廉價——代碼、計畫、PR、修復,幾乎免費。依然稀缺的是判斷力:知道哪個計畫是正確的、哪一行代碼應該被攔下、哪個輸出雖然運行良好但在根本上是錯誤的。迴圈可以生成一百個選項,但無法真正做出選擇;或者更確切地說,它基於「看起來合理」而非「實際正確」做出選擇,而這兩者之間的鴻溝,正是工程師存在的理由。因此,迴圈工程並未貶低判斷力的價值;它剝離了所有不需要判斷力的工作,使判斷力成為唯一留存的核心。

迴圈會執行賦予它的邏輯,但它並不理解你為何想建構它、你真正想要什麼,或者你寧願自己親自看守哪些地方。這些邊界——手動檢查點設在哪裡、何處任其自行運行——無法從迴圈內部讀取出來;它們只活在建造者's 的腦海中,必須被一條一條地寫入。你設計時抱持的心態,決定了迴圈成長出的形狀。基於「快速解脫自己」心態建構的迴圈,與基於「我仍打算作為工程師」心態建構的迴圈,在代碼上可能有九成是完全相同的;其差別僅在於一兩個檢查點,而這決定了六個月後,你是站在迴圈之上,還是被它掏空。

Osmani 的結尾語值得銘記:建構迴圈,但建構它時要像一個意圖保持工程師身分的人,而非僅僅是那個按下啟動鍵的人。這份筆記中所有的技術細節,都是為了服務這一個姿態。評估者、狀態檔案、預算上限、敞開的門:每一種都是保持人類有能力對一部旨在快速說「是」的機器說「不」的方法。迴圈是這一代軟體實務中最強大的工具,恰恰因為它是其建造者最忠實的放大器,而一個忠實的放大器,其價值或危險程度,與輸入其中的判斷力完全等同。

X. 判斷力的經濟學(The Economics of Judgment)

前一節提出了一個值得單獨審視的主張:迴圈使生成變得廉價,而讓判斷力保持稀缺。這不是一個口號,而是一個會對團隊組織方式產生深遠影響的經濟學觀察。

A. 什麼變得充裕(What Becomes Abundant)

當一種資源變得充裕時,它的價格就會下跌,而围绕它組織的活動也隨之重組。迴圈使代碼、計畫、修復和拉取請求變得極其充裕——單個配備了優秀迴圈的工程師可以產出一個小團隊的產量。過去消耗工程師一整天時間的活動——打字、樣板代碼和機械性的重構——其成本正趨近於零。一個合理的直覺反應是,這會降低工程師的價值。但事實恰趣相反,不過這僅適用於那些牢牢掌握稀缺資源的工程師。

B. 什麼保持稀缺(What Stays Scarce)

稀缺的資源是決定保留哪些充裕輸出的判斷力。迴圈可以生成一百個候選實現;但它無法告訴你哪一個是正確的,只能告訴你哪一個看起來合理,而「看起來合理」與「正確」之間的鴻溝,正是工程的精髓所在。隨著生成接近免費,工程師的全部價值都濃縮到了這個鴻溝之中。留下來的工作是純粹的判斷力,被蒸餾提純,不再被過去圍繞它的機械性勞動所稀釋。

這帶來了一個令人不安的啟示。一個其價值主要體現在機械性勞動——快速打字、廣泛記憶 API、樂於熬夜應對樣板代碼——的工程師,會發現其價值正在蒸發,因為迴圈會免費完成這一切。而一個價值體現在判斷力的工程師,其價值會被放大,因為迴圈會將其正確的決策執行上百次。同一個工具拓寬了這兩類工程師之間的差距。它並非平等地提升每個人;它乘以了每個人所帶來的基數。

C. 放大器是把雙面刃(The Amplifier Cuts Both Ways)

因為迴圈是判斷力的放大器,因此判斷上的失誤也會被同步放大。在舊世界中,一個糟糕的決定代價是手寫一段長度有限的錯誤代碼,其爆炸半徑受限且進展緩慢,足以被中途截獲。在新世界中,一個糟糕的決定會被一部不會停下來詢問對錯的機器,忠實且成批地執行上百次。迴圈移除了過去用以解救工程師的「慢速檔」。你不能再指望進程足夠緩慢、好讓你在中途注意到錯誤,因為這個進程已經沒有慢速檔了。這推高了迴圈無法完成的那一件事之賭注,也是「保持工程師身分」的紀律並非選擇性的多情、而是運作上的必需之原因。

XI. 運作紀律(Operational Discipline)

如果判斷力是稀缺資源,那麼實務上的問題就是如何將其花在刀口上。從上述案例與代價中總結出的三項紀律,值得作為常設實務。

A. 務必抽樣閱讀(Read a Sample, Always)

對抗理解退化的防線,並非去閱讀迴圈產出的每一行代碼——這會失去使用迴圈的初衷——而是每天閱讀具有代表性的抽樣,並強迫自己解釋每一項抽樣變更:它做了什麼,以及為什麼要這樣做。一旦無法解釋某項變更,就是一個精確的訊號,表明你腦中的地圖已落後於代碼庫。在寧靜的清晨從抽樣的 PR 中發現這一點,遠比在糟糕的夜裡從線上故障中發現要便宜得多。抽樣不需要很大,但需要保持規律且被真正審視。

B. 在上線前設定上限(Cap Before You Ship)

對抗 Token 暴增的防線,是在迴圈第一次無人看管運行之前設定硬性天花板,而非在收到第一筆令人吃驚的帳單之後。單次運行預算、每日預算和最大重試次數共同確保了通宵空轉的單一 Bug 無法燒光整個額度。這些數字主要目的不是為了省錢,而是作為斷路器(Circuit breaker),將無上限的風險轉化為有上限的風險。一個沒有上限的迴圈,等同於將其消費權限外包給了自己的 Bug。

C. 留一扇敞開的門(Keep One Door Open)

對抗認知棄守的防線是結構性的,而非僅僅是態度上的。在迴圈中建構至少一個需要人類介入停下的檢查點——不是因為人類每次都會干預,而是因為這個暫停的存在讓人類保持在能夠干預的位置。將每一扇門都焊死、指望永遠不需要進去的工程師,在必須進去的那一天,會發現自己不再持有鑰匙。而留下一扇敞開大門的工程師,則可以隨時走進去查看迴圈在做什麼。這兩個迴圈在代碼上僅相差一個檢查點;但在六個月後由誰掌控大局上,卻有天痕之別。

XII. 今天就建構你的第一個迴圈(Build Your First Loop Today)

Stripe 的流水線是終點,而非起點。你的第一個迴圈應該小到幾乎不像一個系統——一個在定時器上檢查某事的小工具。

步驟一:運行 /loop 在 Claude Code v2.1.72 之後可用,它能在特定間隔重複運行相同的任務。它是會話(Session)作用域的,循環任務將在七天後過期,且運行在本地機器上;關閉電腦,它就會停止。

/loop 5m check the deploy
# 固定:每 5 分鐘運行一次

/loop check the deploy
# 代理人自行調配速度

/loop
# 運行 .claude/loop.md

步驟二:讀取 CI 與議題;先做分類。 重複運行一行指令稱不上是迴圈。給予它一個提示詞,使其在每天早晨審視三件事,並列出哪些值得處理。排程加上自動探索是進入迴圈的入門級別。探索邏輯應當活在技能中,而非排程中。

# .claude/skills/morning-triage/SKILL.md
NAME: morning-triage
WHEN: invoked each morning by automation.
READ:
- CI runs that failed since yesterday
- issues opened in the last 24h
- commits merged since the last run
JUDGE: for each item, is it worth acting on?
Skip noise. Keep only actionable findings.
OUTPUT: write findings + status to
./state/triage.md (one row per finding).

步驟三:加入狀態檔案。 不要把結果留在聊天視窗中。將每一個發現以及處理進度寫入一個 Markdown 檔案(或 Linear 任務看板)。代理人會遺忘,但倉庫不會。

# ./state/triage.md
(迴圈的記憶)
| finding
| source
| status
|
|----------------|----------|----------|
| auth test flaky| CI #4821 | fixing
|
| null deref
| issue 92 | PR open
|
| stale dep
| commit a3| inbox
|

步驟四:加入評估者。 這是最關鍵卻也最容易被忽略的步驟。Claude Code 的 /goal(v2.1.139 之後)會一直運行直到條件滿足,並由另一個獨立的模型來判斷條件是否成立。

/goal all tests in test/auth pass and the lint
step is clean

步驟五:使用工作區實現平行化。 使用 --worktree(或 -w)為每個背景運行的代理人開啟一個獨立的工作區,這樣它們就不會互相干擾。

# 為每個發現開啟一個隔離的工作區
claude --worktree fix/auth-test "draft the fix"
claude --worktree fix/null-deref "draft the fix"

在表 VI 的六個要素中,前兩個決定了迴圈能否運行;後四個則決定了它運行後是否會惹上麻煩。初學者在部署時往往只建構了前兩個,結果得到了一個無人看管、無法停止、對自己盲目點點頭的迴圈。結尾的建議很簡單:第一個迴圈最好小一點,但必須完整安裝說「不」的檢查機制以及人類審查點。


表 VI

首個迴圈檢查清單(First-Loop Checklist)

要素(Element) 自問(Ask yourself)
探索來源(Discovery source) 它在定時器上讀取什麼?(CI / 議題 / 提交 / 收件匣)
狀態檔案(State file) 哪一個磁碟檔案保存了跨輪次的記憶?
評估者(Evaluator) 是否存在一個可以說「不」的獨立檢查機制?
隔離環境(Isolation) 每個平行的代理人是否都獲得了專屬的工作區?
Token 上限(Token cap) 你是否設置了消費天花板?如果失控了,誰來阻止它?
人類審查(Human review) 哪一個步驟會暫停等待你查看,而非一路自動到底?

A. 完整且附帶註解的第一個迴圈(A Complete First Loop, Annotated)

為了讓檢查清單更加具體,以下是一個極簡但完整的迴圈,它安裝了所有六個要素。它小到可以在一次閱讀中看完,並且包含了真實迴圈所需的所有器官,只是按比例縮小。

# 1. SCHEDULING -- a real trigger
#    (.github/workflows/triage.yml)
on:
  schedule:
    - cron: '0 6 * * *'    # 06:00 daily, cloud

# 2. DISCOVERY -- a skill, not a wall of text
#    invoked by the workflow:
run: claude --skill morning-triage

# 3. PERSISTENCE -- state on disk
#    the skill writes ./state/triage.md
#    and commits it back to the repo

# 4. HANDOFF -- one worktree per finding
for finding in $(parse ./state/triage.md); do
  claude --worktree "fix/$finding" \
    --goal "tests pass and lint is clean" \
    "draft a fix for $finding"
done

# 5. VERIFICATION -- a fresh model judges
#    /goal's stop check runs after each turn;
#    a second reviewer agent picks holes

# 6. HUMAN REVIEW -- the open door
#    PRs are opened, never auto-merged;
#    anything uncertain lands in ./inbox/

從上到下閱讀,這六段帶有編號的註解正是檢查清單的六個要素,每個要素都由兩三行代碼實現。Cron 行是排程;技能調用是探索;提交的狀態檔案是持久化;每個發現的獨立工作區是交付/goal 停止檢查搭配審查者是驗證;而絕不自動合併且配備收件匣的規則,則是人類審查點。一個具備這六要素的迴圈,即便再微小,也是一個真正的迴圈。缺少其中任何一個,都是第六節中那五種失敗之一在裝模作樣。

B. 安全地擴展迴圈(Growing the Loop Safely)

一旦極簡迴圈運作起來,人們便會按捺不住想要擴展它——更多的發現、更多的平行代理人、更短的執行間隔。安全的擴展順序是:在檢查機制被證實有效之後,再將平行化放在最後一步加入。 在增加平行執行的任務量之前,先增加迴圈探索的範圍,並在信任評估者去把關多個平行代理人之前,先證實它能捕捉到真實的錯誤。Stripe 的案例是這條道路的終點,而非起點:其可靠性來自於數年來對確定性閘門的磨礪,而非一上來就做大規模。迴圈是透過先證明自己能攔下一段糟糕的代碼,來贏得運行更多代理人的權利的。

其餘的秘密不在這份筆記中,而在終端機裡。

XIII. 附錄 A:附註解的分類技能(Appendix A: An Annotated Triage Skill)

探索動作依賴於技能(Skill),而非一大堆指令,因為技能可以被重複使用和維護,而粘貼的提示詞則會在無人更新的排程中腐爛。以下是貫穿全文提及的 morning-triage 技能的更完整版本,並附有註解以展示各個部分如何服務於各個動作。

# .claude/skills/morning-triage/SKILL.md
---
name: morning-triage
trigger: invoked by daily automation
---
## Read (the DISCOVERY inputs)
- CI runs failed since the last run
- issues opened in the last 24 hours
- commits merged since yesterday
- the previous ./state/triage.md

## Judge (the part that sets the ceiling)
For each candidate, decide:
- is it actionable now, or noise?
- does it block a release? → priority
- is it already tracked? → skip
Keep only what is worth a worktree today.

## Write (the PERSISTENCE output)
Append to ./state/triage.md:
| finding | source | priority | status |
Commit the file so tomorrow can read it.

## Hand off (prepare the HANDOFF)
For each kept finding, emit a task line:
worktree=fix/<slug>
goal=<stop-condition>

## Stop (the boundary you keep for yourself)
Never merge. Never delete. Anything you are
less than confident about goes to ./inbox/
for a human, not into a PR.

該技能的六個標題中有五個對應著五個動作;第六個標題「Stop(停止)」則是建造者親自寫下的、迴圈無法自主推導的邊界。迴圈會忠實地執行技能中所寫的一切,並忽略所有未寫的內容,因此「Stop」部分並非樣板文字——它是工程師將其保持控制權之意圖永久化沉澱的唯一地方。省略它,迴圈將會帶著它未曾贏得的自信進行合併。

XIV. 附錄 B:術語表(Appendix B: Glossary)

表 VII

本筆記中所使用的術語釋義

術語(Term) 釋義(Meaning)
迴圈(Loop) 在內部循環中無需人類參與,即可自主探索、執行、驗證、持久化並重新排程工作的系統。
安全裝置(Harness) 武裝單次代理人運行的套件:工具、允許的動作、錯誤恢復與「完成」判定。
動作(Move) 迴圈單次執行中的五個步驟之一(探索、交付、驗證、持久化、排程)。
元件(Part) 實現上述動作的六個組成部分(自動化、工作區、技能、連接器、子代理人、記憶)。
生成者(Generator) 負責編寫代碼或內容的代理人。
評估者(Evaluator) 負責評判的獨立代理人,預設抱持懷疑態度,並透過實際行動進行驗證。
工作區(Worktree) Git 的一項機制,賦予每個平行運行的代理人自己獨立的工作目錄。
技能(Skill) 永久保留在 SKILL.md 檔案中的專案知識。
連接器(Connector) 將迴圈連結至外部系統的 MCP 介面。
記憶(Memory) 磁碟上的持久化狀態,能跨越任何單次對話存活下來。
意圖負債(Intent debt) 反覆向代理人重新解釋專案的經常性成本,可透過建構技能來清償。
驗證債(Verification debt) 累積於「能運行」與「正確」之間的未經驗證產出。

XV. 綜合論述:指南的精髓所在(Synthesis: What the Playbook Comes Down To)

跨越九個章節,本筆記的論證有著清晰的脊梁。迴圈工程是繼提示詞、上下文和安全裝置之後,堆疊中的第四層架構,而它與其下三層的本質區別在於:它將人類從具體工作的執行位置上徹底抽離。迴圈的單次執行由五個動作組成——探索、交付、驗證、持久化、排程——並由六大元件實現,而迴圈的失敗僅僅是這些動作被略過。

在這些動作中,最難的一環是驗證,因為代理人改自己的試卷總是會給予讚美,而可靠的解決方案是結構性的:引入獨立的評估者,預設抱持懷疑,透過實際行動而非僅僅閱讀來進行檢驗,並由一個全新的輕量模型依據明確的停止條件進行評判。

迴圈已經在實務中運行,從單個工程師的早晨分類到每週合併上千個機器撰寫 PR 的企業級流水線,使其可靠的關鍵在於約束條件的品質,而非模型的大小。

它們會暗中累積四種相互強化的代價——驗證債、理解退化、認知棄守和 Token 暴增——並在某一天集中爆發。由於迴圈是建造者自身特質的放大器,兩個人建構同一個迴圈會產生截然相反的結果,其間的差距僅在於一兩個檢查點,而這決定了日後究竟是誰掌控大局。

值得銘記的一句話,也是整個領域在同一週內達成共識的核心思想:停止向代理人發出提示,轉而設計那套去提示它的系統——但設計它時,要像一個意圖保持工程師身分的人,而非僅僅是那個按下啟動鍵的人。本筆記中所有技術細節皆為此一姿態服務。評估者、狀態檔案、預算上限、敞開的門:每一種都是保持人類有能力對一部旨在快速說「是」的機器說「不」的方法。在這一代軟體實務中,迴圈是最強大的工具,恰恰因為它是其建造者最忠實的放大器,而一個忠實的放大器,其價值或危險程度,與輸入其中的判斷力完全等同。

A. 第一個月的實地筆記(Field Notes for the First Month)

對於採用迴圈的團隊,有一些實務觀察頻繁出現,值得在此予以說明。

  1. 能存活下來的迴圈,往往是那些從小處著手並贏得信任的迴圈,而非一上來就寄予厚望的宏大計劃;從單一發現的端到端處理開始,並在檢查機制切實捕捉到真實錯誤後,再逐步拓寬範圍。
  2. 工程投入的重心應在於評估者——強大的生成者配上虛弱的評估者,只會生產出充滿自信的垃圾;而平庸的生成者配上敏銳的評估者,則能帶來緩慢但可靠的進展,而後者才是能夠產生複利效應的。
  3. 人類審查點並非在建立信任後就可以拆除的臨時腳手架;它是保持迴圈值得信任的永久特徵,拆除人類審查點之日,即是理解退化真正開始之時。
  4. 預算上限的設定應基於「某些東西必定會在夜間空轉」的假設,因為最終它一定會發生,而上限決定了這個事件最終只是一個日誌中的趣聞,還是發票上的巨大支出項目。

單獨來看,這些都不是什麼驚人的發現。真正讓團隊感到意外的是,一個「運作良好」的迴圈所帶來的愉悅體驗,會以多快的速度侵蝕那些使其運作良好的紀律,而這種侵蝕在問題爆發前是完全無形的。這份攻略到頭來與其說是關乎建構迴圈——這部分在如今確實非常簡單——不如說是關乎在每個給定的早晨,你是否依然能保持作為一個工程師的姿態,去回答迴圈剛剛所做的事情,到底是不是實際正確的

參考文獻(References)

[1] A. Osmani, “Loop Engineering,” 個人部落格與 Substack, 2026 年 6 月. [2] P. Steinberger, 關於設計提示編碼代理人之迴圈的社交媒體貼文, 2026 年 6 月. [3] B. Cherny, 關於撰寫提示 Claude 迴圈的公開演說, Anthropic, 2026 年 6 月. [4] P. Rajasekaran, “Building long-running agentic applications: the generator/evaluator pattern,” Anthropic 工程部落格, 2026. [5] S. Kaliski, “Stripe’s Minions: 1,300 PRs a week,” How I AI 播客, 2026. [6] “Model Context Protocol (MCP) specification,” 開放標準, 2025–2026. [7] “Goose: an open-source agent framework,” 專案文件, 2025–2026. [8] “Claude Code documentation: /loop, /goal, worktrees, skills, automations,” Anthropic, 2026. [9] HuaShu, Loop Engineering: Stop Asking Me What It Is, 橘皮書(Orange Books), v260615, 2026 年 6 月.


致謝(Acknowledgment)

本研究是一份獨立的會議風格綜合論述,建構於華書(HuaShu)的開放指南《Loop Engineering: Stop Asking Me What It Is》(橘皮書,v260615,2026 年 6 月)框架之上。該框架與文中所引述的公式化表述皆歸功於 Addy Osmani;生成者/評估者研究成果歸功於 Prithvi Rajasekaran(Anthropic);企業級案例歸功於 Steve Kaliski(Stripe)。所有產品細節可能有所變更;請參閱各工具之官方文件。