$ cat zh/blog/ai-coding-agent-session-state-taxonomy

AI 编程 Agent 会话状态:七状态分类与测试清单

可靠的监控器应区分未活动、运行中、等待用户、已完成、受阻、停滞和未知,并让每个判断都能追溯到新鲜证据。

监控 Claude Code、Codex 或其他 AI 编程 Agent 时,最危险的做法不是少显示一个状态,而是把证据和结论混为一谈。进程存在、文件更新、Hook 被触发,都只是证据;它们本身不等于“正在工作”或“已经完成”。

一套可复用的模型需要七个主状态:inactiverunningwaiting_for_usercompletedblockedstalledunknown。这套分类描述的是当前运行状态,不评价代码是否正确,也不等于项目管理意义上的任务完成。

七种状态分别需要什么证据

状态最低证据不能由此推出
inactive没有当前回合的有效活动证据会话已被主动关闭
running当前回合出现新的开始、流式输出或工具调用正在产生有用结果
waiting_for_user明确而新鲜的权限、澄清或输入请求用户尚未在别处回答
completed当前回合有终止事件,且未被后续活动覆盖代码正确或整个任务结束
blocked认证、额度、策略或执行错误阻止继续故障永久存在
stalled此前正在运行,随后超过明确的静默阈值进程已崩溃
unknown证据缺失、冲突、不受支持或已经过期什么都没发生

把原因、置信度和新鲜度留在状态之外

权限请求、认证失败、限流、网络错误是状态原因,不应膨胀成几十个顶层状态。每条状态记录可以附带 reason、证据时间、置信度、注意级别、回合标识和来源。这样界面可以显示“受阻:需要重新认证”,底层模型仍然保持稳定。

证据冲突时的优先级

  1. 当前回合的明确语义事件,例如权限请求、终止事件或结构化错误。
  2. 时间更晚、足以覆盖旧结论的用户或 Agent 活动。
  3. 相互关联的进程与会话活动。
  4. 没有语义时间时才使用文件修改时间。
  5. 静默推断只能支持“停滞”,绝不能伪造“完成”。

同一个完成事件被重复读取,不应产生两次提醒;更晚的用户消息出现后,旧的“已完成”也必须撤销。这就是回合标识和单调时间推理存在的意义。

参考迁移逻辑

if evidence is missing or contradictory: unknown
if fresh blocker exists: blocked
if fresh user action is required: waiting_for_user
if fresh terminal event is not superseded: completed
if execution activity is fresh: running
if a running turn exceeds the silence threshold: stalled
otherwise: inactive

至少要跑的 12 项测试

  1. 新回合不继承旧回合的完成状态。
  2. 重复事件只提醒一次。
  3. 后续活动覆盖旧完成状态。
  4. 权限请求与普通完成分开。
  5. 结构化错误进入受阻状态。
  6. 静默不会被解释成成功。
  7. 重启后能从持久证据恢复。
  8. 多个会话互不覆盖。
  9. 未来时间或时钟偏差有降级策略。
  10. 截断记录不会让扫描器崩溃。
  11. 旧提醒会过期。
  12. 明确验证原始会话数据的读取、保留和传输边界。

Agent Island 如何使用这套模型

Agent Island 在本机读取 Claude Code 和 Codex 已有的会话记录,把底层差异归一成少量用户可理解的状态。会话内容不上传到 Agent Island 服务。想继续追踪一个具体转折,可阅读为什么完成事件不等于会话状态;想比较采集方式,可阅读Hooks 与持续监控的差别

引用方式

建议引用:Tristan Tang,《AI 编程 Agent 会话状态:七状态分类与测试清单》,Agent Island,2026-07-20。定义只会在跨来源无法一致验证时调整;供应商特有事件名属于实现说明,不进入通用定义。