Files
goodbuddy/docs/review/stage-audit-fixes-2026-10-05.md
mesalogo bbf24c282a fix: resolve runtime, review, channel and chat state failures
Keep remote startup cancellable without blocking other sessions and surface local OpenCode submission failures promptly. Preserve supervisor project isolation, pause behavior and valid story destinations.

Restore generated-image channel delivery, Telegram reconnection on unchanged Save and DingTalk business-error retries. Preserve virtualized message disclosures using sparse state and release stale supervisor UI requests.

Add production-path regressions, Electron checks, isolated SQLite validation and audit evidence. Fix the SDK cleanup test fixture lifetime under garbage collection without weakening its assertions.

Validation: 6136 tests passed, 87 skipped; typecheck, lint and diff checks passed. Seven real text-model calls, current-source Linux x64 Host scenarios and large-history Electron comparisons completed.

Release note: Fix stuck runtime requests, inconsistent review results and channel delivery failures, and retain expanded details while browsing long conversations. Remote runtime fixes require an Agent build containing these changes.
2026-10-05 10:25:43 +08:00

8.7 KiB
Raw Permalink Blame History

阶段审计修复与验收

本轮十项审计发现均已修复,最终完整测试、类型检查和 lint 通过。修改基于 126dbc57 后的工作树,未提交或发布。数据验证使用隔离的合成 SQLite 和本轮真实 Runtime 产生的事件,没有改写 portable 原始用户数据。

修复清单

编号 问题 必须覆盖的失败场景 状态
A01 远程 ACP 启动占用全局控制队列 延迟初始化时其他绑定查询、取消、看门狗和关闭仍可完成 已修复;回归与真实 Host 通过
A02 本地 OpenCode 提交失败后等待静默 SSE 拒绝、错误响应、提交超时均及时结束并保留错误,正常流不变 已修复;回归与真实本机模型通过
A03 监督候选生产链路遗漏项目参数 真实生产装配与 Worker 路径尊重 projectId/crossProject 已修复;生产 Worker、SQLite 与真实模型通过
A04 最终候选查询期间暂停仍发布 暂停后不保存结果,正常完成仍保存 已修复;暂停/继续与取消回归通过
A05 在途故事分配写入已移除故事 移除候选后不得产生隐藏关联或消耗待处理事件 已修复;移除/合并/拆分回归通过
A06 图片生成结果被通道严格契约拒绝 含 artifactIds 的执行结果通过生产通道交付,桌面产物保留 已修复;生产服务与 SQLite 发件箱通过
A07 Telegram 原样保存不能恢复轮询 终止错误解除后原样保存重启,正常运行保存不重复启动 已修复;组件与 Electron 生产入口通过
A08 钉钉 HTTP 200 业务错误被算作送达 非零 errcode 保留失败及重试上下文,成功回复正常交付 已修复;loopback HTTP 与 SQLite 重试通过
A09 监督视图请求失效后永久忙碌 刷新期间旧请求结束不覆盖新状态,控件恢复可用 已修复;组件与 Electron 通过
A10 虚拟消息行淘汰丢失展开状态 超过八行交互后滚出再滚回保持展开,DOM 仍有界 已修复;组件、Electron 与缓存保留测量通过

验收要求

  • 每项记录旧实现失败、新实现通过的测试证据及命令。
  • 运行时改动检查本地与远程路径,Agent 改动在共享 Linux x64 Host 验证当前源码。
  • 真实模型请求保持有界,记录实际请求数;模拟 Provider 和真实 Provider 分开报告。
  • 数据验证使用真实 SQLite 合成数据或 portable 数据隔离副本,记录规模及一致性检查,不记录用户正文或凭据。
  • 性能检查遵守 docs/architecture/performance-principles.md,测量与推断分开;不删除动画、虚拟化、取消或正常功能来取得通过。
  • 最后运行完整测试、类型检查与 lint,并同步所属功能文档。

验证记录

复现与修复

范围 修复前证据 修复及验证
A01/A02 静默 SSE 三种提交失败不结束;挂起启动阻塞取消和其他绑定;协议分派只收到 start 启动等待释放 backend 和 socket 分派队列;相同启动合并、冲突拒绝;迟到 Session 单独关闭。本机提交失败取消所属订阅并保留原错误。九项新增回归通过
A03/A04/A05 八个新增用例中七个失败,既有取消场景原本通过;关闭跨项目仍收到其他项目候选,暂停后仍发布,已移除故事仍收到新关联 贯通批次参数;发布前检查取消;原事务中检查目标当前状态。96 项监督/Worker 定向测试通过,无 schema 迁移
A06/A07/A08 选择性回归九项失败、三项通过;图片结果失败、原样保存不调用重启、业务错误被记作送达 通道边界映射公开结果;异常轮询状态允许原样保存重启;有界解析钉钉业务响应。106 项通道测试、3 项 IPC 测试及 Telegram Electron 通过
A09/A10 控件保持禁用;超过八行交互后的展开状态丢失,Electron 原生交互也复现 失效请求释放等待状态;展开选择由历史面板保存,虚拟行卸载后可恢复。112 项相关组件回归及真实 Electron 通过

