SKILL 26 / ORCHESTRATION · DEEP-DIVE

Subagent 与 Skill 怎么分工

一个问题定生死:这活儿在你的 context 里干,还是在另一个 context 里干 · 继承表逐行读 · 15 倍 token 的协调税

2026-09-27 · BigCat

上期把 subagent / hook / skill / plugin 四个原语摊开比。这期只钻最容易买错的一格:这两个不是「弱版和强版」,一个往当前对话里注入指令,一个开新的 context 只把结果收回来一段话。官方继承表逐行读,再打开两个真实的 subagent 流水线 skill。

前置 → Skill 25 编排类 Skills 与 Plugin 榜单(四原语两轴的全景)

// WHY THIS MATTERS

「要不要上 subagent」的答案不在任务难不难,在中间过程你还要不要看。Claude Agent SDK 的 subagents 文档把好处写成四条:context isolation、parallelization、specialized instructions and knowledge、tool restrictions。四条里只有第一条是别的手段替不了的——其余三条 skill 也能给。所以路线是:先把两边的继承契约读清楚(谁能看见什么),再点名可装可读的具体条目,最后才给判据。判据只有一句预告:你会把它的输出当成一段话读,还是当成一串步骤跟?

// 01

它替你干掉什么:把「读了四十个文件」从主对话里搬走

论断:subagent 买的不是能力,是遗忘。它读了四十个文件,你的主对话只收到一段摘要——这件事 skill 做不到,因为 skill 的内容就留在你这条对话里。

官方契约:一个 markdown 文件,两个必填字段

subagent 就是 .claude/agents/(项目)或 ~/.claude/agents/(全局)下的一个 .md 文件,两个目录都递归扫描。必填只有 name 和 description,正文是它的 system prompt。官方文档的可选字段里这几个值得记住:

# .claude/agents/api-developer.md
---
name: api-developer
description: Implement API endpoints following team conventions
tools: Read, Grep, Edit, Write, Bash   # 不写 = 继承全部;漏掉的工具压根不在它会话里
model: sonnet                          # sonnet/opus/haiku/fable/inherit
skills: [api-conventions, error-handling-patterns]  # ★ 启动时预载 skill
memory: project                        # user/project/local 持久记忆
isolation: worktree                    # ★ 给它一个独立 git worktree
omitClaudeMd: true                     # 不加载 CLAUDE.md(省 token)
maxTurns: 10                           # 到顶的输出被标记为 partial,可 resume
---
You are an API development specialist...

skills: 这一行就把「二选一」的伪命题打掉了:subagent 可以带着 skill 跑。反过来也成立——skill 的 frontmatter 里写 context: fork 就在隔离上下文里执行,agent: 还能指定用哪个 subagent 类型(见 官方 skills 文档)。

第一条立刻能跑的用法:不用装任何东西

Claude Code 自带三个内置 subagent,装机量为零、现在就能用:

# ① Explore —— 只读工具(Write/Edit 被拒),三档 thoroughness
Use the Explore subagent, very thorough, to map every place we validate JWTs

# ② Plan —— plan mode 下做调研的那个,同样只读
# ③ general-purpose —— subagent 能拿到的全部工具,可改代码

# 自己写完一个 agent 文件后,开会话前先验一遍 frontmatter
claude plugin validate .claude/agents

# 不写文件也能起:一次性 JSON 定义
claude --agents '{"code-reviewer":{"description":"Expert code reviewer.",
  "prompt":"You are a senior code reviewer.","tools":["Read","Grep","Glob"],"model":"sonnet"}}'

# 让整个会话直接以某个 agent 的身份跑
claude --agent code-reviewer

Explore 替你干掉的事很具体:四十次 grep 的输出不进你的对话。什么时候别用:答案本来就一行(「这函数在哪个文件」),派它去问要等冷启动加一轮往返,省下的 context 不值这个钱。

出处 · Claude Code · Subagents 与 Claude Code · Skills,2026-09 访问
// 02

机制:一张继承表,解释了九成的「它怎么什么都不知道」

