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

> 走查日期: 2026-08-02
> 范围: 全部 12 个 crate + 1 个 src-tauri（入口），约 100+ 文件，~1.5MB 代码
> 走查方式: 逐文件全量阅读 + 交叉引用 + 架构分析

---

## 总览

| 报告 | 文件数 | 问题数 | P0 | P1 | P2 |
|---|---|---|---|---|---|
| 01-df-nodes | 17 | 20 | 3 | 7 | 10 |
| 02-df-workflow | 11 | 9 | 1 | 4 | 4 |
| 03-df-ai | 30 | 13 | 5 | 3 | 5 |
| 04-df-storage-ideas-mcp | 13 | 17 | 2 | 8 | 7 |
| 05-df-relay-tunnel-project-execute | 15 | 19 | 0 | 8 | 11 |
| **合计** | **86** | **78** | **11** | **30** | **37** |

---

## 按严重等级分布

### 🔴 P0（11 个，必须立即修）

| # | 模块 | 文件 | 问题 |
|---|---|---|---|
| 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-workflow | conditions.rs | 单引号 `''` 转义边界 bug |
| 5 | df-ai | openai_compat.rs(58KB) | 超大文件，应拆分 |
| 6 | df-ai | anthropic_compat.rs(54KB) | 超大文件，应拆分 |
| 7 | df-ai | context_helpers.rs(63KB) | 超大文件，应拆分 |
| 8 | df-ai | coordinator.rs(65KB) | 超大文件，应拆分 |
| 9 | df-ai | sanitize.rs(51KB) | 超大文件，应拆分 |
| 10 | df-storage | migrations.rs(89KB) | 超大文件，应拆分 |
| 11 | df-storage | models.rs(25KB) | 超大文件，应拆分 |

### 🟡 P1（30 个，尽快修）

主要分布：
- **df-nodes**: DockerNode 命令注入、HumanNode timeout 3600s 过长、SubflowNode 不执行子 DAG
- **df-ai**: intent.rs 57KB 大文件、router cost_tier 悬空、retry 硬编码
- **df-storage**: keyring 迁移失败保留明文、单连接 Mutex、idea_repo 65KB
- **df-ideas**: adversarial 启发式论点模板化、LLM 一致性未校验
- **df-mcp**: tools.rs 31KB 大文件、未校验实体类型
- **df-relay**: 单 token 鉴权、锁粒度粗
- **df-tunnel**: 无自动重连 supervisor
- **df-execute**: pwsh 探测时序风险、env_snapshot 卡死

### 🟢 P2（37 个，后续迭代）

技术债务、轻微代码异味、文档不足。

---

## 关键发现

### 1. 大文件问题突出（11 个 P0 中 6 个是大文件）

| 文件 | 行数 | 建议 |
|---|---|---|
| `migrations.rs` | 89KB/1914行 | 拆为 migrations/v1.rs~v37.rs |
| `coordinator.rs` | 65KB | 拆为 coordinator/tasks.rs + scheduler.rs + state.rs |
| `context_helpers.rs` | 63KB | 拆为 token_estimator.rs + config.rs + classify.rs |
| `openai_compat.rs` | 58KB | 拆为 protocol.rs + stream.rs + embed.rs |
| `anthropic_compat.rs` | 54KB | 同上 |
| `sanitize.rs` | 51KB | 拆为 sanitize/ 目录 |
| `idea_repo.rs` | 65KB | 拆为 IdeaRepo + KnowledgeRepo + KnowledgeEventsRepo |
| `task_repo.rs` | 42KB | 拆为常规 CRUD + advance_status_atomic 专用文件 |
| `intent.rs` | 57KB | 拆为多个意图分类文件 |
| `models.rs` | 25KB | 拆为 models/idea.rs + project.rs + task.rs + ai.rs |
| `tools.rs`(df-mcp) | 31KB | 拆为 tools/ 目录 |

### 2. 安全风险

- **P0**: DockerNode shell_quote 命令注入（`;` `|` `&` 未转义）
- **P1**: df-storage 单连接 Mutex 无并发保护
- **P1**: df-mcp 未校验实体类型（跨实体误操作）
- **P1**: keyring 迁移失败保留明文在 SQLite

### 3. 功能不完整

- **SubflowNode**: 只返回子 DAG 元数据，不实际执行
- **NotifyNode**: desktop 类型只是 tracing 日志占位
- **conditions-eval**: 934 行条件引擎写了但默认 feature 关闭
- **coordinator**: 65KB 多 Agent 协调但未接入主 loop
- **planner**: 38KB 规划器但 Phase 0 未接入主 loop

### 4. 设计优秀点

- **状态机**: task_state_machine 双源一致性测试锁定 + 原子 CAS 写
- **对抗评估**: 三路径降级 + 三角色辩论 + 容错解析
- **重试策略**: 指数退避 + jitter + Fatal/Retryable 分类 + 预算上限
- **SSE 解析器**: 宽松 UTF-8 + 三种分隔符兼容 + 1MB 缓冲区上限
- **密钥管理**: keyring 迁移 + 失败计数阈值 + 归一化校验
- **MCP 安全**: High 风险默认拒绝 + read-only 模式 + 双保险

---

## 修复优先级建议

### 立即修（P0，影响安全性/功能正确性）

1. **docker_node.rs shell_quote 命令注入** — 用 shell-escape crate 或手动转义所有元字符
2. **ai_node.rs + ai_self_review_node.rs schema 不一致** — 修正 required 字段
3. **6 个大文件拆分** — 按模块拆分为多文件

### 尽快修（P1，影响稳定性/可维护性）

1. HumanNode timeout 默认值 3600s 过长 → 改为 1800s
2. SubflowNode 不执行子 DAG → 补递归执行
3. HttpNode 每次新建 Client → 复用连接池
4. df-mcp 未校验实体类型 → 对齐 B-260801-01 修复
5. keyring 迁移失败保留明文 → 加 AES fallback 或更强告警

### 后续迭代（P2）

1. 大文件拆分持续推进
2. conditions-eval 默认开启
3. NotifyNode desktop 集成 tauri-plugin-notification
4. ScriptNode dangerous_keywords 配置化
5. 自动重连 supervisor（df-tunnel）