2026 2026年10月15日 60 min · 18.0k chars by yxc023

GitHub 调研周报 2026-10-15

扫描窗口:2026-09-08T09:23:29Z → 2026-10-15T00:34:46Z(共 36.6 天)| 基准来源:上次报告 2026-10-14

2026-10-15 GitHub 调研周报

扫描窗口:2026-09-08T09:23:29Z → 2026-10-15T00:34:46Z(共 36.6 天)| 基准来源:上次报告 2026-10-14

仓库范围:config/repos.yaml 中 6 个仓库。基准时间字段自 2026-09-08 起未变,窗口逐日变宽,本期新增内容全部落在 2026-10-14T00:30 之后的 24 小时。这一天最重的一件事是 ACP 从上期的「静默期」直接翻到「一天 13 个规范澄清 PR」——而且每一个都写着 “No wire-format changes”;第二件是 pi 的 chord 在 9 小时内把命名体系、API 形状与协议版本一起重做了一遍(PROTOCOL_VERSION 2 → 3 → 4)。

本期速览

  • agentclientprotocol/agent-client-protocol: 上期「协议本体零改动、新 issue 为零、tag 停在 v1.11.0」的静默期在一天内结束。10-14 有 13 个 PR 由 Ben Brandt 合并(10:43Z → 18:41Z,八小时内),全部是 v2 规范的文字与规范性修订,每一个都声明不动 wire format,但其中至少三个改变了规范性强度。PR 正文反复点名同一个来源:Codex 团队的 v2 实现反馈与 Claude adapter 的反馈。

  • agentclientprotocol/agent-client-protocol: 取消语义被向下修正。 #2389 把 cancellation RFD 里「取消必须级联(cascade)」的要求从 MUST 改成对齐协议里已发布的 MAY——正文原话:「发送取消通知并不保证接收方会停止嵌套活动或撤回它自己发出的请求」,动因是 Codex 团队反馈。#2388 把完成上报里的 stop reason 从 MUST 降为 SHOULD(Agent 说不清为什么停时也必须能报 idle),同时要求 Client 在 stop reason 缺失、null、格式错误或未知时仍须识别 idle,且不得假定成功或失败。#2390 明确列出取消的 MUST 义务只剩三条:确认取消成功、更新顺序、取消引发的错误。

  • agentclientprotocol/agent-client-protocol: 「什么算完成」「什么算插入」第一次被写成规范术语。 #2387(+148/−45,本批最大)定义 foreground / background work,并要求无论工作由 prompt 还是 agent 主动发起,都走同一条 running→idle 生命周期;#2392(+133/−49)把 insertion 定义进规范生命周期——foreground running 可以早于插入发生且不等于「已接受」,prompt 响应与 user-message 更新可以乱序但不得早于插入,插入前的拒绝是 request error 且不带 user-message 更新。#2385 定义 session/close 与取消的交互:close 取消前台工作时,其最终更新与带 stopReason: "cancelled" 的 idle 必须先于成功的 close 响应;close 若阻止了某条待处理 prompt 的 user message 插入,该请求回 -32800 (Request Cancelled),已插入的消息仍回成功并带 messageId。

  • agentclientprotocol/agent-client-protocol: experimental 特性改为逐特性协商,而不是一个连接级开关。 #2397(+311/−24,本批最大单文件改动)明确不加 connection-wide 的 unstable-schema flag,改为「特性稳定性 / 是否宣告支持 / 安全前向兼容」三者分离,可选操作走逐特性协商,显式 capability-free 的信息性新增可被忽略;并记录 capabilities.providers、把 end-turn token usage 放在 idle 的 state_update 上而非 prompt 响应上。#2399 要求接收方忽略未知对象属性(含嵌套 capability 字段)而不放松已知字段的校验,并补了完整的 v1→v2 capability 映射表。#2391 规定 agent 初始化成功后可在任意时刻发请求与通知(含在 client 请求之间、单个或批量回复的前后),TCK 的 quiet-period 失败由此消解。#2398 要求 replay 使用稳定的 agent/thought ID,不支持的 cursor 类型与畸形 cursor 一律回 -32602,不做静默回退。

  • agentclientprotocol/agent-client-protocol: 同期新开一个质量很高的 RFD PR #2394(@nikita-ashihmin,仍 open):把 updatedAt 重新定义为「session 保留的对话最后一次变化」,Agent 不得为 connect / load / resume / 写配置 / 重写 transcript / list 移动它,判不出时必须省略字段而不是用存储时间戳替代——因为「省略可被检测,mtime 是客户端看不见的错,且错在贵的方向」。附带给了成本实测:一个在用 IDE 客户端里,追一份落后约 50 轮的 transcript 需要重放 27,765 条 updates,因为当时只有 start 一种 cursor。

  • agentclientprotocol/agent-client-protocol: 窗口内新 issue 仍为 0,tag 仍停在 v1.11.0(10-09),release PR #2379 仍未合并。但生态侧出现一个反向信号:npm 上的 @nyssance/codex-acp-v2(发布于约 17 小时前)是一个只有 v2、没有 v1 且没有兼容层的 ACP agent,全部对着 @agentclientprotocol/sdk/experimental/v2 写——在协议 tag 还没动的时候,第三方已经按 draft 开船了。

  • earendil-works/pi: chord 在 10-14 05:34Z → 14:29Z 的九小时里被整体重塑。 Mario Zechner 一个人落了 7 个 commit:References 由 Handle<C> 改名为 Ref<C>、record.ts → object.ts、BehaviorOf → ImplementationOf、ResourceSpec → ResourceDeclaration、epoch 一律改称 code version;link 在 hello 里宣告 PROTOCOL_VERSION = 2,版本不同的对端直接以 protocol-version <n> 关闭链接;ServeOptions.eager 由 lifetime: "referenced" | "host" 取代。随后 self.state / self.derive / self.resource / self.task / self.on 五个声明入口按名取代 cell() / derivation() / listener() 与声明表,ServeOptions.state 被删;再是 protocol 3(self.state 在对象上线前完成 init、principal 类型变成参数、远端契约声明自己的 host)与 protocol 4(引用在使用前先 hydrate 自己的 state,shape frame 不再携带 codeVersion)。

  • earendil-works/pi: chord 当天还落了一个跨主机正确性修复(00d8d04),逐条对着 spec 第 12 节:集群 reload 期间说 hello 的子进程立刻被 fence、reload 结束后再按已提交的 code version 对账(此前是被标成 in sync 而不投票);子进程只有在父进程退休之后才退休某个 code version;强制退休会中止旧 code version 残留的根对象(含中继调用)再关资源;Ref 绑定改为弱引用、facet 拿到 FacetApi.signal,并附一个旧 code generation 的 GC 回归测试。

  • earendil-works/pi: 新 issue #10959 是一条跨主机信任边界问题(5 条评论):在离线三主机复现里,远端 Chord 引用接受了来自另一个无关主机的活跃 Ctx 并执行了方法,而同一契约的本地引用会以 invalid/foreign_ctx 拒绝——context 归属校验随部署位置而变。作者附了可独立运行的复现脚本,明确说「尚未观察到生产事故」,并表示获批后可提交聚焦修复。同一批还有 #10928(agent_before_settle 钩子拿不到 ctx.signal,session.abort() 会一直等到钩子结束)。

  • earendil-works/pi: 窗口内 4 个 PR 合并,其中 #10913(@christianklotz)把模型引用解析收敛成一条策略:此前 --model provider/id 在多个 gateway 都暴露同名 raw id 时按 catalog 顺序取第一个、忽略凭据,且 shared 与 shared:high 走不同分支;现在 resolveModelReference 收集全部候选后只走一条规则,「精确匹配里没有唯一已认证 provider」从「按 catalog 顺序取」变成报错,fuzzy 匹配优先已认证 provider。另三条:87f9a36 工具调用参数尾部畸形时报错而不是保留已解析前缀(#10944);60ac3bc 改 OpenAI GPT-6 的 thinking level 时改用 configuration_update 输入项、每条回复记录自己的 level,从而保住 prompt cache(#10930);b399797 删掉未使用的 assistant-message frame API。

  • anomalyco/opencode: v2.0.29 发布(版本同步 commit 34d8ded,10-14 09:03:25Z;notes 仍只记在 dev:CHANGELOG.md,GitHub Releases 停在 v1.19.0)。四个 headline 全在 desktop:Settings → Pairing 远程设备配对(走 OpenTunnel,扫码或复制链接,#55306)、provider 账号管理(切换 / 重命名 / 移除 / 新增,#54101)、撞输出上限自动续写(#53876,带有界重试)、触控板缩放与双指平移预览图片与 SVG(#54590)。Core 三条配置改动:policies 从 experimental 提升为稳定顶层键(#55297)、托管配置改为最高优先级(#55267)、V1 npm provider 配置可指向内置 provider 路由(#55254)。TUI 增加把 session 待处理状态通过 terminal program-status notification 上报(#55172)。

  • anomalyco/opencode: #55267 把上期 #54921 的决定在 48 小时内推翻了。 上期 #54921 把系统配置目录(/etc/opencode、%ProgramData%\opencode、/Library/Application Support/opencode、macOS MDM)放到最低优先级(@rntdrts 提出),本期 #55267 改成最高——理由写在正文里:「policies 是按加载顺序反向求值的,把托管配置放最后会让它的 policies 最弱,所以每个托管文件的 policies 被拆出来先加载」;作者同时承认「普通配置的 policies 与托管配置的 policies 处理方式略有不一致,但这种不一致会带来更好的体验,尽管有点怪」。Console 组织级 policies 仍然压过一切。#55373(/etc/opencode 在 v2 不被发现)当天关闭。

  • anomalyco/opencode: 渲染层当天回退。 #55300 撤销 OpenTUI 0.6.2 / 0.6.3 升级(+765/−1630,103 个文件)回到 0.5.17:0.6.x 要求构造 SyntaxStyle / TextBuffer / EditBuffer / OptimizedBuffer 时显式传 NativeResourceOwner,这打断了现有 TUI 插件的单参调用 SyntaxStyle.fromStyles(styles)。@opencode/plugin 的 OpenTUI peer 范围从 >=0.6.3 退回 >=0.5.17。

  • anomalyco/opencode: 两个部署层的「事实与声明不符」被修掉。 #55524:https://opencode.ai/config.json 是所有 opencode.json(c) 的 $schema,而它是 packages/opencode 从 dev 移除时被冻结进 console 的静态 V1 文件——结果编辑器把合法的 V2 配置(permissions、agents、providers、mcp.servers、skills: []、update、warming)全标成错误;现在改为部署时生成,V2 形状来自 @opencode/schema/config 的 Config.Info,V1 形状取冻结快照并把仅 V1 认识的字段标 deprecated,与 ConfigNormalize 接受混写的行为对齐。#55547:Windows 默认服务端口 0xC0DE(49374)落在 Hyper-V / WinNAT 开机保留的 100 端口块内,导致 serve --service 偶发报「已被占用」而实际无人监听;Windows 默认改为 0xB0DE(45278),macOS/Linux/WSL 不变,代价是 Windows 上已保存的 :49374 书签、局域网配对设备与 SSH 转发全部失效。

  • anomalyco/opencode: 新 issue 里最有信息量的三条是关于**「静默地把一个数字变成一个坏状态」:#55389 mid-session 的 context notice 恰好落在一个以 tool output 结尾的 assistant message 之后时,OpenAI 兼容 Responses 端点用 400 "A tool output cannot be combined with new developer or system context" 拒掉整条请求——notice 已持久化进历史,于是每一轮都重放同一个非法序列,session 永久不可用,重试、resume、/compact、换模型全部同样失败,且不需要任何用户动作就能复现**(服务重启 / 自动更新);#55367 NixOS 上 watcher 把 /nix/store 直接订阅为 home-manager skill derivations 的父目录监听,几秒内吃掉约 523,000 / 524,288 个 inotify watch,导致整机所有文件监听程序 ENOSPC(作者随后更正了最初归因于 .direnv symlink 的判断——watcher 根本不跟 symlink);#55271 OpenAI Chat 的 tool-content guard 直接 abort session drain,报错里既没有出问题的 part 索引也没有内容类型。#55010(snapshot 仓库 11.5 小时涨到 15 GB)仍 open,bot 的自捕获复现结论未变,报告者的缓解是 "snapshot": false 加一个每周 gc + 体积上限的守护脚本。

  • vectorize-io/hindsight: v1.0.0(10-13)仍是最新 tag,窗口内无 release、只有 3 个 commit:d5b1d42 给 control-plane 请求单独的 hindsight-control-plane User-Agent(v1.0 里 #5466 已经让每个 integration 自报身份,这是把同一个动作延伸到控制面)、dabefc8 webhook event delivery ids、7a2df55 修 Windows 上 export 轮询循环超时被 overrun。14 个新 issue 里最集中的一组是「静默的零结果」:#5565 抽取回复里的错误散文只要含 “no facts” 就被当成零事实接受、#5582 缺失 top-level facts 静默成功为零 memory、#5572 consolidation 拿到 schema-invalid 回复后从不带着校验错误重问(而 retain、reflect、delta refresh 都会)、#5574 delta 模式的 mental models 实际长到 max_tokens 的 3–4 倍,因为这个预算只是 prompt 提示、没有任何东西强制它。

  • vectorize-io/hindsight: 外部侧,10-14 的 Repository Radar PR#43 记录了 50k star、每周 129 个 commit、290 位贡献者,并复述了 Memlake 的对照数字:约 200k memory 的 bank 上 recall 从 Postgres 的 5.3 s 降到 113 ms。官方博客自 10-13 的 Memlake 长文之后无新文。

  • agegr/pi-web: 窗口内只有 1 个 commit——新增 CONTRIBUTING.md(含中文版),写明 Pi Web 是什么、什么不在范围内、什么容易合入、UI 规则与 PR 前的检查清单,同时把中 / 日 / 俄 README 移进 docs/。但新 issue 达 15 个,且两个直接命中上游刚修的问题:#1240「defaultProvider/defaultModel 指向 extension 注册的模型时,新 session 不带显式模型会静默落到第一个内置模型上,模型选择器显示默认模型但 prompt 实际跑在 fallback 上」——与 pi 本期 #10913 的 resolveModelReference 是同一件事的两端;#1226「/api/auth/providers、/api/skills 等只读端点每个请求都重建整张扩展图,冷缓存下每次 10–20 s CPU 并阻塞同一个 Node 的事件循环」,正文点名的上游 issue 是 pi 的 #10911(扩展工厂缓存被任何 cwd 切换清空)。另有 #1256 给出实测:空闲稳态约 271 MB,一进入多轮工具调用 RSS 快速爬到 1,068 MB+。

各仓库详情

agentclientprotocol/agent-client-protocol

编辑器与 coding agent 之间的 JSON-RPC 协议(Zed 发起,现由 Zed 与 JetBrains 共同治理)| stars: 4,444 | open issues: 35 | 默认分支: main | 最近 push: 2026-10-14T23:18:22Z | 主页: https://agentclientprotocol.com

近 N 周 release 重点:

  • 窗口期内无 release。最新 tag 仍是 v1.11.0(2026-10-09T14:17:36Z),同批的 schema-v1.25.0 与 schema-v2.0.0-alpha.8 同日。release PR #2379 自 10-13 16:21 起一直 open、未合并。19 个新 commit 里 8 个是 dependabot(bump the minor group with 8 updates,#2396)与 acp-release-bot 的 registry 批量刷新。

  • 本期的实质产出全部在 docs/。13 个 PR(#2384–#2399 区间)由 Ben Brandt 合并,时间线 10:43:52Z → 18:41:35Z。逐条的规范性改动:

    • #2384(+14/−14)RFD 里的 id 全部改成 planId,与既有 schema 和协议文档对齐;正文说「仅文档,无 schema 或运行时变化」。
    • #2385(+47/−2,回应 Claude adapter 反馈)定义 session/close 与取消的交互,且刻意不规定关闭调度、不对所有 prompt 响应设屏障:close 取消前台工作时,其最终更新与 stopReason: "cancelled" 的 idle 必须先于成功的 close 响应;关闭一个已经 idle 的 session 不需要再来一次 idle 更新;若 close 阻止了某条待处理 prompt 的 user message 插入,该请求回 -32800(含 shutdown 期间被丢弃的排队 prompt);已插入的消息仍回成功并带 messageId;prompt 响应不必早于 close 响应,也不设精确的「关闭开始」插入截止点。
    • #2386(+8/−4)把完成上报绑定到前台工作的结束而不是「已准备好接收下一条 prompt」,并重述取消边界。
    • #2387(+148/−45)定义 foreground / background work(含 agent 主动发起的目标与续跑),要求无论工作由谁发起都走同一条 running→idle 生命周期、前台结束时必须给 idle 并建议给 stop reason,并澄清后台进展与权限请求可以在 idle 期间到达而不改变前台状态。明确不引入排队或 steering 策略、不新增 capability 与错误码。
    • #2388(+55/−9)保留 idle 上报为 MUST,但把 stop reason 降为 SHOULD,Agent 说不清原因时也必须能报 idle;要求 Client 在 stop reason 缺失 / null / 畸形 / 未知时仍识别 idle,且不得假定成功或失败;补齐「插入后、模型输出前」的失败上报,以及插入前后的认证失败差异(含 auth_required -32000 与「插入感知的重试」指引)。评审期间删掉了配额 / provider 分类与替代错误通道的段落。
    • #2389(+39/−38,回应 Codex 团队反馈)把 cancellation RFD 的级联要求对齐到协议已发布的 MAY,而不是反过来加强协议保证——正文原话:「取消传播需要显式的实现支持;发送取消通知并不保证接收方会停止嵌套活动或撤回它自己发出的请求」;并修正 v1/v2 取消图:待处理的权限请求在 session/cancel 之后直接拿到 cancelled 结果,不必等 Agent 的 $/cancel_request 通知,出向的终态请求取消在 v1 示例里标为可选。
    • #2390(+62/−36)把 v2 取消要求与 Rust doc comment 及生成的 schema description 对齐:停止进行中的模型请求与工具调用保留为 SHOULD,MUST 义务显式收敛为三条——取消确认成功、更新顺序、取消引发的错误。
    • #2391(+34/−0,回应 Codex v2 实现反馈造成的 TCK quiet-period 失败)规定 agent 在初始化成功之后可在任意时刻发请求与通知,包括在 client 请求之间、单个或批量回复的前后;Client 必须独立处理这些消息而不依赖待决响应;批量数组的位置不构成处理顺序,有顺序依赖的消息应分开发送。
    • #2392(+133/−49)把 insertion 定义进 v2 规范生命周期,并给出运行时插入证据与仅 live 的命令消息示例;foreground running 可以早于插入发生且不等于「已接受」;prompt 响应与 user-message 更新可以乱序但不得早于插入;插入前的拒绝是 request error 且不带 user-message 更新,同时前台状态与请求结果相互独立。
    • #2397(+311/−24,本批最大)澄清 experimental v2 特性在一条连接上怎么用,回应「缺少 wire 信号与门控不一致」的实现反馈,明确不引入 connection-wide 的 unstable-schema flag:区分特性稳定性 / 已宣告支持 / 安全前向兼容;可选操作走逐特性协商,显式 capability-free 的信息性新增可被忽略或通用展示;本地 flag 与生成的类型不宣告对端支持;记录 capabilities.providers,并把 end-turn token usage 放到 idle 的 state_update 上;修正 baseline v2 的 plan 兼容性——markdown 与 file-backed plan 在关闭实验性 plan 支持时走 unknown-content 回退,已识别的 variant 仍严格校验。
    • #2398(+78/−18)建议在可能时使用稳定的 agent/thought replay ID(不要求跨重连或重启稳定);完整 replay 应重建 agent/thought 历史而不是只按 message ID 合并;不支持的 replay cursor 类型与畸形 cursor 一律返回 -32602 (Invalid params),不做静默回退,中间层需保留自定义 / 未来的 cursor 载荷。明确把 resume 时的前台状态与终态快照同步推迟到另一个 PR。
    • #2399(+96/−5,回应 Codex 团队)要求**接收方忽略未知对象属性(含嵌套 capability 字段)**而不放松已知字段与判别器的校验;澄清 capability _meta 放在根还是嵌套、给标准 capability 对象加 metadata 仍等于宣告其标准支持;补完整的 v1→v2 capability 映射表,区分改名标记、baseline 特性、已移除面与 draft-only 特性。
  • 窗口内仍 open 的 PR:#2394(@nikita-ashihmin,10-14 13:19 创建,+145/−1,2 文件)、#2372(feat(unstable-v2): patch upsert _meta by top-level key,@benbrandt,10-13 起 open)、#2379(release)。

其他重要 commits / PRs(按重要性挑选):

  • #2397 已合并 — fix(schema): clarify v2 experimental feature negotiation(+311/−24,本批最大)
  • #2387 已合并 — docs(unstable-v2): clarify foreground work lifecycle(+148/−45)
  • #2392 已合并 — docs(unstable-v2): clarify prompt insertion contract(+133/−49)
  • #2399 已合并 — docs: clarify v2 capability compatibility and migration(+96/−5)
  • #2398 已合并 — docs(v2): clarify replay IDs and unsupported cursors(+78/−18)
  • #2390 已合并 — docs(v2): align normative cancellation requirements(+62/−36)
  • #2388 已合并 — docs(v2): clarify post-insertion failure reporting(+55/−9)
  • #2385 已合并 — docs(v2): clarify prompt cancellation when closing sessions(+47/−2)
  • #2389 已合并 — docs: align cancellation RFD and cascade examples with protocol(+39/−38)
  • #2391 已合并 — docs(v2): clarify agent-initiated message timing(+34/−0)
  • #2393 已合并 — docs(clients): add necoder to Editors and IDEs(@Daichi Nagashima,首个第三方 client 条目)

社区讨论 / 行业方向:

  • #2394(open,docs(rfd): define a session's last change, and how to catch up to it): 本批唯一一个新提的 RFD,也是论证最完整的一篇。正文先摆问题——Client 要在重连时知道「这个 session 自上次之后变过没有」,唯一信号是 session/list 行上的 updatedAt,而它被定义为「session 里的最后一次活动」,每个 Agent 对「活动」的理解都不一样:claude-agent-acp 从 transcript 推导(mtime,并以最后一条消息时间封顶),codex-acp 报 thread 的 updated_at,而后者每次 rollout 写入都会动,包括一次纯 resume 追加的 settings checkpoint。两者都会为一次什么都没加的重连移动 updatedAt。「对一个选择器来说这无害;对一个持有持久化副本的 Client 来说这个比较不可用:容差为零时空闲重连会被读成一次变化、transcript 可见地重建;容差放宽到足以压掉它,另一个界面里的真实续跑就不再被检测——两者之间没有中间地带,因为它们产生的是同一类事件。」提案分两部分:给「last change」一个唯一定义(只算 prompt 插入的 user message、message 或 chunk、tool call 及其结果、compaction、rewind;Agent 判不出时必须省略字段而非代入存储时间戳——「省略是可检测的,会告诉 Client 去直接问;mtime 是一种 Client 看不见的错,而且错在贵的方向」);以及一个可选的执行方式 replayFrom: { type: "message", messageId },以 session.resume.replayFromMessage 为门,不支持或已不保留(compaction、rewind)时报 -32602 且不重放,Client 改用 { type: "start" } 重建。附成本实测:一个在用 IDE 客户端里追一份落后约 50 轮的 transcript 重放了 27,765 条 updates,因为那时只有 start 一种 cursor——「成本随 session 增长,而不是随差距增长」。作者注明它与 #2323(lastPromptAt)互补:一个回答「用户上次何时参与」,一个回答「内容上次何时变化」。
  • @nyssance/codex-acp-v2(npm,发布于约 17 小时前): 一个独立的 ACP v2 agent,对着 OpenAI Codex app-server,把 Codex 的 thread/* / turn/* / item/* 事件面翻译成 ACP session/update。README 明确写着 「There is no ACP v1 surface and no compatibility layer: everything is written against @agentclientprotocol/sdk/experimental/v2」,并自述起点是 Apache-2.0 的 codex-acp。它把 session/resume 的 replayFrom: {type: "start"}、capabilities._meta.codex.archive / .skills / .plugins、requires_action 状态、只发 tool_call_update 的 upsert 式工具调用都当作既定面在用——协议 tag 还停在 v1.11.0,第三方已经按 draft 的形状在生产依赖。
  • 讨论区在本期没有新议题,最近更新的仍是老帖(#2235 rate-limit 与 plan-quota 窗口、#2016 ephemeral tool injection、#72 editor LSP elicitation、#928 强制 fs/write_text_file 与 terminal/create 前必须过权限检查)。#928 的论点仍是窗口内最锋利的一条:协议把 session/request_permission 定义为 MAY 级机制,因此 agent 可以不经确认就写任何绝对路径、执行任意终端命令,唯一约束只是路径必须是绝对的。

信号观察:

  • 一天之内 13 个规范 PR,方向全部是向下修正:MUST → MAY(取消级联)、MUST → SHOULD(stop reason)、删掉替代错误通道与配额分类段落、把插入截止点留给实现。这不是「把协议写完整」,是把协议改到与实现现状一致。
  • 反馈来源在 PR 正文里被点名,且是实现方而非评论者:#2385 写 Claude adapter,#2389 / #2391 / #2399 写 Codex 团队 / Codex v2 实现。协议的规范性正在由最先实现 v2 的两家用例来校准。
  • 「No wire-format changes」不等于「没有语义变化」:13 个 PR 全部这么声明,但 #2389 改变了一个 RFD 的承诺,#2388 改变了两处规范强度,#2392 把一个此前只是叙述的概念变成了规范术语。wire 稳定与语义稳定在这个项目里已经是两件事。
  • 能力位的处理方式第三次收敛到「忽略未知」:#2397 要求逐特性协商且显式 capability-free 的信息可被忽略,#2399 要求接收方忽略嵌套未知字段,#2235 的 rate-limit 提案则是在描述各家用 _meta 私有键绕过协议的做法。同一周内,协议既在给信息性新增找一个「不带 capability 也能发」的位置,又在容忍实现方用私有 _meta 抢先发同类信息。
  • 生态侧的速度快于 tag:新 client 条目(#2393 necoder)、依赖 release 的 npm 包(codex-acp-v2)都在协议还没发新版本时出现。v2.0.0-alpha.8 停在 10-09,release PR #2379 open 已近两天——发版节奏现在是唯一落后于实现节奏的环节。

earendil-works/pi

AI agent 工具包:统一 LLM API、agent loop、TUI、coding agent CLI,外加 chord / durable 两个运行时| stars: 115,187 | open issues: 342 | 默认分支: main | 最近 push: 2026-10-14T20:24:04Z | 主页: (仓库未填 homepage)

近 N 周 release 重点:

  • 窗口期内无 release。最新仍是 v1.2.0(2026-10-12T23:03:53Z),上一版 v1.1.0(10-07)、v1.0.4(10-05)。上期记录的 ^ 依赖范围事故(#10865,f13c00f 钉精确版本)在本期没有新的后续提交。

其他重要 commits / PRs(按重要性挑选):

  • 2688aba main — refactor(chord): name things after the concepts; object variants; link protocol version; object lifetimes(@Mario Zechner, 10-14 05:34): Handle<C> → Ref<C>、record.ts → object.ts、BehaviorOf<C> → ImplementationOf<C>、ResourceSpec → ResourceDeclaration、epoch 一律改称 code version(出现在 Ctx、RootOptions、Shape、Host、frames 与 reload 报告里);远端对象的 kind 改名 variant;link 在 hello 里宣告 PROTOCOL_VERSION = 2,版本不同的对端以 protocol-version <n> 关闭链接并经 LinkOptions.onProtocolMismatch 上报;ServeOptions.eager 由 lifetime: "referenced" | "host" 取代,一次 reload 把某个类型改成 referenced 会释放该 host 自己的引用。
  • d20c6e9 main — refactor(chord): declarations by name, void and no-argument methods, per-cell state versions(@Mario Zechner, 10-14 06:12): self.state(name, schema, initial, { version?, migrate? }) / self.derive(sources, fn) / self.resource(name, { version, deps?, exclusive?, open, close? }) / self.task(fn) / self.on(name, source, [select,] handler) 五个按名声明入口取代 cell() / derivation() / resource() / listener() 与整张声明表(ServeOptions.state 被删);state 的 listener 在启动时与每次 reload 后都会收到当前值,handler 必须自行对账;method(args?, result?) 省略 result 即 void、省略参数即无参方法(wire 上两者都省略)。
  • 00d8d04 main — fix(chord): reload and retirement correctness across hosts; no leaked code generations(@Mario Zechner, 10-14 07:08): 逐条对着 spec 第 12 节修——reload 期间说 hello 的子进程立即被 fence、reload 结束后再按已提交的 code version 对账(此前被直接标成 in sync 而不投票),进行中的对账也要等 reload 结束;子进程只有在父进程之后才退休某个 code version,协调者先退休再 prepare,子进程在 hello 与 prepare 前就知道已被退休的版本;强制退休会先中止旧 code version 残留的根对象(含中继调用)再关只属于它的资源;任务的替代运行在旧运行结束后启动、最迟不超过 taskStopDeadline;保留的资源在 commit 时采用最新声明的 close;已 dispose 的对象与旧 code generation 会被释放(Ref 绑定改弱引用、完成的 dispose 离开 dying 表、停止的任务被丢弃、context 改用链接 abort signal 而非 AbortSignal.any 以免持有已链接的 signal 与监听器);Facet 拿到 FacetApi.signal。
  • aa9cf15 main — feat(chord): init for state, typed principals, contract placement (protocol 3)(@Mario Zechner, 10-14 11:55): self.state(name, schema, { init }) 在对象上线前完成加载;principal 类型变成参数,createHost 的 self、connect 与 route principal 均为必填;远端契约声明自己的 host(hostNamed / hostFamily);get 不再接受 at。
  • b45e0eb main — feat(chord): references hydrate their state before use (protocol 4)(@Mario Zechner, 10-14 14:29): 一个被 await 的 get 或一个 ready hold 会拿到其 variant 的全部 state 成员(本地或远端);hold 订阅其 variant 的 state,可按成员 state: false 选择退出;远端绑定键使用规范身份,client hold 带一个不透明的 origin;shape frame 不再携带 codeVersion。
  • 301617d main — feat(chord): lifetime "host" is checked by the type system(@Mario Zechner, 10-14 09:43): serve(Type, factory, { lifetime: "host" }) 只对「输入无必填字段的本地类型」编译通过,且不能与 linger 同时使用(运行时检查保留为兜底);ServeOptions 变成联合类型,按契约由 ServeOptionsFor<C> 选取。
  • 39294a5 main — fix(chord): a failed IPC write ends the link instead of raising an unhandled error(@Mario Zechner, 10-14 08:07): 向刚退出的 peer 进程写入(ack 定时器在 worker 退出后、channel 断开前触发)会以 EPIPE 变成未处理的 error 事件;IpcLink 改为传 send 回调并在失败时结束链接,发往已消失 peer 的 host-manager 控制消息直接丢弃。
  • d7f7e0d main — fix(coding-agent): resolve model references through one provider selection policy (#10913)(@Christian Klotz, 10-14 10:00): resolveModelReference(core/model-resolver.ts)把 --model、--models/enabledModels、/model、pi auth print-* 全部收进一条流水线,收集所有候选后只走一条规则——具名 provider 的可用精确匹配优先,其次唯一的可用 raw 匹配,再次具名 provider 的匹配,否则判定为 ambiguous;fuzzy 匹配只在没有引用候选时运行且优先已认证 provider。行为变化:精确匹配中不存在唯一已认证 provider 时,从「按 catalog 顺序取」改为报错;带 --api-key 时存储的凭据不再决定 provider。
  • 60ac3bc main — feat(ai): keep the prompt cache when changing thinking level on OpenAI GPT-6 (#10930)(@David Brailovsky, 10-14 08:56): 用 API key 时 GPT-6 在 openai provider 上把 reasoning.effort 固定,改把 thinking level 作为 configuration_update 输入项发送,每条回复记录自己的 level,因此每次请求都原样重建早先的项;由 compat.supportsMidConvoEffort 控制,ChatGPT 登录与 thinking 关闭时跳过。
  • 195120a main — fix(ai): move OpenCode providers to inference endpoints(@David Brailovsky, 10-14 08:08)
  • 7efebff main — fix(ai): retry gateway 'Unable to forward upstream stream' errors(@David Brailovsky, 10-14 09:14)
  • 5712b13 main — fix(ai): use 500K context window for Codex GPT-6.1 Sol(@David Brailovsky, 10-14 13:19)
  • 87f9a36 main — fix(ai): report malformed final tool-call arguments instead of keeping the parsed prefix (#10944)(@David Brailovsky, 10-14 19:41): 已完成的工具调用改为严格解析,失败时 arguments 为 {}、argumentsError 持有原因与原文,由 validateToolArguments 报给模型。
  • b042997 main — fix(durable): encode base64 with btoa, without retaining concatenation trees(@Mario Zechner, 10-14 09:40): toBase64 原先逐字符拼接每个 8 KiB 块,V8 保留每个拼接节点直到最终 join,3 MiB 图片吃约 138 MB 堆,超出 Durable Object 的 128 MB 上限(closes #10923)。
  • 5713c95 main — fix(durable): lead with the system baseline after a compaction that keeps assistant messages(@Mario Zechner, 10-14 09:47): 一次保留 assistant message 的 compaction 之后,写给下一次运行的 baseline 会跟在保留的历史与新输入之后,导致 Anthropic 与 OpenAI Codex 请求没有初始 prompt 或工具集;现在推导逻辑识别 harness baseline(head marker 之后的第一条 pi.system 条目,或 transcript 里第一条携带 system 消息的条目),即使它在后面被省略也照样前移,且只有 ever 的第一条 system message 会移动以保证 replay 不变(closes #10904)。
  • b06c1f2 main — feat(ai): use Chat Completions for the kimi-coding provider(@David Brailovsky, 10-14 20:23)
  • 6303573 main — fix(ai): order thinking before text when a completions chunk has both(@David Brailovsky, 10-14 10:10)
  • 9101499 main — fix(coding-agent): normalize read line-range labels (#10938)(@Ramiz Wachtler, 10-14 13:20)
  • 9fe3f37 main — fix(coding-agent): keep empty quoted prompt template arguments(@David Brailovsky, 10-14 13:34)

社区讨论 / 行业方向:

  • #10959(Chord remote references accept a context from another host,@fitchmultz,5 条评论): 在离线三主机复现里,远端 Chord 引用接受了一个来自无关主机的活跃 Ctx 并执行了方法,而同一契约的本地引用以 invalid/foreign_ctx 拒绝——「context 归属校验随部署位置而变」。复现用的是一个独立的 public-API 脚本与 setup(gist),跑 node --conditions=source repro-chord-foreign-context.mjs,建三个 host 与一条 memory link,不涉及 CLI、扩展、provider 请求或外部服务;实测本地调用拒绝、计数器停在 0,远端调用返回 1 并把计数器加一。期望是两者都以 invalid/foreign_ctx 拒绝且不执行方法,依据是 spec 第 12 节(Known limitations and decisions)。作者明确说明「我尚未观察到生产事故」,并表示获批后可提交聚焦修复与回归。这条出现在 chord 一天内两次协议版本变更之后,落点正好是 chord spec 里被重新写过的「引用与调用」一节。
  • #10931(Concurrent host processes race package reconciliation on the same .pi/npm install root,@gitwyy,已关闭): 多个 pi host 进程共享同一 workspace 时(例如父 session 派生多个后台 subagent runner),每个进程各自跑 npm install … --prefix <cwd>/.pi/npm --legacy-peer-deps,没有跨进程互斥。正文给出三条机制:resolvePackageSources() 是 check-then-act 竞态(无锁、无 singleflight、无重试);安装进行中时其它进程读不到目标包的 package.json,getInstalledNpmVersion 吞掉解析错误返回 undefined,被当成「未安装」于是又触发一次安装,一次失败的安装会留下半写的 node_modules 树,让之后每一个 session 都持续触发重装;安装分支也没有进程内 singleflight。失败链:installNpm 抛错 → resolve() reject → resource-loader reload() reject → 子 session 创建失败,Windows 上表现为 EPERM / ENOTEMPTY。
  • #10928(coding-agent: final-settlement hook receives no cancellation signal,@Sequela02): Pi 1.2.0 里 ctx.signal 在 agent_end 存在、在 agent_before_settle 是 undefined,因此把这个 signal 传给可取消 wait 的钩子无法响应 session.abort()——abort 会等整个钩子跑完。实测 Windows / Node 24.15.0 上 abort 用了 5007 ms。作者注明这与 #6234 方向相反:#6234 是钩子无视取消,这一条是钩子想尊重取消却拿不到 signal。
  • 讨论区 #10915(Video input: a measurement that changes the implementation, and a 92-line reference,@johnlam1968): 一篇带实测的提案,作者明说「不是新功能请求」——#3200 已覆盖且维护者 @badlogic 回了「this will take a while i’m afraid」。核心结论是 block 的 type 必须改,而 mime type 本身不够:ImageContent.mimeType 在 packages/ai/src/types.ts 里是裸 string,packages/ai/src/api/anthropic-messages.ts 用一个 cast 原样透传、没有运行时检查(media_type: block.mimeType as "image/jpeg" | …),所以看上去只要放宽联合类型就够了——作者说自己正是这么假设的。
  • 讨论区 #10927(OpenLeo,@ancs21)与 #10921(Pi Bridge,Chrome profile 复用):两个基于 pi 的第三方项目同日发布。前者是一个 Trello 式看板,每个列表可以挂一个 agent,把卡片丢进 Research 就由研究 agent 在看板自己的 Linux sandbox 里做完再把答案写回卡片;agent 侧是 pi-agent-core + pi-ai 上的小 harness,一个 agent 是调用 useModel / useTool / useSubagent 并返回自己 system prompt 的函数,看板把 agent 存成 JSON,每个会话维持一个活 agent、重启后从磁盘恢复。

信号观察:

  • chord 一天内两次协议版本变更,且没有发版:05:34 的 PROTOCOL_VERSION = 2(对端版本不同即主动断链),11:55 的 protocol 3(self.state 的 init、typed principals、contract placement),14:29 的 protocol 4(引用先 hydrate 自己的 state)。九小时、三个版本号,全部落在 main 上。 目前对用户不可见——chord 在 v1.2.0 里作为依赖被移除、尚未作为发布包对外——但协议版本已经是「不兼容即断链」的形态,等它随包发布时,落后的对端不会降级、会直接被关掉。
  • 「重命名」与「改协议」在同一批 commit 里发生:Handle → Ref、BehaviorOf → ImplementationOf、kind → variant、eager → lifetime、epoch → code version,同时 ServeOptions 从一个对象变成联合类型、ServeOptions.state 直接消失、声明从「表 + 类型化工厂函数」变成「按名入口」。这不像增量演进,更像把 chord 的词汇表重写了一遍再继续用。
  • 跨主机一致性被逐条对着 spec 修,而不是逐个 bug 修:00d8d04 一次收了七类问题(hello fencing、投票、退休顺序、强制退休的中止顺序、任务替代启动时机、保留资源的 close 归属、GC),并为每一类补了回归测试,包括一个针对旧 code generation 的垃圾回收测试。修复的引用单位是 spec 章节号,不是 issue 号。
  • 模型解析从「多个分支各自决定」收敛到「一条策略」:#10913 的问题陈述里有两个具体反例(凭据只有一个 gateway 有却按 catalog 顺序取另一个;shared 选已认证 provider 而 shared:high 按 catalog 顺序)。修法是收集全部候选再走一条规则,并把「说不清」从「随便选一个」改成报错。
  • 新 issue 的形态继续是「可诊断性」:#10959 要的是 context 归属校验在两种部署位置上一致、#10928 要的是 agent_end 有的 signal 在 agent_before_settle 也有、#10931 要的是并发协调的锁。都不是要新功能,是要同一件事在两条路径上表现相同。
  • 窗口内 pi 新增 38 个 issue,其中至少 4 个是 1.2.0 之后的回归或延续(#10953 OpenAI 登录、#10916 模型目录缺 MiniMax-M3.1-Flash-Preview、#10946 Vertex/Gemini 4 报 400 "Thinking budget is not supported for this model"、#10936 opencode-go 缺 google-generative-ai 实现)。

anomalyco/opencode

开源 coding agent| stars: 213,536 | open issues: 4,276 | 默认分支: dev | 最近 push: 2026-10-14T23:52:53Z | 主页: https://opencode.ai

近 N 周 release 重点:

  • 窗口期内 GitHub Releases 无新增(最新 v1.19.0,2026-10-11T01:39:22Z)。2.x 线按惯例只在 dev 分支的 CHANGELOG.md 记录,版本同步由 commit 34d8ded(sync release versions for v2.0.29 [skip ci],10-14 09:03:25Z)完成。

  • v2.0.29(2026-10-14) — release notes 摘自 dev:CHANGELOG.md

    • Highlights:Remote Device Pairing(Settings → Pairing 里选 Pair device 启用 OpenTunnel 远程访问,拿到二维码或可复制链接,#55306);Provider Account Management(connect 对话框或 Settings → Providers 里切换 / 重命名 / 移除 / 新增 provider 账号,#54101);Automatic Response Continuation(撞到输出 token 上限时自动续接、保留部分输出而不是突然截断,#53876);Trackpad Image Navigation(捏合缩放、双指滚动平移图片与 SVG 预览,选 Fit 复位,#54590)。
    • Core 改进:撞输出上限后自动续接响应,带上有界重试并对被截断的工具调用给出更清晰的恢复路径(#53876);policies 配置键提升为稳定的顶层键,同时保留与 experimental.policies 的兼容(#55297)。
    • Core 修复:集中托管的配置优先于本地与用户配置(#55267);迁移后的 V1 npm provider 配置可指向内置 provider 路由(#55254)。
    • TUI:通过 terminal program-status notification 上报 working 状态与等待权限 / 输入的 session(#55172)。
    • Desktop:配对(#55306);provider 账号管理(#54101);session 视图显示上下文 token 与累计的 family 成本(#53785);触控板图片与 SVG 缩放平移(#54590);侧栏聚焦时可用配置的上一 / 下一 tab 快捷键循环侧栏 tab(#54899);刷新 question composer、澄清只适用于某个 model variant 的时间线提示(#54822 / #54880);diff 配色细化、未读指示移入 session tab(#52551 / #53570)。
    • Desktop 修复:steer 的消息从第一帧起就显示为 pending、并在服务端回显前渲染内联附件(#55251 / #54650);保留原始媒体数据至 256 MiB 以保证 artifact 预览可用(#55018);模型目录刷新时保留 session 的模型选择(#54481);从地址栏关闭浏览器 tab、对已恢复或已打开的 tab 抑制错误的缺文件提示(#54501 / #55022);阻止启动时的 project-store eviction 循环、去掉竖直 tab 之间的悬停缝隙(#55078 / #54866)。
    • SDK:Solid client 导出 lastAssistantWithUsage 以稳定定位决定当前上下文用量的 assistant step(#53785);加载 session family 计入用量总额时包含全部分页的子 session(#53785);乐观的 pending message 接纳内联 data-URL 文件让附件立即渲染(#54650)。
    • Extensions:为 Effect 与 Promise 插件新增 ctx.permission.assert,让插件能用已配置的权限规则与原生审批提示(#54930);Figma 插件改用公开端点与默认 OAuth 配置并支持 Git 安装与开发版(#55252 / #55304);从 workspace 解析 Figma 插件的 peer 依赖(#55269);每个被拒绝的 Promise hook 各自关联到自己的工具调用(#55263,致谢 @1052326311)。
    • 完整 notes: dev:CHANGELOG.md(2.x 不发 GitHub Release)

其他重要 commits / PRs(按重要性挑选):

  • #55300 已合并 — chore(tui): revert OpenTUI 0.6 upgrade(+765/−1630,103 个文件,10-14 04:27): 临时撤销 OpenTUI 0.6.2 / 0.6.3 的升级(65f8907708、d0a2ce32de 及对应的 Nix hash 更新)回到 0.5.17。原因写得很直接:OpenTUI 0.6.x 在构造 SyntaxStyle / TextBuffer / EditBuffer / OptimizedBuffer 时要求显式提供 NativeResourceOwner(例如 renderer.nativeScene),这打破了现有 TUI 插件的单参调用 SyntaxStyle.fromStyles(styles)。bot 生成的 PR 段补充了公开 API 影响:@opencode/plugin 的 OpenTUI peer 范围从 >=0.6.3 退回 >=0.5.17,@opencode/theme 的 generateSyntax 去掉 owner 参数。
  • #55524 已合并 — fix(schema): publish config schema that accepts V1 and V2 shapes(+94/−8,10-14 23:09): https://opencode.ai/config.json 是每个 opencode.json(c) 用的 $schema,V1 与 V2 都读它,而它是 packages/opencode 从 dev 移除时被冻结进 packages/console/app/public 的静态 V1 文件——结果是编辑器把合法的 V2 配置(permissions、agents、providers、mcp.servers、skills: []、update、warming 等)标成错误。改为部署时生成:V2 形状来自 @opencode/schema/config 的 Config.Info,V1 形状取自冻结的 V1 快照(仅 autoupdate 描述更新,仅 V1 认识的字段标 deprecated),两版共有的键保持 V2 形状但共享对象也接受其 V1 属性,skills 因为换了类型所以两种形状都接受;根改成扁平的 object schema 而非根 $ref,allowComments 与 allowTrailingCommas 保留。console app 的 build 在 vite build 后跑生成器写到 .output/public/config.json,dev 与 production 部署在 opencode.ai/config.json 提供它,v1 分支只部署 app.opencode.ai 因此从不碰这个文件;docs 站点的 packages/web build hook 也改为跑生成器。
  • #55267 已合并 — fix(core): give managed configuration highest precedence(+72/−32,10-14 02:28): #54921(#51107)因 V2 里 policies 的工作方式把托管配置(/etc/opencode、%ProgramData%\opencode、/Library/Application Support/opencode、macOS MDM preferences)放在最低优先级,本 PR 改回最高——正文承认这是 #54921 的 follow-up,因为 V1 给的是最高优先级、有用户报告他们需要保留同样行为,即使有 policies。细节:policies 按加载顺序反向求值,所以每个托管文件的 policies 被拆出来先加载,使它们高于全局与项目 policies;Console 组织级 policies 仍然压过一切。作者原话:「普通配置的 policies 与托管配置的 policies 处理方式略有不一致,但我们觉得这种不一致会带来更好的体验,尽管有点怪。」
  • #55306 已合并 — feat(desktop): pair devices through remote access(10-14 05:56): 走 OpenTunnel 远程访问,二维码 + 可复制链接。
  • #54930 已合并 — feat(plugin): let plugins assert permissions(10-14 01:28): Effect 与 Promise 插件的 ctx.permission.assert。
  • #55553 已合并 — fix(app): keep project settings open when the project folder is missing(+181/−17,10-14 23:40): 正文给了一张因果图并逐条对应——项目文件夹被删后打开 Settings → project → Extensions 会让 projectPluginList 里的 plugin.list({ location }) 抛 404 LocationNotFoundError,Solid 的 resource.latest 重新抛出,而设置页与应用根之间没有 ErrorBoundary,于是整个窗口变成错误页;桌面端重启时会重开上次的设置 URL,因此重启也是同一个错误。修法:ProjectFolderMissing 读取 useWorkspaceLocation().missing 并在 General 与 Extensions 页显示文件夹路径;四个设置列表在请求失败时回落到空列表;加了两处作用域错误边界(设置内容保留导航,新 session 路由把错误页显示在自己的面板里)。
  • #55547 已合并 — fix(cli): default the Windows service to port 45278(+48/−10,10-14 22:41): Windows 用 0xC000–0xFFFF(49152–65535)做出向连接,而 Hyper-V 与 WinNAT 会在开机时从该范围里各保留 100 端口的块,默认服务端口 0xC0DE(49374)落在其中,于是某些开机后 serve --service 报「已被其他进程占用」而该端口上其实无人监听。规则是一行代码:if (platform === "win32" && port >= 0xc000) return 0xb000 | (port & 0xfff)——release 默认在 Windows 上变成 0xB0DE(45278,即 0xC0DE − 4096,向 v1 端口致意),local 变 0xB0DF,preview 保持 channel 哈希;macOS / Linux / WSL 保持 49374,显式配置的 port 仍优先。IANA 把 45278 列为未分配(45186–45513 块)。升级影响写在正文里:本地客户端读注册文件里的服务 URL 会自动跟随;已保存的 :49374 URL、局域网配对过的设备、指向 Windows 主机的 SSH 转发全部失效,用户需要重新配对或 opencode service set port 49374 保留旧端口。
  • #51062 已合并 — fix(mcp): pass tool input as permission metadata(10-14 23:52): MCP 工具的入参作为权限元数据传递——与 #54930 的插件 permission.assert 是同一件事的两面。
  • cdd3aa7(#55524)、2ae7ec8(#55553)、3943b84(#55547)、7291f3e(#55541 console 把 API route handler 移出 route module)、1e63a3b(#55539 加载已配置的 instructions)、8ffbcc2 / fe1717b / b474b84(TUI:停靠 diff 面板间距、把 diff 侧面板放到 experiment 后面、非活动按键提示用 action disabled token)、c0d41d2(#47152 在插件面板槽里渲染 diffs)、81d5708(#55064 在 session UI 里汇总每一轮改动的文件)、165cd2e(#55306)、f576da5(#55297)、6dc4d4e(#55267)、6a7cedc(#54930)、89e043b(#55269)、7351718(#55263)、52ba7d6(#55276)、def5d94(#55300)

社区讨论 / 行业方向:

  • #55389(core: mid-session context notice injected after a tool output wedges Responses-API sessions,@thystips,5 条评论): OpenCode V2 在指令或工具来源中途变化时,会往 session 历史里注入一条 system 消息(这是设计如此:指令变化以按时间追加的方式记录,而不是重写已缓存的前缀)。当这条 notice 恰好落在一个以 tool output 结尾的 assistant message 之后时,OpenAI 兼容的 Responses 端点会拒掉整条请求:400 "A tool output cannot be combined with new developer or system context."。致命之处在于notice 已持久化进历史,于是之后每一轮都重放同一个非法序列,session 永久不可用——重试、resume、/compact、换模型全部同样失败;而且不需要任何用户动作就能复现(服务重启 / opencode 自动更新)。作者排除了插件来源(notice 来自 core 的 core/instructions、core/skill-guidance、core/codemode、core/mcp-guidance、core/environment、core/date),环境为 2.0.29(2.0.28 同样可见)、Linux、kitty、3 个本地插件。
  • #55367(server (NixOS): watcher subscribes /nix/store as parent-directory watch … consuming ~523k inotify watches,@britter,5 条评论): NixOS 上刚启动的 opencode serve --service 几秒内吃掉约 523,000 / 524,288 个 inotify watch(fs.inotify.max_user_watches),用尽每用户预算后机器上所有其他文件监听程序都以 ENOSPC 失败(作者强调这是 inotify 耗尽而非磁盘空间)。触发条件是 ~/.config/opencode 由 home-manager 管理(home-manager 把一切物化在 ~/.config 下,skill derivations 的父目录于是变成 /nix/store)。作者在 10-14 主动更正了最初把根因归给「watcher 跟随 .direnv symlink」的说法:watcher 根本不跟随 symlink,它直接把 /nix/store 订阅为父目录监听。与 #53416(file watcher 重启循环)相关,作者主动询问是否该拆成独立 issue。
  • #55271(ai: OpenAI Chat tool-content guard aborts session drain without identifying the offending part,@mradwankhalil,5 条评论): 一个本地打了补丁的 2.0.28 后端在发邮件 / MCP 工作流时拿到的是本地降级错误而不是模型 HTTP 错误:AI.Error: OpenAI Chat tool messages only support tool-result content for now,栈为 OpenAIChat.fromRequest → LLM.compile → SessionStep.attempt → SessionRunner.runStep → SessionRunner.drain,cause 是 AI.Error.InvalidRequest,请求从未到达 provider。作者明确澄清这是消息信封的内容类型拒绝,不是嵌在合法 tool result 里的媒体 MIME 类型被拒,且 guard 也存在于未经修改的 v2.0.28 源码里(lowerToolMessages 拒绝任何不满足 supportsContent(part, ["tool-result"]) 的顶层 tool-message content part)。诉求不是移除 guard,而是三件事:错误里带上出错的 message / part 索引与内容类型、给出一条恢复路径而不只是失败的 drain 异常、在 core→AI 请求边界加一个回归以定位是谁生产了这种输入——同时强调任何兜底都必须保持 tool-call / result 配对,静默丢弃任意 tool 历史是不安全的。
  • #55290(Desktop-spawned background service ignores env from service config,@believening): 桌面端自己派生共享后台服务,但不像 CLI 那样应用 opencode service set env(存在 ~/.config/opencode/service.json)里的环境变量;派生出的 opencode-cli serve --service 跑在被清洗过的环境里,甚至自己注入 NO_PROXY=127.0.0.1,localhost,::1,于是需要代理才能访问 provider 的配置(正文举例 OpenCode Zen 走本地代理)在桌面端启动服务时就失效。第二个行为:当已有服务在跑且环境正确时,只要版本与桌面端自带的 CLI 版本不同,桌面端会把它杀掉并换成自己那个无 env 的实例——「让一个配置正确的服务保持存活,要求 CLI 与桌面端版本完全一致」。
  • #55324(desktop: clicking any tab inside a project freezes the app / blank white screen,10 条评论): 2.0.28 桌面端(Windows 11、win32 x64 安装版),项目已打开并在工作时点任意 tab 会让应用完全无响应、只剩白屏,tab 内容永不加载,只能完全退出重启。配置里只有 $schema 与 providers,无插件。
  • #55310(opencode uninstall deletes all sessions without backup,misleading help text,已关闭): 帮助文本写的是「Uninstall OpenCode, keeping session data, configuration, and state」,实际行为相反——opencode.db 里的全部 session 数据被永久删除且无备份。
  • #55333(Missing /restart command,MCP 配置变更需要整进程重启,已关闭): TUI 没有 /restart,改 MCP server 配置后必须 Ctrl+C 退出重进。
  • #55010(Snapshot repo bloats to 15 GB in 11.5 h on v2.0.27,4 条评论,仍 open): 窗口内状态未变——bot 在最新 dev(c1615b1)上的复现结论(项目 worktree 里含 OpenCode 自己的数据目录时,每次 snapshot capture 会把 snapshot 存储自己的新 loose object、临时 index 文件与 2 MB 以下的 pack 文件一起录进去,触发条件是 $HOME 本身是个没有 .gitignore 的 git 仓库)没有被推翻。报告者 @slamdunk111 的缓解已部署:受影响主机上 "snapshot": false 加一个每周 gc + 体积上限的守护脚本,并给 $HOME 仓库补了 .gitignore(.local/、.cache/、.npm/、.nvm/)——但他同时指出这些目录下的约 231 个文件此前已被跟踪,忽略规则对已跟踪文件无效,只挡住了新增抖动,彻底解跟踪需要 git rm --cached。
  • OpenCode 2 v2.0.29: responses continue past output limits(TurboAI,OpenCode 2 Version Tracker 系列,2026-10-14): 一份逐条对照的第三方追踪文,收尾判断是 「v2.0.29 的功能重量落在桌面端」——session token 与成本视图、连入运行中服务器的设备配对、provider 账号管理、图片预览缩放与 diff 配色全在一个版本区间里;并指出 1.x 线只发布终端界面,TUI 侧本区间唯一的改动是把 session 待处理状态上报给终端。
  • OpenCode launches OpenTunnel: Mobile devices can now remotely use AI tools stored on personal computers(Lookonchain): 报道 OpenCode 联合创始人 Dax Raad 发布 OpenTunnel——一个开源的内网穿透工具,为跑在本地电脑上的网站 / API / OpenCode 服务生成公开 HTTPS 链接,形态类似 Tailscale Funnel,同样支持端到端加密(流量直到抵达本地设备才解密,中间服务器读不到正常通信内容),并提供 SDK。文章提到 OpenCode 已完成与 OpenTunnel 的集成并计划在正式版里发布远程配对功能——本期 #55306 落地的正是这个能力。

信号观察:

  • 托管配置的优先级在 48 小时内被完整翻转:#54921 把它放到最低(@rntdrts 提出,理由是 V2 里 policies 的加载方式),#55267 把它放回最高。理由不是「哪个更安全」,而是 policies 按加载顺序反向求值——同一个 feature 的两种优先级会得出相反的策略优先级,于是只能选一边。正文里那句「这种不一致会带来更好的体验,尽管有点怪」是一个诚实的记录:这不是设计出来的行为,是两种正确需求相撞后的结果。
  • 「声明的东西与实际生效的东西不符」这个上期主题在本期继续,只是换成了部署层:上期是插件声明 features.tui: true 但 TUI 静默跳过;本期是 config schema 是冻结的 V1 文件导致合法的 V2 配置被编辑器标错(#55524),以及 Windows 默认端口落在系统保留块内、注册信息说服务在监听而实际上没有(#55547)。三处都是「元数据先冻结,运行时后演进」的产物。
  • 渲染层回退发生在升级当天:#55300 在 04:27 撤销 0.6 升级,理由是 0.6.x 的 NativeResourceOwner 强制参数打碎了第三方插件的单参调用。配合 #54930(插件可 permission.assert)与 #51062(MCP 工具入参作为权限元数据)看,v2 的扩展面在两周内同时经历了「加能力」与「降底座要求」两件事。
  • 新 issue 里最集中的形态是「静默地把一个数字变成一个坏状态」:#55389(一条持久化的 notice 让 session 永久 400)、#55367(523k/524k 个 inotify watch 耗尽)、#55271(guard abort 了 drain 却不说是哪一条)、#55290(桌面端静默替换掉配置正确的服务)、#55310(帮助文本说保留、数据全删)。五个 case 都不崩溃得很响,而是把错误变成一个不再变好的数字或一个不再生效的声明。
  • window 内新增 155 个 issue(按 comments 排序的头部里,#55443 与 #55435 是 free tier 只能在 OpenCode 内使用的官方推广帖,#55473 是 Go 订阅取消后的意外扣费)。opencode 的 Discussions 仍处禁用状态(hasDiscussionsEnabled: false),社区讨论段由 issue 区、dev:CHANGELOG.md 与外部检索补足。

agegr/pi-web

pi coding agent 的 Web UI| stars: 7,358 | open issues: 40 | 默认分支: main | 最近 push: 2026-10-14T15:01:52Z | 主页: (仓库未填 homepage)

近 N 周 release 重点:

  • 窗口期内无 release。最新仍是 v0.12.1(2026-10-13T06:53:04Z),v0.12.0(10-11)、v0.11.1(10-10)、v0.11.0(10-08)。
  • 窗口内仅 1 个 commit:7cc1803(10-14 08:42:33Z)docs: add a contributing guide with Pi Web's scope。正文:新增 CONTRIBUTING.md(含中文版),写明 Pi Web 是什么、什么不在范围内、什么容易合入、UI 规则与提 PR 前的检查清单,README 与 AGENTS.md 指向它;同时把中文、日文、俄文 README 移入 docs/ 以缩短仓库根目录,链接已重写。commit 由 Claude Opus 5.5 co-author。

其他重要 commits / PRs:

  • 7cc1803 main — docs: add a contributing guide with Pi Web's scope(@Alex Yang, 10-14 08:42)
  • 窗口期内无 PR 关闭(合并或关闭均为 0)。

社区讨论 / 行业方向:

  • #1240(New session silently falls back to another model when the default model is provided by an extension provider,@NOHNOLIFE): 当 settings.json 的 defaultProvider/defaultModel 指向一个由 extension 注册的模型(如 pi-claude-bridge → claude-bridge/claude-opus-5-5)时,不带显式模型创建的新 session 会静默地跑在第一个可用的内置模型上(如 openai/gpt-6.1-sol)并且永远不会切到默认值——模型选择器显示的是默认模型,prompt 实际跑在 fallback 上。显式选同一个 extension 模型(切走再切回)则正常,因为那条路径会带上 provider/modelId,服务端会把 set_model 推迟到 extension 就绪之后。环境 pi-web 0.12.1 + pi-coding-agent 1.2.0 + pi-claude-bridge 0.9.3 + Windows 11 / Node 22。这条与 pi 本期合并的 #10913(resolveModelReference 收敛成一条 provider 选择策略)是同一件事在下游的两端。
  • #1226(Settings/chat endpoints (/api/auth/providers, /api/skills) reload all extensions per request,@flying-dragon-ai): 两个只读端点每个请求都通过 SDK 的 resource loader 重建整张扩展图,而它们跑在服务 UI 的同一个 Node 上。冷缓存时每个请求花 10–20 s CPU、阻塞 Next.js 事件循环,让包括设置面板自身的 fetches 在内的所有端点排队。正文给出的链条指向 lib/model-runtime.ts 的 createModelRuntimeWithExtensions() → createAgentSessionServices({ cwd: agentDir, agentDir }) → 完整 resourceLoader.reload()(全部 extension、jiti、TS 转译),并指出这些端点自己就是让工厂缓存变冷的原因。作者明确说这解释了「打开 Settings 渲染慢」以及新 session spawn 反复付全额冷导入。正文点名的上游 issue 是 pi 的 #10911(extension 工厂缓存被任何 cwd 切换清空,多项目 host 每次新 session 都重新 import 全部 extension)。
  • #1256([Perf] High memory footprint (~1GB RSS) during active sessions,@haigou-web): 一份带实测的性能报告。空闲态(10 分钟无活动轮询):一次 major GC 后稳态基线约 271 MB,9 分钟纯空闲只涨 10 MB(271 → 281 MB);/api/agent/running 连续 20 次约 6–7 ms、内存 delta 0.0 MB,/api/sessions 约 7–15 ms、delta 0.0 MB——后台轮询与目录扫描本身不漏。活跃会话:一旦 session 执行多轮工具调用并流式输出,RSS 从约 270 MB 迅速爬到 1,068 MB+,而 V8 在 64 位上默认 max heap 约 4 GB,major GC 被推迟,于是前端间歇出现「Offline / Reconnecting」。环境 pi-web 0.12.0(production)、Node v24.18.0、Windows 11 x64。
  • 讨论区 #1255(Session-first instead of project-first,@kozak-codes): 一条信息架构提案,动机是用户在多台机器、多个 project / workspace 之间反复切换来找需要关注的 session,经常把 session 弄丢;提议把 projects | workspaces | sessions 的面包屑反过来——先列出跨全部 project / workspace 甚至跨机器的 session 全集,标注运行中 / 未读,支持置顶,在每个 session 名下显示 machine | workspace | project;创建新 session 时点加号再选目标,或在 workspace 的三点菜单里加「create session here」;可按 recent / machine / project / workspace 过滤。

信号观察:

  • 仓库的第一个 commit 是写「什么不在范围内」:在只有一次提交、零个 PR 的窗口里,CONTRIBUTING.md 直接声明 Pi Web 是什么、什么不在范围内、什么容易合入。这与 pi 主仓用 AGENTS.md 定义自身边界是同一套做法——下游项目开始把「边界」当作需要写下来的资产,而不是靠 issue 区自然涌现。
  • 两个新 issue 精确命中上游当天的修复:#1240 对应 pi 的 #10913,#1226 对应 pi 的 #10911。上游修的是「一条策略」,下游报的是「两个入口」,中间的错误由 SDK 的 provider 选择时机造成——这类跨仓因果在上游 changelog 里看不到,只有把 issue 并排读才显形。
  • 性能报告的形状值得注意:#1256 没有停在「内存很高」,而是把空闲态与活跃态分开测,并指出空闲期不漏、活跃期陡增,且给出 /api/agent/running 与 /api/sessions 的延迟与 delta 作为「后台机制是干净的」的证据。先证伪再归因的写法,比单纯的数字更有可复核性。
  • 15 个新 issue 里剩下的是渲染与移动端输入体验(#1239 时间戳无视系统 24 小时设置,iPad Safari / Mac Firefox;#1227 iOS Chrome WKWebView 输入框卡顿与输入法文字乱序,Safari 正常;#1252 小字号可读性)与功能提案(#1237 会话标题自动生成、#1228 侧栏批量删、#1229 按主题分组、#1230 TODO 面板、#1232 commandcode 模型添加——已关闭)。

vectorize-io/hindsight

Agent memory 系统:把 agent 经历过的事转成分层知识(facts / observations / mental models / knowledge pages),Recall 同时跑四种检索,Reflect 在 bank 上推理| stars: 49,687 | open issues: 176 | 默认分支: main | 最近 push: 2026-10-14T16:03:42Z | 主页: https://hindsight.vectorize.io/

近 N 周 release 重点:

  • 窗口期内无 release。最新仍是 v1.0.0(2026-10-13T14:08:48Z)(上期已详述),上一版 v0.10.3(10-08)。官方博客自 10-13 的 Memlake 长文之后无新文(博客列表最新依次为 memlake 10-13、grok-bot-agent-memory 10-09、version-0-10-3 10-08、paperclip-agent-memory 10-05)。
  • 窗口内仅 3 个 commit,全部来自 @Nicolò Boschi:
    • d5b1d42(10-14 15:50)feat(control-plane): identify dataplane requests with a hindsight-control-plane User-Agent (#5536)——v1.0 里的 #5466 已让每个 integration 用自己的 User-Agent 自报身份,这是把同一动作延伸到控制面:数据面请求现在会被标成来自控制面。
    • dabefc8(10-14 14:28)feat(webhook event delivery ids (#5576)。
    • 7a2df55(10-14 09:43)fix(client): stop the export poll loop from overrunning its timeout on Windows (#5568)。

其他重要 commits / PRs(按重要性挑选):

  • #5536 已合并 — feat(control-plane): identify dataplane requests with a hindsight-control-plane User-Agent (@Nicolò Boschi, 10-14)
  • #5576 已合并 — feat/webhook event delivery ids (@Nicolò Boschi, 10-14)
  • #5568 已合并 — fix(client): stop the export poll loop from overrunning its timeout on Windows (@Nicolò Boschi, 10-14)
  • #5575 已关闭 — Claude Code plugin: retainRoles ["user"] 仍会保留 compaction 摘要、subagent 通知与命令输出

社区讨论 / 行业方向:

  • #5565(Fact extraction: error prose containing “no facts” is accepted as zero facts): 抽取环节返回的错误散文,只要句子里出现 “no facts”,就被当作「这条确实没有事实」接受——抽取失败与抽取为空在数据上不可区分。
  • #5582(retain: missing top-level facts silently succeeds with zero memories): 同类问题的另一半——顶层 facts 字段缺失时 retain 静默成功,返回零条 memory。
  • #5572(consolidation: a schema-invalid reply is never re-asked with its validation errors): consolidation 拿到不符合 schema 的回复后从不带着校验错误重问,而 retain、reflect、delta refresh 都会——三条路径里只有一条缺这个环节。
  • #5574(delta-mode mental models grow to 3-4x max_tokens): delta 模式下 mental models 的实际产出长到 max_tokens 的 3–4 倍,因为这个预算只是 prompt 里的一个提示,没有任何机制强制它。
  • #5573(retain_mission wording is copied into extracted facts by small models): 小模型会把 retain_mission 的措辞原样抄进抽取出的 facts,而 FOCUS block 里没有一条「不要复用这段措辞」的护栏。
  • #5566(Generated coding-agent skill advertises unavailable tools when discovered by Opencode V2): 生成的 coding-agent skill 在被 OpenCode V2 发现时宣告了不可用的工具——与上期 opencode #55084 的「声明的能力 ≠ 实际加载的代码」是同一类问题,跨到了这个仓库。
  • #5569 / #5580 / #5581 / #5583 是 Hermes plugin 与 hindsight-openclaw 的四条:retain 一个已 compact 的 OpenClaw session 会以 AppendWouldTruncateDocument 失败且 backfill 无法恢复;本地嵌入模式下 Docker 镜像找不到 uvx(#5192 的兜底只搜 ~/.hermes/tools 而不搜 Hermes 根目录);插件在非 UTF-8 Windows locale 下加载失败(_plugin_version() 读 plugin.yaml 时没指定 encoding=);运行期通知仍会触发自动记忆,抽取之后需要一个受支持的 turn-origin 契约。
  • #5567(Support ONNX for custom local reranker models)、#5570(Helm chart: add Gateway API support)、#5571(Helm chart: make revisionHistoryLimit configurable)是三条常规功能请求。
  • 讨论区本期没有新议题;#4830(integration of human authored documentation,10-14 05:25 更新)与 #5501(Memory Tournament 邀请,10-12)是最近活动的两条。
  • Hindsight: Agent Memory That Learns(Repository Radar PR#43,2026-10-14): 一份当日更新的第三方档案,标题里的事实点直接对应本仓库的发布物:MIT 授权、Python、开源核心是 1.0 且跑在 PostgreSQL 上、Memlake 引擎(Hindsight Cloud 与 Enterprise 专属)把 memory 移到对象存储。数字:超过其追踪的 86% 仓库的提交与发布频次、每周 129 次提交、290 位贡献者、每周发布节奏;并复述了 Memlake 的对照——Vectorize 报告在四台机器上 1 亿条 memory 的 p99 低于 100 ms、recall 在约 200k memory 的 bank 上从 Postgres 的 5.3 s 降到 113 ms。另引论文数字:LongMemEval 91.4%、LoCoMo 89.6%,以及一个 20B 模型用 Hindsight 得 83.6% 而同底座全上下文只有 39%。
  • Hindsight 1.0 + Memlake(Superpower Daily,首次收录 2026-10-14): 一份选型向的收录稿,定位是「开源 agent memory + Rust 对象存储引擎,而不是数据库集群」,卖点是免费自托管与云选项并存,便于评估者绕开基准声明。

信号观察:

  • v1.0 之后的第一个完整工作日只有 3 个 commit,全部是记账性质的:给控制面一个 User-Agent、给 webhook 事件 delivery id、修一个 Windows 上的轮询超时。没有一个碰记忆质量或检索路径——1.0 把 API 冻结之后,重心确实离开了主库。
  • 14 个新 issue 里有 5 条在讲同一件事:静默的零结果。#5565(错误散文被当成「没有事实」)、#5582(缺 facts 静默成功)、#5572(consolidation 不带校验错误重问,而其它三条路径都会)、#5574(预算只是提示、无人强制)、#5573(prompt 措辞被抄进数据)。对一个记忆系统来说,「我什么都没学到」和「我没学到」必须在数据上可区分,否则所有下游的 benchmark 都在测一条静默的路径。
  • 上期把「什么算好记忆」写进测试(#5525 改 retain 测试的判定标准),本期开始修测试没覆盖的分支(#5572 的 consolidation 没有重问机制)。这是 1.0 承诺兑现之后的正常形态:承诺之后的第一批请求是关于「失败怎么报」的。
  • 「声明的能力 ≠ 实际生效」跨到了另一个仓库:#5566 报告生成的 coding-agent skill 在被 OpenCode V2 发现时宣告了不可用的工具。上期这条主题出现在 opencode 内部的插件加载路径上,本期它出现在第三方仓库对另一个 agent 主机的适配层。能力声明的保真度正在成为跨仓库评估的一项。

yxc023/yxc023.github.io

承载 daily-research 报告的 blog 仓库(Astro + 部署到阿里云 OSS)| stars: 1 | open issues: 27 | 默认分支: master | 最近 push: 2026-10-14T00:33:13Z | 主页: (仓库未填 homepage)

近 N 周 release 重点:

  • 该仓库不使用 GitHub Releases,releases 接口返回空数组。窗口期内无 release。

其他重要 commits / PRs:

  • a3e9e7d master — auto(reports): 同步 daily-research 2026-10-14(10-14 00:33:08Z,即上一期报告触发的自动同步)

社区讨论 / 行业方向:

  • 窗口期内未检索到公开讨论;27 个 open issues 为历史累积。

信号观察:

  • 窗口内仅一次自动同步 commit,无人工改动。该仓库在本流程里的角色是产物落地位置而非研究对象,每期的变化就是上一次 deploy-blog.sh 的执行结果。

跨项目观察

  1. ACP 的转折不是「开始建设」,是「开始让步」。 上期结论是「静默期、讨论从加方法转向定责任」;本期一天 13 个规范 PR,方向全部向下:MUST → MAY(取消级联)、MUST → SHOULD(stop reason)、删掉配额分类与替代错误通道段落、把插入截止点交给实现。反馈来源被 PR 正文点名,且都是实现方(Codex 团队、Claude adapter)。协议规范性的锚点已经从「设计意图」移到「最先实现 v2 的两家用例实际做了什么」。 与此同时 tag 停在 v1.11.0、release PR open,而 npm 上已经有一个只支持 v2、无兼容层的第三方 agent 在发布——发版是这条链路上唯一落后于实现的环节。

  2. pi 的 chord 在九小时内跨了三个协议版本,且没有发版。 05:34 宣告 PROTOCOL_VERSION = 2(版本不同即以 protocol-version <n> 断链),11:55 到 protocol 3,14:29 到 protocol 4;同一天把 Handle → Ref、BehaviorOf → ImplementationOf、kind → variant、eager → lifetime、epoch → code version,ServeOptions 变成联合类型且 ServeOptions.state 直接消失。这是一次词汇表重写而非增量演进。 目前对用户不可见(chord 在 v1.2.0 里被移出依赖、尚未作为发布包对外),但「不兼容即断链」的协议形态已经确定——等它随包发布时,落后的对端不会被降级,只会被关掉。同期落地的 00d8d04(reload / retirement 正确性与旧 code generation 的 GC)逐条对着 spec 章节修,说明重写之后紧接着就是对着规范补正确性。

  3. 「声明的与生效的不符」这一主题在本期换了三层皮,且全部跨到了部署层。 上期是 opencode 插件声明 features.tui: true 而 TUI 静默跳过;本期是 config schema 是冻结的 V1 文件导致合法的 V2 配置被编辑器标错(#55524)、Windows 默认端口落在 Hyper-V / WinNAT 保留块内导致「注册说在监听而实际没有」(#55547)、hindsight 生成的 skill 在 OpenCode V2 下宣告不可用的工具(#5566)。元数据先冻结、运行时后演进,是同一个产生问题的机制。

  4. 跨主机与跨信任边界的 context 归属,在两个项目里同一天各出一个问题,方向相反。 pi 侧:远端 Chord 引用接受来自无关主机的 Ctx 并执行方法,本地引用却以 invalid/foreign_ctx 拒绝(#10959)——同一契约的校验随部署位置而变。ACP 侧:#2399 要求接收方忽略未知对象属性(含嵌套 capability 字段)而不放松已知字段校验,#2397 明确「本地 flag 与生成的类型不宣告对端支持」。前者是在收紧一条漏掉的校验,后者是在明确一条不该收紧的边界——两者都在回答「谁被允许宣称什么」。

  5. 配置优先级正在被当成需要吵一架的设计决策,而不是实现细节。 opencode 在 48 小时内把托管配置从最低(#54921)翻到最高(#55267),并诚实记录了原因不是安全模型而是 policies 按加载顺序反向求值;pi 的 #10913 则把「精确匹配里没有唯一已认证 provider」从「按 catalog 顺序取」改成报错。两边都在做同一件事:当配置可能来自多个地方,把「谁赢」显式化,并且说不清时报错而不是随便选。

  6. 本期的缺陷形态高度一致:把一个错误变成一个不再变好的数字,或者变成一句不再生效的声明。 #55389(一条持久化的 notice 让 session 永久 400,且无需用户动作即可触发)、#55367(523k / 524k 个 inotify watch 耗尽后整机 ENOSPC)、#55271(guard abort 了 drain 却不指出是哪一条)、#55290(桌面端静默替换掉配置正确的服务)、#55310(帮助文本说保留 session 数据、实际全删);hindsight 侧则是 #5565 / #5582 / #5572 / #5574——「抽取失败」与「抽取为空」在数据上不可区分,「预算」只是一个 prompt 提示而非被强制的上限。 这一类缺陷不会以崩溃的形式出现,因此也最难在常规测试里被看见。

  7. 功能重量继续向桌面端与宿主侧集中,agent loop 本身被当作已定。 opencode v2.0.29 的四个 headline 全部是 desktop(设备配对、provider 账号管理、token 与成本视图、图片缩放平移),TUI 侧唯一新增是把待处理状态上报给终端;第三方追踪文给出的判断同样是「功能重量落在桌面端,而 1.x 线只发布终端界面」。pi-web 15 个新 issue 全在运行时性能与信息架构上;ACP 的增长体现在 client registry 与第三方实现上。协议与 loop 的不确定性正在被推到宿主与部署形态里去消化。

元信息

  • 报告生成时间: 2026-10-15T00:34:46Z
  • 基准时间: 2026-09-08T09:23:29Z(按 spec 读取自上次报告 reports/latest.md 的 基准时间: 字段,自 2026-09-08 起未变)
  • 扫描窗口: 2026-09-08T09:23:29Z → 2026-10-15T00:34:46Z(约 36.6 天);本期新增内容全部落在 2026-10-14T00:30:22Z 之后的约 24 小时
  • 数据源: GitHub API(gh CLI)+ mmx web search;Discussions 用 GraphQL 拉取;Issue 用 search API 补充;opencode 的 2.x release notes 取自 dev 分支的 CHANGELOG.md;hindsight 官方博客列表直接抓取
  • API rate limit 剩余: 4951 / 5000(core,抓取完成后查询)
  • 抓取失败: 无(6/6 仓库的 repo / releases / commits / pulls 全部成功)。补充说明:anomalyco/opencode 的 Discussions 仍处禁用状态(hasDiscussionsEnabled: false),其社区讨论段改由 issue 区、dev:CHANGELOG.md 与外部检索补足;yxc023/yxc023.github.io 的 releases 接口返回空数组(该仓库不使用 GitHub Releases)
  • 补充说明: commits 按 per_page=100&since=2026-09-08T09:23:29Z 抓取;其中 opencode / pi / pi-web / hindsight / ACP 五个仓库的 100 条已触页(最早一条落在 2026-10-03 ~ 10-13 之间),但都晚于本期新增起点 2026-10-14T00:30:22Z,因此本期的 24 小时内容未被截断(opencode 38、pi 24、ACP 19、hindsight 3、pi-web 1 个新 commit)
  • 增量说明: 基准时间字段连续 7 期未变,窗口逐日变宽;本期「本期速览」与「跨项目观察」只针对自上次报告(2026-10-14T00:30:22Z)以来的新增内容,历史窗口内的 release / commits 细节不在本期重复

评论