循環工程(Loop Engineering)
建立一個循環:一個自主系統,會主動提示代理,讓你無需手動介入。你只需定義一次目標與停止條件;循環會自行尋找工作、執行、檢查、記錄結果,然後再次運行,直到目標達成為止。此技能會在你的現有專案中建立這個循環:它會讀取你已使用的測試、建置與工作追蹤方式,然後根據你的習慣來調整循環,而不是強加通用的規則。
循環由六個基本元件構成。僅設定目標所需的元件即可。
| 元件 | 在循環中的角色 | Claude Code 機制 |
|---|---|---|
| 觸發器(Trigger) | 按排程或事件啟動每個週期 | /goal(持續工作直到滿足條件)、/loop、排程任務、鉤子、GitHub Actions |
| 狀態(State) | 循環在週期之間的記憶,儲存在磁碟上 | 一個 Markdown 檔案(LOOP.md)或透過 MCP 連接的問題追蹤器 |
| 發現(Discovery) | 找出當前週期要處理的工作 | 一個分類步驟,會讀取 CI、問題、差異、佇列 |
| 製造者(Maker) | 執行一個單位的工作 | 一個位於 .claude/agents/ 的子代理 |
| 檢查者(Checker) | 獨立驗證製造者的產出 | 一個不同的位於 .claude/agents/ 的子代理 |
| 停止條件(Stop condition) | 結束循環的規則 | 一個由檢查者執行的可驗證檢查 |
對於任何無人看管的循環,請添加一個監控者(Monitor):一個監督代理,它會從整體觀察循環,並在發生偏移(偏離目標)、空轉(無淨進展)或越界(超過週期數、時間過長)時停止循環。製造者和檢查者確保每個項目的正確性;監控者則確保整個循環始終指向目標,這樣循環就不會悄悄偏離並運行數小時。
另外兩個可選附加元件:工作樹(Worktrees)(git worktree)可隔離並行的製造者,避免它們編輯相同檔案;**MCP 連接器(MCP connectors)**可讓循環連結真實工具(開啟 PR、更新工單、發布狀態)。當目標需要並行性或外部副作用時,即可添加上述元件。
設定步驟
此步驟在現有專案內部執行。被調用時請遵循以下步驟。在執行任何具有副作用(排程任務、推送、工單寫入、部署)的操作之前,務必先與使用者確認。
-
先讀取專案。 在建立任何架構之前,先了解儲存庫:如何執行測試、建置與 lint(檢查
package.json、Makefile、CI 設定、CLAUDE.md);已有哪些慣例、現有技能或.claude/agents/目錄;以及工作的來源(CI、問題追蹤器、待辦事項清單、佇列)。循環必須適應此專案。重複使用它真實的指令與慣例,不要發明新的。 -
明確釘選目標與停止條件。 詢問使用者循環的唯一目標以及一個可驗證的完成條件(測試 exit 0、佇列為空、零失敗檢查)。絕不能發布一個沒有停止條件的循環。如果使用者無法指定,則設定一個有界限的備用方案(在 N 個週期後停止),並明確告知。在 Claude Code 中,
/goal <condition>可使其可執行:Claude 會持續跨輪次工作,直到條件滿足,而/goal clear則可提前結束。 -
撰寫狀態檔案。 將
${CLAUDE_SKILL_DIR}/templates/LOOP.md複製到儲存庫根目錄,並填寫目標、停止條件、節奏以及人類閘門。它包含三個由循環維護的動態章節:## Open(已發現,尚未完成)、## Done(附帶驗證證據)、## Blocked(需要人類介入),以及一個## Rules章節,作為循環中所有代理遵循的常設指令集。循環每次週期會先讀取此檔案,最後再寫入它。 -
建立製造者子代理。 將
${CLAUDE_SKILL_DIR}/templates/loop-maker.md複製到.claude/agents/loop-maker.md,並將其指向你在步驟 1 中找到的慣例與測試指令。它只處理## Open中的一個項目,遵循專案現有的技能與慣例,並且絕不自行標記自己的工作已完成。如果該名稱的檔案已存在,則進行更新而非盲目覆寫。 -
建立檢查者子代理。 將
${CLAUDE_SKILL_DIR}/templates/loop-checker.md複製到.claude/agents/loop-checker.md。它是一個與製造者不同的代理,它會執行專案實際的驗證(來自步驟 1 的真實測試、建置或 lint 指令,而非其描述),並且是唯一允許將項目移至## Done的代理。 -
建立監控者子代理(建議用於任何無人看管的循環)。 將
${CLAUDE_SKILL_DIR}/templates/loop-monitor.md複製到.claude/agents/loop-monitor.md,並每隔數個週期或使用比循環更慢的定時器執行它。它從整體觀察循環,而非單一項目:它檢查循環是否仍在收斂到目標,並在偏移(不利於目標的工作)、空轉(無淨進展,項目在 Open 與 Blocked 之間來回跳動)或越界時停止循環並上報給人類。這就是防止循環悄悄偏離並運行數小時的機制。 -
設定程式碼審查與安全稽核的節奏(詢問使用者)。 詢問使用者循環應多久執行一次這兩項,並將結果記錄在
LOOP.md中。提供明確的選項,並務必包含永不:- 程式碼審查(
/code-review):每次變更、每次 PR 或合併前、每 N 個週期、每週或永不。 - 安全稽核(
/security-review):每次變更、每次 PR 或合併前、每週、每月或永不。
按照選定的節奏,循環會執行該內建檢查,並將發現的結果作為新的工作項目歸檔到
## Open中,以便製造者修復,檢查者驗證修復。如果使用者選擇永不,則完全跳過該檢查,並在LOOP.md中記錄never,這樣循環就不會重新引入它。 - 程式碼審查(
-
定義發現機制。 撰寫分類步驟,根據此專案實際工作所在的位置(CI 狀態、未結問題、最近的提交、工作佇列)來填充每個週期的
## Open,並說明如何將發現結果轉化為離散的、可獨立檢查的項目。盡可能使其具有確定性。 -
選擇隔離方式(可選)。 如果每個週期有超過一個製造者運行,請為每個製造者提供各自的
git worktree和分支,這樣它們絕不會寫入同一個檔案。每個項目一個工作樹。 -
連接外部工具(可選)。 如果循環必須開啟 PR、更新工單或發布狀態,請連線對應的 MCP 伺服器。否則,循環的輸出保留在本機,由人類負責轉發。
-
設定觸發器。 選擇最適合該節奏的輕量機制:
- 在此會話中一直運行直到目標達成 →
/goal <stop condition>(Claude 會跨輪次持續工作,直到條件為真;/goal clear可提前結束) - 按某個節奏重複執行、按需啟動 →
/loop - 定期且無人看管 → 排程任務(或用於 CI 端循環的 cron / GitHub Action)
- 回應事件(推送、PR、檔案變更) → 鉤子或 GitHub Action
在建立任何排程任務之前,務必與使用者確認。
- 在此會話中一直運行直到目標達成 →
-
進行乾執行、驗證,然後啟用。 手動執行一個週期。閱讀它產生的所有內容。確認檢查者確實會阻擋不良輸出,且狀態已被寫入。只有到那時才能開啟觸發器。
防護措施(不可協商)
- 檢查者絕不能是製造者。 撰寫程式碼的代理無權宣告其正確。
- 停止條件必須是可驗證的,而非憑感覺。「看起來完成了」不是停止條件。一個 exit 0 的指令才是。
- 每個週期都必須寫入狀態。 如果循環忘記了它嘗試過什麼,它就會重複自己。模型會忘記;但檔案不會。
- 任何不可逆的操作都必須有人類閘門。 發布、部署、刪除、花錢。循環負責草擬,由人來確認。無人看管的循環會犯下無人看管的錯誤。
- 寧可阻塞也不要猜測。 當循環無法驗證或無法繼續時,它會寫入
## Blocked並停止該項目。它不會發布一個猜測。 - 長時間運行的循環必須被監控且設定界限。 任何無人看管的循環都必須配備監控者與界限。如果它偏離目標或超出界限,監控者將停止它並上報。循環絕不能永遠朝錯誤的方向運行。
循環設定完成後的結構範例
your-project/
├── LOOP.md # 目標、停止條件、界限、規則、Open/Done/Blocked
├── .claude/
│ └── agents/
│ ├── loop-maker.md # 執行一個單位的工作
│ ├── loop-checker.md # 獨立驗證
│ └── loop-monitor.md # 監控整個循環的偏移與失控
└── (觸發器:/goal、/loop、排程任務或 GitHub Action)
反模式:請勿發布這些
- 一個沒有停止條件的循環(永遠運行,浪費權杖)。
- 一個代理同時負責撰寫與評分自己的工作。
- 一個沒有狀態檔案的循環(重新推導一切,重複工作,忘記什麼失敗了)。
- 一個沒有監控者或界限的無人看管循環(偏離目標,在任何人注意到之前已運行數小時)。
- 在不可逆操作上沒有設定人類閘門的無人發布。
- 一個循環承載許多不相關的工作。一個循環、一個目標、一個停止條件。其餘工作請拆分到各自的循環中。
此技能包含的檔案
templates/LOOP.md:要複製到目標儲存庫的狀態檔案。templates/loop-maker.md:製造者子代理定義。templates/loop-checker.md:檢查者子代理定義。templates/loop-monitor.md:監控者子代理定義(偏移與失控防護)。examples/keep-ci-green.md:一個完整的真實循環範例,從目標到觸發器。