子代理分配器
把一份 plan.md 變成一張可執行的分工表:誰做什麼、用哪個模型、開多大思考強度、失敗了怎麼升級。
省額度的原理很簡單:計劃裡大部分工作量其實是讀檔案、搜程式碼、跑測試、按規格改程式碼,這些不需要最貴的模型。貴模型只應該花在少數真正需要判斷力的地方。本技能的工作就是把這兩類分開。
輸入
- plan.md 的路徑。沒給就找目前目錄下的
plan.md/PLAN.md/PLANS.md,找不到再問。 - 目標平台:
claude(Claude Code)、codex(OpenAI Codex)或both。沒說明時按目前執行環境判斷;判斷不了就問一次。 - 取向(可選):
省、均衡(預設)、穩。只影響下面第 4 步裡拿不定主意時往哪邊靠。
確定平台後,讀對應的參考檔案,裡面有該平台的具體模型名、價格比例和 effort 檔位:
- Claude →
references/claude.md - Codex →
references/codex.md - both → 兩個都讀,輸出裡並排給兩套設定
模型名和價格會過時。參考檔案是唯一的事實來源,不要憑記憶填模型名。
流程
1. 讀計劃,拆成任務單元
沿用 plan.md 自己的步驟劃分,只在兩種情況下調整:
- 拆開:一個步驟裡同時有「大量讀取/搜尋」和「做判斷/改程式碼」。把讀取部分拆出去給便宜的子代理,它只回傳摘要。
- 合併:幾個連續的小步驟改的是同一批檔案、需要同一份上下文。合成一個任務,避免重複載入上下文。
不要過度拆分。每個子代理都有啟動開銷(重新讀上下文、寫交接說明),幾分鐘就能做完的小事讓主代理順手做掉,在文件裡標「主代理直接執行」。
2. 給每個任務打五個標記
| 標記 | 問的問題 | 取值 |
|---|---|---|
| 明確度 | 規格是否已經寫死,照做即可? | 明確 / 部分 / 開放 |
| 出錯代價 | 做錯了容易發現、容易回滾嗎? | 低 / 中 / 高 |
| 可驗證 | 有沒有測試、建構、lint、腳本能自動判對錯? | 有 / 可補 / 無 |
| 讀取量 | 需要讀多少材料才能動手? | 少 / 多 |
| 影響面 | 改動是區域性的,還是跨模組、影響架構? | 區域 / 跨模組 / 架構 |
plan.md 裡沒寫清楚的,按最可能的情況判斷,並在輸出的「假設」一欄寫出來,不要停下來逐條問。
3. 映射到四個檔位
各平台的具體模型見參考檔案,這裡只定檔位:
| 檔位 | 用於 | 典型任務 |
|---|---|---|
| T0 輕量 | 明確 + 低代價 + 結果一眼能驗 | 搜檔案、讀日誌、跑測試並回報、分類、抽取、摘要 |
| T1 標準 | 明確 + 區域 + 可驗證 | 按規格實作功能、修定位好的 bug、寫測試、寫文件、UI 還原 |
| T2 主力 | 部分明確,或跨模組,或需要除錯判斷 | 多檔案功能、排查原因不明的 bug、程式碼審查、整合子代理結果 |
| T3 旗艦 | 開放 + 架構級,或出錯代價高且無法自動驗證 | 架構決策、大型重構的方案、多約束衝突的取捨、指揮多個子代理 |
判斷順序:先假設是 T1,然後看有沒有理由往下或往上。
- 往下到 T0 的理由:任務本質是「找到並報告」,不產出要合併的程式碼。
- 往上到 T2 的理由:明確度不是「明確」,或影響面不是「區域」。
- 往上到 T3 的理由:必須同時滿足「開放或架構級」和「錯了代價高」。只滿足一個用 T2 加高 effort。
一份正常的計劃裡 T3 任務通常只有 0 到 2 個。如果分出來一半都是 T3,回去重新檢查拆分,多半是把「讀取」和「判斷」捆在一起了。
4. 定思考強度
effort 是比換模型更細的旋鈕,先調它。
- 起步一律用參考檔案裡該檔位的預設起步值。
- 可驗證 = 有:保持起步值,甚至降一檔。模型能跑測試自檢時,高 effort 的收益很小。
- 可驗證 = 無 且 出錯代價 ≥ 中:升一檔。
- 有人在即時等結果:降一檔,速度優先。
- 取向為
省時拿不定主意就取低的,穩時取高的。
超過 high 之後,再升 effort 的花費往往接近直接換上一檔模型的低 effort。所以升級階梯寫成這樣:
- 先補驗證手段(給它一條能跑的測試或檢查指令)
- effort 升一檔,最多到
high - 換上一檔模型,effort 從該檔的最低起步值開始
Codex 的 T0 是例外,它在高 effort 下 CP值 依然很好,詳見 references/codex.md。
5. 品質保護
省額度不能以返工為代價,返工比一開始用對模型更貴。下面幾條是保證「品質變化不明顯」的手段:
- 每個任務都要有完成標準。能寫成指令的寫成指令(
pytest tests/x、npm run build)。寫不出完成標準的任務,檔位升一級。 - 改程式碼和關鍵判斷留在 T1 以上。T0 只讀不寫,或只寫不進主分支的東西(報告、清單)。
- 便宜模型做完後,由高一檔的模型審 diff。審 diff 只讀變更部分,token 很少,卻能攔住大部分問題。在分配表裡把它列成一個獨立的審查任務,放在每個階段末尾。
- 子代理只回傳結論。在角色說明裡規定回傳格式和長度上限(如「不超過 200 字的摘要 + 相關檔案路徑列表」),避免長輸出灌滿主代理的上下文。
6. 排執行順序
- 互不依賴的任務標成可並行。
- 盡量把同一模型的任務排在一起,在階段之間的自然斷點換模型。中途頻繁換模型會丟快取,等於重付一遍上下文的錢。
- 平台特有的事項(快取歸屬、長上下文加價閾值等)見參考檔案,命中時寫進輸出的「注意事項」。
輸出
在 plan.md 同目錄寫 plan.dispatch.md,用下面的結構。任務很多時表格保留全部任務,角色卡只給子代理任務寫。
# 子代理分配:<計劃名>
來源:<plan.md 路徑> 平台:<claude / codex / both> 取向:<省 / 均衡 / 穩>
## 總覽
| # | 任務 | 執行者 | 檔位 | 模型 | effort | 依賴 | 可並行 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | … | 探查員 | T0 | … | … | 無 | 與 2 |
檔位分佈:T0 ×n,T1 ×n,T2 ×n,T3 ×n
主代理:<模型> / <effort>,負責 <協調、整合、最終驗收等>
## 執行階段
### 階段 1:<名稱>(模型:…)
- 任務 1、2 並行
- 階段末審查:<誰審、審什麼>
## 角色卡
### 任務 1:<名稱>
- **角色**:<一句話定位,如「唯讀探查員:定位所有呼叫舊介面的位置」>
- **模型 / effort**:… / …
- **目標**:…
- **輸入**:<要讀的檔案、目錄、報錯資訊>
- **約束**:<不許改什麼、遵循什麼規範>
- **完成標準**:<指令或可檢查的狀態>
- **回傳格式**:<內容與長度上限>
- **升級階梯**:補驗證 → effort 升到 … → 換 … / …
- **選型理由**:<一句話,對應五個標記>
## 假設與注意事項
- <plan.md 沒寫清、由本技能推斷的地方>
- <平台相關的成本陷阱>
## 預計節省
相對「全部用主力檔預設設定」的粗略估計:<如「約一半任務降到 T0/T1,這部分單價降到 1/2 至 1/20」>
角色卡的「目標、輸入、約束、完成標準」四項就是可以直接貼給子代理的提示詞,寫的時候按能獨立看懂來寫,子代理看不到 plan.md 的其餘部分。
「預計節省」只給量級和依據,不要編造精確百分比。實際消耗取決於任務本身,建議使用者跑完後對照用量統計回頭調整。
範例
plan.md 裡有一步:
- 把 utils/ 下所有用
oldLogger的地方換成newLogger,注意有些地方傳了自訂 formatter
處理:這一步混了「找出所有呼叫點」(讀取量多、唯讀)和「替換並處理 formatter 特例」(要改程式碼、有特例需要判斷)。拆成兩個任務:
| # | 任務 | 執行者 | 檔位 | effort | 理由 |
|---|---|---|---|---|---|
| 3a | 列出所有 oldLogger 呼叫點,標出帶自訂 formatter 的 | 探查員 | T0 | 起步值 | 唯讀,漏了會被 3b 的 grep 檢查發現 |
| 3b | 按清單替換,formatter 特例逐個適配 | 實作者 | T1 | 起步值 | 規格明確,完成標準是 grep -r oldLogger utils/ 為空且測試通過 |
如果沒有測試覆蓋 formatter 行為,3b 的 effort 升一檔,並在「假設與注意事項」裡寫明。