Barret李靖,Software Engineer,经常被问到这个问题:
为什么给 Claude Code 安排大任务,它不会一口气执行完,而是跑几十分钟就停下来问要不要继续?
比如让补全 1000 个单测,它修了 200 个就停了。
根本原因:单一 Agent 的 context 膨胀链条
这不是 Claude Code 的 bug,是大语言模型上下文机制导致的必然:
1. 刚开始:高效模式,指令遵循效果特别好
2. ~80k tokens:context 开始逼近 compact 阈值
3. 触发 compact:对话历史被压缩为摘要,模型开始遗忘刚才修复单测的细节
4. 再一两轮 compact:它开始重复检查已修复的测试
5. 触发 maxTurns + 没有 ToolUse 指令:模型退出任务,询问用户
任何试图在一个 agent session 内完成海量工作的方案,最终都会碰到 context 膨胀 → compact → 信息丢失 → 效率下降 → 退出这个链条。
解法:主-子 Agent 运行模式
核心思路:任务调度器 + 进度文件系统化 + 每个子 agent 独立 context、独立退出逻辑。
给 Claude Code 的指令需要包含三部分:
1. 任务分解
❌ 不要给无边界的指令("修复所有单测") ✅ 先扫描出所有失败测试,按目录或模块分组,每组 15-30 个,作为独立子任务
关键:每个子任务的 prompt 必须自包含——写清楚文件路径、错误现象、期望行为。不能写"根据之前的分析来修复",因为子 agent 看不到父 agent 的历史。
2. 进度持久化
在项目根目录维护 progress.json:
{
"completed": [...],
"failed": [...],
"pending": [...]
}
主 agent 每轮调度前读取文件决定下一批任务,子 agent 完成后更新对应条目。即使主 agent 自己被 compact,重读文件就能恢复全部状态。
3. 失败策略
- 子 agent 报错时,如果错误可修复,用 SendMessage 继续同一个子 agent(保留错误上下文更高效)
- 如果方向完全错了,启动新的子 agent,避免锚定在错误路径上
- 多次失败则上报用户,不要无限重试烧 token
Claude Code 内置了 Coordinator Mode
最直接的方式:输入 /coordinator
主 agent 自动变成纯调度者——它不执行任何实际工具调用,只负责:
- 理解子 agent 的返回结果
- 合成下一步的具体指令
- 并行派发独立任务
每个子 agent 通过 AgentTool 启动,拥有独立 context,互不干扰。
一句话记住
设计多个 agents,各司其职、快进快出,把进度交给文件系统来记忆。
这就是绕过单一 agent context 瓶颈的核心范式。