delegate-chore
雜務的備援委派目標。task_type=chore,預設模型 haiku(最便宜)。執行系分支(Codex / Devin / Cursor / Claude)由 dispatch.sh 處理。
腳本路徑
- Claude Code:
skill_dir=.claude/skills/delegate-chore - Codex:
skill_dir=.agents/skills/delegate-chore
後續的命令範例使用 Claude Code 的 .claude/skills/delegate-chore。若在 Codex 中使用,請替換為相同相對結構的 .agents/skills/delegate-chore。
模型價格參考
只有在需要進行成本分析或單價比較時,才讀取 <skill_dir>/model-token-prices.json。此數據僅供參考,不用於判斷是否啟動委派。
委派之前(成本閘門)
委派會產生開銷(工作進程啟動、請求/回應往返、主要端讀取)。如果此 chore 可以透過單一命令(例如 sed / find / chmod 等)撰寫成腳本,且不需要將任務內容載入模型上下文中,那麼委派很可能會造成純粹的損失(開銷超過了上下文衛生與 token 兩方面的收益)。在這種情況下,應由主要端直接執行,無需委派;如果需要重複執行,則轉而使用下述的反饋迴圈自動化提案。委派只有在需要模型讀取並處理內容的大量工作時才划算。依據請參閱 docs/design/delegate-chore.md §5。
執行流程(一次性)
- 建立請求: 透過 stdin 傳遞包含 Objective / Scope / Context / Acceptance criteria / Verification / Constraints 的 Markdown。請求應簡潔撰寫:Context 中不要貼上檔案內容,而是讓它透過路徑(必要時加上行號範圍)來引用(為了不增加主要端的輸出=計費 token)。
- 如果使用者在對話中指定了模型或 effort,請在 run 呼叫前加上行內環境變數(例如:
DELEGATE_CHORE_MODEL=gpt-5.5@high bash .../run.sh ...)。如果 exit code 為 6,則直接使用 stderr 中包含允許值列舉的整行作為對使用者的說明。
- 如果使用者在對話中指定了模型或 effort,請在 run 呼叫前加上行內環境變數(例如:
- 執行:
out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/run.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID")"(如果是頂層啟動,$PARENT_TASK_TYPE_CHAIN可以留空)。- run 內部會依序執行 prepare → dispatch → read-response,stdout 無論成功或失敗都回傳單一 JSON(包含
exit_code/status/content/content_truncated/response_file/observe_file/run_dir)。 - selector 省略時的預設值為
auto。第 6 個位置參數是 read-response 的 selector,與 prepare.sh 的第 6 個位置參數 session_mode 意義不同。 - exit code 會穿透內部腳本。exit 3 = 前提不足 / exit 4 = 委派循環,應中止。
- run 會在 dispatch 之前先將
observe_file: <path>輸出到 stderr。強制終止時,可將該路徑作為恢復途徑。 - 在非互動模式的父進程(例如
claude -p)中,run 必須在前景執行,並設定比委派所需時間更長的 Bash timeout(Claude Code 可使用BASH_DEFAULT_TIMEOUT_MS/BASH_MAX_TIMEOUT_MS或 Bash tool 的 timeout 參數)。
- run 內部會依序執行 prepare → dispatch → read-response,stdout 無論成功或失敗都回傳單一 JSON(包含
- 消費回應: 讀取
status="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .status)"/content="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .content)"。如果content_truncated為true,則取出response_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .response_file)",並透過bash .claude/skills/delegate-chore/scripts/read-response.sh "$response_file" <N>只分段讀取需要的 sections。讀取完成後,不要重新摘要(echo) worker 的本文。主要端對使用者的回應僅限於指向 Summary 的一行(為了不增加主要端的輸出=計費 token。詳見 spec.md §6)。
進階流程(個別腳本)
對於需要在 dispatch 過程中穿插父進程判斷的流程,例如 observe 監控、背景執行、可恢復 / 後續追加之類的,請使用傳統的個別腳本。
- 準備(聚合): 將前提檢查→模型解析→鏈結確認→請求生成濃縮到一個
prepare.sh腳本中(以減少個別呼叫的 bash 往返及對主要端上下文的輸出)。透過 stdin 傳遞包含 Objective / Scope / Context / Acceptance criteria / Verification / Constraints 的 Markdown。請求應簡潔撰寫:Context 中不要貼上檔案內容,而是讓它透過路徑(必要時加上行號範圍)來引用(為了不增加主要端的輸出=計費 token)。exit 3 = 前提不足 / exit 4 = 委派循環,應中止。- 如果使用者在對話中指定了模型或 effort,請在 prepare 呼叫前加上行內環境變數(例如:
DELEGATE_CHORE_MODEL=gpt-5.5@high bash .../prepare.sh ...)。如果 prepare 的 exit code 為 6,則直接使用 stderr 中包含允許值列舉的整行作為對使用者的說明。 out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/prepare.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID")"(如果是頂層啟動,$PARENT_TASK_TYPE_CHAIN可以留空)model="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .model)"/request_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .request_file)"/response_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .response_file)"/run_dir="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .run_dir)"/observe_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .observe_file)"
- 如果使用者在對話中指定了模型或 effort,請在 prepare 呼叫前加上行內環境變數(例如:
- 執行:
bash .claude/skills/delegate-chore/scripts/dispatch.sh "$model" chore "$request_file" "$response_file" "$run_dir" "$observe_file"。模型名稱前綴決定的執行系分支(Codex / Devin / Cursor / Claude)由 dispatch.sh 處理。stdout 僅輸出 response_file 的路徑。在非互動模式的父進程(例如claude -p)中,dispatch 必須在前景執行,並設定比委派所需時間更長的 Bash timeout(Claude Code 可使用BASH_DEFAULT_TIMEOUT_MS/BASH_MAX_TIMEOUT_MS或 Bash tool 的 timeout 參數)。執行期間的常規監控僅透過 read-json.sh 從observe_file讀取state.phase/state.started_at/heartbeat.ts/heartbeat.stdout_bytes/heartbeat.stderr_bytes/heartbeat.last_stream_change_at。state.phase的值為prepared | running | superseded | stalled | ended。prepared/superseded表示未經 dispatch 的 observe(state.started_at == null,usage未設定,read-json.sh 會回傳 null),因此彙總 usage 時應將其從分母中排除。 - 讀取回應:
bash .claude/skills/delegate-chore/scripts/read-response.sh "$response_file" auto。auto模式:如果回應較小(預設小於 10KB),則一次讀取 status 和所有 sections;如果較大,則回傳 status + index + Summary section,之後再根據需要透過... "$response_file" <N>額外取得特定 sections。讀取完成後,不要重新摘要(echo) worker 的本文。主要端對使用者的回應僅限於指向 Summary 的一行(為了不增加主要端的輸出=計費 token。詳見 spec.md §6)。
工作階段重用(可恢復 / 後續追加)
可恢復 / 後續追加不屬於一次性流程的範疇,因此使用個別腳本。
預設為一般 run。只有在進行較大規模的跨檔案修改等、主要端審查時很可能退回的情況下,才從第一次開始就明確指定可恢復的初始 run。請勿過度使用。
- 可恢復初始 run: 將
resumable作為第 6 個參數傳遞給prepare.sh。dispatch 則將resumable作為第 7 個參數,第 8、9 個參數傳遞空字串。out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/prepare.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID" resumable)"session_mode="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .session_mode)"/lineage_id="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .lineage_id)"bash .claude/skills/delegate-chore/scripts/dispatch.sh "$model" chore "$request_file" "$response_file" "$run_dir" "$observe_file" "$session_mode" "" ""- 讀取回應後,檢查
bash .claude/skills/delegate-chore/scripts/read-json.sh .backend_session.persistence "$observe_file"。如果不是resumable,則視為無法後續追加,需立即判斷,不要期待事後的隱含備援。
- 後續追加 run: 僅在主要端透過差異比對發現錯誤時使用。將
followup=<前次observe_file>作為第 6 個參數傳遞給prepare.sh。exit 5 表示驗證失敗,應中止,並以一般 delegate 的形式重新提出。不要進行隱含備援。out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/prepare.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID" "followup=$previous_observe_file")"session_mode="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .session_mode)"/resume_id="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .resume_id)"/backend_session_home="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .backend_session_home)"bash .claude/skills/delegate-chore/scripts/dispatch.sh "$model" chore "$request_file" "$response_file" "$run_dir" "$observe_file" "$session_mode" "$resume_id" "$backend_session_home"- 後續追加的請求中,必須包含主要端發現的錯誤、最新的
git diff中應檢視的範圍,以及對前次response_file的引用。不要讓 worker 僅依賴其舊的對話上下文。
skill 升級提案(反饋迴圈)
流向 delegate-chore 的任務是「缺少專用 skill 的工作」的信號。消費回應後,如果該工作
- 反覆出現 / 具有明確邊界且可重複使用的類別
則應透過 AskUserQuestion 向使用者提議建立新的專用 delegate-<name> skill(附帶建議的名稱 / 預設模型 / 工具權限 / 啟動類型)。達成共識後,使用 skill-creator 建立模板並遵循本協議。對於一次性或微不足道的 chore,則不提議。
針對確定性流程的腳本化提案
秉持與 skill 升級提案相同的精神,如果發現相同的多步驟命令序列、驗證步驟或定型編輯反覆出現,且分支固定、不需要 LLM 判斷時,應透過 AskUserQuestion 提議將其腳本化,或整合至 git hook / npm script / CI 等適當的自動化手段中(附帶目標步驟 / 自動化目標 / 預期觸發條件)。對於一次性步驟或需要判斷的步驟,則不提議。
等待時間的隱藏(針對互動式父進程)
在互動式父進程中,可以將 dispatch.sh(或 run.sh)在背景執行,並透過檢查 observe_file 的 state.phase / heartbeat,在 ended 之後再呼叫 read-response.sh,來隱藏使用者感知的等待時間。這僅是改善使用者體驗的優化,總耗時(wall time)並未改變。在非互動模式的父進程中,仍必須如前所述在前景執行。
限制
- 允許編輯。但不可進行 push(push / PR 由主要代理直接處理)
- 不可將任務重新委派給 task_type_chain 內已有的類型(可以委派給不同類型的 delegate)
- 主要端不得 echo / 重新摘要 worker 的輸出。對使用者的回應僅限於指向 Summary 的一行(為了不增加輸出=計費 token。詳見 spec.md §6)