重构所有代码和文档中的项目名称,将OpenFang统一更新为ZCLAW。包括: - 配置文件中的项目名称 - 代码注释和文档引用 - 环境变量和路径 - 类型定义和接口名称 - 测试用例和模拟数据 同时优化部分代码结构,移除未使用的模块,并更新相关依赖项。
9.0 KiB
功能审计修复 — 会话交接文档
创建时间: 2026-03-26 审计报告:
plans/piped-wondering-thompson.md旧审计对比:docs/analysis/FEATURE-INTEGRITY-AUDIT.md(含 6 处事实错误,勿参考)
背景
对 ZCLAW 全系统 12 个子系统执行了五步审计(文档对齐→追踪数据流→识别dead_code→检查trait实现→端到端验证),发现 19 处差距、22 处 dead_code、8 项文档不一致。核心问题模式:"写了没接" — 大量代码已实现但从未接入实际运行流程。
修复任务清单(严格按优先级执行)
P0 — 影响核心功能可用性
P0-1: Context Compaction 内核集成
问题: 上下文压缩仅在前端 chatStore.ts 执行,kernel.rs 的 send_message_stream() 不感知压缩,LLM 实际收到完整历史,前端压缩只是视觉隐藏。
差距模式: 双系统不同步
修复路径:
crates/zclaw-kernel/src/kernel.rs— 在send_message_stream()中添加 token 估算 + 阈值检查 + 压缩逻辑- 参考前端实现:
desktop/src/store/chatStore.ts:333-359(checkThreshold+compact) - 参考后端压缩器:
desktop/src-tauri/src/intelligence/compactor.rs(462 行,已有完整实现) - 修复后删除前端
chatStore.ts中的重复压缩调用,改为依赖内核
验证: 发送 20+ 条消息后,检查发给 LLM 的实际 context 长度是否被压缩
P0-2: 文档虚假声称清理
问题: README、CLAUDE.md 中多处状态描述与代码不符
修复清单:
| 文件 | 行/位置 | 当前声称 | 应改为 |
|---|---|---|---|
CLAUDE.md |
项目结构 crates 列表 | zclaw-channels (Telegram, Discord, Slack) |
zclaw-channels (仅 ConsoleChannel 测试适配器) |
CLAUDE.md |
Hands 表格 Lead 行 | ✅ 可用 |
❌ 仅有配置文件,无 Rust 实现 |
CLAUDE.md |
Hands 表格 Predictor 行 | ✅ 可用 |
❌ 仅有配置文件,无 Rust 实现 |
docs/features/README.md |
Hands 统计 | 9 implemented = 82% |
7 fully working, 2 config-only (Lead/Predictor) |
docs/features/README.md |
Lead/Predictor 注册状态 | 标记为已注册 | 标记为未实现 |
docs/features/06-context-compaction.md |
成熟度标签 | L4 Production | L2 (前端仅视觉压缩,内核未集成) |
docs/features/README.md |
删除引用 6 个不存在的文档链接 | 01-vector-memory.md 等 | 删除这些引用 |
验证: rg "Lead|Predictor|Telegram|Discord|Slack" CLAUDE.md 确认已修正
P0-3: Quiz Hand 占位符生成器替换
问题: DefaultQuizGenerator 生成 "Question N about X" / "Option A/B/C/D",正确答案永远是 Option A
修复路径:
crates/zclaw-hands/src/hands/quiz.rs:35-68— 替换DefaultQuizGenerator::generate()实现- 利用已有的
QuizGeneratortrait(同文件),实现 LLM 驱动的生成器 - 参考同类模式:
crates/zclaw-runtime/src/tools/web_fetch.rs中的 LLM 调用方式 - 生成器需要接收 LLM driver 引用(通过
QuizHand::new()或with_generator()传入)
验证: 触发 Quiz Hand,检查生成的题目是否有真实内容和随机正确答案
P1 — 减少技术债务
P1-1: Intelligence 死代码清理
问题: 4 个模块有完整代码但从未被前端调用
清理清单:
| 文件 | 大小 | Tauri 命令数 | 前端调用 | 建议 |
|---|---|---|---|---|
desktop/src-tauri/src/intelligence/mesh.rs |
~300+ 行 | 8 个 | 0 | 删除或移到 #[cfg(feature = "experimental")] |
desktop/src-tauri/src/intelligence/persona_evolver.rs |
~300+ 行 | 7 个 | 0 | 同上 |
desktop/src-tauri/src/intelligence/pattern_detector.rs |
~200+ 行 | 0 | 0 | 删除 |
desktop/src-tauri/src/intelligence/trigger_evaluator.rs |
~500+ 行 | 0 | 0 | 删除 |
注意: recommender.rs 不是死代码(被 mesh.rs 使用),但若 mesh.rs 被移除则 recommender 也变为死代码。
修复步骤:
- 删除上述 4 个文件
- 从
desktop/src-tauri/src/intelligence/mod.rs移除对应pub mod声明 - 从
desktop/src-tauri/src/lib.rsinvoke_handler 移除对应 15 个命令注册(mesh 8 个 + persona_evolver 7 个) - 运行
cargo check确认编译通过
验证: cargo check + rg "mesh_|persona_evolver_|pattern_detector|trigger_evaluator" desktop/src-tauri/src/
P1-2: Heartbeat Engine 整理
问题: Heartbeat 实际完成度 ~75%(App.tsx 启动时调用 init/start,有 tokio 定时循环),但 trigger_evaluator 子模块为死代码
修复路径:
- 若 P1-1 已删除 trigger_evaluator,则 Heartbeat 中对它的引用也需要处理
- 检查
heartbeat.rs中是否有对trigger_evaluator的 import,若有则移除 - 移除
heartbeat.rs的# - 确认
heartbeat_tick中 trigger 评估逻辑降级为简单实现
验证: cargo check + 启动应用确认 heartbeat 仍正常运行
P1-3: Identity 持久化
问题: AgentIdentityManager 使用 InMemory 存储,重启后身份数据丢失
修复路径:
desktop/src-tauri/src/intelligence/identity.rs— 将 InMemory 存储替换为 SQLite- 参考已有的持久化模式:
crates/zclaw-growth/src/storage/sqlite.rs - SOUL.md 内容、人格预设、变更提案历史需要持久化到 SQLite 表
- 启动时从 SQLite 恢复状态
验证: 设置人格后重启应用,检查人格是否保留
P1-4: Channels 文档修正
问题: CLAUDE.md 声称 zclaw-channels 支持 Telegram/Discord/Slack,实际只有 ConsoleChannel
修复路径:
- 已在 P0-2 中覆盖(同一处 CLAUDE.md 修改)
P2 — 改善开发体验
P2-1: KernelConfig::load() 实现
问题: crates/zclaw-kernel/src/config.rs:256-259 的 load() 始终返回 Self::default()
修复路径:
- 实现 TOML 文件读取(项目已依赖
tomlcrate) - 默认路径:
~/.zclaw/config.toml或项目根config/config.toml - 支持
${VAR_NAME}环境变量插值(参考desktop/src/lib/toml-utils.ts) - 保留
from_provider()作为运行时覆盖
验证: 修改 config.toml 中的某个值,重启后端确认生效
P2-2: PPTX/PDF 导出修复或明确禁用
问题: Pipeline 的 ActionRegistry 对 PPTX/PDF 返回 "feature in development" 错误
修复路径(二选一):
- 方案 A: 修复导出 —
crates/zclaw-kernel/src/export/pptx.rs已有实现,检查为什么 Pipeline 层面报错 - 方案 B: 明确禁用 — 从 Pipeline 前端 UI 中隐藏 PPTX/PDF 选项,避免用户触发报错
验证: 在 Pipeline 编辑器中尝试 PPTX 导出
P2-3: Embedding 搜索统一
问题: 向量嵌入仅连接到 Viking 侧车存储,内核原生 MemoryStore 不使用
修复路径:
desktop/src-tauri/src/embedding_adapter.rs已实现 EmbeddingClient trait- 将相同 adapter 注入到
zclaw-growth的SemanticScorer(已有with_embedding()方法) - 在
intelligence_hooks.rs的build_memory_context()中启用嵌入搜索
验证: 配置 embedding provider 后,搜索记忆时确认使用了向量搜索
不在本次修复范围的事项
| 项目 | 原因 |
|---|---|
| 新增 Telegram/Discord/Slack 适配器 | 需求未确认,工作量大于修复 |
| Pipeline 智能路由(01-intelligent-routing.md) | 纯新功能,非修复 |
| WASM/Native 技能执行模式 | 纯新功能 |
| Agent 导入/导出、模板库 | 纯新功能 |
| 生物识别支持 | 纯新功能 |
| 旧报告提到的 6 个 404 API 端点 | ZCLAW 是 Tauri 桌面应用,不走 HTTP API,这些端点不适用 |
验证命令速查
# 编译检查(每次修改后必跑)
cargo check 2>&1 | grep -i "warning\|error"
# TypeScript 类型检查
cd desktop && pnpm tsc --noEmit
# 单元测试
cargo test -p zclaw-growth 2>&1 | tail -5
cd desktop && pnpm vitest run
# 验证文档修正
rg "Lead.*可用|Predictor.*可用|Telegram|Discord|Slack" CLAUDE.md
# 验证死代码清理
rg "mesh_|persona_evolver_|pattern_detector|trigger_evaluator" desktop/src-tauri/src/
# 验证 heartbeat 清理
rg "allow\(dead_code\)" desktop/src-tauri/src/intelligence/heartbeat.rs
关键文件索引
| 文件 | 用途 |
|---|---|
plans/piped-wondering-thompson.md |
完整审计报告(本文档的详细版本) |
crates/zclaw-kernel/src/kernel.rs |
内核,P0-1 修改目标 |
crates/zclaw-hands/src/hands/quiz.rs |
Quiz Hand,P0-3 修改目标 |
desktop/src-tauri/src/intelligence/ |
智能层,P1-1/P1-2 修改目标 |
desktop/src-tauri/src/intelligence/identity.rs |
身份管理,P1-3 修改目标 |
desktop/src-tauri/src/lib.rs:1376-1566 |
Tauri 命令注册表 |
desktop/src-tauri/src/intelligence_hooks.rs |
智能 hooks 集成点 |
crates/zclaw-kernel/src/config.rs:256-259 |
配置加载,P2-1 修改目标 |
CLAUDE.md |
项目文档,P0-2 修改目标 |
docs/features/README.md |
功能索引,P0-2 修改目标 |