K1.7.3 Task 1.7

Agent 无法检测过时数据:你必须决定 Resume 还是新建

Agent 对自己的对话历史无条件信任。如果一个文件在上次会话后被重写了,agent 缓存的 Read 结果还是旧版本——而且它没有任何信号知道有变化。检测过时数据是开发者的责任,不是 agent 的。

Agent 无法检测过时数据

一个开发者恢复了 3 天前的会话。Agent 建议从 auth.js 中提取一个函数——但 auth.js 两天前被完全重写了。Agent 分析的是旧版本,当作最新的来用,因为它的对话历史里存的是旧的 Read 结果。

Agent 没有”最后修改时间”对比,没有变更检测,没有文件新鲜度验证。它把自己之前的工具结果当作事实。

第一步:git diff

在决定 resume 还是新建之前,先查看有什么变化:git diff --stat HEAD~Ngit 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 无条件信任缓存数据,无法检测过时上下文。