76 KiB
DevFlow 工作看板
来源:
docs/02-架构设计/滚动规范/功能决策记录-2026-06-14.md「需求与待办」+PROGRESS.md各 Sprint 遗留,2026-06-14 汇总去重 + 代码核对修正。 互操作:执行走 mission-control,回写 mission_id;审查走 cr;发布走 publish-*。 核对说明:2026-06-14 经代码勘察后修正——detached 卡死已部分修复降 P2、Sprint 19 遗留 3 项补入、依赖关系标注。2026-06-18 归档: 已完成
[x]与历史分析段已迁至 07-项目管理/todo归档/2026-06-18.md。 2026-06-27 归档: 已完成[x]/✅项已迁至 07-项目管理/todo归档/2026-06-27.md。2026-08-05 编号碰撞登记:
F-260619-03被两个特性复用(消息拆分存储=文档本体 + AI工具路径授权=复用)。子代理审查确认:改 18 处编号无实际价值有风险,暂不改代码,后续新增注释编号统一走日期+序号体系、避免复用已有编号。路径授权若后续单独立项再独立编号。 2026-08-15 编号碰撞登记:REFACTOR-260619-04被复用(父③③.2 审批状态机拆分=待办 vs ToolCard 拆分=已完成)。后续引用审批状态机拆分时用「审批状态机拆分」描述,不再沿用该编号。
💡 2026-08-04 父子任务支持(✅ 已完成)
目标:完成父任务/子任务的完整支持(数据→后端→前端),UI/UX 重点设计。 详情:04-功能迭代/父子任务支持设计-2026-08-04.md
- 后端 ✅ 父聚合下沉 df-nodes 共享层(
recompute_parent_status/advance_task_with_parent),IPC/AI 工具/MCP 三方统一;df-mcp create_task 支持 parent_id(1 级嵌套校验);delete_task 级联软删子任务(返回{ok,cascaded}) - 前端 ✅ Tasks.vue 树形列表(折叠箭头+📑图标+子进度徽章 n/m+迷你进度条+缩进竖线圆点);新建弹窗「父任务」下拉(项目锁定);TaskDetail 父面包屑+子任务面板(进度条+快捷推进+添加子任务);i18n zh/en 双份
- 核查 ✅ cargo check(df-nodes/df-mcp/src-tauri 三 crate) + vue-tsc 全部通过
💡 2026-06-27 对话上下文透明化(✅ 全部完成)
用户看不到 AI 接收到的上下文信息(目标钉扎/enrichment/system_prompt),导致行为不可理解。
- L1 目标可见 ✅ 对话顶部显示当前 pinned_goals 列表(TopBar.vue 🎯 图标,可查看/清理)
- L2 Enrichment 可见 ✅ @[项目] 发送前展开 enrichment 摘要(ChatInput.vue enrichment 预览面板,展开/收起/取消关联)
- L3 完整上下文 ✅ 可展开面板查看 system_prompt / augmentations(TopBar.vue 底部 context 面板)
💡 2026-06-27 统一 Inbox 设计(讨论产出)
思路:所有需要用户注意的事项(审批/知识待审/灵感确认/其他通知)集中到一个统一入口, 不阻塞对话。
审批留在对话内(需要即时上下文),知识/灵感/通知放 Inbox。 后续做详细设计方案。
🎯 统一规划(2026-06-26 全景)
整合知识图谱设计 + 22 条未完成项 + G1 目标钉扎(✅已落地) + 多工程方案。 核心主线:AI Working — AI 拥有项目知识图谱,自主分解/编排/执行/自检,人只决策。 执行策略(两阶段):① 先攒批无冲突小 bug/小调整 → 提交;② workflow 编排相关任务批量推进大重构(减少文件读取/LLM 交互,提高上下文效率)。
主线脉络
G1目标钉扎(✅已落地) → 知识图谱Phase1(任务网络,AI编排地基)
↓ ↓
实测验证
↓ ↑
F-09多会话B(立项) ────────────────┘ (Phase4前置:多会话各自注入)
任务图谱(DAG · 有方向有状态)
节点=任务(着色=状态),边=依赖方向(前置 → 后继)。推进时更新状态(CLI/edit 同步此表 + Mermaid)。 图例:✅完成 / 🔨进行中 / 📋待办 / 🚫阻塞
graph TD
classDef done fill:#bfb,stroke:#393,stroke-width:2px
classDef doing fill:#ffd,stroke:#993,stroke-width:2px
classDef todo fill:#eef,stroke:#99c
classDef blocked fill:#fcc,stroke:#c33
G1["G1 目标钉扎<br/>✅代码 8ce18cb"]:::done
P1["父① 小bug攒批<br/>✅①.2/①.3(①.1过时·①.4归⑤)"]:::done
P2["父② 知识图谱Phase1<br/>✅Phase1(数据层+业务层)"]:::done
P3["父③ AI对话体验<br/>📋待办"]:::todo
P4["父④ F-09 per-conv<br/>✅前端per-conv(accessor)"]:::done
P5["父⑤ 灵感模块<br/>✅完成(⑤.1/①.4/⑤.2)"]:::done
P6["父⑥ Phase2-5<br/>🔨Phase2-3✅·4-5待办"]:::doing
P7["父⑦ 技术债<br/>📋待办"]:::todo
P1 -.先行.-> P2
G1 ==基建==> P6
P2 ==> P6
P4 ==> P6
P2 -.task_links.-> P5
| 任务 | 状态 | 子项 | 依赖(前置) |
|---|---|---|---|
| G1 目标钉扎 | ✅ 代码已落地 | G1/G2/G4 落地 | — |
| 父① 小bug攒批 | ✅ 完成 | ①.2 白名单✅(settings.rs) / ①.3 priority✅(idea.rs) / ①.1 BUG层1❌过时(F-260619-03 方案①取代,层2待决策) / ①.4 雷达图→归父⑤ | — |
| 父② 知识图谱Phase1 | ✅ Phase1完成 | ②.1 V29迁移✅ / ②.2 TaskRecord+TaskLinkRepo✅ / ②.3 IPC(create_task扩展+task_link CRUD+move_queue+get_tree)✅ / ②.4 父聚合✅(set_status_for_aggregation绕status收口) / ②.5 AI工具6✅(基线38) | G1(弱) |
| 父③ AI对话体验 | 🔨 ③.1✅ / ③.2待办 | ③.1 B-260619-04 ToolCard✅(跨轮收起已有+标题增强) / ③.2 REFACTOR-260619-04 审批状态机拆分 / 对话透明化 L1🟡待定 | — |
| 父④ F-09 per-conv | ✅ 全部落地(2026-08-07 核验) | ④.1 streaming/currentText per-conv Map(accessor委派,单会话回归零变化,BUG-260624-01根因清除,vue-tsc 0) | — |
| 父⑤ 灵感模块 | ✅ 完成 | ⑤.1 软删除✅ / ①.4 雷达图✅ / ⑤.2 #05✅/#06拆const✅/#09/#10表单(逗号tags)✅ / #07 DEC-02保留purge(不改) / 附:priority_from_i32跨层映射修复(对齐前端0=critical) | #07→②.1 |
| 父⑥ Phase2-5 | 🔨 Phase4 注入进行中 | ⑥.1事件流✅(V30) / ⑥.2基础设施✅(V31) / ⑥.3注入✅(resolver 增强+extra 渲染) / ⑥.4前端(C 方案展开摘要✅已决待实施) | |
| 父⑦ 技术债 | 📋 待办 | SMELL-P1-6 / conditions / CR缓存 / UX分页 / 审批超时 / miniapp / 双监听器 | — (穿插) |
推进路径:父①先行(攒批提交)→ 父②主线 workflow → 父③/④并行 → 父⑤/⑥/⑦穿插。每父任务一个 workflow 批,子任务相关文件批量读改减少交互。状态更新约定:子项完成→父状态 🔨;全子完成→父 ✅;每批提交后同步此表。
协同点(跨主题复用)
- IDEA-FIX-07 关联单向 ↔ 知识图谱
task_links:并入 Phase 1 用独立表(§2.2 论证 JSON 缺陷),别补 JSON 双向同步 - G1 system_prompt 注入基建 ↔ Phase 4 L0 注入:复用
pinned_goal拼接链路 - F-09 per-conv ↔ Phase 4 多会话注入:F-09 前置
- REFACTOR-260619-04 审批状态机 ↔
queue=decision待决策池:审批对齐
交接状态(2026-06-14)
代码健康度:cargo test --workspace 全过、npx vue-tsc --noEmit 0 error(主代理独立验证,非 mission 自报)。
工作区状态(重要):git diff 104 文件(8066+/6941-)是三层混合——①会话前未提交基线(Sprint 19 等大量工作:i18n 拆目录、knowledge 全栈、Settings 拆分、appSettings 迁移…)②本次会话重构 ③代理越权修复。接手前务必 git diff 通览区分,勿整体当作单一改动提交。
本次会话完成:
- 重构(用户授权):删 5 僵尸 crate(df-evolve/plugin/stages/task/traceability)、清 7 死模块(df-execute docker/git_ops/ssh + df-project scheduler/timeline/context + df-ideas graph)、拆 ai.rs→
commands/ai/11 文件、拆 ai.ts→6 composable、models 字段 bug 修复、coordinator B 路线标注 - 代理越权追加修复 6 处(已标✅,主代理验证编译+测试通过;逐行正确性建议接手方
git diff复核):B-01 审批持久化 / B-02 ConditionEngine 默认 false / B-04 删 NodeRegistry Default impl / T-05 工具结果截断 50KB / B-08 promote 补偿删除 / T-07 诊断日志清理
待设计交其他会话(核心):df-workflow 审批闭环三连 B-06/B-07/B-03。✅ B-03 设计已完成(接手会话,2026-06-14):见 B-03-人工审批响应机制-2026-06-14.md,通道选型定为 工作流独立审批通道(复用 EventBus broadcast + HumanApprovalResponse 事件 + approve_human_approval IPC,非 ai.rs AiApprovalRequired——后者是 AI Chat 工具审批路径,与工作流节点审批是两条独立链路)。拆 B-03a(响应等待 + 超时,不依赖 B-07)/ B-03b(取消机制)。B-06 / B-07 仍待实施(B-06 = execution_id 下沉并发隔离;B-07 = 共享 StateMachine 取消前置),是 B-03a 并发安全 / B-03b 的前置。
失控代理教训:本次会话派的后台拆分代理在 stop hook 循环里失控,越权改代码/文档(先斩后奏)。接手方若再派 agent,注意约束其不碰决策记录(用户已要求手动触发)+ 限定单任务不自主续推。
待办
🔍 2026-06-21 AI Chat 技术债审查(workflow wf_92b61c35-4d2 · 10 模块串行 grep 核验)
详单见 aichat-技术债审查-2026-06-21.md。0 P0 / 7 P1 / 25 P2 / 40 P3 / 已登记 8 / 新债 64。P1#5/#6 已即时修并自验过。
[2026-06-24 核验销账]: try_continue pending_conv_id 🟡语义复杂(R-PD-6 优先审批 conv_id 设计+try_continue 回退,非确定性低风险)/ MidStream chunk.error 🟡UX 结构变更(Partial 保文加 err 字段+前端渲染,非 bug)/ auto-compress save 🟡需理解 loop save 时机判真缺口。
销账核对(已登记 8 复核):SMELL-P1-6(line221·#5 覆盖 executed/completed 双轨)/ MED-1(tool_registry:546 bind_directory)/ REFACTOR-260619-08(tool_registry:881 拆)/ REFACTOR-260619-09(context.rs:1 God 1552行)/ ARC-260619-05(agentic:318 超长)/ UX-260617-28(双监听器 INFO)。均仍在未完成,审查复核确认,保留。
残留诊断代码(待清):chat.rs authz_debug/authz-debug.log(L2 调试遗留,P2 报 chat.rs:548 硬编码绝对路径),L2 完成后可清。
🔍 2026-06-21 查询能力缺口 + run_workflow 缺陷(本轮排查登记·未实施)
用户排查任务/项目/灵感查询能力现状,登记缺口为待办/缺陷,本轮不实施代码。详单见 查询能力补全方案-2026-06-21.md。
📋 编排推进总览(2026-06-18 更新)
未完成待办按可执行性分 8 组(详细条目见下方各分类,勿重复记录):
| 组 | 说明 | 代表项 |
|---|---|---|
| A todo 卫生 | 矛盾清理/被取代退役标注 | ✅ 本批已完成 |
| B 零风险减法 | 死链清/空壳合并 | ✅ 本批已完成 |
| C 需用户输入 | 阻塞,无法代办 | —(已归档) |
| D 功能增强 | 设计清晰可推进(P1) | F-15-01 审批选项 / F-15-02 task 详情 / F-15-03 分页⚠️breaking / F-15-04 卡片折叠 |
| E 架构重投入 | 需设计,非小改 | F-14-01 模型能力 / F-14-07 trait 下沉 / ARC-05·06 store 拆·循环依赖 |
| F 全局 review P2 需设计 | 安全/竞态收口 | R-PD-4/5/6/8/9/12/13 + R-PD-10 .map_err 85 处 |
| H 长期功能池 | 不进主线 | F-14-02~10 / T-14-06 Settings 拆 / T-14-11 条件引擎 / B-14-05 / B-03b-R9 |
推进原则:能并行不串行(独立子任务 8-12 并发);每批重汇总+全优先级重排+销账核对 ✅;C 组阻塞项不代办等用户。本会话首批:A 卫生 + B 清死链。
③④C类已迁(2026-06-16):需人工决策项(③产品取舍 7 / ④设计方向 7 / 重投入排期 9 / C用户实测 5)见 待决策.md,从本文件抽离职责分离。batch54 可自主批进展(2026-06-16·workflow wsfz7zl8i + 主代核查):复核-新⑪ 看门狗幽灵 ✅ 销账(清主窗口 state 视觉残留;核验更正:原 watchdog 幽灵已被 CR-260615-24 stopListener:371 clearStreamWatchdog 兜底);AE-03 diff预览 ⚠️ 降级阻塞(后端 write_file 未返 diff,待后端补,见 line 538);UX-04 断线保文 待 DEC-260616-03 授权(见待决策.md 🟡,本批不含)。
📦 已完成项归档: 07-项目管理/todo归档/2026-06.md — 2026-06-18 拆分, 已完成
[x]与历史分析段迁此。另有 2026-06-18.md / 2026-06-27.md — 本次归档。
🔴 2026-06-20 BUG-260620-05 F-260619-03 工程内路径误弹窗(reload_allowed_dirs 丢 workspace_root·b22e9ae 回归)
现象:AI Chat file_info 等文件工具访问工程内路径(如 docs/02-架构设计/单对话并行多轮-设计-2026-06-20.md)触发授权弹窗,用户称"本来就有访问权限,为什么还来申请"。
根因:state.rs:586-619 reload_allowed_dirs 合并 kv_dirs(KV allowed_dirs)+ project_dirs(projects.bind_directory) 为 all_dirs,仅当 all_dirs.is_empty() 时(:618)才插入 workspace_root。KV 配过 allowed_dirs 或有绑定项目 → all_dirs 非空 → workspace_root 不入 persistent → 工程内路径(在 workspace_root 下)is_authorized(:356 starts_with)失败 → check_path_authorization 返 NeedsAuthorization → 弹窗。
注释承诺失配::346-348 / :583 / :617 注释均称"KV 未配时保持 workspace_root 免授权(向后兼容)",但 :618 条件用 all_dirs(含 project_dirs),project_dirs 非空也丢 root。b22e9ae "reload 尊重用户 persistent" 引入的回归。
用户政策指令(2026-06-20):"默认直接访问,明确知道无权限才申请"。指向工程内(workspace_root 下)默认免授权,仅 workspace_root 外非白名单路径才弹窗。
修法(层1·1 行确定性 bug):state.rs:618 去掉 if all_dirs.is_empty() 条件包裹,无条件 set.insert(workspace_root_path())(工程内始终免授权,对齐用户政策 + 注释承诺)。不破坏现有能力:workspace_root 经 set/get_allowed_dirs(:664/680 filter root)本就不可见不可删,"用户删 root"语义未落地,保 root 无冲突。
层2 待决策(政策范围):用户"默认直接访问"是否要求更宽语义——workspace_root 外的非黑名单路径也默认放行(翻转 is_authorized 为黑名单制,实质去白名单)?涉 P0 去固定根决策方向,见待决策.md。dev 自用场景层1 即满足。
关联:F-260619-03(todo :528 b22e9ae 回归源)/ 待决策 workspace_root 分发适配(方案b 用户项目绑定)/ memory devflow-project-path-binding
状态:✅ 已实施(层1 无条件插入 workspace_root + 层2 白名单制 persistent/session/once + 黑名单兼底,对齐 2026-06-28 用户决策)
💡 2026-06-16 新需求(已分析·待实施)
功能需求,已走查定位链路 + 方案记录,待用户确认后实施。
-
F-260616-09 [P1/架构·✅2026-08-07全部落地销账 | A路线✅(batch60 + 06-19核验补漏已落地:commands.rs:1404/useAiConversations.ts:80 → 阶段1跳过),B 设计完成 2026-06-19(F-09设计文档)·阶段2 批1-8 待拍板 b-1(messages per-conv)启动(见待决策.md)·messages per-conv 已落地(2026-06-20 核验):mod.rs:326
pub per_conv: HashMap<String, PerConvState>+ :384conv(&mut self, conv_id)访问器 + :394conv_read+tests_f09_per_conv测试模块 + 决策e 真并发已上线(见文件末 F-09 决策e 段,CR-260620-02 审 PASS)****] — AiSession 单例 → 多会话并发架构(多窗口来回切 + 并行执行)。用户需求(3 条消息强化):「应用级支持同时具备多会话」+「同时具备多会话的能力」+「多个会话窗口来回切,并行执行」。现状(Explore 走查确认):AiSession应用级单例(state.rs:164ai_session: Arc<Mutex<AiSession>>,init:205),messages/generating/stop_flag/pending_approvals/agent_language 全一份。设计「单例 + 软隔离」——generating 互斥(同一时刻只一个对话能跑) + 切换旧 loop 退出(agentic.rs:177-190B-260615-11) + 切换时 generating→readonly(commands.rs:873-881)。llm_concurrencyper_conv 因此退化为单对话内并发(state.rs:93-96注释已标注预留改 HashMap)。memory 已标记「AiSession 单例未动」架构债(aichat-arch-extensibility)。残留 bug(表象=新建会话上下文残留):前端newConversation(useAiConversations.ts:31-41) 漏清 queue/generatingConvId/agentRound/searchQuery;后端ai_conversation_create(commands.rs:784-821) 漏清 agent_language/stop_flag(设 true 停旧 loop 没复位 false)。用户「并行执行」明确=B 方向(A 只解切换残留不满足并行)。分档:A 短期隔离修复(补漏清字段,维持单例软隔离,解残留,低风险立即做,B 前置) + B 多会话并发架构(单例 →HashMap<conv_id, SessionState>,每会话独立 messages/generating/stop_flag/pending_approvals + llm_concurrency per_conv 改真 per-conv HashMap + loop 内校验改 conv_id 索引各自 session + 切换不退出旧 loop 各自跑完真并发 + 事件路由核对 conversation_id 全覆盖)。决策点(待定):(a) A 先做解燃眉 vs 直接 B——倾向 A 先(残留真 bug 立即解,B 架构另立项) (b) B 形态——AiSession 整体 HashMap vs 拆字段(messages/pending 已可按 conv reload,只拆 generating/stop_flag per-conv)——倾向后者侵入小 (c) B 并发上限——复用 llm_concurrency.global 限并发会话数防 token 暴增——倾向是 (d) 多窗口 UI 形态——(d1) 单面板侧栏会话列表切换+后台并行(改动小) vs (d2) 每会话独立 Tauri 窗口(useAiWindow.tsdetached 已有基础可扩,改动大但「窗口来回切」语义最贴)——待用户定,倾向先 d1 后 d2 (e) 旧 loop 切换处理——不退出各自跑完(真并发,倾向) vs 仍退出。— state.rs(AiSession 去单例化) + commands.rs(create/switch 重构 + 漏清补) + agentic.rs(:177-190 校验改 conv_id 索引) + context.rs(ContextManager per-conv) + useAiConversations.ts(漏清补) + stores/ai.ts(per-conv state) + llm_concurrency per_conv + useAiWindow.ts(若 d2 多窗口)。B 是大改架构升级,需单独设计文档 + 立项。✅ 已决(2026-06-16·待决策归档):a — A 隔离修复 + B 立项(🔥 B 阶段高优先级尽快实施),UI d1+d2 都做(侧栏切换 + 独立 Tauri 窗口)。✅ 2026-08-07 核验销账(F-09 B 阶段全部落地):三方独立核验(2 agent + 主代 grep 抽查)确认 06-19 草案所有改造点(§4.1-4.7)已落地,且代码超出草案:① AiSession 去单例 →
per_conv: HashMap<String, PerConvState>(mod.rs:593,顶层会话级字段全删)② ConvStateStore DashMap 无锁(治 guard.reset 锁竞争卡死连环)③ 三处退出校验改 conv 存在性(agentic/mod.rs 7 处,零旧active_conversation_id != conv_id残留)④ GeneratingGuard per-conv + loop_epoch owner token(F1 治同 conv 双 loop 竞态)⑤ last_heartbeat 心跳(F2 治卡死兜底误判)⑥ IPC 全加 conv_id + ConvStateStore 零锁读(switch 删 readonly / create 不杀旧 loop)⑦ 前端 convStates Map(enum 轨替代 bool Set)+ d2 多窗口(useAiWindow.tsai-detached-${convId})已落地。剩余仅 B 路线 Phase3 单对话并行多轮(per_sub_flow占位未接,另线 aichat-b-route-parallel-multiround)。c-1 决策已被用户「不设并发会话上限」推翻作废。 -
F-260616-12 [P2] ✅ 已核验无问题:F-09 batch5 修正后 global permit 已移除(用户决策不设会话数上限),retry 仅持 per_conv permit(同 loop 内防自己挤占合理),代码注释标注 F-260616-12 核验通过。— 原 agentic.rs:238 重试持 permit 说法在 F-09 batch5 重构后已不适用。
🔴 aichat API Key 401 排查(2026-06-16)
用户报对话失败「调用失败: API Key 无效或无权限」+ 重设 key 无效。排查结论:代码链路全对(保存 keyring✓ / 读取 resolve_provider_secret✓ / 鉴权头 openai=Bearer·anthropic=x-api-key✓ / URL 智能拼接✓),401 来自服务端,非 devflow bug。根因四选一(key 无效 / provider_type 不匹配 / base_url 错 / model 名错)。详见 aichat-apikey-401排查-2026-06-15.md。
- S-260615-01 — ✅ 已解决(2026-08-09 用户确认):API Key 401 根因已定位解决,此待用户确认项销账。原为「用户跑直连测试(curl)区分 key/provider_type/base_url/model 哪项错」
🟦 架构审查待修项(2026-06-16)
纯架构层评估(边界/依赖/抽象/扩展性/状态管理),详见 架构审查-2026-06-15.md。共 🔴6 🟡6 ⚪4 + 亮点 6。与 06-14 三份报告去重(不重复 bug/性能 FR-、aichat AR-)。
中期(技术债) ✅ ARC-260615-07 已决策:缓做(d归F-09B,其余ROI低不实施)
P1 — 重要缺陷
🔴 架构坏味道全面扫描(2026-06-18·6路并行 Explore agent·57K行代码)
来源: God文件/长函数 + 循环依赖/耦合 + DRY违反 + 错误处理不一致 + 命名API/类型安全 + 测试覆盖/死代码。6 维度全覆盖。
🟡 P1 应该改进 (9项):
✅ SMELL-P1-6 — [P1🟢 已决·待推进] String 类型滥用替 newtype/enum —— execution_id/status/tool_type 等 5+ 处改强类型(b 路线:仅 Rust 内部 newtype)
🆕 sweep 派生登记(2026-06-18·workflow w2xkw4ybh data 抽出 + wo7d6zdqm 多维度 sweep):
- ✅ conditions 条件引擎 — ✅ 全部完成:引擎完备+feature flag 默认开+executor 集成+前端 UI(WorkflowDagDisplay.vue 可编辑)+i18n 补齐
🟡 AI Chat 交互体验改进(2026-06-14 方案 → 待办化)
来源:aichat交互体验改进方案-2026-06-14.md。7 大类 20 个改进项,按原文优先级分 4 批。去重:§1.3 复制 ⊂ F-260615-13/14(已写)、§3.4 新建中断 ⊂ B-260615-10(已做软复位,本文档加 confirm 增强)、§6.2 分离窗口同步 ⊂ CR-24/25(已写)。状态: 待讨论→看板跟踪。
第三批 — 锦上添花
- UX-2025-12 [P2] ✅ 后端分页已落地(2026-06-28):ai_messages 加 list_recent 分页查询方法 + ai_conversation_load_more IPC + switch 返回最近 50 条 + has_more/earliest_seq 游标。前端滚顶加载 UI 待后续补充。
待澄清 / A-B 待定
- S-260614-01 — ✅ 已销账(并入 F-09,F-09 B 阶段 2026-08-07 全部落地)。[用户已澄清 2026-06-17] 「显示多开」= 多个会话来回切都可对话(非 AI Chat 窗口多开)。✅ 已并入 F-260616-09(已决 a):A 路线已实施,B 高优先立项,详见待决策归档/2026-06.md
ℹ️ 架构观察(INFO · 2 项·不进修复队列)
- ✅ UX-260617-28 [INFO] — 已决策:现状够用,不出问题不升级
🔧 2026-06-19 文件拆分升级(核验结论:全部完成)
2026-06-28 核验:三项 God 文件拆分已全部完成:
- tool_registry.rs ✅ 1091行单函数已拆为按域注册函数
- AiChat.vue ✅ 4026→767行(已抽子组件)
- crud.rs ✅ 2212→拆为
crud/下11个文件
P1 ToolCard 拆分(已核验完成)
- REFACTOR-260619-04 [P1] ✅ ToolCard.vue 拆分完成:
- ToolCard.vue 1527→373行
ToolResultBody.vue+useToolCardHeader.ts(160行) +useToolCardRender.ts(45行)useToolApproval.ts(审批状态机独立,220行,B-260616-08 loading/挂起时长/toast 完整)useToolCard.ts(666行,通用工具函数) — 原 ToolCard 组件拆分的目标全部到位
P2 暂缓(窗口未到/收益低)
- REFACTOR-260619-09 [P2 暂缓] — context.rs(1332)等 F-15 压缩链路稳定再拆。生产 745+测试 587。当前 context.rs 被压缩频繁改动,拆分窗口未到。—
crates/df-ai/src/context.rs
🔧 2026-06-19 ToolCard 同批/跨轮 UI 合并(子代理方案·其他会话实施·P1)
用户需求:AI 多轮 read_file(轮1×2 + 轮2×2)前端一排展开卡片("上面两个下面两个"),希望 UI 合并。后端 convert 已合并连续 tool_result(B-260619-03),前端展示层对齐。子代理分析:同批同类合并已存在(ToolCardList groupedToolCalls L92-110,calls>=2 显标题行+默认收起),痛点是跨轮(轮1/轮2 各独立 ToolCardList 实例→各成分组)。用户强调"谨慎不出错"。
- B-260619-04 [P1] ✅ ToolCard UI 合并方案 A 全部落地:
- 现状(已查清):
ToolCardList.vuegroupedToolCalls 按 tc.name 全局聚合,calls>=2 显「[图标] 读取文件 [N] ▸」标题行 + 默认收起(initDefaultCollapse L139-147)。同批 read_file×2 应已是折叠组;用户「下面又两个」=下一轮新 message 的独立 ToolCardList 实例→第二个分组(跨轮未合并)。 - ✅ 步骤 ① 标题信息增强(已落地):groupFileSummary(group) 从 group.calls[].args.path 取前 2-3 个 shortPath 截断显示(“读取 2 个文件 · shortPath1 · shortPath2”),模板已渲染。
- ⏸️ 步骤 ③ 新轮到达自动收起旧轮:当前跨轮收起未实现,保留作为低优先增量需求(需在 AiChat.vue watch messages 调 collapseCompletedGroups,风险中)。
- 不推荐方案 B(跨轮全局合并,破坏 message 边界,审批/折叠重构高风险)/ C(纯视觉框,不解决占用)。
—
src/components/ToolCardList.vue
- 现状(已查清):
💡 灵感模块-来源采集/追溯(2026-06-21·待办·新功能范畴)
继批1-3c 升级后的下一步:灵感来源录入增强 + 自动采集机制。属新功能范畴,需独立设计采集规则/触发/去重,下一阶段推进。
- F-260621-01 [P2/新功能] ✅ source 录入增强已落地(灵感捕捉模态框已含 source/tags/priority 输入字段,逗号分隔 tags 转 JSON):
- ✅ source 录入增强:灵感捕捉模态框已加
source/tags/priority输入,录入即结构化 - ⏸️ 自动采集机制:从对话/任务/代码中自动提炼灵感 —— 需独立设计采集规则/触发/去重,属下一阶段新功能
- 需设计:采集规则(什么信号算灵感 — 关键词/意图/重复模式)/ 触发时机(对话结束/任务完成/手动触发)/ 去重(相似灵感合并避免洪水)/ 用户确认流(自动采集不污染灵感池,需用户确认入库)
- 依赖:批1-3c 升级完成(已有 source/tags 字段基础 ✅) + 对话历史可读(F-15 archived_segment 状态 ✅) + 任务可读 ✅
- 关联:memory devflow-idea-module / [aichat-skill-slash-autocomplete]
- ✅ source 录入增强:灵感捕捉模态框已加
F-260620-01 跨端 AI Chat:微信小程序 ↔ Rust 云后端 ↔ DevFlow 桌面端
背景:微信小程序远程用 DevFlow AI Chat,桌面端与小程序双向实时同步(微信电脑+手机同时在线模式)。 设计:F-260620-01-跨端AIChat-微信小程序-2026-06-20.md(三层架构 df-tunnel/df-relay/df-miniapp + Rust 云后端选型) 关系:灵感 4495fbcd(选型论证,pending_review)+ 任务 6c816709(todo)
实施分阶段:
- P1 df-relay 云后端(axum WS Server + 广播中继 + 鉴权)— 无依赖
- P2 df-tunnel 桌面端(WS client + 事件桥接 ai-chat-event 透传 + 指令路由 + 配对绑定)— 依赖 P1
- P3 df-miniapp 小程序(前端 UI 复用 + WSS 连云)— 依赖 P1/P2
- P4 双向同步完善(冲突处理 + 安全 + 离线降级 + 部署)— 依赖 P1/P2/P3
Phase3 联调待办(D1-D6 决策点推荐:A纯透传 / 全19变体透传 / EventBus汇聚 / switch不处理 / 强类型保留 / 桥接层R1兜底):
🔍 2026-06-22 miniapp 功能走查(workflow wf_ddd49ac8 · 5 域并行核验 + 主代终态抽查)
用户 /review miniapp + workflow 汇总安排。5 agent 独立 grep/read 核验源码(不信注释/文档) + 主代终态核验(ws.ts 真路径
src/api/ws.ts、relay.rs:255/355、remote_bridge 命令数 10 非 11)。18 findings → 去重 P1×5 / P2×3 / P3×1,2 项 refuted。关联 F-260620-01 阶段4(真机联调前置)。守 session-role-diagnose-only:本会话仅走查 + 登记,未实施代码。
P1(阻塞真机/可靠性·5 项):
- P1-D-260622 [P1] ✅ config 持久化已实现:
setConfig接入uni.setStorageSync,懒加载从 storage 读回退 defaultConfig,新增resetConfig清除。—apps/df-miniapp/src/config.ts - P1-A-260622 [P1] ✅ 心跳 pong 闭环已实现:relay 识别
{control_kind:"ping"}构造 pong 回 miniapp(不经 device 透传),miniapplastInboundAt更新看门狗治半连接挂死。—crates/df-relay/src/relay.rs+apps/df-miniapp/src/api/ws.ts+apps/df-miniapp/src/composables/useAiChat.ts
用户补充核验(2026-06-22 用户详读源码+设计文档,主代逐项核源码判真伪):
⚠️ 用户分析 P0 三项(协议三重不匹配 / EventBus 未接 / 桥接层占位)经源码核验全部失实,系基于 Phase3 阶段1-3 落地前的设计文档「计划态」描述,未核当前代码。证据:
- P0-1 协议:
crates/df-tunnel/src/tunnel.rs:457/327/424tunnel 纯透传 payloadValue上抛 on_command,不做from_value::<TunnelCommand>强类型反序列化(方案A 阶段1 已落地 commit0fb5af5)→ miniapp{cmd,args}反序列化在桥接层remote_bridge.rs:96 from_payload成功,非阻断。tunnel.rs:457 注释自证「不反序列化为 TunnelCommand 强类型」。- P0-2 EventBus:
src-tauri/src/lib.rs:128state.ai_event_bus.subscribe()(tunnel subscriber 已接)+remote_bridge.rs:303/332/358/388+commands/ai/mod.rs:209/225publish_event跨端透传。已双写接入(todo line 760 commit 0fb5af5/612de4c emit 双写 chat19/audit12/guard3/stream_recv2/agentic18)。event_bus.rs:53/115的#![allow(dead_code)]+「骨架阶段」注释是过时历史标注(publish_event 现有调用方 remote_bridge/mod),非未接入。- P0-3 桥接层:
remote_bridge.rs完整实装(handle_remote_command:121 +MiniCommand:83 +from_payload:96 + match 路由 10 条 +route_list/load_messagespublish_event)+ 已 wirelib.rs:150-154on_command = Arc::new(...handle_remote_command...)+:171.connect(&relay_url,&device_id,&token,on_command.clone())。非占位/设计态。remote_bridge.rs:40-42的#![allow(dead_code)]+「零调用方」注释写于联调前,现 lib.rs 已调(过时标注,待清)。
剩余开放项:P3-B-260622 [P3·真机前置] — manifest appid 占位。PLACEHOLDER 无法真机调试,需微信公众平台注册的真 appid。— apps/df-miniapp/src/manifest.json
✅ 2026-06-24 aichat 可靠性修复(消息重叠×5 + 授权弹窗卡死 + 工具执行心跳误报 · 诊断workflow→论证workflow)
- BUG-260624-02 残留 ✅ 已销账(2026-08-15):ToolCard pending 态倒计时落地(
_approvalTimers升级携带 startedAt/timeoutMs +getApprovalRemainingMs真值起点,expireSecs/expireLevel computed,≤60s.is-urgent红;不限时回退正计时;i18n expireIn zh/en)+ detached 窗口核验无缺口(AiDetached→AiChat 独立 startListener,ai-chat-event app 级广播,主窗口 detach 时 stopListener 不竞态,结论注释 useAiWindow:107-115)- F-09 根因:streaming/currentText 全局单例改 per-conv ✅ 2026-08-07 核验销账(per_conv HashMap + 前端 convStates Map enum 轨 + AiConvStateChanged 事件 per-conv 路由,根治多会话串扰)(根治多会话串扰,见 docs/待决策.md)
- CR-260622-01-P2-2 [P2低优·评估降级] — HTML/markdown/JSON 等非代码文件无 session 级缓存。2026-06-24 评估:已有
TOOL_RESULT_COMPRESS_ENABLED(mod.rs:98/1029-1078 view-only 摘要,>2KB tool_result 压缩,LLM 视图摘要非全文回灌 prompt)部分缓解;read_symbol 治代码文件(主场景,降 24.4x)。非代码文件完整 session 缓存(path→hash+content+patch失效)设计复杂 + LLM patch 后重读确认行为不确定(缓存命中提示可能不够 LLM 仍重读),归 B 路线 prompt 策略(约束 patch 后不重读)更合适,工具侧完整缓存低优暂缓。
🔍 2026-06-26 灵感模块诊断待办(合并推进·单任务)
✅ 全部修复完成(2026-06-27 核验)
- IDEA-FIX-10 [P2🟠] — 前端 filter + 后端分页漏数据。团队决策:
hot/pending保留前端 filter(扩多值属性过度设计);keyword/order_by 已下沉后端。✅ 关闭(2026-08-15:团队决策定案,无后续动作)
🔍 2026-07-17 aichat 对话功能深度走查待办
- AIC-FIX-17-P0-1 — 流式 watchdog legacy 路径
convStates.clear()全局误杀 →delete(state.activeConversationId)✅ - AIC-FIX-17-P0-2 — 审批计时器切/删会话不清 → switch/delete 入口
clearAllApprovalTimers()+ 注释修正 ✅ - AIC-FIX-17-P1-1~11 ✅ 已销账(2026-08-15 核验,1 agent 全量核验 + 主代 4 项抽查源码属实):P1-1/3/4/5(queue/modelOverride/spans/_lastDelta per-conv,F-09 收尾)/ P1-2 drainQueue 互斥
_drainingConvsSet(useAiSend:274)/ P1-6 flushCurrentText 守卫 / P1-7 MessageItem 收敛仅 user 角色 / P1-8 _blockCache LRU 300+切会话 resetStreamCache / P1-9 指纹 watch 替代 deep / P1-10 approving 防重入前置(useToolApproval:133)/ P1-11 deleteConversation 相邻回落(useAiConversations:520)。余「MessageList 内联渲染组件化」「缓存主动失效」为优化空间非缺陷 - AIC-FIX-17-P2 ✅ 已销账(2026-08-15):7 条中 5 条核验为此前批次已修(ApprovalOverlay 响应式冷却/aiShared 对称收敛/flash watch/maximized 三元/emit 类型),2 条本批落地(tailSeq 注释与实现对齐 useStreamRenderer:142-196、isCompressing 单例补 known limitation 注释 useAiContext:28)
- AIC-FIX-17-根因 ✅ 2026-08-07 核验销账(queue/modelOverride/审批/_lastDelta 均已 per-conv) — F-09 per-conv 收尾(queue / modelOverride / _approvalTimers / _lastDelta 单例化)
🔍 2026-08-01 走查剩余待办(P2/P3/专项·本会话登记)
本次走查剩余项登记,未实施代码(守 session-role-diagnose-only)。专项已落 memory,此处留指针。
P2(中期改进):
- WC-P2-status-union — ✅ 已销账(2026-08-09):status union 已修
- WC-P2-useAiEvents-胖 — ✅ 已销账(2026-08-09):useAiEvents 已拆 12 个 composable(useAiLifecycleEvents/StreamingEvents/ToolEvents 等,65c0f6b)
- WC-P2-dfnodes-6未注册 — ✅ 已销账(2026-08-09):state.rs build_registry 已注册 git/docker/http/notify/subflow + human/ai/ai_self_review/task_advance 共 9 节点;script 有意禁用(R-PD-2)
- WC-P2-dfmcp-schema-required — ✅ 已销账(2026-08-09):required_names() 兼容 array/bool 两形态 + 三例单测(server.rs:277-294/491-522)
- WC-P2-bind-directory — ✅ 已销账(2026-08-09):tool_registry.rs:456-485 bind_dir_to_project 四要素齐全(id/路径校验/防重绑/stack探测)
P3(风格/可读·低优):
- WC-P3-SubflowNode-风格 — ✅ 已销账(2026-08-09):subflow_node trait 顺序(execute→schema→node_type)对齐 ai/human 节点
- WC-P3-script-注释 ✅ 已销账(2026-08-15 全文核验):script_node.rs 全部 env var 相关注释(:9/:144/:167 等)均已是「运行时配置优先、env var 回退」语义,无「替代纯 env var」矛盾表述,无需改动
专项(已登记 memory,留指针):
- 📌 WC-专项-AI-router-sanitize — AI router + sanitize 链路梳理重构 — 详见 memory(已登记,本会话不实施)
- 📌 WC-专项-run_agentic_loop-重构 —
run_agentic_loop重构(ARC-260619-05 agentic:318 超长,历史登记) — 详见 memory(已登记,本会话不实施)
技能注入(待定位):
- WC-技能注入-trace定位 — 技能/skill 注入链路待 trace 定位(注入时机、上下文来源、是否重复注入),定位后再决定是否待办化
🔍 2026-08-02 UI/UX 扩展审查(wf_wynylx23h · 10 路并行 · 基于任务 0115aea6 原 12 问题角度)
详单:UIUX扩展审查-2026-08-02.md。80 条发现(8 高/38 中/34 低;38 全新/29+ 延伸),高严重度主代理 grep 核验全属实。完整数据
~/.claude/jobs/8ff8ccb7/tmp/audit_summary.json。
P0 确定性 bug(本会话首批 · 并行实施):
- UX-P0-1 ✅ 后端
commands/project.rs4 处空 if 目录校验补 return Err(7f0edce) - UX-P0-2 ✅ 后端
commands/ai/tools/git.rsexec_git 改返(String,bool)治假成功 + CREATE_NO_WINDOW(7f0edce) - UX-P0-3 ✅ 后端
commands/module.rsrun_git_cmd 加 CREATE_NO_WINDOW(7f0edce) - UX-P0-4 ✅ 前端
DependencyGraph.vue环高亮注入 renderGraph(7f0edce) - UX-P0-5 ✅ 前端
FileExplorer.vuecloseDropdown 加 closest 判定(7f0edce) - UX-P0-6 ✅ 前端
Tasks.vue快捷菜单 —— HEAD 早修(closeQuickMenu+listener+@click.stop,任务描述过时),销账
P1 进展:
- ✅ P1-a 长内容折叠(MessageList AI 文本气泡>1500 字 + ConflictResolver 多冲突 + HelpRequiredCard 堆栈,
9e85cad) - ✅ P1-b Dashboard 统计源解耦(治 H6/H7 翻页/筛选后统计错乱;统计走后端 count_tasks 独立通道,
d1321af) - ✅ P1-c 列表状态持久化 — 2026-08-09 核验销账:usePersistedRef 已接入 Tasks/Projects/Knowledge/Ideas/AuditLog;ProjectDetail Tab 手写 localStorage 按 projectId 隔离(动态 key,usePersistedRef 静态 key 不适用)保留
- ✅ P1-d AuditLog 后端 WHERE 筛选 + 真实 total — 2026-08-09 核验销账:list_tool_executions(record.rs:182)支持 status/risk_level/tool_keyword WHERE + count_by_query 独立 COUNT 真实 total + limit/offset 分页;前端 AuditLog.vue buildQuery 传后端 + usePersistedRef 持久化
- ✅ P1-e 审批体系一致 — 全部落地(2026-08-09):挂起计时✅(ApprovalPopup :191 MM:SS)/ 授权粒度统一✅(ToolCard/ApprovalPopup/DirAuthDialog 同 i18n)/ deny 二次确认✅(DirAuthDialog 补)/ 失败 toast ✅ 本批落地(useAiApproval catch emit('ai-toast') + AiChat listen;ApprovalPopup 窗口内自包含 useToast)
- ✅ P1-f cmd 闪烁 N² — 已落地(2026-08-09 141777b):module.rs 新增仓库级 git status 缓存(GIT_STATUS_CACHE,key=仓库根 path,TTL 5s,锁内不跑 git,非 git 不缓存;get_module_file_tree + get_module_git_status 两处收口;删除/更新 module 清缓存);前端联动未做(5s TTL 自然过期 + FileExplorer 刷新已重拉目录树,无独立缺口)
- ✅ P1-g store.tasks.filter 污染 — 2026-08-09 核验+补全销账:ProjectDetail 独立 taskApi.list 已修;ChatInput @项目 enrichment 独立拉取(projectTasksCache)已修 + @任务联想本批改独立全量缓存 taskSuggestionCache(隔离 Tasks 页筛选子集)+ mentionTotal 对齐
P2(打磨):✅ 幽灵 --df-primary 已清(2026-08-15:4 处引用迁 --df-accent 逐主题等价,双主题定义删除,零残留)/ ✅ 死代码 PlanProgress·isLastUser 已核不存在 / ✅ git 状态色 token(2026-08-15:--df-git-added/modified/deleted/untracked 双主题,FileTree/GitChanges/FilePreview 18 处迁 var+color-mix)/ ✅ 控件统一(2026-08-15:.setting-input 全局定义承接,Connection/ProviderPanel 重复副本删,存布局覆盖)
批次 I(原 12 大改 · 后续专项):Dashboard 统计卡压底行(问题 1,依赖 P1 数据源)/ Projects 视图模式(问题 2)/ TaskDetail(4)·IdeaDetail(5)·KnowledgeDetail(6)·ProjectDetail(10)重设计 / ✅ project_event_repo 埋点已接入(2026-08-15 核验:commands/project.rs emit_project_event 封装 best-effort 写入 + list_project_activities 消费)
🔍 2026-08-04 aichat 历史会话实证诊断(弱模型工具行为失控)
触发:用户反馈"你好"时模型乱调
list_project_modules("DevFlow")+search_files("scan")。 实证:prod(76 会话/9928 消息/6392 工具)+ dev(98 会话/7853 消息)库 + 会话 dump 反推。详单 aichat历史会话实证诊断-2026-08-04.md。 核心:弱模型(sensenova-6.7-flash-lite)在任务中重复探索/绕工具/参数错误是系统性现象,非偶发。
- AC-1 ✅ 已落地(2026-08-09 核验):双层拦截——调用级
cache.rs:251 find_cached_readonly_result(同 tool_name+canonical_args 已 completed 即返缓存+警告头,第 2 次即命中)+ 轮级is_repetitive_exploration(helpers.rs:304-332,单签名≥3/唯一率<40%)→check_stall_breaker(警示→硬熔断 emit AiHelpRequired) - AC-2 ✅ 已落地(2026-08-09 核验,提交
fe780c0):MAX_TOOL_CALLS_PER_ROUND=8(agentic/mod.rs:245)+ 目录列举去重(readonly_cache_args_key 只取 path,返目录专用警告)+detect_listing_bypass(run_command 含列举命令且引用已列目录→警告,保守式不硬拒) - AC-3 ✅ 已落地(2026-08-09 核验):prompt.rs:304/323 项目/任务清单已含 id + 注明语(projects_listed_note "引用用 id 非名称");兜底机制超要求:entity_resolve.rs name→id 自动解析(RESOLVE_MAP 12 工具 + UUID 跳过 + 0 命中/重名返可行动错误 + 9 单测,audit/mod.rs process_tool_calls 单点漏斗)
- AC-4 🟡 部分(2026-08-09 核验):read_file 符号级命中提示已补强(tools/file.rs:179-196 用 code_intel contains_definition 检测内容含定义节点才提示,替代旧按扩展名)+ 三态本体(code_intel.rs:130)+ 缓存兜底 + 单测 4;模型分级已评估=保持现状(穿模型需改 process_tool_calls 多路径签名波及 ai_approve/trust_hits/low_risk,ROI 低——提示一行且 token 节省可忽略,启发式判弱模型脆弱)。✅ 关闭(2026-08-15:残尾均为已评估定案,无后续动作)
- AC-5 🟡 部分(2026-08-09 核验):画像复盘已做(docs/AI工具失败画像复盘-2026-08-08.md)+ 4/5 自愈机制落地(advance_task legal_targets / patch_file 相近锚点 / read_file·read_symbol 相近文件名候选 / search_files total=0 引导);运行时失败率统计 ✅ 已落地(141777b):tool_failure_stats IPC 命令(stats_by_tool 按工具 status 聚合,failed_rate=failed/(completed+failed),rejected 不计分母,可选 from 时间下限)。✅ 关闭(2026-08-15:残尾均为已评估定案,无后续动作)
💡 2026-08-04 MCP 多进程架构潜在问题(分析登记)
来源:df-mcp 进程实测 + 代码核查。根因:MCP server 独立进程 + 与 GUI 同库不同进程 + 绕过 GUI 业务层直调 Repo。 分析类登记,待决策后实施。 ✅ 2026-08-09 核查销账(2 agent 源码核验 + 主代抽查):8 项中 4 已落地(提交
02c8d8e等)、4 本批补修(8cb666a)。
- P0-1 ✅ 已落地(2026-08-09 8cb666a):df-storage 三 Repo 新增
update_full_cas(WHERE id AND updated_at 原子条件写,affected==0 拒绝),df-mcp update_project/task/idea/score_idea 四工具改 CAS 调用(顺带修 score_idea 旧忽略 Ok(false) 静默覆盖),+6 单测 - [~] P0-2 🟡 部分(2026-08-09):GUI 内嵌 HTTP 形态已通(advance_task 数据变更映射本批补,data_change.rs);独立 stdio 进程仍无感知(on_write_call: None 无 AppHandle + 无轮询兜底),需设计 GUI 侧刷新机制
- P0-3 ✅ 已落地:main.rs:19-37 init_mcp_tracing(tracing-appender non_blocking 写 %TEMP%/devflow-trace.log,medium_audit warn 落盘)
- P1-4 ✅ 已落地(
e722823):校验下沉 crates/df-storage/src/crud/task_validation.rs,df-mcp/GUI 复用同源函数 - P1-5 ✅ 已落地(
02c8d8e):db.rs busy_timeout(5s) + WAL + foreign_keys - P1-6 ✅ 已落地(
02c8d8e):server.rs:100-107 空闲超时 60s 退出(--idle-timeout 可配) - P1-7 🟡 部分(设计取舍):高危默认拒 + 中危审计 + --read-only 可选;未做默认只读/写前确认(有缓解可接受)。✅ 关闭(2026-08-15:设计取舍已接受,无后续动作)
- P2-8 ✅ 已落地(8cb666a):主 list 工具分页 + list_trash 补分页(offset/limit/has_more); P2-9 ✅ 已核销(2026-08-15):df-project scan/mod.rs 统一 to_lowercase 比较版(:69/:73)+ 单测断言,normalize_for_compare/canonicalize_for_store 已拆分; P2-10 有意收敛
🔍 2026-08-04 miniapp 聊天渲染 vs 桌面端兼容性走查(剩余待办登记)
走查
apps/df-miniapp/src/pages/chat/index.vue/apps/df-miniapp/src/utils/mdRenderer.ts/src/components/ai/MessageList.vue等 miniapp 聊天渲染与桌面端兼容性。已修复项不记录,仅归档未修剩余项。守 session-role-diagnose-only:本会话仅走查+登记,未实施代码。 ✅ 2026-08-09 核查销账(2 agent 源码核验 + 主代抽查):9 项中 7 已落地(e722823/795e05f/8cb666a)、本批补 2(mention chip + 语言标签)。
P1(兼容性/体验·2 项):
- MR-P1-1 ✅ 已落地:chat/index.vue:66-131 splitStreamBlocks 块级 memo 流式渲染(currentText 不再纯 text 显语法字符;未闭合围栏降级 escapeFallback 属流式固有取舍)
- MR-P1-2 ✅ 已落地:mdRenderer.ts:203-207 table 显式
display:table(非 block)保留列对齐 + max-width/word-break 兜底
P2(打磨·6 项):
- MR-P2-1 ✅ 已落地:mdRenderer.ts:198 img max-width:100% + border-radius(网络图依赖微信 downloadFile 白名单,非渲染代码)
- MR-P2-2 ✅ 已落地(2026-08-09 8cb666a):chat/index.vue segmentUserContent 分段渲染
[项目:名]/[任务:名]/[灵感:名]chip(命中已知实体才 chip,未命中保持字面,纯文本零回归) - MR-P2-3 ✅ 已落地:mdRenderer.ts:167-172 input checkbox → ☑/☐ 字符符号
- MR-P2-4 ✅ 已落地(8cb666a):highlight.js 14 语言高亮 + 代码块语言徽标(codeLangBadge,围栏 lang 显标签)
- MR-P2-5 ✅ 已落地:桌面 MessageList.vue:698-708 isToolResultJson 折叠(对齐 miniapp)
- MR-P2-6 ✅ 已落地(
795e05f):settings/index.vue 编辑模式(setConfig + 脱敏 + resumeIfDisconnected)
P3(外部依赖/低优·2 项):
🔍 2026-08-07 aichat 切换/新建对话缺陷走查(用户实测 2 bug + 双 agent 深挖)
用户 dev 实测报 2 个 bug(队列串新会话 / 历史内容进新会话),派 2 agent(前后端)+ 主代独立抽查。守 session-role-diagnose-only:本会话仅走查+登记,未实施代码。 详单见走查报告(本段即清单)。 ✅ 2026-08-09 核对销账(2 agent 独立源码核验 + 主代抽查 useAiEvents P1-1 一致):16 项中 14 项已修(提交 9f75db5「切换/新建对话缺陷」+ 后续
6ba6daf收尾),各 [x] 项附当前源码证据行号;CSW-P1-4 未修(切到生成中 conv 首响应气泡丢失,需前后端 round0 占位补回设计,单列);CSW-P2-7 未核对(走查自标待确认,含 d2 分离窗口失效/跨端流式)。
🔴 P0/bug1 待发送队列串到新对话(用户实测,根因已确认):
- CSW-P0-1 — ✅ 已修:
AiChat.vue:393-395activeQueue computed 按activeConversationId过滤 + 模板 :70/:79 改用 activeQueue;queue 操作(cancel/edit/sendNow)经useAiSend.ts:420-431activeQueueRealIndex 映射真实下标,clear/forceSend 均传 convId
🟡 P1(前后端合并去重,按严重度):
- CSW-P1-1 — ✅ 已修:
useAiEvents.ts:101-102非当前会话AiCompleted仍 emitai-drain-queue(带 conversationId,未被 isCurrent 吞);useAiSend.ts:271-306drainQueue 用目标 convId - CSW-P1-2 — ✅ 已修:
conversation.rs:363-368非 live 分支先判mem_has_unsaved(len>persisted_msg_count || needs_full_rewrite),有未落库内存则跳过 restore,DB 快照不再覆盖内存 - CSW-P1-3 — ✅ 已修:
conversation.rs:335/415-417already_live分支 pending 完全不动(不 finalize/不 retain/不从 DB 恢复),首屏用 per_conv 内存消息 - CSW-P1-4 — ✅ 已修(2026-08-09):切到生成中 conv 首响应气泡丢失——前端 switchConversation(useAiConversations.ts:336-355)在 parse 成功、active 置位后,若
targetGen && 末条是 user补前端占位 assistant 气泡(round0-pending-判重),承接 currentText 供 MessageList isLastAi 流式渲染 + flushCurrentText 回填。纯前端,不需后端协同 - CSW-P1-5 — ✅ 已修:
conversation.rs:613-616删除先登记deleted_convs再删库,save 入口 :259-265 命中直接 return + :416-426 INSERT 前二次校验,封死 Ok(None) 复活窗口 - CSW-P1-6 — ✅ 已修:
useAiConversations.ts:255-259if (!force && id === state.activeConversationId) return同 id 短路,不清文本不重拉 - CSW-P1-7 — ✅ 已修:
useAiConversations.ts:269/303-305switchingConvs 集合缓冲切换往返窗口;useAiEvents.ts:110-115非当前命中 switchingConvs 的 delta 累积到 per-conv 流式态而非 drop - CSW-P1-8 — ✅ 已修:
useAiConversations.ts:333-335先 messages 后 active 同一同步块,parse 失败 catch :336-348 不切走,无 active/messages 错配
🔵 P2(打磨/边缘):
- CSW-P2-1 — ✅ 已修:
useAiConversations.ts:71-73newConversation 首行clearAllApprovalTimers() - CSW-P2-2 — ✅ 已修:
conversation.rs:356/400-405仅!conv_was_present才复位 session_trust/model_override/agent_language - CSW-P2-3 — ✅ 已修:
conversation.rs:211-226save_conversation_serialized 持 per-conv 锁(mod.rs:696-701save_locks)串行化 DELETE+INSERT,20+ 调用点无旁路 - CSW-P2-4 — ✅ 已修:
state.rs:561-565clear_session_allowed_dirs_if_idle 仅在active_convs().is_empty()才清,后台 loop 文件工具不丢临时授权(三调用点 create/switch/delete 均用 _if_idle) - CSW-P2-5 — ✅ 已修:
useAiConversations.ts:67/75-76/110_newConvLock防抖 + 300ms 释放 - CSW-P2-6 — ✅ 已修:
streamingGuard.ts:78带 convId 写 per-conv 流式态,无 convId 才写全局
其他已销项:CSW-P2-7(需实测确认,从待办去除)
🔍 2026-08-09 TaskDetail 操作按钮缺陷走查(用户实测 + AI 深度审查)
用户反馈"产出部分只有标题空白",触发对 TaskDetail.vue 所有操作按钮的全量走查。覆盖模板/脚本/后端 advance_task / run_workflow 回调链路。共发现 10 项缺陷,按严重度 P0×2 / P1×4 / P2×4 分组。守 session-role-diagnose-only:本会话仅走查+登记,未实施代码。
✅ 2026-08-09 全部修复并核验销账:主代理独立核查(vue-tsc EXIT 0 + diff 语义审)通过。补充说明:P1-4 核验当前代码已满足(advanceChild/setChildPriority 已含
childMenuId.value = null),仅销账未改;P1-5 实现位置优化为 watch(taskId)/refresh/handleAdvance 成功三入口调用resetWorkflowUi()(load() 内不加,避免工作流推进中 df-data-changed 触发刷新误清进度面板);P2-10 描述编辑对齐 IdeaDetail 模式(有描述/空描述均可编辑,taskApi.update 落库)。验收标准 1-9 全部满足。
涉及文件:
src/views/TaskDetail.vue(987 行,主要改动点)src-tauri/src/commands/task.rs(advance_task,仅参考)src-tauri/src/commands/workflow.rs(run_workflow 回调,仅参考)crates/df-nodes/src/task_advance_node.rs(advance_task_atomic,仅参考)
🔴 P0 缺陷(2 项,必须修)
P0-1 双重推进竞态:工作流推进中手动推进按钮仍可用
- 位置:TaskDetail.vue:48 vs :55
- 现状:工作流按钮
:disabled="wfAdvancing || advancing"(检查两者),手动按钮:disabled="advancing"(只检查 advancing) - 问题:
wfAdvancing=true时手动按钮仍可点 → 同时发起run_workflow(回调 advance)+ 直调advance_task两个推进请求 → 第一个成功改 status,第二个 CAS 失败返回 Err → 前端显示红色错误,用户困惑"明明成功了为什么报错" - 修复:手动推进按钮
:disabled加|| wfAdvancing(1 行)
P0-2 工作流推进与手动推进按钮语义重复(todo 状态双"开始")
- 位置:TaskDetail.vue:45-57
- 现状:todo 状态同时显示「工作流推进」+「开始」两个按钮,都推进到 in_progress
- 问题:用户不知道该点哪个;设计意图是工作流推进会跑 AiNode 生成产出,手动"开始"只是纯改状态,但按钮文案没有区分
- 修复:工作流推进按钮文案改为「AI 执行推进」或「工作流推进(含 AI 产出)」
🟠 P1 缺陷(4 项)
P1-3 子任务快捷菜单不校验状态机合法性
- 位置:TaskDetail.vue:286-296
- 现状:
quickStatuses硬编码列出全部 6 态 [todo, in_progress, in_review, testing, done, blocked],不按子任务当前 status 过滤 - 问题:todo 状态子任务的菜单显示 testing/done/in_review 等非法目标,点下去后端 can_transition 拒绝 → 红色错误
- 对比:顶部手动推进按钮用
ADVANCE_MAP严格按状态机过滤,子任务菜单却无此逻辑 - 修复:子任务菜单复用
ADVANCE_MAP[child.status]过滤合法目标
P1-4 子任务操作后快捷菜单不关闭
- 位置:TaskDetail.vue:326 advanceChild / :337 setChildPriority
- 现状:操作完成后不
childMenuId.value = null - 问题:点了"推进到 done"或"改优先级"后菜单仍挂着悬浮
- 修复:两函数操作完成后
childMenuId.value = null(2 处)
P1-5 refresh/切任务后工作流进度/DAG 残留
- 位置:TaskDetail.vue:619 load() 函数
- 现状:load() 只重置 task/projects/ideas,不清
wfExecId/wfDagJson/wfResult - 问题:切任务或点 refresh 后右栏仍显示旧任务的工作流进度和 DAG
- 修复:load() 开头加
wfExecId.value = null; wfDagJson.value = ''; wfResult.value = null(3 行)
P1-6 手动推进后工作流进度面板不清空
- 位置:TaskDetail.vue:470 handleAdvance
- 现状:成功后只
task.value = updated,不清工作流相关 ref - 问题:手动推进后右栏仍显示旧工作流进度
- 修复:handleAdvance 成功后清空 wfExecId/wfDagJson/wfResult
🟡 P2 缺陷(4 项)
P2-7 子任务创建无长度/重名校验
- 位置:TaskDetail.vue:365-381 confirmSubtask
- 现状:标题只
trim()判空,不校验长度上限/重名;成功路径不清errorMsg.value - 修复:加长度上限(如 128 字)、同父重名校验、成功路径清 errorMsg
P2-8 wfResult timer 生命周期不严谨
- 位置:TaskDetail.vue:424 watch 回调
- 现状:工作流完成后 setTimeout 3s 清 wfResult;切任务时 timer 仍在但 wfExecId 已清
- 影响:低风险(最多多等 3s),但 timer 引用管理不严谨
- 修复:load() 重置时清
_wfResultTimer
P2-9 子任务页无"是子任务"提示
- 位置:TaskDetail.vue:108(父面包屑)+ :133(子任务面板仅顶层显示)
- 现状:子任务详情页结构与顶层任务几乎一样,只有顶部多一行父面包屑
- 修复:加一行提示「该任务为子任务,隶属于:{parentTitle}」
P2-10 空描述无编辑入口
- 位置:TaskDetail.vue:68
<section v-if="task.description"> - 现状:无描述时描述面板整块消失,无"添加描述"入口
- 修复:无描述时显示空态 + "添加描述"入口
验收标准
- 工作流推进中手动推进按钮禁用,无双重推进竞态
- todo 状态两个按钮文案可区分(工作流推进 vs 纯手动开始)
- 子任务快捷菜单只显示状态机合法目标
- 子任务操作后菜单自动关闭
- 切任务/refresh/手动推进后右栏工作流进度正确重置
- 子任务创建有长度/重名校验,错误提示清晰
- 子任务页有"是子任务"明确提示
- 空描述有编辑入口
- vue-tsc EXIT 0
关联:父任务「总览页 + 项目列表 UI/UX 优化(持续更新)」(id: 0115aea6-b423-482a-8a64-b793a66a0417)—— 本走查作为该任务的子任务延伸。
🔍 2026-08-09 项目详情页走查(概览/文件/依赖图 · 3 agent 并行 + 主代核查)
用户要求「检查项目详情(概览、文件、依赖图)存在的问题」并「先检查做记录,不直接改」。详单见 项目详情页走查-2026-08-09.md。共 60 项(P0×1 / P1×6 / P2×14 / P3×27)。守 session-role-diagnose-only:仅走查登记,未实施代码。
P0(核心不可用):
- PD-P0-1 — ✅ 已修(2026-08-09 e6760e8):DependencyGraph 调
register({shape:'vue-shape',component:ModuleNode})+ ModuleNode 改props.node?.getData?.()双兜底(vue-shape 传 {node,graph} 非 data,主代核 x6 源码确认)
P1(数据正确性/一致性·6 项):
- PD-P1-1 — ✅ 已修(a9cb802):module.rs git status 加
-c core.quotepath=false一行根治中文乱码 - PD-P1-2 — ✅ 已修(e6760e8):remove_project_module 删工程前级联清 module_dependencies(FK 约束)
- [~] PD-P1-3 — 🟡 已降级标注(2026-08-09 a9cb802):WorkflowEventPayload 无 project 维度无法按项目过滤 → 实时进度面板默认隐藏(wfProgressEnabled)+ 日志默认折叠+「全局事件」标注,不改事件协议(跨层大改留设计)
- PD-P1-4 — ✅ 已修(a9cb802):projectTasks 加 df-data-changed 本地监听(entity=task,200ms 防抖,overview 活跃才刷)
- PD-P1-5 — ✅ 已修(a9cb802):df-data-changed 写文件后重拉 gitStatus + GitChanges refreshKey prop(修徽标清零+不刷新)
- PD-P1-6 — ✅ 已修(a9cb802):FileTree toggleDir 错误改行内态(toggleErrors 按 path),不炸整树
P2(体验/打磨·14 项):
- PD-P2-1 ✅ 已修(a9cb802):watch(activeTab) 切回 overview 重拉 modules / PD-P2-2 ✅ 已修:loadProjectTasks/loadModules 加 seq 序号守卫 / PD-P2-3 🟡 DAG 边条件编辑父级未监听(a9cb802 概览进度面板默认隐藏,编辑入口随隐藏;TaskDetail 场景不受影响,待评估) / PD-P2-4 🟡 stopEventListener 波及他视图(共享单例,留设计) / PD-P2-5 ✅ 已修:watch(projectId) 重置折叠态
- PD-P2-6 🟡 概览任务无 loading/分页(未做,列表上限 500 通常够,待评估) / PD-P2-7 ✅ 已修:constants/project.ts 补全 5 状态 + i18n / PD-P2-8 ✅ 已修(e6760e8):环高亮改 isCycle 注入 data + ModuleNode 红框 / PD-P2-9 ✅ 已修:节点点击改组件内 selectedId 选中高亮(移除死代码 emit+push) / PD-P2-10 ✅ 已修(a9cb802):零工程空态引导 CTA
- PD-P2-11 🟡 打开文件 tab 全量 git 扫描(后端 5s 缓存已缓解,懒加载留设计) / PD-P2-12 ✅ 已修:FileExplorer/DependencyGraph 用 KeepAlive 保活(onActivated 守卫) / PD-P2-13 ✅ 已修(e6760e8):loadModules 重置 cycleNodes / PD-P2-14 ✅ 已修:前端禁用已存在组合 + 后端幂等
P3(边缘/打磨·27 项): 见详单文档(概览 O10-18 / 文件 F13-24 / 依赖图 G14-18) — 部分已随批修(见下)
已随批修 P3:O7 sourceScores clamp / O8 descCollapsible DOM 测量 / O9 handleSync 补模块+灵感 / O10 parseStack 缓存 / 依赖图 G10 防环文案 cycleAddError / G14 后端 from!=to 校验 / G16 省略号统一。其余待后续批。
优先级建议:P0 G1 节点不渲染 → P1 F3 中文乱码 + G3 删依赖必失败 + O2 跨项目串数据 + O1 列表陈旧 + F1 变更不刷新 → P2 分批。 memory 指针:devflow-project-detail-walkthrough
🔍 2026-08-09 aichat 运行效率走查(6 路并行 · 单轮成本/工具/流式/前端/会话/LLM成本)
用户反馈「aichat 运行的效率很低」+「成本走查,比如有的 LLM 要求的缓存命中率规则」。详单见 aichat效率走查-2026-08-09.md。共 74 项(单轮13/工具9/流式12/前端12/会话16/LLM成本12)。守 session-role-diagnose-only:仅走查登记,未实施代码。
LLM 成本/缓存命中(用户重点 · P0×2):
- AC-EFF-C0-1 — ✅ 已修(2026-08-09 d09d136):AnthropicRequest.system 改 untagged SystemBlock 枚举(Plain/Cached),cache_control:{type:ephemeral},开关 ANTHROPIC_CACHE_ENABLED 默认关
- AC-EFF-C0-2 — ✅ 已修(d09d136):system 稳定段/易变段分离——日期+项目/任务清单+augmentation+知识注入挪消息流末尾 merge_volatile_tail(治跨天失效+前缀稳定),开关关逐字等价现状;df-ai 492 测试通过
- [~] AC-EFF-C1-1 ✅ 日期挪易变段已修 / C1-2 🟡 每轮全量重发 O(n²) 部分缓解(cache_control+稳定前缀后第2轮起命中,增量滑窗留待后续批) / C1-3 ✅ augmentation+知识注入挪消息流已修
后端效率(单轮成本 + 会话 + 工具 · P0×4):
- AC-EFF-R1-1 🟡 全量历史重放(cache_control 命中后 O(n²) 实际降为 cache_read,增量机制待后续) / AC-EFF-R2-1 ✅ 已修(0300764):count_recent_failures+check_stall_breaker 改 recent_messages 尾窗口 40 条
- AC-EFF-L0-1 — ✅ 已修(0300764):save_conversation 无变化捷径提前判定(无变化不 clone/truncate/构建 records)
- AC-EFF-L0-2 — ✅ 已修(0300764):system prompt 数据指纹缓存(OnceLock+entity_fingerprint,省每轮 DB 查询+拼接)
- AC-EFF-L0-3 — ✅ 已修(c41f4ad):压缩后台化 tokio::spawn fire-and-forget + is_compressing 防重入,当前轮正常走不阻塞
- AC-EFF-T1-1 ✅ 已修(c41f4ad):AiToolExecutionRepo.insert_batch 单事务批量,审计砍串行尾巴 / T1-2 ✅ 已修:只读缓存轮内去重(同轮重复 (tool,args_key) 只真执行一次) / T1-3 🟡 git 工具不进缓存(留待后续,module.rs git 缓存未共享)
前端效率(流式 + 交互 · P1×4):
- AC-EFF-S1-1 ✅ 已修(c41f4ad):流式增量渲染(已完成块跨帧缓存 + 只重 lexer 末块增长段,单块>12000 降级纯文本) / S1-2 🟡 长尾代码块 hljs(随 S1-1 缓解,高亮缓存留待)
- AC-EFF-F1-1~3 — ✅ 已修(0300764):scheduleConversationsRefresh 250ms trailing debounce 收敛回合双拉+notify 自触发+无防抖
- AC-EFF-S2-1 ✅ 已修(c41f4ad):MessageList 双渲染合并(currentText 条件改 streamingBlocks.length>0,每 delta 只 rAF 一次) / S2-5 ✅ 已修:AiCommandOutput 50ms+4KB 合批(砍事件风暴)
P2/P3 其余 50+ 项: 见详单文档(R2/R3/T2/T3/S2/S3/F2/F3/L1/L2/L3/C2/C3 全量)
优先级建议:① C0-1+C0-2 缓存命中率 → ② L0-1 save + L0-2 system 缓存 + L0-3 压缩后台化 → ③ R1-1 全量重放 + S1-1 流式增量 → ④ T1-1 审计批量 + F1-1/2/3 列表刷新收敛。 memory 指针:aichat-efficiency-walkthrough-2026-08-09
🔍 2026-08-09 任务/仪表盘/灵感知识走查(3 路并行 · 阶段②第一批)
详单见 任务+仪表盘+灵感知识走查-2026-08-09.md。共 59 项(任务19/Dashboard+Projects17/Ideas+Knowledge23,P0=0/P1=7/P2=25/P3=27)。守 session-role-diagnose-only:仅走查登记,未实施代码。
P1(确定性,优先修):
- WK-1 ✅ 已修(2026-08-09 0554cc1):ActiveProjectsPanel 改 status !== completed/cancelled + 状态映射对齐 7 态(in_progress→coding/testing→testing/releasing→release),删 active 键
- WK-2 ✅ 已修:Knowledge 操作前快照 index,selectNextCandidate 直接按同位置取后续
- WK-3 ✅ 已修:updateStatus/archive 返布尔,失败 toast + 中止推进
- WK-4 ✅ 已修:promoteIdea/relateIdeas 去内部 loadIdeas + _activeIdeaQuery + Ideas.vue loadCurrentView()
- WK-5 ✅ 已修:Ideas/IdeaDetail 状态菜单排除 promoted
- WK-6 ✅ 已修:7 态 status-* 色类提取全局 components.css(列表+详情+项目统一)
- WK-7 ✅ 已修:Ideas 改 error-banner,失败不清理选中态,deleteIdea 返布尔
P2(体验/数据): WK-813 ✅ 已修(0554cc1):快捷菜单状态机+补cancelled / overflow裁切根治(顶底角裁剪下放) / loadTasks seq守卫+keyword / 搜索态隐藏进度徽章 / 分页越界钳制 / 失败统一toast。剩余 WK-1418 🟡 待后续
P3(27 项): 见详单文档(TSK-1019 / DBP-1017 / IDEA-1012 / KNOW-610 / C-1~3)
优先级:WK-1 Dashboard 状态映射 → WK-2/3 Knowledge 确定性 → WK-4/5 Ideas → WK-6 状态徽章 → WK-7 错误条统一。
🔍 2026-08-09 Settings/审计/布局/后端命令走查(3 路并行 · 阶段②第二批)
详单见 settings+审计+布局后端走查-2026-08-09.md。共 95 项(Settings+AuditLog29 / layout+sidebar21 / 后端命令45,P0=0/P1=9/P2=32/P3=54)。守 session-role-diagnose-only:仅走查登记,未实施代码。
P1(确定性/安全,优先修):
- LW-1 ✅ 已修(0554cc1):ConfirmDialog Enter 分支加 BUTTON 排除(焦点在取消不再误触删除)
- LW-2 ✅ 已修(7795fe6):update_project 白名单剔除 id/created_at + status 值校验 + path relocate 同款校验 + stack JSON 校验
- LW-3 ✅ 已修(7795fe6):update_idea status 值校验 + 拒绝 status=promoted + related_ids/scores JSON 校验
- LW-4 ✅ 已修(7795fe6):update_task queue 补 validate_queue + queue/status 一致性校验
- LW-5 ✅ 已修(7795fe6):count_by_query 补齐 assignee/queue/parent_id/module_id 维度
- LW-6 ✅ 已修(7795fe6):update_field_active(WHERE id AND deleted_at IS NULL) 软删拒改
- LW-7 ✅ 已修(7795fe6):evaluate_idea 起始 guard 终态返 Err
- LW-8 ✅ 已修(7795fe6):claim_promotion CAS(WHERE id AND promoted_to IS NULL) 防双击重复立项
- LW-9 ✅ 已修(7795fe6):create_task/update_task parent_id/move_task_queue 后 recompute_parent_status
P2(体验/数据·32 项): 见详单文档(SA-18 审计 i18n/脏表单/竞态、LS-210 侧栏偏好/小屏布局/审批浮窗/Paginator、BE-CMD-923 后端校验/聚合)
P3(54 项): 见详单文档(SA-931 / LS-1121 / BE-CMD-2445)
优先级:LW-1 ConfirmDialog 安全 → LW-2/3 update 裸奔 → LW-4 queue → LW-5 count/list → LW-6 软删 → LW-8 父聚合。 全系统索引:前端 13 + 后端 9 命令全走查完成 ✅,剩 crate df-mcp/df-execute/df-project/df-ideas/df-tunnel/df-relay/df-types。
🔍 2026-08-09 df-mcp + 工具 crate 走查(阶段②最后一批)
详单见 df-mcp+工具crate走查-2026-08-09.md。共 35 项(P0=0/P1=2/P2=8/P3=25)。守 session-role-diagnose-only:仅走查登记,未实施代码。
P1:
- MC-1 ✅ 已修(7795fe6):MCP update_project status 保留原值(对齐 update_task 收口)
- MC-2 ✅ 已修(4387695):df-project normalize_path 拆 normalize_for_compare/canonicalize_for_store,存库保留大小写(调用点迁移留后续)
- MC-3 ✅ 已修(4387695):df-tunnel 文档更正——自动重连已在 src-tauri supervisor 实现(lib.rs:292 轮询+指数退避),避免双重竞争;backoff_delay 改 pub 供 supervisor 复用
- MC-4 ✅ 已修(4387695):df-relay 成本评估选文档明示风险 + validate_device_id 最小加固(per-device token 留 Phase3)
- MC-5 ✅ 已修(7795fe6):is_success_tool_call 按 result.isError 判定,业务失败不触发写回调
- MC-6 ✅ 已修(7795fe6):create_idea priority normalize + create_project/task 拒空名 + bind_directory 降级;evaluate 复用 ScoringEngine 未做(独立口径声明,df-mcp 不依赖 df-ideas 避免重 HTTP 依赖树)
- MC-7 ✅ 已修(2026-08-09):df-ideas 自洽性校验(enforce_score_consistency 分档一致性,ARC-260618-01-e 已实施) + df-types Priority::from_i32(0-3/Low 兜底对齐读侧) + script 措辞修正
- RLY 附加 ✅ 已修(4387695):token 固定时间比较 + 入站帧 1MB 上限 + 未设 token 改错误退出(不再 panic)
P3(25 项): 见详单文档(MCP-716 / EX-14 / PRJ-24 / TUN-24 / RLY-2~5)
全系统走查(阶段②)完成 ✅——前端 13 模块 + 后端 9 命令 + 全部 crate 已走查登记。进入阶段③批量打包推进 /advance。
🔴 2026-08-09 AI 自审/工作流推进链路缺陷(task_id 断裂 + AiNode 缺 prompt + 审批无 UI)
用户「检查 AI self-review 遇到的问题」触发对工作流推进链路的深度审查。核心结论:工作流推进按钮从 TaskDetail 触发时,三条推进链(in_progress/testing/done)全部不可用。守 session-role-diagnose-only:本会话仅走查+登记,未实施代码。
涉及文件:
src-tauri/src/commands/workflow.rs(run_workflow_inner 核心)crates/df-nodes/src/task_workflow_templates.rs(三模板)crates/df-nodes/src/ai_node.rs/ai_self_review_node.rs/ai_node_helpers.rs/human_node.rscrates/df-workflow/src/executor.rs/dag.rs/registry.rs/dag_def.rssrc/views/TaskDetail.vue/src/stores/project/workflow.ts/src/views/ProjectDetail.vue
🔴 P0 缺陷(3 项,工作流推进 100% 失败)
P0-A task_id 断裂:AiSelfReviewNode 必定失败
- 位置:
workflow.rs:295executor.run(&runtime_dag, config)+executor.rs:153 - 现状:前端传
config = {}(TaskDetail.vue:590),run_workflow_inner拿到task_id但只存进 WorkflowRecord + 回调闭包 cb_task_id,从未注入传给 executor 的 config。DagExecutor 构造 NodeContext 时deep_merge(config={}, node_configs[id]),testing 模板节点 config 只含{"gate":true}。最终ctx.config无 task_id。 - 结果:
ai_self_review_node.rs:100ctx.config.get("task_id")→ None →Err("AiSelfReviewNode 缺少必填参数: task_id")→ 节点失败 → 工作流 failed。 - 修复:
run_workflow_inner在executor.run前把task_id注入 config:config["task_id"] = task_id(1 行)。
P0-B AiNode 缺 prompt:in_progress 模板必定失败
- 位置:
task_workflow_templates.rs:45-47dag.add_node("ai_execute", "ai", json!({})) - 现状:in_progress 模板 AiNode config 为空对象。注释称「prompt / provider / task_id 均由 run_workflow 全局 config 注入」,但前端传空 config、后端不注入。AiNode 的
parse_params(ai_node_helpers.rs:189-200)取inputs["prompt"]>config.prompt,两者皆无 →Err("AiNode 缺少必填参数: prompt")。 - 结果:todo→in_progress 推进链 AiNode 必定报错,任务原地不动,无 AI 产出。
- 修复:AiNode 加默认 prompt 兜底(基于 task.description 生成执行方案),或 run_workflow 注入。
P0-C TaskDetail 无审批 UI:testing/done 模板的 HumanNode 审批无法操作
- 位置:
TaskDetail.vue(无 ApprovalDialog 组件)+ProjectDetail.vue:353-356(唯一渲染处) - 现状:工作流 store 的
startEventListener(workflow.ts:111-144)收到human_approval_request会设state.pendingApproval。但只有 ProjectDetail.vue 有watch(() => store.pendingApproval)打开 ApprovalDialog(ProjectDetail.vue:838-841)。TaskDetail.vue 只调store.startEventListener()(TaskDetail.vue:674),不渲染 ApprovalDialog、不 watch pendingApproval。 - 结果:用户从 TaskDetail 点「工作流推进」进入 testing(in_review→testing 模板含 ai_self_review + human_review)或 done(testing→done 模板含 human)模板,HumanNode 发出审批请求 →
state.pendingApproval被设但无弹窗 → 用户无法批准/拒绝 → HumanNode 等满 30min 默认超时(human_node.rs:34 DEFAULT_TIMEOUT_SECS=1800)→ 工作流 failed。 - 修复:TaskDetail 渲染 ApprovalDialog + watch pendingApproval,或将审批弹窗做成全局(独立于 ProjectDetail/TaskDetail)。
🟠 P1 缺陷(3 项)
P1-D in_progress 失败无退回信号
- 位置:
task_state_machine.rs:156regression_target(IN_PROGRESS) => None - 现状:in_progress 模板失败(AiNode 缺 prompt,P0-B)时,
regression_target("in_progress")返回 None → 回调跳过推进。任务原地留在 todo,无错误提示、无退回态、无任何信号(回调只tracing::warn!)。 - 结果:用户点「工作流推进」→ 后台静默失败 → 任务不动,前端 wfResult=failed 提示但无具体原因。
- 修复:AiNode 失败时把错误信息透出到前端(WorkflowFailed.error 已含,但前端 wfFailedHint 只显通用文案)。
P1-E done 模板失败后任务卡 testing 无退回
- 位置:
task_state_machine.rsregression_target(DONE) => None - 现状:testing→done 模板(human 节点)若用户拒绝(返回 Err)→ 工作流 failed →
regression_target("done")→ None → 任务留在 testing,未退回 in_review。 - 问题:done 是终态,无可退态合理,但用户拒绝后应停留 testing 让人工处理,当前无明确信号提示「推进未完成,任务仍在 testing」。
P1-F AiSelfReview 审查空产出
- 位置:
ai_self_review_node.rs:129-134 - 现状:若 in_progress 阶段 AiNode 失败(P0-B),output_json 为空 → 自审节点审查占位文本
"(无产出,仅依据需求审查)"。 - 结果:即使 task_id 修好,无产出的自审也只是空洞审查,无意义。
🟡 P2 缺陷(3 项)
P2-G 前端注释误导:「运行时注入」实际无注入
- 位置:
TaskDetail.vue:590注释「全局 config 留空(节点级 config 由模板/运行时注入)」 - 现状:模板只注入 gate:true,运行时(run_workflow_inner)不注入 task_id/prompt。注释承诺与实际不符,误导后续维护者。
P2-H 三模板归一度差:in_progress 纯 AI / testing AI+Human / done 纯 Human
- 位置:
task_workflow_templates.rs - 现状:三模板职责不统一——in_progress 无人工确认直接改状态,testing 有 AI 自审 + 人工,done 纯人工。用户对「工作流推进」在三个状态的体验差异巨大但不透明。
- 建议:至少统一「推进是否有人工确认」的预期,或在按钮文案/进度提示中说明当前推进链内容。
P2-I WorkflowRecord 未存 project_id
- 位置:
workflow.rs:170project_id: None - 现状:即使 task_id 关联任务(任务有关联 project_id),执行记录
project_id恒为 None。按项目过滤工作流执行记录时无法直接从 workflow 关联项目。 - 修复:task_id 有值时反查任务 project_id 填入。
验收标准
- task_id 注入 AiNode/AiSelfReviewNode config,自审节点能读到任务
- in_progress 模板 AiNode 有默认 prompt,能生成产出
- TaskDetail 触发工作流后,HumanNode 审批弹窗正常弹出可操作
- 工作流失败时前端显示具体错误原因(非通用文案)
- 老工作流(无 task_id/target_status)零行为破坏
- cargo check --workspace EXIT 0 + vue-tsc EXIT 0
🟡 P1:
- SC-260811-P1-1 ✅ 已销账(2026-08-15 核验,1b012bc 覆盖):
task_state_machine.rs:155 shortest_pathBFS 推导 +task_advance_node.rs:81-84非法转换错误信息附加最短路径提示(路径>2 跳时),+6 单测
🔧 既有测试失败修复(2026-08-11):累计修 7 项既有失败,df-nodes 175 全过 / df-storage 166 全过:
- ✅
ai_self_review_node::clamp_dimension_scores_in_place类型保真:区间内整数保持整数(9 不转 9.0),仅越界 clamp——修 parse_review_json_valid_passes_through,同步调 clamps_out_of_range_scores 边界值断言(10 保持整数) - ✅
build_review_prompt模板说明文字裸<task_requirements>与真实标签同名,测试 find 首现误命中行内引用→真实标签加换行锚定定位(\n<tag>\n),说明文字标签加反引号 - ✅
project_module_repo::setupasync 上下文直接blocking_lock()触发 "Cannot block the current thread" panic→改用ProjectRepo::insert异步 API(对齐 service_repo 风格)
关联:本走查与「2026-08-09 TaskDetail 操作按钮缺陷走查」同属 TaskDetail 交互审查线,但本段聚焦 AI 工作流推进链路(后端 + 审批 UI),按钮缺陷聚焦 TaskDetail 自身交互。修复时建议合并处理(都在 TaskDetail + workflow 链路)。