Agent 对自己的对话历史无条件信任。如果一个文件在上次会话后被重写了,agent 缓存的 Read 结果还是旧版本——而且它没有任何信号知道有变化。检测过时数据是开发者的责任,不是 agent 的。
Agent 无法检测过时数据
一个开发者恢复了 3 天前的会话。Agent 建议从 auth.js 中提取一个函数——但 auth.js 两天前被完全重写了。Agent 分析的是旧版本,当作最新的来用,因为它的对话历史里存的是旧的 Read 结果。
Agent 没有”最后修改时间”对比,没有变更检测,没有文件新鲜度验证。它把自己之前的工具结果当作事实。
第一步:git diff
在决定 resume 还是新建之前,先查看有什么变化:git diff --stat HEAD~N 或 git log --oneline --since="yesterday"。花 30 秒,能省下基于过时分析的几小时白干。
四场景决策矩阵
| 场景 | 代码变了? | 焦点变了? | 策略 |
|---|---|---|---|
| A:同一分支,0 变更,同一焦点 | 没有 | 没有 | Resume(上下文完全有效) |
| B:同一分支,3 个无关文件变了 | 少量 | 没有 | Resume + 通知(“utils.js 修改了,tests/new.js 新增了——重新分析这两个”) |
| C:另一个分支合入,30 个文件变了 | 大量 | 没有 | 新会话 + 注入摘要 |
| D:同一分支,0 变更,不同焦点 | 没有 | 是 | 新会话 + 注入摘要(旧焦点的详细分析可能给新方向带来偏差) |
上下文有效性取决于什么变了(代码和焦点),不是时间。一个大型 merge 后 2 小时的会话就过时了;什么都没变的 3 天前的会话还是有效的。
注入的摘要:是洞察,不是数据
在变更后开始新会话时,注入之前发现的摘要。包含:
- 架构理解 — 模块边界、依赖模式
- 已识别的优先级 — 哪些区域需要关注以及为什么
- 关键决定 — 做了什么决定以及推理
- 跟踪的问题 — 正在监控的已知问题
不要包含:
- 文件内容 — 它们过时了,强制 agent 重新读取当前版本
- 工具结果 — 之前会话的过时 Read/Grep 输出
- 具体行号引用 — 行号可能已经偏移
摘要传递的是洞察,同时强制对具体内容做新的工具调用。
增量变更处理
50 个已分析的文件中变了 2 个。Resume + 定向通知:
“上次会话以来,utils.js 被修改了(第 42 行 bug 修复)和 tests/new-test.js 被新增了。请重新分析这两个文件并更新你的发现。”
Agent 保留 48 个文件的有效分析(省了大量时间),同时专门刷新 2 个变更文件。这对小变更是最优的——比新建会话高效得多。
每日 CI:每天新会话 + 摘要
一个 CI 工作流在持续演进的代码库上每日分析。模式:
- 每天:新会话 + 注入昨天的关键发现、跟踪问题和分析优先级的摘要
- 摘要提供连续性(昨天的洞察指导今天的优先级)
- 新会话确保新鲜度(所有工具调用读取当前代码)
总是恢复昨天的会话有隔夜变更让工具结果过时的风险。总是新建又丢失了累积的理解。摘要桥接了两个约束。
“总是 resume”谬误
“总是 resume——如果 agent 遇到过时信息,它会发现差异的。”
错了。Agent 不会检测自己缓存数据中的差异。它把旧文件内容当作最新的来分析。一个被重命名的函数、一个被拆分的模块、一个被移除的依赖——agent 引用旧版本却不知道它们变了。
一句话总结: 决定前先查 git diff:没变化 → resume,少量变化 → resume + 通知,大量变化或焦点转移 → 新会话 + 只注入洞察的摘要(不要注入文件内容)。Agent 无条件信任缓存数据,无法检测过时上下文。