Agent 工程对照
← 返回周报

2026-W39

Codex 把「打断」按来源分开:用户输入立刻抢占当前响应,其他 Agent 发来的消息可以等到下一次请求

本周落点

本周综述

Codex 这周在同一个回合循环里加了两个方向相反的开关,都默认关闭。instant_interrupt 让用户新输入立刻打断请求准备、流式响应和重试退避,连正在跑的 code-mode exec/wait 也先把 cell 编号交回来、cell 本身继续运行;defer_mailbox_preemption 则反过来,让其他 Agent 发来的消息不再在推理或评论边界切断采样,而是等本次响应把计划中的工具调用发完,再和工具结果一起进入下一次请求。两者合起来是一条按来源区分的抢占策略:人的输入优先级高于正在进行的计划,Agent 之间的消息低于它。多 Agent 场景里「谁有权打断谁」过去往往只有一种答案,这里第一次被拆成两个可独立开关的规则。

展开完整综述

抢占是有代价的,提交里写得很清楚:被打断后要重置 WebSocket 连接与续接状态,下一次请求发送全量历史,已经完成的评论保留、未完成的助手文本丢弃。同一周 Codex 又给空闲线程加了带历史的预热,用 generate: false 提前准备响应,下一回合的 prompt 若是这段历史的延伸、且请求设置一致就直接复用。一边主动丢掉续接,一边提前铺好续接,说明它把前缀与连接复用当作要按场景取舍的资源,而不是一个默认永远成立的前提。

Codex 的多 Agent 通信也在往外长。原先矩阵里 Codex 那一格的立场是「消息是协议里的一等条目,带收件人和唤醒开关」,这周在同一个 AgentMessageBoard 接口下补了内存后端(给不能建 SQLite 的临时会话用,同一棵 Agent 树共享、最后一个句柄释放时回收)和远程 HTTP 客户端(鉴权、请求去重、SSE 通知校验)。点对点的信箱之外,多了一个有频道、订阅和搜索的共享面板,而且存储位置可替换。Guardian 那条线仍在继续:审查记录在父会话压缩、恢复与回滚之后保留独立的证据转写,与 W35、W38 的方向一致。

openJiuwen 这周的两处改动指向同一个定位:把 Claude Code、Codex 和 dsh 这些外部 CLI 当作可调度的 Harness 后端。一处是技能随专家团成员下发——整包复制进各家 CLI 自己扫描的项目目录(.claude/skills、.agents/skills、.dsh/skills),加载和调用完全交给目标 CLI;另一处是修正对 Claude Code 调用的观测配对,避免 CLI 自己发起的旁路请求把会话请求的时间线打乱。三家 CLI 的技能目录能被同一套复制逻辑覆盖,说明 SKILL.md 目录形态已经足够统一,可以当作跨 Harness 的交换格式来用。

Pi 发了 v0.87.0 与 v0.87.1,可读的结构性改动在 durable 包:记录 ID 改成带品牌的类型,会话必须显式声明无主还是归属某个任务,任务的会话归属创建后不可改。DeepSeek Harness 从 0.1.7-alpha.1 走到 0.1.7-rc.2,本周能读到的改动多在 PTY 就绪判定与 Web 客户端,没有触及矩阵里的核心机制。

工程解读

Codex:用户输入可以立刻打断,Agent 消息可以选择等

改了什么
两个默认关闭的特性开关。instant_interrupt:为每次采样请求监视排队的用户输入,把共享的抢占信号传给 code-mode 的 exec 和 wait,让它们提前交回正在运行的 cell 编号而不停止 cell;同时在请求准备、流式响应和重试退避阶段直接中断,带着排队输入继续本回合,并重置 WebSocket 连接与续接状态,下一次请求发送全量历史。defer_mailbox_preemption:其他 Agent 的消息在响应过程中到达时,采样越过推理和评论边界继续,排队消息与已完成的工具结果一起进入下一次模型请求。
为什么改原文说明
提交正文写明了原因:长时间运行的 exec 或 wait 期间排队的用户输入要等调用返回才会被处理;开启 instant_interrupt 后新输入不应再等未完成的响应或重试退避。另一方面,Agent 消息在响应中途到达时会在推理或评论边界打断采样,把剩下的工具调用截掉,所以提供延后抢占的选项。
对开发者的影响
用 Codex 做多 Agent 编排的团队,可以把两个开关组合成「人优先、Agent 次之」的抢占规则;开启 instant_interrupt 要预期被打断后的那次请求走全量历史、不复用续接,长会话下首个请求的开销会上升。自建 Harness 可以借鉴的是按消息来源分别定义抢占策略,并让长时间运行的工具调用支持「交回句柄、继续后台执行」,而不是只有等完或杀掉两种选择。

