Agent 会话边界设计:Session、Context Window 与工作状态转移
多阶段 Agent 工作流常遇到一个问题:前一阶段已经结束,消息历史仍然带着大量搜索结果、失败命令和废弃路径;下一阶段需要其中的约束,却不需要完整过程。此时应该继续同一会话、做一次 compact、派发子 Agent,还是从 checkpoint 启动新会话?
这个问题不能靠在 messages 数组里寻找某个神奇下标解决。需要设计的是工作状态怎样越过边界,以及边界后的 Agent 怎样证明自己已经恢复到可执行状态。
四种边界经常被混在一起
“会话”在不同产品和讨论里可能指四件事:
| 边界 | 它分隔什么 | 典型操作 | 主要风险 |
|---|---|---|---|
| Context Window 边界 | 当前一次模型调用可见的工作集 | prune、compact、重新装配 | 关键信息遗漏、摘要失真 |
| Durable Session 边界 | 可恢复的事件日志或产品会话 | resume、fork、clear、新建 session | 把持久日志误当成模型当前输入 |
| Work Phase 边界 | 规划、实现、验证等工作阶段 | checkpoint、handoff、验收门 | 阶段输出没有形成可验证契约 |
| Agent / Role 边界 | 不同执行者、上下文和权限域 | delegate、subagent、独立 evaluator | 委托信息不足、结果难以验证 |
这四种边界可以重合,也可以完全不重合。一次 compact 会改写当前工作集,却仍可能属于同一个产品会话和同一个工作阶段;一个新 Agent 可以接手下一阶段,也可以在同一阶段并行调查;同一会话还可能连续完成多个阶段。
因此,“切不切会话”只是表层操作。真正需要回答的是:
- 当前阶段以什么条件结束?
- 哪些状态必须保留,哪些内容可以重新获取?
- 下一执行者从哪里恢复事实、约束和证据?
- 恢复成功由什么检查证明?
Session 不是 Context Window
Anthropic 在 2026 年的 Managed Agents 文章里给出了一组很有用的区分:session 可以是一份追加式、可持久化的事件日志;Harness 决定从中选择和变换哪些事件,装配为模型当前看到的 context;文件、代码和进程则存在 sandbox 中。原文明确提醒,session 并不等于 Claude 的 context window。
把组件拆开后,结构如下:
这张图解释了两个容易误判的现象。
第一,创建新 context 不必删除旧 session。持久日志可以继续保留,用于恢复、审计和追溯;Harness 只是不再把全部历史送入当前工作集。Claude Code 的 /clear、/compact 和 session resume 也分别对应不同的状态操作。
第二,单会话并不意味着完整 transcript 永远驻留在窗口里。自动 compaction 可以在同一 durable session 内反复重写 active context。相反,新开 session 也不保证干净:如果恢复包把过期结论和大段日志重新灌入,新窗口仍然会被旧状态污染。
切分需要 Select,不是 Slice
一段 Coding Agent 历史里的信息有效期并不一致:
- 文件读取结果可能在文件被修改后过期,也可能仍是复现某个判断所需的原始证据。
- 项目约束可能贯穿整个任务,也可能只适用于某个目录或阶段。
- 实现决策已经落入代码,但被拒方案及其约束仍可能影响后续修改。
- 测试日志可以重跑,测试命令、环境和失败样例却需要保留。
- 临时推理通常不值得长期携带,其中的来源、反例和未决风险仍可能重要。
仍然需要的信息散布在历史各处,无法由一个连续区间表示。会话边界处理的是一项选择问题:
1 | |
这也是旧稿里“工具结果用完即失效”和“artifact 完成后推理价值归零”两个判断需要订正的地方。
工具输出能否丢弃,取决于它是否可重复获取、来源是否稳定、关键结论是否已经带着出处写入 durable state。生产故障现场、一次性 API 响应和外部页面快照不能一概清除。
决策落入代码之后,长篇探索轨迹通常可以退出工作集;决策依据却未必失效。架构决策记录之所以保留背景、备选项与后果,是为了让后续维护者知道结论成立的条件,以及何时应当重审。需要压缩的是推理轨迹,不是可追溯的理由。
越过边界的最小状态
一份可恢复的 handoff 至少要覆盖六类内容。
目标和边界
写清本阶段目标、完成状态、下一阶段目标,以及明确不在范围内的事项。只有目标而没有 scope,接手者容易顺手扩张任务。
Artifact 和版本
记录代码、Spec、计划、数据、进度文件的路径与版本。Git 任务应带分支、HEAD、工作区状态和相关提交,而不是只写“代码已经完成”。
决策和负空间
保留当前方案、关键理由、被拒方案和拒绝条件。负空间不需要复制所有讨论,但要足以阻止后续阶段在相同约束下重复走入死路。
证据和验证入口
记录已运行的检查、结果、环境和可重跑命令。长日志可以外置,handoff 保存结论与指针。没有验证入口的“已完成”不能作为可靠状态。
未决风险和权限
写出阻塞项、已知缺口、待确认假设、外部依赖以及新执行者是否拥有继续操作所需的权限。权限变化本身也可能构成必须切换 Agent 的边界。
下一步动作
下一步应当具体到可执行动作和停止条件。模糊的“继续优化”会迫使新 Agent 重新解释整个任务。
Anthropic 的能力演变:Reset 为何先必要,后来又被删除
Anthropic 2025—2026 年两代长程 Agent Harness 实验,为会话边界提供了一个很有价值的反例:reset 的效果不是固定属性,它取决于模型行为、上下文策略和外部状态协议的组合。
早期 Harness:用新 context 约束长任务
Anthropic 早期的长程 Coding Agent 方案把工作拆成 initializer agent 与后续 coding agent。每轮 coding agent 从新 context 开始,读取 feature list、progress 文件、Git 历史和当前代码,只完成一个功能,再写回进度并提交。
官方 quickstart 的循环也确实在每次迭代创建新的 client。其 coding prompt 明确要求 Agent 在 context 填满之前留下干净状态,供下一轮继续。
这个 Harness 同时做了多件事:
- 缩短单轮可见历史;
- 用固定启动指令重新强调小步交付;
- 通过新 Agent 降低旧路径依赖;
- 强迫进度、Git 和测试结果外化;
- 用下一轮冷启动检验 checkpoint 是否足够。
因此,早期实验可以证明“这套 reset + durable state 组合有效”,却不能把收益全部归因于新窗口的注意力位置。
Sonnet 4.5:Context Anxiety 使 Reset 成为补丁
Anthropic 2026 年复盘称,Sonnet 4.5 在接近它认为的上下文限制时会表现出 “context anxiety”:过早收尾、缩小目标,甚至把未完成工作包装成完成。该团队当时发现,仅靠 compaction 不足以获得强的长任务表现,周期性 reset 仍然关键。
关键变量是当时的模型会根据剩余 context 形成错误的完成压力,并非旧 token 本身“有毒”。Reset 改变了模型对任务时间和剩余预算的判断,也重新施加了每轮交付协议。
旧 prompt 中“在 context 填满之前结束”的要求,既能促使 Agent 留下可恢复状态,也可能放大这种提前收尾倾向。这一解释与公开材料一致,但属于机制推断,不是 Anthropic 发布的独立消融结论。
Opus 4.5:Reset 变成 Dead Weight
换成 Opus 4.5 后,同一团队观察到 context anxiety 基本消失,周期性 reset 反而成为额外负担。新 Harness 取消 reset,让 Agent 维持连续 session,并交给 Agent SDK 自动 compaction。
这项变化不能简化成“Opus 4.5 的长上下文更强,所以不需要阶段边界”。Anthropic 保留了大量边界机制:
- planner、generator、evaluator 仍然分工;
- 工作仍按 sprint 和 contract 组织;
- Agent 继续通过文件交换状态;
- Git 仍承担版本和恢复职责;
- 独立 evaluator 仍从外部验证结果。
消失的是周期性 transcript reset,保留下来的是工作阶段、职责边界、外部状态与验收门。
| 公开材料能够确认 | 合理但尚未独立证明 | 不能据此推出 |
|---|---|---|
| Sonnet 4.5 阶段 reset 对该 Harness 很重要 | reset 同时缓解了路径依赖和剩余预算焦虑 | 所有模型、所有任务都应周期性 reset |
| Opus 4.5 阶段取消 reset 后表现更好 | 更强的连续规划能力降低了冷启动收益 | 自动 compaction 永远优于 checkpoint |
| 新 Harness 仍保留 contract、文件、Git 和 evaluator | durable state 让连续会话更容易恢复 | 阶段边界已经不再需要 |
| Anthropic 把变化归因于模型行为改善 | 多项 Harness 改动共同影响了结果 | 已存在 reset 对照实验量化每个因素 |
截至 2026 年 7 月,公开文章提供的是工程观察和系统演变,没有发布严格的 reset / no-reset 定量消融。最稳妥的结论是:模型能力提升会改变最佳上下文策略,但没有消除状态外化与可验证恢复。
Lost in the Middle 不能直接证明新会话更优
《Lost in the Middle》在多文档问答和键值检索等任务上发现,模型使用长上下文信息时会受到位置影响,关键信息放在中部时常弱于头部或尾部。它提醒工程师不能把“放进窗口”当成“模型能稳定使用”。
这项结果不能直接证明:
- Coding Agent 的历史中段必然是低价值噪声;
- 把 handoff 放在新会话开头就能无条件提高信噪比;
- 任意模型、任意窗口占用率都有相同的首因和近因偏置;
- reset 的收益主要来自注意力位置变化。
后续研究还显示,位置偏差会随相对上下文占用和模型变化,Lost in the Middle 并非所有设置下都稳定出现。对 Coding Agent 更可靠的工程原则仍是 Anthropic 所说的“最小高信号上下文”:根据当前任务选择内容,测量恢复质量,而不是把某个位置偏差当成通用切分定律。
四种策略没有固定强弱顺序
Compact、连续会话、子 Agent 和 checkpoint reset 改变的是不同变量,不能只用“信息保留高、中、低”排序。
| 策略 | 保留局部连续性 | 隔离旧噪声 | 状态转移成本 | 适合场景 | 主要失败模式 |
|---|---|---|---|---|---|
| 连续会话 | 最完整 | 弱 | 低 | 同一目标下高耦合迭代 | 历史膨胀、旧路径锚定 |
| Compact | 依赖摘要策略 | 中 | 中 | 同一任务受窗口压力 | 细节丢失、摘要错误固化 |
| Subagent / Fork | 由委托方式决定 | 强 | 中到高 | 独立调查、专业化、并行验证 | prompt 漏项、返回结果不可验 |
| 新会话 + Checkpoint | 只保留显式状态 | 强 | 高 | 阶段完成、所有权变化、权限变化 | checkpoint 不完整、冷启动重复探索 |
普通 Claude Code subagent 从独立 context 开始,不继承父会话的对话历史、已读文件和已调用 Skill;它会得到委托 prompt、自身 system prompt、适用的项目规则、Git 状态和配置中预加载的 Skill。fork 是例外,会继承父会话历史。
Claude Code 还支持恢复 custom / general-purpose subagent 的已有会话;Explore 与 Plan subagent 则是一次性执行。把子 Agent 一概写成“每次调用都无状态”已经不准确。当前 Claude Code 也允许嵌套 subagent,最大深度为 5;这是版本化产品能力,不是 Subagent 的稳定本质。
边界由设计给出,触发由运行时证据决定
“切分点是设计的”不等于执行前必须锁死一个 turn 数或 token 百分比。设计阶段应定义退出条件和恢复契约,运行时再根据证据选择连续、compact、delegate 或 reset。
可观测的触发信号包括:
- 当前阶段的 artifact 已形成,并通过约定验证;
- 下一阶段的目标、权限或责任人发生变化;
- 窗口压力开始影响工具结果、Skill 或关键约束的保留;
- Agent 反复回到被否决方案,旧路径依赖明显;
- 任务已经漂移,当前历史与新目标的相关性很低;
- checkpoint 已经足以让冷启动执行者恢复;
- 安全边界要求把不同权限域隔开。
“无法用合理大小的文档描述阶段输出”只能作为诊断信号,不能直接证明阶段设计错误。有些高耦合任务确实依赖大量局部状态,更适合连续会话或 fork。边界质量最终要由恢复测试判断。
运行时状态机
边界操作应当冻结当前状态、验证、发出 checkpoint,再决定如何切换;不能先清空上下文,再回忆刚才做过什么。
这套顺序也解释了为什么“自动 compaction”与“checkpoint”不冲突。前者重写 active context,后者定义工作状态的事实源和恢复协议。可靠的 Harness 往往同时需要两者。
一份可执行的 Handoff Contract
Handoff 不必采用统一文件名,但字段应足以让新执行者恢复并自证。下面是一份可以直接裁剪的模板:
1 | |
YAML 只是载体,可定位性才是重点。每个结论都要能回到 artifact、版本或验证结果;每个未决问题都要有下一动作;每项权限都要清楚说明。
用冷启动恢复测试验收边界
边界是否设计成功,不应由 handoff 的字数或格式判断。最有效的检查是让一个没有旧 transcript 的执行者完成恢复:
- 只读取项目规则、checkpoint 和其中指向的事实源。
- 核对分支、HEAD、工作区和 artifact 状态。
- 重跑最小基线,确认 checkpoint 没有把失败状态写成成功。
- 复述当前目标、已完成事项、被拒方案、未决风险和下一步。
- 在不猜测隐含历史的前提下开始下一动作。
如果第 2 或第 3 步失败,问题在 checkpoint 的真实性;如果第 4 步需要猜测,问题在状态选择;如果恢复材料接近完整 transcript,阶段可能过度耦合,或者外部 artifact 还不够成熟。
这种冷启动检查还有一个额外价值:它把“上下文是否充分”从主观感觉变成可重复的 Harness 测试。早期 Anthropic Coding Agent 每轮从 Git、feature list 和 progress 文件恢复,本质上就在做这种检查。新 Harness 取消周期性 reset 后,仍通过文件、contract 和 evaluator 维持同一类可验证边界。
在上下文文章矩阵中的位置
本文承担的是“工作状态怎样跨越会话、阶段和 Agent 边界”这一层。相邻文章分别回答:
- 《Agentic Coding 上下文管理全景:Messages 数组的六种操纵策略》:append、truncate、prune、compact、externalize 与 replay 怎样改变历史。
- 《一次 AI Coding Agent Turn 的上下文生命周期》:单个 turn 内如何装配上下文、调用工具、触发 Hook 和写回结果。
- 《Context Paging:Compact、外部化、恢复与 Memory 生命周期》:有限工作集如何换入、换出和恢复。
- 《子 Agent 的本质:上下文隔离与专门化》:任务委托为何需要独立上下文,以及隔离的成本。
- 《LLM Harness 路线图》:整个上下文操作系统的总入口与阅读路径。
Messages 文章讲“历史能做哪些变换”,Context Paging 讲“工作集怎样管理”,Subagent 文章讲“执行者怎样隔离”。本文位于三者之间,定义何时进入下一工作状态,以及必须带走什么。
参考资料
- Anthropic:Effective harnesses for long-running agents
- Anthropic:Harness design for long-running application agents
- Anthropic:Managed agents
- Anthropic:Effective context engineering for AI agents
- Anthropic autonomous coding quickstart
- Claude Code:Manage context
- Claude Code:Manage sessions
- Claude Code:Create custom subagents
- Claude Code:Best practices
- Claude API:Context editing
- Lost in the Middle: How Language Models Use Long Contexts
- Context Is What You Need: The Effect of Context Position, Information Density and Retrieval Pattern on LLM Performance
- Martin Fowler:Architecture Decision Record
- LangGraph persistence

