diff --git a/docs/screenshots/screenshot_1775650155375.jpg b/docs/screenshots/screenshot_1775650155375.jpg new file mode 100644 index 0000000..d640209 Binary files /dev/null and b/docs/screenshots/screenshot_1775650155375.jpg differ diff --git a/docs/screenshots/screenshot_1775656310138.jpg b/docs/screenshots/screenshot_1775656310138.jpg new file mode 100644 index 0000000..c41943b Binary files /dev/null and b/docs/screenshots/screenshot_1775656310138.jpg differ diff --git a/docs/screenshots/screenshot_1775656383360.jpg b/docs/screenshots/screenshot_1775656383360.jpg new file mode 100644 index 0000000..098f470 Binary files /dev/null and b/docs/screenshots/screenshot_1775656383360.jpg differ diff --git a/docs/screenshots/screenshot_1775656706369.jpg b/docs/screenshots/screenshot_1775656706369.jpg new file mode 100644 index 0000000..098f470 Binary files /dev/null and b/docs/screenshots/screenshot_1775656706369.jpg differ diff --git a/docs/screenshots/screenshot_1775657093801.jpg b/docs/screenshots/screenshot_1775657093801.jpg new file mode 100644 index 0000000..0d3dd2d Binary files /dev/null and b/docs/screenshots/screenshot_1775657093801.jpg differ diff --git a/docs/screenshots/screenshot_1775657210860.jpg b/docs/screenshots/screenshot_1775657210860.jpg new file mode 100644 index 0000000..52028e8 Binary files /dev/null and b/docs/screenshots/screenshot_1775657210860.jpg differ diff --git a/docs/screenshots/screenshot_1775657726302.jpg b/docs/screenshots/screenshot_1775657726302.jpg new file mode 100644 index 0000000..8c02c93 Binary files /dev/null and b/docs/screenshots/screenshot_1775657726302.jpg differ diff --git a/docs/screenshots/screenshot_1775723830861.jpg b/docs/screenshots/screenshot_1775723830861.jpg new file mode 100644 index 0000000..bb3b0de Binary files /dev/null and b/docs/screenshots/screenshot_1775723830861.jpg differ diff --git a/docs/screenshots/screenshot_1775724306016.jpg b/docs/screenshots/screenshot_1775724306016.jpg new file mode 100644 index 0000000..79588ec Binary files /dev/null and b/docs/screenshots/screenshot_1775724306016.jpg differ diff --git a/docs/screenshots/screenshot_1775724946025.jpg b/docs/screenshots/screenshot_1775724946025.jpg new file mode 100644 index 0000000..e100e73 Binary files /dev/null and b/docs/screenshots/screenshot_1775724946025.jpg differ diff --git a/docs/screenshots/screenshot_1775725142887.jpg b/docs/screenshots/screenshot_1775725142887.jpg new file mode 100644 index 0000000..2a14d77 Binary files /dev/null and b/docs/screenshots/screenshot_1775725142887.jpg differ diff --git a/docs/screenshots/screenshot_1775725351018.jpg b/docs/screenshots/screenshot_1775725351018.jpg new file mode 100644 index 0000000..ba361b4 Binary files /dev/null and b/docs/screenshots/screenshot_1775725351018.jpg differ diff --git a/docs/screenshots/settings-mode-toggle.txt b/docs/screenshots/settings-mode-toggle.txt new file mode 100644 index 0000000..db1acdd --- /dev/null +++ b/docs/screenshots/settings-mode-toggle.txt @@ -0,0 +1,53 @@ +uid=2_0 RootWebArea "ZCLAW" url="http://localhost:1420/" + uid=5_0 complementary + uid=5_1 button "返回应用" + uid=5_2 navigation + uid=5_3 button "通用" + uid=5_4 button "用量统计" + uid=5_5 button "积分详情" + uid=5_6 button "模型与 API" + uid=5_7 button "MCP 服务" + uid=5_8 button "IM 频道" + uid=5_9 button "工作区" + uid=5_10 button "数据与隐私" + uid=5_11 button "安全存储" + uid=5_12 button "SaaS 平台" + uid=5_13 button "订阅与计费" + uid=5_14 StaticText "高级" + uid=5_15 button "技能管理" + uid=5_16 button "语义记忆" + uid=5_17 button "安全状态" + uid=5_18 button "审计日志" + uid=5_19 button "定时任务" + uid=5_20 button "心跳配置" + uid=5_21 button "提交反馈" + uid=5_22 button "关于" + uid=5_23 main + uid=5_24 heading "通用设置" level="1" + uid=5_25 heading "GATEWAY 连接" level="2" + uid=5_26 StaticText "状态" + uid=5_27 StaticText "已连接" + uid=5_28 StaticText "地址" + uid=5_29 StaticText "http://127.0.0.1:8080" + uid=5_30 StaticText "Token" + uid=5_31 textbox "可选:Gateway auth token" value="••••••••••••••••••••••••••••••••••••••••••••••••" + uid=5_32 StaticText "版本" + uid=5_33 StaticText "saas-relay" + uid=5_34 StaticText "当前模型" + uid=5_35 StaticText "GLM-4 Flash" + uid=5_36 button "断开连接" + uid=5_37 heading "外观与行为" level="2" + uid=5_38 StaticText "主题模式" + uid=5_39 StaticText "选择浅色或深色模式。" + uid=5_40 button + uid=5_41 button + uid=5_42 StaticText "开机自启" + uid=5_43 StaticText "登录时自动启动 ZCLAW。" + uid=5_44 button + uid=5_45 StaticText "显示工具调用" + uid=5_46 StaticText "在对话消息中显示模型的工具调用详情块。" + uid=5_47 button + uid=5_48 StaticText "界面模式" + uid=5_49 StaticText "切换简洁界面或完整专业界面。" + uid=5_50 button "简洁模式 适合日常使用,只显示聊天窗口" + uid=5_51 button "专业模式 完整功能,包括侧边栏和工具面板" focusable focused diff --git a/docs/screenshots/trae_solo_ui.png b/docs/screenshots/trae_solo_ui.png new file mode 100644 index 0000000..f9187c4 Binary files /dev/null and b/docs/screenshots/trae_solo_ui.png differ diff --git a/docs/superpowers/specs/2026-04-08-pre-release-functional-test-design.md b/docs/superpowers/specs/2026-04-08-pre-release-functional-test-design.md new file mode 100644 index 0000000..106af5d --- /dev/null +++ b/docs/superpowers/specs/2026-04-08-pre-release-functional-test-design.md @@ -0,0 +1,418 @@ +# ZCLAW 发布前功能测试方案 + +> 日期: 2026-04-08 +> 状态: Draft +> 基于: 两轮头脑风暴产品愿景 + 25 轮 tauri-mcp 测试结果 +> 目标: 全功能可用验证 — 所有 UI 入口点接通真实后端,允许有 bug 但不能 crash + +--- + +## Context + +ZCLAW 经过 12 轮审计修复,1048 个自动化测试通过,25 轮 tauri-mcp 实景测试已完成核心路径验证(SSE、多轮对话、话题切换)。但在发布前仍有: + +1. **未验证的能力**:Pipeline 实际执行、Hand 触发、Skill 安装/卸载、Agent 完整创建流程、模型切换 +2. **遗留问题**:6 个 P2/P3(Token 计数为 0、Kimi ENTITY bug、配额 429、对话列表冗余等) +3. **产品愿景验证**:两轮头脑风暴确立了"成长性问题解决者"定位,需要用真实行业场景验证 + +本方案旨在通过多角色真实 LLM 交互测试,全面验证系统发布就绪度。 + +--- + +## 0. 范围澄清 + +### 0.1 与 04-05 预发布审计的关系 + +本方案**补充而非替代** `2026-04-05-pre-launch-functional-audit-design.md`。04-05 方案是模块级功能审计(12 模块 T1-T12),本方案是角色驱动的端到端集成测试。 + +| 04-05 模块 | 本方案覆盖 | 状态 | +|------------|-----------|------| +| T1 Hands | 角色 A (Researcher/Collector/Browser) | 本方案 | +| T2 Intelligence | 角色 B (记忆+反思) | 本方案 | +| T3 Chat/SSE | 角色 A+B+C | 本方案 | +| T4 Agent | 角色 B (创建/切换/人格) | 本方案 | +| T5 Skills | 角色 B (执行+结果) | 本方案 | +| T6 Pipeline | 角色 A (模板+执行) | 本方案 | +| T7 Browser Hand | 角色 A (导航+截图) | 本方案 | +| T8 Memory | 角色 B (VikingPanel) | 本方案 | +| T9 Admin V2 | 不在本方案范围 | 已有 61 测试覆盖 | +| T10 Security | 角色 B (Audit 日志) | 部分 | +| T11 SaaS API | 角色 B (配额+计费) | 部分 | +| T12 E2E 集成 | 三角色本身就是 E2E | 本方案 | + +### 0.2 前序测试基线 + +开始本方案前,确认以下自动化测试基线通过: + +```bash +# Rust 全量(排除 SaaS) +cargo test --workspace --exclude zclaw-saas # 580 tests passing + +# SaaS 集成(需 PostgreSQL) +cargo test -p zclaw-saas -- --test-threads=1 # 138 tests passing + +# 前端 +cd desktop && pnpm vitest run # 330 passed, 1 skipped + +# 类型检查 +pnpm tsc --noEmit # 0 errors +``` + +### 0.3 Phase 0:环境就绪检查 + +在 Phase 1 开始前,确认以下环境就绪: + +| # | 检查项 | 验证方法 | 通过标准 | +|---|--------|----------|----------| +| 0.1 | Tauri 开发服务 | `pnpm start:dev` | 应用窗口正常打开,无白屏 | +| 0.2 | tauri-mcp 连接 | Chrome DevTools MCP 连接 | `take_snapshot` 返回页面结构 | +| 0.3 | SaaS 后端 | Admin 页面可访问 | Dashboard 正常加载 | +| 0.4 | LLM API 冒烟测试 | 三模型各发一条消息 | Kimi/GLM/DeepSeek 均有响应 | +| 0.5 | 自动化基线 | 运行 §0.2 命令 | 全部通过 | + +--- + +## 1. 测试策略 + +### 1.1 方案选择:角色驱动 + 功能矩阵混合式 + +以三个不同行业角色为主线驱动测试,同时用功能矩阵确保 100% UI 入口点覆盖: + +``` +Phase 1: 基础连接+认证(无角色,通用验证) +Phase 2: 角色 A — 玩具厂老板 + Kimi +Phase 3: 角色 B — 医院行政 + GLM-4-Flash +Phase 4: 角色 C — 高中教师 + DeepSeek-V3 +Phase 5: 功能矩阵交叉验证(checklist 补漏) +Phase 6: 修复验证 + 发布评估 +``` + +### 1.2 测试方式 + +- **工具**: tauri-mcp / tauri-devtools 真实 LLM 交互 +- **执行方式**: 边测边修(发现问题当场修复或记录后当轮修复) +- **预计总轮次**: 60-72 轮(Phase 0: ~5, Phase 1: ~10, Phase 2: 18-22, Phase 3: 18-22, Phase 4: 15-18, Phase 5-6: ~5) + +### 1.3 配额预算 + +| 角色 | 预计 API 调用 | 含 Hands/Skills 开销 | 总计 | +|------|-------------|---------------------|------| +| Phase 0-1 | ~15 | 0 | 15 | +| 角色 A (Kimi) | ~22 | Researcher(3) + Collector(2) + Browser(2) + Pipeline(3) | 32 | +| 角色 B (GLM) | ~22 | Skills(2) + 记忆(1) | 25 | +| 角色 C (DeepSeek) | ~18 | Quiz(2) + Slideshow(1) + TTS(1) | 22 | +| Phase 5-6 | ~5 | 0 | 5 | +| **总计** | | | **~99** | + +**配额策略**: +- 使用付费套餐(非 free plan 100 次限制),或 Admin 后台将测试账号配额提升至 200 次 +- 准备 2 个测试账号,一个主用(配额 200+),一个备用 +- 如果主账号配额耗尽,切换到备用账号继续测试 +- 每个 Phase 结束后检查剩余配额,低于 20 次时切换账号 + +### 1.4 测试数据隔离 + +- 三个角色使用**同一个 SaaS 账号**但**不同的 Agent 分身**,状态共享 +- 角色 B 的记忆测试可以观察到角色 A 的对话(验证跨 Agent 记忆隔离) +- 配额在三个角色间共享,按角色 A → B → C 的顺序消耗 +- 每个 Phase 开始前记录当前对话数和配额余量 + +--- + +## 2. 测试角色与功能分工 + +### 2.1 三个测试角色 + +| 角色 | 身份 | LLM 模型 | 测试重点 | 预计轮次 | +|------|------|----------|----------|----------| +| **A. 玩具厂老板** | 汕头澄海,盲盒+注塑 | Kimi (kimi-for-coding) | 核心聊天、Hands(Researcher/Collector/Browser)、Pipeline 行业模板、配额管理 | 18-22 轮 | +| **B. 医院行政** | 某三甲医院行政主任 | GLM-4-Flash | Agent 多分身管理、Skills 调用、记忆系统、SaaS 配额/计费、模型切换 | 18-22 轮 | +| **C. 高中教师** | 高二语文/班主任 | DeepSeek-V3 | 多轮对话深度、Classroom/Quiz 生成、Slideshow、Speech TTS、对话搜索 | 15-18 轮 | + +### 2.2 功能覆盖矩阵 + +**B** = 主测,**X** = 交叉验证 + +| 功能域 | 角色 A | 角色 B | 角色 C | +|--------|--------|--------|--------| +| SaaS 登录/认证 | **B** | X | X | +| SSE 流式响应 | **B** | X | X | +| 多轮对话 | **B** | X | **B** | +| 话题切换 | **B** | X | X | +| 取消流式 | X | X | **B** | +| Agent 创建/切换 | X | **B** | X | +| Agent 人格编辑 | X | **B** | X | +| 记忆提取/回顾 | X | **B** | X | +| Skills 执行 | X | **B** | X | +| Hands 触发 | **B** | X | X | +| Pipeline 执行 | **B** | X | X | +| Classroom/Quiz | X | X | **B** | +| Slideshow | X | X | **B** | +| Speech TTS | X | X | **B** | +| Browser Hand | **B** | X | X | +| 模型切换 | X | **B** | X | +| 对话搜索 | X | X | **B** | +| 配额/计费 | X | **B** | X | +| Thinking 渲染 | **B** | X | X | +| 离线队列 | X | **B** | X | +| 侧边栏 Tab 切换 | **B** | **B** | **B** | + +--- + +## 3. 六阶段执行流程 + +### Phase 1:基础连接与认证(~10 轮) + +**目标**: 确保所有连接模式可用,不被底层问题干扰后续角色测试 + +| # | 测试项 | 验证方法 | Pass 标准 | +|---|--------|----------|-----------| +| 1.1 | SaaS 登录 | 通过 tauri-mcp 发送消息 | 成功获取 session + 模型列表加载 | +| 1.2 | 会话恢复 | 重启 Tauri 应用后检查 | 自动恢复登录态,无需重新认证 | +| 1.3 | SSE 流式响应 | 发送简单问题 | thinking + content 双流正常渲染 | +| 1.4 | 取消流式 | 发送长问题后点击取消 | 状态正确恢复,可立即发新消息 | +| 1.5 | 侧边栏 Tab 切换 | 逐个点击 Chat/Agent/Memory/Automation/Skills | 每个 Tab 内容区正确更新,无白屏 | +| 1.6 | 对话列表 | 创建新对话 → 切换 → 搜索关键词 | CRUD 完整,搜索结果准确 | +| 1.7 | 模型列表加载 | 打开模型选择器 | 显示当前 SaaS 账户可用模型 | +| 1.8 | 遗留问题重现 | 逐个检查上次 6 个 P2/P3 | 确认已修复/仍存在/部分改善 | + +**Pass 条件**: 1.1-1.5 全部通过才能进入 Phase 2。1.6-1.8 允许有问题但不阻塞。 + +--- + +### Phase 2:角色 A — 玩具厂老板 + Kimi(18-22 轮) + +**场景**: 汕头澄海玩具厂老板,想开发盲盒产品线,需要市场调研、供应商联系、展会信息。 + +| # | 测试项 | 场景动作 | 验证点 | +|---|--------|----------|--------| +| A1 | 多轮行业对话 | "我想做盲盒,市面上哪些品牌卖得好?" → "这些材质有什么区别?" → "注塑成本怎么算?" | 上下文连续、行业知识准确、无信息丢失 | +| A2 | 话题切换 | 盲盒 → 供应商采购 → 展会 → 回到盲盒话题 | 回溯准确,不丢失之前的讨论细节 | +| A3 | Hands: Researcher | "帮我调研一下 2026 年盲盒市场趋势" | 工具调用成功,返回结构化研究报告 | +| A4 | Hands: Collector | "整理一份注塑机供应商对比表,包含价格和产能" | 输出结构化表格,格式正确 | +| A5 | Pipeline 执行 | 触发"市场调研"行业模板 | Pipeline 步骤逐步执行,状态跟踪正确,结果可查看 | +| A6 | Thinking 渲染 | 观察含 thinking 的回复 | 折叠/展开正常,thinking 内容完整,不影响 content | +| A7 | 长消息处理 | "详细列出从设计到量产的完整开模流程" | 完整输出,不被截断,段落格式正确 | +| A8 | 中英文混合 | "帮我写一封给 Hasbro 的英文合作邮件" → 后续用中文讨论 | 语言切换自然,上下文不混乱 | +| A9 | 数学计算 | "月产 5 万个盲盒,每个成本 3.5 元,利润率 40%,月利润多少?" | 计算正确(70,000 元) | +| A10 | 配额边界 | 持续使用观察配额消耗 | 接近上限时有友好提示,429 响应处理正确 | +| A11 | Browser Hand | "打开 1688 搜一下注塑机价格" | 若 Fantoccini 已安装:触发自动化 + Approval 弹窗;若未安装:标注 KNOWN,跳过测试 | +| A12 | Kimi ENTITY bug | 切换到 Flash 模式测试 | 检查 `__ENTITY_N__` 是否仍出现,评估影响 | +| A13 | 侧边栏导航 | 在 Chat ↔ Hands ↔ Pipeline 间频繁切换 | 内容区更新正确,无白屏或残留 | + +**Pass 条件**: 核心项 A1-A5 全部通过。A6-A10 为扩展项,允许 <= 2 项失败。A11 Browser Hand 若 Fantoccini 未安装则标注为 KNOWN,不计入 Pass/Fail。 + +--- + +### Phase 3:角色 B — 医院行政 + GLM-4-Flash(18-22 轮) + +**场景**: 某三甲医院行政主任,管理多个科室文档,需要 AI 助手处理不同科室事务并记住各科室特殊要求。 + +| # | 测试项 | 场景动作 | 验证点 | +|---|--------|----------|--------| +| B1 | Agent 创建 | 创建"内科助手"、"外科助手"两个分身 | Agent 表单完整,保存成功,出现在列表 | +| B2 | Agent 人格编辑 | 给内科助手设置专业人格 + 科室术语 | 人格 prompt 生效,后续对话体现专业术语 | +| B3 | Agent 切换 | 在两个分身间切换对话 | 上下文独立不串台,各自记住自己的话题 | +| B4 | 记忆积累 | 多次提及"我们医院 ICU 床位 30 张" | 后续对话 AI 记住并引用这个事实 | +| B5 | 记忆回顾 | 打开 VikingPanel 查看记忆列表 | 显示已积累的记忆条目,可搜索 | +| B6 | Skills 执行 | 触发文档处理 skill | Skill 正确执行并返回结果 | +| B7 | 模型切换 | 从 GLM 切到 DeepSeek → 再切回 GLM | 切换立即生效,对话不中断,模型特性可感知 | +| B8 | SaaS 配额查看 | 打开账户/计费面板 | 用量正确显示(验证 Token 计数修复) | +| B9 | 离线测试 | 断网 → 发消息 → 恢复网络 | 离线队列缓存消息,恢复后自动发送 | +| B10 | 搜索对话 | 搜索"ICU"关键词 | 正确过滤出包含 ICU 的对话 | +| B11 | Thinking 模式 | 开启/关闭 Thinking | 状态正确切换,渲染正常 | +| B12 | 反思系统 | 多轮对话后检查反思日志 | reflection 自动触发并记录,日志可查看 | +| B13 | 安全面板 | 打开 Audit 日志 | 显示操作记录,内容完整 | + +**Pass 条件**: 核心项 B1-B7 全部通过。B8-B13 为扩展项,允许 <= 2 项失败。B9 离线测试允许有已知限制。 + +--- + +### Phase 4:角色 C — 高中教师 + DeepSeek-V3(15-18 轮) + +**场景**: 高二语文老师兼班主任,需要生成测验、制作课件、用语音朗读课文。 + +| # | 测试项 | 场景动作 | 验证点 | +|---|--------|----------|--------| +| C1 | 深度多轮对话 | 讨论文言文教学方法 15+ 轮 | 上下文持续积累无丢失,后续引用前文准确 | +| C2 | Quiz 生成 | "生成一套《赤壁赋》理解测验,10 道选择题" | 题目生成完整,格式正确,答案合理 | +| C3 | Slideshow | "帮我做一页《赤壁赋》赏析幻灯片" | 幻灯片生成并预览,可翻页 | +| C4 | Speech TTS | "朗读《赤壁赋》第一段" | 语音合成播放正常,中文发音准确 | +| C5 | Quiz 评估 | 模拟学生答题,系统评分 | 评分逻辑正确,反馈有针对性 | +| C6 | 取消流式 | 在长文生成过程中取消 | 干净取消,UI 状态恢复,可立即继续操作 | +| C7 | 对话搜索 | 搜索"赤壁赋" | 正确匹配相关对话 | +| C8 | 新建对话 | 创建新对话讨论班会方案 | 独立上下文,不与之前的讨论混淆 | +| C9 | 跨话题记忆 | "上次我们讨论的教学方法叫什么?" | 记忆回溯准确,能引用之前对话内容 | +| C10 | 长文本输出 | "写一份完整的家长会发言稿,800 字" | 完整输出,格式正确,不被截断 | +| C11 | DeepSeek 稳定性 | 持续使用 15+ 轮 | 无超时、无 crash、无异常中断 | +| C12 | Classroom 相关 | Classroom 面板查看生成结果 | 生成历史可查看,可复用 | +| C13 | Whiteboard | "在白板上画一个文言文知识图谱" | 白板渲染正常,可导出(允许标注 demo) | +| C14 | 记忆飞轮验证 | 不提关键词,问"我们医院有多少张病床?" | 如果角色 B 的记忆跨 Agent 可见则验证飞轮;否则验证本角色记忆 | + +**Pass 条件**: 核心项 C1-C6 全部通过。C7-C12 为扩展项,允许 <= 2 项失败。C4 TTS 允许有浏览器兼容性限制。 + +--- + +### Phase 5:功能矩阵交叉验证(checklist) + +逐项检查每个 UI 入口点,确保至少被一个角色覆盖。对照 Phase 2-4 的结果,标记未覆盖项并补充测试。 + +| 类别 | UI 入口点 | 覆盖角色 | 状态 | +|------|-----------|----------|------| +| **侧边栏** | Chat Tab | Phase 1 | ☐ | +| **侧边栏** | Agent Tab | B | ☐ | +| **侧边栏** | Memory Tab | B | ☐ | +| **侧边栏** | Automation Tab | A | ☐ | +| **侧边栏** | Skills Tab | B | ☐ | +| **聊天区** | 发送消息 | A+B+C | ☐ | +| **聊天区** | 取消流式 | C | ☐ | +| **聊天区** | Thinking 展开/折叠 | A | ☐ | +| **聊天区** | 代码块渲染 | A (中英文) | ☐ | +| **聊天区** | 消息搜索 | C | ☐ | +| **聊天区** | 对话切换 | A+B | ☐ | +| **聊天区** | 新建对话 | C | ☐ | +| **Agent** | 创建 Agent | B | ☐ | +| **Agent** | 编辑人格 | B | ☐ | +| **Agent** | 切换 Agent | B | ☐ | +| **Agent** | 删除 Agent | B (必测 — 安全相关) | ☐ | +| **Hands** | 列表展示 | A | ☐ | +| **Hands** | 触发执行 | A (Researcher/Collector) | ☐ | +| **Hands** | Approval 弹窗 | A (Browser) | ☐ | +| **Hands** | 执行日志 | A | ☐ | +| **Skills** | 列表展示 | B | ☐ | +| **Skills** | 执行 Skill | B | ☐ | +| **Skills** | 结果展示 | B | ☐ | +| **Pipeline** | 模板列表 | A | ☐ | +| **Pipeline** | 执行 Pipeline | A | ☐ | +| **Pipeline** | 进度跟踪 | A | ☐ | +| **Pipeline** | 结果查看 | A | ☐ | +| **Memory** | VikingPanel | B | ☐ | +| **Memory** | 记忆列表 | B | ☐ | +| **Memory** | 记忆搜索 | B | ☐ | +| **Browser** | 创建会话 | A | ☐ | +| **Browser** | 导航+截图 | A | ☐ | +| **Classroom** | Quiz 生成 | C | ☐ | +| **Classroom** | Quiz 评估 | C | ☐ | +| **Slideshow** | 生成+预览 | C | ☐ | +| **Speech** | TTS 播放 | C | ☐ | +| **Settings** | 连接配置 | B | ☐ | +| **Settings** | 模型选择 | B | ☐ | +| **Settings** | Autonomy 级别 | B (必测 — 安全相关) | ☐ | +| **SaaS** | 登录/登出 | A+B | ☐ | +| **SaaS** | 账户信息 | B | ☐ | +| **SaaS** | 配额/计费 | B | ☐ | +| **自动化** | Triggers | A | ☐ | +| **自动化** | Scheduled Tasks | A (如时间允许) | ☐ | +| **安全** | Audit 日志 | B | ☐ | +| **安全** | Approval 队列 | A (Browser) | ☐ | + +--- + +### Phase 6:修复验证 + 发布评估 + +**流程**: + +1. 汇总 Phase 1-5 所有发现的问题 +2. 按缺陷分级处理: + - P0: 已在测试过程中立即修复 + - P1: Phase 6 集中修复 + - P2/P3: 记录到发布说明的 known issues +3. 修复后回归验证(只测修复点相关的功能) +4. 生成发布评估报告 + +--- + +## 4. 缺陷分级标准 + +| 级别 | 定义 | 处理方式 | 例子 | +|------|------|----------|------| +| **P0 - Crash** | 应用崩溃、白屏、数据丢失 | 立即停止测试,当场修复 | 窗口崩溃、IndexedDB 损坏 | +| **P1 - 阻塞** | 核心功能不可用,无法继续测试 | 当轮修复后重新验证 | SSE 无响应、登录失败、Agent 无法切换 | +| **P2 - 功能缺陷** | 功能可用但结果不正确或不完整 | 记录,Phase 6 统一修复 | Token 计数为 0、Pipeline 步骤状态不更新 | +| **P3 - 体验问题** | 功能可用但体验不佳 | 记录,发布后迭代 | 对话列表冗余、动画卡顿 | +| **KNOWN** | 已知的外部限制 | 标注为 known limitation | Kimi `__ENTITY_N__`、模型 API 超时 | + +--- + +## 5. 发布标准(Go/No-Go) + +| 指标 | Go(可发布) | No-Go(不可发布) | +|------|-------------|-------------------| +| P0 缺陷 | 0 | >= 1 | +| P1 缺陷 | <= 2 且有 workaround | >= 3 或无 workaround | +| 核心路径 | 聊天+Agent+认证 100% 通过 | 任一核心路径未覆盖 | +| 功能矩阵覆盖 | >= 90% UI 入口点已测 | < 80% | +| 稳定性 | 单次 50+ 消息无 crash | 50 消息内 crash | +| 多模型验证 | >= 2 个模型完整通过 | 仅 1 个模型通过 | +| React 稳定性 | 无 Maximum update depth 异常 | 出现无限渲染 | + +--- + +## 6. 测试报告模板 + +每个角色测试完成后生成一份结构化报告: + +```markdown +## 角色 X 测试报告 + +### 基本信息 +- 角色: [身份描述] +- 模型: [LLM Provider + Model] +- 执行日期: YYYY-MM-DD +- 轮次: X/Y (实际/计划) +- ZCLAW 版本: [git commit hash 前 8 位] +- Tauri 版本: [从 package.json 获取] +- OS: [Windows 11 / macOS / Linux] +- WebView2 版本: [Edge WebView2 Runtime 版本] +- LLM 套餐: [free / paid] + +### 结果汇总 +- Pass: X 项 +- Fail: Y 项 (P0: _ P1: _ P2: _ P3: _ KNOWN: _) + +### 新发现缺陷 +| ID | 级别 | 测试项 | 描述 | 复现步骤 | 状态 | +|----|------|--------|------|----------|------| + +### 已修复缺陷 +| ID | 原级别 | 描述 | 修复方式 | 验证结果 | +|----|--------|------|----------|----------| + +### 已知限制 +| 描述 | 影响范围 | 建议处理 | +|------|----------|----------| + +### 功能覆盖 +- 已测 UI 入口点: [列表] +- 未测 UI 入口点: [列表] + 原因 +``` + +--- + +## 7. 关键文件参考 + +| 用途 | 文件路径 | +|------|----------| +| Tauri 命令注册 | `desktop/src-tauri/src/lib.rs` | +| 前端 Store | `desktop/src/store/` (19 文件) | +| Gateway Client | `desktop/src/lib/gateway-client.ts` | +| SaaS Client | `desktop/src/lib/saas-client.ts` | +| Kernel Client | `desktop/src/lib/kernel-client.ts` | +| WebMCP 工具 | `desktop/src/lib/webmcp-tools.ts` | +| Hands 配置 | `hands/` (9 HAND.toml) | +| 技能定义 | `skills/` (75 SKILL.md) | +| Pipeline 模板 | `crates/zclaw-pipeline/templates/` (17 YAML) | +| 组件目录 | `desktop/src/components/` (~53 组件) | +| 系统真实状态 | `docs/TRUTH.md` | + +--- + +## 8. 风险与缓解 + +| 风险 | 概率 | 影响 | 缓解措施 | +|------|------|------|----------| +| 模型 API 不稳定 | 高 | 测试轮次浪费 | 准备备用模型,Kimi 挂了切 GLM | +| 配额提前耗尽 | 高 | 无法完成测试 | Admin 预充值、准备多个测试账号 | +| Kimi ENTITY bug | 中 | 角色A数据被污染 | 测到即标注,不影响其他角色 | +| 底层 P0 阻塞 | 低 | 全部测试暂停 | Phase 1 先验证基础,尽早暴露 | +| Browser Hand 失败 | 高 | 11 个 browser 命令不可测 | 若 Fantoccini 未安装则标注 KNOWN 并跳过,不阻塞发布;若已安装则只测试简单导航(打开URL+截图),不测试复杂表单填写 |