Files
zclaw_openfang/docs/features/audit-v12/M4-intelligence-layer.md
iven 442ec0eeef
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
docs(audit): V12 模块化端到端审计报告 — 11 模块 + 总报告
混合矩阵式审计:10 个功能模块 × 五维检查清单
- 项目整体健康度: 76/100
- 2 个 P0 (M4 双数据库 + 反思引擎 LLM 未接入)
- 15 个 P1 (跨 M2/M3/M4/M5/M6/M7/M11)
- 三类断链模式: 写了没接/接了不对/双实现未统一
- 三阶段修复路线图: P0(2-3天) → P1(5-7天) → P2(5-7天)
2026-04-04 17:55:03 +08:00

163 lines
7.8 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.

# 模块 M4 智能层 审计报告
> **审计版本**: V12
> **审计日期**: 2026-04-04
> **审计范围**: 记忆/身份演化/反思引擎/心跳巡检/自主授权/上下文压缩 6 个子模块
---
## 1. 模块概况
### 功能描述
ZCLAW 智能层提供 Agent 的"认知能力":跨会话记忆、人格演化、行为反思、主动巡检、自主决策授权、上下文压缩。
### 涉及文件清单
**前端**
- 记忆: `store/memoryGraphStore.ts`, `lib/intelligence-client/memory.ts`, `components/MemoryPanel.tsx`
- 身份: `lib/intelligence-client/identity.ts`, `components/AgentOnboardingWizard.tsx`
- 反思: `lib/intelligence-client/reflection.ts`, `components/ReflectionLog.tsx`
- 心跳: `lib/intelligence-client/heartbeat.ts`
- 自主: `lib/autonomy-manager.ts`, `components/AutonomyConfig.tsx`
- 压缩: `lib/intelligence-client/fallback-compactor.ts`
**后端 (Rust)**
- Intelligence 引擎: `desktop/src-tauri/src/intelligence/` (memory.rs, identity.rs, reflection.rs, heartbeat.rs, compactor.rs)
- Runtime 中间件: `crates/zclaw-runtime/src/middleware/` (memory.rs, compaction.rs)
- 存储: `crates/zclaw-growth/src/storage/sqlite.rs`
- Kernel 集成: `crates/zclaw-kernel/src/kernel/messaging.rs`
---
## 2. 子模块逐个分析
### 2.1 Agent 记忆
| 检查维度 | 状态 | 详情 |
|---------|------|------|
| 链路完整性 | ⚠️ | **双数据库问题** — 前端 UI 用 `PersistentMemoryStore`(LIKE 搜索)Runtime 中间件用 `SqliteStorage`(FTS5 搜索),两套独立 SQLite |
| 参数一致性 | ⚠️ | 前端 `types?: MemoryType[]`(数组) vs 后端 `memory_type?: string`(单值) |
| 边界处理 | ✅ | 错误传播完整embedding 失败优雅降级 |
| 状态管理 | ⚠️ | 前端手动刷新,无自动同步 |
| 安全 | ⚠️ | 无 content 长度限制,无 importance 范围验证 |
**关键问题 [P0]**: 双数据库导致:
- 用户手动保存的记忆不出现在对话记忆注入中
- Agent 自动提取的记忆不出现在前端记忆面板
- 前端记忆搜索用的是 LIKE 模糊匹配,文档声称的 FTS5 仅在 Runtime 层生效
### 2.2 身份演化
| 检查维度 | 状态 | 详情 |
|---------|------|------|
| 链路完整性 | ✅ | identity_get/propose_change/approve_proposal 全部注册UI 组件完整 |
| 参数一致性 | ✅ | Soul/Instructions 枚举匹配正确 |
| 边界处理 | ✅ | 快照上限 50并发 Mutex 保护 |
| 状态管理 | ✅ | 文件系统持久化(store.json),重启恢复 |
| 安全 | ⚠️ | store.json 无加密proposal_id 可预测 |
**关键问题**: user_profile 注入被注释掉(防止对话泄漏),心跳人格改进不会自动创建 identity proposal。整体功能可用但需手动触发。
### 2.3 反思引擎
| 检查维度 | 状态 | 详情 |
|---------|------|------|
| 链路完整性 | ⚠️ | 命令全部注册,但 **LLM 驱动未接入** |
| 参数一致性 | ✅ | 类型转换正确 |
| 边界处理 | ✅ | LLM 失败回退到规则分析,空记忆列表处理正确 |
| 状态管理 | ✅ | 对话计数器 + 双重触发条件 |
| 安全 | ✅ | 持久化 fire-and-forget 不影响主流程 |
**关键问题 [P0]**: `reflection_reflect` Tauri 命令传入 `driver=None`,即使配置 `use_llm=true` 也只用规则分析。LLM 分析路径从未在 Tauri 桌面端生效。
### 2.4 心跳巡检
| 检查维度 | 状态 | 详情 |
|---------|------|------|
| 链路完整性 | ✅ | 后端引擎完整5 项内置检查) |
| 参数一致性 | ✅ | 安静时间解析正确 |
| 边界处理 | ⚠️ | interval_minutes 无下限验证 |
| 状态管理 | ⚠️ | **不自动启动**,需前端调用 heartbeat_init + heartbeat_start |
| 安全 | ⚠️ | 全局静态状态,所有 agent 共享 |
**关键问题 [P1]**: 心跳引擎完全依赖前端主动初始化和数据同步。`MEMORY_STATS_CACHE``LAST_INTERACTION``CORRECTION_COUNTERS` 三个全局缓存需前端定期调用命令填充,否则心跳检查返回空结果。
### 2.5 自主授权
| 检查维度 | 状态 | 详情 |
|---------|------|------|
| 链路完整性 | ❌ | **纯前端实现**,无后端 Rust 集成 |
| 参数一致性 | ⚠️ | workflow_trigger 映射到 autoCompaction语义不匹配 |
| 边界处理 | ✅ | 高风险操作强制审批,自主模式禁止自我修改 |
| 状态管理 | ✅ | localStorage 持久化,审计日志 100 条上限 |
| 安全 | ❌ | **后端无强制检查**,恶意用户可绕过前端直接调用 Tauri 命令 |
**关键问题 [P1]**: 自主授权仅是前端"咨询层",后端 MemoryMiddleware 等不检查自主授权级别。TOML 的 `requires_approval` 仅在 hand_execute 路径生效,其他操作完全绕过。
### 2.6 上下文压缩
| 检查维度 | 状态 | 详情 |
|---------|------|------|
| 链路完整性 | ✅ | Runtime 中间件自动触发Tauri 命令手动触发 |
| 参数一致性 | ⚠️ | 两套 CompactionConfig 默认值不同 |
| 边界处理 | ✅ | 空消息处理正确LLM 失败回退 |
| 状态管理 | ✅ | 无状态设计,校准因子全局共享 |
| 安全 | ✅ | 校准使用 EMA + clamp合理 |
**关键问题**: Tauri 层和 Runtime 层各有独立的压缩实现代码重复但配置不同。Runtime 层是实际生效路径。
---
## 3. 问题清单
| ID | 描述 | 文件:行号 | 级别 |
|----|------|----------|------|
| M4-01 | **[P0] 双数据库**: PersistentMemoryStore vs SqliteStorage 数据不共享 | `memory/persistent.rs` vs `zclaw-growth/src/storage/sqlite.rs` | **P0** |
| M4-02 | **[P0] 反思引擎 LLM 未接入**: reflection_reflect 传 driver=None | `reflection.rs:759-766` | **P0** |
| M4-03 | **[P1] 心跳不自动启动**: 需前端手动初始化 | `heartbeat.rs` | **P1** |
| M4-04 | **[P1] 自主授权后端无强制**: 仅前端咨询层 | `autonomy-manager.ts` | **P1** |
| M4-05 | 前端记忆搜索用 LIKE 非 FTS5 | `persistent.rs search()` | **P1** |
| M4-06 | 前端 types 数组 vs 后端单值 | `MemorySearchOptions` 类型定义 | **P2** |
| M4-07 | 记忆 content 无长度限制 | `memory_commands` | **P2** |
| M4-08 | tags 参数标注 dead_code 未使用 | `persistent.rs` | **P2** |
| M4-09 | heartbeat interval_minutes 无下限验证 | `heartbeat.rs` | **P2** |
| M4-10 | identity proposal_id 可预测 | `identity.rs rand_id()` | **P2** |
| M4-11 | store.json 无加密 | `identity.rs` | **P2** |
| M4-12 | 自主授权 workflow_trigger 映射错误 | `autonomy-manager.ts:271` | **P2** |
| M4-13 | 两套压缩实现代码重复 | `compactor.rs` vs `compaction.rs` | **P3** |
| M4-14 | heartbeat broadcast subscribe 未被使用 | `heartbeat.rs` | **P3** |
| M4-15 | heartbeat 历史截断 split_off 语义 | `heartbeat.rs` | **P3** |
---
## 4. 改进建议
### 短期修复(按优先级)
1. **[P0]** 统一存储层:合并 PersistentMemoryStore 和 SqliteStorage或让前端搜索也查询 SqliteStorage
2. **[P0]** 在 reflection_reflect Tauri 命令中传入实际 LLM 驱动
3. **[P1]** 自动启动心跳引擎(在 agent_chat_stream 或 Kernel 初始化中)
4. **[P1]** 将自主授权关键检查移到 Rust 后端
### 长期架构建议
- 前端记忆搜索升级为 FTS5
- 移除 Tauri 层的重复压缩实现,统一使用 Runtime 中间件
- identity 持久化改为 SQLite
---
## 5. 健康度评分
| 维度 | 评分 | 说明 |
|------|------|------|
| 链路完整性 | **50/100** | 双数据库是架构级问题LLM/心跳未接入 |
| 参数一致性 | **65/100** | 基本匹配但有多处类型/映射不一致 |
| 边界处理 | **70/100** | 整体较好,缺少输入验证 |
| 状态管理 | **65/100** | 多数子模块缺少自动触发/同步 |
| 安全资源 | **55/100** | 自主授权不强制、store.json 不加密 |
**综合健康度: 61/100**
两个 P0 级问题(双数据库 + 反思 LLM 未接入)是此模块的核心架构缺陷。智能层"写了但没接通"的问题最集中。