Skip to content

Latest commit

 

History

History
85 lines (67 loc) · 6.54 KB

File metadata and controls

85 lines (67 loc) · 6.54 KB

v0.12.5:AI 精修线路修复——工作台采纳前右侧恒空 + 精修流程优化

状态:代码已交付(2026-08-23) 依据:用户对话 2026-08-23(① 点击「AI 精修」→ 模型返回数据 → 选「打开工作台」后左侧规则版有内容、右侧精修版无内容,显然是 Bug;② 要求思考并优化精修线路) 前置:v0.12.4(旧改动完整性修复)真机验收待执行;v0.12.2(笔记页信息架构重构)未启动

一句话

精修任务成功后到采纳前,工作台右侧恒空("尚未精修"占位)——数据源链路断裂的集中体现; 同版做精修线路优化:完成即自动打开工作台(消除"打开工作台/放弃"中间步)、 采纳落库回传真实 taskId(标记 adopted + 成本回填,堵重复采纳口子)、 重新生成接入父级任务管线(消除卡片状态残留)、后端未采纳结果持久化兜底(重启可恢复)。

范围

# 项目 类型 落点
1 采纳前工作台右侧恒空 P0 修复 commands_ai_refine.rs(refine_workbench 三级数据源)+ db_ai_tasks.rs(find_latest_unadopted_refine)+ RefineWorkbench.tsx(回传 refineResult)
2 完成即自动打开工作台 P1 线路优化 AiRefineCard.tsx(Succeeded → 直开工作台;工作台内含 采纳/放弃/重新生成 三出口)
3 采纳落库回传 taskId P1 缺陷修复 RefineWorkbench.tsx(apply 传 taskId——标记 adopted + 成本回填;原恒传 null)
4 重新生成走父级管线 P1 缺陷修复 RefineWorkbench.tsx(onRegenerate 回调)+ AiRefineCard.tsx(复用 start 管线:running 态+轮询/事件+卡住检测)
5 版本号与文档 伴随 v0.12.5(package.json / Cargo.toml / tauri.conf.json)+ 本文档 + CHANGELOG + 索引

根因(M1:采纳前右侧恒空)

  • 调用链:精修任务成功 → 前端拿到 AiRefineResult(仅内存,含 refinedMarkdown)→ 点「打开工作台」→ RefineWorkbench 非只读路径无条件调 refine_workbench(sessionId) → 后端 refined_markdown 只取 find_note_by_session(已落库笔记)→ 采纳前笔记不存在 → None → 右侧渲染"⚡ 尚未精修"占位 → 左侧有内容、右侧为空。
  • 竞态佐证:run_refine_task 先 set_task(Succeeded)(推事件)后 finish_ai_task(DB 落库)—— 即便数据源改成读未采纳任务,事件先行也会让工作台偶发读不到。
  • 前端明明持有完整结果却只用于启用采纳按钮——数据源设计遗漏(v0.11.5 引入,真机验收漏测)。

交付内容

M2 · 工作台数据源三级修复(P0)

  • 后端 refine_workbench 新增可选参数 refine_result: Option<AiRefineResult>(Tauri 对 Option 参数向后兼容,旧调用不变):① 调用方内存结果(采纳前刚完成——消除 DB 竞态)② 最新未采纳成功任务(新增 Db::find_latest_unadopted_refine:ai_tasks 表中 op_type='refine' AND ref_id=session AND state='succeeded' AND adopted=0 AND result_json NOT NULL 按时间倒序取 1——重启后同样可回显,与 list_restorable_succeeded 同数据面、按会话粒度) ③ 已落库笔记最新版本(采纳后)。规则草稿/锚点剥离/章节 diff 仍单一口径在服务端。
  • 前端 RefineWorkbench:非只读携带 taskResult 时 invoke 回传 refineResult: taskResult(不重复实现锚点剥离——单一来源原则);无 taskResult(重启/恢复路径) 传 null 走后端兜底。
  • 采纳前成本不做虚假回填(meta.cost_yuan = None——成本在 apply 时按模型单价核算)。

M3 · 线路优化(P1)

  • 完成即自动打开工作台:任务 Succeeded → setShowWorkbench(true)。原"打开工作台 / 放弃 (保留规则版)"中间步冗余——工作台本身就有 采纳落库/放弃/重新生成 三个出口,自动打开 少一次点击且结果不可错过;关闭后卡片保留「🔧 打开工作台 / 放弃」按钮可重开。
  • 采纳落库回传真实 taskId:ai_refine_apply 收到 task_id 后标记任务 adopted + 回填成本——原工作台恒传 null,任务记录保持未采纳 → 重启后任务中心仍可"查看/采纳"该结果, 再次采纳会产生第二份笔记(重复建笔记风险);与任务中心采纳路径(已带 taskId)收敛一致。
  • 重新生成接入父级管线:工作台 onRegenerate 回调复用卡片 start()(running 态 + 轮询/事件双通道 + 30s 卡住检测);原实现工作台直连 ai_refine_start——卡片停留在旧结果的 "done" 态且新任务无进度可见(状态残留)。

验证

  • Rust:新增 2 项单测——find_latest_unadopted_refine_by_session(同会话取最新未采纳 / 已采纳、他类、不存在均正确排除)+ stats_from_aggregates_section_lines(工作台统计口径); 全量 cargo test 通过(既有基线失败项与本版无关)。
  • 前端:tsc --noEmit 零错误;vitest 全绿(新增 RefineWorkbench.test.tsx 4 项回归: refineResult 契约回传 / null 兜底路径 / 采纳 taskId 7 / refinedMarkdown=null 占位不崩)。
  • 真机验收路径(待执行):会话 → AI 精修 → 完成后工作台自动打开,右侧精修版有内容且带 章节 diff 徽标 → 采纳落库 → 任务中心该任务显示"已采纳";重启后任务中心无"查看/采纳"入口; 放弃后任务中心仍可查看(持久化恢复路径)。

已知问题与后续

  • 放弃语义:工作台「放弃」仅关闭(结果留未采纳记录)——任务中心仍可恢复/采纳, 属"可反悔"设计而非永久丢弃;若需"拒绝"语义可后续加任务状态(记需求池)。
  • 锚点章节徽标:含时间戳锚点的章节标题,diff 徽标装饰可能不命中(渲染为 chip 后与 原文匹配失败)——预存展示层现象,非本版引入,不影响内容展示。
  • 重复精修:同一会话再次精修会产生第二条笔记(v0.11.5 现状,apply 恒新建)——本版 未改采纳语义,记需求池评估"同会话复用笔记"。

关联

  • 依据链路:用户 Bug 报告(右侧无内容)→ 源码证据链(refine_workbench 数据源仅已采纳笔记 / 事件先于 DB 落库 / apply taskId 恒 null / regenerate 直连命令)→ 三级数据源 + 管线收敛。
  • ADR:无(行为修复 + 流程优化,架构方向未变)。