监控 Claude Code、Codex 或其他 AI 编程 Agent 时,最危险的做法不是少显示一个状态,而是把证据和结论混为一谈。进程存在、文件更新、Hook 被触发,都只是证据;它们本身不等于“正在工作”或“已经完成”。
一套可复用的模型需要七个主状态:inactive、running、waiting_for_user、completed、blocked、stalled 和 unknown。这套分类描述的是当前运行状态,不评价代码是否正确,也不等于项目管理意义上的任务完成。
七种状态分别需要什么证据
| 状态 | 最低证据 | 不能由此推出 |
|---|---|---|
inactive | 没有当前回合的有效活动证据 | 会话已被主动关闭 |
running | 当前回合出现新的开始、流式输出或工具调用 | 正在产生有用结果 |
waiting_for_user | 明确而新鲜的权限、澄清或输入请求 | 用户尚未在别处回答 |
completed | 当前回合有终止事件,且未被后续活动覆盖 | 代码正确或整个任务结束 |
blocked | 认证、额度、策略或执行错误阻止继续 | 故障永久存在 |
stalled | 此前正在运行,随后超过明确的静默阈值 | 进程已崩溃 |
unknown | 证据缺失、冲突、不受支持或已经过期 | 什么都没发生 |
把原因、置信度和新鲜度留在状态之外
权限请求、认证失败、限流、网络错误是状态原因,不应膨胀成几十个顶层状态。每条状态记录可以附带 reason、证据时间、置信度、注意级别、回合标识和来源。这样界面可以显示“受阻:需要重新认证”,底层模型仍然保持稳定。
证据冲突时的优先级
- 当前回合的明确语义事件,例如权限请求、终止事件或结构化错误。
- 时间更晚、足以覆盖旧结论的用户或 Agent 活动。
- 相互关联的进程与会话活动。
- 没有语义时间时才使用文件修改时间。
- 静默推断只能支持“停滞”,绝不能伪造“完成”。
同一个完成事件被重复读取,不应产生两次提醒;更晚的用户消息出现后,旧的“已完成”也必须撤销。这就是回合标识和单调时间推理存在的意义。
参考迁移逻辑
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 项测试
- 新回合不继承旧回合的完成状态。
- 重复事件只提醒一次。
- 后续活动覆盖旧完成状态。
- 权限请求与普通完成分开。
- 结构化错误进入受阻状态。
- 静默不会被解释成成功。
- 重启后能从持久证据恢复。
- 多个会话互不覆盖。
- 未来时间或时钟偏差有降级策略。
- 截断记录不会让扫描器崩溃。
- 旧提醒会过期。
- 明确验证原始会话数据的读取、保留和传输边界。
Agent Island 如何使用这套模型
Agent Island 在本机读取 Claude Code 和 Codex 已有的会话记录,把底层差异归一成少量用户可理解的状态。会话内容不上传到 Agent Island 服务。想继续追踪一个具体转折,可阅读为什么完成事件不等于会话状态;想比较采集方式,可阅读Hooks 与持续监控的差别。
引用方式
建议引用:Tristan Tang,《AI 编程 Agent 会话状态:七状态分类与测试清单》,Agent Island,2026-07-20。定义只会在跨来源无法一致验证时调整;供应商特有事件名属于实现说明,不进入通用定义。