Agent 工程对照
← 返回周报

2026-W38

openJiuwen 这周补的不是新功能,是自改进闭环里两处「轨迹靠不住」的老账

本周落点

本周综述

openJiuwen 这周的两次修复看似互不相关,合在一起讲的是同一件事——rsi/evolution 这条自改进闭环,能不能拿到「干净、按时到达」的数据。一处是 evolution 消息重建从「猜文本重叠」换成「认 context window 的提交记录」,修的是数据本身脏不脏(一次 chat-tool-chat 轨迹此前被数出七条消息而不是四条,下游评估器一直在重复样本上训练);另一处是 evolution rail 的钩子因为执行顺序问题,从未在 AFTER_TOOL_CALL 条件下真正触发过,修的是数据到不到得了。上周本站记录 openJiuwen 给 LLM 裁判配了刚性评分契约,这周接着往上游走——评估端管住了「怎么打分」,这周补的是「喂给评估器的轨迹本身干不干净、送不送得到」。放在一起看,是同一条自改进流水线在自己纠正自己的输入质量,而不是往外扩功能。

展开完整综述

Codex 这周的 Guardian 证据保留是另一种「信任」问题——不是自己给自己的数据,而是给用户的承诺。压缩和重启原本各管一层上下文表示,这次改动明确了一条新规则:用户已经确认过的限制和答案,即便底层的上下文表示因为压缩或重启换了形状,也不能跟着消失,除非有兼容的新 checkpoint 顶上。这类「某些状态的生命周期必须比常规恢复机制活得更久」的设计,值得记进本站关于中断恢复的结论——目前的矩阵条目还没覆盖到这种「审查证据独立于历史重放窗口存在」的情况。

Pi 把系统提示词和工具变化写进 transcript,表面是个小改动,实际上补的是「会话是一棵树」这个既有设计的一个漏洞:如果分支节点只记消息、不记运行时配置,那么恢复到某个历史分支时,读到的系统提示词和工具集合会是「现在」的,而不是「创建那个分支时」的。openJiuwen 的评估契约、Codex 的证据保留、Pi 的配置入 transcript,三家这周都是在往自己已有的核心结构上打补丁,而不是新增结构——没有出现新的维度级设计分歧,更多是把已知设计里没兜住的角落补上。

反差在 DeepSeek 这边。这周它在采集窗口内的可读改动几乎全部集中在 Web/Desktop 客户端——侧边栏浏览器、计划卡片预览、Markdown 文件链接——没有一条触及本站追踪的 15 个维度里任何一格的核心机制。不确定这是巧合还是团队在这个迭代周期刻意把力气放在产品打磨上,需要下周继续观察是否只是采样窗口偶然落在一个客户端冲刺周。

工程解读

openJiuwen:evolution 消息重建放弃文本对比,改认 context window 的提交记录

改了什么
trajectory_to_messages 原来靠「最长文本重叠」把每次请求的 prompt 与历史合并;工具消息与自己的记录从不文本重叠——span 保留的是能力结果信封,模型看到的是其内容,prompt 复述时不带名字,一边是 JSON 字符串一边是 dict。一次 chat-tool-chat 轨迹被数出七条消息而不是四条,下游所有 evolution 消费者都在重复数据上训练。现在消息改由可观测层提交的 context window 产生:每次请求贡献其重放窗口,已贡献过的消息按 message_id 识别而非按内容;补全按模型产出并确认的样子保留,工具结果取模型当时看到的内容并保留 span 名字;没有提交窗口的请求原样贡献 prompt 并标记 missing_context_window,不再猜重叠;压缩请求不贡献内容;project_trajectory_messages 把问题连同消息一起返回。
为什么改原文说明
提交信息本身写明了原因:旧的最长文本重叠算法在工具消息上系统性失效,导致轨迹被重复计数,下游评估与自改进消费者都在脏数据上训练。
对开发者的影响
用 openJiuwen 的 evolution/RSI 训练或评估消费轨迹数据的团队,升级后重复消息会消失,过去在重复样本上训练或校准过的评估器可能需要重新核对。这是 BREAKING CHANGE——没有 context.window.commit 事件的旧轨迹不再产出去重后的消息。自建 Harness 若也用轨迹重放做自改进,这里的教训是:合并历史时要用可追踪的提交标识(message_id),而不是靠文本相似度猜测。

openJiuwen:evolution 钩子被自己的执行顺序坑了,改法是读者搬家而不是生产者搬家

