Files
zclaw_openfang/docs/features/COMPREHENSIVE_AUDIT_V9.md
iven 8b9d506893 refactor(saas): 架构重构 + 性能优化 — 借鉴 loco-rs 模式
Phase 0: 知识库
- docs/knowledge-base/loco-rs-patterns.md — loco-rs 10 个可借鉴模式研究

Phase 1: 数据层重构
- crates/zclaw-saas/src/models/ — 15 个 FromRow 类型化模型
- Login 3 次查询合并为 1 次 AccountLoginRow 查询
- 所有 service 文件从元组解构迁移到 FromRow 结构体

Phase 2: Worker + Scheduler 系统
- crates/zclaw-saas/src/workers/ — Worker trait + 5 个具体实现
- crates/zclaw-saas/src/scheduler.rs — TOML 声明式调度器
- crates/zclaw-saas/src/tasks/ — CLI 任务系统

Phase 3: 性能修复
- Relay N+1 查询 → 精准 SQL (relay/handlers.rs)
- Config RwLock → AtomicU32 无锁 rate limit (state.rs, middleware.rs)
- SSE std::sync::Mutex → tokio::sync::Mutex (relay/service.rs)
- /auth/refresh 阻塞清理 → Scheduler 定期执行

Phase 4: 多环境配置
- config/saas-{development,production,test}.toml
- ZCLAW_ENV 环境选择 + ZCLAW_SAAS_CONFIG 精确覆盖
- scheduler 配置集成到 TOML
2026-03-29 19:21:48 +08:00

308 lines
15 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.

