# DevFlow 全库走查报告(2026-08-02)

> 4 workflow / 35 维度 / df-nodes + AI 链路 + ideas + storage + 前端 + 基础设施 + 剩余模块 + UI/UX
> 走查原则(`code-review-anti-contamination`):只看代码,不信文档/会话描述,关键结论 file:line 源码佐证。

## P0(严重 bug,已修)

| # | 问题 | 位置 | 修复 |
|---|---|---|---|
| 1 | df-mcp update_idea/project/task 缺省字段被空串覆盖(部分更新丢 title) | crates/df-mcp/src/tools.rs | 回退 existing(fc249ad) |
| 2 | df-execute probe_pwsh 死缓存(两 OnceLock,Default 永返 PS5,Pwsh 全死代码) | crates/df-execute/src/shell.rs | OnceLock 单源 PWSH_CACHE(fc249ad) |

## P1(高优,4 修 + 2 专项登记)

| # | 问题 | 位置 | 状态 |
|---|---|---|---|
| 1 | df-mcp evaluate_idea 标 Low 却写库(read-only 仍改) | crates/df-mcp/src/tools.rs | ✅ 拆 evaluate(只读)+score(写)fc249ad |
| 2 | df-execute probe_pwsh 无超时挂起 + detect_shell 与 shell.rs 割裂 | shell.rs + env_snapshot.rs | ✅ 3s 超时 + 单源 fc249ad |
| 3 | ai_self_review build_review_prompt 直接拼 output_text(prompt 注入) | df-nodes/ai_self_review_node.rs | ✅ truncate + XML 标签隔离 fc249ad |
| 4 | MessageList + MessageItem 两套 AI 消息渲染(死代码+职责混乱) | src/components/ai/ | ✅ MessageItem 收敛 user-only f719546 |
| 5 | AI router 路由弱(context 死/weight 弱/意图误收敛砍 Data 工具) | crates/df-ai/src/router.rs + intent.rs | 📋 专项登记(memory `ai-router-sanitize-refactor-debt`) |
| 6 | sanitize step4 制造 orphan(依赖出口断言兜底) | crates/df-ai/src/context/sanitize.rs | 📋 专项登记(同上) |

## P2/P3(关键,后续按优先级)

| 问题 | 位置 | 级别 |
|---|---|---|
| status 无 union(types.ts AiMessage 无 status,AiMessageWithStatus 双份重复 + cast) | api/types.ts + AiChat.vue + MessageList.vue | P2 |
| useAiEvents/useToolCard/useAiSend 胖(900/730/500 行) | composables/ai/ | P2 |
| ApprovalPopup _placeholder hack + 审批 action 两套(path 浮窗缺 always) | views/ApprovalPopup.vue | P2 |
| df-nodes 6 节点未注册(git/http/docker/notify/subflow,实现完整不可达) | state.rs build_registry | P2 |
| parse_review_json(verdict 不规范/score 不 clamp/无正则兜底) | df-nodes/ai_node_helpers.rs | P2 |
| provider_pool 亲和不过 model.enabled | crates/df-ai/src/provider_pool.rs | P2 |
| df-mcp inputSchema required 形同虚设(handler arg_str_or 静默兜底) | crates/df-mcp/src/tools.rs | P2 |
| df-mcp bind_directory 路径校验弱(仅防 ..,无白名单) | crates/df-mcp/src/tools.rs | P2 |
| SubflowNode node_type() 用 &'static str 风格分裂 | df-nodes/subflow_node.rs | P3 |
| script_node 缺 R-PD-2 安全注释 | df-nodes/script_node.rs | P3 |

## 推翻假设(走查否定,更新认知)

- **AiChat.vue 798 行**(非 3000+ God 组件),已抽 5 批(消息列表/输入区/工具卡片/顶栏/侧栏),memory `fe-arch-tech-debt` 过时
- **human_node 36KB 是测试 76%**(实现 200 行内聚,无技术债),memory `devflow-workflow-approval-review` 头号 bug(human_node:41 缺 await)已修(line 55-64)+ 双回归测试

## 修复提交(本次走查)

- `fc249ad` 全库走查 P0+P1 后端(df-mcp 数据丢失/evaluate 拆 + df-execute probe_pwsh 死缓存/超时/单源 + ai_self_review 注入隔离 + generate_image 测试)
- `f719546` 前端走查 P1(MessageList/MessageItem 两套渲染收敛)

## 专项登记(核心,后续)

- **AI router + sanitize step4** — memory `ai-router-sanitize-refactor-debt`(核心模块,改风险大,后续专项)
- **run_agentic_loop 1217 行重构** — memory `agentic-loop-refactor-debt`(分步拆 finish_round_exit/build_runtime_prompt)

## 剩余

- 技能发送后未注入 — SkillResolver 日志(dffc4e4)已加,待打包后测 trace 定位(前端 skill 传?/name 匹配?/read 失败?)
- P2/P3 — 后续按优先级 + 用户反馈