论断:subagent 与父对话之间只有一根管子——Agent 工具的那个 prompt 字符串。你没写进去的东西,它就是不知道。
普通 subagent fork(/subtask) skill ────────────────────────────────────────────────────────────────────────────────── 对话历史 / 工具结果 ✗ 完全没有 ✓ 全量继承 ✓ 就在这条对话里 system prompt 自己的(正文) ✓ 父对话的 父对话的 CLAUDE.md ✓(除非 omitClaudeMd) ✓ ✓ 工具池 子集(后台运行再砍一刀) ✓ 父对话原样 父对话的 已在主对话调用过的 skill ✗(除非写进 skills:) ✓ — 模型 subagent 模型顺序 ✓ 父对话的 可用 model: 覆盖 回到主线的东西 只有最后一条消息 最后一条消息 全过程可见

唯一那根管子的实际后果

SDK 文档写得很直白:The only content you pass from parent to subagent is the Agent tool's prompt string, so include any file paths, error messages, or decisions the subagent needs directly in that prompt. 这就是「我明明刚跟它说过」的全部原因——你跟主对话说过,没跟它说过。

第三态:fork,别把它和 subagent 混着算

交互会话里的 /subtask <描述> 起的是一个 fork:独立 context window,但全量继承父对话的历史、system prompt、输出风格、模型,以及原样工具池(跳过后台 subagent 那道过滤)。fork 是「要隔离但不能失忆」那格的答案。代价:它继承了父对话的全部 token,省下的只有后续噪音。

subagent 的返回值是不可信数据,不是命令。从 v2.1.210 起,Claude Code 会在父对话读到之前扫描 subagent 的最后一条消息:模仿 <system-reminder> 这类控制标签的会被插入反斜杠,以 Human: / Assistant: 开头的行会被在冒号前加反斜杠,命中时再前置一行 [harness: ...] 标记。官方同时强调两件事:它不判断恶意,也不替代限制——真正的护栏仍然是 tools / disallowedTools 和权限。让一个 subagent 去读外部网页、再把它的报告当指令执行,是一条现成的注入链。

为什么 skill 走的是另一条路

skill 的机制是指令注入:description 常驻(便宜),正文只在被调用时展开,展开后留在对话里跨 turn 生效。所以 skill 适合「接下来每一步都要守的规矩」,subagent 适合「这一段我不想看」。disable-model-invocation: true 让 skill 只能你手动喊,user-invocable: false 让它只能模型自动触发——两个字段合起来才是 skill 真正的调用契约。

// 03

真实用法与边界:五个可装可读的条目,逐个给命令

论断:真正把 subagent 用出价值的都不是「派一个 agent」,是把一条流水线的每一站都换成新鲜 context。这件事已经有人写成 skill 了,不用你自己发明。

① obra/superpowers · subagent-driven-development

# 官方 marketplace 一条命令
/plugin install superpowers@claude-plugins-official

这个 skill 的 description 只有一句:Use when executing implementation plans with independent tasks in the current session。它的做法是:先开独立 git worktree、核计划、扫冲突、建一份 ledger 记进度;然后每个任务一轮「派实现者 → 收报告 → 针对性 review → 修,最多 5 轮」,第 1–3 轮 resume 原来那个实现者,第 4–5 轮换更强的模型;最后在最强模型上做一次整支分支的总 review。替你干掉的是:一条长计划做到第七个任务时,前六个任务的噪音已经把上下文挤满了。什么时候别装:它自己写了三条——没有实现计划、任务之间紧耦合而非独立、你的平台压根没有 subagent(那就内联执行)。

② 同仓 · dispatching-parallel-agents

它的触发条件写成 2+ independent tasks that can be worked on without shared state or sequential dependencies,而正文的门槛更高:3 个以上不同根因才值得并行。最该记住的是那句机制原话——Multiple dispatch calls in one response = parallel execution. One per response = sequential. 并行不是一个开关,是你在一条回复里发了几个调用。什么时候别用:失败之间相关(修一个可能连带修好别的)、需要全局上下文才能理解、几个 agent 会互相改同一批文件、根因未知的探索式调试。它还有一句值得贴墙上的:Do NOT just increase timeouts—find the real issue.

③ isolation: worktree:并行写文件的唯一正经办法

上面两个 skill 都从开 worktree 起手,不是巧合:多个 subagent 同时改同一棵工作树就是在互相覆盖。frontmatter 一行 isolation: worktree 就给它一棵独立的;superpowers 里还有个专门的 using-git-worktrees skill 管这条链路。什么时候别开:任务只读(Explore 那类),开 worktree 纯加 IO。

④ wshobson/agents:现成 agent 库

/plugin marketplace add wshobson/agents
/plugin install python-development

