docs: reorganize docs — archive outdated, create brainstorming folder
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

- Create docs/brainstorming/ with 5 discussion records (Mar 16 - Apr 7)
- Archive ~30 outdated audit reports (V5-V11) to docs/archive/old-audits/
- Archive superseded analysis docs to docs/archive/old-analysis/
- Archive completed session plans to docs/archive/old-plans/
- Archive old test reports/validations to respective archive folders
- Remove empty directories left after moves
- Keep current docs: TRUTH.md, feature docs, deployment, knowledge-base, superpowers
This commit is contained in:
iven
2026-04-07 09:54:30 +08:00
parent 8e9fc54d92
commit 2e5f63be32
101 changed files with 1829 additions and 17 deletions

View File

@@ -1,167 +0,0 @@
# ZCLAW 上线前功能审计 — 缺陷清单
> **审计日期**: 2026-04-06 | **最后更新**: 2026-04-06 (深度审计完成) | **审计范围**: T1-T8 模块 | **基线**: V12 审计 | **最新编译状态**: ✅ cargo check 通过
## 统计总览
| 严重度 | 已修复 | FALSE_POSITIVE |
|--------|--------|---------------|
| **P0** | 1 | 0 |
| **P1** | 14 | 1 (M11-01) |
| **P2** | 27 | 0 |
| **P3** | 9 | 0 |
| **合计** | **51** | **1** |
> **深度审计 (2026-04-06)**: 52 项逐项代码验证完成。M11-01 为 FALSE_POSITIVEblocking_lock 从未存在。P3-03/P3-07/P3-09 深度审计发现实际未修,已全部补修并编译通过。所有缺陷项均已关闭。
---
## P0 缺陷0 个 — 全部已修复)
| ID | 原V12 ID | 模块 | 描述 | 状态 |
|----|---------|------|------|------|
| ~~P0-01~~ | M4-01 | T2 | 双数据库PersistentMemoryStore vs SqliteStorage | ✅ 已修复 |
---
## P1 缺陷0 个 — 全部已修复)
| ID | 原V12 ID | 模块 | 描述 | 文件 | 状态 |
|----|---------|------|------|------|------|
| P1-01 | M3-02 | T1 | Browser Hand 返回 pending_execution 不实际执行 | hands/browser.rs | ✅ 已修复 (Fantoccini 0.21 集成于 desktop/src-tauri/src/browser/client.rsRust Hand 为有意 schema passthrough) |
| P1-02 | M4-03 | T2 | Heartbeat 不自动初始化,需手动 heartbeat_init | heartbeat.rs | ✅ 已修复 |
| P1-03 | TC-1-D01 | T1 | LLM API 并发 500 DATABASE_ERROR4/5 并发失败) | saas/relay | ✅ 已修复 |
| P1-04 | TC-4-D01 | T4 | GenerationPipeline 硬编码 model="default"SaaS relay 404 | zclaw-kernel/generation/mod.rs:416 | ✅ 已修复 |
| P1-05 | M2-05 | T3 | 删除活跃 Agent 无警告,无自动切换 | kernel_commands/agent.rs | ✅ 已修复 |
| P1-06 | M2-01 | T3 | agent_get 不返回 soul/system_prompt/temperature/max_tokens | kernel_commands/agent.rs | ✅ 已修复 |
---
## P2 缺陷23 个)
### T1 Hands (5)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-01 | M3-04 | max_concurrent 未实现5 个并发全被接受) | ✅ 已修复 (registry.rs Semaphore 并发限制) |
| P2-02 | M3-05 | timeout_secs 未实现(无超时保护) | ✅ 已修复 (kernel/hands.rs tokio::time::timeout) |
| P2-03 | M3-10 | toolCount/metricCount 硬编码为 0 | ✅ 已修复 (registry.get_counts + Hand trait tool_count/metric_count) |
| P2-04 | TC-1-D03 | Quiz Hand 无输入长度限制100K 字符被接受) | ✅ 已修复 (quiz.rs 50KB 限制) |
| P2-05 | M2-08 | max_tokens=0 未被 agent_create 拒绝 | ✅ 已修复 (create/update/import 全路径校验) |
### T2 Intelligence (4)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-06 | M4-08 | heartbeat_init 无最小间隔验证0.001分钟被接受) | ✅ 已修复 (init>=1 分钟, update_config 待补) |
| P2-07 | M4-02 | 反思引擎可能仍基于规则而非 LLMnew_memories=0 | ✅ 已修复 (ReflectionResult.used_fallback 标记) |
| P2-08 | TC-2-D01 | identity_propose_change 参数不透明 | ✅ 已修复 (统一 file/target 参数命名) |
| P2-09 | M4-14/15 | reflection/identity 命令参数名与文档不一致 | ✅ 已修复 (错误消息统一) |
### T4 Classroom (2)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-10 | M11-04 | LLM 失败静默 fallback 到 placeholder无标记 | ✅ 已修复 (ClassroomMetadata.is_placeholder 字段) |
| P2-11 | M11-05 | 课堂生成完成强制打开 player不尊重手动关闭 | ✅ 已修复 (userDidCloseDuringGeneration 标志追踪) |
### T5 Pipeline (5)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-12 | M6-03 | pipeline_create 硬编码 Action::HandLLM/Parallel/Condition 丢失 | ✅ 已修复 (前端补发 actionType + 后端多分支匹配) |
| P2-13 | M6-04 | workflowStore steps: p.inputs.length 语义错误 | ✅ 已修复 (后端 step_count 字段 + 前端 stepCount 读取) |
| P2-14 | M6-05 | getWorkflow inputs→steps 映射语义错误 | ✅ 已修复 (PipelineStepInfo + PipelineInfo.steps 字段) |
| P2-15 | M6-06 | 管道操作符 `\|` 在 context.resolve() 中不支持 | ✅ 已修复 (resolve_path_with_pipes + 8 种 transforms) |
| P2-16 | M6-07 | 模板中 `{{mustache}}``${inputs}` 混用 | ✅ 已修复 (mustache→${} 自动归一化) |
### T6 SaaS Desktop (2)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-17 | M7-01 | 前端密码最少 6 字符 vs 后端 8 字符不一致 | ✅ 已修复 (SaaSLogin placeholder 6→8) |
| P2-18 | M7-03 | TOTP QR 码通过外部服务生成,密钥明文传输 | ✅ 已修复 (qrcode 本地库 + LocalQRCode 组件,无外部请求) |
### T7 Skills (2)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-19 | M5-02 | SKILL.md tools 字段未解析75 个技能 tools 被忽略 | ✅ 已修复 (serialize_skill_md 补全 tools 写入 + update_skill 保留 tools) |
| P2-20 | M5-03 | Python 技能硬编码 python3Windows 无此命令 | ✅ 已修复 (runner.rs platform-aware python_bin()) |
### T8 Chat (3)
| ID | 原V12 ID | 描述 | 状态 |
|----|---------|------|------|
| P2-21 | M1-01 | GeminiDriver API Key 在 URL query 参数中 | ✅ 已修复 (P2-21: 前期暂停非国内模型支持Gemini/OpenAI/Anthropic 标记为 suspended) |
| P2-22 | M1-02 | ToolOutputGuard 只 warn 不 block 敏感信息 | ✅ 已修复 (sensitive patterns now return Err to block output) |
| P2-23 | M1-03/04 | Mutex::unwrap() 在 async 中可能 panic | ✅ 已修复 (relay/service.rs unwrap_or_else(|e| e.into_inner())) |
| P2-24 | — | 记忆写入无去重,多轮对话产生内容相同的重复记忆 | ✅ 已修复 (sqlite.rs content_hash 列 + agent scope 去重 + importance/access_count 合并) |
| P2-25 | — | 审计日志仅记录反思运行Hand/Skill 执行无审计追踪 | ✅ 已修复 (security-audit.ts 新增 4 事件类型 + kernel-hands.ts/kernel-skills.ts 审计调用) |
---
## P3 缺陷9 个)
| ID | 原V12 ID | 模块 | 描述 | 状态 |
|----|---------|------|------|------|
| P3-01 | TC-2-D02 | T2 | memory_store entry ID 重复 (knowledge/knowledge) | ✅ 已修复 (使用 source 作为 category 避免重复) |
| P3-02 | M11-07 | T4 | 白板两套渲染实现未统一SceneRenderer SVG + WhiteboardCanvas | ✅ 已修复 (SceneRenderer 导入 WhiteboardCanvas删除内联 SVG renderWhiteboardItem) |
| P3-03 | M11-08 | T4 | HTML export 只渲染 title+duration缺少 key_points | ✅ 已修复 (export_key_points 配置化渲染) |
| P3-04 | M6-08 | T5 | get_progress() 百分比只有 0/50/100 三档 | ✅ 已修复 (PipelineRun.total_steps + 实际百分比计算) |
| P3-05 | M7-05 | T6 | saveSaaSSession fire-and-forget失败静默 | ✅ 已修复 (所有调用点添加 .catch() 错误日志) |
| P3-06 | M7-06 | T6 | chatStream 不传 sessionKey/agentId | ✅ 已修复 (saas-relay-client.ts 传递 session_key/agent_id + 后端 RelayChatRequest 新增字段) |
| P3-07 | M5-04 | T7 | YAML triggers 引号只处理双引号 | ✅ 已修复 (loader.rs 同时处理双引号和单引号) |
| P3-08 | M5-05 | T7 | ShellSkill duration_ms 未设置 | ✅ 已修复 (runner.rs 计时并返回 duration_ms) |
| P3-09 | M5-06 | T7 | CATEGORY_CONFIG 仅覆盖 9 分类75 技能全为 null | ✅ 已修复 (auto_classify + 20 分类覆盖) |
---
## 修复确认清单
| 原V12 ID | 模块 | 描述 | 修复证据 |
|----------|------|------|---------|
| M4-01 P0 | T2 | 双数据库统一 | unified-client.ts isTauriRuntime() 路由到 SqliteStorage |
| M3-01 P1 | T1 | run_id 丢失 | hand_execute 返回 runId 字段 |
| M3-06 P1 | T1 | 返回值类型不匹配 | {success, output, error, durationMs, runId} |
| M6-01 P1 | T5 | route_intent 未注册 | lib.rs:220 已注册 |
| M6-02 P1 | T5 | v1/v2 解析器分裂 | helpers.rs:93-115 fallback 到 v2 |
| M7-02 P1 | T6 | PUT 布尔值路径参数 | ConfigMigrationWizard.tsx:118 使用 existing.id |
| M7-04 P1 | T6 | refreshToken 未传 body | saas-auth.ts:70-71 发送 refresh_token |
| M11-01 P1 | T4 | blocking_lock 死锁 | generate.rs:141-147 改用 try_lock() |
| M11-02 P1 | T4 | LLM 无 map_err | mod.rs:440,516 .map_err()(行号因后续提交偏移) |
| M11-03 P1 | T4 | 数据仅存内存 | persist.rs SQLite 持久化 |
| M11-06 P2 | T4 | Chat Message ID Date.now() | classroomStore.ts:187 crypto.randomUUID()(行号因后续提交偏移) |
| M2-08 P2 | T3 | 部分参数验证 | 空 name + temperature 越界已拒绝 |
| M5-01 P1 | T7 | tags→triggers 误映射 | skill-discovery.ts:117 优先使用 backend.triggers |
| TC-4-D01 P1 | T4 | GenerationPipeline model 硬编码 | generation/mod.rs: model 字段 + with_driver(model) + generate_scene_with_llm_static(model) |
| TC-1-D01 P1 | T1 | LLM API 并发 DATABASE_ERROR | relay/service.rs: 瞬态 DB 错误重试min_connections 建议通过 ZCLAW_DB_MIN_CONNECTIONS=10 配置 |
| P1-02 M4-03 | T2 | Heartbeat 不自动初始化 | lifecycle.rs: kernel_init 后自动 heartbeat_init + start |
| P1-05 M2-05 | T3 | 删除活跃 Agent 无警告 | CloneManager.tsx: 活跃 agent 差异化警告 + syncAgents 自动切换 |
| P1-06 M2-01 | T3 | agent_get 缺失字段 | AgentInfo + registry: 补全 soul/system_prompt/temperature/max_tokens |
| P2-01 M3-04 | T1 | max_concurrent 未实现 | registry.rs: Semaphore 并发限制 + register 时创建 |
| P2-03 M3-10 | T1 | toolCount/metricCount 硬编码 | hand.rs: tool_count()/metric_count() trait 方法 + registry.get_counts() |
| P2-06 M4-08 | T2 | heartbeat_init 无最小间隔验证 | heartbeat.rs:718 init>=1 + heartbeat.rs:838 update_config>=1 |
| P2-07 M4-02 | T2 | 反思引擎基于规则无标记 | reflection.rs: ReflectionResult.used_fallback 标记 |
| P2-08 TC-2-D01 | T2 | identity 参数不透明 | identity.rs: 错误消息统一为 file type |
| P2-10 M11-04 | T4 | LLM 失败静默 placeholder | ClassroomMetadata.is_placeholder + generate() 追踪 |
| P2-11 M11-05 | T4 | classroom 强制打开 player | classroomStore.ts: userDidCloseDuringGeneration 意图追踪 |
| P2-12 M6-03 | T5 | pipeline_create 硬编码 Action::Hand | workflowStore.ts: actionType 字段 + 后端多分支匹配 |
| P2-13 M6-04 | T5 | workflowStore steps 计数错误 | PipelineInfo.step_count + PipelineStepInfo 后端返回实际步骤 |
| P2-14 M6-05 | T5 | getWorkflow inputs→steps 映射 | PipelineInfo.steps + PipelineStepInfo 结构化步骤信息 |
| P2-15 M6-06 | T5 | 管道操作符 \| 不支持 | context.rs: resolve_path_with_pipes + 8 种 transforms |
| P2-16 M6-07 | T5 | {{mustache}} 和 ${inputs} 混用 | context.rs: mustache_regex 自动归一化为 ${...} |
| P2-17 M7-01 | T6 | 前端密码最少 6 vs 后端 8 | SaaSLogin.tsx: placeholder 改为"至少 8 个字符" |
| P2-19 M5-02 | T7 | SKILL.md tools 未序列化 | registry.rs: serialize_skill_md 补全 tools + update_skill 保留 |
| P2-22 M1-02 | T8 | ToolOutputGuard 只 warn | tool_output_guard.rs: sensitive patterns 返回 Err 阻断 |
| P2-23 M1-03/04 | T8 | Mutex::unwrap() panic | relay/service.rs: unwrap_or_else(\|e\| e.into_inner()) |
| P3-01 TC-2-D02 | T2 | memory_store ID 重复 | memory_commands.rs: 使用 source 作为 category 避免重复 |
| P3-03 M11-08 | T4 | HTML export 缺 key_points | html.rs: format_scene_content 添加 key_points 渲染 |
| P3-07 M5-04 | T7 | YAML triggers 引号 | loader.rs: 同时处理双引号和单引号 |
| P3-08 M5-05 | T7 | ShellSkill duration_ms | runner.rs: start.elapsed() 计时 + duration_ms: Some() |
| P3-09 M5-06 | T7 | CATEGORY_CONFIG 9 分类 | skill.rs: auto_classify 关键词匹配 + 20 分类覆盖 |
| P2-18 M7-03 | T6 | TOTP QR 码外部服务泄漏 | TOTPSettings.tsx: qrcode 本地库 + LocalQRCode 组件,零外部请求 |
| P2-21 M1-01 | T8 | 非国内模型前期暂停 | ModelsAPI.tsx: OpenAI/Anthropic 标记 suspended + 过滤; config.rs: Gemini 注释暂停 |
| P3-04 M6-08 | T5 | get_progress 硬编码百分比 | executor.rs: PipelineRun.total_steps + (completed/total)*100 实际计算 |
| P3-05 M7-05 | T6 | saveSaaSSession 静默失败 | saasStore.ts: 所有调用点添加 .catch() + log.warn 错误日志 |
| P3-06 M7-06 | T6 | chatStream 不传 sessionKey | saas-relay-client.ts: 传递 session_key/agent_id + RelayChatRequest 新增字段 |

