- 审批卡尊重滚动意图,等长切换回底,排队超时按钮修活 - 带图编辑提示不静默丢,删除目标回写,切换文案消歧 - 会话键盘可达+搜索态重命名,筛选计数口径对齐 - 子任务提示正名,看板加载态 - 主题跟随系统,表单脏态拦截,密钥显隐留空提示
12 KiB
后续批次预排(2026-10-03)
定位:批次4 从轮廓细化为可派工颗粒 + 子代理增强线排期 + 专项债/待拍板 + 时序总览。 第二批(2c/3c)细化不重写,见
temp/下一批次规划-2026-10-03.md(已解锁可立即派工)。 锚点均本会话 grep 实测;行号漂移处改写函数名。派工时仍以现场源码复核为准。 复核结论:走查报告 P0 压缩 conv_id 分裂(chat.rs:1734)已由 W1 修(现 :1740cid = 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:238AiAgentFinished{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 按拍板。