Files
DevFlow/docs/walkthrough-2026-08/00-汇总报告.md
T
lxy ef77120912 文档: 全库走查报告(walkthrough-2026-08,summary + 4 分方向)
4 workflow/35 维度走查产出:P0(2 已修)+ P1(4 修 + 2 专项登记)+ P2/P3 清单 +
推翻假设(AiChat 798 非 God / human_node 测试 76% 无债)。每发现 file:line 源码佐证。
2026-08-02 03:19:25 +08:00

159 lines
6.2 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.
# DevFlow 全量代码走查汇总报告
> 走查日期: 2026-08-02
> 范围: 12 个 crate, ~80 文件, ~1.2MB 源码
> 走查方式: 逐文件全量阅读 + 交叉引用 + 自动化分析
---
## 走查覆盖
| 模块 | 文件数 | 代码量 | 报告 |
|---|---|---|---|
| df-nodes(节点) | 17 | ~280KB | 01 ✅ |
| df-workflow(工作流引擎) | 11 | ~108KB | 02 ✅ |
| df-ai + df-ai-coreAI 核心) | 30 | ~555KB | 03 ✅ |
| df-storage(存储层) | 7 | ~150KB | 04+05 ✅ |
| df-ideas(灵感评估) | 7 | ~63KB | 04 ✅ |
| df-mcpMCP 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 份报告** |
---
## 问题汇总(按等级)
### 🔴 P07 个)
| # | 模块 | 文件 | 简述 |
|---|---|---|---|
| 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 个迁移函数应拆分到独立文件 |
### 🟡 P120 个)
| # | 模块 | 简述 |
|---|---|---|
| 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 鉴权,生产级需独立 |
### 🟢 P215 个)
| # | 模块 | 简述 |
|---|---|---|
| 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+类型在轻量 cratedf-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 处理
---
## 改进优先级建议
### 立即修复(P07 个)
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 共享模块抽取
### 尽快修复(P120 个)
1. HumanNode timeout 默认值
2. HttpNode Client 复用
3. SubflowNode 功能完整
4. conditions.rs 拆分
5. df-mcp 实体类型校验
6. db.rs 连接池
7. keyring 迁移明文告警
### 后续迭代(P215 个)
1. 大文件拆分(intent/sanitize/idea_repo/task_repo
2. DRY 漂移(shell_quote 共享)
3. 关键词配置化
4. relay 自动重连 supervisor