View File

@@ -1,116 +0,0 @@
# ZCLAW 发布就绪评估
> **评估日期**: 2026-04-05 | **基于**: T1-T8 功能审计8 个模块)
## 总体评分
| 模块 | V12 基线 | 本次评分 | 变化 | 状态 |
|------|---------|---------|------|------|
| T1 Hands 自主能力 | 58 | **68** | +10 | ⚠️ 可用 |
| T2 智能层 | 61 | **74** | +13 | ✅ 良好 |
| T3 Agent 分身 | 67 | **73** | +6 | ✅ 良好 |
| T4 课堂系统 | 70 | **75** | +5 | ⚠️ 受阻 |
| T5 Pipeline 工作流 | 72 | **78** | +6 | ✅ 良好 |
| T6 SaaS 桌面集成 | 85 | **89** | +4 | ✅ 良好 |
| T7 技能生态 | 85 | **87** | +2 | ✅ 良好 |
| T8 智能对话 | 91 | **91** | 0 | ✅ 优秀 |
| **加权平均** | **73** | **79** | **+6** | - |
---
## 发布就绪判定
### 阻断项(必须修复才能发布)
~~全部已修复~~ ✅ 两个阻断项已修复2026-04-05
| # | 缺陷 | 状态 | 修复说明 |
|---|------|------|---------|
| 1 | **P1-04**: 课堂生成 model="default" 硬编码 | ✅ 已修复 | generation/mod.rs 添加 model 字段,从 kernel config 读取 |
| 2 | **P1-03**: LLM API 并发 500 DATABASE_ERROR | ✅ 已修复 | relay/service.rs 瞬态 DB 错误重试 + min_connections 5→10 |
### 强烈建议修复(影响用户体验) — ✅ 全部已处理
| # | 缺陷 | 状态 | 说明 |
|---|------|------|------|
| 3 | P1-01: Browser Hand 不实际执行 | 🔬 实验性 | 需 Fantoccini 桥接,标注为实验性功能 |
| 4 | P1-02: Heartbeat 不自动初始化 | ✅ 已修复 | lifecycle.rs kernel_init 自动初始化并启动 |
| 5 | P1-05: 删除活跃 Agent 无警告 | ✅ 已修复 | CloneManager 差异化警告 + 自动切换 |
| 6 | P1-06: agent_get 不返回完整配置 | ✅ 已修复 | AgentInfo 补全 soul/system_prompt/temperature/max_tokens |
### 可接受已知问题P2/P3可带缺陷发布
- 23 个 P2 问题大部分为边界条件、参数验证、API 一致性)
- 9 个 P3 问题UI 细节、日志、配置边缘情况)
---
## 模块风险评估
### HIGH RISK
**T1 Hands (68/100)**
- 核心问题: Browser Hand 为实验性(需 Fantoccini 桥接)
- 可缓解: Quiz/Slideshow/Whiteboard 等正常工作的 Hand 可用
- 状态: 已标注为实验性功能
**T4 Classroom (75→80/100)**
- 核心问题: ~~课堂生成不可用~~ ✅ 已修复P1-04 model 硬编码已修复)
- 可缓解: 持久化、死锁、错误处理已修复
- 状态: 课堂生成现在可正常工作
### MEDIUM RISK → ✅ 已降级
**T2 Intelligence (74→80/100)**
- 核心问题: ~~Heartbeat 不自动启动~~ ✅ 已修复lifecycle.rs 自动初始化)
- 状态: Heartbeat 随 kernel_init 自动启动
**T3 Agent (73→80/100)**
- 核心问题: ~~agent_get 字段不全、删除无警告~~ ✅ 已修复
- 状态: agent_get 返回完整配置 + 删除时差异化警告与自动切换
### LOW RISK
**T5-T8 (78-91/100)**
- 核心功能正常P2/P3 问题不影响主要用户流程
---
## 测试覆盖
| 类型 | 结果 |
|------|------|
| Rust cargo test | ✅ 511/511 全部通过10 crates, 0 failures |
| Desktop vitest | ⚠️ 174/185 通过11 失败在 chatStore 重构同步) |
| Admin vitest | ⚠️ 36/71 通过29 失败在 mock/API 依赖) |
| 功能审计 (T1-T8) | ✅ 51 用例执行19 已修复P1 全部处理 |
| 端到端 (T9-T12) | ⏭️ Phase 3/4待执行 |
---
## 发布建议
### 推荐路径: 所有 P1 已修复/处理,可直接发布 Beta
1. ~~修复 P1-04~~ ✅ 已完成 (generation/mod.rs model 从 config 读取)
2. ~~修复 P1-03~~ ✅ 已完成 (relay 瞬态重试 + min_connections 提升)
3. ~~修复 P1-02~~ ✅ 已完成 (lifecycle.rs 自动初始化 heartbeat)
4. ~~修复 P1-05~~ ✅ 已完成 (CloneManager 差异化警告 + 自动切换)
5. ~~修复 P1-06~~ ✅ 已完成 (AgentInfo 补全 soul/system_prompt/temperature/max_tokens)
6. **P1-01 Browser Hand** 🔬 标注为实验性(需 Fantoccini 桥接)
7. **发布 Beta 版本** 标注已知限制
### 已知限制标注
发布时应在 release notes 中注明:
- Browser Hand 为实验性功能(需 Fantoccini WebDriver 桥接)
- 课堂生成需要正确的模型配置
- Python 技能在 Windows 需手动配置 python3 命令
- 23 个 P2 + 9 个 P3 已知问题(不影响主要用户流程)
### 不建议发布的场景
~~如果以下条件不满足,不建议正式发布~~
两个阻断项已全部修复,以下场景已不再阻塞发布:
- ~~SaaS 后端连接池未扩容~~ ✅ 已提升 min_connections 并添加重试
- ~~课堂 model 硬编码未修复~~ ✅ 已从 kernel config 动态读取

View File

@@ -1,220 +0,0 @@
# T1 Hands 自主能力 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 58/100
## 摘要
- **执行用例数**: 18/235 个需 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 并发问题P1SaaS 后端)
- toolCount/metricCount 硬编码P2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 906 B

View File

@@ -1,142 +0,0 @@
# T2 智能层(记忆/反思/心跳/自主) 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 61/100
## 摘要
- **执行用例数**: 10/133 个需 UI 交互,未执行)
- **通过**: 7 ✅
- **未修复(已知问题确认)**: 2 ⚠️
- **已修复V12 P0 问题)**: 1 ✅
- **新发现缺陷**: 1
### 缺陷统计
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | - |
| P1 | 1 | Heartbeat 未自动初始化 |
| P2 | 2 | heartbeat 极短间隔无验证; identity_propose_change 参数不透明 |
| P3 | 1 | memory_store entry ID 重复 (knowledge/knowledge) |
---
## V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|--------|------|-----------|---------|------|
| M4-01 | 双数据库PersistentMemoryStore vs SqliteStorage | **P0** | ✅ **已修复** | unified-client.ts 统一了路径Tauri 模式下全部使用 Rust SqliteStorageFTS5不再 fallback 到 localStorage。fallback 仅在浏览器/dev 模式使用 |
| M4-02 | 反思 LLM 驱动未接入 | **P0** | ⚠️ **部分修复** | reflection_reflect 返回了 improvements 和 suggestions但需确认是否使用了 LLM返回内容较短可能仍基于规则 |
| M4-03 | 心跳不自动启动 | P2 | ⚠️ **未修复** | `heartbeat_get_config` 返回 "Heartbeat engine not initialized",需手动调用 heartbeat_init |
| M4-04 | 自主授权后端无强制 | P2 | ✅ T1 已验证 | supervised 模式正确拦截需审批 Hand |
| M4-05 | 前端记忆搜索用 LIKE 非 FTS5 | P2 | ✅ **已修复** | unified-client 统一使用 Tauri 后端 FTS5 |
| M4-06 | types 参数数组 vs 单值 | P2 | ❓ 未验证 | memory_search 的 options 参数结构需确认 |
| M4-07 | 记忆内容无长度限制 | P2 | ⚠️ 需确认 | memory_store 未测试超长 content |
| M4-08 | heartbeat interval 无下限 | P2 | ⚠️ **未修复** | heartbeat_init 接受 0.001 分钟间隔 |
| M4-09 | 心跳 interval 下限验证 | P2 | 同 M4-08 | - |
| M4-10 | memory_build_context 返回值 | P2 | ❓ 未验证 | - |
| M4-11 | memory_export 格式 | P2 | ❓ 未验证 | - |
| M4-12 | memory_import 去重 | P2 | ❓ 未验证 | - |
| M4-13 | 两套压缩实现 | P2 | ✅ compactor 命令工作 | compactor_estimate_tokens 正确返回 |
| M4-14 | reflection_reflect 参数不透明 | P2 | ⚠️ 确认 | 参数名 `memories` 而非文档中的 `agentId` |
| M4-15 | identity 命令参数不一致 | P2 | ⚠️ 确认 | identity_propose_change 需要 `file` + `suggestedContent`,非直觉参数 |
---
## 测试用例详细结果
### ✅ TC-2-01 | M4-01 双数据库验证P0
**结果**: PASS已修复
- 数据库路径: `C:\Users\szend\AppData\Roaming\zclaw\memories\memories.db`
- unified-client.ts 架构:
- `isTauriRuntime()` → 调用 Rust SqliteStorageFTS5
- 浏览器模式 → localStorage fallback
- 记忆 CRUD 完整store → search → stats 全链路通过
### ⚠️ TC-2-02 | M4-02 反思 LLM 验证P0
**结果**: PARTIAL
```json
{
"patterns": [],
"improvements": [{
"area": "用户理解",
"suggestion": "主动在对话中了解用户偏好...",
"priority": "medium"
}],
"identity_proposals": [],
"new_memories": 0
}
```
- 返回了结构化分析结果(有 improvements
-`new_memories: 0``patterns: []` 表明可能只基于规则分析
- **需进一步检查**: Rust 端 reflection_reflect 是否获取了 LLM driver
### ✅ TC-2-03 | 记忆 CRUD正常
**结果**: PASS
- memory_store: ✅ 保存成功,返回 ID
- memory_search: ✅ FTS5 搜索正确返回匹配记忆
- memory_stats: ✅ 22 条记忆10 preferences, 9 experience, 3 knowledge
- memory_db_path: ✅ 返回 SQLite 路径
### ⚠️ TC-2-05 | 身份演化(正常)
**结果**: PARTIAL
- identity_get: ✅ 返回完整的 soul/instructions/user_profile
- identity_propose_change: ⚠️ 参数名不透明(需要 `file` + `suggestedContent`
- 实际变更提案未成功触发(参数格式问题)
### ⚠️ TC-2-06 | M4-03 心跳不自动启动
**结果**: FAIL未修复
- `heartbeat_get_config` → "Heartbeat engine not initialized for agent: default"
- 需手动调用 `heartbeat_init` + `heartbeat_start`
### ⚠️ TC-2-11 | M4-08/M4-09 心跳间隔下限
**结果**: FAIL未修复
- `heartbeat_init(intervalMinutes: 0.001)` → 返回 null被接受
- 无最小值验证
### ✅ TC-2-08 | 上下文压缩
**结果**: PASS
- `compactor_estimate_tokens` 正确返回 token 数5 for "Hello world test"
---
## 新发现问题
| TC-ID | 描述 | 场景类型 | 优先级 | 状态 |
|-------|------|---------|--------|------|
| TC-2-D01 | identity_propose_change 参数不透明file + suggestedContent | 正常 | P2 | 新发现 |
| TC-2-D02 | memory_store 重复 IDknowledge/knowledge | 边界 | P3 | 新发现 |
---
## 健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|------|---------|---------|------|
| **综合** | **61/100** | **74/100** | **+13** |
**提升原因**:
- M4-01 P0 双数据库已修复unified-client 统一路径)
- 记忆 CRUD 全链路工作正常
- 上下文压缩命令工作
- 反思引擎返回结构化分析
**残留风险**:
- Heartbeat 不自动启动P1
- 反思 LLM 驱动可能未完全接入
- 部分命令参数不透明API 文档缺失)

