专题篇章 · 拆开一只生产级 Coding Agent

子 Agent 的四个隔离维度

从上下文来源、恢复模式、工作树和任务状态分析隔离边界

本页解决的问题

先给结论

「子 Agent 的四个隔离维度」要解决的关键问题是什么?

从上下文来源、恢复模式、工作树和任务状态分析隔离边界

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

课程目标

能准确解释 ContextSource::New / ResumedResumeSourceDataSubagentIsolationMode,并根据任务选择新会话、恢复与 worktree。

TEACHING DIAGRAM

隔离是一组正交维度

同一个 Resumed 子 Agent 可以复用 worktree,也可以继承普通 cwd。上下文连续与文件空间隔离要分别判断。

上下文、身份、工作目录和改动空间四个隔离维度 childsession ContextSourceNew / Resumed Identitytype / persona / model pin Effective cwdworktree > override > parent Isolation modeNone / Worktree
ContextSource 的公开语义

ContextSource::New

新会话不继承历史。spawn 流程建立新的 system prompt 和 prompt context,再接收当前任务输入。它不代表独立文件空间,文件空间仍取决于 isolation 与 cwd。

ContextSource::Resumed

从已完成的 peer subagent 继续。源码复制原始 transcript 与 tool state,模型沿用 source model;system prompt 和 prompt context 根据当前 AgentDefinition 重新渲染。

实现补充:xai-grok-subagent-resolution::ContextSource 公开枚举只有 New 与 Resumed。shell 内部还有 InitialContextSource::Forked,用于从父会话镜像或摘要上下文;它属于另一条 bootstrap 分支,不应伪装成公开枚举成员。
ResumeSourceData 传递恢复定位信息
身份subagent_id、type、persona、model_id
目录child_cwd、worktree_path
会话数据child_session_id 定位 transcript 与 tool state
快照snapshot_ref 可重建已删除 worktree

身份校验

  • subagent_type 必须与 source 一致。
  • 显式 Persona 必须与 source 一致;未显式给出则沿用 source。
  • model 不参与身份 gate。请求中的 model override 会被软忽略,并 pin 到 source model。

恢复限制

  • 复制 transcript 或读取失败时,显式 resume 会失败关闭。
  • source transcript 超过目标模型上下文窗口 80% 时拒绝恢复。
  • 恢复复制 tool state,不复制 plan state、plan mode state 与 signals。
SubagentIsolationMode 只有两种

None

子 Agent 使用解析后的 cwd,通常与父工作区相同。上下文窗口依然是独立子会话。None 描述文件工作空间隔离,不等于共享对话历史。

Worktree

子 Agent 使用独立 worktree 路径。恢复时优先复用 source worktree;路径已移除且存在 snapshot_ref 时,可从持久 git ref 重新水化。该枚举没有「sandbox」成员。

crates/codegen/xai-grok-subagent-resolution/src/types.rs crates/codegen/xai-grok-subagent-resolution/src/resume.rs crates/common/xai-tool-types/src/task.rs bootstrap_initial_context resolve_child_cwd
真实源码快照
crates/common/xai-tool-types/src/task.rsREAL SOURCE
pub enum SubagentIsolationMode {
    #[default]
    #[serde(alias = "None")]
    None,
    #[serde(alias = "Worktree", alias = "work_tree", alias = "work-tree")]
    Worktree,
}

快照说明:枚举完整保留,展示 wire alias。上方同心圆是课程视觉,用于强调维度正交,并非源码中的对象层级。

课堂练习:给两个任务选边界

任务 A 要继续昨天完成一半的重构,并保留原 worktree 未提交改动。任务 B 只需独立分析当前仓库。分别选择 New 或 Resumed、None 或 Worktree,并说明 transcript、model、cwd 与文件改动空间如何处理。

Takeaway:New 与 Resumed 控制信息连续性,None 与 Worktree 控制文件空间,ResumeSourceData 负责定位身份、目录、会话和快照。先拆维度,再谈隔离强度。

「隔离是一组正交维度」为什么要看操作

「能准确解释 ContextSource::New / Resumed 、 ResumeSourceData 、 SubagentIsolationMode ,并根据任务选择新会话、恢复与 worktree」把结构落到了一个具体动作。这里真正要比较的不是名词谁更高级,而是数据如何被放置,以及最常发生的操作需要走多远。

读懂结构,要同时看访问方式和变化方式

「同一个 Resumed 子 Agent 可以复用 worktree,也可以继承普通 cwd。上下文连续与文件空间隔离要分别判断」揭示了一个容易被忽略的取舍:按位置读取、按键查找、从两端进出、插入新元素和遍历关系,适合的组织方式并不相同。一个结构在某个操作上很快,不代表它在所有操作上都快。

  • subagent_type 必须与 source 一致
  • 显式 Persona 必须与 source 一致;未显式给出则沿用 source
  • model 不参与身份 gate。请求中的 model override 会被软忽略,并 pin 到 source model

把规模和更新频率一起算进去

实践时可以把「任务 A 要继续昨天完成一半的重构,并保留原 worktree 未提交改动。任务 B 只需独立分析当前仓库。分别选择 New 或 Resumed、None 或 Worktree,并说明 transcript、model、cwd 与文件改动空间如何处理」当作边界提醒:先写下数据量、最常用的操作和允许的延迟,再看 AI 给出的结构是否真的匹配。

从「隔离是一组正交维度」走到「ContextSource::New」

「隔离是一组正交维度」先把问题落在「同一个 Resumed 子 Agent 可以复用 worktree,也可以继承普通 cwd。上下文连续与文件空间隔离要分别判断」上;到了「ContextSource::New」,讨论继续推进到「新会话不继承历史。spawn 流程建立新的 system prompt 和 prompt context,再接收当前任务输入。它不代表独立文件空间,文件空间仍取决于 isolation 与 cwd」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

遇到一个新的数据结构时,不要从定义开始背。先写出最频繁的操作,再估计数据量和更新方式,最后检查结构是否让这三个条件同时成立。

  • 「隔离是一组正交维度」:同一个 Resumed 子 Agent 可以复用 worktree,也可以继承普通 cwd。上下文连续与文件空间隔离要分别判断
  • 「ContextSource::New」:新会话不继承历史。spawn 流程建立新的 system prompt 和 prompt context,再接收当前任务输入。它不代表独立文件空间,文件空间仍取决于 isolation 与 cwd
  • 「最后的要点」:source transcript 超过目标模型上下文窗口 80% 时拒绝恢复

最后的「最后的要点」把讨论落到「source transcript 超过目标模型上下文窗口 80% 时拒绝恢复」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 子 Agent 的四个隔离维度 拆开一只生产级 Coding Agent
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助