Files
DevFlow/docs/todo-归档-20261006.md
T
lxy 9ff26f0c8f 修复: 子代理报告双缺陷——熔断补收尾轮 + 报告新近度豁免
① 熔断无收尾轮: max_rounds 打满(达 effective_max 上界且未收敛)时, 旧逻辑直接 teardown 截断, 父任务/消费方拿到的是末轮思考独白而非任务报告。现补一次无工具收尾轮: system 指令「输出最终任务总结报告」+ tools=None(stream_round 空工具表), 成功则 push 报告文本+落库再走原收尾出口; 失败(全候选耗尽/MidStream/Stale)不重试不停靠, 静默落回原截断路径——报告是增益非闸门, 预算仅 1 轮 max_retries=0。

② 报告被视图压缩吞掉: summarize_tool_results 加新近度豁免(RECENCY_EXEMPT_TOOL_RESULTS=2), 末尾 2 条 tool_result 恒不压缩——豁免判定在冻结决策之前且不进决策表, 无前缀缓存漂移; 委托完成报告/末轮工具结果全文保留给 LLM 下一轮消费, 根治「>2KB envelope 下一轮即被 JSON 分支折叠 512 字符, 父 LLM 从未见过报告全文」。

测试: 新增 summarize_recency_exempt_keeps_last_two_tool_results 锁定豁免行为; cargo test -p devflow --lib 712 passed 0 failed; todo.md 两项销账。
2026-10-06 16:47:07 +08:00

64 KiB
Raw Blame History

DevFlow 看板已完成归档(2026-10-06 分离自主看板)

来源:docs/todo.md 已完成条目分离,勾选跨 09-29~10-06,含验收证据(G4)。恢复时整行搬回主看板。

