CC源码剖析 #04 · 多阶段任务编排器

基于 2026-03-31 公开的源码快照,~512,000 行代码


一、Coordinator 模式定位

Coordinator 是 Claude Code 的多 Agent 并行编排模式,通过 COORDINATOR_MODE Feature Flag 激活。

当用户任务需要多路并行研究、验证时,Coordinator 派生出多个 Worker Agent,各自独立工作,结果汇总到 Coordinator。

用户输入
    │
    ▼
┌─────────────┐
│ Coordinator │ ←── Feature Flag: COORDINATOR_MODE
│  (主 Agent) │
└──────┬──────┘
       │ parallel launch
       ├──────────────┐
       │              │
       ▼              ▼
┌──────────┐   ┌──────────┐
│ Worker A │   │ Worker B │
│ Research │   │ Research │
└────┬─────┘   └────┬─────┘
     │              │
     │ task-notification (结果)
     ▼              ▼
┌──────────────┐
│ Coordinator │ ←── 合成结果,发给用户
│  (汇总统筹) │
└──────────────┘

二、核心工具集

Coordinator 通过四个核心 Tool 管理 Worker 生命周期:

Tool功能
AgentTool派生子 Worker(subagent_type: "worker"
SendMessageTool向已有 Worker 发消息(继续工作)
TaskStopTool停止正在运行的 Worker
TeamCreateTool / TeamDeleteTool团队级管理

关键文件:src/coordinator/coordinatorMode.ts


三、AgentTool — Worker 派生

3.1 subagent_type: “worker”

1
2
// 派生 Worker 时指定 subagent_type = "worker"
AGENT_TOOL_NAME({ description: "Investigate auth bug", subagent_type: "worker", prompt: "..." })

3.2 工具权限控制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// Coordinator 的 workers 使用受限工具集
const INTERNAL_WORKER_TOOLS = new Set([
  TEAM_CREATE_TOOL_NAME,
  TEAM_DELETE_TOOL_NAME,
  SEND_MESSAGE_TOOL_NAME,
  SYNTHETIC_OUTPUT_TOOL_NAME,
])

// SIMPLE 模式下只有 Bash/Read/Edit
const workerTools = isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)
  ? [BASH_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_EDIT_TOOL_NAME]
  : Array.from(ASYNC_AGENT_ALLOWED_TOOLS)
      .filter(name => !INTERNAL_WORKER_TOOLS.has(name))

3.3 Worker 能力差异

模式可用工具
SIMPLEBash, Read, Edit
标准全部工具(除内部工具) + MCP + Skills

四、任务通知机制

4.1 task-notification 格式

