# T1 Hands 自主能力 测试报告 > **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 58/100 ## 摘要 - **执行用例数**: 18/23(5 个需 UI 交互或长时间等待,未执行) - **通过**: 11 ✅ - **未修复(已知问题确认)**: 5 ⚠️ - **已修复(V12 问题)**: 2 ✅ - **未验证**: 5 ❓ - **新发现缺陷**: 3 ### 缺陷统计 | 级别 | 数量 | 说明 | |------|------|------| | P0 | 0 | - | | P1 | 2 | LLM API 并发 DATABASE_ERROR; Browser Hand 不实际执行 | | P2 | 3 | 无输入长度限制; toolCount/metricCount 硬编码; max_concurrent 未实现 | | P3 | 1 | timeout_secs 未实现 | --- ## V12 已知问题验证 | V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 | |--------|------|-----------|---------|------| | M3-01 | run_id 丢失 | P1 | ✅ **已修复** | hand_execute 返回值含 `runId` 字段(如 `8267f7a0-...`) | | M3-02 | Browser Hand 只返回指令不执行 | P1 | ⚠️ **未修复** | 返回 `status: "pending_execution"` 但未实际操作浏览器 | | M3-03 | browserHandStore 绕过审批 | P1 | ✅ 行为正确 | supervised 模式正确进入审批流程,autonomous 直接执行 | | M3-04 | max_concurrent 未实现 | P2 | ⚠️ **未修复** | 5 个并发 quiz 全部被接受(`max_concurrent: 0`) | | M3-05 | timeout_secs 未实现 | P2 | ⚠️ **未修复** | `timeout_secs: 0`,无超时保护 | | M3-06 | hand_execute 返回值类型不匹配 | P2 | ✅ **已修复** | 返回 `{ success, output, error, durationMs, runId }` 完整结构 | | M3-07 | hand-execution-complete 事件未监听 | P1 | ❓ 未验证 | 需 UI 交互观察 | | M3-08 | 审批条目永不过期 | P2 | ❓ 未验证 | 需长时间等待 | | M3-09 | 重复审批路径 | P2 | ✅ 两条路径存在 | `hand_approve` 和 `approval_respond` 参数名不同但功能重叠 | | M3-10 | tool_count/metric_count 硬编码为 0 | P2 | ⚠️ **未修复** | 所有 Hand 的 `toolCount: 0, metricCount: 0` | | M3-11 | Hand 列举正常 | - | ✅ 通过 | 9 个 Hand 全部返回 | | M3-12 | hand_trigger 自主级别映射 | P1 | ⚠️ **部分修复** | supervised 正确要求审批,但 autonomous 下 Browser 返回 pending_execution | | M3-13 | Clip Hand 路径单引号 | P2 | ❓ 未验证 | 需 FFmpeg 环境 | --- ## 测试用例详细结果 ### ✅ TC-1-01 | Hand 列举(正常) **结果**: PASS `hand_list` 返回 9 个已启用 Hand: | Hand | name | enabled | needsApproval | requirementsMet | dependencies | |------|------|---------|---------------|-----------------|-------------| | clip | 视频剪辑 | true | false | ❌ | ffmpeg | | twitter | Twitter 自动化 | true | true | ❌ | twitter_api_key | | researcher | 研究员 | true | false | ❌ | network | | browser | 浏览器 | true | true | ❌ | webdriver | | slideshow | 幻灯片 | true | false | ✅ | - | | quiz | 测验 | true | false | ✅ | - | | whiteboard | 白板 | true | false | ✅ | - | | collector | 数据采集器 | true | false | ❌ | network | | speech | 语音合成 | true | false | ✅ | - | ### ✅ TC-1-02 | Quiz Hand 直接触发(正常) **结果**: PASS - 输入: `{ action: "generate", topic: "Rust 基础测试" }` - 输出: 成功生成 5 道选择题,含 `runId: "58d296cc-1be3-4632-8325-f15b4a7708dc"` - 耗时: ~24 秒 ### ✅ TC-1-03 | M3-01 run_id 丢失验证 **结果**: PASS(已修复) hand_execute 返回值结构: ```json { "success": true/false, "output": { ... }, "error": null, "durationMs": 24499, "runId": "58d296cc-..." } ``` `runId` 字段已稳定存在于所有返回值中。 ### ⚠️ TC-1-05 | M3-02 Browser Hand 断裂 **结果**: FAIL(未修复) - 输入: `{ action: "navigate", url: "https://example.com" }` - 输出: `{ action: "navigate", status: "pending_execution", url: "https://example.com" }` - **问题**: 返回结构化指令但未实际执行浏览器操作 ### ✅ TC-1-06 | 审批流程(正常) **结果**: PASS 1. **supervised 模式**: browser/twitter 正确进入 `pending_approval` 状态 2. **approval_list**: 正确返回 2 条 pending 审批 3. **approval_respond(approved: true)**: 审批通过后 Hand 开始执行 4. **approval_respond(approved: false)**: 拒绝成功 ### ⚠️ TC-1-08 | M3-04 max_concurrent 未实现 **结果**: FAIL(未修复) - 同时触发 5 个 quiz Hand - 5/5 全部被接受执行(1 个成功,4 个因 LLM API 500 失败) - `hand_get` 返回 `max_concurrent: 0` 表示无限制 ### ✅ TC-1-12 | 不存在 Hand 触发(异常) **结果**: PASS - 输入: `id: "nonexistent-hand"` - 输出: `"Hand not found: nonexistent-hand"` - 错误信息明确 ### ✅ TC-1-15 | Hand 执行状态查询(正常) **结果**: PASS `hand_run_list` 返回 13 条历史记录,包含完整字段: - `id`, `hand_name`, `status`, `params`, `result`, `error` - `created_at`, `started_at`, `completed_at`, `duration_ms` - `trigger_source: "manual"` ### ✅ TC-1-16 | M3-06 返回值类型验证 **结果**: PASS(已修复) 返回值结构 `{ success, output, error, durationMs, runId }` 完整。 ### ⚠️ TC-1-17 | M3-10 toolCount/metricCount 硬编码 **结果**: FAIL(未修复) 所有 9 个 Hand 的 `toolCount: 0, metricCount: 0`。 ### ✅ TC-1-18 | TOML 配置加载验证 **结果**: PASS `hand_get` 返回完整配置: ```json { "dependencies": [], "description": "生成和管理测验题目...", "enabled": true, "id": "quiz", "input_schema": { "properties": { "action": ..., "quiz_id": ..., "topic": ... } }, "max_concurrent": 0, "name": "测验", "needs_approval": false, "tags": ["assessment", "education"], "timeout_secs": 0 } ``` ### ✅ TC-1-19 | Hand 错误处理(异常) **结果**: PASS - `input: null` → `"invalid type: null, expected internally tagged enum ResearcherAction"` - 错误信息明确,非 panic ### ⚠️ TC-1-20 | M3-12 自主级别映射 **结果**: PARTIAL - supervised: ✅ 正确要求审批("监督模式下所有 Hand 执行需要用户审批") - autonomous: ⚠️ Browser 返回 pending_execution 而非实际执行 - Quiz 在 autonomous 下正常执行 ### ⚠️ TC-1-23 | 超长输入触发 **结果**: FAIL(无输入验证) - 100K 字符 topic 被 quiz 接受并尝试执行 - 最终因 LLM API 问题失败,但未在输入层拒绝 --- ## 新发现问题 | TC-ID | 描述 | 场景类型 | 优先级 | 状态 | 备注 | |-------|------|---------|--------|------|------| | TC-1-D01 | LLM API 并发时 500 DATABASE_ERROR | 边界 | **P1** | 新发现 | 5 个并发 quiz 请求,4 个返回 `{"error":"DATABASE_ERROR"}`,仅第 1 个成功。SaaS 后端数据库连接池可能不足 | | TC-1-D02 | Browser Hand autonomous 返回 pending_execution | 正常 | **P1** | 已知(M3-02) | 即使 autonomous 模式也不实际执行浏览器操作 | | TC-1-D03 | Quiz 无输入长度限制 | 边界 | **P2** | 新发现 | 100K 字符 topic 被接受,应设上限 | --- ## 健康度评估 | 维度 | V12 基线 | 本次评估 | 变化 | |------|---------|---------|------| | 功能完整性 | 58 | 68 | +10 | | 代码质量 | - | - | N/A | | 测试覆盖 | - | - | N/A | | 文档完备 | - | - | N/A | | 集成连通性 | - | - | N/A | | **综合** | **58/100** | **68/100** | **+10** | **提升原因**: - M3-01 run_id 丢失已修复 - M3-06 返回值类型已修复 - 审批流程基本闭环(approval_list/respond 工作正常) - hand_run_list 历史记录功能完整 - 错误处理改善(null input / 不存在 Hand 都返回明确错误) **残留风险**: - Browser Hand 不实际执行(P1) - max_concurrent/timeout_secs 未实现(P2) - LLM API 并发问题(P1,SaaS 后端) - toolCount/metricCount 硬编码(P2)