openJiuwen:技能整包复制给外部 CLI,加载交给对方

改了什么
专家团可以接入第三方 CLI 成员。manifest 的 SkillSpec 可指向技能包或技能库,启动 SDK 之前按最终工作目录把整个技能包(含脚本、资源、隐藏文件与可执行位)复制进目标 CLI 的项目扫描目录:claudecode 用 .claude/skills,codex 用 .agents/skills,dsh 用 .dsh/skills。同名冲突按目录名和 SKILL.md 的 name 不区分大小写比较,策略有 skip(默认,保留旧的)、replace(先在临时目录完整复制再切换,失败回滚)和 append(新建 name-2 等目录并改写副本里的名字,专家团外部成员默认用这个)。越界、循环的 symlink 与非普通文件拒绝复制;复制结果是项目文件,停止后保留,不改用户 home。
为什么改编辑推断
提交信息只有 PR 模板,没有说明原因。随提交入库的特性文档 F_101 给出的定位是:技能是可迁移的文件能力,不再属于第三方 provider 会拒绝的 DeepAgent 扩展项,因此不模拟 DeepAgent 的工具协议,加载与调用完全交给目标 CLI。据此推断,目的是让同一份技能在自有 Agent 与外部 CLI 成员之间复用,而不必为每家 CLI 各写一套注入方式。
对开发者的影响
用 openJiuwen 编排 Claude Code 或 Codex 成员时,技能会落进项目目录并在任务结束后保留,项目里原有同名技能在默认策略下不会被覆盖,需要更新时要显式选 replace;Claude 走 SSH 或自定义传输时配置技能会直接报错。自建 Harness 若要调度外部 CLI,可以借鉴这种做法:把技能当文件交付给对方的原生加载机制,而不是改写对方的系统提示。
openJiuwen

openJiuwen:观测 Claude Code 时按调用用途配对,避免 CLI 旁路请求搅乱时间线

改了什么
openJiuwen 通过 Claude Code 的请求体日志和遥测重建每次模型调用。对第三方端点,CLI 不在请求 span、计费日志和请求体日志上写 API request id,此前只能按时间窗口把响应体配给 span。现在 span 与日志两侧都读 query_source(span 上叫 query_source_safe),只有用途相同时窗口才算匹配,计费日志也按同一用途找最近的响应体。另一处修正:续接调用的 system 字段只带计费头,此前把「字段存在」当作「提示词被清空」,导致提交的上下文窗口里记录了系统消息在回合中途被移除;现在按实际内容判断。
为什么改原文说明
提交正文写明了原因:CLI 会在会话调用之外自己发起调用(例如给会话起标题),这些调用时间上重叠,第一次会话调用抢到了起标题请求的窗口,报出的开始时间早于自己的请求,整个回合的推理顺序随之错乱,系统提示也在其中。测试夹具此前既没有 query_source,也假设续接调用完全不带 system,与真实 CLI 日志不符,所以旧规则看起来是对的。
对开发者的影响
用 openJiuwen 的 claudecode provider 采集轨迹的团队,升级后回合内的调用顺序、首 token 延迟和成本归属会更准确,之前采集的数据可能存在错配,拿来做评估前值得抽查。自建 Harness 观测外部 CLI 时,按时间窗口或到达顺序配对都不可靠,要找对方明确写出的字段(这里是调用用途)做配对键,测试夹具要用真实日志的形状。

Pi:durable 运行时的记录 ID 改为带品牌的类型,会话必须声明归属

