状态:代码已交付(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 + 索引 |
- 调用链:精修任务成功 → 前端拿到
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 引入,真机验收漏测)。
- 后端
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 时按模型单价核算)。
- 完成即自动打开工作台:任务 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.tsx4 项回归: refineResult 契约回传 / null 兜底路径 / 采纳 taskId 7 / refinedMarkdown=null 占位不崩)。 - 真机验收路径(待执行):会话 → AI 精修 → 完成后工作台自动打开,右侧精修版有内容且带 章节 diff 徽标 → 采纳落库 → 任务中心该任务显示"已采纳";重启后任务中心无"查看/采纳"入口; 放弃后任务中心仍可查看(持久化恢复路径)。
- 放弃语义:工作台「放弃」仅关闭(结果留未采纳记录)——任务中心仍可恢复/采纳, 属"可反悔"设计而非永久丢弃;若需"拒绝"语义可后续加任务状态(记需求池)。
- 锚点章节徽标:含时间戳锚点的章节标题,diff 徽标装饰可能不命中(渲染为 chip 后与 原文匹配失败)——预存展示层现象,非本版引入,不影响内容展示。
- 重复精修:同一会话再次精修会产生第二条笔记(v0.11.5 现状,apply 恒新建)——本版 未改采纳语义,记需求池评估"同会话复用笔记"。
- 依据链路:用户 Bug 报告(右侧无内容)→ 源码证据链(refine_workbench 数据源仅已采纳笔记 / 事件先于 DB 落库 / apply taskId 恒 null / regenerate 直连命令)→ 三级数据源 + 管线收敛。
- ADR:无(行为修复 + 流程优化,架构方向未变)。