Files
zclaw_openfang/docs/superpowers/specs/2026-04-04-module-audit-design.md
iven ade534d1ce
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
feat: 添加MCP调试插件并优化流式超时处理
refactor(relay): 将Provider Key管理路由移至model_config模块
fix(saas): 修复demo_keys与provider_keys的匹配逻辑
perf(runtime): 将流式响应超时从60秒延长至180秒以适配思考型模型
docs: 新增模块化审计和上线前功能测试方案文档
chore: 添加tauri-plugin-mcp依赖及相关配置
2026-04-08 13:39:06 +08:00

280 lines
11 KiB
Markdown
Raw Permalink 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 模块化端到端深度功能验证审计方案
> **版本**: v1.1 (review fix)
> **日期**: 2026-04-04
> **状态**: 设计完成,待执行
> **审计目标**: 端到端功能验证——系统性找出每个模块从 UI 到后端的断链
---
## 1. 背景与动机
ZCLAW 项目已有 14 次审计历史V1-V11 共 11 轮版本化审计 + 3 轮专项审计),前几轮以"技术层横向扫描"为主:检查 Tauri 命令调用率、SaaS API 前端消费、死代码清理等。这些审计修复了大量问题,但存在三个结构性盲区:
1. **缺乏功能视角** — 已知 24 个 Tauri 命令无前端调用,但不知属于哪些用户故事
2. **缺乏边界验证** — 只查"调了没有",没查"调错了怎么表现"、"空数据怎么表现"
3. **缺乏累积性** — 每轮从头扫,无模块级基线
本方案以**功能领域为主轴**组织审计,以标准化的**五维检查清单**确保不遗漏,以**三波并行策略**高效执行。
---
## 2. 审计模块划分
### 模块清单
| 模块 | 功能领域 | 核心链路 | 涉及关键文件 |
|------|---------|---------|-------------|
| **M1** | 智能对话 | 用户输入 → ChatArea → chatStore → Kernel → LLM Driver → 流式回传 | `components/ai/*`, `store/chat/*`, `lib/kernel-chat.ts`, `kernel_commands/chat.rs`, `zclaw-runtime/src/driver/*` |
| **M2** | Agent 分身 | 创建/切换/配置 Agent → agentStore → Kernel → SQLite | `agentStore.ts`, `lib/kernel-agent.ts`, `kernel_commands/agent.rs`, `zclaw-memory/src/agent_store.rs` |
| **M3** | Hands 自主能力 | 触发 Hand → handStore → Kernel → Hand 执行 → 事件回调 | `handStore.ts`, `lib/kernel-hands.ts`, `crates/zclaw-hands/src/hands/*`, `hands/*.HAND.toml` |
| **M4** | 智能层 | 记忆/身份/反思/心跳/自主授权/压缩 各链路 | `intelligence-client/*`, `store/memoryGraphStore.ts`, `intelligence/*.rs` |
| **M5** | 技能生态 | 技能浏览/搜索/执行 → Skills 语义路由 → SKILL.md | `lib/kernel-skills.ts`, `crates/zclaw-skills/src/*`, `skills/*.md` |
| **M6** | Pipeline 工作流 | 创建/编辑/执行 Pipeline → workflowStore → DSL Engine | `components/pipeline/*`, `workflowStore.ts`, `crates/zclaw-pipeline/src/*` |
| **M7** | SaaS 平台(Desktop) | 登录/配置/支付 → saasStore → saas-client → SaaS API | `components/SaaS/*`, `saasStore.ts`, `lib/saas-client.ts`, `crates/zclaw-saas/src/*` |
| **M8** | Admin V2 | 14 页面 CRUD → 18 services → SaaS API → PostgreSQL | `admin-v2/src/pages/*`, `admin-v2/src/services/*` |
| **M9** | 通信与安全 | 连接管理/认证/TOTP/加密/限流/MCP 协议 | `connectionStore.ts`, `securityStore.ts`, `gateway-client.ts`, `lib/mcp-client.ts`, `crates/zclaw-saas/src/auth/*`, `crates/zclaw-protocols/src/mcp/*` |
| **M10** | 横切关注点 | 错误一致性、类型一致性、并发安全(汇总分析) | 全局横切 |
| **M11** | Classroom 课堂 | 课堂场景播放/聊天/笔记/白板/TTS | `store/classroomStore.ts`, `components/classroom_player/*`, `lib/classroom-adapter.ts` |
---
## 3. 五维检查模板
每个模块必须完成以下五个维度的检查:
### 维度 1: 链路完整性
- 画出该模块的完整调用链UI → Store → Client → IPC/API → Rust → DB/网络)
- 标注每个节点的文件路径
- 检查每条边的连通性("写了没接"检查)
### 维度 2: 参数/类型一致性
| 检查点 | 方法 |
|--------|------|
| 前端调用参数 vs Rust 命令签名 | 逐字段比对名称、类型、Optionality |
| 返回值类型链路 | Rust struct → Tauri IPC → TS type → Store state |
| 枚举值/常量两端同步 | 比对 Rust enum 与 TS union type |
| 数据库字段与 API 字段对齐 | SQL 列 vs handler struct field |
### 维度 3: 边界与错误处理
| 场景 | 检查内容 |
|------|---------|
| 空状态 | 数据库无数据时 UI 表现;空字符串/空数组/null 参数传递 |
| 错误状态 | 网络 5xx / 4xx / 超时 / 序列化失败 → 是否有用户可见反馈 |
| 并发 | 快速双击多操作并行Token 刷新并发 |
| 性能降级 | 大数据量1000+ 消息FTS 全表扫描;连接池满 |
| 输入边界 | 超长文本、特殊字符、非 UTF-8、负数、零值 |
### 维度 4: 状态管理
- Store 状态机完整性loading / success / error / reset
- 组件是否正确订阅 Store 变化
- 持久化/恢复路径是否完整
- 竞态条件风险stale closure、过期 setState
### 维度 5: 安全与资源
- 敏感数据加密/脱敏
- 资源泄漏(事件监听器未清理、定时器未清除、连接未释放)
- 权限检查完整性
- 日志是否包含敏感信息
---
## 4. 断链检测方法
### 步骤 1: Tauri 命令调用矩阵
```
对模块涉及的所有 Tauri 命令:
1. 从 kernel_commands/mod.rs 提取 #[tauri::command] 注册名
2. grep desktop/src/ 找 invoke('commandName') 调用
3. 对比 → 标注 connected / reserved / broken
```
### 步骤 2: 参数签名级比对
```
对每个 connected 命令:
1. 提取 Rust 端参数类型定义 (struct/derive)
2. 提取 TS 端调用参数
3. 逐字段比对名称/类型/Optionality
4. 不匹配 → 记为 P1 断链
```
### 步骤 3: 事件链路追踪
```
1. grep desktop/src-tauri/src/ 找 .emit("event-name") 发射点
2. grep desktop/src/ 找 .listen("event-name") 监听点
3. 交叉比对 → 找出 emit 但无 listen 的断裂
```
### 步骤 4: 数据库-API-UI 三端对齐
```
1. grep crates/zclaw-saas/src/ 找 SELECT/INSERT 语句
2. 对比 API handler 暴露的端点
3. 对比前端 service 层调用
4. 找出"有表无 API" 或 "有 API 前端未调"
```
---
## 5. 边界验证方法
采用三层验证策略:
### 第一层: 静态分析工具辅助60% 工作量)
| 检查 | 命令 |
|------|------|
| TypeScript 类型安全 | `tsc --noEmit` |
| Rust 编译检查 | `cargo check` |
| 潜在 panic | `grep -rn "unwrap()" crates/` |
| 静默忽略 | `grep -rn "let _ =" crates/` |
| 类型逃逸 | `grep -rn "as any" desktop/src/` |
| 技术债标记 | `grep -rn "TODO\|FIXME\|HACK"` |
### 第二层: 代码推理人工审查30% 工作量)
对每条链路的每个"edge",推理:
- 上游返回 null/undefined/Err 时,下游如何处理?
- 上游超时 30s 无响应UI 如何表现?
- 用户在 loading 期间切换页面,状态如何恢复?
### 第三层: 实机验证P0/P1 必须,高频模块加强)
**标准模块M2/M4-M11**: 10% 工作量,仅 P0/P1 级发现做实机验证。
**高频模块M1/M3**: 20-30% 工作量,除 P0/P1 外还需验证:
- 并发场景:快速连续发送消息、快速连续触发 Hand
- 流式中断:中途断网、切换模型、切换 Agent
- 大数据场景1000+ 消息加载、长时间会话压缩
实机验证启动命令:`pnpm start:dev`
- 空数据场景:清空相关表,验证 UI 不崩溃
- 错误场景:关闭后端服务,验证前端降级提示
- 并发场景:快速连续触发同一操作
---
## 6. 优先级分级标准
| 级别 | 定义 | 示例 | 修复时限 |
|------|------|------|---------|
| **P0** | 必然崩溃或数据丢失,用户无法绕过 | skill_execute 空参数导致 serde panic | 立即 |
| **P1** | 功能失效但不崩溃;核心功能断链 | API 路径 404、参数不匹配静默失败 | 24h |
| **P2** | 功能部分可用但不完整;可能演变为 P1 | 静默忽略错误、fire-and-forget spawn | 1 周 |
| **P3** | 不影响功能但影响可维护性 | 类型命名不一致、文档数字偏差 | 下个迭代 |
| **P4** | 信息级建议改进 | 配置参数预留未消费、feature-gated 未启用 | backlog |
### 判断流程
```
用户是否看到异常? → 是 → P0/P1
数据是否丢失/损坏? → 是 → P0
核心路径是否受阻? → 是 → P1
是否可能引发 P1 → 是 → P2
是否仅影响开发者体验? → 是 → P3/P4
```
---
## 7. 执行策略
### 执行假设与节奏
- **执行者假设**: 单人执行AI Agent 辅助 + 人工决策)
- **模块粒度**: 每模块约 1 个工作日(含五维检查 + 报告编写)
- **总工期**: 11 个工作日11 模块 x 1 天/模块),跨约 2.5 周
### 波次安排
| 波次 | 模块 | 耗时 | 说明 |
|------|------|------|------|
| **第一波** | M1(对话) + M2(Agent) + M3(Hands) | 3 天 | 核心路径,历史断链最密集区 |
| **第二波** | M4(智能层) + M5(技能) + M6(Pipeline) | 3 天 | 智能与编排 |
| **第三波** | M7(SaaS) + M8(Admin) + M11(Classroom) | 3 天 | 平台层 |
| **第四波** | M9(通信安全) + M10(横切汇总) | 2 天 | 基础设施+全量汇总 |
每波内模块顺序执行(单 Agent 每日 1 模块),避免 context 窗口溢出。
### 模块内部执行顺序
五维检查串行执行:链路图 → 参数比对 → 边界验证 → 状态管理 → 安全检查
---
## 8. 报告格式
每个模块独立输出一份审计报告,格式如下:
```markdown
# 模块 [Mx] [模块名] 审计报告
## 1. 模块概况
- 功能描述
- 涉及文件清单(按层分类)
- 调用链路图
- 前次审计已知问题继承
## 2. 五维检查结果
### 2.1 链路完整性
| 链路 | 起点 | 终点 | 状态 | 断裂点 |
### 2.2 参数/类型一致性
| 接口 | 前端类型 | 后端类型 | 一致性 | 不匹配字段 |
### 2.3 边界与错误处理
| 场景 | 输入 | 预期行为 | 实际行为 | 级别 |
### 2.4 状态管理
| Store | 状态机完整性 | 持久化 | 竞态风险 |
### 2.5 安全与资源
| 检查项 | 状态 | 说明 |
## 3. 问题清单
| ID | 描述 | 文件:行号 | 级别 | 修复建议 | 验证方法 |
## 4. 改进建议
- 短期修复项(按优先级排序)
- 长期架构建议
```
最终汇总为 `docs/features/MODULE_AUDIT_SUMMARY.md`,包含:
- 各模块问题统计表
- P0/P1 问题优先修复清单
- 整体健康度评分
- 对 TRUTH.md 数字更新的建议
---
## 9. 与已有审计的衔接
- **继承 AUDIT_TRACKER.md**:每个模块开头从已有追踪表继承已知问题
- **更新 TRUTH.md**:审计中发现的数字偏差回写真相源
- **延续版本线**:本审计为 V12第 15 次),报告编号继续递增
- **新 P0 处理流程**:审计中发现的 P0 级问题立即中断当前模块审计,优先修复并验证,再继续审计
- **避免重复**:已标记为"已修复"的问题仅做验证性检查,不重新审计
---
## 10. 前几轮审计盲区(本次重点关注)
| 盲区 | 说明 | 本次覆盖维度 |
|------|------|-------------|
| Store 状态机完整性 | 前几轮几乎未检查 loading/error/reset | 维度 4 |
| 错误传播链路 | 后端 Err 是否能传到 UI | 维度 3 |
| 事件监听对称性 | emit 但无 listen 的断裂 | 维度 1 |
| 并发安全 | 约 15 处 fire-and-forget spawn 未审计 | 维度 5 |
| 空数据降级 | Desktop 端空数据表现未验证 | 维度 3 |
| Desktop 前端零测试 | 边界验证只能靠代码推理+实机 | 维度 3M1/M3 加强实机验证 |
| Classroom 课堂 | 27 个 Tauri 命令中 7 个无前端调用,未审计 | 新增 M11 |
| MCP 协议链路 | MCP 服务发现→工具列举→执行 链路未验证 | M9 增加检查项 |