# ZCLAW 全面系统审计报告 V9
> **审计日期**: 2026-03-29
> **审计范围**: 全量四端审计 — SaaS 后端 + Tauri 桌面端 + Admin 管理后台 + Rust Crates
> **审计方法**: V8 基线重验证 + 五步审计流程 + 十项通用检查 + 五种差距模式 + 安全专项
> **前次审计**: V8 (2026-03-29, 发现 12 差距 + 5 安全)
> **本次审计**: 8 Agent 并行执行,覆盖 11 crate / 130+ Tauri 命令 / 76+ API 端点 / 55+ 组件
---
## 一、执行摘要
| 指标 | V8 数值 | V9 数值 | 变化 |
|------|---------|---------|------|
| **SaaS API 端点** | 76+ | 76+ | 不变 |
| **Tauri 命令** | 150+ | **130** | 修正 (文档从 58+ 修正) |
| **Admin 页面** | 12 | 12 | 不变 |
| **文档-代码对齐率** | ~95% | ~95% | 不变 |
| **数据流连通率** | 60% (3/5) | **65%** (4/6 部分连通, 1 断裂) | 提升 |
| **Dead Code** | 28+ `#[allow(dead_code)]` | **18** (desktop) + 13 (crates) | 减少 |
| **安全漏洞** | 1 CRITICAL + 2 HIGH | **1 HIGH** + 2 MEDIUM | 改善 (CRITICAL 已修复) |
| **差距模式** | 12 个 | **16 个** (新增 4, 修复 8, 保留 4) | 净增 4 |
| **整体完成度** | ~82% | **~83%** | 微升 |
### V8 修复确认
| V8_ID | 描述 | V8级别 | V9状态 |
|-------|------|--------|--------|
| SEC-01 | agent_template SQL 注入 | CRITICAL | **FIXED** — 已改用 $N 参数化查询 |
| SEC-02 | prompt/service.rs SQL 注入 | HIGH | **STILL_PRESENT** — 行 94/97/100 仍用 format!() |
| SEC-03 | config sync 缺权限 | HIGH | **FIXED** — check_permission 已到位 |
| G-01 | 遥测零调用 | P0 | **FIXED** — llm-service.ts 已调用 |
| G-02 | startPromptOTASync 未调用 | P1 | **FIXED** — saasStore.ts 多处调用 |
| G-03 | relay 队列未消费 | P1 | **PARTIALLY_FIXED** — 队列容量已检查per-provider 并发未实现 |
| G-04 | 心跳不传 OS/version | P1 | **FIXED** — 已传 platform + app_version |
| G-05 | config diff/sync 未调用 | P1 | **FIXED** — 双向同步已实现 |
| G-06 | telemetry 不写 operation_logs | P2 | **FIXED** — 已调用 log_operation |
| G-07 | account_api_keys 被 relay 绕过 | P2 | **STILL_PRESENT** — relay 使用独立 key_pool |
| G-08 | Desktop 401 不 logout | P2 | **FIXED** — token 刷新失败时清理会话 |
| G-09 | 心跳不写 operation_logs | P2 | **STILL_PRESENT** — 高频操作合理 |
| G-10 | hand_run 桩命令 | P3 | **FALSE_POSITIVE** — 有真实实现 |
| G-12 | 双端错误类型不统一 | P3 | **STILL_PRESENT** — SaaSApiError vs ApiRequestError |
**修复率**: 8/12 FIXED + 1 PARTIALLY_FIXED + 1 FALSE_POSITIVE + 2 STILL_PRESENT = **75% 修复率**
---
## 二、功能清单与完成度矩阵
### 2.1 架构层
| 功能 | 设计目标 | 完成度 | 关键发现 |
|------|---------|--------|---------|
| 通信层 | 三模式连接 (Kernel/Gateway/SaaS) | **90%** | 完整130 个 Tauri 命令 vs 文档声称 58+ |
| 状态管理 | 18+ Zustand Store | **80%** | audit-logger.ts 无消费者 |
| 安全认证 | Ed25519+JWT+TOTP | **85%** | SSRF 防护全面relay 输入验证可加强 |
### 2.2 核心功能
| 功能 | 设计目标 | 完成度 | 关键发现 |
|------|---------|--------|---------|
| 聊天界面 | 流式响应+多模型 | **92%** | 完整链路通畅 |
| Agent 分身 | CRUD+模板+切换 | **85%** | 导入/导出未实现 |
| Hands 系统 | 9+ 自主能力 | **70%** | Predictor/Lead 无代码;审批后不自动执行 |
### 2.3 智能层
| 功能 | 设计目标 | 完成度 | V9 修正 | 关键发现 |
|------|---------|--------|---------|---------|
| Agent 记忆 | 跨会话+语义搜索 | **90%** | - | 检索可用,但自动提取链路断裂 |
| 身份演化 | SOUL.md+自动改进 | **90%** | ↑ (文档称 70%) | persona_evolver 等 4 个模块已删除但功能完整 |
| 反思引擎 | 自动分析+建议 | **85%** | ↑ (文档称 65%) | LLM 集成完整VikingStorage 持久化 |
| 心跳巡检 | 定期巡检+提醒 | **90%** | ↑ (文档称 70%) | 894 行完整实现10 个 Tauri 命令 |
| 自主授权 | 三级授权+审批 | **75%** | - | 审批通过后不自动执行 (设计缺陷) |
| 上下文压缩 | 智能摘要 | **90%** | ↑ (文档称 75%) | 规则+LLM 摘要均已实现 |
### 2.4 平台层
| 功能 | 设计目标 | 完成度 | 关键发现 |
|------|---------|--------|---------|
| 技能系统 | 70 SKILL.md | **80%** | WASM/Native 未实现 |
| 智能路由 | 语义匹配 | **50%** | SemanticSkillRouter 核心未实现 |
| Pipeline DSL | YAML 工作流 | **87%** | pipeline-complete 事件未监听 |
| SaaS 平台 | 云端能力 | **88%** | prompt SQL 注入;类型不一致 |
### 2.5 智能层评分汇总
| 模块 | 评分 | 说明 |
|------|------|------|
| zclaw-growth | **63%** | 架构设计优秀,但 3 个关键组件生产中未使用 |
| intelligence/ | **78%** | 功能完整度好 |
| zclaw-pipeline | **87%** | 实现质量高 |
| zclaw-memory | **78%** | CRUD 完整,测试充分 |
| **整体** | **~83%** | 记忆闭环未接通是最大差距 |
---
## 三、关键发现
### 3.1 安全发现
| ID | 严重度 | 组件 | 描述 | 证据 |
|----|--------|------|------|------|
| SEC-V9-01 | **HIGH** | prompt/service.rs | SQL 注入3 处 format!() 字符串拼接 (category, source, status) | 行 94, 97, 100 |
| SEC-V9-02 | MEDIUM | relay/handlers.rs | chat_completions 缺少输入验证 (messages 格式, temperature 范围, max_tokens 上限) | 行 18-23 |
| SEC-V9-03 | MEDIUM | model_config/service.rs | query.bind(format!("{}", p)) 类型强制转换 | 行 134 |
### 3.2 功能断裂
| ID | 严重度 | 组件 | 描述 | 证据 |
|----|--------|------|------|------|
| BREAK-01 | **CRITICAL** | zclaw-growth | LlmDriverForExtraction 无生产实现 — 对话不会自动产生记忆 | extractor.rs trait |
| BREAK-02 | **CRITICAL** | intelligence_hooks | 记忆提取流程未接入 post_conversation_hook | GrowthIntegration::process_conversation 未被调用 |
| BREAK-03 | HIGH | kernel_commands | 审批通过后不自动执行 Hand — approval_respond 只更新状态 | kernel_commands.rs approval_respond |
| BREAK-04 | HIGH | desktop | pipeline-complete 事件未监听 — Pipeline 完成结果前端无法接收 | pipeline_commands.rs:480 emit 无对应 listen |
### 3.3 Dead Code
| ID | 严重度 | 位置 | 描述 |
|----|--------|------|------|
| DEAD-01 | HIGH | zclaw-growth/injector.rs | PromptInjector 全文件死代码 (4 种格式, token 预算控制) |
| DEAD-02 | HIGH | zclaw-growth/retriever.rs | MemoryRetriever 全文件死代码 (QueryAnalyzer + MemoryCache) |
| DEAD-03 | MEDIUM | zclaw-growth/tracker.rs | GrowthTracker 全文件死代码 |
| DEAD-04 | MEDIUM | zclaw-kernel/director.rs | 907 行,零生产调用者 |
| DEAD-05 | MEDIUM | desktop/saas-client.ts | 39 个方法从未被调用 (Admin-only API) |
| DEAD-06 | LOW | desktop/audit-logger.ts | 无任何消费者 |
| DEAD-07 | LOW | intelligence/validation.rs | 全文件保留为 "future API" |
### 3.4 文档过时
| ID | 严重度 | 文档 | 描述 |
|----|--------|------|------|
| DOC-01 | HIGH | 06-tauri-backend | 声称 58+ 命令,实际 130 |
| DOC-02 | HIGH | 02-intelligence-layer | 6 个文档引用已删除模块 (persona_evolver 等) |
| DOC-03 | MEDIUM | 00-agent-memory | 声称 90% 但未说明提取链路断裂 |
| DOC-04 | MEDIUM | 03-openviking | 描述外部服务器,实际为内部 SqliteStorage |
| DOC-05 | LOW | README.md | SKILL.md 数量 69 → 实际 70 |
---
## 四、十项通用检查结果
| # | 检查项 | 判定 | 关键发现 |
|---|--------|------|---------|
| 1 | 代码存在性 | **PASS** | 11 crate 全部确认SKILL 70 vs 文档 69 |
| 2 | 调用链连通性 | **PASS** | SaaS handler 100% 连通 |
| 3 | 配置参数完整性 | **WARN** | batch_window_ms / max_concurrent_per_provider / burst 未消费 |
| 4 | 降级策略 | **PASS** | 3 种连接模式 + 心跳降级 + 离线队列 |
| 5 | 错误处理 | **PASS** | 16 种 SaaS 错误 + 10 种前端分类 + 401 自动登出 |
| 6 | 日志完整性 | **WARN** | auth/refresh 缺日志;前端 audit-logger 无消费者 |
| 7 | 性能监控 | **PASS** | 全 list 端点分页Dashboard 2 查询聚合 |
| 8 | 安全控制 | **PASS** | SSRF 全面防护relay 输入验证可加强 |
| 9 | 兼容性 | **PASS** | Rust edition 统一TS strictTauri 2.x |
| 10 | 文档-代码同步 | **WARN** | Hands 数量不一致Tauri 命令数严重低估 |
**总计: 7 PASS / 3 WARN / 0 FAIL**
---
## 五、五种差距模式实例
### 模式 1: "写了没接" (代码存在但未被调用)
| 项目 | 位置 | 影响 |
|------|------|------|
| 39 个 saas-client.ts 方法 | desktop/src/lib/saas-client.ts | Admin-only API 暴露在桌面端 |
| ~45 个 Tauri 命令 | desktop/src-tauri/src/lib.rs | 注册但前端未 invoke |
| PromptInjector (全文件) | zclaw-growth/injector.rs | 设计完善的 token 预算控制完全未用 |
| MemoryRetriever (全文件) | zclaw-growth/retriever.rs | QueryAnalyzer + MemoryCache 未用 |
| GrowthTracker (全文件) | zclaw-growth/tracker.rs | 成长指标追踪未用 |
| director.rs (907 行) | zclaw-kernel/director.rs | 多 Agent 编排零生产调用 |
| 7 个 SaaS 端点 | crates/zclaw-saas/src/ | 无 Admin 页面调用 |
### 模式 2: "接了没传"
| 项目 | 位置 | 说明 |
|------|------|------|
| 心跳 OS 版本 | saas-client.ts:763 | 传 navigator.platform 而非真实 OS 版本 |
| Relay 优先级 | relay/handlers.rs | 客户端无法指定 priority |
| 智能记忆 scope | intelligence-client.ts | find() 回退模式忽略 scope 参数 |
### 模式 3: "传了没存"
| 项目 | 位置 | 说明 |
|------|------|------|
| account_api_keys | relay/key_pool.rs | 用户 API 密钥存储但 relay 从未读取 |
### 模式 4: "存了没用"
| 项目 | 位置 | 说明 |
|------|------|------|
| operation_logs | admin/src/app/ | 无专门查看页面 |
| config_sync_logs | admin/src/app/ | 无 Admin 页面 |
| account_api_keys | relay/key_pool.rs | relay 使用独立 provider_keys |
| relay_tasks 统计 | admin/src/app/ | 无聚合分析页面 |
| devices 表 | admin/src/app/ | 无设备管理页面 |
### 模式 5: "双系统不同步"
| 项目 | Desktop | Admin | 差异 |
|------|---------|-------|------|
| OperationLog | details: Record<string, unknown> | details?: string | 类型不匹配 |
| AccountPublic | role: string | role: union type | 类型严格度不同 |
| LoginResponse | 无 refresh_token | 无 refresh_token | 两端都缺 (后端返回) |
| ProviderInfo | api_protocol: string | api_protocol: union | 枚举 vs 字符串 |
| Token 刷新 | clearSaaSSession 回退 | window.location 跳转 | 策略不同 |
| RelayTaskInfo | error: string \| null | error?: string | nullable vs optional |
---
## 六、修复计划 (按优先级)
### P0: 阻断级 (安全漏洞)
| # | 问题 | 修复方案 | 工作量 |
|---|------|---------|--------|
| 1 | SEC-V9-01: prompt/service.rs SQL 注入 | 将 format!() 字符串拼接改为 $N 参数化查询 (参考 agent_template 修复模式) | 1h |
### P1: 严重级 (功能断裂)
| # | 问题 | 修复方案 | 工作量 |
|---|------|---------|--------|
| 2 | BREAK-01: LlmDriverForExtraction 无实现 | 在 Tauri 层创建 TauriExtractionDriver impl LlmDriverForExtraction | 4h |
| 3 | BREAK-02: 记忆提取未接入 post_hook | 将 GrowthIntegration::process_conversation() 接入 post_conversation_hook | 2h |
| 4 | BREAK-03: 审批后不自动执行 | 在 approval_respond 中approved=true 时自动触发对应 Hand 执行 | 3h |
| 5 | BREAK-04: pipeline-complete 未监听 | 在 workflowStore 或 pipeline-client 中添加 listen('pipeline-complete') | 1h |
### P2: 高优先级 (质量改进)
| # | 问题 | 修复方案 | 工作量 |
|---|------|---------|--------|
| 6 | DEAD-01/02/03: Growth 死代码 | 评估是否接入或清理 PromptInjector/MemoryRetriever/GrowthTracker | 8h |
| 7 | DEAD-05: 39 个未调用 saas-client 方法 | 评估是否需要桌面端 Admin 功能入口或移除方法 | 2h |
| 8 | DOC-01/02: 文档严重过时 | 更新 Tauri 命令数 (130)、智能层模块状态 | 3h |
| 9 | 类型不一致 (6 组) | 统一 Desktop 和 Admin 类型定义 | 4h |
| 10 | G-07: account_api_keys 被 relay 绕过 | 决策:统一 key 管理或标记 account_api_keys 为独立功能 | 3h |
### P3: 中优先级 (技术债务)
| # | 问题 | 修复方案 | 工作量 |
|---|------|---------|--------|
| 11 | 配置参数孤儿 (batch_window_ms 等) | 实现消费或移除配置项 | 2h |
| 12 | relay 输入验证加强 | 添加 messages 数组、temperature、max_tokens 基本校验 | 2h |
| 13 | 前端 audit-logger 集成 | 在 Hand 触发、Agent CRUD 中调用 auditLogger | 2h |
| 14 | DEAD-04: director.rs 907 行孤立 | 移至 feature flag 后面或文档标注为未来功能 | 1h |
| 15 | config_sync_logs Admin 页面 | 添加 Admin 同步日志查看页面 | 3h |
| 16 | operation_logs Admin 页面 | 添加 Admin 操作日志查看页面 | 2h |
### P4: 低优先级 (可选改进)
| # | 问题 | 修复方案 | 工作量 |
|---|------|---------|--------|
| 17 | SKILL.md 数量更新 (69→70) | 更新 README.md | 5min |
| 18 | Hands 数量统一 (CLAUDE.md vs README) | 统一口径 | 5min |
| 19 | zclaw-channels 评估 | 决定保留或删除近乎空的 crate | 1h |
| 20 | trigger_update 接口不匹配 | TS 传 {id, updates} vs Rust 期望平铺参数 | 2h |
**总工作量估计**: P0 (1h) + P1 (10h) + P2 (20h) + P3 (10h) + P4 (4h) = **~45h**
---
## 七、架构健康度评分
| 模块 | 评分 | 趋势 | 关键问题 |
|------|------|------|---------|
| zclaw-types | 95% | → | 基础类型,稳定 |
| zclaw-memory | 78% | → | 与 zclaw-growth 存储边界模糊 |
| zclaw-runtime | 85% | → | 4 个 LLM Driver 完整 |
| zclaw-kernel | 80% | → | Director 死代码 |
| zclaw-skills | 80% | → | WASM/Native 待实现 |
| zclaw-hands | 70% | → | 2 个 Hand 无代码 |
| zclaw-protocols | 65% | ↓ | A2A feature-gatedMCP 最小实现 |
| zclaw-pipeline | 87% | → | 高质量实现 |
| zclaw-growth | **63%** | ↓ | 3 个关键组件未接入生产 |
| zclaw-channels | 20% | ↓ | 仅 ConsoleChannel |
| zclaw-saas | 88% | ↑ | SQL 注入修复后可到 90%+ |
| Desktop 前端 | 82% | → | 降级策略完善 |
| Admin 后台 | 85% | → | 缺日志/同步日志页面 |
| **整体** | **~83%** | **↑** | 核心功能可用,智能层闭环待修复 |
---
## 八、核心结论
### 根因分析
V9 审计发现的根本问题集中在一条断裂的数据链路上:
**`对话 → 记忆提取 → 存储 → 检索 → 注入 → 增强回复`**
当前只有 `检索 → 注入 → 增强回复` 在工作。记忆的"生长"依赖:
1. LlmDriverForExtraction 的实现 (BREAK-01)
2. post_conversation_hook 的接入 (BREAK-02)
3. PromptInjector 替代字符串拼接 (DEAD-01)
修复这 3 项后,智能层的完成度将从 63% 跃升至 85%+。
### 安全状态
V8 的 CRITICAL (agent_template SQL 注入) 已修复。仅剩 1 个 HIGH (prompt SQL 注入) 和 2 个 MEDIUM。SSRF 防护全面Auth 覆盖完整,密码/TOTP/加密实现安全。
### 最大改进方向
1. **记忆闭环修复** — P1 修复后用户体验显著提升
2. **文档更新** — 130 个命令只记录了 58 个,严重低估
3. **死代码清理** — Growth crate 3 个核心组件设计完善但未接入
4. **Admin 补全** — 操作日志、同步日志、设备管理页面缺失