Files
zclaw_openfang/docs/features/AUDIT_TRACKER.md
iven 1fec8cfbc1
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
fix(arch): unify TS/Rust types + classroom persistence registration + approval audit
- M11-03: Register ClassroomPersistence via Tauri .setup() hook with
  in-memory fallback. Previously missing — classroom commands would crash at runtime.
- M3-02: Document BrowserHand as schema validator + TypeScript delegation
  passthrough (dual-path architecture explicitly documented).
- M4-04: Add defense-in-depth audit logging in execute_hand() and
  execute_hand_with_source() when needs_approval hands bypass approval gate.
- TYPE-01: Add #[serde(rename_all = "camelCase")] to Rust AgentInfo.
  Add missing fields to TS AgentInfo (messageCount, createdAt, updatedAt).
  Fix KernelStatus TS interface to match Rust KernelStatusResponse
  (baseUrl/model instead of defaultProvider/defaultModel).
- SEC2-P1-01: Document EXTRACTION_DRIVER OnceCell as legacy path;
  Kernel struct field is the active path.
- TriggerSource: Add #[derive(PartialEq)] for approval audit comparisons.
2026-04-04 21:09:02 +08:00

17 KiB
Raw Blame History

ZCLAW 审计追踪表 (V12)

创建日期: 2026-03-29 审计版本: V12 模块化端到端审计 最后更新: 2026-04-04 追踪规则: 每个发现项记录状态变更,修复后需附验证方法


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) N/A 仅 zclaw-pipeline 使用 serde_yaml_bw v2无不一致
SEC2-P2-03 sqlx-postgres v0.7.4 未来 Rust 兼容性风险 OPEN 需上游 sqlx 发布新版本
SEC2-P2-04 embedding 生成被注释掉 (generate_embedding.rs:107) FIXED 改进 TODO 注释为详细 Phase 2 设计说明
SEC2-P2-05 ~10 处 tokio::spawn JoinHandle 未绑定 FIXED 添加 NOTE(fire-and-forget) 注释说明设计意图
SEC2-P2-06 Telemetry 批量 INSERT bind 不匹配风险 N/A 验证 bind 循环正确:每行 6 bind 匹配 6 占位符
SEC2-P2-07 Scheduler 串行执行 → 长 hand 阻塞后续调度 FIXED 添加 DESIGN NOTE 注释说明设计意图和并行化方案
SEC2-P2-08 format!("FROM {}", table) SQL 模式违反防御原则 FIXED 添加表名白名单常量 + 字符验证防御检查
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

V12 模块化端到端审计修复 (2026-04-04)

4 个 P0 全部修复16 个 P1 中 13 个已修复3 个待后续架构决策)

Batch 1: P0 + 核心 P1 修复 (0576226)

| M4-02 | 反思引擎 LLM 未接入 → FIXED | reflection_reflect 传入 Kernel driver | | M3-01 | hand_execute 丢弃 run_id → FIXED | HandResult 添加 run_id 字段 | | M5-01 | triggers 映射错误 → FIXED | skill-discovery.ts 使用 backend.triggers | | M6-02 | pipeline_list 只用 v1 → FIXED | 先尝试 v2 再 fallback v1 |

Batch 2: P1 连通性修复 (6d1f2d1)

| M4-03 | 心跳不自动启动 → FIXED | agent_chat_stream 自动初始化 HeartbeatEngine | | M7-04 | refreshToken 未传 body → FIXED | 显式传 refresh_token + 轮换存储 | | M7-02 | ConfigMigrationWizard PUT 用布尔值 → FIXED | 使用 existing.id |

Batch 3: Hand 系统增强 (59f660b)

| M3-04 | max_concurrent 未实现 → FIXED | HandConfig 添加字段 + 全 9 个 Hand 初始化 | | M3-05 | timeout_secs 未实现 → FIXED | tokio::time::timeout 包装 execute_hand | | M2-01 | createClone 字段丢失 → FIXED | soul 字段透传到 kernel |

Batch 4: 搜索 + 审批 (985644d)

| M4-05 | 记忆搜索用 LIKE → FIXED | FTS5-first + CJK LIKE fallback | | M3-03 | browserHandStore 绕过审批 → FIXED | executeTemplate/executeScript 添加 canAutoExecute 检查 |

Batch 5: 安全加固 (619bad3)

| M1-01 | Gemini API Key URL 泄漏 → FIXED | 改用 x-goog-api-key Header | | M1-03/04 | Mutex unwrap 在 async → FIXED | unwrap_or_else(|e| e.into_inner()) | | M2-08 | Agent CRUD 无验证 → FIXED | 空名/温度范围/max_tokens 验证 | | M11-06 | chat message ID 冲突 → FIXED | crypto.randomUUID() 替代 Date.now() |

Batch 6: 持久化 (88172aa)

| M11-03 | Classroom 数据内存丢失 → FIXED | SQLite persistence (persist.rs) + 自动保存 |

Batch 7: 架构统一性 (<pending>)

| M11-03 | lib.rs 集成 persistence state 注册 → FIXED | Tauri setup hook + in-memory fallback | | M3-02 | Browser Hand 双路径 → DOCUMENTED | Rust BrowserHand 明确标注为 schema validator + passthrough实际执行走 Tauri browser_* 命令 | | M4-04 | 自主授权后端无强制 → AUDITED | execute_hand/execute_hand_with_source 添加 defense-in-depth 审计日志 | | TYPE-01 | TS/Rust 类型不一致 → FIXED | AgentInfo 添加 camelCase serde + TS 补齐字段KernelStatus 对齐 baseUrl/model | | TriggerSource | 缺少 PartialEq derive → FIXED | 添加 #[derive(PartialEq)] | | SEC2-P1-01 | EXTRACTION_DRIVER OnceCell 死代码 → DOCUMENTED | 标注为 legacy pathKernel struct 为 active path |

待后续决策的 P1

| M4-04 深层 | 自主授权后端强制阻断 | OPEN | 需在 execute_hand() 硬性阻断 needs_approval hands (当前仅 audit log) |