整理: docs 走查报告归档(walkthrough-2026-08 合并到 05-代码审查,删重复/空目录)

- 我的走查 5 文件(summary/nodes/ai_storage/ideas_frontend/infra)移 05-代码审查/(claude- 前缀区分 DevFlow AI)
- DevFlow AI 重复 3(00/04/05,与 05-代码审查/00-05 同主题)删
- walkthrough-2026-08/ + architecture/(空)删
This commit is contained in:
lxy
2026-08-02 10:49:46 +08:00
parent 8eb689af37
commit b7111fcabc
8 changed files with 0 additions and 304 deletions
@@ -0,0 +1,27 @@
# AI 链路 + storage 走查(方向2 + 4)
## AI Provider 路由(P1 专项登记)
- **P1**:estimated_context 死代码(router.rs:58,10 调用点恒传 0,上下文窗口过滤维度失效)。
- **P1**:weight 路由弱(默认 50,max_by_key 同权重返最后一个,顺序敏感无语义;intent suggested_model_tier 恒 None)。
- **P1**:意图误收敛(单关键词 conf=1.0,Code 收敛砍 Data 工具,list_projects/create_task 不可见,真做数据操作被带偏)。
- **P2**:provider_pool.rs:73-76 亲和不过 model.enabled(含禁用模型 provider 仍亲和优先)。
- **P3**:全 candidate 耗尽落库用 resolved_model(始终 primary,非实际失败 provider)。
## ContextManager(P1 专项登记)
- **P1**:sanitize step4 ensure_sequence_legal「首条非 user 一律 skip」会丢开头合法 assistant 工具三元组头(当 step0 裁掉开头 user)→ 其后 tool_result 变 orphan。step3.5 在 step4 前跑,无法预见。依赖下游 assert_placeholder_pairing 出口断言兜底(脆弱)。
- **P2**:drop_reverse_orphans 占位头固定工具名 "recovered_tool_call"(非真实工具,端点白名单校验可能拒)。
## SSE 流式 / agentic 循环
- SSE 断线重连/超时/看门狗健壮(对齐 memory `aichat-deadlock-governance`)。
- max_iterations 收敛/停止信号 MidStream/guard.reset 正确(本次会话修 G2 签名重复 + handshake 不杀 + 空 id 全局唯一)。
- run_agentic_loop 1217 行重构债 → memory `agentic-loop-refactor-debt`(专项)。
## storage 迁移/CRUD/WAL
- 迁移 V1-V21 幂等,migrate_v21 消息字段耦合(types.rs:73)已记录。
- CRUD 事务保护完整。update_task entity_type 校验(已知缺陷 B-260801-01)待修。
- WAL 模式启用,GUI + MCP 并发读写安全。
- settings 白名单完整。
@@ -0,0 +1,36 @@
# df-nodes 节点架构走查(方向1,7 维度)
## 节点接口一致性
- **10 生产节点**(AiNode/AiSelfReviewNode/GitNode/HttpNode/DockerNode/ScriptNode/SubflowNode/NotifyNode/HumanNode/TaskAdvanceNode)+ 1 测试 SleepNode。**全部正确 impl Node trait**(execute/schema/is_blocking/node_type + #[async_trait] + Send+Sync),签名一致。无 trait 偏离。
- **P2**:state.rs:586-614 build_registry 只注册 4/10(human/ai/ai_self_review/task_advance),6 节点(git/http/docker/notify/subflow/script)实现完整但不可达。script 有 R-PD-2 安全文档依据(刻意掐断),其余 5 个零文档。
- **P3**:SubflowNode node_type() 用 &'static str(其余 9 节点 &str),风格分裂。
- **P3**:script_node.rs:1 缺 R-PD-2「未注册」安全注释(文档承诺未落地)。
## human_node 36KB(推翻假设:无技术债)
- execute 函数体 139 行,职责内聚(配置解析 → subscribe-then-send 序约束 → select! 循环 Response/超时/取消)。**非职责过宽**。
- 36KB/833 行真实构成:实现 200 行(含详尽中文 why-注释)+ 测试 633 行(18 集成测 + 1 单测,76%)。**最大文件源于测试覆盖完整,非实现臃肿**。
- memory `devflow-workflow-approval-review` 头号 bug(human_node:41 缺 await)**已修**(line 55-64 `.send().await`),双回归测试(request_is_emitted_to_bus + end_to_end)。
## ai_self_review_node 21KB(P1,已修)
- **P1**:build_review_prompt(:50-69)直接 format task.description/output_text 进 user prompt,无隔离。**已修**(fc249ad):truncate_for_review_input(2000 字符) + XML 标签 `<task_output>` 隔离 + system 声明数据非指令。
- **P2**:parse_review_json(ai_node_helpers.rs:258-279)仅校验 verdict 存在,不校验取值/不 clamp score(0-10)/无正则兜底。verdict "Pass"/"PASS" → gate_should_block 精确匹配 "fail" 误判放行。
- **P2**:schema required=["task_id","provider_id"](:249)但 provider_id 实际可选(resolve_provider 空串走默认),required 冲突误导。
## task_advance_node 25KB
- 状态机调用正确,非法转换防护。与 memory `devflow-advance-task-dfnodes`(D-03 走 df-nodes Node trait)对齐。
## task_state_machine 16KB
- 状态转移矩阵完整。与 conv_state.rs ConvState 状态机是两套(任务状态 vs 对话状态),职责不同不冲突。
## 错误处理一致性
- 各节点错误类型统一(anyhow::Result<NodeError>),错误传播(?)正确。无明显 panic 风险。
## 并发安全
- HumanNode 是唯一 is_blocking=true,select! 循环处理 Response/超时/取消。cancel_tick 500ms 轮询(非事件驱动),但开销可忽略(O(1) HashMap lookup)。无死锁/竞争。
@@ -0,0 +1,28 @@
# ideas + 前端 + UI/UX 走查(方向3 + 5 + UI/UX)
## df-ideas 灵感评估
- scoring.rs 7 维度合理,权重可配置。关键词表(scoring_keywords.rs)无过时。
- adversarial.rs 29KB:正反方 prompt 设计有效,LLM 返回解析容错(parse_llm_eval 正则兜底)。启发式降级(无 AI)合理。
## 前端 AiChat.vue(推翻假设)
- **AiChat.vue 798 行**(非 3000+ God),已抽 5 批(MessageList/ChatInput/ToolCard/TopBar/Sidebar),template 仅 128 行编排。memory `fe-arch-tech-debt` 过时。
- **P2**:status 无 union(types.ts AiMessage 无 status,AiChat.vue:557 + MessageList.vue:519 各定义 AiMessageWithStatus 局部 interface + cast 读)。改 status 字面量时编译器不拦截。
- **P2**:useAiEvents(908)/useToolCard(731)/useAiSend(504)仍偏大(composables 层,非 AiChat 内)。
## MessageList/MessageItem(P1,已修)
- **P1**:MessageList:682-691 仅 user 挂 MessageItem,但 MessageItem 完整实现 assistant/system/error(死代码)+ 悬空 emits(regenerate/retry 父不接)。**已修**(f719546):MessageItem 收敛 user-only(301→175 行,删 AI/system/error 分支 + 悬空 emits + 孤立 props)。
## 组件一致性
- **P2**:ApprovalPopup.vue:112-116 _placeholder hack(绕 useToolCardHeader 签名)+ :218-255 审批 action 与 ToolCard 两套(path 浮窗缺 always 选项)。
- **P3**:SkillMention(chip+popover 合一)vs MentionPopover(纯 popover)职责不对称。
## 交互流/样式/i18n/状态态
- 交互流(技能/@ /审批/停止三态/流式)边界覆盖完整。键盘可达性(Esc/Enter/↑↓)。
- 样式 CSS 变量(--df-*)统一。z-index 层级(本次修 SkillMention 浮层定位)。
- i18n 中英完整。硬编码中文少(对齐 memory `i18n-message-compile-blindspot`)。
- 状态态(加载/空/错误)各页完整。
@@ -0,0 +1,43 @@
# 基础设施 + 剩余模块走查(方向6 + 剩余)
## df-mcp(P0+P1,已修)
- **P0**:update_* 整体替换清空缺省字段(LLM 部分更新丢 title)→ 回退 existing(fc249ad)。
- **P1**:evaluate_idea 标 Low 却写库(read-only 仍改)→ 拆 evaluate(只读)+score(写)fc249ad。
- **P2**:inputSchema required 形同虚设(handler arg_str_or 静默兜底)/ create_project status 默认 active 但实现 planning(ProjectStatus 无 active 变体)/ bind_directory 路径校验弱(仅防 ..,无白名单,对齐 memory `devflow-path-auth-three-tier`)。
- High 风险拒绝机制完整(server.rs dispatch + tools.rs handler 双层)。协议 JSON-RPC 2.0 正确。
## df-execute(P0+P1,已修)
- **P0**:probe_pwsh 死缓存(两 OnceLock,Default 永返 PS5)→ OnceLock 单源(fc249ad)。
- **P1**:probe_pwsh 无超时挂起(Windows Store Alias/杀软钩子致 status() 永阻塞)+ detect_shell 割裂 → 3s 超时 + shell 单源(fc249ad)。
- shell.rs/execute 流式 + CREATE_NO_WINDOW + 超时健壮。
## df-relay / df-tunnel(跨端)
- relay.rs 协议/握手/重连/心跳完整(对齐 memory `cross-end-rust-backend`)。
- tunnel.rs 24KB 隧道连接/断线/重连/事件透传正确。
## df-types
- augmentation.rs(21KB)/types.rs(17KB)类型定义完整。MentionRef/Augmentation/ContentPart 序列化正确。
- 消息字段迁移耦合(types.rs:73,migrate_v21 硬编码)已记录。
## df-project
- scan_helpers.rs 项目扫描/stack 探测正确(对齐 memory `devflow-project-path-binding`)。
## src-tauri 命令层
- IPC 参数校验/错误处理一致。与 ai 域边界清晰。
## df-workflow
- Node trait 与 df-nodes 关系正确(对齐 memory `devflow-advance-task-dfnodes` D-03)。
## 基础设施(错误/日志/测试/依赖)
- 错误类型:各 crate 用 anyhow/自定义 Result,未统一 thiserror(P3,可后续)。
- 日志:tracing 配置合理。api_key 脱敏(本次 get_app_config 复用 mask_api_key)。
- 测试:df-execute/df-mcp/df-nodes/df-ai 测试覆盖扎实(本次补多项回归)。
- 依赖:无过期/不必要依赖(本次 df-ai stream feature 已有)。
@@ -0,0 +1,57 @@
# 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 — 后续按优先级 + 用户反馈