本文经原作者授权转载,版权归原作者所有。原作者:马东锡 NLP(@dongxi_nlp)。
Harness 系列文章之 6,关于 context management。
在 coding agent的世界里,昨日的重现,就是将昨日重要的事情映射到今天。
A transcript records what happened. Context decides what matters now.

每个 coding agent 最后都会遇到同一个问题: session 会越来会长。
Model 读过文件,跑过命令,搜过日志,改过代码,收到过 validation output,也回答过旧问题。
这些 context 如何管理?
The Naive Append Loop

最直觉的做法很简单,append transcript。但其实这是 context flooding。
一开始,model 似乎更聪明,因为它能看到更多。
很快就会遇到问题:
- 旧 tool output 会和当前 evidence 竞争
- 巨大的 shell log 会淹没下一条 instruction
- retry message,partial read,旧 plan,stale summary 全部挤在一个不断变大的 blob 里
The Multi-Turn Loop

比 Naive Append Loop 更成熟一点的是 5 phase loop,这部分放在文章的末尾。
The Core Split
成熟的 Harness 会把三件事分开:

- Durable log 应该完整和简洁,它服务 resume,audit,evals 和 debugging。
- Model-visible context 应该被选择,是 model 为下一步行动需要看到的视图。
- app state 应该结构化。它不能依赖旧 transcript text 是否还在 prompt 里。
在此,我们定义出了projection:
Projection means to turn the full history into the small, relevant view the model needs for the next step.
这对应了这篇文章的标题:
Context Is A Projection
Projection Happens Before The Model Call
Context management 应该发生在 model call 之前。
Harness projection pipeline:

- 先从完整 session log 开始,这是 source of truth
- 再看 context pressure:下一轮回答,tool use,evidence 还需要多少 context 空间
- 保留最近几轮 verbatim,因为这里通常放着当前任务
- 大的 output 变成 preview,完整内容留在 prompt 外
- 已完成的旧片段做显式 summary
- 注入当前 app state:changed files,validation,goal,tasks 和 fresh evidence
Four Projection Moves

每个动作解决 context management 中面临的不同问题
Large-Result Preview
有些 tool result 太大,不适合在每个 turn 原样放进 context。
例如:
- test logs,grep output
- generated files, web fetches
- dependency trees
弱 Harness 会随机截断,更强的 Harness 则会把完整结果放到别处,然后在 model-visible context 里放一个稳定 preview。

Model 得到足够继续工作的 evidence。
Harness 保留足够的 metadata,用来 resume,inspect,或者重新加载完整结果。
Idle-Gap Microcompact
有些 context 因为时间过去而变得不那么重要。
比如用户吃完午饭回来,或者 session 空闲了一夜。
最新 goal 仍然重要,最近几次 edit 仍然重要。
很久以前的重复 read 和 command output,未必重要。
microcompact 是一个小动作:

Old-Span Collapse
有时一整段 messages 已经完成使命,Harness 可以把这段折叠成 summary。但 summary 应该显式存在:

Model 知道 collapse 发生过,用户可以检查保留下来的内容。
resume 可以围绕 compact boundary 重建 conversation,而不会把 summary 当成一条随机的新 user message。
Auto-Compact Near The Limit
当 context pressure 很高时,Harness 应该在 model call 失败前 compact。
好的实现不能只写一句 "if too long, summarize"。

它需要:
- warning thresholds:提示用户 context 还剩余多少百分比
- hard blocking thresholds:超过限制前需要block model call,要求 compact 后再继续
- recursion guards:防止 compact 又触发新的 compact
- restored attachments or state blocks:compact 后重新加入attachments、file state、validation、goal 和 tasks。
auto-compact 要保护下一轮,同时保留继续工作所需的 evidence。
The Multi-Turn Loop

context 的管理,在 Multi-turn Loop 中尤其重要。
一个 Multi-turn Loop 大概如下,分为 5 个 phase:

在 loop 中,The next turn 从 committed runtime state 开始。
Phase 2 context projection 负责生成 model-visible view。
Phase 5 负责提交变化,让下一轮从真实的 runtime state 开始。
从 model call 开始,coding agent 的世界状态发生了变化,划分成了昨天和今天。
Model 不需要整个过去,它需要正确的过去、当前 state,以及足够支持下一步的 evidence。
Harness Context management 就是管理和决定 model call 看到的 selected view。