# df-storage + df-ideas + df-mcp 代码走查报告 > 走查日期: 2026-08-02 > 范围: crates/df-storage/ (7 files, ~142KB) + crates/df-ideas/ (7 files, ~63KB) + crates/df-mcp/ (3 files, ~52KB) --- ## 一、df-storage 存储层 ### 文件规模 | 文件 | 行数 | 类型 | |---|---|---| | migrations.rs | 89,663 | 迁移脚本(37 个版本) | | models.rs | 24,880 | 15 个数据模型 | | secret.rs | 16,523 | 密钥管理(keyring) | | crud/mod.rs | 14,919 | Repo 宏 + 公共工具 | | crud/task_repo.rs | 42,011 | 任务 Repo | | crud/idea_repo.rs | 65,123 | 灵感 Repo | | crud/conversation_repo.rs | 23,614 | 对话 Repo | | crud/message_repo.rs | 26,633 | 消息 Repo | | crud/project_repo.rs | 20,753 | 项目 Repo | | crud/settings.rs | 11,778 | 列白名单 | ### 问题汇总 | # | 等级 | 文件 | 类型 | 简述 | |---|---|---|---|---| | 1 | 🟡 P1 | migrations.rs | smell | 89KB 单文件,37 个迁移函数全在一个文件,V1 建表 SQL 也嵌在里面 | | 2 | 🟡 P1 | secret.rs | risk | keyring 在 Linux 无 GUI 会话时静默失败,`set_provider_secret` 返回 Err 但上层不处理 | | 3 | 🟡 P1 | db.rs | risk | 单连接 `Mutex`,GUI + MCP server 并发读写时锁竞争 | | 4 | 🟡 P1 | crud/mod.rs | risk | `impl_repo!` 宏生成的 `update_field` 不校验 entity_type(已知缺陷 B-260801-01) | | 5 | 🟡 P1 | crud/idea_repo.rs | smell | 65KB 单文件,灵感 Repo 含知识库/向量工具,职责过宽 | | 6 | 🟡 P1 | crud/task_repo.rs | smell | 42KB 单文件,含 `advance_status_atomic` 状态机收口 | | 7 | 🟢 P2 | secret.rs | smell | 迁移失败计数 sidecar 文件用 `.devflow-keyring-failcount`,路径依赖 cwd | | 8 | 🟢 P2 | models.rs | smell | `AiProviderRecord` 的 `Debug` 手动脱敏,新增字段易漏 | | 9 | 🟢 P2 | migrations.rs | smell | 37 个迁移版本,V1 建表 SQL 内联,V21 消息拆表迁移函数长 | ### 正面评价 1. **胡盾宏 impl_repo!**: 消除 14 个 Repo 的重复样板,from_row/insert/update 三体分离 2. **迁移幂等**: column_exists 探测,新库/老库/坏数据均不崩 3. **WAL 模式**: `PRAGMA journal_mode=WAL` 已启用,GUI + MCP 并发安全 4. **密钥管理**: keyring 迁移 + 失败计数阈值 + 显示告警,设计完整 5. **ensure_resolved_key**: 归一化(trim/剥引号)防粘贴脏 key 6. **列白名单**: `allowed_columns_for` 每表独立白名单,防 SQL 注入 7. **基线测试**: `all_known_tables_have_column_whitelist` 防新增表漏白名单 --- ## 二、df-ideas 灵感评估 ### 问题汇总 | # | 等级 | 文件 | 类型 | 简述 | |---|---|---|---|---| | 1 | 🟡 P1 | adversarial.rs | smell | 296KB 单文件,引擎 + 测试混在一起,测试应拆到独立文件 | | 2 | 🟡 P1 | adversarial_helpers.rs | risk | 拒绝语义化关键字 `"no"` 过宽,`"no problem"` 等文本可能误判 | | 3 | 🟢 P2 | scoring.rs | smell | 关键词匹配 `count_any` 否定前缀处理复杂,但只处理单字+两字否定 | | 4 | 🟢 P2 | scoring_keywords.rs | smell | 关键词硬编码,最佳实践应为 JSON 配置 | | 5 | 🟢 P2 | adversarial.rs | risk | `evaluate_with_llm` 返回一致性未校验,ARC-260618-01-e 待决策 | ### 正面评价 1. **对抗评估架构**: 启发式/LLM 双轨 + 自动降级,`evaluated_by` 三态标记前端可展示 2. **LLM prompt 设计**: 三角色辩论 + 严格 JSON schema + 截断保护 3. **parse_llm_eval 容错**: 剥离 ```json 围栏 + 正则兜底 + 枚举映射 + 数值 clamp 4. **评分引擎**: 否定前缀处理(不复用反向不计入复用正向分),设计精细 5. **测试覆盖**: adversarial 7 个启发式 + 1 个 LLM mock 测试,scoring 10 个测试 --- ## 三、df-mcp MCP Server ### 问题汇总 | # | 等级 | 文件 | 类型 | 简述 | |---|---|---|---|---| | 1 | 🟡 P1 | tools.rs | smell | 31KB 单文件,19 个 handler + 工具定义全在一起 | | 2 | 🟡 P1 | tools.rs | risk | `Box::leak` 静态化工具定义,但 `all_tools()` 每次调用重新构建 Vec | | 3 | 🟢 P2 | server.rs | smell | dispatch 中 `high_risk` 兜底拒绝与 `visible` 过滤双重检查,但 `visible` 已过滤 High | | 4 | 🟢 P2 | protocol.rs | smell | `McpMethod::from_request` 中 `tools/call` 的 arguments 取 `req.params.get("arguments")`,可能为 null | ### 正面评价 1. **安全设计**: High 风险工具默认拒绝,read-only 模式仅 Low,双保险 2. **协议实现**: 完整 JSON-RPC 2.0 + MCP 2025-06-18 协议 3. **测试覆盖**: initialize/list/call/High拒绝/read-only/create-then-list 全路径覆盖 4. **handler 函数指针**: 避免闭包捕获生命周期问题 5. **medium_audit 审计日志**: Medium 风险工具调用有 tracing::warn 审计