View File

@@ -1,137 +0,0 @@
# T3 Agent 分身 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 67/100
## 摘要
- **执行用例数**: 10/12
- **通过**: 7 ✅
- **未修复(已知问题确认)**: 2 ⚠️
- **已修复**: 1 ✅
- **新发现缺陷**: 2
### 缺陷统计
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | - |
| P1 | 1 | 删除活跃 Agent 无警告M2-05 确认) |
| P2 | 2 | agent_get 不返回 soul/system_prompt; max_tokens=0 未被拒绝 |
| P3 | 0 | - |
---
## V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|--------|------|-----------|---------|------|
| M2-01 | KernelClient createClone 字段丢失 | P1 | ⚠️ **部分修复** | agent_create 接受 soul/system_prompt 但 agent_get 不返回这些字段 |
| M2-02 | 双通路创建不对等 | P1 | ❓ 未验证 | Gateway 模式未测试 |
| M2-03 | agent_list 不返回 emoji | P2 | ❓ 未验证 | agent_get 不含 emoji 字段 |
| M2-04 | agent_create 不返回 config | P2 | ✅ 返回基本字段 | 但缺少 soul/system_prompt |
| M2-05 | 删除活跃 Agent 无警告 | P1 | ⚠️ **未修复** | agent_delete 直接删除当前活跃 Agent无警告 |
| M2-06 | Agent 切换不通知 Kernel | P2 | ❓ 未验证 | 需 UI 测试 |
| M2-07 | 切换不取消流 | P2 | ❓ 未验证 | 需 UI 测试 |
| M2-08 | 无参数验证 | P2 | ⚠️ **部分修复** | 空 name 和 temperature 越界已拒绝 ✅,但 max_tokens=0 未拒绝 ⚠️ |
| M2-09 | 删除后 selectedAgent 引用悬挂 | P2 | ⚠️ **未修复** | 删除活跃 Agent 后无自动切换 |
| M2-10 | Agent export 不含 conversations | P2 | ❓ 未验证 | - |
| M2-11 | Agent export 返回空 JSON | P2 | ❓ 未验证 | - |
| M2-12 | SOUL.md 未集成到 system prompt | P2 | ❓ 未验证 | - |
| M2-13 | agent_create 无默认 workspace | P2 | ❓ 未验证 | - |
| M2-14 | agent_update 不触发 identity sync | P2 | ❓ 未验证 | - |
---
## 测试用例详细结果
### ✅ TC-3-01 | Agent 列举(正常)
**结果**: PASS
- agent_list 返回 1 个 default agent
- 包含 id, name, description, model, provider, state, messageCount, createdAt, updatedAt
### ⚠️ TC-3-02 | M2-01 字段丢失验证
**结果**: PARTIAL部分修复
**agent_create** 接受完整字段:
```json
{
"name": "审计测试 Agent",
"description": "用于测试字段传递",
"soul": "# 测试人格\n严谨、精确",
"system_prompt": "你是一个审计测试助手",
"model": "glm-4-flash",
"provider": "glm",
"max_tokens": 4096,
"temperature": 0.7
}
```
**agent_get** 返回时丢失字段:
```json
{
"id": "7f14a54e-...",
"name": "审计测试 Agent",
"description": "用于测试字段传递",
"model": "glm-4-flash",
"provider": "glm",
"state": "Running"
// ❌ 缺少: soul, system_prompt, temperature, max_tokens, workspace
}
```
**结论**: 字段写入成功但读取不返回 — **M2-01 部分修复**(数据已存储,但 API 不返回)
### ✅ TC-3-04 | Agent 更新(正常)
**结果**: PASS
- agent_update 成功更新 name, description
- agent_get 返回更新后的值
### ✅ TC-3-08 | Agent 删除(正常)
**结果**: PASS
- agent_delete 返回 null成功
- Agent 从列表消失
### ⚠️ TC-3-09 | M2-05 删除活跃 Agent
**结果**: FAIL未修复
- 删除当前活跃 Agentdefault agent
- 无警告、无确认
- Agent 从列表消失
- 无自动切换到其他 Agent
- 需手动创建新 Agent
### ✅ TC-3-10 | 参数验证
**结果**: PARTIAL
| 验证项 | 输入 | 结果 | 预期 |
|--------|------|------|------|
| 空名 | name="" | ✅ `"Agent name cannot be empty"` | 拒绝 |
| 温度越界 | temperature=5.0 | ✅ `"Temperature must be between 0 and 2"` | 拒绝 |
| max_tokens=0 | max_tokens=0 | ⚠️ Agent 被成功创建 | 应拒绝 |
---
## 健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|------|---------|---------|------|
| **综合** | **67/100** | **73/100** | **+6** |
**提升原因**:
- agent_create 接受完整配置字段soul, system_prompt, temperature 等)
- 基本参数验证已实现(空名、温度越界)
- CRUD 操作create/get/update/delete基本工作
**残留风险**:
- agent_get 不返回完整配置P2
- 删除活跃 Agent 无警告P1
- max_tokens=0 未被验证P2

View File

@@ -1,142 +0,0 @@
# T4 课堂系统 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 70/100
## 摘要
- **执行用例数**: 7/125 个需已生成课堂数据,因 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: 生成完成强制打开 playerM11-05

View File

@@ -1,129 +0,0 @@
# T5 Pipeline 工作流 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 72/100
## 摘要
- **执行用例数**: 6/82 个需 UI 交互,未执行)
- **代码审查确认**: 8 项 V12 问题验证
- **已修复**: 2 ✅
- **未修复**: 5 ⚠️
- **新发现缺陷**: 0
### 缺陷统计
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | - |
| P1 | 0 | M6-01/M6-02 已修复 |
| P2 | 4 | M6-03/M6-04/M6-05/M6-07 未修复 |
| P3 | 1 | M6-08 进度百分比粗糙 |
---
## V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|--------|------|-----------|---------|------|
| M6-01 | route_intent Tauri 命令未注册 | P1 | ✅ **已修复** | lib.rs:220 已注册,调用成功返回推荐结果 |
| M6-02 | pipeline_list 只用 v1 解析器 | P1 | ✅ **已修复** | helpers.rs:93-115 v1 失败 fallback 到 v215 个模板全部列出 |
| M6-03 | pipeline_create Action 类型丢失 | P2 | ⚠️ **未修复** | crud.rs:82 硬编码 `Action::Hand`LLM/Parallel/Condition 丢失 |
| M6-04 | workflowStore inputs→steps 映射错误 | P2 | ⚠️ **未修复** | workflowStore.ts:389 `steps: p.inputs.length` 语义错误 |
| M6-05 | getWorkflow inputs→steps 映射 | P2 | ⚠️ **未修复** | workflowStore.ts:405 将 inputs 映射为 WorkflowDetail.steps |
| M6-06 | 管道操作符 `\|` 不支持 | P2 | ❓ 未验证 | 需端到端执行验证 |
| M6-07 | `{{mustache}}``${inputs}` 混用 | P2 | ⚠️ **未修复** | campaign.yaml:87-90 等模板仍使用 `{{}}` 语法 |
| M6-08 | get_progress() 百分比粗糙 | P3 | ⚠️ **未修复** | executor.rs:469-475 只有 0/50/100 三档 |
---
## 测试用例详细结果
### ✅ TC-5-01 | Pipeline 列举发现
**结果**: PASS
- `pipeline_list` 返回 15 个模板
- 覆盖 5 个行业: design-shantou(4), education(5), healthcare(3), legal(1), marketing(1), productivity(1)
- 每个模板包含完整元数据: id, displayName, description, category, industry, tags, icon, version, inputs
### ✅ TC-5-02 | M6-02 验证: v1/v2 解析器
**结果**: PASS已修复
helpers.rs:93-115 — v1 解析失败后自动尝试 v2 解析器。15 个模板全部成功列出(含 v1 和 v2 格式)。
### ✅ TC-5-05 | M6-01 验证: route_intent
**结果**: PASS已修复
```json
{
"type": "no_match",
"suggestions": [
{"id": "client-communication", "displayName": "客户沟通辅助", "matchReason": "推荐"},
{"id": "supply-chain-collect", "displayName": "供应链信息采集", "matchReason": "推荐"},
{"id": "healthcare-data-report", "displayName": "医疗数据报告生成", "matchReason": "推荐"}
]
}
```
命令注册并工作正常。返回 "no_match" + 推荐列表符合预期(对课堂查询无精确匹配)。
### ✅ TC-5-03 | Pipeline 执行
**结果**: PASS基本执行成功
```json
{
"runId": "25d5dfc3-1f1b-4821-b0b0-3caecb35e6f6",
"pipelineId": "research-to-quiz",
"status": "running"
}
```
Pipeline 异步执行返回 runId状态为 "running"。`pipeline_runs` 后续查询返回空(可能执行已完成被清理或内存状态问题)。
### ⏭️ TC-5-04 | Pipeline 监控
**结果**: SKIP
`pipeline_runs` 返回空数组,无法验证进度详情。可能与内存 RunStore 生命周期有关。
### ⏭️ TC-5-06 | Pipeline 取消
**结果**: SKIP
需 UI 交互触发取消操作。
### ⚠️ TC-5-07 | M6-03 验证: Action 类型丢失
**结果**: FAIL未修复代码审查确认
crud.rs:78-92 — `WorkflowStepInput` 只有 `hand_name` 字段,所有步骤都被映射为 `Action::Hand`
### ⚠️ TC-5-08 | Pipeline 导出
**结果**: PARTIAL
`pipeline_templates` 返回空数组(可能需要单独初始化),但 `pipeline_list` 返回完整的模板列表可视为有效的"发现"导出。
---
## 健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|------|---------|---------|------|
| **综合** | **72/100** | **78/100** | **+6** |
**提升原因**:
- M6-01 P1 route_intent 已注册lib.rs:220
- M6-02 P1 v1/v2 解析器 fallback 已实现helpers.rs:93-115
- Pipeline 列举和发现功能完整15 个模板全部列出)
- Pipeline 执行基本工作run + runId 返回)
- 模板覆盖 5+ 行业
**残留风险**:
- pipeline_create 只支持 Hand ActionP2M6-03
- workflowStore 前端映射语义错误P2M6-04/05
- 模板语法混用 `{{}}` vs `${}`P2M6-07
- 执行进度只有 0/50/100 三档P3M6-08

View File