Worker 完成后,结果以 <task-notification> XML 格式发回:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<task-notification>
<task-id>{agentId}</task-id>
<status>completed|failed|killed</status>
<summary>{human-readable status summary}</summary>
<result>{agent's final text response}</result>
<usage>
  <total_tokens>N</total_tokens>
  <tool_uses>N</tool_uses>
  <duration_ms>N</duration_ms>
</usage>
</task-notification>

4.2 消息路由

Worker → 消息发回 Coordinator 作为 user-role message
       → Coordinator 解析 <task-notification> 标签识别来源
       → 决定继续(SendMessage)还是启动新 Worker

五、四阶段工作流

5.1 阶段划分

Phase执行者目的
ResearchWorkers(并行)调查代码库、理解问题
SynthesisCoordinator阅读发现,制定实现规格
ImplementationWorkers按规格改代码、提交
VerificationWorkers测试验证

5.2 并行策略

1
2
3
4
5
6
// Coordinator 系统提示中的并行指导:
"Launch independent workers concurrently whenever possible
— don't serialize work that can run simultaneously and look
for opportunities to fan out. When doing research, cover
multiple angles. To launch workers in parallel, make
multiple tool calls in a single message."

5.3 并发冲突处理

场景策略
只读任务(研究)自由并行
写任务(实现)每次一组文件串行
验证可与不同文件区实现并行

六、Continue vs Spawn 决策

6.1 判断矩阵

SituationMechanismWhy
研究已探索了需要编辑的文件Continue (SendMessageTool)Worker 已加载文件上下文
研究广泛但实现狭窄Spawn fresh避免探索噪声干扰实现
修正失败或延伸近期工作Continue有错误上下文
验证另一 Worker 刚写的代码Spawn fresh独立验证,不带实现假设
第一次尝试方向完全错误Spawn fresh错误上下文会污染重试
完全无关任务Spawn fresh无可复用上下文

6.2 合成规则(最重要)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 核心原则:Worker 看不到你的对话
// 每个 prompt 必须自包含所有必要信息

// Anti-pattern(禁止):
AGENT_TOOL_NAME({ prompt: "Based on your findings, fix the auth bug", ... })

// Good(必须):
AGENT_TOOL_NAME({
  prompt: "Fix the null pointer in src/auth/validate.ts:42.
  The user field on Session (src/auth/types.ts:15) is undefined
  when sessions expire but the token remains cached.
  Add a null check before user.id access — if null, return 401
  with 'Session expired'. Commit and report the hash.",
  ...
})

“Never write ‘based on your findings’” — 这是 Coordinator 最重要的规则。


七、Coordinator 系统提示

7.1 角色定义

1
2
3
4
5
6
7
8
"You are Claude Code, an AI assistant that orchestrates
software engineering tasks across multiple workers."

// Coordinator 的职责:
// 1. 帮助用户达成目标
// 2. 指挥 workers 研究、实现、验证
// 3. 合成结果与用户沟通
// 4. 能直接回答的不委托

7.2 结果报告规则

1
2
3
4
5
6
// Worker 结果是内部信号,不是对话伙伴
// 不要感谢或确认它们
"Every message you send is to the user. Worker results
and system notifications are internal signals, not
conversation partners — never thank or acknowledge them.
Summarize new information for the user as it arrives."

八、错误恢复

8.1 Worker 失败处理

1
2
3
4
// Worker 报告失败(测试失败、构建错误):
// → 用 SendMessageTool 继续同一 Worker(有完整错误上下文)
// → 修正失败则尝试不同方法
// → 无法恢复则报告用户

8.2 停止 Worker

1
2
3
4
5
// 用 TASK_STOP_TOOL_NAME 停止方向错误的 Worker
TASK_STOP_TOOL_NAME({ task_id: "agent-x7q" })

// 然后用 SendMessageTool 继续,给出正确方向
SEND_MESSAGE_TOOL_NAME({ to: "agent-x7q", message: "Stop the JWT refactor..." })

九、Feature Flag 注入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// main.tsx 中条件导入
const coordinatorModeModule = feature('COORDINATOR_MODE')
  ? require('./coordinator/coordinatorMode.js')
  : null;

// coordinatorMode.ts 中检查
export function isCoordinatorMode(): boolean {
  if (feature('COORDINATOR_MODE')) {
    return isEnvTruthy(process.env.CLAUDE_CODE_COORDINATOR_MODE)
  }
  return false
}

未激活时,整个 coordinator/ 模块代码不打包进二进制。


十、与其他模块的关系

coordinatorMode.ts
  ├── 被 main.tsx 条件导入(COORDINATOR_MODE)
  ├── AgentTool → 工具系统
  ├── SendMessageTool → 消息传递
  ├── TaskStopTool → 任务管理
  └── getCoordinatorUserContext() → context.ts(系统提示构建)

下一步

下一篇:05 - Tools 系统:工具定义、注册与执行,深入 tools/ 模块的 Tool 基类、Schema 验证与权限模型。


Claude Code 源码研究系列 · 2026 · skyseraph

SkySeraph
SkySeraph
AI for All & All for AI
留言 Comments