改了什么
同一个钩子的回调按优先级从高到低执行,after_* 钩子也不例外。可观测性 rail(优先级 10)在自己的 after_tool_call 里结束工具 span,而所有 evolution rail(优先级 60 以上)会在此之前先排空自己的订阅——排空时永远拿不到已结束的工具 span,报 missing_required_span,配置了 AFTER_TOOL_CALL 触发条件的 EvolutionRail 从未真正触发过。修复新增 AgentRail.callback_priority(event),让 rail 可以为单个事件单独声明钩子位置,EvolutionRail 把 after_tool_call 注册在极低优先级(- 1_000_000),即所有生产者之后。
为什么改原文说明
提交信息写明了权衡过程:抬高可观测性 rail 的优先级不可行,会把它的 invoke/iteration 钩子排到 Team rail 之前(后者要为它停放 span 装饰),也会让它在 security、browser runtime 等其它 after_tool_call 回调改写工具结果之前就记录结果;框架级 AFTER 钩子也不行,因为它在整条链(包括 evolution 排空)之后才跑,问题依旧。
对开发者的影响
自定义了 rail 优先级并挂了 after_tool_call 钩子的团队,可以用新增的 AgentRail.callback_priority(event) 为不同事件单独声明钩子位置,不必再动整体注册顺序。自建 Harness 的教训:多个钩子共享同一个执行阶段时,谁先谁后不是无所谓的实现细节,而是契约的一部分,需要显式声明,不能靠注册顺序隐式决定。

Codex:压缩和重启不能把 Guardian 已验证的证据一起冲掉

改了什么
会话被压缩或重启后切换到新模型时,原有 checkpoint 可能与新选的 Guardian reviewer 不兼容。这次改动让「保留的用户证据」独立于 Guardian 究竟在审查旧 transcript 还是父上下文而暴露出来;在恢复和远端压缩时解析所选 reviewer 的压缩兼容哈希,兼容性未知或不匹配时保留旧 transcript;兼容压缩后立即激活基于父上下文的审查,并让绑定旧证据策略的待处理审查失效(普通压缩不受影响);对此前已迁移过、旧 transcript 已不完整的 checkpoint 保持严格兼容性检查。
为什么改原文说明
PR 正文的 Why 一节写明:旧模型产生的 checkpoint 可能与所选 Guardian reviewer 不兼容,legacy review 必须在压缩与重启期间一直保留用户限制和已验证的答案,直到出现兼容的 checkpoint。
对开发者的影响
用 Codex 的 Guardian 审查功能、且会在会话中途切换模型的团队,这次改动意味着压缩和重启不会让用户此前已确认的限制和答案失效——代价是新增了一条「legacy transcript 是否完整可用」的判断,长期不出现兼容 checkpoint 时旧 transcript 会一直被保留。自建 Harness 若有类似的审查/合规证据概念,这里的教训是:证据的生命周期要独立于上下文管理策略(压缩、重启)设计,不能假设它们总能随上下文一起搬迁。

Pi:系统提示词和工具的变化,现在写进会话记录,不再悄悄改写会话的起点

改了什么
此前系统提示词文本和工具集合的变化不会被记录,而是悄悄重写会话「最初的样子」。这次改动让这些变化本身成为 transcript 的一部分:Pi 记录指令何时变化、工具何时可用,并在恢复会话或切换分支时还原这段状态,同时在上游支持的情况下保留被缓存的提示词前缀。
为什么改原文说明
提交信息说明了要避免的旧行为:系统提示词与工具变化此前是「悄悄重写会话起点」,而不是被如实记录,这会让恢复或切换分支时读到的运行条件与创建时不一致。
对开发者的影响
用 Pi 做长会话或分支实验的团队,升级后系统提示词和工具集合的历史变化会出现在 transcript 里,依赖 transcript 精确结构的下游工具(例如自定义渲染器)可能需要适配新增的消息类型。自建 Harness 若用日志/树状结构存会话,这里的教训是:凡是会影响后续请求内容的运行时配置变化(不只是消息本身),都该被视为会话状态的一部分记录下来,而不是当成全局可变的「当前设置」。
影响到的格子(6 条说明)

评估与自改进 × openJiuwen

evolution 消息重建(trajectory_to_messages)不再用文本重叠猜测合并请求 prompt 与历史,而是从可观测层提交的 context window 直接取消息,按 message_id 去重;取消 _longest_overlap/_merge_prompt,压缩请求不贡献内容,缺失提交窗口的请求标记为 missing_context_window。这是本格 rsi 闭环里「轨迹如何变成训练/评估用消息」这一步的重建,标为 BREAKING CHANGE。