@@ -1,64 +0,0 @@
# T6 SaaS 桌面集成 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 85/100
## 摘要
- **执行用例数**: 3/63 个需 UI 交互或长时间等待)
- **已修复 P1**: 2 ✅
- **未修复**: 2 ⚠️
- **新发现缺陷**: 0
### 缺陷统计
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | - |
| P1 | 0 | M7-02/M7-04 已修复 |
| P2 | 2 | M7-01 密码长度不一致; M7-03 QR码泄露密钥 |
| P3 | 2 | M7-05 saveSaaSSession 静默失败; M7-06 chatStream 缺 sessionKey |
---
## V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|--------|------|-----------|---------|------|
| M7-01 | 前端密码 6 字符 vs 后端 8 字符 | P2 | ⚠️ **未修复** | SaaSLogin.tsx:58 使用 6SaaSSettings.tsx:232 使用 8 |
| M7-02 | ConfigMigrationWizard PUT 布尔值 | P1 | ✅ **已修复** | ConfigMigrationWizard.tsx:118 使用 `existing.id` 替代布尔值 |
| M7-03 | QR 码外部服务泄露密钥 | P2 | ❓ 未验证 | 需 UI 交互验证 TOTP 设置 |
| M7-04 | refreshToken 未传 body | P1 | ✅ **已修复** | saas-auth.ts:70-71 显式发送 `{ refresh_token: this.refreshTokenValue }` |
| M7-05 | saveSaaSSession 静默失败 | P3 | ❓ 未验证 | 需端到端验证 |
| M7-06 | chatStream 缺 sessionKey/agentId | P3 | ❓ 未验证 | 需端到端验证 |
## 运行时验证
### kernel_status
```json
{
"initialized": true,
"agentCount": 1,
"baseUrl": "http://127.0.0.1:8080/api/v1/relay",
"model": "glm-4-flash"
}
```
SaaS Relay 连接正常。
---
## 健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|------|---------|---------|------|
| **综合** | **85/100** | **89/100** | **+4** |
**提升原因**:
- M7-02 P1 PUT 路径参数已修复
- M7-04 P1 refreshToken body 已修复
- SaaS Relay 连接正常
**残留风险**:
- 密码长度前后端不一致P2M7-01
- TOTP QR 码外部服务P2M7-03

View File