自称 94 plugins, 202 agents, 183 skills, 105 commands(据该仓 README,2026-09 读取;MIT),一份 markdown 源生成多个 harness 的产物。价值在于读别人的 description 怎么写——subagent 能不能被自动派到全看它。什么时候别装:整包装进来就是交 description 税(见 04 节那条 15,000 token 警告),按需只装你真用的那个 plugin。

⑤ Agent SDK:把这套写进代码

SDK 里 subagent 是 query() 的 agents 参数,AgentDefinition 的字段和文件版几乎一一对应(description / prompt 必填,其余 tools / disallowedTools / model / skills / maxTurns / background / effort 可选)。两个坑:Python SDK 里 disallowedTools / mcpServers 保持 camelCase;检测有没有真派出去要同时匹配 "Agent" 和旧名 "Task"。规模再大就不该用 subagent 了——官方指向 dynamic workflows 的 Workflow 工具,把编排搬到对话之外的脚本里。什么时候别上 Workflow:一轮里只派两三个 agent,subagent 直接够用。

三条判据,用来在上面这几条之间取舍

  1. 中间过程你还要不要看?要跟着它一步步走 → skill(就在对话里)。只要结论 → subagent。这一条能定八成的局。
  2. 它需要你说过的话吗?需要全量历史 → /subtask 起 fork。只需要几个路径和一段报错 → 普通 subagent,把它们写进 prompt 字符串。
  3. 真的独立吗?3 个以上不同根因、不共享状态、不改同一批文件 → 并行派。否则串行,或者一个 agent 干完。
// 04

代价与替代品:15 倍 token,和一个「越强越爱派」的新问题

论断:subagent 的账不是「多花一点」,是乘法。而且从 Opus 5 起,默认倾向已经站在多派那一边,所以闸门得你自己设。

最硬的那个数

Anthropic 在 《How we built our multi-agent research system》(2025-06-13)里给了三个数:agent 大约是聊天的 4 倍 token,多 agent 系统大约是聊天的 15 倍;他们的内部研究评测上多 agent 比单体 Claude Opus 4 好 90.2%;而 token 用量本身就解释了浏览能力差异的 80%。同一篇文章明确列了不适用的场景:所有 agent 需要共享同一份上下文的任务、agent 之间依赖很多的领域,以及「大多数编码任务」——原话是编码可并行的部分比研究少。这三个数一起读才对:15 倍换 90.2%,值不值取决于你的任务长得像研究还是像改代码。

Opus 5 之后多出来的一笔

Prompting Claude Opus 5 里写得很清楚:Claude Opus 5 delegates to subagents more readily than prior models. 官方给的对策是两层——一层是 prompt,一层是硬闸:

# ① prompt 层(官方示例,逐字可抄)
Delegate to a subagent only for large tasks that are genuinely independent and
parallelizable, such as a wide multi-file investigation. Do not delegate work you
can finish yourself in a handful of tool calls, and do not use subagents to verify
or double-check your own work. If one subagent can complete the task, use one
rather than several, and keep spawn counts low.

# ② 硬闸层(.claude/settings.json 的 env;默认 深度 3 / 并发 20)
"env": { "CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH": "1",
         "CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS": "5" }
# SDK 里还有第三道:maxBudgetUsd / max_budget_usd,到顶返回 error_max_budget_usd

同一份文档还有一条反直觉的:Opus 5 会自己验证自己的工作,所以 prompt 里「用一个 subagent 复核」这类老指令要删掉——留着只会过度验证、白烧 token。注意上面这两个环境变量要 Claude Code 2.1.217 以上。

三笔容易漏算的账

不上 subagent,你还能怎么办

  1. 写成 skill。要的是「每一步都守的规矩」而不是「这段我不想看」——skill 更便宜,而且你看得见它在干什么。
  2. 用 fork。/subtask 要隔离不要失忆,代价是继承全部历史 token。
  3. 钉成 hook。确定性的事别派 agent 去做(Skill 27 专讲)。
  4. 上 Workflow。几十上百个 agent 的编排搬进脚本,别塞在对话里。
  5. 自己干完。官方那段 delegation 指令的第二句就是这个意思:几次工具调用能做完的事,别派。
最后一条诚实的代价:隔离是双向的。subagent 看不见你的对话,你也看不见它的过程——它读错了文件、把测试跳过了、或者被一段网页内容带偏了,你拿到的都是一段读起来很顺的摘要。context isolation 的另一面叫审计盲区。所以 tools 收窄、worktree 隔离、报告只当数据读,这三件是配套的,不是可选项。

