Files
zclaw_openfang/docs/features/AUDIT_TRACKER.md
iven 8898bb399e
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 reports + feature docs + skills + admin-v2 + config sync
Update audit tracker, roadmap, architecture docs,
add admin-v2 Roles page + Billing tests,
sync CLAUDE.md, Cargo.toml, docker-compose.yml,
add deep-research / frontend-design / chart-visualization skills

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 19:25:00 +08:00

233 lines
14 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 审计追踪表 (V10)
> **创建日期**: 2026-03-29
> **审计版本**: V11 + 深度二次审计
> **最后更新**: 2026-04-02
> **追踪规则**: 每个发现项记录状态变更,修复后需附验证方法
---
## P0: 阻断级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| SEC-V9-01 | prompt/service.rs:94,97,100 SQL 注入 | **FALSE_POSITIVE** | - | 2026-03-29 | 已验证: format!() 仅构建 `$N` 占位符索引,实际值通过 .bind() 参数化绑定,非 SQL 注入 |
## P1: 严重级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| BREAK-01 | LlmDriverForExtraction 无生产实现 | **FIXED** | - | 2026-03-29 | `extraction_adapter.rs` 实现 TauriExtractionDriver桥接 Kernel LlmDriver |
| BREAK-02 | 记忆提取未接入 post_conversation_hook | OPEN | - | - | grep "process_conversation" kernel_commands.rs |
| BREAK-03 | 审批后不自动执行 Hand | OPEN | - | - | 验证 approval_respond 中 approved=true 触发执行 |
| BREAK-04 | pipeline-complete 事件未监听 | OPEN | - | - | grep "pipeline-complete" desktop/src/ |
## P2: 高优先级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| DEAD-01 | PromptInjector 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: PromptInjector 已通过 PromptBuilder 重构接入,非死代码 |
| DEAD-02 | MemoryRetriever 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: MemoryRetriever 已通过 MemoryMiddleware 接入,非死代码 |
| DEAD-03 | GrowthTracker 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: GrowthTracker 已通过 GrowthIntegration 桥接接入,非死代码 |
| DEAD-05 | 39 个未调用 saas-client 方法 | OPEN | - | - | 评估是否需要桌面端入口 |
| DOC-01 | Tauri 命令数文档 58+ vs 实际 130 | OPEN | - | - | 更新 06-tauri-backend 文档 |
| DOC-02 | 智能层文档引用已删除模块 | OPEN | - | - | 更新 02-intelligence-layer 文档 |
| TYPE-01 | Desktop/Admin 类型不一致 (6 组) | OPEN | - | - | 统一类型定义 |
| G-07 | account_api_keys 被 relay 绕过 | OPEN | - | - | 决策:统一 key 管理或标记独立功能 |
## P3: 中优先级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| CONF-01 | 配置参数孤儿 (batch_window_ms 等) | **PARTIALLY_FIXED** | - | 2026-03-29 | batch_window_ms / max_concurrent_per_provider 标记为预留 (relay 配置)burst 通过 RateLimitConfig 消费 |
| SEC-V9-02 | relay 输入验证可加强 | OPEN | - | - | 添加基本校验 |
| AUDIT-01 | 前端 audit-logger 无消费者 | OPEN | - | - | grep "auditLogger" desktop/src/ |
| DEAD-04 | director.rs 907 行孤立代码 | OPEN | - | - | 移至 feature flag 后面 |
| ADMIN-01 | config_sync_logs 无 Admin 页面 | OPEN | - | - | 添加页面 |
| ADMIN-02 | operation_logs 无 Admin 页面 | OPEN | - | - | 添加页面 |
## P4: 低优先级
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| DOC-03 | SKILL.md 数量 69→70 | OPEN | - | - | 更新 README.md |
| DOC-04 | Hands 数量 CLAUDE.md vs README 不一致 | OPEN | - | - | 统一口径 |
| EVAL-01 | zclaw-channels 评估 | OPEN | - | - | 决定保留或删除 |
| IFACE-01 | trigger_update 接口不匹配 | OPEN | - | - | 对齐 TS/Rust 参数 |
---
## 状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-03-29 | SEC-V9-01 | OPEN → FALSE_POSITIVE | prompt/service.rs format!() 仅构建 $N 占位符,实际值通过 .bind() 参数化绑定 |
| 2026-03-29 | BREAK-01 | OPEN → FIXED | extraction_adapter.rs 实现 TauriExtractionDriver桥接 Kernel LlmDriver 到 LlmDriverForExtraction trait |
| 2026-03-29 | CONF-01 | OPEN → PARTIALLY_FIXED | Worker 系统 + Scheduler 系统上线部分配置参数已消费relay 预留参数已标注 |
| 2026-03-29 | - | V9 审计创建 | 20 个发现项 |
| 2026-04-01 | DEAD-01 | OPEN → FALSE_POSITIVE | V10 确认: PromptInjector 已通过 PromptBuilder 重构接入,非死代码 |
| 2026-04-01 | DEAD-02 | OPEN → FALSE_POSITIVE | V10 确认: MemoryRetriever 已通过 MemoryMiddleware 接入,非死代码 |
| 2026-04-01 | DEAD-03 | OPEN → FALSE_POSITIVE | V10 确认: GrowthTracker 已通过 GrowthIntegration 桥接接入,非死代码 |
| 2026-04-01 | - | V10 审计更新 | DEAD-01/02/03 确认为误报 |
| 2026-04-02 | BREAK-02 | OPEN → CLOSED | V11 确认: MemoryMiddleware.after_completion 正常触发记忆提取,非断链 |
| 2026-04-02 | BREAK-03 | OPEN → CLOSED | V11 确认: approval_respond 自动 spawn tokio task 执行 Hand非断链 |
| 2026-04-02 | BREAK-04 | OPEN → CLOSED | V11 确认: pipeline-complete 在 discovery.rs:165 emit前端有监听器 |
| 2026-04-02 | IFACE-01 | OPEN → CONFIRMED_P1 | trigger_update 前端发嵌套 updates 对象Rust 期望扁平参数,更新静默失败 |
| 2026-04-02 | - | V11 全面审计 | 22 项新发现3 P1 + 6 P2 + 8 P3 + 5 P43 项 V10 关闭 |
---
## V11 新增发现项 (2026-04-02)
### P1: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P1-01 | trigger_update 参数嵌套导致更新失败 | **IN_PROGRESS** | 修复前端(扁平参数) |
| V11-P1-02 | SaaS 配置同步不传播到 Rust Kernel | **IN_PROGRESS** | 立即修复完整链路 |
| V11-P1-03 | 3 个 SQL 表零读取 (prompt_sync_status, telemetry_reports, key_usage_window) | OPEN | grep SELECT FROM 在 SaaS crate |
### P2: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P2-01 | saas-admin.ts 30 方法零消费者 | OPEN | grep 方法名在 desktop/src/ |
| V11-P2-02 | 7 个 Role/Permission 路由无前端消费者 | OPEN | admin-v2 无 roles service |
| V11-P2-03 | deprecated gateway-storage sync 方法仍被生产代码调用 | OPEN | gateway-client.ts:44,71,211 |
| V11-P2-04 | ToolDefinition 在 types 和 runtime 重复定义 | OPEN | 比较两个定义 |
| V11-P2-05 | 62 个 Tauri 命令无前端调用 | OPEN | 逐一 grep invoke 调用 |
| V11-P2-06 | migration SQL 查询缺少 LIMIT | OPEN | 检查 config_items SELECT |
### P3: 中优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P3-01 | audit-logger.ts 导出但零 import | OPEN | grep "from.*audit-logger" |
| V11-P3-02 | OFP 能力定义无消费者 | OPEN | grep OfpDiscover |
| V11-P3-03 | extract_structured_facts() deprecated 未移除 | OPEN | grep 调用者 |
| V11-P3-04 | SaaS knowledge 3 个 handler 返回空数据 | OPEN | admin-v2 Knowledge 测试 |
| V11-P3-05 | Director 912 行 feature-gated 未启用 | OPEN | Cargo.toml 检查 |
| V11-P3-06 | 定时任务执行结果未持久化 | OPEN | scheduled_tasks schema |
| V11-P3-07 | secure-storage sync deprecated 零调用 | OPEN | grep 调用者 |
| V11-P3-08 | config 2 个预留参数未消费 | OPEN | grep batch_window_ms |
### P4: 低优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P4-01 | ContentBlock 4 处定义(不同域) | OPEN | 比较各定义用途 |
| V11-P4-02 | Desktop ↔ Admin 13+ 类型名称不一致 | OPEN | 比对类型文件 |
| V11-P4-03 | 文档数字不一致 (Skills 76 vs 66/75/77) | OPEN | ls skills/ |
| V11-P4-04 | A2A/WASM feature-gated 未启用 | OPEN | Cargo.toml 检查 |
| V11-P4-05 | embedding 生成已禁用 | OPEN | generate_embedding.rs:92 |
---
## 深度二次审计新增发现 (2026-04-02)
### P0: 阻断级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P0-01 | skill_execute 空 context 反序列化崩溃 | **FIXED** | kernel-skills.ts — 填充空 context 字段 |
| SEC2-P0-02 | TaskTool::default() 调用 unimplemented!() | **FIXED** | task.rs — 移除 Default impl |
### P1: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P1-01 | FactStore trait 定义但全 workspace 无 impl | OPEN | grep "impl FactStore" crates/ |
| SEC2-P1-02 | agent-templates API 缺少 /api/v1 前缀 → 404 | **FIXED** | saas-client.ts — 添加 /api/v1 前缀 |
| SEC2-P1-03 | hand-execution-complete 无前端 listener| **FIXED** | kernel-hands.ts — 添加 onHandExecutionComplete listener |
| SEC2-P1-04 | InMemoryStorage 6 处 RwLock unwrap() 级联 panic | **FIXED** | viking_adapter.rs — 替换为 expect() |
| SEC2-P1-05 | HandRun 持久化错误 3 处静默忽略 | **FIXED** | approvals.rs — 添加 tracing::warn 日志 |
| SEC2-P1-06 | FTS 索引更新失败 3 处静默忽略 | **FIXED** | sqlite.rs — 添加 tracing::warn 日志 |
| SEC2-P1-07 | Worker dispatch 失败 4 处静默忽略 | **FIXED** | knowledge/handlers.rs — 替换为 if let Err 日志 |
| SEC2-P1-08 | Desktop 前端零测试覆盖 | OPEN | ls desktop/src/**/*.test.* |
| SEC2-P1-09 | record_key_usage 错误忽略 → 计费数据丢失 | **FIXED** | relay/service.rs — 添加 tracing::warn 日志 |
### P2: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P2-01 | hmac/sha1 unused deps in zclaw-hands | **FIXED** | Cargo.toml — 移除 unused deps |
| SEC2-P2-02 | serde_yaml 版本不一致 (desktop 0.9 vs pipeline 2) | OPEN | 比对各 Cargo.toml |
| SEC2-P2-03 | sqlx-postgres v0.7.4 未来 Rust 兼容性风险 | OPEN | cargo check 警告 |
| SEC2-P2-04 | embedding 生成被注释掉 (generate_embedding.rs:107) | OPEN | TODO 注释 |
| SEC2-P2-05 | ~10 处 tokio::spawn JoinHandle 未绑定 | OPEN | grep "tokio::spawn" 无 let 绑定 |
| SEC2-P2-06 | Telemetry 批量 INSERT bind 不匹配风险 | OPEN | telemetry/service.rs:205-213 |
| SEC2-P2-07 | Scheduler 串行执行 → 长 hand 阻塞后续调度 | OPEN | scheduler.rs:117-153 |
| SEC2-P2-08 | format!("FROM {}", table) SQL 模式违反防御原则 | OPEN | db.rs:874,880 |
| SEC2-P2-09 | hand_run_status 多传 handName 参数 | **FIXED** | kernel-hands.ts — 移除多余参数 |
| SEC2-P2-10 | kernel_apply_saas_config TOML 多行值 edge case | **FIXED** | lifecycle.rs — 添加三引号多行值支持 |
### P3: 中优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P3-01 | A2A Router 4 RwLock 锁顺序未文档化 | OPEN | a2a.rs:239-245 |
| SEC2-P3-02 | Admin Role 类型轻微不一致 (is_system) | OPEN | 比对 types/index.ts vs role/types.rs |
| SEC2-P3-03 | Admin Billing/Knowledge/Roles 页面缺测试 | OPEN | ls admin-v2/tests/pages/ |
---
## 二次审计状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-04-02 | SEC2-P0-01 | NEW | skill_execute 空 context 反序列化崩溃 |
| 2026-04-02 | SEC2-P0-02 | NEW | TaskTool::default() unimplemented!() |
| 2026-04-02 | SEC2-P1-01 | NEW | FactStore trait 零实现 |
| 2026-04-02 | SEC2-P1-02 | NEW | agent-templates API 路径缺 /api/v1 |
| 2026-04-02 | SEC2-P1-03 | NEW | hand-execution-complete 无前端 listener |
| 2026-04-02 | SEC2-P1-04 | NEW | InMemoryStorage RwLock unwrap 级联 panic |
| 2026-04-02 | SEC2-P1-05 | NEW | HandRun 持久化 3 处静默忽略 |
| 2026-04-02 | SEC2-P1-06 | NEW | FTS 索引 3 处静默忽略 |
| 2026-04-02 | SEC2-P1-07 | NEW | Worker dispatch 4 处静默忽略 |
| 2026-04-02 | SEC2-P1-08 | NEW | Desktop 前端零测试 |
| 2026-04-02 | SEC2-P1-09 | NEW | record_key_usage 错误忽略 |
| 2026-04-02 | SEC2-P2-01~10 | NEW | 10 项 P2 发现 |
| 2026-04-02 | SEC2-P3-01~03 | NEW | 3 项 P3 发现 |
| 2026-04-02 | - | 深度二次审计 | 5 维并行审计24 项新发现 |
| 2026-04-02 | AUD3-FE-01 | NEW → FIXED | chatStore.sendMessage 添加 isStreaming store 级互斥检查 |
| 2026-04-02 | AUD3-FE-02/API-01 | NEW → FIXED | SaaSClient 添加 refreshMutex() 共享 Promise 并发锁 |
## 第三轮审计新增发现 (2026-04-02)
### HIGH: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-01 | chatStore.sendMessage 无并发保护 | **FIXED** | chatStore.ts — 添加 isStreaming store 级 guard |
| AUD3-FE-02/API-01 | SaaS token refresh 无并发锁 | **FIXED** | saas-client.ts — refreshMutex() 共享 Promise |
### MEDIUM: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-03 | initializeStores 可能调用 3 次 | OPEN | connectionStore.ts:415,589 + index.ts:99 |
| AUD3-FE-04 | window 全局变量存 interval | OPEN | App.tsx:257-258 |
| AUD3-FE-05 | 25+ 处 mixin `as any` | OPEN | gateway-heartbeat.ts 等 |
| AUD3-FE-06 | PropertyPanel 17 处 `as any` | OPEN | PropertyPanel.tsx:100-276 |
| AUD3-DB-01 | 无 down migration | OPEN | crates/zclaw-saas/migrations/ |
| AUD3-DB-02 | format! SQL 模式 | OPEN | agent_template/service.rs:136 |
| AUD3-API-02 | 前端错误处理不统一 | OPEN | desktop/src/ |
| AUD3-CONC-02 | ~15 处 fire-and-forget tokio::spawn | OPEN | main.rs, relay/handlers.rs, scheduler.rs |
### LOW: 低优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-07 | offlineStore 全局变量存储 timer | OPEN | offlineStore.ts:87-88 |
| AUD3-FE-08 | agentStore 读取中间态 | OPEN | agentStore.ts:254 |
| AUD3-FE-09 | retryAllMessages 无并发锁 | OPEN | offlineStore.ts:188-233 |
| AUD3-CONC-03 | approval polling 增加锁竞争 | OPEN | approval.rs:96 |
## 第三轮审计状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-04-02 | AUD3-FE-01 | NEW → FIXED | sendMessage 入口添加 `if (get().isStreaming) return` |
| 2026-04-02 | AUD3-FE-02/API-01 | NEW → FIXED | SaaSClient 添加 `_refreshPromise` + `refreshMutex()` 共享 Promise |
| 2026-04-02 | - | 第三轮审计 | 5 维并行审计14 项新发现2 HIGH + 8 MEDIUM + 4 LOW