@@ -1,69 +0,0 @@
# T7 技能生态 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 85/100
## 摘要
- **执行用例数**: 4/73 个需 UI 交互)
- **已修复 P1**: 1 ✅(部分)
- **未修复**: 4 ⚠️
- **新发现缺陷**: 0
### 缺陷统计
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | - |
| P1 | 0 | M5-01 部分修复triggers 正确category 仍错) |
| P2 | 3 | M5-02 tools 字段丢失; M5-03 Python3 硬编码; M5-06 分类不全 |
| P3 | 2 | M5-04 YAML 引号; M5-05 duration_ms 未设置 |
---
## V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|--------|------|-----------|---------|------|
| M5-01 | tags 误映射为 triggers | P1 | ⚠️ **部分修复** | triggers 正确返回skill_list 返回真实 triggers但 category 仍从 tags[0] 映射75 个技能全部 category=null |
| M5-02 | SKILL.md tools 字段丢失 | P2 | ❓ 未验证 | 需检查 Rust loader |
| M5-03 | Python3 硬编码 | P2 | ❓ 未验证 | Windows 兼容性问题 |
| M5-04 | YAML 引号只处理双引号 | P3 | ❓ 未验证 | - |
| M5-05 | ShellSkill duration_ms 未设置 | P3 | ❓ 未验证 | - |
| M5-06 | CATEGORY_CONFIG 仅覆盖 9 分类 | P3 | ⚠️ **未修复** | 75 个技能全为 nullSkillCard 显示灰色 |
## 运行时验证
### skill_list
- **技能总数**: 75
- **triggers 字段**: ✅ 正确返回(如 "品牌个性"、"微交互"、"截图验证"
- **tags 字段**: 全部为 `[]`(空数组)
- **category 字段**: 全部为 `null`
```json
{
"count": 75,
"sample": [
{"name": "whimsy-injector", "tags": [], "triggers": ["品牌个性","微交互","趣味设计"], "category": null},
{"name": "evidence-collector", "tags": [], "triggers": ["证据收集","截图验证","QA验证"], "category": null},
{"name": "github-deep-research", "tags": [], "triggers": ["分析仓库","GitHub分析"], "category": null}
]
}
```
---
## 健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|------|---------|---------|------|
| **综合** | **85/100** | **87/100** | **+2** |
**提升原因**:
- M5-01 triggers 映射已修复(正确使用 backend.triggers
- 75 个技能全部成功加载
**残留风险**:
- category 映射仍从 tags[0] 获取P2
- 75 个技能全部无分类标签P2
- Python 技能在 Windows 可能失败P2

View File

@@ -1,69 +0,0 @@
# T8 智能对话 测试报告
> **执行日期**: 2026-04-05 | **测试工具**: 代码审查 | **V12 基线**: 91/100
## 摘要
- **执行用例数**: 2/86 个需端到端 UI 交互,本次仅代码审查)
- **代码审查确认**: 11 项 V12 问题验证
- **已修复**: 0
- **未修复**: 11 ⚠️(全部 P2/P3
- **新发现缺陷**: 0
### 缺陷统计
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 | 0 | - |
| P1 | 0 | - |
| P2 | 4 | M1-01~04 |
| P3 | 7 | M1-05~11 |
---
## V12 已知问题验证
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|--------|------|-----------|---------|------|
| M1-01 | GeminiDriver API Key 在 URL query | P2 | ❓ 需 Gemini 配置验证 | driver/gemini.rs:71-74 |
| M1-02 | ToolOutputGuard 只 warn 不 block | P2 | ❓ 需端到端验证 | middleware/tool_output_guard.rs:99-128 |
| M1-03 | Mutex::unwrap() 在 async 中 | P2 | ❓ 需 Rust 编译检查 | middleware/memory.rs:46 |
| M1-04 | 同上 loop_guard | P2 | ❓ 需 Rust 编译检查 | middleware/loop_guard.rs:40 |
| M1-05 | Loop 迭代上限硬编码 10 | P3 | ❓ 需端到端验证 | loop_runner.rs:298 |
| M1-06 | TitleMiddleware 空 placeholder | P3 | ❓ 需检查 | middleware/title.rs |
| M1-07 | OpenAI driver trace 日志含请求体 | P3 | ❓ 需日志检查 | driver/openai.rs:127 |
| M1-08 | cancelStream 竞态条件 | P3 | ❓ 需压力测试 | streamStore.ts:476 |
| M1-09 | LoopGuard 不重置跨 agent turns | P3 | ❓ 需多轮测试 | middleware/loop_guard.rs |
| M1-10 | SecretString 转为 String | P3 | ❓ 需代码审查 | driver/openai.rs:130 |
| M1-11 | unwrap_or_default() 吞错误 | P3 | ❓ 需代码审查 | loop_runner.rs:513,804 |
## 架构验证
### ChatStore 重构
**完成**: 原有单一 chatStore 已拆分为 4 个 sub-store
- `streamStore.ts` — 流式编排
- `conversationStore.ts` — 会话管理
- `messageStore.ts` — 消息变更 + token 追踪
- `artifactStore.ts` — 文件/制品状态
顶层 `chatStore.ts` 作为 facade 统一导出,通过跨 store 订阅和依赖注入连接。
### 中间件链
11 层中间件已确认存在:
tool_output_guard, memory, loop_guard, guardrail, title, summarizer, extraction, growth_integration, context_window, mcp_bridge, system_prompt
---
## 健康度评估
| 维度 | V12 基线 | 本次评估 | 变化 |
|------|---------|---------|------|
| **综合** | **91/100** | **91/100** | **0** |
**评估说明**:
- T8 健康度最高91/100无 P0/P1 问题
- ChatStore 重构完成,架构质量提升
- 全部 11 项 V12 问题为 P2/P3无阻塞性缺陷
- 需端到端验证的问题留待 Phase 3/4 或自动化测试覆盖

View File

@@ -1,57 +0,0 @@
# ZCLAW 上线前功能审计 — 基线测试结果
> **执行日期**: 2026-04-05 | **环境**: Windows 11, PostgreSQL + SaaS + Tauri 已启动
## 自动化测试基线
### cargo test --workspace
- **状态**: ⚠️ 部分完成
- **问题**: zclaw-saas.exe 被运行中的 SaaS 后端锁定,无法重新编译
- **解决方案**: 排除 zclaw-saas 重跑,结果待补充
- **cargo check**: ✅ 通过0 error仅 warnings
### desktop vitest (174/185 passed)
- **通过**: 174
- **失败**: 10
- **跳过**: 1
- **失败原因**: 全部在 `chatStore.test.ts`,因 ChatStore 4-sub-store 重构后测试未同步更新
- **失败测试**:
- `chatStore` > `createConversation` 相关 3 个
- `chatStore` > `sendMessage` 相关 4 个
- `chatStore` > `conversations` 相关 3 个
### admin-v2 vitest (36/71 passed)
- **通过**: 36
- **失败**: 35
- **失败分布**:
- authStore.test.ts: 6/8 failed (localStorage mock 问题)
- request.test.ts: 2/7 failed (Authorization header / 401 refresh)
- accountStore.test.ts: 多个 CRUD 测试失败
- 其他页面测试: relay, usage, prompt 等
## 环境验证
| 项目 | 状态 | 备注 |
|------|------|------|
| PostgreSQL | ✅ 运行中 | Docker 容器 |
| SaaS 后端 | ✅ 运行中 | 0.0.0.0:8080 |
| Tauri 桌面端 | ✅ 运行中 | http://localhost:1420/ |
| tauri-mcp | ✅ 连接正常 | 可查询/交互 |
| LLM Provider | ✅ 可用 | glm-4-flash (GLM) |
## 已知基线缺陷(非本轮引入)
1. **desktop chatStore 测试**: ChatStore 拆分为 4 个 sub-store 后测试未更新
2. **admin authStore 测试**: jsdom 环境下 localStorage API 兼容问题
3. **admin 多页面测试**: 依赖真实 API 端点vitest 环境无法访问
## T1 Hands 测试已完成
详见 [T1-hands/REPORT.md](../T1-hands/REPORT.md)
- 通过: 11/18 执行用例
- 健康度: 58 → 68 (+10)
- 新发现 P1: 2 个 (LLM 并发 + Browser Hand)

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +0,0 @@
warning: G:\ZClaw_openfang\desktop\src-tauri\Cargo.toml: Found `debug_assertions` in `target.'cfg(...)'.dependencies`. This value is not supported for selecting dependencies and will not work as expected. To learn more visit https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies
Blocking waiting for file lock on package cache
Blocking waiting for file lock on package cache
Blocking waiting for file lock on package cache
Blocking waiting for file lock on build directory
warning: unused import: `parse_pipeline_v2_yaml`
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:9:5
|
9 | parse_pipeline_v2_yaml,
| ^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
warning: unused import: `pipeline_v2_to_info`
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:19:118
|
19 | use super::helpers::{get_pipelines_directory, scan_pipelines_with_paths, scan_pipelines_full_sync, pipeline_to_info, pipeline_v2_to_info};
| ^^^^^^^^^^^^^^^^^^^
warning: field `offset` is never read
--> desktop\src-tauri\src\memory\persistent.rs:126:9
|
118 | pub struct MemorySearchQuery {
| ----------------- field in this struct
...
126 | pub offset: Option<usize>,
| ^^^^^^
|
= note: `MemorySearchQuery` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: method `delete_classroom` is never used
--> desktop\src-tauri\src\classroom_commands\persist.rs:104:18
|
21 | impl ClassroomPersistence {
| ------------------------- method in this implementation
...
104 | pub async fn delete_classroom(&self, classroom_id: &str) -> Result<(), String> {
| ^^^^^^^^^^^^^^^^
warning: `desktop` (lib) generated 4 warnings (run `cargo fix --lib -p desktop` to apply 2 suggestions)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 38s
warning: the following packages contain code that will be rejected by a future version of Rust: sqlx-postgres v0.7.4
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`

View File

@@ -1,781 +0,0 @@
warning: G:\ZClaw_openfang\desktop\src-tauri\Cargo.toml: Found `debug_assertions` in `target.'cfg(...)'.dependencies`. This value is not supported for selecting dependencies and will not work as expected. To learn more visit https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies
Compiling sqlx-core v0.7.4
Compiling sqlx-postgres v0.7.4
Compiling sqlx-sqlite v0.7.4
Compiling sqlx-macros-core v0.7.4
Compiling sqlx-macros v0.7.4
Compiling sqlx v0.7.4
Compiling tokio-rustls v0.26.4
Compiling zclaw-growth v0.1.0 (G:\ZClaw_openfang\crates\zclaw-growth)
Compiling hyper-rustls v0.27.7
Compiling reqwest v0.12.28
Compiling zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory)
Compiling zclaw-runtime v0.1.0 (G:\ZClaw_openfang\crates\zclaw-runtime)
Compiling zclaw-protocols v0.1.0 (G:\ZClaw_openfang\crates\zclaw-protocols)
Compiling tauri v2.10.3
Compiling zclaw-hands v0.1.0 (G:\ZClaw_openfang\crates\zclaw-hands)
Compiling interprocess v2.4.0
Compiling image v0.24.9
Compiling zclaw-kernel v0.1.0 (G:\ZClaw_openfang\crates\zclaw-kernel)
Compiling zclaw-pipeline v0.1.0 (G:\ZClaw_openfang\crates\zclaw-pipeline)
Compiling desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)
Compiling tauri-plugin-opener v2.5.3
Compiling tauri-plugin-mcp v0.1.0 (https://github.com/P3GLEG/tauri-plugin-mcp?branch=main#ac709a71)
Compiling criterion v0.5.1
warning: unused import: `parse_pipeline_v2_yaml`
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:9:5
|
9 | parse_pipeline_v2_yaml,
| ^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
warning: unused import: `pipeline_v2_to_info`
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:19:118
|
19 | use super::helpers::{get_pipelines_directory, scan_pipelines_with_paths, scan_pipelines_full_sync, pipeline_to_info, pipeline_v2_to_info};
| ^^^^^^^^^^^^^^^^^^^
warning: field `offset` is never read
--> desktop\src-tauri\src\memory\persistent.rs:126:9
|
118 | pub struct MemorySearchQuery {
| ----------------- field in this struct
...
126 | pub offset: Option<usize>,
| ^^^^^^
|
= note: `MemorySearchQuery` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: method `delete_classroom` is never used
--> desktop\src-tauri\src\classroom_commands\persist.rs:104:18
|
21 | impl ClassroomPersistence {
| ------------------------- method in this implementation
...
104 | pub async fn delete_classroom(&self, classroom_id: &str) -> Result<(), String> {
| ^^^^^^^^^^^^^^^^
warning: unused import: `zclaw_growth::MemoryType`
--> desktop\src-tauri\src\summarizer_adapter.rs:114:9
|
114 | use zclaw_growth::MemoryType;
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
warning: unused import: `parse_pipeline_v2_yaml`
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:9:5
|
9 | parse_pipeline_v2_yaml,
| ^^^^^^^^^^^^^^^^^^^^^^
warning: struct `DummyDriver` is never constructed
--> desktop\src-tauri\src\intelligence\extraction_adapter.rs:279:16
|
279 | struct DummyDriver;
| ^^^^^^^^^^^
warning: method `parse_response_test` is never used
--> desktop\src-tauri\src\intelligence\extraction_adapter.rs:281:16
|
280 | impl TauriExtractionDriver {
| -------------------------- method in this implementation
281 | fn parse_response_test(
| ^^^^^^^^^^^^^^^^^^^
warning: non-local `impl` definition, `impl` blocks should be written at the same level as their item
--> desktop\src-tauri\src\intelligence\extraction_adapter.rs:280:9
|
276 | fn test_parse_empty_response() {
| ------------------------------ move the `impl` block outside of this function `test_parse_empty_response`
...
280 | impl TauriExtractionDriver {
| ^^^^^---------------------
| |
| `TauriExtractionDriver` is not local
|
= note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
= note: `#[warn(non_local_definitions)]` on by default
warning: `desktop` (lib test) generated 8 warnings (3 duplicates) (run `cargo fix --lib -p desktop --tests` to apply 2 suggestions)
warning: unused import: `compile_pattern`
--> crates\zclaw-pipeline\src\intent.rs:631:26
|
631 | use crate::trigger::{compile_pattern, compile_trigger, Trigger};
| ^^^^^^^^^^^^^^^
|
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
warning: `desktop` (lib) generated 4 warnings (run `cargo fix --lib -p desktop` to apply 2 suggestions)
warning: `zclaw-pipeline` (lib test) generated 1 warning (run `cargo fix --lib -p zclaw-pipeline --tests` to apply 1 suggestion)
warning: function `test_context` is never used
--> crates\zclaw-hands\src\hands\researcher.rs:583:8
|
583 | fn test_context() -> HandContext {
| ^^^^^^^^^^^^
|
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
warning: `zclaw-hands` (lib test) generated 1 warning
Finished `test` profile [unoptimized + debuginfo] target(s) in 3m 33s
warning: the following packages contain code that will be rejected by a future version of Rust: sqlx-postgres v0.7.4
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
Running unittests src\lib.rs (target\debug\deps\desktop_lib-7e14a4a33859881e.exe)
running 36 tests
test intelligence::compactor::tests::test_estimate_tokens_chinese ... ok
test intelligence::compactor::tests::test_compaction_check ... ok
test intelligence::heartbeat::tests::test_parse_time ... ok
test intelligence::extraction_adapter::tests::test_parse_no_json_array ... ok
test intelligence::extraction_adapter::tests::test_parse_empty_response ... ok
test intelligence::reflection::tests::test_analyze_patterns ... ok
test intelligence::heartbeat::tests::test_default_config ... ok
test intelligence::compactor::tests::test_estimate_tokens_english ... ok
test intelligence::extraction_adapter::tests::test_parse_valid_json_response ... ok
test intelligence::extraction_adapter::tests::test_extraction_driver_not_configured_by_default ... ok
test intelligence::reflection::tests::test_should_reflect_initial ... ok
test intelligence::validation::tests::test_optional_identifier ... ok
test intelligence::validation::tests::test_invalid_identifiers ... ok
test intelligence::validation::tests::test_sanitize_for_logging ... ok
test intelligence::validation::tests::test_string_length_validation ... ok
test intelligence::validation::tests::test_valid_identifiers ... ok
test llm::tests::test_llm_client_creation ... ok
test llm::tests::test_provider_configs ... ok
test memory::context_builder::tests::test_estimate_tokens ... ok
test memory::persistent::tests::test_generate_memory_id ... ok
test memory::extractor::tests::test_extraction_config_default ... ok
test memory::crypto::tests::test_derive_key ... ok
test memory::extractor::tests::test_uri_generation ... ok
test memory::crypto::tests::test_encrypt_decrypt ... ok
test memory::context_builder::tests::test_context_builder_config_default ... ok
test memory::context_builder::tests::test_extract_category ... ok
test summarizer_adapter::tests::test_summary_driver_configure_and_check ... ok
test viking_commands::tests::test_invalid_uri ... ok
test summarizer_adapter::tests::test_summary_driver_not_configured_by_default ... ok
test memory::crypto::tests::test_encrypt_produces_different_ciphertext ... ok
test viking_commands::tests::test_parse_uri ... ok
test intelligence::identity::tests::test_get_identity_creates_default ... ok
test intelligence::identity::tests::test_update_user_profile ... ok
test intelligence::identity::tests::test_snapshots ... ok
test intelligence::identity::tests::test_proposal_flow ... ok
test intelligence::compactor::tests::test_generate_summary ... ok
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
Running unittests src\main.rs (target\debug\deps\desktop-c3cc535c9683aa3d.exe)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src\lib.rs (target\debug\deps\zclaw_growth-0cc62226cc107d52.exe)
running 66 tests
test extractor::tests::test_prompts_available ... ok
test injector::tests::test_injector_empty_memories ... ok
test injector::tests::test_estimate_tokens ... ok
test injector::tests::test_minimal_context ... ok
test injector::tests::test_injector_with_preferences ... ok
test injector::tests::test_inject_compact ... ok
test injector::tests::test_injector_with_all_types ... ok
test injector::tests::test_format_selection ... ok
test injector::tests::test_inject_custom ... ok
test injector::tests::test_inject_json ... ok
test retrieval::query::tests::test_cjk_detection ... ok
test extractor::tests::test_extractor_creation ... ok
test retrieval::cache::tests::test_cache_miss ... ok
test retrieval::cache::tests::test_cache_stats ... ok
test retrieval::cache::tests::test_cache_eviction ... ok
test retrieval::cache::tests::test_cache_put_and_get ... ok
test retrieval::cache::tests::test_cache_remove ... ok
test retrieval::query::tests::test_extract_keywords ... ok
test retrieval::query::tests::test_chinese_keywords ... ok
test retrieval::semantic::tests::test_cosine_similarity ... ok
test extractor::tests::test_extract_memories ... ok
test retrieval::query::tests::test_classify_intent_code ... ok
test retrieval::cache::tests::test_get_hot_entries ... ok
test retrieval::query::tests::test_classify_intent_knowledge ... ok
test retrieval::cache::tests::test_cache_clear ... ok
test retrieval::query::tests::test_classify_intent_preference ... ok
test retrieval::query::tests::test_query_expansion ... ok
test retrieval::query::tests::test_generate_search_queries ... ok
test retrieval::semantic::tests::test_tf_computation ... ok
test retrieval::semantic::tests::test_stop_words_removal ... ok
test retrieval::semantic::tests::test_tokenize ... ok
test retrieval::semantic::tests::test_index_and_score ... ok
test retrieval::semantic::tests::test_stats ... ok
test retriever::tests::test_memory_type_scope ... ok
test retriever::tests::test_retrieval_config_default ... ok
test retriever::tests::test_retriever_creation ... ok
test summarizer::tests::test_abstract_prompt ... ok
test summarizer::tests::test_clean_summary ... ok
test summarizer::tests::test_generate_summaries ... ok
test summarizer::tests::test_overview_prompt ... ok
test summarizer::tests::test_generate_summaries_handles_error ... ok
test tests::test_growth_config_default ... ok
test tests::test_memory_type_reexport ... ok
test types::tests::test_estimated_tokens ... ok
test types::tests::test_memory_entry_creation ... ok
test types::tests::test_memory_entry_touch ... ok
test tracker::tests::test_agent_metadata_serialization ... ok
test tracker::tests::test_learning_event_serialization ... ok
test types::tests::test_memory_type_display ... ok
test types::tests::test_retrieval_config_default ... ok
test types::tests::test_retrieval_config_with_budget ... ok
test types::tests::test_retrieval_result ... ok
test types::tests::test_uri_builder ... ok
test types::tests::test_uri_parser ... ok
test viking_adapter::tests::test_in_memory_storage_delete ... ok
test viking_adapter::tests::test_metadata_storage ... ok
test viking_adapter::tests::test_viking_adapter_typed_metadata ... ok
test viking_adapter::tests::test_in_memory_storage_store_and_get ... ok
test viking_adapter::tests::test_viking_level_display ... ok
test viking_adapter::tests::test_in_memory_storage_find ... ok
test storage::sqlite::tests::test_metadata_storage ... ok
test storage::sqlite::tests::test_sqlite_storage_store_and_get ... ok
test storage::sqlite::tests::test_sqlite_storage_delete ... ok
test storage::sqlite::tests::test_access_count ... ok
test storage::sqlite::tests::test_sqlite_storage_semantic_search ... ok
test storage::sqlite::tests::test_persistence ... ok
test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
Running tests\integration_test.rs (target\debug\deps\integration_test-4b889886bf0ebf9e.exe)
running 9 tests
test test_prompt_injection_token_budget ... ok
test test_metadata_operations ... ok
test test_chinese_text_handling ... ok
test test_memory_deletion ... ok
test test_semantic_search_ranking ... ok
test test_find_by_prefix ... ok
test test_agent_isolation ... ok
test test_importance_and_access ... ok
test test_memory_lifecycle ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
Running unittests src\lib.rs (target\debug\deps\zclaw_hands-ddb5fe00a71de8d9.exe)
running 155 tests
test hands::browser::tests::test_browser_config ... ok
test hands::browser::tests::test_form_field_deserialize ... ok
test hands::clip::tests::test_action_check_ffmpeg ... ok
test hands::browser::tests::test_action_deserialize_screenshot ... ok
test hands::browser::tests::test_action_deserialize_type ... ok
test hands::clip::tests::test_action_info ... ok
test hands::clip::tests::test_action_invalid ... ok
test hands::browser::tests::test_action_deserialize_navigate ... ok
test hands::clip::tests::test_action_convert ... ok
test hands::clip::tests::test_action_resize ... ok
test hands::browser::tests::test_action_deserialize_click ... ok
test hands::clip::tests::test_action_thumbnail ... ok
test hands::clip::tests::test_action_concat ... ok
test hands::browser::tests::test_action_deserialize_scrape ... ok
test hands::clip::tests::test_action_trim ... ok
test hands::clip::tests::test_concat_config_deserialize ... ok
test hands::browser::tests::test_all_major_actions_roundtrip ... ok
test hands::clip::tests::test_convert_config_defaults ... ok
test hands::browser::tests::test_browser_config_needs_approval ... ok
test hands::clip::tests::test_convert_config_deserialize ... ok
test hands::browser::tests::test_browser_sequence_builder ... ok
test hands::browser::tests::test_browser_sequence_multiple_steps ... ok
test hands::clip::tests::test_default_impl ... ok
test hands::clip::tests::test_info_action_roundtrip ... ok
test hands::clip::tests::test_hand_config ... ok
test hands::clip::tests::test_resolution_custom ... ok
test hands::clip::tests::test_resolution_default ... ok
test hands::clip::tests::test_resolution_presets ... ok
test hands::clip::tests::test_needs_approval ... ok
test hands::clip::tests::test_execute_invalid_action ... ok
test hands::clip::tests::test_resolution_serialize ... ok
test hands::clip::tests::test_thumbnail_config_defaults ... ok
test hands::clip::tests::test_thumbnail_config_deserialize ... ok
test hands::clip::tests::test_trim_action_roundtrip ... ok
test hands::clip::tests::test_trim_config_deserialize ... ok
test hands::clip::tests::test_trim_config_minimal ... ok
test hands::clip::tests::test_video_format_deserialize ... ok
test hands::clip::tests::test_video_format_default ... ok
test hands::clip::tests::test_video_info_deserialize ... ok
test hands::clip::tests::test_video_format_serialize ... ok
test hands::collector::tests::test_collection_target_deserialize ... ok
test hands::collector::tests::test_collector_action_deserialize ... ok
test hands::collector::tests::test_collector_config ... ok
test hands::collector::tests::test_aggregate_action_empty_urls ... ok
test hands::collector::tests::test_extract_visible_text_empty ... ok
test hands::researcher::tests::test_action_fetch_deserialize ... ok
test hands::collector::tests::test_extract_visible_text_basic ... ok
test hands::collector::tests::test_extract_visible_text_strips_scripts ... ok
test hands::researcher::tests::test_action_invalid_rejected ... ok
test hands::collector::tests::test_extract_visible_text_strips_styles ... ok
test hands::quiz::tests::test_quiz_creation ... ok
test hands::quiz::tests::test_export_markdown ... ok
test hands::collector::tests::test_output_format_serialize ... ok
test hands::quiz::tests::test_submit_and_grade ... ok
test hands::quiz::tests::test_generate_quiz ... ok
test hands::researcher::tests::test_action_search_deserialize ... ok
test hands::researcher::tests::test_action_report_deserialize ... ok
test hands::quiz::tests::test_show_question ... ok
test hands::researcher::tests::test_config_id ... ok
test hands::researcher::tests::test_check_dependencies_ok ... ok
test hands::researcher::tests::test_extract_text_empty_body ... ok
test hands::researcher::tests::test_extract_text_basic ... ok
test hands::researcher::tests::test_extract_text_strips_scripts ... ok
test hands::researcher::tests::test_extract_text_strips_styles ... ok
test hands::researcher::tests::test_research_depth_default_is_standard ... ok
test hands::clip::tests::test_check_dependencies ... ok
test hands::researcher::tests::test_research_depth_deserialize ... ok
test hands::researcher::tests::test_research_depth_serialize ... ok
test hands::researcher::tests::test_research_query_defaults ... ok
test hands::researcher::tests::test_needs_approval_is_false ... ok
test hands::researcher::tests::test_research_report_summary_is_some_when_results ... ok
test hands::researcher::tests::test_search_engine_default_is_auto ... ok
test hands::researcher::tests::test_search_engine_serialize_roundtrip ... ok
test hands::clip::tests::test_execute_check_ffmpeg ... ok
test hands::researcher::tests::test_search_result_serialization ... ok
test hands::researcher::tests::test_url_encode_ascii ... ok
test hands::researcher::tests::test_extract_text_truncates_long_content ... ok
test hands::researcher::tests::test_url_encode_chinese ... ok
test hands::researcher::tests::test_url_encode_empty ... ok
test hands::clip::tests::test_status ... ok
test hands::researcher::tests::test_url_encode_safe_chars ... ok
test hands::researcher::tests::test_status_is_idle ... ok
test hands::slideshow::tests::test_add_slide ... ok
test hands::slideshow::tests::test_content_block_code ... ok
test hands::slideshow::tests::test_autoplay_default_interval ... ok
test hands::slideshow::tests::test_autoplay_pause_resume ... ok
test hands::slideshow::tests::test_content_block_list ... ok
test hands::slideshow::tests::test_content_block_table ... ok
test hands::slideshow::tests::test_default_impl ... ok
test hands::slideshow::tests::test_default_state ... ok
test hands::slideshow::tests::test_content_block_text ... ok
test hands::slideshow::tests::test_deserialize_autoplay ... ok
test hands::slideshow::tests::test_deserialize_goto_slide ... ok
test hands::slideshow::tests::test_deserialize_laser ... ok
test hands::slideshow::tests::test_deserialize_next_slide ... ok
test hands::slideshow::tests::test_deserialize_invalid_action ... ok
test hands::slideshow::tests::test_goto_slide_out_of_range ... ok
test hands::slideshow::tests::test_get_state ... ok
test hands::slideshow::tests::test_goto_slide_returns_content ... ok
test hands::slideshow::tests::test_hand_execute_dispatch ... ok
test hands::slideshow::tests::test_hand_execute_invalid_action ... ok
test hands::slideshow::tests::test_highlight_custom_color ... ok
test hands::slideshow::tests::test_highlight_default_color ... ok
test hands::slideshow::tests::test_needs_approval ... ok
test hands::slideshow::tests::test_laser ... ok
test hands::slideshow::tests::test_navigation ... ok
test hands::slideshow::tests::test_next_slide_at_end ... ok
test hands::slideshow::tests::test_play_animation ... ok
test hands::slideshow::tests::test_prev_slide_at_beginning ... ok
test hands::slideshow::tests::test_set_content_append ... ok
test hands::slideshow::tests::test_slideshow_creation ... ok
test hands::slideshow::tests::test_set_content_invalid_index ... ok
test hands::slideshow::tests::test_set_content ... ok
test hands::slideshow::tests::test_spotlight ... ok
test hands::slideshow::tests::test_spotlight_default_duration ... ok
test hands::speech::tests::test_speak ... ok
test hands::slideshow::tests::test_status ... ok
test hands::speech::tests::test_pause_resume ... ok
test hands::speech::tests::test_set_voice ... ok
test hands::speech::tests::test_list_voices ... ok
test hands::speech::tests::test_speech_creation ... ok
test hands::twitter::tests::test_check_credentials_action ... ok
test hands::twitter::tests::test_check_dependencies ... ok
test hands::twitter::tests::test_check_credentials_with_config ... ok
test hands::twitter::tests::test_default_impl ... ok
test hands::twitter::tests::test_delete_tweet_action ... ok
test hands::twitter::tests::test_check_credentials_without_config ... ok
test hands::twitter::tests::test_followers_action ... ok
test hands::twitter::tests::test_following_action_no_max ... ok
test hands::twitter::tests::test_get_tweet_action ... ok
test hands::twitter::tests::test_invalid_action ... ok
test hands::twitter::tests::test_get_user_action ... ok
test hands::twitter::tests::test_hand_config ... ok
test hands::twitter::tests::test_like_unlike_actions ... ok
test hands::twitter::tests::test_media_info_deserialize ... ok
test hands::twitter::tests::test_needs_approval ... ok
test hands::twitter::tests::test_retweet_unretweet_actions ... ok
test hands::twitter::tests::test_search_action_custom_max ... ok
test hands::twitter::tests::test_search_action_defaults ... ok
test hands::twitter::tests::test_search_action_roundtrip ... ok
test hands::twitter::tests::test_tweet_action_deserialize ... ok
test hands::twitter::tests::test_timeline_action_defaults ... ok
test hands::twitter::tests::test_tweet_action_roundtrip ... ok
test hands::twitter::tests::test_status ... ok
test hands::twitter::tests::test_set_and_get_credentials ... ok
test hands::twitter::tests::test_tweet_action_with_poll ... ok
test hands::twitter::tests::test_tweet_action_with_reply ... ok
test hands::twitter::tests::test_tweet_deserialize ... ok
test hands::twitter::tests::test_twitter_user_deserialize ... ok
test hands::whiteboard::tests::test_draw_shape ... ok
test hands::whiteboard::tests::test_chart ... ok
test hands::whiteboard::tests::test_undo_redo ... ok
test hands::whiteboard::tests::test_whiteboard_creation ... ok
test hands::whiteboard::tests::test_clear ... ok
test hands::whiteboard::tests::test_draw_text ... ok
test result: ok. 155 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
Running unittests src\lib.rs (target\debug\deps\zclaw_kernel-2ce44e6daaebc1d9.exe)
running 48 tests
test config::tests::test_interpolate_env_vars_basic ... ok
test config::tests::test_interpolate_env_vars_missing ... ok
test config::tests::test_interpolate_env_vars_no_vars ... ok
test config::tests::test_interpolate_env_vars_multiple ... ok
test export::html::tests::test_format_duration ... ok
test export::html::tests::test_format_level ... ok
test export::html::tests::test_html_escape ... ok
test export::markdown::tests::test_capitalize_first ... ok
test export::markdown::tests::test_format_duration ... ok
test export::markdown::tests::test_slugify ... ok
test export::pptx::tests::test_pptx_format ... ok
test export::pptx::tests::test_xml_escape ... ok
test export::markdown::tests::test_markdown_export ... ok
test export::markdown::tests::test_include_notes ... ok
test export::html::tests::test_html_export ... ok
test export::tests::test_sanitize_filename ... ok
test generation::agents::tests::test_agent_role_display ... ok
test export::markdown::tests::test_include_answers ... ok
test export::markdown::tests::test_table_of_contents ... ok
test generation::agents::tests::test_default_request ... ok
test export::html::tests::test_include_notes ... ok
test generation::agents::tests::test_generate_chinese_profiles ... ok
test generation::chat::tests::test_agent_message ... ok
test generation::chat::tests::test_build_chat_prompt ... ok
test generation::agents::tests::test_generate_english_profiles ... ok
test generation::chat::tests::test_parse_chat_responses_fallback ... ok
test generation::chat::tests::test_parse_chat_responses_valid_json ... ok
test generation::chat::tests::test_user_message ... ok
test generation::tests::test_generation_stage_order ... ok
test generation::tests::test_teaching_style_default ... ok
test scheduler::tests::test_cron_field_exact ... ok
test scheduler::tests::test_cron_field_list ... ok
test generation::tests::test_scene_action_serialization ... ok
test scheduler::tests::test_cron_field_range ... ok
test scheduler::tests::test_cron_field_step ... ok
test generation::tests::test_pipeline_creation ... ok
test generation::tests::test_generate_outline ... ok
test scheduler::tests::test_cron_field_wildcard ... ok
test generation::tests::test_generate_agent_profiles ... ok
test generation::tests::test_generate_scenes ... ok
test scheduler::tests::test_should_fire_every_minute ... ok
test scheduler::tests::test_should_fire_cron_wildcard ... ok
test scheduler::tests::test_should_not_fire_cron ... ok
test skill_router::tests::test_extract_json_bare ... ok
test skill_router::tests::test_extract_json_code_block ... ok
test generation::tests::test_full_generation ... ok
test skill_router::tests::test_extract_json_with_surrounding_text ... ok
test export::pptx::tests::test_pptx_export ... ok
test result: ok. 48 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src\lib.rs (target\debug\deps\zclaw_memory-909b7cff59274e48.exe)
running 25 tests
test fact::tests::test_fact_new_clamps_confidence ... ok
test fact::tests::test_fact_with_source ... ok
test fact::tests::test_is_empty_and_len ... ok
test fact::tests::test_filter_by_confidence ... ok
test fact::tests::test_deduplicate_keeps_higher_confidence ... ok
test store::tests::test_in_memory_store_creation ... ok
test store::tests::test_agent_with_empty_name ... ok
test store::tests::test_kv_recall_nonexistent ... ok
test store::tests::test_list_agents ... ok
test store::tests::test_load_nonexistent_agent ... ok
test store::tests::test_kv_store_and_recall ... ok
test store::tests::test_delete_agent ... ok
test store::tests::test_create_session ... ok
test store::tests::test_agent_with_special_characters_in_name ... ok
test store::tests::test_message_with_thinking ... ok
test store::tests::test_kv_list ... ok
test store::tests::test_append_and_get_messages ... ok
test store::tests::test_delete_nonexistent_agent_succeeds ... ok
test store::tests::test_kv_update_existing ... ok
test store::tests::test_large_message_content ... ok
test store::tests::test_message_ordering ... ok
test store::tests::test_save_agent_updates_existing ... ok
test store::tests::test_save_and_load_agent ... ok
test store::tests::test_message_with_tool_result ... ok
test store::tests::test_message_with_tool_use ... ok
test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
Running unittests src\lib.rs (target\debug\deps\zclaw_pipeline-a7d8a9f8b74018ea.exe)
running 59 tests
test engine::stage::tests::test_stage_engine_creation ... ok
test parser::tests::test_parse_empty_steps ... ok
test parser::tests::test_parse_duplicate_step_ids ... ok
test parser::tests::test_parse_invalid_kind ... ok
test parser::tests::test_parse_invalid_version ... ok
test parser::tests::test_parse_valid_pipeline ... ok
test engine::context::tests::test_evaluate_condition_gt ... ok
test engine::context::tests::test_resolve_param ... ok
test engine::context::tests::test_resolve_stage_output ... ok
test engine::context::tests::test_resolve_loop_context ... ok
test executor::tests::test_evaluate_condition_bool ... ok
test engine::context::tests::test_evaluate_condition_equal ... ok
test executor::tests::test_evaluate_condition_equality ... ok
test engine::context::tests::test_resolve_mixed_string ... ok
test parser_v2::tests::test_parse_conditional_stage ... ok
test parser_v2::tests::test_parse_all_stage_types ... ok
test parser_v2::tests::test_parse_duplicate_stage_ids ... ok
test parser_v2::tests::test_parse_empty_stages ... ok
test parser_v2::tests::test_parse_invalid_kind ... ok
test parser_v2::tests::test_parse_invalid_version ... ok
test parser_v2::tests::test_parse_output_config ... ok
test presentation::analyzer::tests::test_analyze_document_fallback ... ok
test presentation::analyzer::tests::test_analyze_chart ... ok
test presentation::analyzer::tests::test_analyze_slideshow ... ok
test presentation::analyzer::tests::test_analyze_quiz ... ok
test parser_v2::tests::test_parse_parallel_stage ... ok
test presentation::analyzer::tests::test_can_render_as ... ok
test engine::context::tests::test_child_context ... ok
test parser_v2::tests::test_parse_valid_pipeline_v2 ... ok
test parser_v2::tests::test_parse_sequential_stage ... ok
test presentation::registry::tests::test_registry_defaults ... ok
test parser_v2::tests::test_try_parse_v2 ... ok
test presentation::registry::tests::test_all_available ... ok
test presentation::registry::tests::test_renderer_info ... ok
test presentation::registry::tests::test_get_export_formats ... ok
test intent::tests::test_decide_mode_form ... ok
test intent::tests::test_decide_mode_conversation ... ok
test presentation::types::tests::test_presentation_type_display ... ok
test presentation::types::tests::test_chart_data_deserialize ... ok
test intent::tests::test_route_keyword_match ... ok
test intent::tests::test_route_pattern_match ... ok
test presentation::types::tests::test_presentation_type_icon ... ok
test intent::tests::test_route_no_match ... ok
test presentation::types::tests::test_quiz_data_deserialize ... ok
test types_v2::tests::test_stage_id ... ok
test state::tests::test_extract_outputs ... ok
test state::tests::test_resolve_input ... ok
test state::tests::test_resolve_step_output ... ok
test state::tests::test_resolve_array_access ... ok
test trigger::tests::test_trigger_parser_quick_match ... ok
test types::tests::test_file_export_with_expression ... ok
test state::tests::test_resolve_loop_context ... ok
test types::tests::test_pipeline_deserialize ... ok
test trigger::tests::test_compile_pattern_wildcard ... ok
test trigger::tests::test_compile_pattern_mixed ... ok
test state::tests::test_resolve_mixed_string ... ok
test trigger::tests::test_compile_pattern_named_capture ... ok
test trigger::tests::test_trigger_param_extraction ... ok
test types_v2::tests::test_pipeline_v2_deserialize ... ok
test result: ok. 59 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
Running unittests src\lib.rs (target\debug\deps\zclaw_protocols-914eb6f2e427bb85.exe)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src\lib.rs (target\debug\deps\zclaw_runtime-7276ff690990eead.exe)
running 42 tests
test compaction::tests::test_compact_messages_under_threshold ... ok
test compaction::tests::test_estimate_messages_tokens ... ok
test compaction::tests::test_estimate_tokens_cjk ... ok
test compaction::tests::test_estimate_tokens_empty ... ok
test compaction::tests::test_extract_topic_long ... ok
test compaction::tests::test_estimate_tokens_english ... ok
test compaction::tests::test_extract_topic_sentence ... ok
test compaction::tests::test_extract_topic_short ... ok
test compaction::tests::test_compact_messages_over_threshold ... ok
test compaction::tests::test_compact_preserves_leading_system ... ok
test compaction::tests::test_generate_summary ... ok
test compaction::tests::test_maybe_compact_under_threshold ... ok
test tool::builtin::path_validator::tests::test_allows_with_explicit_allowed_paths ... ok
test tool::builtin::path_validator::tests::test_allows_with_workspace_root ... ok
test tool::builtin::path_validator::tests::test_default_deny_without_configuration ... ok
test tool::builtin::path_validator::tests::test_denies_outside_workspace ... ok
test tool::builtin::path_validator::tests::test_parse_size ... ok
test tool::builtin::path_validator::tests::test_path_traversal ... ok
test tool::builtin::path_validator::tests::test_blocked_paths ... ok
test growth::tests::test_growth_integration_creation ... ok
test growth::tests::test_disabled_growth ... ok
test growth::tests::test_process_conversation_disabled ... ok
test growth::tests::test_enhance_prompt_empty ... ok
test tool::builtin::shell_exec::tests::test_parse_command_complex ... ok
test tool::builtin::shell_exec::tests::test_parse_command_empty ... ok
test tool::builtin::shell_exec::tests::test_command_allowed ... ok
test tool::builtin::shell_exec::tests::test_parse_command_simple ... ok
test tool::builtin::shell_exec::tests::test_parse_command_with_quotes ... ok
test tool::builtin::shell_exec::tests::test_parse_command_with_single_quotes ... ok
test tool::builtin::shell_exec::tests::test_security_config_default ... ok
test tool::builtin::file_write::tests::test_write_new_file ... ok
test tool::builtin::file_write::tests::test_create_mode_fails_on_existing ... ok
test tool::builtin::path_validator::tests::test_expand_tilde ... ok
test tool::builtin::web_fetch::tests::test_validate_url_length ... ok
test tool::builtin::web_fetch::tests::test_validate_ipv6 ... ok
test tool::builtin::web_fetch::tests::test_validate_blocked_hostnames ... ok
test tool::builtin::web_fetch::tests::test_validate_cloud_metadata ... ok
test tool::builtin::web_fetch::tests::test_validate_localhost ... ok
test tool::builtin::web_fetch::tests::test_validate_scheme ... ok
test tool::builtin::web_fetch::tests::test_validate_private_ips ... ok
test tool::builtin::file_read::tests::test_read_file ... ok
test tool::builtin::file_write::tests::test_overwrite_mode ... ok
test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
Running unittests src\lib.rs (target\debug\deps\zclaw_skills-9c40ca9299fa8d01.exe)
running 23 tests
test orchestration::planner::tests::test_plan_builder ... ok
test orchestration::auto_compose::tests::test_extract_types ... ok
test orchestration::executor::tests::test_node_result_success ... ok
test orchestration::types::tests::test_parse_input_ref ... ok
test orchestration::types::tests::test_parse_literal ... ok
test orchestration::types::tests::test_parse_node_output_ref ... ok
test orchestration::planner::tests::test_planner_plan ... ok
test orchestration::validation::tests::test_detect_no_cycle ... ok
test orchestration::validation::tests::test_find_end_nodes ... ok
test orchestration::validation::tests::test_find_start_nodes ... ok
test orchestration::validation::tests::test_identify_parallel_groups ... ok
test orchestration::validation::tests::test_detect_cycle ... ok
test orchestration::validation::tests::test_topological_sort ... ok
test semantic_router::tests::test_cosine_similarity ... ok
test semantic_router::tests::test_llm_fallback_invoked_when_below_threshold ... ok
test semantic_router::tests::test_no_llm_fallback_returns_best_match ... ok
test semantic_router::tests::test_no_llm_fallback_when_high_confidence ... ok
test semantic_router::tests::test_retrieve_candidates ... ok
test semantic_router::tests::test_basic_routing ... ok
test orchestration::context::tests::test_build_output ... ok
test orchestration::context::tests::test_resolve_node_output_ref ... ok
test orchestration::context::tests::test_resolve_input_ref ... ok
test orchestration::context::tests::test_evaluate_condition_equality ... ok
test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src\lib.rs (target\debug\deps\zclaw_types-0babceb0143df14c.exe)
running 57 tests
test error::tests::test_config_error_display ... ok
test error::tests::test_export_error_display ... ok
test error::tests::test_hand_error_display ... ok
test error::tests::test_invalid_input_display ... ok
test error::tests::test_loop_detected_display ... ok
test error::tests::test_mcp_error_display ... ok
test error::tests::test_internal_error_display ... ok
test error::tests::test_not_found_display ... ok
test error::tests::test_llm_error_display ... ok
test error::tests::test_permission_denied_display ... ok
test error::tests::test_rate_limited_display ... ok
test error::tests::test_tool_error_display ... ok
test hand_run::tests::test_hand_run_id_display ... ok
test error::tests::test_security_error_display ... ok
test error::tests::test_serialization_error_from_json ... ok
test error::tests::test_storage_error_display ... ok
test error::tests::test_timeout_display ... ok
test error::tests::test_result_type_err ... ok
test error::tests::test_result_type_ok ... ok
test hand_run::tests::test_hand_run_id_unique ... ok
test hand_run::tests::test_hand_run_id_from_str ... ok
test hand_run::tests::test_hand_run_serialization ... ok
test id::tests::test_agent_id_display ... ok
test hand_run::tests::test_hand_run_status_roundtrip ... ok
test id::tests::test_agent_id_default ... ok
test id::tests::test_agent_id_from_str_invalid ... ok
test id::tests::test_agent_id_from_str_valid ... ok
test id::tests::test_agent_id_new_creates_unique_ids ... ok
test id::tests::test_agent_id_serialization ... ok
test id::tests::test_run_id_display ... ok
test id::tests::test_run_id_default ... ok
test id::tests::test_run_id_new_creates_unique_ids ... ok
test id::tests::test_session_id_default ... ok
test id::tests::test_session_id_new_creates_unique_ids ... ok
test id::tests::test_skill_id_new ... ok
test id::tests::test_tool_id_display ... ok
test id::tests::test_tool_id_from_string ... ok
test id::tests::test_tool_id_from_str ... ok
test message::tests::test_content_block_image ... ok
test id::tests::test_tool_id_new ... ok
test message::tests::test_content_block_text ... ok
test message::tests::test_content_block_thinking ... ok
test message::tests::test_content_block_tool_result ... ok
test message::tests::test_content_block_tool_use ... ok
test message::tests::test_image_source_base64 ... ok
test message::tests::test_image_source_serialization ... ok
test message::tests::test_image_source_url ... ok
test message::tests::test_message_assistant_creation ... ok
test message::tests::test_message_assistant_with_thinking ... ok
test message::tests::test_message_deserialization_user ... ok
test message::tests::test_message_serialization_assistant ... ok
test message::tests::test_message_serialization_user ... ok
test message::tests::test_message_system_creation ... ok
test message::tests::test_message_tool_result_creation ... ok
test message::tests::test_message_tool_result_error ... ok
test message::tests::test_message_tool_use_creation ... ok
test message::tests::test_message_user_creation ... ok
test result: ok. 57 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests desktop_lib
running 2 tests
test desktop\src-tauri\src\intelligence\validation.rs - intelligence::validation::validate_identifier (line 112) ... ignored
test desktop\src-tauri\src\intelligence\validation.rs - intelligence::validation::validate_string_length (line 173) ... ignored
test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_growth
running 1 test
test crates\zclaw-growth\src\lib.rs - (line 39) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_hands
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_kernel
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_memory
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_pipeline
running 1 test
test crates\zclaw-pipeline\src\intent.rs - intent (line 21) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_protocols
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_runtime
running 1 test
test crates\zclaw-runtime\src\tool\builtin\path_validator.rs - tool::builtin::path_validator (line 20) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_skills
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests zclaw_types
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

View File

@@ -1,478 +0,0 @@
[vite:react-babel] We recommend switching to `@vitejs/plugin-react-oxc` for improved performance. More information at https://vite.dev/rolldown
 RUN  v2.1.9 G:/ZClaw_openfang/desktop
stderr | tests/lib/request-helper.test.ts > request-helper > requestWithRetry > should retry on retryable status codes
[RequestHelper] Request failed (503), retrying in 11ms (attempt 1/2)
✓ tests/lib/crypto-utils.test.ts (10 tests) 69ms
stderr | tests/lib/request-helper.test.ts > request-helper > requestWithRetry > should throw after all retries exhausted
[RequestHelper] Request failed (503), retrying in 12ms (attempt 1/2)
stderr | tests/lib/request-helper.test.ts > request-helper > requestWithRetry > should throw after all retries exhausted
[RequestHelper] Request failed (503), retrying in 22ms (attempt 2/2)
stdout | tests/lib/request-helper.test.ts > request-helper > RequestManager > should cancel all requests
[RequestHelper] Cancelled request: test-1
[RequestHelper] Cancelled request: test-2
[RequestHelper] Cancelled request: test-3
✓ tests/lib/request-helper.test.ts (30 tests | 1 skipped) 101ms
stdout | tests/lib/security.test.ts > Security Utils > sanitizeJson > should return null for invalid JSON
[SecurityUtils] JSON sanitize parse failed {
error: SyntaxError: Unexpected token 'o', "not json" is not valid JSON
at JSON.parse (<anonymous>)
at Module.sanitizeJson (G:\ZClaw_openfang\desktop\src\lib\security-utils.ts:549:25)
at G:\ZClaw_openfang\desktop\tests\lib\security.test.ts:356:28
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11
at runWithTimeout (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:39:7)
at runTest (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1056:17)
 at processTicksAndRejections (node:internal/process/task_queues:104:5)
at runSuite (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1205:15)
at runSuite (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:1205:15)
}
✓ tests/lib/security.test.ts (58 tests) 250ms
stderr | tests/toml-utils.test.ts > tomlUtils > parse > should throw TomlParseError on invalid TOML
[TOML] Parse error: TomlError: Invalid TOML document: incomplete key-value: cannot find end of key
2: [invalid
^
3: key = value
at parseKey (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/struct.js:38:15)
at Object.parse (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/parse.js:104:21)
at Object.parse (G:\ZClaw_openfang\desktop\src\lib\toml-utils.ts:61:19)
at G:\ZClaw_openfang\desktop\tests\toml-utils.test.ts:72:30
at Proxy.<anonymous> (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+expect@2.1.9/node_modules/@vitest/expect/dist/index.js:1530:11)
at Proxy.<anonymous> (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+expect@2.1.9/node_modules/@vitest/expect/dist/index.js:972:17)
at Proxy.methodWrapper (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/chai@5.3.3/node_modules/chai/index.js:1686:25)
at G:\ZClaw_openfang\desktop\tests\toml-utils.test.ts:72:50
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:533:11 {
line: 2,
column: 2,
codeblock: '2: [invalid\n ^\n3: key = value\n'
}
stderr | tests/toml-utils.test.ts > tomlUtils > stringify > should throw TomlStringifyError on invalid data
[TOML] Stringify error: Error: Could not stringify the object: maximum object depth exceeded
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:125:15)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
at stringifyTable (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js:143:46)
stderr | tests/toml-utils.test.ts > tomlUtils > resolveEnvVars > should return empty string for missing env vars
[TOML] Environment variable MISSING_VAR not resolved - no envVars provided
✓ tests/toml-utils.test.ts (14 tests) 22ms
✓ tests/config-parser.test.ts (13 tests) 14ms
stderr | tests/lib/secure-storage.test.ts > secureStorage > error handling > should handle corrupted encrypted data gracefully
[SecureStorage] v2 decryption failed for key: corrupted-key
[SecureStorage] v1 decryption failed for key: corrupted-key
✓ tests/lib/secure-storage.test.ts (11 tests) 258ms
stderr | tests/store/chatStore.test.ts
[IDBStorage] Migration from localStorage failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at migrateFromLocalStorage (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:56:22)
at Object.getItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:98:15)
at Object.getItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:292:33)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:305:20
at hydrate (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:388:53)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:468:5
at createStoreImpl (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/vanilla.mjs:19:32)
at createStore (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/vanilla.mjs:22:53)
[IDBStorage] IndexedDB getItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.getItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:102:26)
 at processTicksAndRejections (node:internal/process/task_queues:104:5)
✓ tests/lib/gateway-security.test.ts (13 tests) 570ms
✓ WebSocket Security > SecurityError > should be throwable with a message 413ms
 tests/stabilization.test.ts (0 test)
stderr | tests/store/chatStore.test.ts > chatStore > setCurrentModel > should update current model
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.setCurrentModel (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:324:39)
at setCurrentModel (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:154:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:269:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > newConversation > should clear messages and reset session
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.newConversation (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:203:5)
at newConversation (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:159:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:289:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > newConversation > should save current messages to conversations before clearing
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.newConversation (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:203:5)
at newConversation (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:159:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:308:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > switchConversation > should switch to existing conversation
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.newConversation (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:203:5)
at newConversation (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:159:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:328:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > deleteConversation > should delete conversation by id
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.newConversation (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:203:5)
at newConversation (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:159:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:360:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > deleteConversation > should clear messages if deleting current conversation
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.deleteConversation (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:244:7)
at deleteConversation (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:173:30)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:397:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > setCurrentAgent > should update current agent
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.setCurrentAgent (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:289:5)
at setCurrentAgent (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:133:52)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:418:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > setCurrentAgent > should save current conversation when switching agents
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.setCurrentAgent (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:252:7)
at setCurrentAgent (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:133:52)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:444:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > syncAgents > should sync agents from profiles
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.syncAgents (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:320:5)
at syncAgents (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:141:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:455:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > syncAgents > should use default agent when no profiles provided
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.syncAgents (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:320:5)
at syncAgents (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:141:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:469:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
stderr | tests/store/chatStore.test.ts > chatStore > conversation persistence > should derive title from first user message
[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
at Module.openDB (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.js:168:21)
at getDB (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:34:17)
at Object.setItem (G:\ZClaw_openfang\desktop\src\lib\idb-storage.ts:117:26)
at Object.setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:298:42)
at setItem (file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:358:20)
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:371:14
at Object.newConversation (G:\ZClaw_openfang\desktop\src\store\chat\conversationStore.ts:203:5)
at newConversation (G:\ZClaw_openfang\desktop\src\store\chatStore.ts:159:37)
at G:\ZClaw_openfang\desktop\tests\store\chatStore.test.ts:645:7
at file:///G:/ZClaw_openfang/desktop/node_modules/.pnpm/@vitest+runner@2.1.9/node_modules/@vitest/runner/dist/index.js:146:14
 tests/store/chatStore.test.ts (36 tests | 10 failed) 36ms
 × chatStore > setCurrentModel > should update current model 7ms
 → expected 'glm-5' to be 'gpt-4' // Object.is equality
 × chatStore > newConversation > should clear messages and reset session 4ms
 → expected 'old-session' to be null
 × chatStore > newConversation > should save current messages to conversations before clearing 1ms
 → expected 0 to be greater than 0
 × chatStore > switchConversation > should switch to existing conversation 1ms
 → Cannot read properties of undefined (reading 'id')
 × chatStore > deleteConversation > should delete conversation by id 1ms
 → Cannot read properties of undefined (reading 'id')
 × chatStore > deleteConversation > should clear messages if deleting current conversation 4ms
 → expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal []
 × chatStore > setCurrentAgent > should update current agent 2ms
 → expected { id: '1', name: 'ZCLAW', …(4) } to deeply equal { id: 'agent-2', …(5) }
 × chatStore > setCurrentAgent > should save current conversation when switching agents 1ms
 → expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal []
 × chatStore > syncAgents > should sync agents from profiles 2ms
 → expected [ { id: '1', name: 'ZCLAW', …(4) } ] to have a length of 2 but got 1
 × chatStore > conversation persistence > should derive title from first user message 1ms
 → Cannot read properties of undefined (reading 'title')
⎯⎯⎯⎯⎯⎯ Failed Suites 1 ⎯⎯⎯⎯⎯⎯⎯
 FAIL  tests/stabilization.test.ts [ tests/stabilization.test.ts ]
TypeError: Cannot read properties of undefined (reading 'hasHydrated')
  Object.onRehydrateStorage src/store/chatStore.ts:265:42
263| 
264|  // If conversationStore already hydrated (fast path), sync imm…
265|  if (useConversationStore.persist.hasHydrated()) {
 |  ^
266|  syncMessages();
267|  return;
  hydrate node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:387:94
  node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:468:5
  createStoreImpl node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/vanilla.mjs:19:32
  createStore node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/vanilla.mjs:22:53
  createImpl node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/react.mjs:15:15
  src/store/chatStore.ts:105:47
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/11]⎯
⎯⎯⎯⎯⎯⎯ Failed Tests 10 ⎯⎯⎯⎯⎯⎯⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > setCurrentModel > should update current model
AssertionError: expected 'glm-5' to be 'gpt-4' // Object.is equality
Expected: "gpt-4"
Received: "glm-5"
  tests/store/chatStore.test.ts:272:34
270| 
271|  const state = useChatStore.getState();
272|  expect(state.currentModel).toBe('gpt-4');
 |  ^
273|  });
274|  });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > newConversation > should clear messages and reset session
AssertionError: expected 'old-session' to be null
- Expected:
null
+ Received:
"old-session"
  tests/store/chatStore.test.ts:293:32
291|  const state = useChatStore.getState();
292|  expect(state.messages).toEqual([]);
293|  expect(state.sessionKey).toBeNull();
 |  ^
294|  expect(state.isStreaming).toBe(false);
295|  expect(state.currentConversationId).toBeNull();
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > newConversation > should save current messages to conversations before clearing
AssertionError: expected 0 to be greater than 0
  tests/store/chatStore.test.ts:312:42
310|  const state = useChatStore.getState();
311|  // Conversation should be saved
312|  expect(state.conversations.length).toBeGreaterThan(0);
 |  ^
313|  expect(state.conversations[0].messages[0].content).toBe('Test me…
314|  });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > switchConversation > should switch to existing conversation
TypeError: Cannot read properties of undefined (reading 'id')
  tests/store/chatStore.test.ts:338:66
336|  });
337| 
338|  const firstConvId = useChatStore.getState().conversations[0].id;
 |  ^
339| 
340|  // Switch back to first conversation
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > deleteConversation > should delete conversation by id
TypeError: Cannot read properties of undefined (reading 'id')
  tests/store/chatStore.test.ts:362:61
360|  newConversation();
361| 
362|  const convId = useChatStore.getState().conversations[0].id;
 |  ^
363|  expect(useChatStore.getState().conversations).toHaveLength(1);
364| 
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > deleteConversation > should clear messages if deleting current conversation
AssertionError: expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal []
- Expected
+ Received
- Array []
+ Array [
+ Object {
+ "content": "Test",
+ "id": "msg-1",
+ "role": "user",
+ "timestamp": 2026-04-05T09:57:37.097Z,
+ },
+ ]
  tests/store/chatStore.test.ts:400:30
398| 
399|  const state = useChatStore.getState();
400|  expect(state.messages).toEqual([]);
 |  ^
401|  expect(state.sessionKey).toBeNull();
402|  expect(state.currentConversationId).toBeNull();
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > setCurrentAgent > should update current agent
AssertionError: expected { id: '1', name: 'ZCLAW', …(4) } to deeply equal { id: 'agent-2', …(5) }
- Expected
+ Received
 Object {
- "color": "bg-blue-500",
- "icon": "A",
- "id": "agent-2",
- "lastMessage": "Hello",
- "name": "New Agent",
+ "color": "bg-gradient-to-br from-orange-500 to-red-500",
+ "icon": "🦞",
+ "id": "1",
+ "lastMessage": "发送消息开始对话",
+ "name": "ZCLAW",
 "time": "",
 }
  tests/store/chatStore.test.ts:421:34
419| 
420|  const state = useChatStore.getState();
421|  expect(state.currentAgent).toEqual(newAgent);
 |  ^
422|  });
423| 
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > setCurrentAgent > should save current conversation when switching agents
AssertionError: expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal []
- Expected
+ Received
- Array []
+ Array [
+ Object {
+ "content": "Test message",
+ "id": "msg-1",
+ "role": "user",
+ "timestamp": 2026-04-05T09:57:37.103Z,
+ },
+ ]
  tests/store/chatStore.test.ts:447:48
445| 
446|  // Messages should be cleared for new agent
447|  expect(useChatStore.getState().messages).toEqual([]);
 |  ^
448|  });
449|  });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > syncAgents > should sync agents from profiles
AssertionError: expected [ { id: '1', name: 'ZCLAW', …(4) } ] to have a length of 2 but got 1
- Expected
+ Received
- 2
+ 1
  tests/store/chatStore.test.ts:461:28
459| 
460|  const state = useChatStore.getState();
461|  expect(state.agents).toHaveLength(2);
 |  ^
462|  expect(state.agents[0].name).toBe('Agent One');
463|  expect(state.agents[1].name).toBe('Agent Two');
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/11]⎯
 FAIL  tests/store/chatStore.test.ts > chatStore > conversation persistence > should derive title from first user message
TypeError: Cannot read properties of undefined (reading 'title')
  tests/store/chatStore.test.ts:648:37
646| 
647|  const state = useChatStore.getState();
648|  expect(state.conversations[0].title).toContain('This is a long m…
 |  ^
649|  expect(state.conversations[0].title.length).toBeLessThanOrEqual(…
650|  });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/11]⎯
 Test Files  2 failed | 7 passed (9)
 Tests  10 failed | 174 passed | 1 skipped (185)
 Start at  17:56:49
 Duration  47.19s (transform 1.84s, setup 57.03s, collect 16.08s, tests 1.32s, environment 222.17s, prepare 10.17s)