# DevFlow 全量代码走查汇总报告

> 走查日期: 2026-08-02
> 范围: 12 个 crate, ~80 文件, ~1.2MB 源码
> 走查方式: 逐文件全量阅读 + 交叉引用 + 自动化分析

---

## 走查覆盖

| 模块 | 文件数 | 代码量 | 报告 |
|---|---|---|---|
| df-nodes（节点） | 17 | ~280KB | 01 ✅ |
| df-workflow（工作流引擎） | 11 | ~108KB | 02 ✅ |
| df-ai + df-ai-core（AI 核心） | 30 | ~555KB | 03 ✅ |
| df-storage（存储层） | 7 | ~150KB | 04+05 ✅ |
| df-ideas（灵感评估） | 7 | ~63KB | 04 ✅ |
| df-mcp（MCP Server） | 3 | ~52KB | 04 ✅ |
| df-execute（命令执行） | 2 | ~34KB | 04 ✅ |
| df-relay（云中继） | 5 | ~30KB | 05 ✅ |
| df-tunnel（隧道） | 3 | ~28KB | 05 ✅ |
| df-project（项目管理） | 3 | ~21KB | 05 ✅ |
| df-types（类型定义） | 3 | ~42KB | 05 ✅ |
| **总计** | **~91** | **~1.4MB** | **5 份报告** |

---

## 问题汇总（按等级）

### 🔴 P0（7 个）

| # | 模块 | 文件 | 简述 |
|---|---|---|---|
| 1 | df-nodes | ai_node.rs | schema `required=[]` 但运行时 prompt 必填，前后端不一致 |
| 2 | df-nodes | ai_self_review_node.rs | schema `required=["task_id","provider_id"]` 但 provider_id 可空 |
| 3 | df-nodes | docker_node.rs | shell_quote 不处理 `;` `|` `&`，命令注入漏洞 |
| 4 | df-ai | openai/anthropic_compat | 双文件 112KB，大量重复代码，应抽取共享模块 |
| 5 | df-ai | coordinator.rs | 65KB 单文件，DevFlow 最大文件，应拆分 |
| 6 | df-ai | context_helpers.rs | 63KB 纯辅助函数单文件，应拆分 |
| 7 | df-storage | migrations.rs | 89KB 单文件，37 个迁移函数应拆分到独立文件 |

### 🟡 P1（20 个）

| # | 模块 | 简述 |
|---|---|---|
| 1 | df-nodes | DockerNode volumes.host 用户可控，命令注入 |
| 2 | df-nodes | HumanNode timeout 默认 3600s 过长 |
| 3 | df-nodes | HttpNode 每次新建 reqwest::Client |
| 4 | df-nodes | SubflowNode 不实际执行子 DAG |
| 5 | df-nodes | human_node.rs(833行) / conditions.rs(934行) 过大 |
| 6 | df-workflow | conditions.rs 934 行单文件，应拆分 |
| 7 | df-workflow | conditions-eval feature 默认关闭 |
| 8 | df-ai | intent.rs 57KB 单文件 |
| 9 | df-ai | context/sanitize.rs 51KB 单文件 |
| 10 | df-ai | router cost_tier/intelligence 悬空无数据源 |
| 11 | df-ai | retry.rs MAX_COMPLETE_ATTEMPTS=3 硬编码 |
| 12 | df-ideas | adversarial.rs 29KB + 测试混在一起 |
| 13 | df-ideas | LLM 评估一致性未校验 |
| 14 | df-execute | env_snapshot Windows Store alias 卡死（已修复） |
| 15 | df-execute | shell.rs pwsh 首次探测时序依赖 |
| 16 | df-mcp | tools.rs 未校验实体类型（同 B-260801-01） |
| 17 | df-storage | secret.rs keyring 迁移失败保留明文 |
| 18 | df-storage | db.rs 单连接 Mutex 瓶颈 |
| 19 | df-storage | idea_repo.rs 65KB / task_repo.rs 42KB |
| 20 | df-relay | 单 token 鉴权，生产级需独立 |

### 🟢 P2（15 个）

