子 Agent 该不该继承上下文:Codex 与 Claude Code 的 fork 默认值

派子 Agent 的理由,通常是让它在一个干净的上下文里只看任务说明,干完交回结论。可现在主流编程 Agent 都支持「fork」:子 Agent 直接继承父会话的全部历史。默认值没想清楚,审查员带着作者的思路去审,研究员背着主会话几十万 token 的历史去查,派出去的意义就没了。下面按 Codex 源码、Claude Code 官方文档和两个开源 Skill 仓库的改动(2026-10-29 北京时间查阅)讲清两边的默认行为、各自怎么关,以及 Skill 里该怎么写。
Codex:fork_turns 默认 all
Codex 源码 codex-rs/core/src/tools/handlers/multi_agents_v2/spawn.rs 里,fork_turns 参数没传或为空时取 "all";只认 none 和 all,旧式的数字轮数会按完整历史处理;V2 里再传旧参数 fork_context 会直接报错,提示改用 fork_turns。旧版工具(V1)的 fork_context 是布尔值,不传就是只带初始提示。
也就是说,同样一句「派个子 Agent 去审一下」,换到 V2 工具上,模型不显式写 fork_turns: "none",子 Agent 就会看到父会话的全部来回。Codex 文档里关于继承写的是另一层:子 Agent 继承当前的沙箱、审批设置、模型提供方和 MCP 服务器,自定义 Agent 文件(~/.codex/agents/ 或 .codex/agents/ 下的 TOML,必填 name、description、developer_instructions)改不了这些。
Claude Code:fork 模式默认开,但非 fork 子 Agent 仍是干净的
Claude Code 文档把两类分得很清楚:
| Fork | 非 fork 子 Agent | |
|---|---|---|
| 上下文 | 完整对话历史 | 只有你传的提示 |
| 系统提示和工具 | 和主会话相同 | 来自子 Agent 定义文件 |
| 模型 | 和主会话相同 | 来自 model 字段 |
| Prompt cache | 与主会话共享 | 单独一份 |
fork 模式从 v2.1.302 起默认开(交互终端从 v2.1.232 起),开着的时候 Claude 可以自己发起 fork,你也可以用 /subtask 任务 手动 fork。不想让它自己 fork,有两种关法:
// settings.json:只禁 fork
{ "permissions": { "deny": ["Agent(fork)"] } }
// 或整个关掉 fork 模式
{ "env": { "CLAUDE_CODE_FORK_SUBAGENT": "0" } }
关掉 fork 模式还有个副作用:fork 模式开着时,本机交互会话里 Claude 没法同步等子 Agent 跑完,关掉才能等。只想禁 fork,用第一种;还想让 Claude 能停下来等子 Agent 跑完,用第二种。定义子 Agent 文件的写法见站内 Claude Code 子 Agent 怎么配。
审查员继承了作者的对话,就会沿着作者的思路走,错过作者错过的东西。
什么活该 fork,什么活必须干净
| 任务 | 建议 | 理由 |
|---|---|---|
| 基于当前进度补测试、写文档 | fork | 要大量背景,重新交代太贵;共享缓存更便宜 |
| 同一起点并行试几个方案 | fork | 起点必须一致 |
| 代码审查、规格核对 | 干净 | 只该回答「改动是否满足需求」,不是「作者的推理是否成立」 |
| 独立研究、查资料 | 干净 | 主会话的假设会带偏搜索方向 |
| 多个设计方案(各自独立想) | 干净 | 继承同一段历史,方案会趋同 |
MiniMax 开源的 independent-review Skill 把审查的输入卡死成三样:diff、需求、测试结果,明确不给作者的对话、计划和自评;它的理由是写代码的 Agent 已经说服了自己每个小决定,继承这段对话的审查员会跟着同样的推理走、漏掉同样的问题。整套 Skill 的介绍见站内 MCode Stack 是什么。
Skill 里怎么写:一句话写死
一个热门开源 Skill 仓库(mattpocock/skills)在 2026-10-29 合并的 PR #1341 是个现成的例子。PR 说明写的问题是:部分 Codex 模型派子 Agent 时会 fork 父会话,子 Agent 继承了父上下文,用子 Agent 的初衷就丢了。改法很朴素,八个会派子 Agent 的 Skill(code-review、implement-spec、research、grilling 等)各改一句:
-spin up a subagent that calls the Skill tool with "research"
+spin up a subagent with a fresh context window that calls the Skill tool with "research"
再在仓库规范(CLAUDE.md)里加一条:凡是派子 Agent 的 Skill 都要这么写,新 Skill 照此执行。
自己写 Skill 时可以照搬三处:
- 派发句:写「start the subagent with a fresh context window」或中文「以全新上下文启动子 Agent,不继承当前对话」。在 Codex V2 工具里,对应的参数是
fork_turns: "none",自己写编排代码时可以直接传。 - 输入清单:明写子 Agent 只拿什么(diff、需求、测试输出、文件路径),其余背景不给。
- 输出格式:要它交回固定结构,比如问题 / 位置 / 原因 / 严重程度的表格,主会话只收结论。
完成标准
- 你的审查、研究类 Skill 里,派子 Agent 的那句话明确写了全新上下文。
- Claude Code 里你清楚 fork 模式是开是关;需要时用
Agent(fork)拒绝规则或CLAUDE_CODE_FORK_SUBAGENT=0控住。 - 需要背景的旁支任务,主动用 fork(Claude Code 里
/subtask)省掉重新交代和缓存成本。
最后
打开你最常用的那个审查类 Skill,搜一下派子 Agent 的那句,补上「以全新上下文启动」和三样输入,下次审查时对比一下它挑出的问题。