[] - [x] P2-1 全局两刀 ✅(2026-10-06 本批:① global.css :focus-visible 兜底 outline 2px accent——全仓 outline:none 25 处散点不逐处改,键盘导航触发鼠标点击不显;② 弹层 overscroll-behavior:contain 滚动锁——实证类名清单 modal-overlay 10 处/TopBar 四面板 inline-list/ai-more-menu/confirm-box,选择器挂在 global.css 注释注明来源防漂移) [] - [x] P3-1 transition:all ✅(2026-10-06 本批:全仓 37 处/24 文件归零——逐处看 hover 态实动属性机械替换为 background/color/border-color/box-shadow/transform/opacity 具体属性清单,不禁用布局属性意外动画;vue-tsc EXIT 0) [] - [x] 第一批 P1 ✅2026-10-02 走查核验:I1 停止窄窗已修(ChatInput.vue:291 stopBtnState 读 conv_state)+I2 编辑死链已修(04acc42 canEdit+start-edit)+G2 破坏性回环熔断已实现(helpers.rs detect_destructive_loop)+V3 后台通知已修(e1dd0bc notify.rs 接线);V2 聚合层已修(useAiToolEvents 无条件入列,V5/V6 未逐项核)与 V1 审批徽标未修→留前端体验批 [] - [x] 第二批 P2:V8 草稿 per-conv 防串台✅(2026-10-05 核验:ChatInput watch convId setConvDraft/getConvDraft 已实现+mention/技能/图片临时态不跨会话携带)/R3 长回复带量提示✅(2026-10-05 核验:MessageList collapsedLongLabel 折叠态已带「N 字符/约 M tokens」量提示)+R4 代码块复制✅(aichat二批8e29271f)/I5 错误分类兜底✅(2026-10-05 核验:aiShared classifySendError 四类顺序敏感分类+ChatInput SEND_ERR_KEY 映射消费,原始错误留 {msg} 不丢)/V4 浮窗高风险二次确认✅(同批)/V7 排队时钟冻结✅(2026-10-05 核验:AiChat.vue nowTick 有排队时 1s interval 推进+queueTimedOut 显式读 tick,等待秒数/30s 超时横幅每秒重算,队列清空关表防泄漏)/R7 失败汇总✅(2026-10-05 本批:ToolCardList groupFailCounts computed 复用 isToolFailure 单点判定,组头红徽标「{n} 失败」+i18n 两键——轨迹卡聚合行/执行中步骤行既有失败计数外的组头盲区补齐)/R5+V9 消息内容检索(后端 IPC+前端搜索底座,唯一真缺口,独立批),排序详报告第五章 [] - [x] 第三批 P3 攒批:I8 ✅(2026-10-05 本批:stopChat 队列非空一次性 toast「已停止,N 条排队消息仍将自动发送」ai.queueWillContinue zh/en——停止≠清队预期对齐,全停走逐条取消/清队列)/I9 附件仅图片→I9✅(2026-10-05 本批:「📄 文件」按钮(ChatInput 📎 旁)——多选文本/代码/配置文件(57 扩展名白名单)读内容以 ```lang 代码块插入草稿,复用图片链 blobFromPath(convertFileSrc)零新依赖;单文件 256KB/5000 行双上限截断+提示;走既有文本发送链零协议改动)/I11 ✅(2026-10-05 本批:ChatInput INPUT_MAX_HEIGHT=200 常量四处 120px 硬编码全收敛,与 CSS max-height 同源——手工拉伸不再被按键压回)/I12 快捷键零提示✅(2026-10-05 本批:TopBar ... 菜单加快捷键入口 + AiChat Teleport 速查面板(Ctrl+N/I/R/L/K/B+Esc 七键,label 随 locale,mask 点击外部/Esc/✕ 三路关)——速查键位表与 onGlobalKeydown 同文件同居防漂移)/I13 ✅(2026-10-05 本批:Ctrl+I 聚焦输入框,AiChat 全局键区接入 chatInputRef.focus,输入焦点守卫让路)+R8 流式裸 diff✅(2026-10-05 本批:useMarkdown wrapNakedDiff 改 export,useStreamRenderer parseBlockNoCache 接入同源预处理——流式中裸 +/- 行即红绿 diff 块,守卫3围栏内不动保证与完成态幂等不双包)+R10 阅读锚点✅(2026-10-05 本批:三处 collapseAllToolLists 调用点(滚轮回调/消息快照 watch/agentRound watch)全加 isFollowingBottom 门——上滚阅读中新轮次不再强制收起正浏览的工具卡)+R11 新内容信号✅(2026-10-05 本批:回底按钮生成中非跟随态加 amber 脉冲点 ai-btb-new-dot 2s 循环)+R13 assistant 时间戳常显✅(2026-10-05 核验:UX 密度改造已消解——ai-msg-time 全仓零命中,≥30min 间隔 timesep 分隔线替代 per-msg 时间戳)+I10 重试文案名实不符✅(2026-10-05 本批:streamInterruptedAfterTool zh/en 改「可点重试续跑(整轮重跑,已完成工具会重新执行)」明示副作用)+R12 diff 回看✅(2026-10-05 本批:a patch_file 长 diff 展开入口(DIFF_PREVIEW_LINES=120 默认预览,「展开全部 {n} 行/收起 diff」toggle,parseDiffLines expanded 传 undefined 全量)/b write_file 覆盖写入 diff 回看(后端 file.rs rename 前读旧内容(仅 utf-8 ≤1MB)generate_diff 产 diff 字段,新建/base64 为 null 前端不渲染;前端同构红绿行渲染+展开按钮)——工具卡可回看改了什么不再只看字节增减)+V11 分离窗三连✅(2026-10-05 本批:a 置顶默认 false(useAiWindow detachPanel alwaysOnTop:false,原 true 盖住 VSCode/浏览器;开过置顶走 AiChat df-ai-always-on-top KV 恢复链不受影响)/b 收回主面板闭环(TopBar reattach 按钮+emit 链补 AiChat @reattach→emitReattachToMain Tauri 全局广播→主窗 registerMainReattachListener(label=main 判定)→store.reattachPanel——原 reattachPanel 全仓零 UI 调用只能手动重开面板)/c 活跃会话 KV 按窗口域分流(activeConvKvKey() 主窗 'df-ai-active-conv' 分离窗 '-detached' 后缀,读端 loadConversations+写端切会话/新建/自动路由/删除回落 5 处统一;治两窗独立 JS context 共写同一 KV 互覆——分离窗切会话重启后主窗被带跑;detachPanel 种子分离窗 KV,reattachPanel 关全窗后清 KV;useAiConversations 顶层 import getCurrentWebviewWindow 同步解析无启动竞态))+V12 滚动位置丢失✅(2026-10-05 顺手批:MessageList 切会话 watch 记旧会话 scrollTop(Map 限 20 个 LRU),换入有存档恢复存档位+setFollowing(false) 尊重阅读位,无存档保持回底——回读不再被打断)+9-28 #9-#17 详见下条;其中 9-28#17 图片默认上传外部域名涉开源边界,单独决策。V10 本批实施纠错:先误核销后复核发现 Ctrl+N 仍有 !store.state.streaming 守卫(生成中静默吞键)与按钮侧 F-09 真并发语义矛盾依旧,已撤守卫对齐按钮(新建不杀旧 loop,后台继续),vue-tsc EXIT 0 [] - [x] ✅ 同日已修:工具卡默认折叠刷屏+read_file/list_directory 单行摘要补齐+分组折叠幂等补齐(工作区待提交) [] - [x] P0 知识检索去整句 LIKE ✅已修(2026-10-02 核验:7c62d8d 接 search_keywords 分词,knowledge_inject 与 knowledge_search 工具两调用点实证,idea_repo.rs:699 纯函数+单测齐) [] - [x] P0 candidate→published 断链打通 ✅已修(机制先行 7c62d8d:复用自动晋升+knowledge_promote 工具+晋升补嵌入;存量晋升迁移 V43 2026-10-02 落地:candidate+confidence=high→published,库副本实证 854 条晋升 967/53→113/907,重跑幂等 0 行,df-storage 180 测试全绿;增量 confidence 分级与 auto_publish 默认值等 C3 拍板) [] - [x] P0 视图裁剪补滚动摘要 ✅已修(9b89610 淘汰补偿摘要插视图首部,user 角色保缓存指纹,纯视图不落库,eviction 11 测试全绿,2026-10-02 核验) [] - [x] P1 LLM 知识工具注册 ✅已修(7c62d8d 注册 knowledge_search/insert/promote 三工具,tool_registry.rs:798,检索与注入同源分词) [] - [x] P1 跨会话召回最小闭环 ✅实施完成(2026-10-05,设计 2026-10-04 设计文档 3 拍板 B1/B2/B3 全按建议):①提炼侧 resolve_source_project 两级弱推断——级 a boundary_json.dir_allowlist 首条反查 projects.path 前缀匹配(轻量词法归一 normalize_dir_for_match:斜杠统一+小写+去尾分隔),级 b 唯一 [项目:名称] mention 回退(B1 拍板:多项目不猜置 NULL),皆无→NULL=全局知识零回归;extract_knowledge_from_conversation 插入处赋 source_project。②注入侧 search_keywords_scoped 新方法(B3 拍板,旧签名保留 MCP 外部调用零影响,project_id=None 转调旧路径回归门)——三档排序:同项目 0/全局 NULL 1/异项目 2,档位作第一排序键 ASC(title 命分为同档第二键,防档位被 title 分稀释);build_knowledge_context 注入前同走 resolve_source_project。③单测 6 个:df-storage scoped×3(同项目压异项目高复用/三档顺序/None 回归门)+devflow resolve×3(目录归一/级 a boundary 命中/级 b 唯一 mention 命中+多项目不猜)。验收 cargo test df-storage 199 passed 0 failed(顺带修正 migration 测试断言常量 48→49:V49 loop_state 迁移注册后断言未跟进,现全绿)+devflow --lib 706 passed 0 failed+knowledge_inject 26 passed [] - [x] P1 存量测试修复 4 个 ✅已修(df3ed55 断言同步+e7cd035 笔误修正,2026-10-02 全量 cargo test --workspace 1827 passed/0 failed 复核) [] - [x] devflow/u-claw 两侧细勘察补全 ✅2026-10-04 完成(勘察补全):多轮锚定=channel 级单 chain 粘性会话(request_id 仅单指令标识,常驻 claude 各轮同 session_id,崩溃 --resume 恢复);协议已漂移——端点改 /ws/commander(commander/agent 角色,e8113c5),hello {kind,channel_id,token},不能照抄 9-28 文档/u-ppt relay.ts;新增核实:串行 worker+队列满丢弃、单条 15min 硬超时、进度 2s 节流、空闲链回收 7s 冷启动;接入实施批清单六步已列(含 per-conv channel_id 隔离策略) [] - [x] 第一批(日常直接受伤):#1 编辑末条消息入口丢失回归✅(2026-10-05 核验:MessageItem:126 编辑按钮+start-edit 链完整,I2 批已修)+#4/#5 排队消息被静默清✅(二批 8e29271f 修)+#6 后台会话错误气泡推错视图✅(forceConverge 气泡双过滤 !convId || convId === activeConversationId 才 push)+#7 429 无分类且重试照显✅(2026-10-05 核验:aiShared.ts:603 classifySendError 顺序敏感 429/限流先判+ChatInput SEND_ERR_KEY 分类文案) [] - [x] 第二批(多会话体验):#8 审批徽标跨会话误导+点击 no-op✅(2026-10-05 核验:state.pendingApprovals 已退化为当前活跃会话视图投影(aiShared.ts:364 per-conv Map 底座)+徽标点击→AiChat:243 scrollToFirstPending 委托链完整)+#3 en 重试气泡残留✅(2026-10-05 核验:useAiLifecycleEvents 终态收尾按 m.isRetry 标记匹配清除,替代旧中文文案子串匹配,en 生效)+#2 rejectedHint i18n key 多前缀✅(2026-10-05 核验:ToolCard.vue/useAiApproval/useAiToolEvents 消费点全已统一 aiTool.rejectedHint 路径,zh/en 两 locale 键位齐) [] - [x] 第三批随批清理:#10 user 时间戳+死样式✅(2026-10-05 核验:UX 密度改造消解——ai-msg-time 全仓零命中,≥30min timesep 分隔线替代)/#11 compressed 死代码✅(2026-10-05 核验:结论过时——compressed 段是 F-15 活代码(压缩摘要置顶显示不折叠),kind/模板/CSS 均在用)+#9 消息删除⏸️(2026-10-05 勘察:需后端 ai_delete_message IPC+前端全链(现仅 clearChat 整删/pop_last_assistant_round 弹末轮),纯前端只能视觉删除重启复活误导用户——与 #13 合并为「消息操作 IPC 协议级独立批」)+#12 token 面板✅(2026-10-05 顺手批:convTokenTotal 会话累计接入既有 token 详情 popover 尾部段(仅末条 AI 回复显,分 total/in/out 三行+分隔线样式)——只写不读的闲置数据源接上消费,非新面板零结构增量)+#13 中间错误重试错位⏸️(2026-10-05 勘察:需后端 IPC 加 from_id 参数+截断链(现仅 pop_last_assistant_round),协议级改动独立批)+#14 批量审批部分失败提示✅(2026-10-05 顺手批:batchApprove 部分失败从静默 console.warn 升级 ai-toast「批量完成:{ok} 项成功,{fail} 项失败」aiTool.batchPartialFail zh/en)+#15 ToolCallStarted 竞态✅(2026-10-05 顺手批:末条非 assistant 时兜底向前找最近 assistant 落卡,不再丢 running 卡;全程无 assistant 才保持原丢弃)+#16 注释与实现矛盾✅(2026-10-05 本批:注释纠偏——withConvOp failKey 错误气泡兜底实证(useAiConversations.ts:96),catch 内 console.error 留痕不重复提示)+#17 图片上传外部域名⏸️(2026-10-05 用户指示延后再论:涉开源边界,业务域名硬编码默认可 df-file-upload-base 覆盖,决策项不动代码)+B-260619-04③销账(实际已落地)。另 R5+V9 消息检索用户指示延后 [] - [x] 第四批(用户实测反馈 2026-09-29):批量读取文件时工具卡逐卡渲染刷屏 ✅已修——分组默认收起机制 6 月已有但为一次性初始化,流式场景首卡到达即触发完毕,组从 1 卡长到 N 卡不再折叠致 N 张单行卡全展开;改响应式补齐(组达 2 卡阈值即收起)+用户手动操作/审批展开记 touched 不被自动收回 [待办] - [x] 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> + :384 conv(&mut self, conv_id) 访问器 + :394 conv_read + tests_f09_per_conv 测试模块 + 决策e 真并发已上线(见文件末 F-09 决策e 段,CR-260620-02 审 PASS)****] — AiSession 单例 → 多会话并发架构(多窗口来回切 + 并行执行)。用户需求(3 条消息强化):「应用级支持同时具备多会话」+「同时具备多会话的能力」+「多个会话窗口来回切,并行执行」。现状(Explore 走查确认):AiSession 应用级单例(state.rs:164 ai_session: Arc<Mutex<AiSession>>,init:205),messages/generating/stop_flag/pending_approvals/agent_language 全一份。设计「单例 + 软隔离」——generating 互斥(同一时刻只一个对话能跑) + 切换旧 loop 退出(agentic.rs:177-190 B-260615-11) + 切换时 generating→readonly(commands.rs:873-881)。llm_concurrency per_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.ts detached 已有基础可扩,改动大但「窗口来回切」语义最贴)——待用户定,倾向先 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 窗口)。 [待办] - [x] F-260616-12 [P2] ✅ 已核验无问题:F-09 batch5 修正后 global permit 已移除(用户决策不设会话数上限),retry 仅持 per_conv permit(同 loop 内防自己挤占合理),代码注释标注 F-260616-12 核验通过。— 原 agentic.rs:238 重试持 permit 说法在 F-09 batch5 重构后已不适用。 [待办] - [x] S-260615-01 — ✅ 已解决(2026-08-09 用户确认):API Key 401 根因已定位解决,此待用户确认项销账。原为「用户跑直连测试(curl)区分 key/provider_type/base_url/model 哪项错」 [待办] - [x] UX-2025-12 [P2] ✅ 后端分页已落地(2026-06-28):ai_messages 加 list_recent 分页查询方法 + ai_conversation_load_more IPC + switch 返回最近 50 条 + has_more/earliest_seq 游标。前端滚顶加载 UI 待后续补充。 [待办] - [x] 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 [待办] - [x] F-260621-01 [P2/新功能] ✅ source 录入增强已落地(灵感捕捉模态框已含 source/tags/priority 输入字段,逗号分隔 tags 转 JSON): [待办] - [x] P1-D-260622 [P1] ✅ config 持久化已实现:setConfig 接入 uni.setStorageSync,懒加载从 storage 读回退 defaultConfig,新增 resetConfig 清除。— apps/df-miniapp/src/config.ts [待办] - [x] P1-A-260622 [P1] ✅ 心跳 pong 闭环已实现:relay 识别 {control_kind:"ping"} 构造 pong 回 miniapp(不经 device 透传),miniapp lastInboundAt 更新看门狗治半连接挂死。— crates/df-relay/src/relay.rs + apps/df-miniapp/src/api/ws.ts + apps/df-miniapp/src/composables/useAiChat.ts [待办] - [x] WC-P2-status-union — ✅ 已销账(2026-08-09):status union 已修 [待办] - [x] WC-P2-useAiEvents-胖 — ✅ 已销账(2026-08-09):useAiEvents 已拆 12 个 composable(useAiLifecycleEvents/StreamingEvents/ToolEvents 等,65c0f6b) [待办] - [x] 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) [待办] - [x] WC-P2-dfmcp-schema-required — ✅ 已销账(2026-08-09):required_names() 兼容 array/bool 两形态 + 三例单测(server.rs:277-294/491-522) [待办] - [x] WC-P2-bind-directory — ✅ 已销账(2026-08-09):tool_registry.rs:456-485 bind_dir_to_project 四要素齐全(id/路径校验/防重绑/stack探测) [待办] - [x] WC-P3-SubflowNode-风格 — ✅ 已销账(2026-08-09):subflow_node trait 顺序(execute→schema→node_type)对齐 ai/human 节点 [待办] - [x] WC-P3-script-注释 ✅ 已销账(2026-08-15 全文核验):script_node.rs 全部 env var 相关注释(:9/:144/:167 等)均已是「运行时配置优先、env var 回退」语义,无「替代纯 env var」矛盾表述,无需改动 [待办] - [x] UX-P0-1 ✅ 后端 commands/project.rs 4 处空 if 目录校验补 return Err(7f0edce) [待办] - [x] UX-P0-2 ✅ 后端 commands/ai/tools/git.rs exec_git 改返 (String,bool) 治假成功 + CREATE_NO_WINDOW(7f0edce) [待办] - [x] UX-P0-3 ✅ 后端 commands/module.rs run_git_cmd 加 CREATE_NO_WINDOW(7f0edce) [待办] - [x] UX-P0-4 ✅ 前端 DependencyGraph.vue 环高亮注入 renderGraph(7f0edce) [待办] - [x] UX-P0-5 ✅ 前端 FileExplorer.vue closeDropdown 加 closest 判定(7f0edce) [待办] - [x] UX-P0-6 ✅ 前端 Tasks.vue 快捷菜单 —— HEAD 早修(closeQuickMenu+listener+@click.stop,任务描述过时),销账 [待办] - [x] ✅ P1-a 长内容折叠(MessageList AI 文本气泡>1500 字 + ConflictResolver 多冲突 + HelpRequiredCard 堆栈,9e85cad) [待办] - [x] ✅ P1-b Dashboard 统计源解耦(治 H6/H7 翻页/筛选后统计错乱;统计走后端 count_tasks 独立通道,d1321af) [待办] - [x] ✅ P1-c 列表状态持久化 — 2026-08-09 核验销账:usePersistedRef 已接入 Tasks/Projects/Knowledge/Ideas/AuditLog;ProjectDetail Tab 手写 localStorage 按 projectId 隔离(动态 key,usePersistedRef 静态 key 不适用)保留 [待办] - [x] ✅ 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 持久化 [待办] - [x] ✅ 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) [待办] - [x] ✅ 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 刷新已重拉目录树,无独立缺口) [待办] - [x] ✅ P1-g store.tasks.filter 污染 — 2026-08-09 核验+补全销账:ProjectDetail 独立 taskApi.list 已修;ChatInput @项目 enrichment 独立拉取(projectTasksCache)已修 + @任务联想本批改独立全量缓存 taskSuggestionCache(隔离 Tasks 页筛选子集)+ mentionTotal 对齐 [待办] - [x] 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) [待办] - [x] 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 含列举命令且引用已列目录→警告,保守式不硬拒) [待办] - [x] 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 单点漏斗) [待办] - [x] 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:残尾均为已评估定案,无后续动作) [待办] - [x] 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:残尾均为已评估定案,无后续动作) [待办] - [x] 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 单测 [待办] - [x] P0-3 ✅ 已落地:main.rs:19-37 init_mcp_tracing(tracing-appender non_blocking 写 %TEMP%/devflow-trace.log,medium_audit warn 落盘) [待办] - [x] P1-4 ✅ 已落地(e722823):校验下沉 crates/df-storage/src/crud/task_validation.rs,df-mcp/GUI 复用同源函数 [待办] - [x] P1-5 ✅ 已落地(02c8d8e):db.rs busy_timeout(5s) + WAL + foreign_keys [待办] - [x] P1-6 ✅ 已落地(02c8d8e):server.rs:100-107 空闲超时 60s 退出(--idle-timeout 可配) [待办] - [x] P1-7 🟡 部分(设计取舍):高危默认拒 + 中危审计 + --read-only 可选;未做默认只读/写前确认(有缓解可接受)。✅ 关闭(2026-08-15:设计取舍已接受,无后续动作) [待办] - [x] 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 有意收敛 [待办] - [x] MR-P1-1 ✅ 已落地:chat/index.vue:66-131 splitStreamBlocks 块级 memo 流式渲染(currentText 不再纯 text 显语法字符;未闭合围栏降级 escapeFallback 属流式固有取舍) [待办] - [x] MR-P1-2 ✅ 已落地:mdRenderer.ts:203-207 table 显式 display:table(非 block)保留列对齐 + max-width/word-break 兜底 [待办] - [x] MR-P2-1 ✅ 已落地:mdRenderer.ts:198 img max-width:100% + border-radius(网络图依赖微信 downloadFile 白名单,非渲染代码) [待办] - [x] MR-P2-2 ✅ 已落地(2026-08-09 8cb666a):chat/index.vue segmentUserContent 分段渲染 [项目:名]/[任务:名]/[灵感:名] chip(命中已知实体才 chip,未命中保持字面,纯文本零回归) [待办] - [x] MR-P2-3 ✅ 已落地:mdRenderer.ts:167-172 input checkbox → ☑/☐ 字符符号 [待办] - [x] MR-P2-4 ✅ 已落地(8cb666a):highlight.js 14 语言高亮 + 代码块语言徽标(codeLangBadge,围栏 lang 显标签) [待办] - [x] MR-P2-5 ✅ 已落地:桌面 MessageList.vue:698-708 isToolResultJson 折叠(对齐 miniapp) [待办] - [x] MR-P2-6 ✅ 已落地(795e05f):settings/index.vue 编辑模式(setConfig + 脱敏 + resumeIfDisconnected) [待办] - [x] CSW-P0-1 — ✅ 已修:AiChat.vue:393-395 activeQueue computed 按 activeConversationId 过滤 + 模板 :70/:79 改用 activeQueue;queue 操作(cancel/edit/sendNow)经 useAiSend.ts:420-431 activeQueueRealIndex 映射真实下标,clear/forceSend 均传 convId [待办] - [x] CSW-P1-1 — ✅ 已修:useAiEvents.ts:101-102 非当前会话 AiCompleted 仍 emit ai-drain-queue(带 conversationId,未被 isCurrent 吞);useAiSend.ts:271-306 drainQueue 用目标 convId [待办] - [x] CSW-P1-2 — ✅ 已修:conversation.rs:363-368 非 live 分支先判 mem_has_unsaved(len>persisted_msg_count || needs_full_rewrite),有未落库内存则跳过 restore,DB 快照不再覆盖内存 [待办] - [x] CSW-P1-3 — ✅ 已修:conversation.rs:335/415-417 already_live 分支 pending 完全不动(不 finalize/不 retain/不从 DB 恢复),首屏用 per_conv 内存消息 [待办] - [x] CSW-P1-4 — ✅ 已修(2026-08-09):切到生成中 conv 首响应气泡丢失——前端 switchConversation(useAiConversations.ts:336-355)在 parse 成功、active 置位后,若 targetGen && 末条是 user 补前端占位 assistant 气泡(round0-pending- 判重),承接 currentText 供 MessageList isLastAi 流式渲染 + flushCurrentText 回填。纯前端,不需后端协同 [待办] - [x] CSW-P1-5 — ✅ 已修:conversation.rs:613-616 删除先登记 deleted_convs 再删库,save 入口 :259-265 命中直接 return + :416-426 INSERT 前二次校验,封死 Ok(None) 复活窗口 [待办] - [x] CSW-P1-6 — ✅ 已修:useAiConversations.ts:255-259 if (!force && id === state.activeConversationId) return 同 id 短路,不清文本不重拉 [待办] - [x] CSW-P1-7 — ✅ 已修:useAiConversations.ts:269/303-305 switchingConvs 集合缓冲切换往返窗口;useAiEvents.ts:110-115 非当前命中 switchingConvs 的 delta 累积到 per-conv 流式态而非 drop [待办] - [x] CSW-P1-8 — ✅ 已修:useAiConversations.ts:333-335 先 messages 后 active 同一同步块,parse 失败 catch :336-348 不切走,无 active/messages 错配 [待办] - [x] CSW-P2-1 — ✅ 已修:useAiConversations.ts:71-73 newConversation 首行 clearAllApprovalTimers() [待办] - [x] CSW-P2-2 — ✅ 已修:conversation.rs:356/400-405 仅 !conv_was_present 才复位 session_trust/model_override/agent_language [待办] - [x] CSW-P2-3 — ✅ 已修:conversation.rs:211-226 save_conversation_serialized 持 per-conv 锁(mod.rs:696-701 save_locks)串行化 DELETE+INSERT,20+ 调用点无旁路 [待办] - [x] CSW-P2-4 — ✅ 已修:state.rs:561-565 clear_session_allowed_dirs_if_idle 仅在 active_convs().is_empty() 才清,后台 loop 文件工具不丢临时授权(三调用点 create/switch/delete 均用 _if_idle) [待办] - [x] CSW-P2-5 — ✅ 已修:useAiConversations.ts:67/75-76/110 _newConvLock 防抖 + 300ms 释放 [待办] - [x] CSW-P2-6 — ✅ 已修:streamingGuard.ts:78 带 convId 写 per-conv 流式态,无 convId 才写全局 [待办] - [x] PD-P0-1 — ✅ 已修(2026-08-09 e6760e8):DependencyGraph 调 register({shape:'vue-shape',component:ModuleNode}) + ModuleNode 改 props.node?.getData?.() 双兜底(vue-shape 传 {node,graph} 非 data,主代核 x6 源码确认) [待办] - [x] PD-P1-1 — ✅ 已修(a9cb802):module.rs git status 加 -c core.quotepath=false 一行根治中文乱码 [待办] - [x] PD-P1-2 — ✅ 已修(e6760e8):remove_project_module 删工程前级联清 module_dependencies(FK 约束) [待办] - [x] PD-P1-4 — ✅ 已修(a9cb802):projectTasks 加 df-data-changed 本地监听(entity=task,200ms 防抖,overview 活跃才刷) [待办] - [x] PD-P1-5 — ✅ 已修(a9cb802):df-data-changed 写文件后重拉 gitStatus + GitChanges refreshKey prop(修徽标清零+不刷新) [待办] - [x] PD-P1-6 — ✅ 已修(a9cb802):FileTree toggleDir 错误改行内态(toggleErrors 按 path),不炸整树 [待办] - [x] 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) 重置折叠态 [待办] - [x] 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 [待办] - [x] PD-P2-11 🟡 打开文件 tab 全量 git 扫描(后端 5s 缓存已缓解,懒加载留设计) / PD-P2-12 ✅ 已修:FileExplorer/DependencyGraph 用 KeepAlive 保活(onActivated 守卫) / PD-P2-13 ✅ 已修(e6760e8):loadModules 重置 cycleNodes / PD-P2-14 ✅ 已修:前端禁用已存在组合 + 后端幂等 [待办] - [x] AC-EFF-C0-1 — ✅ 已修(2026-08-09 d09d136):AnthropicRequest.system 改 untagged SystemBlock 枚举(Plain/Cached),cache_control:{type:ephemeral},开关 ANTHROPIC_CACHE_ENABLED 默认关 [待办] - [x] AC-EFF-C0-2 — ✅ 已修(d09d136):system 稳定段/易变段分离——日期+项目/任务清单+augmentation+知识注入挪消息流末尾 merge_volatile_tail(治跨天失效+前缀稳定),开关关逐字等价现状;df-ai 492 测试通过 [待办] - [x] AC-EFF-R1-1 🟡 全量历史重放(cache_control 命中后 O(n²) 实际降为 cache_read,增量机制待后续) / AC-EFF-R2-1 ✅ 已修(0300764):count_recent_failures+check_stall_breaker 改 recent_messages 尾窗口 40 条 [待办] - [x] AC-EFF-L0-1 — ✅ 已修(0300764):save_conversation 无变化捷径提前判定(无变化不 clone/truncate/构建 records) [待办] - [x] AC-EFF-L0-2 — ✅ 已修(0300764):system prompt 数据指纹缓存(OnceLock+entity_fingerprint,省每轮 DB 查询+拼接) [待办] - [x] AC-EFF-L0-3 — ✅ 已修(c41f4ad):压缩后台化 tokio::spawn fire-and-forget + is_compressing 防重入,当前轮正常走不阻塞 [待办] - [x] AC-EFF-T1-1 ✅ 已修(c41f4ad):AiToolExecutionRepo.insert_batch 单事务批量,审计砍串行尾巴 / T1-2 ✅ 已修:只读缓存轮内去重(同轮重复 (tool,args_key) 只真执行一次) / T1-3 🟡 git 工具不进缓存(留待后续,module.rs git 缓存未共享) [待办] - [x] AC-EFF-S1-1 ✅ 已修(c41f4ad):流式增量渲染(已完成块跨帧缓存 + 只重 lexer 末块增长段,单块>12000 降级纯文本) / S1-2 🟡 长尾代码块 hljs(随 S1-1 缓解,高亮缓存留待) [待办] - [x] AC-EFF-F1-1~3 — ✅ 已修(0300764):scheduleConversationsRefresh 250ms trailing debounce 收敛回合双拉+notify 自触发+无防抖 [待办] - [x] AC-EFF-S2-1 ✅ 已修(c41f4ad):MessageList 双渲染合并(currentText 条件改 streamingBlocks.length>0,每 delta 只 rAF 一次) / S2-5 ✅ 已修:AiCommandOutput 50ms+4KB 合批(砍事件风暴) [待办] - [x] WK-1 ✅ 已修(2026-08-09 0554cc1):ActiveProjectsPanel 改 status !== completed/cancelled + 状态映射对齐 7 态(in_progress→coding/testing→testing/releasing→release),删 active 键 [待办] - [x] WK-2 ✅ 已修:Knowledge 操作前快照 index,selectNextCandidate 直接按同位置取后续 [待办] - [x] WK-3 ✅ 已修:updateStatus/archive 返布尔,失败 toast + 中止推进 [待办] - [x] WK-4 ✅ 已修:promoteIdea/relateIdeas 去内部 loadIdeas + _activeIdeaQuery + Ideas.vue loadCurrentView() [待办] - [x] WK-5 ✅ 已修:Ideas/IdeaDetail 状态菜单排除 promoted [待办] - [x] WK-6 ✅ 已修:7 态 status-* 色类提取全局 components.css(列表+详情+项目统一) [待办] - [x] WK-7 ✅ 已修:Ideas 改 error-banner,失败不清理选中态,deleteIdea 返布尔 [待办] - [x] LW-1 ✅ 已修(0554cc1):ConfirmDialog Enter 分支加 BUTTON 排除(焦点在取消不再误触删除) [待办] - [x] LW-2 ✅ 已修(7795fe6):update_project 白名单剔除 id/created_at + status 值校验 + path relocate 同款校验 + stack JSON 校验 [待办] - [x] LW-3 ✅ 已修(7795fe6):update_idea status 值校验 + 拒绝 status=promoted + related_ids/scores JSON 校验 [待办] - [x] LW-4 ✅ 已修(7795fe6):update_task queue 补 validate_queue + queue/status 一致性校验 [待办] - [x] LW-5 ✅ 已修(7795fe6):count_by_query 补齐 assignee/queue/parent_id/module_id 维度 [待办] - [x] LW-6 ✅ 已修(7795fe6):update_field_active(WHERE id AND deleted_at IS NULL) 软删拒改 [待办] - [x] LW-7 ✅ 已修(7795fe6):evaluate_idea 起始 guard 终态返 Err [待办] - [x] LW-8 ✅ 已修(7795fe6):claim_promotion CAS(WHERE id AND promoted_to IS NULL) 防双击重复立项 [待办] - [x] LW-9 ✅ 已修(7795fe6):create_task/update_task parent_id/move_task_queue 后 recompute_parent_status [待办] - [x] MC-1 ✅ 已修(7795fe6):MCP update_project status 保留原值(对齐 update_task 收口) [待办] - [x] MC-2 ✅ 已修(4387695):df-project normalize_path 拆 normalize_for_compare/canonicalize_for_store,存库保留大小写(调用点迁移留后续) [待办] - [x] MC-3 ✅ 已修(4387695):df-tunnel 文档更正——自动重连已在 src-tauri supervisor 实现(lib.rs:292 轮询+指数退避),避免双重竞争;backoff_delay 改 pub 供 supervisor 复用 [待办] - [x] MC-4 ✅ 已修(4387695):df-relay 成本评估选文档明示风险 + validate_device_id 最小加固(per-device token 留 Phase3) [待办] - [x] MC-5 ✅ 已修(7795fe6):is_success_tool_call 按 result.isError 判定,业务失败不触发写回调 [待办] - [x] MC-6 ✅ 已修(7795fe6):create_idea priority normalize + create_project/task 拒空名 + bind_directory 降级;evaluate 复用 ScoringEngine 未做(独立口径声明,df-mcp 不依赖 df-ideas 避免重 HTTP 依赖树) [待办] - [x] MC-7 ✅ 已修(2026-08-09):df-ideas 自洽性校验(enforce_score_consistency 分档一致性,ARC-260618-01-e 已实施) + df-types Priority::from_i32(0-3/Low 兜底对齐读侧) + script 措辞修正 [待办] - [x] RLY 附加 ✅ 已修(4387695):token 固定时间比较 + 入站帧 1MB 上限 + 未设 token 改错误退出(不再 panic) [验收标准] - [x] SC-260811-P1-1 ✅ 已销账(2026-08-15 核验,1b012bc 覆盖):task_state_machine.rs:155 shortest_path BFS 推导 + task_advance_node.rs:81-84 非法转换错误信息附加最短路径提示(路径>2 跳时),+6 单测 [验收标准] - [x] P0 压缩 conv_id 分裂【已亲核实锤】:commands/chat.rs:1734 起 cid 切 active——压缩后台会话时目标 conv compressing 永久卡死 + active 会话被插入他人摘要入库。修::1734 改 cid = conversation_id.clone()(约 4 行,首位) ✅已修(2026-10-04 核验:压缩路径全函数用 conversation_id,零 active_conversation_id 引用,注释含修复说明) [验收标准] - [x] P0 V21 迁移 COUNT 幂等窗口:df-storage/migrations.rs:481-488,570 批次中途崩溃→剩余对话永不迁移但版本号补齐。修:按对话进度标记替代全局 COUNT ✅已修(2026-10-04 核验:已改逐对话进度判定——批事务保证对话级原子,已落库数=JSON 消息数即跳过,重跑只补未迁对话) [验收标准] - [x] P1 conv delete 不停 in-flight loop:commands/conversation.rs:608-640 无 stop_flag/epoch bump——zombie 复活+审批吊死。与上方「conv 删除族 6 处」同域合并做 ✅已修(2026-10-04 核验:删除路径全链齐备——tombstone deleted_convs 先于 DB 删+stop_flag/notify/epoch bump 同锁停 in-flight loop+级联停子代理+审批 retain 清理+conv_states/per_conv/save_locks/semaphore 全量摘除+loop_was_alive 时 emit_ai_completed_once 单点补终态事件(带 epoch 守卫天然防重复)) [验收标准] - [x] P1 只读结果缓存无写失效:audit/cache.rs 写后读回过期内容。修:per_conv 脏标记,写后整体失效 ✅已修(2026-10-04:PerConvState 新增 readonly_cache_floor 失效下界——非只读工具 completed 回填后推进到 messages.len(),find_cached_readonly_result 扫描 skip(floor) 过界即脏;4 个写执行回填点全接入(Low 并行/trust 放行/boundary 放行/ai_approve 审批后)+min(len) 钳制防索引漂移+单调 max;ai 域 608 测试全绿含 2 个新增锁定测试) [验收标准] - [x] P1 OpenAI 流式 error 帧被 choices 必填整帧丢弃:df-ai/openai_helpers.rs:193-203(无声截断)+ 同批 serde 结构错误判 Retryable(anthropic_compat.rs:629/openai_compat.rs:527) ✅已修(2026-10-04 核验:OpenAiStreamChunk.choices 改 #[serde(default)]+error:Option 字段提取,apply_openai_sse 识别 error 帧返 error 载荷由 stream_llm 发 AiError;双协议非流式改 text 先取后 from_str 分层——读取中断(is_decode)判 Retryable,JSON 结构错判 Fatal 防确定性失败白烧重试预算) [验收标准] - [x] P1 sanitize 合并连续同 role 丢多模态 parts:df-ai/context/sanitize.rs:406-425 带图消息图对 LLM 隐身。修:合并分支 extend parts ✅已修(2026-10-04 核验:ensure_sequence_legal 合并分支已含 if let Some(parts) = m.parts { last.parts.get_or_insert_with(Vec::new).extend(parts) }——纯图空 content 消息的 parts 随合并迁移,图不再隐身) [验收标准] - [x] P2-2 maybe_auto_compress protect_start 跨锁过期切片 panic:context_lifecycle.rs:118 加 min(len) 钳制(一行,与 F2 前移同域) ✅已修(2026-10-04 核验:第二段锁内 let cut = protect_start.min(msgs.len()) 钳制已在,注释明确记载跨锁窗口消息变短防御,与 compress_old_messages 内部钳制口径一致) [验收标准] - [x] P2-3 try_continue_agent_loop 裸 emit 绕过 emit_ai_completed_once:agentic/helpers.rs:100/:171 占位 tool_result 与 pending 残留 ✅已修(2026-10-04 核验:两处非续跑分支(!should_continue 与 !still_generating)均改走正典 emit_ai_completed_once(零 token+notify=false),随出口终态化占位 tool_result+清 pending_approvals,注释记载防 PENDING 占位残留) [验收标准] - [x] P1 后台审批/授权事件被 isCurrent 丢弃→会话挂死:useAiEvents.ts:94-123 !isCurrent 分支对 ApprovalRequired/DirAuthRequired 放行(与 P2-5 审批数组 per-conv 合并同域) ✅已修(2026-10-04 核验:isGlobalApprovalEvent 白名单(AiApprovalRequired/AiDirAuthRequired)+isCurrent 守卫改双条件 !isCurrent && !isGlobalApprovalEvent(event),审批挂起跨会话放行归口 per-conv 待审批集合) [验收标准] - [x] P1 switchConversation「对话不存在」兜底漏置 activeId:useAiConversations.ts:294-309 补一行(视图/高亮/发送目标三重错配) ✅已修(2026-10-04 核验:兜底新建路径已含 state.activeConversationId = created.id 置位+持久化,注释记载旧 id 残留致 isCurrent 误路由;另附 P3-7 noCreateFallback 程序化跳转分支) [验收标准] - [x] P2 看门狗 legacy/per-conv 双轨三错配:useAiSend.ts:169/:241/:512 统一迁移传 convId + _resumeAttempts 收尾清(债务本就要还) ✅已修(2026-10-04 核验:regenerate(:183)/editMessage(:259)/stopChat(:512+)三处均已传 per-conv convId 重置/清理看门狗,stopChat 收尾 clearResumeAttempts(activeConversationId),注释明确记载「不再落 legacy 单 timer fallback」) [验收标准] - [x] P2 _lastDeltas 双路径漏清:useAiEvents.ts:96-115/:154-161 补 clearLastDelta ✅已修(2026-10-04 核验:后台终止分支(:217)与停靠卡归集分支(:131)均补 clearLastDelta,前台收尾 cleanupTerminatedConversation 亦有显式清理,注释记载防残留记录误丢下轮同内容 delta) [验收标准] - [x] P2 removeGoal 不回写 store/不回滚:TopBar.vue:530-539 对齐 withConvOp 模式 ✅已修(2026-10-04 核验:removeGoal 已回写 conv.pinned_goals = next(注释 UX 走查-对话域 B4),防 loadGoals 重读旧列表复活已删目标) [验收标准] - [x] P2 forceConverge 收敛/错误气泡缺 activeId 守卫 ✅已修核验销账(2026-10-05):per-conv 触发守卫已在 forceConverge 入口(会话已删除或已收敛即清态早退 useAiStream.ts:96-103)+补气泡双过滤(仅 !convId || convId === activeConversationId 才 push,:138-139,后台会话静默收敛气泡不错位) [验收标准] - [x] remote_bridge 6 处 + agentic/mod.rs 4 处裸 emit 换 emit_ai_chat_event ✅已收核验销账(2026-10-05):grep 全库 \.emit\("ai-chat-event" 仅剩正典 event_bus.rs:87 本体+注释+有意分路的 completed_once(mod.rs:2588 注释保护),remote_bridge 已全走 publish_event/emit_ai_chat_event 双写正典——DRY-B #1 批次顺带收口,文档滞后案 [验收标准] - [x] i18n searchFilesBlocked 死键裸 @ ✅已修(2026-10-04 狗粮实证批⑤:zh-CN/en aiChat.ts 裸 @ 改 @ 转义,文档滞后案,2026-10-05 复核确认) [验收标准] - [x] model_fetch 空列表 Ok([]) 上层写回清空模型池 ✅已修(2026-10-03 N1):provider.rs 空守卫跳过写回+前端 toastFetchEmpty 同语义守卫 [验收标准] - [x] save_conversation needs_full_rewrite 复核 ✅已核+已修(2026-10-03 N1):实锤增量/无变化路径写库期间新置 dirty(压缩 mark)被 advance 无条件误清→改动滞留内存;改 advance_persisted_count(new,full_rewrite_applied) 仅全量清+新测试锁死;secret.rs 仍未走查 [验收标准] - [x] authz_debug 残留 ✅已清(2026-10-03 N1):全仓 grep 零残留(chat.rs/state.rs 注释提及已删) [验收标准] - [x] P1 分离窗下 TaskDrawer 关联会话死点击:openConversation detached 分支无跨窗信号不聚焦(useAiConversations.ts:661) ✅已修核验销账(2026-10-05):openConversation detached 分支已 emitDetachedOpenConversation 跨窗信号+分离窗 handleDetachedOpenConversation 承接切换+not_found toast 落承接窗,注释明确记载 UX走查 P1-1 [验收标准] - [x] P1 后端 外层 960s 超时 drop 子循环 future→统一出口全跳过(报告蒸发+注册表泄漏+子会话滞留):deadline 检查下沉 stream chunk 循环或 select 超时分支特殊化补 AiAgentFinished(truncated)(audit/mod.rs:306) ✅已修(2026-10-05 核验:audit/mod.rs:326-329 子代理外层 deadline=SUB_AGENT_WALL_TIMEOUT_SECS+60 缓冲,循环内以截断报告优雅收尾非硬腰斩,「报告蒸发」注释原文在案) [验收标准] - [x] P2 rejected_tools 前端丢弃不可扫描:完成卡收字段+warn 色 chip(useAiEvents.ts:70) ✅已修(2026-10-05 核验:aiShared.ts:630 rejected_tools 字段+MessageList:1453 warn chip「工具名×次数」+title 全清单) [验收标准] - [x] P2 完成卡纯内存重启蒸发:切换/挂载按 origin='sub_agent' 回补(aiShared.ts:630) ✅已修(2026-10-05 核验:aiShared.ts:677 ai_sub_agent_list 反查重建,轨迹存在即视为 completed) [验收标准] - [x] P2 完成卡恒贴底时序漂移:按完成轮次桶插入(MessageList.vue:1080) ✅已修(2026-10-05 核验:renderItems 内按 finishedAt 落桶插桩,「不恒贴消息流最底部」注释在案) [验收标准] - [x] P2 轨迹浮层无身份标识:头补 res.title/任务书首行(MessageList.vue:1584) ✅已修(2026-10-05 核验:agentPeekSubject{agent,convTitle,task,taskFull} 四字段+任务行取子会话首条 user 消息首行) [验收标准] - [x] P2 后端 白名单执行期不拦 Low 工具:allowed 随子循环传入 process_tool_calls(audit/mod.rs:814) ✅已修(2026-10-05 核验:audit/mod.rs:217 P2-1 执行期白名单判定纯函数+whitelist-clamp 拒绝语义「spawn 时被裁剪或不存在」人话提示) [验收标准] - [x] P2 后端 父删除级联孤儿轨迹照落库 ✅已实施核验销账(2026-10-05):CascadeStopForm::Delete 形态已落地(sub_agent.rs:268 cascade_stop_children_locked,行282 deleted_convs.insert 同锁补标记,与出口 alive 判定互斥注释在案;出口 sub_agent.rs:551-555 见标记即放弃落库防空壳复活)——文档滞后案 [验收标准] - [x] P2 后端 S4 反查 LIMIT 1000 先截断后过滤:匹配条件下沉 SQL 或辅助索引(audit/record.rs:315) ✅已修(2026-10-05 核验:P2-3 task_id 预筛下沉 SQL——result LIKE 参数化预筛缩小窗口,精确判等仍在 Rust 侧 match_task_audit_row,「禁裸 LIKE 判等」不破,预筛只多放不漏放+单测锁定) [验收标准] - [x] P3×15(前端7+后端8):✅(2026-10-05 销账核验:15 条实际全部已落码或已缓批登记——deny envelope 人话渲染(parseDenyEnvelope+deniedTool i18n)/浮层 Esc(closeAgentTraceOnEsc+切会话 closeAgentTrace)/spawn_agent 本地化(spawnAgentPrefix zh/en)/卡 loading(agentPeekLoadingId spinner)/停止标「已取消」(stop_kind 结构化+fallback 启发式)/后台完成通知(agentFinishedToast)/已删会话静默新建(uf1 noCreateFallback)/空收敛降级(dx1 empty_convergence)/流后取消补 envelope(P3-3)/bypass 连带解除黑名单(P3-4 PathBypass 三态分流)/落库元数据错位(P3-5 SaveMetaOverride)/peek 校验(agentFinNoTrace 禁点+title)/事件广播噪音(P3-2 文档补全确认)——todo 行未勾属滞后;唯 AiAgentStarted 缓批「子代理运行面二期」+并发配额挤兑缓批已立项)——见两报告 P3 节 [验收标准] - [x] P1[确定性] 子代理指引真空:父会话实测蒸馏的四段工具纪律(read_symbol 优先/URL 三工具纪律/重复调用检测/get_app_config)未注入子代理 system prompt,而白名单缺省下发 25+ Low 工具,主会话已根治的翻车模式(一次死磕烧 1/3 预算)会在子代理原样复发;修法=抽共享指引段同源拼接 ✅已修(2026-10-05 核验:prompt.rs sub_agent_tool_discipline_section 同源拼接,sub_agent_system_prompt 内引用,obscura 交互条款已在共享函数内裁剪) [验收标准] - [x] P2 max_tokens=8192 截断零信号:finish_reason=length 被通道层按正常完成吞,报告腰斩仍标 completed[确定性可修] ✅已修(2026-10-05 核验:RoundOutcome::Continue 携 truncated_by_max_tokens 全链穿透,收敛时追加「⚠ 回复因 max_tokens 上限被截断」系统提示 mod.rs:1915-1925) [验收标准] - [x] P2 空回复静默假成功(子代理侧) ✅已修(2026-10-05 核验:sub_agent.rs:384-397 末轮空白降级 Truncated+stop_kind=empty_convergence,不再 Completed+空报告失真;主循环侧同语义归无人值守 P2 批) [验收标准] - [x] P2 任务书=首条 user 消息,超预算时第一个被逐出且子代理无目标钉扎(主循环有,子循环显式传空 sub_agent.rs:594)[确定性可修] ✅已修(2026-10-05 核验:P2-2 任务书钉扎—— 全文并入 system prompt「上下文裁剪不可逐出」段) [验收标准] - [x] P2 预算三值(轮次/token/900s)不告知子代理,系统提示词硬编码「默认最多 6 轮」[确定性可修,文案] ✅已修(2026-10-05 核验:sub_agent_system_prompt(max_rounds) 动态注入三值实际生效值+防回归断言禁「默认最多 6 轮」文案回潮) [验收标准] - [x] P2 Fatal 错误细节被吞(RoundOutcome::Fatal 无 payload),父拿无因报告无法针对性重派[中小扩参] ✅已修(2026-10-05 核验:sub_agent.rs:897 P2-4 Fatal 携最后诊断文本进出口报告,封顶防超长污染) [验收标准] - [x] 观察 uf2 修复引入:取消判定 summary.includes('已被取消') 中文子串启发式,根治=后端透出结构化 stop_reason/取消标志字段 ✅已根治核验销账(2026-10-05 本批,文档滞后案):结构化字段已全链落地——后端 SubAgentStopKind::Cancelled 两处取消检查点同点产出(sub_agent.rs:716/824)+ AiAgentFinished.stop_kind 事件透出(serde 单测锁定)+ 前端 agentFinStatusText 结构化优先(MessageList.vue:1127,cancelled/max_rounds/wall_clock/token_budget 细分直达语义);中文子串判定降级为旧后端兼容性回退(无 stop_kind 字段才走),防御性保留非主路径 [验收标准] - [x] P0 git.rs:161 字节切片撞 UTF-8 边界 panic(中文 diff 必炸,13:44 两次实证) ✅已修(分析当场,回退字符边界) [验收标准] - [x] P1 Temperature 原样透传不支持的模型(sensenova 等仅允许 1,9 次 400 实证)——按模型适配/省略 ✅已修(2026-10-04:ModelConfig 加 temperature_supported 字段+presets 标 sensenova-6.7-flash-lite=false+启发式 sensenova 前缀判定;openai/anthropic 双协议转换层不支持即省略字段;df-ai 560+df-ai-core 33 测试全绿含新增锁行为测试) [验收标准] - [x] P1 压缩无 memoization:view-only 压缩 2280 次中 369 组同内容反复压(最坏 54 次),prompt 1.2 亿 tokens=completion 115 倍——同内容哈希跳过 ✅已修(2026-10-05 核验:PerConvState.tool_compress_cache 内容哈希→压缩结果,mod.rs:1682 接线,双调用点主循环+子代理,agentic 122 测含) [验收标准] - [x] P1 标题采到 assistant 首句('信息已足够。让我看一眼...'/'

<summa')——标题源取 user 首条 ✅已修(2026-10-05 核验:title.rs:62 两段式采样——user 首条必进锚定主题+其余按序补足 6 条) [验收标准] - [x] P2 日志无轮转且放 %TEMP%(系统清理无声删除,建议迁数据目录+按大小轮转) ✅已修(2026-10-05:logging.rs 双进程共用——落点迁 app_data_dir/{identifier}/devflow-trace.log+启动期 5MB 轮转保留 .1+旧 %TEMP% 日志迁移清理,3 单测锁定) [验收标准] - [x] P2-M1 MessageItem 三操作按钮 hover-only:键盘聚焦不可见+触屏不可达(MessageItem.vue:129-136,217-219)——补 :focus-within 显形+aria-label,一处 CSS ✅已修(2026-10-05:.ai-msg-user:focus-within 两选择器入组+编辑/复制按钮补 aria-label) [验收标准] - [x] P2-T1 TopBar 四面板徽章 span@click 键盘不可达(TopBar.vue:138 等,面板行为层已完备仅入口缺失)——改 button 或补键盘三件套 ✅已修(2026-10-05:四徽章 span→button type=button+.ai-tool-badge 归零按钮默认样式+focus-visible 描边) [验收标准] - [x] P2-T2/T3 TopBar 约 8 处交互 div/span(@click 无键盘处理):provider 切换(:30)/审批徽章(:18)等——统一改 button ✅已修(2026-10-05:审批徽章 div→button+provider-bar div→button,两处 CSS 归零+focus-visible;余 model select 原生可聚焦,more 菜单已是 button) [验收标准] - [x] P2-G1 流式输出无 aria-live:读屏用户对 AI 回复零感知(MessageList.vue 全文零命中,唯一例外 ApprovalOverlay role=alert)——容器加 role="log" aria-live="polite" ✅已修(2026-10-05:.ai-messages 容器加 role=log+aria-live=polite) [验收标准] - [x] P3-M2/G4 按钮仅 title 无 aria-label(MessageItem:129-137/ChatInput 仅 :53 一处) ✅已核验(2026-10-05:MessageItem 编辑/复制按钮 aria-label+svg aria-hidden 已齐,残留 ChatInput :53 一处,下批顺带) [验收标准] - [x] P3-G2 装饰性图标缺 aria-hidden ✅已修(2026-10-05 机械批:ps1 正则 (?s)<svg(?![^>]*aria-hidden) 批量插入 193 处(22 文件含多行开标签;前置核验全库零 role=img/