改了什么
Pi 的 durable 包(Pico 运行时,提供会话、任务、文档记录与内存、JSONL、SQLite 三种存储)把原来统一的数字 Id 换成按种类加品牌的类型:ConversationId、EntryId、TaskId<Result>、SubmissionId、DocumentId,提交序号 Seq 单独加品牌,Storage 提供泛型的 mintId()。创建会话必须显式给出归属,要么无主,要么属于某个任务;任务的会话归属在任务创建后不可再改。createConversation 与 forkConversation 分成两个入口。
为什么改编辑推断
提交信息没有说明原因,只有一行标题。从改动看,原先所有记录共用一个 number 类型,会话 ID 与条目 ID 可以互相传错而编译不报错,归属关系也可以事后改动;加品牌与不可变归属是把这两类错误挪到类型检查和创建时刻。这是推断,需下周看是否有设计文档说明。
对开发者的影响
直接依赖 pi-durable 的代码需要改签名:会话创建时的归属声明、TaskRef 包装换成 TaskId、create 与 fork 拆成两个入口,都是破坏性变更,CHANGELOG 已列出。自建 Harness 的会话存储可以借鉴两点:用零运行时开销的品牌类型区分不同实体的 ID,以及让子会话对父任务的归属在创建时确定、之后不可变,免得恢复和清理时出现孤儿记录。
影响到的格子(3 条说明)
采集到的提交与发布
openJiuwen51 提交 · 0 release · 438 ★

值得注意的提交

  • 9e33901feat(agent-teams): The expert team has connected with the third-party agent.
  • 1c419e9!2995 merge dev/swarm/room-mode into develop
  • 8bfcf1ffix(providers): isolate online rail observability and clear lint warnings
  • 0700637fix(claudecode): keep a call from claiming a window the CLI opened for itself
  • 86c5f4efix(claudecode): a continuation states the billing header, not an empty prompt
  • 6628f1cfix(claudecode): pair request spans that state no API request id
Codex100+ 提交 · 27 release · 126,822 ★

值得注意的提交

  • 659b35fPreserve punctuation and semicolons in Mermaid labels (#48814)
  • 3f4668dAdd history-aware prewarming for idle threads (#48812)
  • 99f7758Show short turn durations in TUI completion footers (#48807)
  • d9487a2Allow transcript wheel scrolling while a modal is open (#48805)
  • abc8f0cUse the terminal palette for ordered Markdown list markers (#48800)
  • 4c8cf39Fix SGR mouse reporting for Windows terminal capture (#48799)
DeepSeek Harness100+ 提交 · 4 release · 237,942 ★

值得注意的提交

  • 76a2b7afix(pty): apply the tail grace only while the tail can still complete
  • 3693c2bfix(pty): bound the wait for a seen prompt marker's printable tail
  • 62ac572test(web): correct the states the new comments and note name
  • ffbd9e3fix(ui-conversation): translate Agent as 智能体 in zh tool copy
  • 1c0234etest(boot): isolate plugin-manager Git children from host command-line config
  • 751724ctest(web): drop the obsolete settled-title wait from the steering scenario
Pi83 提交 · 2 release · 109,827 ★

当周 release

值得注意的提交

  • 6f75515fix(ai,coding-agent): update Fireworks tests and default for removed models
  • 2b0a123feat(coding-agent): remove themes section from startup banner
  • bf8e4b9feat(coding-agent,tui): System theme (#10067)
  • 04b5badfeat(durable): add typed IDs and explicit ownership
  • a6ca861fix(ai): price OpenAI Fast mode service tier like priority
  • ab30693fix(ai): upgrade openai SDK to 7.19.0 (#10044)

每家最多列 6 条代表性提交,已去掉合并、版本号与纯文档提交。

观察名单

观察名单

这几个项目出现在周报里,但还不在对照矩阵中。

Claude Agent SDKAnthropic
15 提交 · 8,176 ★

Anthropic 把 Claude Code 的 Harness 能力下放为可编程 SDK,是「Harness 作为库」这条路线的参照系。

最近一次 release(不限当周):v0.2.160(2026-09-25)

同族的 anthropics/claude-agent-sdk-typescript 只有 examples/scripts/CHANGELOG,属发布仓,不单独采集。