状态:已交付(2026-09-01) 依据:用户报障——①笔记页知识扩展报错
Invalid column type Null at index: 0, name: trajectory_json;②笔记页使用 AI 精修长时间卡在处理页面
| # | 位置 | 根因 | 影响 | 修复 |
|---|---|---|---|---|
| 1 | db_ai_tasks.rs get_ai_task_trajectory |
行存在但 trajectory_json 列值为 NULL(旧任务/失败任务/轨迹未写入)时,row.get::<String> 因 rusqlite 严格类型检查抛 Invalid column type Null(v0.16.0 预存缺陷;测试仅覆盖"无行→None",漏"行存在列 NULL"分支) |
AI 对话页「AI 任务」查看轨迹(含知识补充任务)即报错,任务视图不可用 | 改 Option<String> 读取 + 双层 Option 拍平(列 NULL 与无行同语义→诚实 None);补回归测试(行存在列为 NULL → Ok(None)) |
| 2 | components/NoteAiDialog.tsx |
误用本地自建 taskIdRef,从未设置 useAiTaskPolling 内部的 taskIdRef.current(事件通道过滤与派发参数的数据源)→ 轮询/事件均以 taskId=null 派发 → ai_refine_result 反序列化失败被 .catch(() => null) 吞掉 → running 永不翻转;且任务推进到 Running 会不断刷新"30s 卡住检测"时间戳 → 卡住提示永不触发 |
笔记级精修(手写笔记)完成后无限"精修中/处理中",工作台不可达 | 改用 hook 返回的 taskIdRef(发起/重生成统一赋值——与 AiRefineCard/EnrichPanel 同模式);防御:结果取回失败不再静默(提示到 AI 对话页查看) |
- Rust:新增回归测试(NULL 列 → None)通过;全量 1880/1882 通过(仅 2 例 note_filter 预存失败 TD-30-B)
- 前端:vitest 64 文件 496 用例全绿;tsc 零错误
- 此前交付:v0.17.0(REQ-245~247,精修可到达度)