From 4431bef71c7665139f63b0986af4d17269bfe0c3 Mon Sep 17 00:00:00 2001 From: iven Date: Sun, 5 Apr 2026 18:38:20 +0800 Subject: [PATCH] test: add T4 Classroom system audit report MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T4 Classroom (health 70→75, +5): - M11-01 P1 blocking_lock 已修复 (try_lock) - M11-02 P1 map_err 已修复 - M11-03 P1 持久化已修复 (SQLite) - M11-06 Date.now→crypto.randomUUID 已修复 - NEW P1: GenerationPipeline 硬编码 model="default" 导致课堂生成 404 --- docs/test-results/T4-classroom/REPORT.md | 142 +++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 docs/test-results/T4-classroom/REPORT.md diff --git a/docs/test-results/T4-classroom/REPORT.md b/docs/test-results/T4-classroom/REPORT.md new file mode 100644 index 0000000..8c867e4 --- /dev/null +++ b/docs/test-results/T4-classroom/REPORT.md @@ -0,0 +1,142 @@ +# T4 课堂系统 测试报告 + +> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 70/100 + +## 摘要 + +- **执行用例数**: 7/12(5 个需已生成课堂数据,因 P1 缺陷无法执行) +- **代码审查确认**: 8 项 V12 问题验证 +- **已修复**: 4 ✅ +- **未修复**: 3 ⚠️ +- **新发现缺陷**: 1 (P1) + +### 缺陷统计 + +| 级别 | 数量 | 说明 | +|------|------|------| +| P0 | 0 | - | +| P1 | 1 | GenerationPipeline 硬编码 model="default",SaaS relay 404(新发现) | +| P2 | 2 | LLM 失败无 placeholder 标记; 生成完成强制打开 player | +| P3 | 2 | HTML export 内容不完整; 白板两套渲染实现未统一 | + +--- + +## V12 已知问题验证 + +| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 | +|--------|------|-----------|---------|------| +| M11-01 | is_cancelled() blocking_lock 死锁 | P1 | ✅ **已修复** | generate.rs:141-147 改用 `try_lock()`,避免 tokio 死锁 | +| M11-02 | LLM 调用无 map_err | P1 | ✅ **已修复** | mod.rs:431-434 已加 `.map_err`,错误正确传播 | +| M11-03 | 课堂数据仅存内存 | P1 | ✅ **已修复** | persist.rs 实现了 SQLite 持久化(classrooms.db) | +| M11-04 | LLM 失败静默 fallback | P2 | ⚠️ **未修复** | chat.rs:82-93 LLM 失败 fallback 到 placeholder 无标记 | +| M11-05 | 生成完成强制打开 player | P2 | ⚠️ **未修复** | classroomStore.ts:124 无条件 `classroomOpen: true` | +| M11-06 | Chat Message ID 用 Date.now() | P2 | ✅ **已修复** | classroomStore.ts:176 使用 `crypto.randomUUID()` | +| M11-07 | 白板两套渲染实现 | P3 | ⚠️ **未修复** | SceneRenderer 内嵌 SVG + WhiteboardCanvas.tsx 独立组件 | +| M11-08 | HTML export 内容不完整 | P3 | ⚠️ **未修复** | export.rs:97-103 只渲染 title+type+duration,缺 key_points/notes | + +--- + +## 测试用例详细结果 + +### ❌ TC-4-01 | 课堂生成(正常) + +**结果**: FAIL(新发现 P1 缺陷) + +``` +Error: Outline generation failed: LLM error: API error 404 Not Found: +{"error":"NOT_FOUND","message":"未找到: 模型 default 不存在或未启用"} +``` + +**根因**: `zclaw-kernel/src/generation/mod.rs:416` — `CompletionRequest` 硬编码 `model: "default"`,SaaS relay 需要实际模型名(如 `glm-4-flash`)。Kernel driver 返回模型配置但 GenerationPipeline 未使用。 + +**影响**: 课堂生成完全不可用。 + +### ✅ TC-4-02 | M11-01 验证: blocking_lock 死锁 + +**结果**: PASS(已修复,代码审查确认) + +generate.rs:141-147 使用 `try_lock()` + `Err(_)` fallback,不会阻塞 tokio runtime。 + +### ✅ TC-4-03 | M11-02 验证: LLM 无 map_err + +**结果**: PASS(已修复,代码审查确认) + +mod.rs:431-434 `.map_err(|e| ZclawError::LlmError(...))`,Stage 1/2 均有 `.map_err`。 + +### ⏭️ TC-4-04~TC-4-09 | 场景播放/TTS/白板/持久化/聊天/导出 + +**结果**: SKIP + +依赖课堂生成成功。因 TC-4-01 P1 缺陷,无法执行端到端测试。 + +### ✅ TC-4-07 | M11-03 验证: 课堂数据持久化(代码审查) + +**结果**: PASS(已修复) + +- `classroom_commands/persist.rs`: SQLite 持久化实现完整 +- DB 路径: `{app_data_dir}/classroom/classrooms.db` +- 表: `classrooms` + `classroom_chats` +- 生成/聊天后自动保存(generate.rs:223, chat.rs:108) + +### ✅ TC-4-10 | M11-04 验证: LLM 失败静默 fallback(代码审查) + +**结果**: FAIL(未修复) + +chat.rs:82-93: +```rust +let agent_responses = match generate_llm_responses(...).await { + Ok(responses) => responses, + Err(e) => { + tracing::warn!("LLM chat generation failed, using placeholders: {}", e); + generate_placeholder_responses(...) // 无 isPlaceholder 标记 + } +}; +``` + +### ✅ TC-4-11 | M11-05 验证: 生成完成强制打开(代码审查) + +**结果**: FAIL(未修复) + +classroomStore.ts:124: +```typescript +set({ classroomOpen: true }); // 无条件设置,不检查用户是否手动关闭 +``` + +### ✅ TC-4-12 | classroom_list/classroom_get 基本验证 + +**结果**: PASS + +- `classroom_list` → `[]`(空列表,正确) +- `classroom_get("nonexistent-id")` → `"Classroom 'nonexistent-id' not found"`(错误信息明确) + +--- + +## 新发现问题 + +| TC-ID | 描述 | 场景类型 | 优先级 | 状态 | +|-------|------|---------|--------|------| +| TC-4-D01 | GenerationPipeline 硬编码 model="default",SaaS relay 404 | 正常 | **P1** | 新发现 | + +**TC-4-D01 详情**: +- 文件: `crates/zclaw-kernel/src/generation/mod.rs:416` 和 `:490` +- `CompletionRequest { model: "default".to_string(), ... }` — SaaS relay 需要实际模型名 +- 修复建议: 从 kernel config 获取 `llm.model` 字段传入 GenerationPipeline + +--- + +## 健康度评估 + +| 维度 | V12 基线 | 本次评估 | 变化 | +|------|---------|---------|------| +| **综合** | **70/100** | **75/100** | **+5** | + +**提升原因**: +- M11-01 P1 死锁风险已修复(try_lock) +- M11-02 P1 LLM 错误处理已修复(map_err) +- M11-03 P1 数据持久化已修复(SQLite) +- M11-06 Chat ID 碰撞已修复(crypto.randomUUID) + +**残留风险**: +- **P1**: GenerationPipeline 硬编码 "default" 模型 → 课堂生成完全不可用 +- P2: LLM 失败 placeholder 无标记(M11-04) +- P2: 生成完成强制打开 player(M11-05)