Files
zclaw_openfang/wiki/log.md
2026-04-22 21:31:16 +08:00

336 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 Schematool_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) → <evolution-suggestion> 注入
- 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> 改为 MiddlewareChain (Default = 空链)
- 移除 6 处 `use_middleware` 分支 + 2 处 legacy loop_guard inline path
- 移除 loop_guard field + Mutex import + circuit_breaker_triggered 变量
- Kernel create_middleware_chain() 返回非 Optionmessaging.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 barrel25+ 消费者零改动
- `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`
---
> 更新规则: 每次重大变更后追加一条,最新在最上面