| # | 模块 | 简述 |
|---|---|---|
| 1-2 | df-nodes | shell_quote DRY 漂移 / REJECT_KEYWORDS "no" 过宽 |
| 3-4 | df-ai | ChatMessage 18 字段 / SSE 1MB BUF_MAX |
| 5-6 | df-ideas | 关键词硬编码 / 否定前缀仅单字+两字 |
| 7-8 | df-storage | 迁移失败计数 cwd 依赖 / Debug 脱敏手动 |
| 9-10 | df-relay | device 无主动心跳 / 匿名结构体提取 payload |
| 11-12 | df-project | is_pure_badge_line 手写复杂 / 无 regex |
| 13-14 | df-types | 9 个 ID 别名 / MentionRef/Augmentation 未共用反序列化 |
| 15 | df-mcp | Box::leak 违背进程生命周期假设 |

---

## 按严重程度排序

### 安全漏洞（2 个）
1. **P0** DockerNode shell_quote 命令注入（`;` `|` `&` 未转义）
2. **P1** DockerNode volumes.host 用户可控注入

### 功能缺陷（3 个）
1. **P1** SubflowNode 不实际执行子 DAG
2. **P1** NotifyNode desktop 只是日志占位
3. **P1** df-mcp 未校验实体类型（跨实体误操作）

### 可维护性（18 个）
1. **P0** migrations.rs 89KB / coordinator.rs 65KB / context_helpers.rs 63KB
2. **P0** openai/anthropic_compat 双文件 112KB 重复
3. **P1** intent.rs 57KB / sanitize.rs 51KB / idea_repo 65KB 等
4. **P2** 各种 DRY 漂移、关键词硬编码

### 性能（2 个）
1. **P1** HttpNode 每次新建 Client
2. **P1** db.rs 单连接 Mutex 瓶颈

---

## 正面评价（亮点）

### 设计优秀
1. **状态机**: task_state_machine 从 TaskStatus::as_str() 派生常量 + 双源一致性测试
2. **CAS 原子写**: advance_status_atomic `WHERE status=expected` 防 TOCTOU
3. **HumanNode 拒绝语义化**: 审批拒绝从 Ok→Err，触发工作流 failed→退回
4. **AiSelfReviewNode 兜底**: verdict=unknown 不阻断，保持人定权
5. **conditions 求值失败保守 false**: 安全优先

### 架构合理
1. **df-ai-core 下沉**: trait+类型在轻量 crate，df-ideas 不引入 HTTP 重依赖
2. **impl_repo! 宏**: 消除 14 个 Repo 的重复样板
3. **WAL 模式**: 已启用，GUI + MCP 并发安全
4. **密钥管理**: keyring 迁移 + 失败计数 + 显示告警

### 测试覆盖
1. 每个节点文件都有配套测试
2. advance_task_atomic 有 20+ 测试覆盖各种状态转换
3. router.rs 全维度覆盖（10+ 测试）
4. retry.rs 覆盖首次成功/重试成功/耗尽/Fatal
5. MCP server 协议层完整测试

### 代码质量
1. 注释详尽，每处设计决策都有理由/替代方案/选型依据
2. 降级路径完整（LLM→启发式→兜底）
3. 锁中毒不 panic，返回保守默认值
4. SSE 解析器宽松 UTF-8 处理

---

## 改进优先级建议

### 立即修复（P0，7 个）
1. DockerNode shell_quote 命令注入（最快修，影响安全）
2. ai_node.rs schema/运行时不一致
3. ai_self_review_node.rs schema/运行时不一致
4. migrations.rs 拆分（89KB 单文件）
5. coordinator.rs 拆分（65KB 单文件）
6. context_helpers.rs 拆分（63KB 单文件）
7. openai/anthropic_compat 共享模块抽取

### 尽快修复（P1，20 个）
1. HumanNode timeout 默认值
2. HttpNode Client 复用
3. SubflowNode 功能完整
4. conditions.rs 拆分
5. df-mcp 实体类型校验
6. db.rs 连接池
7. keyring 迁移明文告警

### 后续迭代（P2，15 个）
1. 大文件拆分（intent/sanitize/idea_repo/task_repo）
2. DRY 漂移（shell_quote 共享）
3. 关键词配置化
4. relay 自动重连 supervisor