Files
DevFlow/temp/后续批次预排-2026-10-03.md
T
lxy 36bc485112 优化: 界面交互完善与设置体验
- 审批卡尊重滚动意图,等长切换回底,排队超时按钮修活
- 带图编辑提示不静默丢,删除目标回写,切换文案消歧
- 会话键盘可达+搜索态重命名,筛选计数口径对齐
- 子任务提示正名,看板加载态
- 主题跟随系统,表单脏态拦截,密钥显隐留空提示
2026-10-03 16:27:48 +08:00

129 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后续批次预排(2026-10-03)
> 定位:批次4 从轮廓细化为可派工颗粒 + 子代理增强线排期 + 专项债/待拍板 + 时序总览。
> 第二批(2c/3c)细化不重写,见 `temp/下一批次规划-2026-10-03.md`(已解锁可立即派工)。
> 锚点均本会话 grep 实测;行号漂移处改写函数名。派工时仍以现场源码复核为准。
> 复核结论:走查报告 P0 压缩 conv_id 分裂(chat.rs:1734)已由 W1 修(现 :1740 `cid = conversation_id.clone()`);V21 断点续迁已落地(v21_crash_midway_resumes 测试在)——两项不进未修池。
## 一、批次4 细化(第二批后)
### 4a df-storage 清债(走查报告 P2 ①-⑨)
| # | 锚点 | 修法一句话 |
|---|------|-----------|
| ① | `conversation_repo.rs:20` ai_provider_from_row(:58 unwrap_or(1)/:61 unwrap_or(50)) | 列缺失降级保功能但补 warn 留痕,坏数据可观测 |
| ② | `conversation_repo.rs:269/:286` 手写 BEGIN/COMMIT | 改 `guard.transaction()`,panic 不残留打开事务 |
| ③ | `conversation_repo.rs:612` insert_checkpoint OR IGNORE | 核对 affected 行数,冲突不静默 |
| ④ | `message_repo.rs:164` `limit.max(1)` | limit=0 语义定案(返空集)+ 注释,消除 0 被钳成 1 的分裂 |
| ⑤ | `task_validation.rs:50` validate_parent_id | 父任务存在性校验补 `deleted_at IS NULL`,回收站父拒挂子 |
| ⑥ | `project_service_repo.rs:128` impl_repo! 宏 update 路径 | 宏生成 update/update_full 绕过 validate_record,对齐 :198 update_full_with_validation 收口 |
| ⑦ | `project_module_repo.rs:172 delete` / `:190 delete_by_project` | 删模块先清 module_dependencies 依赖边再删,FK 不再报错 |
| ⑧ | `task_repo.rs:800` update_full_cas(缺 deleted_at,updated_at TEXT 等值) | CAS 补 `deleted_at IS NULL`(与 P1-9 同批:project_repo/宏 crud/mod.rs:183-196) |
| ⑨ | `task_repo.rs:30` / `idea_repo.rs:107` / `project_repo.rs:114` from_db_str.unwrap_or_default | 未知 status 降级加 warn,防 update_full 回写放大 |
**颗粒评估**:单项均小(1-20 行+单测),任一项单代理一轮内自证 `cargo test -p df-storage` 合格,无需再拆。
**同文件依赖分组(防互踩硬约束)**:
- 组A1(conversation/message repo 读侧):①②③④ — 碰 conversation_repo.rs + message_repo.rs
- 组A2(task 域):⑤⑧⑨-task — 碰 task_validation.rs + task_repo.rs
- 组A3(project/service/idea 域):⑥⑦⑨-project/idea — 碰 project_service_repo.rs + project_module_repo.rs + project_repo.rs + idea_repo.rs
- 派工形态:A1 一代理,A2+A3 一代理(同 crate 串行验证),共 2 并发。⑧ 的 P1-9 连带文件(project_repo.rs:452、crud/mod.rs 宏)归 A2/A3 各自域内。
### 4b df-ai 清债(P2 ⑪-⑳,⑲ 提优先)
| # | 锚点 | 修法一句话 |
|---|------|-----------|
| ⑲ | `df-ai/src/ai_tools.rs:257` tool_signature(消费点 src-tauri helpers.rs:266 / tool_registry.rs:2641) | 签名归一化补参:read_file+search、search_files/grep+offset/limit/-i/output_mode、run_command+working_dir——合法换参不再共享签名误触 G2 熔断 |
| ⑳ | `ai_tools.rs:241` 附近 SigValKind::Json 组 | 不只用 keys[0],全键参与归一化 |
| ⑪ | `intent.rs:185/:194` "api"/"hi" 规则 + `:423` contains 匹配 | 关键词加词边界,"history" 不再判 Chat 0.9 |
| ⑫ | `context/mod.rs:308` restore_from_messages | 重放后重置 pending_topic_marker,消假话题锚点 |
| ⑬ | `context_helpers.rs:73-80` URL 图 token 地板 | 地板不被 ×0.35 稀释(1600 保底) |
| ⑭ | `context_helpers.rs:879` sync_after_compress | JSON 解析失败补 warn 不吞 |
| ⑮ | `context_helpers.rs:828` build_injection | 修脏窗口 off-by-one(少注一轮) |
| ⑯ | `context/sanitize.rs:236/:315` TOOL_MISSING_PREFIX | 前缀即「已配对」判定补边界(真 orphan 仍自愈) |
| ⑰ | df-ai manager_tests 恒零断言(报告 :401-405/:484-489) | 改造为真断言或删,测试资产去水分 |
| ⑱ | `src-tauri chat.rs:810/:2112` begin_turn 调用点 | begin_turn 喂原文而非变换后文本(调用方漂移归位) |
**颗粒评估**:单项 1-15 行+单测,单代理一轮自证 `cargo test -p df-ai` 合格。⑨⑳ 同文件必须同代理。
**同文件依赖分组**:
- 组B1(签名域):⑲⑳ — 碰 ai_tools.rs + src-tauri 两消费点回归
- 组B2(context 域):⑫⑬⑭⑮ — 碰 context/mod.rs + context_helpers.rs(可吸收 ⑰)
- 组B3(sanitize+intent 域):⑪⑯ — 碰 intent.rs + context/sanitize.rs
- 组B4:⑱ — 碰 chat.rs,**与 2c 压缩段(chat.rs:1697-1830 域)互斥,必须 2c 之后**(同文件硬约束)
- 派工形态:B1/B2/B3 三代理并行;B4 并入 2c 收尾或其后单点。
### 4c 编排/网络 latent(㉑-㉝,按启动需要挑)
推荐挑 4 项(实测锚点均在):
| # | 锚点 | 修法一句话 |
|---|------|-----------|
| ㉗ | `retry.rs:77` `1u64 << (attempt - 1)` | 改 `saturating_shl`/封顶,位移溢出 + 预算口径对齐文档 30s |
| ㉙ | `sse_parser.rs:153` BUF_MAX 截头 | 截头改保尾(保留最近完整事件边界),防 JSON 永久破损 |
| ㉜ | `openai_helpers.rs:310-311` finish_reason 判定 | content_filter 纳入终态,无 [DONE] 流也有收敛 |
| ㉑ | `git_worktree.rs:175` merge-tree 三参数形态 | 三参 merge-tree 语义复核(base,branch,base 存疑),预检失效修参数序 |
- 颗粒:各单文件单点,一代理串 2-3 个(df-ai 网络域 ㉗+㉙+㉜ 一组;㉑ git 域单独评估)单轮自证。
- 其余(㉒ coordinator JoinSet panic 缺项、㉓ 清理吞错、㉔ 路由全禁用静默回落、㉕ plan_executor 假并行、㉖ namespace 上限突破、㉘ 未知 provider 回落、㉚㉛ usage/tool_use 缺省、㉝ model_probe 误判)挂池,专项或顺带修。
## 二、子代理增强线排期(依赖序)
> 现状锚点:事件 `src-tauri .../ai/mod.rs:238` AiAgentFinished{agent_id, conversation_id=父, summary, status, rounds, tokens};出口 `agentic/sub_agent.rs:320` 统一 emit;前端全仓 grep 零消费。子轨迹落库(V44 origin 列)已完成待提交。
| 步 | 内容 | 锚点/勘察点 | 验收标准 |
|---|------|------------|---------|
| S1 | AiAgentFinished 前端展示 | 新增消费点挂 useAiEvents 族;父会话内轻量卡(状态+轮数+tokens+summary 摘要) | 父会话可见子代理完成卡;后台会话不串视图(带 conversationId 过滤);Truncated/Failed 有区分样式;vue-tsc 0 |
| S2 | 子代理审批挂起 | **勘察先行**:sub_agent.rs grep「approval」零命中——子会话工具审批现状(trust 默认放行?)须先定语义再实施;事件路由复用 AiApprovalRequired 挂子 conv_id | 子代理高危工具触发审批卡可批可拒;批准后子代理续跑、拒绝后 AiAgentFinished{status:"failed"} 优雅终止;依赖 3c pendingApprovals per-conv 合并先落 |
| S3 | 轨迹调用树 | 数据源=origin='sub_agent' 落库轨迹(V44)+ Started/Finished 事件;父会话展示子代理列表,点击进子会话只读轨迹(复用会话加载链) | 多子代理父会话树形可见;子会话消息可回看不可写;主列表不出现子会话(过滤已落地,回归验证) |
| S4 | TaskDrawer 跳转 | `src/components/task/TaskDrawer.vue`(Tasks.vue:388 挂载)加「关联会话」入口;**勘察点**:spawn_agent 是否已存 task→conv 关联字段,无则补 | 任务抽屉可跳转到关联会话并激活;无关联时入口隐藏不占位 |
依赖关系:S1 最轻可先派(建议等提交换装后,联调即跑真后端);S2 依赖 3c 审批数组合并 + 勘察结论;S3 依赖 V44 提交换装(迁移落 origin 列);S4 依赖 S3 的会话定位或独立勘察。文件域:S1/S3 前端 ai 组件族、S4 TaskDrawer.vue,互斥可并行;S2 前后端同碰,单独派。
## 三、专项债 / 待拍板(搬运 + 新观察)
**搬运(源自下一批次规划§二/§四,不重复展开)**:ai-router/sanitize 重构;run_agentic_loop 拆分(w4 已落地,职责边界评估窗口已到,可启动);df-mcp 多进程 3P0;C1/C2/C3 知识线拍板;9-28#17 图片外域开源边界。
**新观察(本轮 grep/走查增量)**:
- 流式健壮性专项候选(P1-1 error 帧+㉙+㉜+㉚/㉛ 同家族):分散修会反复开同类账,建议聚成小专项一次收口。优先级高——「无声截断/无终态」直接伤日常可用性。
- 子代理审批语义空白(S2 勘察前置项):若现状为 trust 默认放行高危工具,属安全债,S2 优先级应升。
- save_conversation needs_full_rewrite 复核(走查报告「待下批核对」):核查型半天任务,建议塞进 4a A1 组顺带核,不单开批次。
- ⑰ 测试恒零断言:成本低收益是资产保真,随 B2 顺带。
## 四、时序总览
| 时序 | 内容 | 状态 | 并行关系 |
|------|------|------|---------|
| T0 | 提交+换装(子轨迹落库+第一批六路+上下文管理批) | **等用户令** | 阻塞其后的换装依赖项(S3 迁移、S1 联调) |
| T1 | 第二批 2c(删除域)+3c(UX 两代理) | **可立即派工** | 2c/3c 互不碰可并行;2c 先于 4b-B4(chat.rs 互斥) |
| T2 | 批次4:4a(A1/A2+3 两代理)‖ 4b(B1/B2/B3 三代理)‖ 子代理线 S1 | 批次4 在第二批核查销账后 | 4a/4b 同 workspace 但不同 crate 文件域,可并行;S1(前端)与 4a/4b(后端)文件域互斥可并行 |
| T3 | 批次4 收尾:4b-B4(chat.rs:810/:2112)+ 4c 按需(网络域组/git 域) | 2c 后 | 单代理串修 |
| T4 | 子代理线 S2(审批挂起,依赖 3c)→ S3(轨迹树)→ S4(TaskDrawer) | 排队 | S2 前后端同碰单独派;S3/S4 与批次4 后续可并行 |
| T5 | 专项债/立项(run_agentic_loop 拆分评估、流式健壮性专项、大方向 3/5/6/8/9) | 用户定优先级 | 各自立项设计先行 |
原则:提交换装点全程只有 T0 一处(攒批等令);每批核查销账后再放下一批;同文件依赖(chat.rs、ai_tools.rs、conversation_repo.rs)已在组内吸收,跨批互斥仅 chat.rs(2c→B4)一处。
## 五、UX P2/P3 批与遗留池排期(2026-10-03 晚追加)
> 来源:三域 UX 走查(temp/UX走查-*-2026-10-03.md,P1×8 已当轮修复)+ 各批遗留登记。
> 经验蒸馏已沉淀:docs/01-技术文档/多代理流水线实战经验-2026-10-03.md。
### UX-P2 批(换装后即派,4 路并行文件零交集)
| 路 | 内容 | 文件域 |
|---|---|---|
| P2-chat | 对话域 6 项:排队超时 computed 非响应式/队列静默清空提示/审批超时串扰/审批卡强拉滚动/等长切换不回底/编辑丢图 | ChatInput/AiChat/aiShared/ToolCardList/MessageList |
| P2-conv | 会话侧 4 项:筛选计数矛盾/失败气泡错配/键盘可达性(菜单 Esc)/搜索态重命名 | ConversationSidebar 族 |
| P2-task | 任务侧 3 项:子任务 toast 文案错位/看板加载态/拖拽静默弹回提示 | Tasks/TaskDrawer |
| P2-set | 设置域 6 项:快捷键焦点守卫/主题跟随系统/顶栏切换语义/托盘首关提示/表单脏态拦截/密钥显隐 | App.vue/TopBar/settings 族 |
### P3 打磨批(P2 销账后,攒一批 24 项按域 2-3 路清)
### 遗留池归并
- F2 心跳前移(chat.rs/mod.rs 空窗已开,可并入任一后端批)
- removeGoal 回写(TopBar.vue:530)/streamingGuard 全局清 queue(多会话)→ 并入 P2-chat
- ⑥ update_field settings 白名单旁路(无调用方,低危)→ 4c 池
- S2-B 真审批通道(三批:挂起路径→resume 通道→超时前端)→ **等用户对产品语义拍板**
- 4c 挂池 9 项(㉒㉓㉔㉕㉖㉘㉚㉛㉝)→ 按专项/顺带修归入后续
### 更新后时序
T0 提交换装(唯一等令点)→ UX-P2 批 4 路并行 → P3 打磨批 ‖ 4c 挂池 ‖ S3 轨迹树(依赖 T0)→ S4 TaskDrawer → 专项债/S2-B 按拍板。