生命周期挂载点 × openJiuwen

新增 AgentRail.callback_priority(event),允许同一个 rail 为不同事件声明不同的钩子优先级,而不必更改其整体注册顺序,修复了可观测性 rail(优先级 10)结束工具 span 早于 evolution rail(优先级 60+)排空订阅、导致 AFTER_TOOL_CALL 触发条件从未真正触发的问题。本格此前只描述 rail 是按优先级排序的类,未涉及「同一个 rail 内不同事件可有不同优先级」这层细节。

中断与恢复 × Codex

Guardian 审查证据(用户限制、已验证答案)现在独立于压缩/重启存在:恢复与远端压缩时解析所选 reviewer 的兼容性哈希,不兼容或未知时保留旧 transcript,兼容压缩后才失效绑定旧证据策略的待处理审查。本格此前描述的「倒序找压缩检查点、只重放尾巴」的恢复机制,现在多了一条并行规则——审查证据的保留窗口可以比常规历史重放窗口更长。

会话状态存储 × Pi

系统提示词文本变化和工具可用性变化,从悄悄重写会话起点改为写入 transcript 本身(#9548),恢复会话或切换分支时据此还原当时的运行条件,并在上游支持时保留被缓存的提示词前缀。本格此前描述 Pi 的会话是带 parentId 的树,本周变化说明这棵树的节点不仅记录消息,也记录了运行时配置的时间线。

工具定义方式 × openJiuwen

Tool 契约新增 render_for_llm(output):工具可以自定义「模型读到的文本」与「流式展示给用户/开发者的结构化结果」分离,默认渲染取 data['content'],失败时渲染 error,不再是 AbilityManager 直接把 ToolOutput 的 pydantic repr 塞给模型;agent_teams 原先靠 MappedToolOutput.__str__ 打的补丁被这条通用契约取代。本格此前的两种建工具流派均未提及「输出如何渲染给模型」是契约的一部分。

上下文压缩 × Codex

新增 model_post_turn_compact_threshold_percent 配置项,在最终响应之后、上下文占用达到配置百分比时触发一次性压缩(#46541),有输入待处理、回合被取消或开启 token 预算模式时跳过,审查者(approval reviewers)角色也跳过以免拖慢审批完成。本格此前的三条并行摘要路径(本地摘要/远端摘要/直接换窗口)之外,新增了一个与压缩策略本身解耦的「何时触发」开关。

采集到的提交与发布
openJiuwen100+ 提交 · 0 release · 431 ★

值得注意的提交

  • 92eb535[mirror] openJiuwen-ai/agent-core#771: fix(llm): read reasoning_tokens from Responses usage
  • 6dfda01feat(team): add group conversations and reliable member inputs
  • 31b12e8fix(agent-teams): demote pending terminal-transition rejection to debug (#1822)
  • 2f9fd56fix(agent-teams): normalize member/execution state transitions on recovery (#4318)
  • 7e77719fix(logging): mark llm_call_error and other failure events as failure (#4320)
  • ade3b3cfix(personal-context): resolve collection stalls from runaway directory growth
Codex100+ 提交 · 27 release · 125,567 ★

值得注意的提交

  • 88ef37cIdentify local background servers in `/status` (#46905)
  • eaff9a5Hide Back to bottom when the current transcript tail is visible (#46902)
  • 4ca8e7aMake transcript list spacing uniform after streaming (#46899)
  • d992132Honor the effective terminal color level in activity charts (#46897)
  • 2db0ab7Add right-click copying for transcript and composer selections (#46895)
  • 9fdff73Enable plain clicks on transcript links and style bare URLs (#46884)
Pi100+ 提交 · 2 release · 107,845 ★

当周 release

值得注意的提交

  • 890f920fix(ai): default unknown providers to non-strict tools (closes #9816)
  • 63787eefeat(coding-agent): identify extensions in crash stacks
  • f5c9464feat(ai,coding-agent): add image input limits (closes #9631)
  • 3390bd9fix(coding-agent): skip late cache warming refreshes
  • 19451acAdd [Unreleased] section for next cycle
  • 13cbf77Release v0.86.1

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

观察名单

观察名单

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

Claude Agent SDKAnthropic
20 提交 · 8,140 ★

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

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

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