FNOS-033 测试用例
测试范围与需求分析
被测对象是 OpenCode 与 ZCode 用量胶囊的客户端显隐判定:是否按会话投影 wire view 的 next 取值、切走模型后是否立即隐藏、next 为空时是否退回 lastUsed。执行任务见 PLAN-FNOS-033,覆盖需求功能:
| 覆盖功能 | 关键风险点 |
|---|---|
| FNOS-033-01 OpenCode 胶囊随选择即时显隐 | 是否仍读 pending;next 为 null 时是否丢失 lastUsed |
| FNOS-033-02 同类插件口径一致且有回归 | ZCode 是否已用 next;策略(always/off/未登录)是否被改坏 |
测试环境
| 功能 | 目标环境 | 说明 |
|---|---|---|
| FNOS-033-01 | 包级测试 | 纯显隐判定可断言,不依赖 UI |
| FNOS-033-02 | 包级测试 | ZCode 纯函数与策略真值表 |
包级:pnpm --filter @tnnevol/dsh-opencode run check、pnpm --filter @tnnevol/dsh-zcode run check。
测试用例
FNOS-033-01 OpenCode 胶囊随选择即时显隐
| ID | 覆盖验收 | 步骤 | 预期 | 执行环境 |
|---|---|---|---|---|
| TC-001 | FNOS-033-01-AC-01 | next 指向其它供应商、lastUsed 仍是 OpenCode 时调用 readSelectedProvider | 返回新供应商;auto 判定 false | 包级 |
| TC-002 | FNOS-033-01-AC-02 | next: null、lastUsed 为 OpenCode 时调用读取 | 退回 lastUsed,返回 OpenCode | 包级 |
| TC-003 | FNOS-033-01-AC-01、AC-02 | next 指向 OpenCode go/zen 模型时读取并判定 | 返回 OpenCode;auto 为 true | 包级 |
FNOS-033-02 同类插件口径一致且有回归
| ID | 覆盖验收 | 步骤 | 预期 | 执行环境 |
|---|---|---|---|---|
| TC-004 | FNOS-033-02-AC-01 | ZCode:next 指向本插件 / 指向其它供应商(lastUsed 为本插件) | 分别显示 / 立即不显示 | 包级 |
| TC-005 | FNOS-033-02-AC-01 | ZCode:next: null 回退、投影缺失、空字段、always/off/未登录 | 与真值表一致 | 包级 |
| TC-006 | FNOS-033-02-AC-02 | 全仓库搜索用量显隐里的 projection.pending | 0 处命中 | 包级 |
测试执行结果
| ID | 结果 | 执行日期 | 证据/备注 |
|---|---|---|---|
| TC-001 | 通过 | 2026-10-26 | opencode usage-visibility.spec.ts「切到其它供应商时立即不显示」 |
| TC-002 | 通过 | 2026-10-26 | 同文件「优先 next,其次 lastUsed」 |
| TC-003 | 通过 | 2026-10-26 | 同文件 go/zen 用例 |
| TC-004 | 通过 | 2026-10-26 | 新增 zcode capsule-visibility.spec.ts |
| TC-005 | 通过 | 2026-10-26 | 同文件回退、空字段与策略用例 |
| TC-006 | 通过 | 2026-10-26 | 全仓库 grep 确认只有已修复的 opencode 曾命中,现为 0 |
包级汇总:@tnnevol/dsh-opencode 208 条通过;@tnnevol/dsh-zcode 169 条通过。
运行时汇总:DSH Web 与 DSH Desktop 各两个方向(zcode ↔ opencode)全部即时显隐,均未发送消息。
DSH Web 与 DSH Desktop 运行时验证(2026-10-28)
按测试用例文档规范的 DSH Web / DSH Desktop 口径执行。两客户端共用项目 DSH_HOME=<repo>/.dsh(profile 分别为 web / desktop),插件为仓库工作区链接构建(link: 指向 plugins/*,含本轮修复产物)。
| 项 | DSH Web | DSH Desktop |
|---|---|---|
| 运行时 | dsh web,DSH 0.2.1-rc.3,端口 8070(token 地址) | 上游检出 fork-pj/deepseek-harness 开发态,构建 0.2.1-rc.3-1f81c04,CDP 9333 |
| 会话 | 新建「只回复两个字:测试」(GLM-5.3-Flash · zcode) | 同一 profile 自动可见同一会话 |
| 方法 | 模型选择器切换模型,不发送消息,0.6–0.8s 后统计胶囊 DOM(dsh-zcode-usage* / dsh-opencode-usage*) | 同左,经 CDP 求值 |
| 方向 | 切换前胶囊 | 切换后胶囊 | 结论 |
|---|---|---|---|
| zcode → opencode(Web) | zcode 3 / opencode 0 | zcode 0 / opencode 3 | 即时切换,无发送依赖 |
| opencode → zcode(Web) | opencode 3 / zcode 0 | opencode 0 / zcode 3 | 即时切换 |
| zcode → opencode(Desktop) | zcode 3 / opencode 0 | zcode 0 / opencode 3 | 即时切换 |
| opencode → zcode(Desktop) | opencode 3 / zcode 0 | opencode 0 / zcode 3 | 即时切换 |
结论:仓库构建下 OpenCode 与 ZCode 胶囊都在「选择模型」瞬间按新供应商显隐,两个客户端行为一致;OpenCode 读取 next 的修复在运行时生效。ZCode 无需改代码(其 next ?? lastUsed 本就正确)。
清理:开发态 Desktop 以 pkill -f "fork-pj/deepseek-harness" 精确结束;用户安装版 /Applications/DeepSeek Harness.app 未受影响(仍在运行)。
Bug 记录
| ID | 关联用例 | 标题 | 级别 | 状态 | 说明 |
|---|---|---|---|---|---|
| BUG-01 | TC-001 | OpenCode 胶囊切走模型后不立即隐藏 | P0 | 已修复 | 读取了 wire view 中不存在的 pending,改为 next ?? lastUsed |
| BUG-02 | TC-001 | 已发布的 6.0.6 仍带旧客户端构建 | P0 | 已定位;按决定不发布,本地打包交付 | @tnnevol/dsh-opencode@6.0.6 发布时未重新构建:lib/index.js 含会话头兜底,但 lib/client.js 仍读 pending。仓库源码已正确,本地重新构建的 tarball 已验证含修复(sha256 86b9e3d8…);线上 6.0.6 保持不变 |
测试结论
包级验证通过:OpenCode 的字段错误已修复,ZCode 既有正确实现补齐回归;DSH Web 与 DSH Desktop 运行时验证均通过(切换瞬间显隐,无发送依赖)。
线上交付状态(2026-10-28 核查):npm 上已发布的 @tnnevol/dsh-opencode@6.0.6 未包含本修复——其 lib/client.js 仍是旧构建(pending)。根源是发布时未重新构建,产物为磁盘旧 lib/;仓库源码与本地重新构建后的 tarball 均已验证含 next 修复。按 2026-10-28 决定不发布 npm,改为本地打包交付:产物为 tmp/fnos-opencode-local/tnnevol-dsh-opencode-6.0.6-local-capsule-fix.tgz,解包验证 client.js 读 next、index.js 含会话头兜底。后续如需正式发布,按 发布前必须重新构建产物 逐项核对。
变更记录
| 日期 | 变更 | 说明 |
|---|---|---|
| 2026-10-26 | 建立测试用例文档 | 6 条用例全部包级通过;记录 BUG-01 |
| 2026-10-28 | 补记 BUG-02 与线上核查 | 用户更新 6.0.6 后症状仍在;npm pack 取证确认线上包 client.js 为旧构建;按决定不发布 npm,改为本地打包交付并验证产物 |
| 2026-10-28 | 补记双客户端运行时验证 | DSH Web 与 DSH Desktop 各测 zcode ↔ opencode 两个方向:切换瞬间胶囊即按新供应商显隐,均未发送消息;ZCode 实测同样正确 |