--- title: 变更日志 updated: 2026-04-22 status: active tags: [log, history] --- # 变更日志 > Append-only 操作记录。格式: `## [日期] 类型 | 描述` ## [2026-04-22] docs | Wiki 一致性修复 — 数字/格式/重复内容清理 - **index.md**: 数据流图中间件 15→14 层 - **chat.md**: 中间件层引用 15→14 层 - **development.md**: 稳定化约束中间件 15→14 层 - **memory.md**: 删除"前端 Tauri 命令"与"API 接口"重复的 VikingStorage/Intelligence 表(保留 API 接口章节) - **log.md**: 统一所有标题格式为 `## [YYYY-MM-DD] 类型 |`(27行);删除重复的 `# 变更日志` 标题;修正历史条目中"中间件 15层"→"14层";DataMasking 条目补充 Evolution@78 ## [2026-04-22] fix | 跨会话记忆断裂修复 (commit adf0251) - **根因**: 3个断裂点 1. `profile_store`未连接 — `create_middleware_chain()`中GrowthIntegration未设置UserProfileStore, extract_combined()的profile_signals被静默丢弃 2. 双数据库不一致 — UserProfileStore写入data.db, agent_get读取memories.db, 两库隔离导致UserProfile永远读不到 3. 缺少关键日志 — 提取/存储/检索链路无info级别日志 - **修复**: `with_profile_store(memory.pool())` + agent_get改用`kernel.memory()` + Kernel暴露`memory()`方法 + growth.rs增强日志 - **验证**: Tauri端E2E — 会话A提取6记忆+4 profile signals → 新会话B成功注入记忆 → 管家Tab显示用户画像+近期话题+53条记忆 ## [2026-04-22] feat | 管家Tab记忆展示增强 - **变更**: MemorySection.tsx 重写 — L1摘要并行加载 + 按类型分组(偏好/知识/经验/会话) + 用户画像卡片(行业/角色/沟通风格/近期话题) - **数据源**: viking_ls+viking_read(L1) + agent_get(userProfile) ## [2026-04-22] refactor | DataMasking 完全移除 - **变更**: 删除 `data_masking.rs` (367行) + loop_runner unmask 逻辑 + saas-relay-client.ts 前端 mask/unmask - **原因**: 正则过度匹配中文文本(commit 73d50fd 已禁用),NLP方案未排期,彻底移除减少维护负担 - **影响**: 中间件链 15→14 层,loop_runner 简化,SaaS relay 路径不再做前端脱敏 - **中间件链**: `Evolution@78, ButlerRouter@80, Compaction@100, Memory@150, Title@180, SkillIndex@200, DanglingTool@300, ToolError@350, ToolOutputGuard@360, Guardrail@400, LoopGuard@500, SubagentLimit@550, TrajectoryRecorder@650, TokenCalibration@700` ## [2026-04-22] fix | Agent 搜索功能修复 — glm 空参数 + schema 简化 + 排版修复 (commit 5816f56 + 81005c3) **根因**: glm-5.1 不理解 `oneOf`+`const` 复杂 JSON Schema,tool_calls arguments 始终为空 `{}`。 加上 DuckDuckGo 被墙导致搜索引擎选择不正确,以及 stripToolNarration 破坏了 markdown 排版。 **修复 3 项**: 1. `researcher.rs` input_schema 扁平化 + `_fallback_query` 回退 (5816f56) 2. `loop_runner.rs` 空参数检测 → 注入用户消息作为查询 (5816f56) 3. `ChatArea.tsx` stripToolNarration 改为行级过滤,保留 markdown 结构 (81005c3) **影响文件**: `crates/zclaw-hands/src/hands/researcher.rs`, `crates/zclaw-runtime/src/loop_runner.rs`, `desktop/src/components/ChatArea.tsx` **验证**: E2E 搜索 "今日科技新闻" — Baidu + Bing CN 并行返回 10 条结果,LLM 生成排版正确的回复 ## [2026-04-21] fix | Phase 0+1 突破之路 — 8 项基础链路修复 (commit c1dea6e + 9a2611d) **Phase 0 地基修复 (2 项)**: - 经验积累覆盖 bug: store_experience() URI 确定性覆盖 → 合并+累积 reuse_count (experience_store.rs) - Skill 工具调用断裂: PromptOnlySkill 纯文本 → complete_with_tools() 桥接 (skill.rs + runner.rs + adapters.rs) **Phase 1 用户可感知修复 (6 项)**: - Hand 执行前端字段映射: instance_id → runId (kernel-hands.ts + gateway-api.ts) - Heartbeat 痛点感知: PAIN_POINTS_CACHE + VikingStorage 持久化 + 未解决痛点检查 (heartbeat.rs) - Browser Hand 委托消息: pending_execution → delegated_to_frontend + 中文摘要 (browser.rs) - 跨会话记忆检索增强: IdentityRecall 模式 26→54 + 弱身份信号(9个) + 低结果 fallback (query.rs + retriever.rs) - Twitter Hand 凭据持久化: SetCredentials action + 文件持久化 + 启动恢复 (twitter.rs) - Browser 测试适配: 新响应格式断言修复 验证: cargo check 0 error | cargo test 912 PASS | tsc --noEmit 0 error ## [2026-04-21] test | Phase 2 自学习闭环验证 — 进化引擎全链路确认 (commit d95fda3) **审计发现**: 进化引擎管道已完整连接,Phase 0 的 reuse_count 修复是唯一缺失拼图。 - 经验累积 → PatternAggregator(>=3) → EvolutionEngine → EvolutionMiddleware(@78) → 注入 - L2 SkillGenerator + QualityGate 代码完整,标记 @reserved 用于全自动化(后续) - 当前"人在环"模式:检测到可进化模式 → 提示用户确认 → 不自动生成 **6 个集成测试**: 经验累积触发/阈值过滤/多模式独立/SkillGenerator prompt/QualityGate验证/FeedbackCollector计分。全量 918 PASS。 ## [2026-04-21] fix | 穷尽审计后 3 项修复 (browser doc / experience_store warn / identity pattern count) - browser.rs: 过时文档注释 `pending_execution` → `delegated_to_frontend` - experience_store.rs: merge 反序列化失败时添加 `warn!()` 日志 + fallback 覆写 - wiki/log.md: identity_patterns 数量更正 43→54 验证: cargo check 0 error | cargo test 112 PASS (growth+hands) ## [2026-04-20] fix | 50 轮功能链路审计 7 项断链修复 (commit f291736) **审计报告**: `docs/test-evidence/FUNCTIONAL_CHAIN_AUDIT_2026_04_20.md` 通过率 42/50 (84%),发现 2 P0 + 3 P1 + 2 P2 断链。 **P0 修复**: - B-MEM-2 跨会话记忆丢失: IdentityRecall 查询意图 + scope-only 检索 + GrowthIntegration 缓存 - B-HAND-1 Hands 未触发: HandTool wrapper + tool registry 注册 7 个 Hands **P1 修复**: - B-SCHED-4 一次性定时: RE_ONE_SHOT_TODAY 同日触发模式 - B-CHAT-2 工具循环: 连续失败计数器 (3次上限) - B-CHAT-5 Stream 竞态: cancelCooldown 500ms ## [2026-04-19] docs | Wiki 全量深度梳理 — 11 页同步至代码实际状态 - **index.md**: 全面更新关键数字 — Rust 102K行/357文件/987测试、Store 25、组件 102、lib 75、@reserved 97、中间件 14层、SQL 38文件/42表、dead_code 0;新增进化引擎架构说明;修正 Hands 7注册(非9);Pipeline 18模板 - **routing.md**: Store 列表删除 workflowBuilderStore(已不存在)、新增 saas/ 子模块(5文件)拆分;路由决策从4分支修正为5分支+降级;lib/ 计数 76→75 - **hands-skills.md**: Hands 从"9启用"修正为"7注册"(6 TOML + _reminder);新增"已删除 Hands"节(Whiteboard/Slideshow/Speech 空壳清理);HAND.toml 9→6 - **saas.md**: SaaS 模块从"16+distill"修正为精确16目录;SQL迁移从"20文件"修正为"38文件(21up+17down)";CREATE TABLE 从104修正为42 - **known-issues.md**: 代码健康度指标全面更新 — @reserved 89→97、dead_code 16→0、TODO Rust 3→1、Rust测试 684→797 - **memory.md**: 新增进化引擎(EvolutionEngine)完整模块结构(19文件);新增 FeedbackCollector/PatternAggregator/QualityGate/SkillGenerator/WorkflowComposer 描述 - **butler.md**: Intelligence 层从5文件扩展到16文件完整清单;新增 experience/health_snapshot/personality_detector 等 - **pipeline.md**: 模板数从17修正为18;修正模板分布总计公式 - **chat.md**: 中间件层引用 14层(含Evolution@78) - **development.md**: 稳定化约束数字全面更新(Store 25、中间件 14、组件 102);分层职责同步 - **验证方式**: 3路并行代码分析(Rust crates/前端/TRUTH交叉) + 20+ grep/find 命令实际验证 ## [2026-04-19] fix | 穷尽审计修复 — CRITICAL×1 + HIGH×6 + MEDIUM×4 - C1: mark_key_429 设 is_active=FALSE,自动恢复路径可达化 - H1+H2: 重试查询补全日志 + fallthrough 错误信息修正 (RateLimited) - H3+H4+M3+M4+M5: agentStore 提取 classifyAgentError() 类型化错误 + 全 CRUD 统一 - H5+H6: auth.ts 提取 triggerReconnect(),login/TOTP/restore 三路径统一 - M1: toggle_key_active(true) 清除 cooldown_until ## [2026-04-19] fix | 发布前审计 5 项修复 - P0-1: key_pool.rs Provider Key cooldown 过期自动恢复(is_active=false → true) - P0-2: agentStore.ts createClone/createFromTemplate 友好错误信息(502/503/401 分类) - P1-2: auth.ts login 成功后触发 connectionStore.connect() 重新配置 kernel token - P1-3: health_snapshot heartbeat engine 未初始化时返回 pending 快照(不再报错) - P1-1: configStore.ts loadSkillsCatalog 增加延迟重试(最多2次,1.5s/3s 间隔) ## [2026-04-19] chore | sqlx 0.7→0.8 统一 + 测试覆盖补充 - sqlx workspace 0.7→0.8.6 + libsqlite3-sys 0.27→0.30,消除 pgvector 引入的双版本 - 零源码修改,719→797 测试全通过 - zclaw-protocols +43 测试: MCP types serde / transport config / domain roundtrips - zclaw-skills +47 测试: SKILL.md/TOML parsing / auto-classify / PromptOnlySkill / types roundtrips ## [2026-04-18] fix | 审计后续 3 项修复 - Shell Hands 残留清理 3 处 (message.rs 注释/profiler 偏好/handStore mock) - FTS5 CJK 查询修复: sanitize_fts_query 从精确短语改为 token OR 组合 - WASM HTTP 响应大小限制: Content-Length 预检 + 1MB 上限 - zclaw-growth 集成测试 2/2 修复, 全量 651 测试 0 失败 ## [2026-04-18] fix | 深度审计修复 — WASM 安全 + 编译路径 - CRITICAL: zclaw_file_read 路径遍历修复 (组件级过滤) - CRITICAL: zclaw_http_fetch SSRF 防护 (scheme 白名单 + 私有 IP 阻止) - CRITICAL: A2A 始终编译 (移除 zclaw-protocols a2a feature gate) - MEDIUM: FactCategory cfg(test) 导入修复 - 移除 kernel/desktop multi-agent feature (不再控制任何代码) - 563 测试全通过 ## [2026-04-17] refactor | Phase 4A multi-agent feature gate 移除 - 8 个文件移除 33 处 `#[cfg(feature = "multi-agent")]` - zclaw-kernel default features 新增 multi-agent,始终编译 - A2A router、agents、adapters 代码不再条件编译 ## [2026-04-17] feat | Phase 4B WASM host 函数真实实现 - zclaw_log: 读取 guest 内存字符串 + debug! 日志 - zclaw_http_fetch: ureq v3 同步 GET (10s timeout, network_allowed 守卫) - zclaw_file_read: 沙箱 /workspace 读取 + 路径校验防逃逸 - 新增 ureq v3 workspace 依赖 (wasm feature gated) - 25 测试全通过,workspace check 零错误 ## [2026-04-17] refactor | Phase 3A loop_runner 双路径合并 - middleware_chain 从 Option 改为 MiddlewareChain (Default = 空链) - 移除 6 处 `use_middleware` 分支 + 2 处 legacy loop_guard inline path - 移除 loop_guard field + Mutex import + circuit_breaker_triggered 变量 - Kernel create_middleware_chain() 返回非 Option,messaging.rs 调用简化 - 1154→1023 行,净减 131 行;`cargo check --workspace` ✓ | `cargo test` ✓ ## [2026-04-17] refactor | Phase 2A Pipeline→Kernel 解耦 - Pipeline 代码中无任何 `zclaw_kernel` 引用,`Cargo.toml` 中的依赖是空壳 - 移除后 `cargo check --workspace --exclude zclaw-saas` ✓ - 依赖图简化: Pipeline 不再拉入 Kernel 及其传递依赖 ## [2026-04-17] refactor | Phase 2B saasStore 拆分为子模块 - 1025行单文件 → 5个子模块 + barrel re-export - saas/types.ts(103行) + shared.ts(93行) + auth.ts(362行) + billing.ts(84行) + index.ts(309行) - saasStore.ts 缩减为 15行 re-export barrel,25+ 消费者零改动 - `tsc --noEmit` ✓ ## [2026-04-17] refactor | Phase 5 移除空壳 Hand — Whiteboard/Slideshow/Speech - **Rust**: 删除 whiteboard.rs(422行) + slideshow.rs(797行) + speech.rs(442行) - **前端**: 删除 WhiteboardCanvas + SlideshowRenderer + speech-synth + 类型/常量 - **配置**: 删除 3 个 HAND.toml - Hands 9→6 启用 (Browser/Collector/Researcher/Clip/Twitter/Quiz + Reminder系统内部) - 净减 ~5400 行,`cargo check` ✓ | `tsc --noEmit` ✓ ## [2026-04-17] feat | Phase 1 错误体系重构 — ErrorKind + code + Serialize - **Rust**: `zclaw-types/error.rs` 新增 `ErrorKind` (17种) + `error_codes` (E4040-E5110) - ZclawError 新增 `kind()` / `code()` 方法 + `Serialize` impl (零破坏性) - 12 个新测试: kind 映射 + code 稳定性 + JSON 序列化 - **前端**: `error-types.ts` 新增 `RustErrorKind` / `RustErrorDetail` / `tryParseRustError()` - `classifyError()` 优先解析结构化错误 → 17 种中文标题映射 ## [2026-04-17] fix | Phase 0 阻碍项修复 — 流式事件/CI/中文化 - **BLK-2**: loop_runner.rs 22 处 `let _ = tx.send()` 替换为 `if let Err(e) { tracing::warn!(...) }`,修复流式事件静默丢失 - **BLK-5**: 50+ 英文字符串翻译为中文 (HandApprovalModal/ChatArea/AuditLogsPanel 等 7 组件) - **BLK-6**: CI/Release workflow 添加 `--exclude zclaw-saas`,无 DB 时 CI 绿灯 - **验证**: `cargo check --workspace --exclude zclaw-saas` ✓ | `tsc --noEmit` ✓ ## [2026-04-17] fix | M4 Admin 权限守卫 + L1 文档同步 - **BUG-M4**: 新增 `admin_guard_middleware` (auth/mod.rs),在中间件层拦截非 admin 请求 - `billing::admin_routes()` 和 `account::admin_routes()` 挂载时加 guard layer - 非_admin 用户访问 admin 端点统一返回 403 (无论 body 是否合法) - `account/mod.rs` 拆分 `admin_routes()` (dashboard 端点独立) - **BUG-L1**: 字段名已在代码中统一为 `pain_seed_categories`,同步 wiki/butler.md/log.md 文档 ## [2026-04-17] test | 回归验证 — 13/13 PASS,全部 04-17 bug 修复确认 - Phase 1: 6 项 bug 修复回归 (H1/H2/M1/M2/M3/M5) 全部 PASS - Phase 2: Pipeline (list/create/run) + Skill (75 + route_intent) 全部 PASS - Phase 3: Kernel init + chat_stream + health_snapshot 全部 PASS - BUG-L2 Pipeline 反序列化已验证修复 - 记忆系统健康: 381 条记忆, 12 agent, FTS5+TF-IDF 工作正常 - 详见 [[known-issues#04-17 回归验证]] ## [2026-04-17] test | 全系统功能 E2E 测试 — 129 链路覆盖 - 129 条链路全量测试 (Tauri MCP + Chrome DevTools MCP + HTTP API) - 82 PASS / 20 PARTIAL / 1 FAIL / 26 SKIP,有效通过率 79.1% - **0 CRITICAL** 失败,核心聊天链路完整闭环 - 新发现 2 HIGH + 5 MEDIUM + 2 LOW bug - SaaS API 覆盖率 ~78% (50/64 端点已测试) - 完整报告: `docs/test-evidence/2026-04-17/E2E_TEST_REPORT_2026_04_17.md` - 详见 [[known-issues]] ## [2026-04-17] fix | 7 项 E2E Bug 修复 — Dashboard 404 / 记忆去重 / 记忆注入 / invoice_id / Prompt 版本 - **fix(admin)**: Dashboard 404 — 路由注册修复 - **fix(memory)**: viking_add 记忆去重 — URI+content 双重校验 - **fix(memory)**: 跨会话记忆注入修复 — FTS5→注入环节断裂修复 - **fix(billing)**: invoice_id 暴露给用户端 - **fix(prompt)**: 版本号自增修复 - **fix(memory)**: viking_find agent 隔离 - **fix(industry)**: API 字段名统一 (pain_seeds → pain_seed_categories) - commit: a504a40 ## [2026-04-16] fix | Agent 面板信息不随对话更新 — 事件时序 + clones 刷新 - **fix(desktop)**: Agent 面板信息不随对话更新 — 事件时序 + clones 刷新 - commit: 1309101 ## [2026-04-16] fix | 3 项 P0 安全/功能修复 + TRUTH.md 数字校准 - **fix(saas)**: 3 项 P0 修复 (详见 [[known-issues]]) - TRUTH.md 数字同步更新 - commit: 0d79993 ## [2026-04-16] fix | 5 项 E2E 测试 Bug 修复 - Agent 502 / 错误持久化 / 模型标记 / 侧面板 / 记忆页 - commit: a0d1392 ## [2026-04-16] fix | useButlerInsights 使用 resolvedAgentId 查询痛点/方案 - commit: 7db9eb2 ## [2026-04-16] fix | Heartbeat 参数名 + Relay 解密自愈 + 设置清理 - **fix(heartbeat)**: Tauri invoke 参数名修正 snake_case → camelCase (`f6c5dd2`) - intelligence-client.ts 3 处 invoke 调用: agentId/taskCount/totalEntries 等 - 教训: Tauri 2.x 默认 rename_all=camelCase - **fix(relay)**: API Key 解密失败自愈 — 启动迁移 + 容错跳过 (`b69dc61`) - key_pool: 解密失败 skip 到下一个 key (不再 500) - key_pool: heal_provider_keys() 启动自愈迁移 - **chore(settings)**: 删除用量统计和积分详情页面 (`7dea456`) - 与"订阅与计费"功能重复,-240 行 ## [2026-04-15] feat | Heartbeat 统一健康系统 - **feat(runtime)**: health_snapshot.rs — 统一健康快照收集器 (LLM连接/记忆/会话/系统资源) - **feat(runtime)**: heartbeat.rs 重构 — HeartbeatManager + HealthSnapshot 集成 - **feat(desktop)**: HealthPanel.tsx — 桌面端健康状态面板组件 - **chore(desktop)**: 删除 intelligence-client/ 目录 9 个废弃文件 - **docs**: TRUTH.md + wiki 数字同步 (Tauri 183命令, React 105组件, lib 76文件, intelligence 16文件) - 验证: cargo check 0 error, tsc 0 error ## [2026-04-15] fix | 聊天定时功能断链接通 — NlScheduleParser + _reminder Hand - **fix(runtime)**: NlScheduleParser 接入 chat.rs — has_schedule_intent() 意图检测 + parse_nl_schedule() cron 解析 - **fix(hands)**: 新增 _reminder 系统内部 Hand — 定时触发器桥接 - **fix(kernel)**: TriggerManager hand_id 验证放宽 — `_` 前缀系统 Hand 免验证 - **fix(desktop)**: agent_chat_stream 定时拦截 — 确认消息通过 LoopEvent::Delta 流式返回 - **docs(wiki)**: hands-skills.md 新增定时提醒链路说明 - 验证: cargo check 0 error, 49 tests passed, Tauri MCP 实操验证 "每天早上9点提醒我查房" → cron `0 9 * * *` 确认消息正确显示 ## [2026-04-15] fix | 发布前冲刺 Day1 — 5项修复 + 2项标注 + 文档同步 - **fix(saas)**: SSE 用量统计一致性 — 回写 usage_records 真实 token + 消除 relay_requests 双重计数 - **fix(saas)**: relay_tasks 超时自动清理 — 每5分钟扫描 processing>10min 标记 failed - **fix(desktop)**: 模型自动路由 — 首次登录自动选择第一个可用模型 (saasStore + connectionStore) - **chore**: Cargo warnings 清零 — 39→0 (仅剩 sqlx-postgres 外部依赖) - **chore**: Tauri 命令 @reserved 全量标注 — 89个 (孤儿命令 0) - **docs**: TRUTH.md 数字更新 (Tauri 182命令、95 invoke、89 @reserved、0 孤儿) - 验证: tsc 0错误、vitest 344通过、cargo check 0 warning、pnpm build 成功 ## [2026-04-15] fix | 三端联调 V2 — SSE Token 捕获修复 + 调试环境文档 - **fix(saas)**: SseUsageCapture 增加 `stream_done` 标志,修复 SSE 路径 Token 始终为 0 的根因 - **fix(saas)**: `parse_sse_line` 兼容 `data:` 和 `data: ` 两种前缀 + `total_tokens` 兜底 - **docs(wiki)**: development.md 新增完整调试环境信息(Windows 环境要求/数据库/端口/账号/启动顺序) - **docs(wiki)**: known-issues.md 新增 V2 联调测试结果(17 项通过 + 3 项待处理) - 验证方式: Chrome DevTools MCP + Tauri MCP 实际界面操作 ## [2026-04-14] docs | Wiki 全量更新 — 2026-04-14 代码验证驱动 - 全部 12 个 wiki 页面基于最新代码扫描验证更新 - 关键数字修正: Rust 77K行(274 .rs)、Tauri 189命令、SaaS 137 routes、Admin 17页、SaaS 16模块 - known-issues: V13-GAP 全部标记已修复 + 三端联调测试结果 - middleware: 14层 runtime + 10层 SaaS HTTP 完整清单 - saas: 16模块(含industry)、20迁移/42表、137 routes - routing: SaaS降级流程、Store含industryStore、lib/85文件 - chat: 14层中间件经过 - butler: 行业配置接入ButlerPanel - development: Admin 17页、SaaS 137 routes - log: 链接三端联调测试报告 ## [2026-04-14] fix | 三端联调测试 2 P0 + 6 P1 修复 - P0: SaaS 模型选择残留模型 ID → 模型可用性前置校验 - P1: API 密钥页崩溃 / 桌面端 401 恢复 / 用量统计全零 / 行业选择 500 / 管理员订阅 500 / SaaS 启动崩溃 - 完整报告: `docs/INTEGRATION_TEST_REPORT_20260414_V2.md` --- > 更新规则: 每次重大变更后追加一条,最新在最上面