Repository navigation
[PR] fix: show full OpenCode V2 reports without model context pollution - #5316
Conversation
(ai: vllm-qwen/qwen3.8-27b) 查重: 不重复。 对应 GitHub PR #5316(分支 标签: bug + opencodev2 + scope/ui + p3 —— 缺陷类(OpenChamber 里报告被截断且读起来费劲);涉及客户端为 OpenCode V2 车道;改动面是报告展示面(body vs description)及其配套过滤;p3——纯展示问题,TUI 通知与 Web UI 深链绕行都在,无数据丢失、无缓存泄露。 正在做独立审核(方向、回归面、代码质量、测试有效性),已本地复跑定向套件(34/34 绿)与 typecheck;结论按结构化八问跟进。 |
The msg_bili_report_ literal appeared twice (filter regex + id template); extract BILI_REPORT_ID_PREFIX and derive BILI_REPORT_ID_RE from it so the minter and the filter can never drift apart (ranxianglei#5316 review).
(ai: vllm-qwen/qwen3.8-27b) PR #5316 审核结论(独立审核,八问)1. 是什么问题 2. 什么原因导致的 3. 影响范围与严重程度 4. 怎么修复的 5. 是否有回归问题(逐项审过既有行为)
6. 是否破坏缓存 7. 是否改了设计方向 8. 是否引入新配置 测试有效性:两个新测试有牙——正向(生成的 ID 在四个 hook 下均被剔除、持久化历史本身不被改写、跨「重启」的第二进程实例仍能过滤)+ 负向(无 id 的 user 消息保留、同 id 但 assistant 角色保留、畸形 id 顺手小修(已直接修,独立 commit): 状态:分支 behind master,但 base 以来无任何 master 提交触碰这两个文件,merge-tree 验证无冲突。CI 在新 head( 判定:方向正确(修的是字段布局错配这个根因,不是继续调截断参数)、机制成立(ID 命名空间是该宿主下唯一可靠的排除手段——metadata 会被投影丢弃,ID 不会)、代码与测试达标。CI 全绿后可合(人工合并)。 |
(ai: vllm-qwen/qwen3.8-27b) CI 状态补充:新 head |
|
ework解决ci和冲突 并重新review |
…ontext hooks The PR adds context/compaction/title/generate session-hook registrations to createOpencodeV2Setup; the strict hook-name inventory assertion in tests/opencode-native.test.ts pinned the pre-PR two-hook list and broke on rebased heads (3 of 12 CI shards red). Update the expected list to the full registration order — the assertion keeps its exact-inventory teeth.
(ai: vllm-qwen/qwen3.8-27b) CI 修复完成(自动修复车道 attempt 1/3)。三个红 shard 的根因已定位,修复已在分支 head 上,新一轮 CI 全部测试 shard 已绿。 结构化结论
备注:本次运行期间镜像 check 缓存长时间停在旧 sha 的快照上未刷新(约 30 分钟),最终状态是用单次直接 check-runs 拉取核实的(非轮询)。若镜像 poller 持续停摆建议运维看一眼。 收工判定:阻塞已解除,PR head |
(ai: vllm-qwen/qwen3.8-27b) 冲突与 CI 已全部解决,并做了独立重新 review。当前分支头 做了什么
结构化八问
行为变更披露(旧→新):旧:完整报告在 description(被显示层截断)、body 为惰性占位行;新:完整报告在 body(```text 围栏)、description 为封顶提示,自动报告带 判定:可合并——冲突已解、CI 全绿、review 通过,等你点合并:#5316 |
ranxianglei
left a comment
There was a problem hiding this comment.
(ai: vllm-qwen/qwen3.8-27b)
审核结论(独立重读全 diff @ 2405b0177)
1. 是什么问题:OpenChamber 把 OpenCode V2 合成消息的 description 渲染成标题(截断)、body 渲染成正文;而 bili 此前把完整报告放进 description(1024/8192 截断)、body 只放一行无效占位文本——结果在 body-rendering 客户端上 /acp、/acp-cache 的报告只剩一条截断标题,全文读不到。
2. 什么原因导致的:字段布局错配——bili 用单一布局(description=全文、body=无效行)同时服务两类客户端,OpenChamber 的映射恰好相反。病因是「完整报告只存在于会被显示层截断的那个字段里」,不是截断参数问题。
3. 影响范围与严重程度:仅 OpenCode V2 原生插件 + body-rendering 客户端(OpenChamber 等)看自动报告的用户;纯展示缺陷(p3)——无数据丢失、无缓存泄露,TUI 显示不受影响,Web UI 深链可绕行。
4. 怎么修复的:两层互补。① 完整报告进消息 body(```text 围栏包裹),description` 保留原截断通知(TUI 不变);② 自动生成的报告铸专属 ID 命名空间 `msg_bili_report_<32hex>`,注册 `context`/`compaction`/`title`/`generate` 四个 session hook,按「user 角色 + 精确 ID 格式」在出站模型请求前剔除(in-place splice,兼容宿主数组引用传播)。hook 注册失败→整体回退旧行为(无效 body、不铸 ID)——降级不猜。手动粘贴的报告不匹配命名空间(ID 由宿主铸造),永不被过滤。
5. 是否有回归问题(逐项审过既有行为):
- TUI 显示链(
fitNoticeDescription截断/Web UI 链接前置/整行保留,#1602/#1612):代码未动,保持; resume:false投递语义(#809,防每次 /acp 触发空模型回合):保持;- 文件内其余路径(http.request / ws handshake hook、tool transform、conditional tools、event subscription / fork adopt、dispose 循环):未触碰,新注册并入同一
registrations数组统一 dispose,保持; - 代理侧账本/reconcile/prefix cache:被过滤消息根本到不了代理(host 侧预过滤),不受影响;
- plain proxy 模式、V1 车道、其他车道:不在 diff 内,不受影响;
- 无
kernel/改动、无配置面变更、无版本/lockfile 变动。结论:无回归。 - 有意行为变更(披露):旧=模型可见 body 恒为无效占位行 → 新(hook 可用时)=body 为完整报告、由 ID 从出站请求剔除;hook 不可用=逐字节回到旧值。原因:报告必须落 body 才能被 OpenChamber 显示,ID 过滤保证它不进模型上下文。
- 残留风险(记录,不拦截):机制依赖两个宿主契约——OpenCode 把合成消息自定义 ID 原样带入模型投影(作者真机 2.2.5 实测含重启存活)、四个 hook 实际收到可变
messages数组。若某宿主版本静默接受这些 hook 但不保留自定义 ID,完整报告会进入模型上下文(是污染,不是损坏);对未知 hook 名抛错的版本则安全回退。如遇此类版本再加版本门,不阻塞本 p3 修复。
6. 是否破坏缓存:不涉及——代理侧视图从未包含这些报告消息,prefix cache 与会话账本不变;compaction/title 的输入同样被过滤,报告内容不会渗入摘要或会话标题。
7. 是否改了设计方向:没有。仍是 agent 侧渲染 + host hook 过滤,不动 proxy wire、kernel、配置面、持久化。launcher 与 native 两模式共用 createOpencodeV2Setup(src/agent/opencode.ts:165、src/agent/opencode-native.ts:960),一并生效,与 PR 声明一致。
8. 是否引入了新的配置:无。没有新 env/config/CLI 面。
测试有效性:两个新测试有牙——正向(生成的 ID 在四个 hook 下均被剔除、持久化历史数组本身不改写、第二实例跨「重启」仍能过滤)+ 负向(无 id 的 user 消息保留、同 id 但 assistant 角色保留、畸形 ID msg_bili_report_invalid 保留、hook 抛错→回退无效 body 且不带 id),gate 双向纪律(#3617)满足;tests/opencode-native.test.ts 的 hook 清点断言从 2 项扩为 6 项并保留「精确清点」的牙齿(缺失/改名/乱序仍会红)。作者另提供真机 e2e(OpenCode 2.2.5 + mock upstream):完整报告留在会话历史、缺席于捕获到的模型请求、手动粘贴文本在场。
CI 与基线:head 2405b0177 全部 49 个 check-run completed、0 红 0 pending(单次拉取核实);分支 merge-base 即当前 master,mergeable=true,无冲突。
判定:方向打中根因(字段布局错配而非继续调截断),机制成立(ID 命名空间是该宿主下可靠的排除手段——metadata 会被投影丢弃,ID 不会),测试有牙,diff 干净(3 文件,每行都服务于目的),无回归。APPROVE,可由 owner 合并:#5316
📦 Merged Build PublishedThis merge to master was published as npm install -g billion-context@0.0.1023-master.1e7d400 # this exact build
npm install -g billion-context@master # always the newest merged build
|
OpenCode V2 status reports use a capped synthetic description, which OpenChamber renders as a title. Put the complete
/acpand/acp-cachereports in the message body while preserving the existing capped terminal notice. Exclude automatically generated reports from outgoing model requests by their dedicated message IDs; manually pasted reports remain available to the model.The context, compaction, title and generate hooks filter only user-role messages whose IDs match the plugin report namespace. IDs survive host restarts and OpenCode's session-to-model projection. If context hooks cannot be registered, commands retain the existing inert body. Both launcher and native mode share this setup; plain proxy mode is unaffected.
Validation:
Follow-up to #1612. Fixes #5315.