大師篇 · 第 17 章
Dynamic Workflows:script 編排前沿
這一章帶你看 2026 年隨 Opus 4.8 一起來的新玩法:Dynamic Workflows(動態工作流)。它的概念聽起來有點科幻——你不再一個一個叫分身做事,而是請 Claude 當場寫一支小程式,由那支程式去指揮幾十、甚至上百個分身,而且那支「指揮程式」本身幾乎不花 token。這是前一章「逐回合多代理」的下一層。內容偏前沿、部分還會變,所以我們會逐處用徽章標清楚哪些是官方說法、哪些是達人個人實踐、哪些還在實驗階段。你不一定現在就用得上,但讀完你會知道:當任務大到「同一件事要重複跑幾百遍」時,有這條路、它長什麼樣、怎麼安全地試。
先看懂本章的四種來源徽章
這一章把不同可信度的料混在一起講,所以每個關鍵說法旁邊都會掛一個徽章,讓你一眼分辨:官方 是 Anthropic 官方文件或工程部落格;達人個人 是具名高手的個人實踐(非官方規範);社群 是社群整理的做法;實驗性 是前沿、還會變、斟酌採用。看到實驗性徽章,就把它當「目前長這樣,之後可能改」來讀。
17.1 Claude 寫程式來指揮上百個分身
前一章你學的多代理,是「逐回合」的:主 Claude 想一下、派一個分身、等它回、再想下一步。這在分身只有兩三個時很好用,可是當你的任務是「同一件事要在五百個檔案上各跑一遍」,逐回合就會卡——主 Claude 的對話視窗(context)會被幾百段回報塞爆,而且它得一輪一輪盯著,慢又貴。
Dynamic Workflows(動態工作流)換了個思路 官方:與其讓 Claude「逐回合用嘴巴」指揮,不如讓它當場寫一支 JavaScript 小程式,由這支程式去 spawn(生出)並協調一大批分身。關鍵在於——這支「指揮程式」是純程式碼,它在跑的時候幾乎不花模型 token;每個分身回傳的中間結果,是存進程式的裡,不會塞回主 Claude 的對話,最後只把整理好的答案交給你。
打個比方:逐回合多代理像「你一通一通打電話交辦,每個人講完你都得聽完」;動態工作流像「你寫一張 SOP 流程單交給一個排程系統,它自動把活分下去、收回來、彙整好,只把結論拿給你看」。前者你的腦袋(context)會被每一通電話佔住,後者你只看最後那張彙整表。
這不是哪個付費方案獨享的功能:Pro、Max、Team、Enterprise 都用得到,透過 Anthropic API、Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 接進來也一樣支援 官方。要留意的是 Pro 方案預設沒開,得自己進 /config 找到「Dynamic workflows」那一列手動打開;其他方案通常預設就能用。
三個你該記住的數字與門檻
動態工作流不是無限放大:官方目前的規格是最多 16 個分身同時併行、單次最多 1,000 個分身,而且需要 Claude Code CLI v2.1.154 以上 官方。所以它適合「量大、規則清楚、可重複」的活,例如全庫掃 bug、五百個檔案的框架遷移、多個來源的研究交叉查核。版本不到就用不了,先 claude --version 確認一下。
那要怎麼觸發?你不用自己寫那支 JS,有三種方式可以叫 Claude 去寫 官方。最穩的是自然語言:直接跟它說「use a workflow」或「run a workflow」,它就會判斷這個任務該不該改用動態工作流、當場把指揮程式寫出來。第二種是在 prompt 裡直接埋觸發關鍵字,只影響「這一個任務」,不會改變整個對話 session 原本的運作方式。第三種是下 /effort ultracode(或啟動時帶 claude --effort ultracode,需 v2.1.203 以上),這是整個 session 等級的開關:往後這個 session 裡,只要交辦的任務有點份量,Claude 都會自動先規劃成工作流再動手,不用你每次特別講。想退回原本逐回合的模式,下 /effort high 就好。
想知道細節:ultracode 關鍵字怎麼來的、什麼機器用不了
那個「埋進 prompt 裡的關鍵字」本身就是版本敏感的活教材:v2.1.160 之前,字面關鍵字寫的是 workflow;v2.1.160 之後才換成現在講的 ultracode。自然語言的「use a workflow」倒是新舊版本都吃得下。ultracode 這東西本質上是 Claude Code 的一個設定,不是模型本身的 effort 等級——它固定送 xhigh 推理,再疊加「自動規劃成工作流」這個行為。注意:xhigh 不是 max;後者才是可用時最高的 effort 等級。若 /effort 選單裡根本沒看到 ultracode,先檢查目前模型是否支援 xhigh、Dynamic Workflows 是否被關閉,以及 Claude Code 版本是否足夠,別以為自己裝壞了。另外,ultracode 只在當前 session生效,開新 session 會被重置,得重新下一次;第 15 章有它與 max 的完整對照。
還有個好用的小動作:打字打到一半,看見關鍵字被自動反白高亮、但你根本不是要觸發工作流,Mac 按 Option+W、Windows/Linux 按 Alt+W 可以取消這次的觸發;或者游標剛好停在反白詞後面,直接按 Backspace 效果一樣。這些細節都還在調整,真要照抄操作前,養成看一眼當下版本文件的習慣比較保險。
/deep-research:現在是官方內建的研究工作流
這裡要更正一個容易踩的認知落差:早期版本的文件確實沒有這個內建指令,那段時間如果你查到「/deep-research 不存在、要自己組」的說法,在當時是對的;但現在的官方文件已經把它收進內建(bundled)工作流清單裡了 官方——一鍵對多個來源做研究:扇出成好幾個角度分頭搜尋、抓取來源全文、對每一條主張做交叉查核,查不過的主張會被濾掉,最後回傳一份附引用來源、且已經濾過不可靠主張的報告。用起來就是一句 /deep-research 你的研究問題,前提是你的環境要有 WebSearch 工具可用。
還有一個修正細節值得記住:v2.1.196 之前,如果負責查核的 verifier 分身因為 rate limit(速率限制)或 API 錯誤而「查不到」某條主張,系統會把它誤標成「已被推翻」(refuted);v2.1.196 之後修正成標「未驗證」(unverified)——「查不到證據」跟「查到了、證明是假的」是兩件不同的事,後者才該叫推翻。用比較舊的版本讀報告時,多留意這個標籤的語意差異。
17.2 六種有名字的組合模式
動態工作流最實用的地方,是它把「該怎麼編排」從臨場發揮變成一套有名字的菜單——你想做哪一種,就點哪一種,Claude 知道你在講什麼 官方。官方整理出六種常見組合,先用一張表認識它們,下面再各講一句白話。
| 模式 | 一句話說它在幹嘛 | 什麼時候用 |
|---|---|---|
| classify-and-act (分類再行動) |
先把一堆東西分門別類,再針對每一類做對應處理 | 一批雜亂的 issue / 檔案,要先歸類再分頭處理 |
| fan-out-and-synthesize (扇出再彙整) |
同一件事撒給很多分身平行做,再把結果收回來彙整成一份 | 多來源研究、大量檔案各看一段後出總結 |
| adversarial verification (對抗式查驗) |
一個分身做、另一個分身專門挑毛病,互相對著幹 | 不放心單次結果,要有人專職找漏洞 |
| generate-and-filter (先生成再篩選) |
先大量產出候選,再用條件把不合格的刷掉 | 產很多版本草稿,只留通過門檻的 |
| tournament (淘汰賽) |
讓多個候選兩兩比、一輪輪淘汰,選出最好的 | 多個方案要比出唯一最佳解 |
| loop-until-done (迴圈到達標) |
反覆做同一件事,直到符合條件才停 | 改到測試全綠、修到符合規格為止 |
你不需要背這六個英文。重點是體會一件事:以前你得在 prompt 裡用一大段話描述「先這樣、再那樣、然後比一比」,現在你可以直接講「用扇出再彙整的方式處理這五百個檔案」,Claude 就知道要寫成哪一種編排骨架。等於你跟它之間多了一套共同詞彙,溝通成本大幅下降。
光看模式名字有點抽象,直接看幾句官方給的例句最快建立手感。下面這些都是你可以整句貼給 Claude 的自然語言請求 官方,每句對應一種模式——注意它們都是「請 Claude 規劃並寫出工作流」的口氣,不是要你自己動手寫 script:
— fan-out-and-synthesize:逐一審查 PR 裡每個改動的檔案,再彙整成一份排序過的總結
use a workflow to review every file changed in this PR for
correctness issues, then merge the per-file findings into
one ranked summary
— loop-until-done:改到型別檢查通過、或連續兩輪沒進展才停
use a workflow to run npx tsc --noEmit and keep fixing the
reported errors until the type check passes or two rounds
in a row make no progress
— 大規模遷移:每個檔案各自用獨立副本改,避免互相衝突
use a workflow to migrate every component under
src/components/ from styled-components to Tailwind, working
on each file in its own isolated copy
— 窄範圍研究:多來源平行查、再比較
use a workflow to research how our three competitors handle
rate limiting: read their public docs and recent changelog
entries in parallel, then compare the approaches
— loop-until-dry:連續兩輪都沒有新發現才停,避免開放式任務漫無止盡
use a workflow to find flaky tests in this repo: run the
suite repeatedly, record which tests fail intermittently,
and stop once two rounds in a row find nothing new
這些句子有共同的形狀:目標講清楚(要對什麼範圍做什麼事)、停止條件講清楚(做到什麼程度算完成),中間怎麼拆成子任務、怎麼平行、怎麼收斂,交給 Claude 去規劃就好。這也是為什麼熟悉六種模式的名字有用——你不用發明新的表達方式,套用其中一種的「形狀」去描述任務,Claude 接收到的訊號會更精準。
這幾種模式可以疊在一起
它們不是互斥的單選題。實務上常常是組合技——例如「扇出再彙整」收集完,再接一段「對抗式查驗」讓另一批分身挑彙整結果的毛病,最後用「迴圈到達標」修到通過。你只要把流程講清楚,Claude 會把這幾段串成同一支指揮程式。
17.3 那個指揮者,其實是程式碼不是 Claude
上一節的例句裡,「先審查每個檔案、再彙整」「改到型別檢查過為止」這種任務,背後都有東西在幫你規劃子任務、追蹤進度、決定下一步該做什麼。這裡把話說清楚:那個指揮者(英文文件常寫 ),就是 17.1 講的那支指揮程式本身,不是 Claude 在背後一輪一輪盯場 官方。程式規劃好要 spawn 哪些分身、以什麼順序、平行還是串接,分身各自把活做完、回傳結果,程式再依邏輯決定下一步——這整套「規劃、分派、收斂」的迴路,跑在幾乎不花 token 的程式碼裡,不是靠 Claude 的推理一步步現場想出來的。
這點值得說清楚,因為坊間流傳過一種講法,把這個角色叫作「Operator 模式」,講得像官方替它取的正式名字。查遍官方文件跟兩篇官方部落格,並沒有這個名詞——如果你看過這個說法,這裡先更正:它不是官方命名,別再這樣稱呼。
容易搞混的鄰居:這不是第 16 章的 Agent Teams
「一個指揮、一群執行、指揮者能中途調整計畫」這個敘述,很容易讓人聯想到上一章講的 Agent Teams(16.6)——但兩者是完全不同的兩個功能,別混為一談。動態工作流的指揮者是程式碼,預設可用(不需要實驗性旗標)、規模可以到上百個分身;Agent Teams 的指揮者是Claude 本身,逐回合規劃,需要手動設環境變數 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 才能開,屬於研究預覽、規模通常是幾個長跑的同儕 session。動態工作流的分身彼此不通話、只回報給程式;Agent Teams 的成員能互相直接傳訊息。分不清這兩個的差別,是這個主題最容易搞錯的地方,記一句話就好:程式指揮用工作流,Claude 指揮用 Agent Teams。
這也是動態工作流能撐到上百個分身還不會拖垮成本的原因:「規劃」這個最花腦力的部分被固化成程式邏輯、只需要寫一次,「執行」則交給一群可平行、可丟掉中間結果的分身。分身越多,這個結構省下的整體時間與 context 佔用就越明顯——這也是動態工作流比逐回合多代理更適合大批量任務的原因。
17.4 三個原語:agent()、parallel()、pipeline()
再往裡看一層:那支由 Claude 寫出來的指揮程式,是用三個(最基本的積木)拼出來的 官方。你不用自己寫這些——這段是讓你看懂「指揮程式長什麼樣」,之後看到 Claude 產出的編排碼才不會陌生。
agent()
派一個分身去做一件事。最小的積木,丟一個任務、拿一個結果。
parallel()
同步柵欄:把好幾個分身一起放出去平行跑,等它們全部回來才往下走。
pipeline()
串流階段:把工作排成一條輸送帶,前一段的產出直接餵給下一段,一棒接一棒。
用一段示意的骨架,把這三塊放在一起感受一下。下面不是要你背語法,是讓你看出「平行收一批、再串成一條線彙整」這個形狀——讀過就好。
// 這支「指揮程式」由 Claude 自動寫出來,本身幾乎不花 token
// 1) 平行派一批分身去各看一個檔案,等全部回來(parallel = 同步柵欄)
const findings = await parallel(
files.map(f => agent(`掃描 ${f},回報可疑寫法`))
);
// 2) 把收回來的一堆結果,串成一條輸送帶逐段彙整(pipeline = 串流階段)
const report = await pipeline(
findings,
group => agent(`把這些發現分類`),
sorted => agent(`寫成一份總結報告`)
);
// findings、report 都只存在 JS 變數裡,不會塞回你的對話視窗
注意中間那些 findings、report 變數——它們是程式的記憶,不是 Claude 的對話記憶。幾百個分身的囉嗦回報全留在這些變數裡,最後只有 report 被交出來。這就是「零 token routing(零 token 路由)」省的地方:路由與中間結果都在程式裡,不佔模型的 context。這套也能搭配無人值守的批次模式(claude -p)一起跑,後面第 20 章會專門講。
agent() 還有一個很好用的進階寫法:第二個參數可以傳一個 JSON Schema,逼分身把答案填進一個固定格式,而不是自由發揮寫一段文字 官方。像 agent(prompt, { schema }) 這樣呼叫,執行期會要求分身用「結構化輸出」的方式回答;格式沒對上,執行期會自動重試,直到符合 schema 為止。要把幾十、幾百個分身的答案彙整、排序、去重時,這比讓每個分身自由發揮、再自己手動解析文字可靠得多——上面骨架裡第一段找檔案清單的 agent(),實務上通常就會帶 schema,要的是一份能直接餵給下一階段程式的檔案陣列,不是一段散文。
預設用 pipeline(),只有真的需要「大家到齊」才上 parallel()
實戰裡最常見的誤用,是不分青紅皂白把每個階段都包成 parallel()。pipeline() 讓每一項工作一進到下一階段就開始處理,不必等同一批的其他項目都做完同一階段,能省下不少「大家互相等」的閒置時間;parallel() 是同步柵欄,只有在下一步真的需要同時看到全部前置結果(例如要跨項目去重、要互相比較排序)時才該用。一個好用的檢查法:如果你發現自己寫成「parallel → 逐項轉換 → 又一個 parallel」,而中間那段轉換各項目彼此其實互不相干,那整段通常該改寫成單一 pipeline()——中間那個 parallel 只是誤用,不是真正需要的柵欄。
script 裡不能用 Date.now()、Math.random():這是故意設計成這樣
如果你把 Claude 產出的原始 script 開進編輯器自己動手改過(開啟方式見 17.5 的 Ctrl+G),可能會踩到一個乍看莫名其妙的錯誤:Date.now()、Math.random()、不帶參數的 new Date() 這些「非決定性」的呼叫,在 workflow script 裡會直接丟例外,不是得到一個你沒預期的值。原因跟「可恢復(resumable)」這個賣點綁在一起:執行期會把每一次 agent() 呼叫依一個(日誌)機制記下確定性的 key,暫停後恢復時才能準確比對「這一步之前跑過了沒有」。非決定性的值每次重跑 key 都不一樣,會讓這套比對整個失效,所以乾脆在源頭擋掉。真的需要「每次都不一樣」的效果,變通做法是把時間戳當成 args 參數在啟動時傳進去,或用迴圈的索引值(第幾輪、第幾個項目)讓每次的 prompt 有變化,不要仰賴隨機數。
想知道原理:原語的名字之後可能會變
這三個原語 agent() / parallel() / pipeline() 的名稱,是依官方工作流文件整理的 官方,但這類前沿 API 還在演進,函式名、參數寫法都可能隨版本調整。本節的目的是讓你建立「平行收、串流接、變數存中間結果」這個心智模型,那是不會變的核心;至於確切的函式簽名,真要寫的時候請以你當下版本的官方 API 文件為準,別把這裡的骨架當逐字規格抄。記住形狀,不必記死字面。
17.5 核准畫面,以及一個容易被忽略的自動核准陷阱
工作流開跑前,你會先看到一個核准畫面,列出 Claude 規劃好的幾個階段(phases),讓你在真的動手之前看一眼 官方。上面通常有四個選項:Yes, run it(照跑)、Yes, and don't ask again for「這個工作流」在「這個路徑」(以後同樣的組合不用再問)、View raw script(先讀過原始 script 再決定)、No(不跑)。想看得更仔細,按 Ctrl+G 能直接把整支 script 開進你慣用的編輯器逐行讀;核准前按 Tab 還能微調 Claude 準備送出的 prompt。工作流 script 是真的會產生副作用的程式碼——會改檔、會呼叫外部服務——花一分鐘看過一遍,跟看一份 PR diff 前先掃一眼是同一種謹慎。
這個核准畫面會不會每次跳出來,跟你目前的權限模式(permission mode)有關 官方:default 跟 accept-edits 模式下每次都會問(除非你選過「不要再問」);auto 模式只在第一次啟動時問一次,之後就記住不再問;bypass-permissions、claude -p(無人值守批次模式)、或透過 Agent SDK 呼叫,則完全不問、直接開跑。開了 ultracode 的 session 也會直接跳過這個提示——邏輯是你既然已經開了「自動規劃成工作流」的整體開關,等於預先同意了這個層級的自動化。
不管你的 session 設得多嚴謹,工作流底下的分身一律用「自動核准編輯」在跑
這是這一章最該記住的安全細節:不論你的 session 權限模式是什麼,動態工作流 spawn 出來的每一個分身,一律以 acceptEdits 模式執行——也就是檔案編輯全程自動核准,不會再跳出來問你,只是仍然繼承你設定的工具白名單(allowlist)官方。如果你以為自己還處在「每次改檔都要按同意」的謹慎模式,實際上工作流底下早就全自動改檔了——這對不熟悉的使用者是最容易忽略、也最容易在事後才發現「怎麼這麼多檔案被動過」的地方。跑破壞性、不可逆的大規模改動前,先確認自己真的要授權到這個等級的自動化。
唯一的例外是 shell 指令、web fetch、以及不在白名單裡的 MCP 工具——這些仍然可能在工作流跑到一半跳出互動式核准提示,把原本該「放著在背景跑」的體驗打斷。想避免這種卡住,最好在啟動長跑工作流之前,先把分身會用到的指令、服務都加進你的工具白名單。另外要記住一個更根本的限制:工作流執行中完全不能中途插入使用者輸入——只有權限提示能讓一個 run 暫停,如果你的任務需要「做到一半先給我看一眼再繼續」,得把它拆成好幾個各自獨立的工作流分開跑,而不是妄想在一次 run 中間插話。
17.6 /workflows 面板:看它在幹嘛、暫停、重跑、存成指令
工作流一旦開跑,你不是只能乾等。下 /workflows 能打開一個監控介面,列出正在執行與已完成的工作流,選一個能鑽進去看每個階段(phase)派了幾個分身、燒了多少 token、花了多久 官方。這不只是好奇心工具——手上有這面板,你才能在工作流跑歪、跑太久、或跑太貴的時候即時介入,而不是等它跑完才後悔。
| 按鍵 | 作用 |
|---|---|
↑ / ↓ | 在 phase/分身清單間移動選取 |
Enter / → | 鑽進選取的 phase,或再鑽進單一分身看它的 prompt、最近的工具呼叫、結果 |
Esc | 退回上一層 |
j / k | 在分身細節內容裡上下捲動 |
f | 依狀態篩選分身清單(需 v2.1.186 以上) |
p | 暫停或恢復整個 run |
x | 停掉選中的分身;聚焦在整個 run 時,停掉整個工作流 |
r | 重跑選中且仍在執行中的分身 |
s | 把這次 run 的 script 存成一個可重用指令 |
按 p 暫停之後重啟,已經完成的分身會直接回傳快取結果,不會重工,只有還沒做完的部分才會重新跑——這是 17.4 提過的 journal 機制在背後撐著。但這個「可恢復」只在同一個 Claude Code session 內有效:如果工作流還在跑的時候你整個關掉 Claude Code,下次開新 session 這個工作流會從頭重跑,不是接續進度。別誤以為關掉終端機、隔天回來能無痛續跑。
做得不錯、以後還會再用?按 s 存成 /你的指令
在 /workflows 選中一次 run 按 s,可以把它存成一個可重用的指令,存檔位置能用 Tab 切換:.claude/workflows/(專案內,clone 這個 repo 的人都會看到)或 ~/.claude/workflows/(你的個人家目錄,只有你看得到、跨專案通用)。存好之後直接下 /你取的名字 就能重跑;同名時專案版本優先於個人版本。搭配 args 參數還能在呼叫時餵資料進去,例如「Run /triage-issues on issues 1024, 1025, and 1030」,script 裡會讀成一個全域變數 args,Claude 直接幫你傳結構化資料,不用自己 parse 字串。把「每次 PR 都要跑的審查」「每週固定的安全掃描」存成一個指令,比每次重新臨場描述一遍 prompt 可靠,也好交接給別人接手。
如果你的專案是 monorepo,存檔位置的規則稍微複雜一點(v2.1.178 起):存檔時會從你目前的工作目錄往上找,找到離自己最近的既有 .claude/workflows/ 存進去,都沒有的話才落在 repo 根目錄;讀取時同理,會沿路徑往上找每一層的 .claude/workflows/,同名指令以離你工作目錄最近的那層優先。大型 monorepo 裡分子專案各自維護自己的一套常用工作流,不會互相打架。
17.7 規模與成本:別讓一次 run 燒光你的額度
先說一個要有心理準備的事實:同一件事,用工作流跑一次 run,花掉的 token 可能比你在對話裡一步一步做明顯更多,而且這些用量一樣算進你方案的額度與速率限制(rate limit)官方——工作流省的是你的時間跟盯場的心力,不是 token。真實世界的抱怨也印證了這件事:曾有使用者反映只是想對一個不算大的套件做 code review,工作流一次展開出 90 個分身,直接把 Max 方案的額度用光 社群。
出錯時的恢復也會加倍吃 token:工作流碰到錯誤,Claude 會嘗試換工具、推理哪裡出錯、重試,一次卡關的恢復流程可能比「一次做對」多花五倍 token 社群。意思是「反正讓它自己修到過」聽起來省事,但如果任務本身失敗率高,工作流可能比你在旁邊盯著逐步做還貴——這筆帳最好在按下「Yes, run it」之前先算過。
Large workflow 警告只是提醒,不會幫你踩煞車
當一個工作流規劃出超過 25 個分身、或預估總 token 量超過 150 萬,任務列的進度行會秀出「Large workflow」警告(需 v2.1.203 以上)官方。但這只是提醒,不會自動暫停或限制這次 run——真的要控制規模,還是得靠你自己在看到警告時決定要不要繼續,或直接按 p 先暫停看一下再說。開了 ultracode 的 session 完全不會顯示這個警告,因為開下去本身就代表你已經同意大規模 run。
比較主動的做法,是先在 /config 裡設 Dynamic workflow size 這個 guideline(需 v2.1.202 以上)官方:unrestricted(預設,無指引)、small(目標少於 5 個分身)、medium(少於 15 個)、large(少於 50 個)。這只是「送給 Claude 的建議」,如果你在 prompt 裡明講要更大或更小的規模,可以覆蓋它;但不論怎麼設,17.1 提過的硬上限(16 併行、單次 1,000 總量)永遠適用,不受這個設定影響。
真的想完全關掉這個功能,官方給了四種方式 官方,效果都是跨 session 持續生效:在 /config 裡切換「Dynamic workflows」開關;在 ~/.claude/settings.json 設 "disableWorkflows": true;設環境變數 CLAUDE_CODE_DISABLE_WORKFLOWS=1;如果是組織帳號,管理者可以在 managed settings 或後台的 admin 設定裡統一關掉。關掉之後,內建工作流指令會消失、ultracode 關鍵字不再觸發、/effort 選單也不會再列出 ultracode 這個選項。
實務上,比較安全的節奏是這樣:
-
動手做
先在小範圍試跑
挑一個資料夾而不是整個 repo、一個窄範圍的問題而不是廣泛提問,先跑一次看看它規劃出多少分身、大概花多少 token。
-
動手做
用 /workflows 盯著 token 用量
跑的過程中隨時打開 17.6 的監控面板,看目前燒了多少、還剩幾個 phase。覺得規模跑超出預期,隨時可以按
p暫停或x停掉。 -
動手做
放心停:已經做完的部分不會不見
停掉一個 run 不會讓你前功盡棄——已完成的分身結果還在,你可以先看那些部分夠不夠用,或調整 prompt 縮小範圍後在同一個 session 裡恢復執行。
預期會看到你會抓到一個對「這個任務值不值得開這麼大」的手感,而不是每次都被系統規劃的規模牽著走。
17.8 grader 迴圈:把品質閘門寫進編排
最後一個觀念,是把前一章「不信『看起來做完了』」的精神,直接寫進程式。做法是在工作流裡放一個專職的 grader(評分員)分身:每當其他分身交出產出,grader 就依一份(評分標準)打分,不達標就退回去重做,一輪一輪直到通過為止。等於把「對抗式審查」和「迭代到符合規格」這兩件事,codify(固化)成編排的一部分,而不是靠你每次手動盯。
這正好是 17.2 裡「迴圈到達標」加上「對抗式查驗」的組合實作:產出 → 評分 → 不過就回爐 → 再產出,迴圈跑到綠燈。它的價值在於——你不再相信「單次跑完就是好」,而是讓品質門檻自己把關,這跟整本書反覆強調的「拿證據說話、別空口宣稱成功」是同一條心法。
grader 迴圈是達人自建模式,官方只給了通用建議
這裡要先分清楚兩層:官方部落格確實建議「工作流適合拿來探索多個解法,尤其是設計或命名這種偏品味判斷的任務,這時候給一個 review 分身一份『什麼叫好』的 rubric 會很有幫助」 官方——但這只是一句通用建議,不是一個叫 grader 的內建功能或按鈕。真正把它跑成一整套「產出、評分、退回重做」迴圈的具體案例,來自具名實踐者 Jarred Sumner(JavaScript 執行環境 Bun 的作者):他用動態工作流加自建的 grader,把 Bun 的核心從一個語言移植到另一個語言 達人個人。這是單一次級來源,當「有人這樣成功過、值得借鏡的方向」來看,別當成保證照做就會成功的官方流程。
這個案例本身的規模值得細看,因為它幾乎是動態工作流目前公開紀錄裡規模最大的一次實戰——把 Bun 原本用 Zig 寫的核心,移植成 Rust。不同來源給出的數字略有出入,並排放在一起看比較不會誤解:
| 來源 | 說法 |
|---|---|
| Anthropic 官方部落格 官方 |
約 75 萬行 Rust、99.8% 既有測試套件通過、耗時 11 天——這是取整數的概略講法 |
| Bun 官方部落格 達人個人 |
2026-05-03 至 05-14 共 11 天、6,502 次 commit、diff 淨增 1,009,272 行;原始 Zig 版 535,496 行、橫跨 1,448 個檔案;尖峰時速 1,300 行/分鐘、單小時最多 695 次 commit;最多同時 64 個 Claude 平行跑、約 50 支不同工作流;最終 60,624 條以上測試在 6 個平台全綠、0 條被跳過或刪除 |
| Jarred Sumner 本人推文 達人個人 |
核心移植約 6 天完成——這通常指「第一次能編譯」到「所有平台 CI 全綠」這段區間,跟上面「11 天從第一個 commit 到合併」是不同的時間窗口,兩個數字別混著引用 |
把這些數字放回 17.7 的成本提醒來看更有感:Bun 官方部落格算過,這次移植總共餵進約 59 億 input token(未快取)加 6.9 億 output token,另外還有 720 億 token 是從快取讀取,估計花費大約 16.5 萬美元 達人個人。這不是一個「隨手跑跑」的規模,而是一間公司願意投入的一次性重大工程決策——回頭看 17.7 講的「工作流一次 run 可能比逐步做貴上不少」,這正是那句話的極限案例。值得一提,這次移植動用的模型是當時仍處於 pre-release 階段的 Claude Fable 5——某種程度上,這場 Bun 移植本身就是 Fable 5 正式上線前的一場大型實戰壓力測試。
比數字更值得學的是它的編排結構。每個檔案的移植流程固定四個角色 達人個人:1 個實作者負責把 Zig 邏輯改寫成 Rust、2 個對抗式 reviewer各自獨立審查——重點是這兩個 reviewer只看 diff、被明確要求預設它是壞的、也看不到實作者的推理過程,只看得到最終輸出,避免被實作者的說詞牽著走;最後一個修復者依 reviewer 的意見收尾。正式大規模開跑前,他們先挑 3 個檔案做小規模試跑,確認「實作者+兩個 reviewer+修復者」這套組合真的可行,才放大到全部 1,448 個檔案——這跟 17.7 建議的「先小範圍試跑」是同一個心法,只是換了個更大的舞台驗證。
前置作業也做得紮實:他們先寫了 PORTING.md,把「Zig 的某種寫法該對應 Rust 的哪種寫法」整理成一份映射規則;又寫了 LIFETIMES.tsv,把每個 struct 欄位該用哪一種 Rust 生命週期(lifetime)序列化分析成一張表。這兩份文件等於是餵給所有實作者分身的共同規格,減少「同一個模式在不同檔案被翻譯出不同寫法」的不一致。轉完之後,cargo check 一次跑出約 16,000 個編譯錯誤,改用 64 個平行 Claude 依 crate(Rust 的模組單位)分組去修,處理循環依賴跟型別不合的問題。
合併前抓到的幾個具體 bug,很適合當「代理人也會犯錯、但抓得出來」的例證:
use-after-free
Box<uv::Pipe> 被 drop(釋放)掉了,但底層的 libuv 仍握著指向它的指標。修法是改用 Box::leak() 刻意不釋放,把生命週期交給別的機制管。
負數 timespec 沒轉正
時間結構的奈秒欄位要求落在 [0, 1e9) 區間內,原本的寫法在數值為負時沒處理,改成加一個 floor rounding(向下取整)才讓它穩定落在合法區間。
unwrap_or() 誤觸 panic
unwrap_or() 的參數是立即求值的,即使前面已經是 Some 也照樣算一次、一算就 panic;改成傳一個閉包的 unwrap_or_else() 才是「真的需要才算」的惰性求值。
這三個 bug 有個共通點:都不是「代理人亂寫」,而是兩種語言底層語意的落差被翻譯過程放大——這正是對抗式 reviewer 該抓的那種問題,也說明了為什麼「只看 diff、預設它是壞的」這個角色設定重要:如果 reviewer 對實作者的推理有先入為主的信任,這種細節很容易被放過。
真要自己試這套模式,流程大致是這三步:先寫清楚 rubric(什麼叫「合格」),再讓工作流在每次產出後自動套用,最後設好「沒過就退回重做」的迴圈邊界。
-
動手做
先把 rubric(評分標準)寫成白紙黑字
用一句一句的條件描述「怎樣才算合格」,例如「所有測試通過、沒有新增 lint 錯誤、函式有對應測試」。標準越具體,grader 越判得準,少一點各說各話。
-
動手做
讓工作流在每次產出後自動套這份標準
在你的工作流描述裡,明講「每個分身交出結果後,派一個 grader 依上面的 rubric 打分」。這個 grader 就是專職挑毛病的那個角色,跟做事的分身分開。
-
動手做
設好「沒過就退回重做」的迴圈邊界
講清楚「不達標就退回該分身重做,直到通過」,同時給一個上限(例如最多重試幾輪),避免它在某個怎麼改都過不了的點上無止盡空轉。
預期會看到工作流會自己「產出 → 評分 → 不過退回 → 再產出」地跑,最後只把通過 rubric 的結果交給你,中間那些被打回票的版本不會來煩你。
17.9 小結
這一章你認識了 2026 年隨 Opus 4.8 來的新一層編排——Dynamic Workflows。把它收進腦袋的話,記這幾條就夠:
- 動態工作流=讓 Claude 當場寫一支 JS 指揮程式去協調大批分身;那個「指揮者」的角色是程式碼在跑,不是 Claude 逐回合現場想,別跟第 16 章的 Agent Teams(Claude 親自指揮、需開實驗性旗標)搞混 官方。
- 記住三個門檻:最多 16 併行、單次 1,000 上限、需 CLI v2.1.154+;Pro 方案要自己去
/config手動開。觸發方式有三種——自然語言「use a workflow」最穩、prompt 內埋關鍵字只影響單一任務、/effort ultracode則是整個 session 都自動規劃成工作流。 - 有六種有名字的組合模式(分類再行動、扇出再彙整、對抗式查驗、先生成再篩選、淘汰賽、迴圈到達標),它們是你跟 Claude 的共同詞彙,可以疊用。
- 底層用
agent()/parallel()/pipeline()三個原語拼成編排:預設用pipeline(),只有真的需要「大家到齊」才上parallel();script 裡不能用Date.now()/Math.random(),這是為了讓「暫停後恢復」可靠而故意設計的限制。 - 安全紅線:不論 session 權限模式為何,工作流底下的分身一律自動核准編輯;跑之前先把會用到的指令加進白名單,並確認自己真的要授權這個等級的自動化。
/workflows能看進度、暫停、重跑、存成可重用指令;規模與成本記得盯——一次 run 可能比逐步做貴上不少,善用/config的 size guideline 跟小範圍試跑控制風險。- grader 迴圈把品質閘門寫進程式:產出後自動評分、不過退回重做——這是達人自建模式(Bun 從 Zig 移植到 Rust 的實戰驗證過),不是內建按鈕 達人個人。
- 更新記錄:
/deep-research現在已經是官方內建的研究工作流,如果你看過「沒有這個指令」的舊說法,那是版本較舊時的正確資訊、現在已經更新了。
下一章我們從「一支程式指揮上百分身」回到「你同時開好幾個 Claude」——用 Git Worktrees 讓多個 session 各有獨立工作目錄、互不打架。
17.10 動手試試
這一章偏觀念,不急著大規模實作。下面四題由淺到深,挑你做得到的試,務必先在不重要的測試專案、用小範圍試,別一上來就對正式專案放幾百個分身。
- 先
claude --version確認你的版本有沒有到 v2.1.154 以上。沒到的話這章的功能就還用不了,先記著、升級後再回來。 - 找一個有十幾個檔案的小測試專案,跟 Claude 說:「use a workflow,幫我掃這個資料夾每個檔案有沒有明顯的 typo,最後彙整成一份清單。」觀察它是不是改用了平行扇出、最後只給你一份彙整,而不是逐檔囉嗦回報。
- 執行的時候另開一個念頭:跑到一半下
/workflows看看監控面板長什麼樣,試著按Enter鑽進某個分身看它的 prompt,再按Esc退出來。找一次機會按p暫停、再按一次恢復,感受一下已完成的部分是不是真的沒有重工。 - (進階)把第 2 題加一道品質關:請它在彙整之後,多派一個 grader 依「每筆都要標出檔名與行號」這條 rubric 檢查,不合格就退回補齊。體會一下「把驗證寫進編排」跟「自己事後手動檢查」的差別。
前沿功能,導入前以當下官方文件為最終真相
本章的觸發關鍵字(ultracode 等)、三個原語的函式名與參數、監控面板的按鍵、grader 迴圈的具體寫法,都是 2026 年這個時間點的整理,而這層東西更新很快。任何要實際寫進生產流程的,請以你當下安裝版本的官方 /workflows 文件與 API 為準,別照抄舊文。標 實驗性 與 達人個人 的部分,更要當「方向參考」而非「保證照做就成」。