优化: 待审查 CR-260619-12/13 审查回填(均 ✅ PASS)
CR-12 P1+重试:✅ PASS 🔴0🟡1⚪1 - message_id 传递完整 + 老数据兼容 + 症状1+2 + 重试不丢参数 - 🟡 MED-1 主代已修(flushCurrentText 向前找占位) CR-13 任务查询:✅ PASS 🔴0🟡0⚪1 - df-mcp spec status 待补(中文 Edit 编码限制,handler 功能就绪) 清理审查 agent 遗留重复登记块。
This commit is contained in:
41
docs/待审查.md
41
docs/待审查.md
@@ -1020,6 +1020,47 @@
|
||||
|
||||
---
|
||||
|
||||
### CR-260619-12 消息级溯源 P1 + 流式失败重试修复(context/audit/知识/knowledge_timeline/chat/useAiEvents·commit d3e7640) — ✅ 已审(PASS·🟡1⚪1)
|
||||
|
||||
- **结论(2026-06-19·独立 grep/read 核验 commit d3e7640 源码当前形态 + cargo test --workspace 复跑)**: ✅ **PASS** — 🔴0 🟡1 ⚪1
|
||||
- **验证**: 独立 grep/read 核验 7 文件源码当前形态(diff 快照对比) / `cargo test -p df-ai context::tests::last_` 4 测全绿(last_assistant_message_id_returns_latest / last_user_message_id_returns_latest / last_message_id_none_when_no_such_role / last_message_id_none_for_legacy_no_id) / `cargo test --workspace` 全 11 crate 0 failed(df-ai 139 passed 含 4 P1 新测 / df-workflow 23 / 其余全 ok)。
|
||||
|
||||
**5 维度逐项核验**(源码当前形态为准,非 diff 快照):
|
||||
|
||||
| # | 维度 | 判定 |
|
||||
|---|------|------|
|
||||
| 1 | P1 message_id 传递完整性 | ✅ audit/mod.rs 6 处 audit_tool_call 全传 current_message_id(:283 rejected / :319 pending / :396 auto_dedup / :429 pending / :483 auto_trust / :536 auto,独立 grep 确认无遗漏·cache.rs:106 仅注释引用非调用) / process_tool_calls :224-227 取 `session.conv_read(conv_id).messages.last_assistant_message_id()`,agentic/mod.rs:882 assistant_with_tools 已 push 后 :913 才调 process_tool_calls,取到的就是本轮 assistant id / 知识提炼 knowledge_inject.rs:355-361 反向扫描 messages 取末条 assistant id / 4 处 build_knowledge_context(chat.rs:151/317/951/1115)全传 user_message_id.as_deref() / 对抗性核验:新构造 ChatMessage(provider.rs:47/50/53 user/assistant/assistant_with_tools 全 `id: Some(new_message_id())`)非 None,**无 None 泄漏到已处理 assistant** ✅ |
|
||||
| 2 | 老数据兼容 | ✅ ChatMessage.id=None(老反序列化)→ last_assistant_msg_id/last_user_message_id 返 None(context.rs:483 `and_then(\|t\| t.message.id.clone())` 直接透传 None)→ source_ref 降级 conv:{conv_id}(knowledge_inject.rs:455-458 match / knowledge_timeline.rs:91-94/108-111 match None 分支),**无 conv_msg:None 无效值** ✅ |
|
||||
| 3 | 症状1 修复(useAiEvents.ts) | ✅ AiError :401 flushCurrentText 在 :404 `state.currentText=''` 前(顺序正确) / flushCurrentText :134 `last.role==='assistant' && !last.isError` 跳错误气泡(AiStreamRetry :199 push 的 isError 气泡) / AiError 错误气泡 :417 在 flush 之后 push(不冲突) / **对抗性场景核验**:AiStreamRetry→AiError 链路下末条是 isError 气泡,flush 跳过不覆盖错误提示 ✅ / AiAgentRound/AiCompleted 正常路径末条非 isError,`!last.isError` 仍 true 正常回填,无副作用 ✅ |
|
||||
| 4 | 症状2 修复(ai_regenerate) | ✅ chat.rs:109-124 `pop_last_assistant_round` 返 false 时取 `all_messages_clone().last()` 判 `MessageRole::User`,last_is_user=true 不报错直接走重跑路径(末尾 user 等价重发) / false 仅在空对话/末尾非 user 才 `conv.generating=false; return Err("没有可重新生成的回复")` ✅ |
|
||||
| 5 | 重试不丢参数 | ✅ ai_regenerate :172 spawn `run_agentic_loop(...)` 入口读 `session.conv(&conv_id).messages` 完整历史(agentic/mod.rs:570/668 全量 messages 迭代),不丢历史参数 ✅ |
|
||||
|
||||
**🟡 MED-1**(`src/composables/ai/useAiEvents.ts:401`): AiStreamRetry→AiError 失败重试链路下部分回复仍可能丢。场景:流式失败→AiStreamRetry push/更新 isError 气泡(末条变 isError)→重试耗尽→AiError flushCurrentText 取末条(isError 气泡)被 `!last.isError` 跳过,**部分回复不会回填到占位 assistant 气泡**(占位气泡 content 仍为空),随后 :404 `state.currentText=''` 清空,本轮部分回复丢失。纯 AiError(无 AiStreamRetry 前导)路径完全有效,仅重试耗尽链路存在覆盖盲区。建议:flushCurrentText 跳过 isError 时改为回填到「isError 气泡之前的最近非 isError assistant 气泡」,或 AiError 收尾前显式查找占位气泡回填。
|
||||
|
||||
**⚪ LOW-1**(`src-tauri/src/commands/ai/knowledge_inject.rs:355`): 知识提炼 source_ref 取「对话最新 assistant」(反向扫描全量 messages,非提炼窗口 recent 6 条内的最新)。OnComplete 异步 spawn 时序下,若 OnComplete 触发后用户又发新消息(虽 OnComplete 通常即时触发),last_assistant_msg_id 可能指向非真正产出该条知识的 assistant。精度边界非正确性问题,source_ref 仍指向对话内合法 assistant,展示侧兼容。注释已说明设计选择(「确保取到对话最新 assistant,即便它不在提炼窗口内也属于本轮 AI 产出」)。
|
||||
|
||||
**审查防污染印证**:
|
||||
- audit 6 处调用方计数:独立 grep audit_tool_call 命中 finalize.rs:22 定义 + mod.rs 6 调用(:283/319/396/429/483/536)+ cache.rs 注释引用。**与登记项「6 处」一致**,无遗漏无多算。
|
||||
- chat.rs build_knowledge_context 调用方计数:独立 grep 命中 4 调用(151/317/951/1115)+ 1 定义(knowledge_inject.rs:200)。**与登记项「4 处」一致**。
|
||||
- assistant push 时序:注释声称「agentic.rs:882 已 push」,独立 Read agentic/mod.rs 确认 :882 `session.conv(&conv_id).messages.push(msg)` 在 :908 has_tool_calls 判断 + :913 process_tool_calls 之前,**取到的 last_assistant_message_id 就是刚 push 的本轮 assistant**(provider.rs:53 assistant_with_tools 必生成 id 非 None),对抗性核验成立,无 None 泄漏。
|
||||
- cargo test --workspace 独立复跑 EXIT 0(非主代自报),11 crate 全 ok,df-ai 139 passed 含 4 P1 新测,印证 memory [[review-batching-worktree-transient]] 教训(源码形态 > check 快照)。
|
||||
|
||||
- **待修项回流 todo**: **无** 🔴/🟡 项(🟡 MED-1 主代已修:flushCurrentText 改从末尾向前找非 isError 占位 assistant 写入,AiStreamRetry→AiError 链路部分回复不再丢)
|
||||
|
||||
### CR-260619-13 任务查询按状态过滤(list_tasks status·commit 2f8b13f) — ✅ 已审(PASS·⚪1)
|
||||
|
||||
- **结论(2026-06-19·独立 grep/read 核验 commit 2f8b13f)**: ✅ **PASS** — 🔴0 🟡0 ⚪1
|
||||
- **核验**:`cargo check -p df-mcp -p devflow --manifest-path src-tauri/Cargo.toml` EXIT 0。逐维度核验源码当前形态(commit 后):
|
||||
- **维度1 status 过滤正确性** ✅:tool_registry.rs:620-622 `args.get("status").and_then(|v| v.as_str())` → `tasks.retain(|t| t.status == status)`。TaskRecord.status: String(models.rs:59),`String == &str` 通过 PartialEq 成立;status 不传时跳过 retain(可选)语义正确。df-mcp tools.rs:357-359 `list.retain(|t| t.status == *st)` 同理。
|
||||
- **维度2 7 态完整** ✅:task_advance_node.rs:147 spec enum `["todo","in_progress","in_review","testing","done","blocked","cancelled"]` 与 commit 文案 7 态逐字一致。filter 纯 String 相等不校验合法性(未知 status 返空集,无 crash/panic),行为可接受。
|
||||
- **维度3 df-mcp 一致** ⚪:handler 功能就绪(tools.rs:349,357-359),**但 spec(tools.rs:108)只声明 `project_id`,未声明 `status`** —— MCP 客户端无法从 schema 发现该参数。commit message 已声明「spec 声明待补(中文 Edit 编码限制)」,已知延后。记 ⚪ WATCH-1。
|
||||
- **维度4 不破坏现有** ✅:tool_registry project_id 分支(:614-618)+ offset/limit/has_more(:624-627)路径不变;df-mcp project_id_filter + list_active 不变,新增 status 仅追加 retain。注意 df-mcp 原代码 `if let Some(pid) = project_id_filter` 改为 `&project_id_filter`+`*pid`(借用重构),行为等价(project_id_filter 仅借用未移动)。
|
||||
- **⚪ WATCH-1**:df-mcp list_tasks spec(tools.rs:108)未声明 status 参数,MCP 客户端 schema 不可见。commit 已声明延后补(中文 Edit 编码限制),后续补 schema 时一并补 status field。
|
||||
- **状态**:✅ 已审(PASS)
|
||||
- **待修项回流 todo**: **无** 🔴/🟡 项
|
||||
|
||||
---
|
||||
|
||||
## 已审归档
|
||||
|
||||
> 已审 CR 段迁独立文件: [待审查归档/2026-06.md](./07-项目管理/待审查归档/2026-06.md)
|
||||
|
||||
Reference in New Issue
Block a user