后台 Agent 结束了,也未必轮到你

一次很长的编码 Agent 运行里可能有好几个工作者。如果监控把每一个结束的工作者都当成用户的前台回合,它会产生一串听起来可信、但都是错的提醒

这个失败很容易造出来。一个父会话让后台 Agent 去复审代码,工作者在父会话继续跑的时候结束了。两份记录里都可能有长得像完成的事件。一个只找最新 end_turn 的解析器会报告「需要用户」,哪怕主会话还在跑

Agent Island 在本地处理每一家受支持服务商的记录。过滤后台工作因此成了状态检测的一部分,而不是一个装饰性的通知设置 —— 因为在知道「是谁完成的」之前,监控没法给完成赋予含义

Claude 会把 sidechain 记录穿插进来

某些 Claude Code 的记录布局把后台流量放在单独的 subagents 文件里,更老的布局也可能把 sidechain 记录穿插进主记录

主回合解析器会跳过标了 isSidechain 的记录。看这个顺序:

{"type":"user","uuid":"u1"}
{"type":"assistant","uuid":"a1","message":{"stop_reason":"tool_use"}}
{"type":"assistant","uuid":"side1","isSidechain":true,
 "message":{"stop_reason":"end_turn"}}

后台工作者结束了,但主助手最后一条相关记录仍然写着 tool_use。前台回合仍在进行

反过来的情况同样要紧。主助手可能先结束,之后才收到一条尾随的 sidechain 记录。跳过 sidechain 流量时必须保住主完成,而不是让后面那一行把它藏掉。两种顺序都有测试钉死

独立的 Agent 记录同时按路径形状和记录内容分类。当前布局用 subagents 目录,更老的扁平布局可能用 agent-*.jsonl 这样的名字。除非用户明确打开子 Agent 提醒,扫描器会把这些记录排除在常规监控之外

选择打开之后,还需要一条不同的返回路径。子 Agent 并不拥有一个可恢复的顶层会话,所以它的提醒指回父会话 ID —— 这个 ID 从 Agent 记录里读,或者从目录布局推断。这样用户才能回到发起这项工作的那次对话

Codex 在会话元数据里标明来源

Codex 的 rollout 元数据带一个 source 字段。直接的交互式会话可能用 cli 这样的值,自动化可能用 execmcp,派生出来的工作者可能带一个结构化的 subagent 来源

扫描器在做状态解析之前先给每份 rollout 分类:

交互式  -> 参与常规状态与轮到你了提醒
子 Agent -> 除非打开子 Agent 提醒,否则忽略
自动化   -> 永远不当成用户的回合

originator 是第二道闸门。Codex 家族的 originator 可能代表用户自己的会话;而一个外来的编排器或 codex_exec 就是自动化,哪怕另一个字段看起来像子 Agent。这个优先级防止某个宿主应用为它的内部探针造出面向用户的提醒

向后兼容需要一条明确的策略。更老的 Codex 记录可能没有 source;当 originator 不与该假设矛盾时,扫描器把这些当成交互式。把所有旧记录一律丢掉确实能避免误报,但那是靠让监控变瞎换来的,不是一个划算的交易

分类必须发生在聚合之前

活动监控最终会把很多会话归约成每家服务商一个可见状态。后台过滤必须发生在这次归约之前。一旦某个工作者的完成被并进了服务商层面的 needsYou,那个用来纠错的身份就已经丢了

因此监控扫描会先把近期会话分开、给它们的来源分类、算出各自的回合状态,然后才选出服务商状态和活跃线程。文件事件可以触发一次快速重扫,周期扫描则覆盖那些被漏掉的监听事件

这个设计也让通知规则保持可理解。常规提醒只回答一个问题:用户自己的交互式会话需不需要处理。子 Agent 提醒是另一种需要主动打开的行为,有自己的标签和指向父会话的去处

测试用例就是那份合同

Windows 的测试套件包含这些用例:Claude sidechain 穿插的完成、主完成之后尾随的 sidechain 流量、Agent 记录的结束、必须保持运行中的普通工具结果、Codex CLI 会话、缺失的旧式 source、结构化子 Agent、内部工作、exec 运行,以及外来 originator

这些例子比测一个顺利路径的文件有用得多。它们描述的是「用户回合」与「机器扇出」之间的边界。当上游记录格式变动时,这些测试会指出哪些行为必须在解析器改动中活下来

公开的 v1.6.1 版本包含 macOS 与 Windows 构建。这确认了本文讨论所依据的已发布产品基线。平台产物并不能证明每一条运行路径的行为完全一致,所以本文不会仅凭发布元数据就声称完整的行为对齐

一个完成标记在被挂到正确的行为主体之前,对用户没有任何含义。前台会话、后台工作者和自动化运行是不同的来源,哪怕它们最后一行看起来一模一样。先给来源分类,再决定要不要打断谁