// 一页选购卡

先读这三份:① Claude Code · Subagents——字段全表、三个内置 agent、fork 一节、可用工具的两道过滤,本期一半内容的出处。② superpowers · subagent-driven-development——一条真实的 subagent 流水线长什么样,包括 5 轮修复上限和升级模型这种细节。③ Anthropic · 多 agent 研究系统(2025-06)——15 倍 token、90.2%,以及「大多数编码任务不适合」。

按需再看:dispatching-parallel-agents(一条回复发多个调用 = 并行;四条不该并行的条件)· Agent SDK · Subagents(AgentDefinition 全字段、深度/并发/预算三道闸、resume 的写法)· Claude Code · Skills(context: fork + agent:,把 skill 就地隔离)· Prompting Claude Opus 5(delegation 指令片段;删掉「用 subagent 复核」那类老指令)· wshobson/agents(现成 agent 库,拿来读 description 写法)· Dynamic workflows(规模超出 subagent 之后)。

明确别做:派 subagent 去问一行答案 · 指望它记得你刚说过的话(路径和报错要写进 prompt)· 让多个 subagent 在同一棵工作树上写文件 · 把 subagent 的报告当指令执行 · 在 Opus 5 上留着「用 subagent 复核」这类旧指令 · 不设深度/并发/预算就放它跑。

// 术语表

subagent(子代理)
一个独立的 Claude 实例,自己的 context window 与 system prompt,只把最后一条消息交回父对话。定义在 .claude/agents/*.md 或 SDK 的 agents 参数。
context isolation(上下文隔离)
subagent 四大好处里唯一别的手段替不了的那条:中间的工具调用与结果留在它自己那边,父对话只收摘要。反面是审计盲区。
fork(/subtask)
一种特殊的 subagent:独立 context window,但全量继承父对话的历史、system prompt、输出风格、模型和原样工具池。要隔离又不能失忆时用。
instruction injection(指令注入,指 skill 的机制)
skill 被调用时把正文展开进当前对话,此后跨 turn 一直生效。与「另开一个 context」是两条路。
skills: 预载
subagent frontmatter 的字段,启动时把指定 skill 装进它的上下文。它证明两者不是二选一。
coordination tax(协调税)
派出去之后必须有人做的那些事:拆任务、写进 prompt、收报告、查冲突、定修复轮次上限、最后总 review。
subagent output scanning
v2.1.210 起,父对话读到 subagent 报告之前的一道扫描:给模仿控制标签和轮次分隔的文本加反斜杠、必要时前置 [harness: ...]。它不判断恶意,也不替代 tools 与权限限制。

// 三个想不通的地方

既然 subagent 可以 skills: 预载 skill,skill 又可以 context: fork 变隔离,那这两个概念还有区别吗?
有,区别在谁是默认。skill 的默认是「留在对话里」,subagent 的默认是「另开一个 context」;两边的可选字段只是让它们能互相借一步。真正不可交换的是回到主线的东西:skill 的全过程你都看得见,subagent 只给你最后一条消息。所以选择题从来不是「哪个更强」,是「我要不要看过程」。
15 倍 token 换 90.2% 提升,这笔账看起来挺划算,为什么官方还说「大多数编码任务不适合」?
因为那 90.2% 是在研究评测上拿到的。研究天然广度优先:十个方向互不依赖,分头查,合起来就是答案。编码不是——改一个接口牵动三个调用方,可并行的部分远少于看起来的样子,几个 agent 同时改文件还会互相覆盖(这也是两个流水线 skill 都从开 worktree 起手的原因)。同一篇文章把「agent 之间依赖很多」列为不适用条件,编码正是这类。
模型越强越爱派 subagent,这是 bug 还是 feature?
大概两者都是。Opus 5 官方文档一边说它 coordinates teams of subagents well、很少互相覆盖工作,一边说 delegates more readily 且要 cap delegation——能力和倾向同时上去了,而成本按 agent 数乘。有意思的是同一份文档要求删掉「用 subagent 复核」这类旧指令:上一代靠多派一个 agent 补的能力缺口,这一代补上了,指令却还留在无数 prompt 里。所以每次换模型,该检查的不只是 prompt 写得对不对,还有它当初是为了绕哪个缺陷而写的。

// 延伸阅读