独立复审没有发现运行时修复引入的高置信度回归,但发现首次 A10 实现保存了未操作的默认展开值。跟进回归复现浏览 10,000 个作用域留下 10,000 条记录,现改为仅保存用户覆盖项并清理已删除来源;该修正包含在最终全仓测试中。

真实模型与 Host

本轮准确合计 7 次外部文本模型请求、0 次图片模型请求。另有 Telegram Electron 中的 2 次 loopback 模型请求,不计为外部请求。没有向真实消息通道收件人发送测试消息。

路径 真实外部请求 结果
Linux x64 OpenCode 2 当前源码工具执行、断开、恢复、测试 Agent 提升和事件重放通过;启动挂起时查询 48 ms、取消 216 ms
Linux x64 Continue 2 同类生产路径通过;启动挂起时查询 60 ms、取消 258 ms
Windows 本地 OpenCode 1 真实二进制正常返回固定文本,0 工具调用,总耗时 4,727 ms
监督生产服务与文件 Worker 2 147 字符合成消息完成提取和故事归属,总耗时 3.84 秒;无变化重跑新增请求为 0

Host 使用现有固定身份和加密凭据,测试资源位于 /root/tmp/gb-lifecycle-*。结束时所属进程为零,没有替换原 Host 安装。延迟是单次场景观察,不是 p95 或吞吐结论。完整命令、脚本及日志索引见运行时验证。

数据与性能

  • SQLite 合成库包含 10 个项目、1,000 个实体、10,000 个事件和 10,000 条事件实体关联。候选 ID 与排序逐项一致,数据计数不变、外键检查为空、完整性为 ok。真实 Host 事件另外通过生产数据库与批处理器写入:OpenCode 45 条/23 个 checkpoint,Continue 16 条/8 个 checkpoint,重放去重通过。
  • 激活项目隔离后,测量发现原相关子查询较慢,改用实体集合查询。三轮各十次项目查询,旧 SQL 合计 3,517/5,302/4,190 ms;新 Worker 路径含传输为 39.18/34.01/36.04 ms。120 事件归属事务为 6.63 ms。此结果仅适用于该合成库 SQL 对照,见监督后端证据。
  • Windows Electron 使用 2,000/10,000 条合成消息,原版与首次修复各三轮交替运行;后续缓存修正又做三轮对照。最大采样挂载量均为 15 个消息行、926 个 DOM 元素,展开、键盘、焦点、选区和滚动回归通过。缓存修正后的导航中位数为 38.5~39.1 ms,含聚焦后的两帧等待,不能作为纯渲染耗时或整体预算结论。
  • 未操作导航后缓存条目为零;13 条消息交互后保留 38 条用户覆盖项,删除消息后归零。该测量统计缓存条目,没有测量堆字节。方法、每轮数据及原有滚动回归见前端验证。

最终检查

命令 最终结果
npm test 518 文件通过、15 文件跳过;6,136 项通过、0 失败、87 跳过;852.63 秒
npm run typecheck Main、Agent、Renderer 全部通过
npm run lint 通过
git diff --check 通过

首轮完整测试的唯一失败为既有 cleanup-timeout。独立 GC 探针确认 mock 返回永不结算 Promise,却未保留待完成的 Request;GC 后 Undici 取消转发失效。测试夹具现保持 Request 存活至取消,并按真实 fetch 行为拒绝。原断言、调用顺序和一秒清理预算均保留,新增强制 GC 回归先在旧 mock 上失败,再在修正后通过。生产清理代码未因此调整。详见GC 复查。

最终全仓原始日志为 C:/Users/jiang/AppData/Local/Temp/opencode/a02-cleanup-final-20261005.log,退出码及时间记录为同名 .json。通道网络替身、发件箱及图片元数据验证见通道记录。

验证边界

本轮未做真实 Telegram/钉钉平台收发或付费图片生成,A06 验证的是生成完成后的生产交付契约。未做 macOS、Linux arm64、低端机节流、完整 App 性能预算或签名包安装验收,也未用用户生产大库证明性能。上述已测场景未观察到功能或性能退化,不能推广为所有设备和数据规模的保证。远程修复生效需要部署包含当前源码的 Agent;本轮没有提交、打包发布或升级用户安装。