P0 快捷键让行判定补 recoveryDismissed,点过「稍后再说」不再全失效; P1 冲突重载加 force 绕过防竞态守卫;路径分隔符 joinPath 原生化 + samePath 归一化比较;.source-cm 补文档字色; P2 turndown 启用 GFM 插件(HTML 导入不再丢表格);任务复选框去掉 click preventDefault(浏览器激活撤销覆盖视觉同步); P3 新增 syncEditorContent:干净标签的挂载/卸载序列化回写同步基线, 切标签不再误标未保存。vitest 74 通过 + 2 跳过。
4.7 KiB
4.7 KiB
验收缺陷回修报告(对应 docs/13 首轮 Windows 验收,2026-11-14)
用户真机验收结论「未通过」,报回 7 项缺陷(P0×1、P1×3、P2×2、P3×1),全部已修。
验证:npx tsc -b 0 错误;npx vitest run 74 通过 + 2 跳过(新增回归 3 例:tabs 基线同步、复选框点击同步、HTML 表格导入);npm run build 通过。本地未推送,待复验。
P0 全局快捷键全失效(恢复弹窗点过「稍后再说」后)
- 根因:审计修复时给全局快捷键加的「任一弹窗打开时让行」判定用了
recoveryOffer.length > 0,没算「已点稍后再说」的状态——草稿记录还在库里,offer 就一直在,判定恒真,Ctrl+N/O/S/F/W 全部被让行。 - 修复:判定改为
recoveryOffer.length > 0 && !recoveryDismissed,与渲染条件一致。
P1 B3 冲突「重新加载磁盘版本」无效
- 根因:审计 A3 的防竞态守卫(脏标签不许自动重载)把冲突弹窗这条「用户主动丢弃本地修改」的路径也挡了——弹窗关了、正文没换。
- 修复:reloadTabFromDisk 增加
force参数;自动轮询走守卫路径,冲突弹窗的「重新加载」传 force 绕过守卫(卸载回写闸门仍生效,不会被旧编辑器盖回)。
P1 D3/B12 路径分隔符不一致
- 根因:
joinPath恒用/拼在 Windows 反斜杠目录后面,造出...\ws/d3-new.md,与 Rust/对话框返回的...\ws\d3-new.md字符串比较对不上:重命名后已开标签不跟随、删除后标签不关(进而又触发「已被外部删除」的误报提示,盖掉删除成功的提示;B12 本身已进回收站)。 - 修复:双管——
joinPath按父目录既有分隔符拼接(Windows 生成原生反斜杠路径);同时新增samePath归一化比较,用在打开去重、重命名查标签、恢复查标签、删除关标签(含子路径前缀判定)全部路径比较点。
P1 E2 源码模式浅纸浅字
- 根因:
.source-cm没设文字色,继承了 UI 的--text(深色 UI 下近白色),而纸面是文档主题的浅色(Notion #fbfbfa),浅字压浅纸。 - 修复:按建议
.source-cm { color: var(--doc-ink); caret-color: var(--doc-ink) },源码明暗此前已按 paperTone 选过 CodeMirror 主题,这次把容器继承色也对齐到文档字色。
P2 E6 HTML 导入丢表格
- 根因:turndown 未启用 GFM 插件,表格整段丢失(标题/列表正常)。
- 修复:新增依赖 turndown-plugin-gfm@1.0.2(MIT),htmlToMarkdown 启用
gfm(表格/删除线/任务列表一并补齐),附本地类型声明。回归测试:HTML 表格导入后生成标准 GFM 表格。
P2 C3 任务复选框视觉不同步
- 根因:click 处理里
e.preventDefault()——浏览器对 checkbox 的激活语义是「点击先翻转、事件被取消则退回原值」,退回动作发生在事件结束后,正好把 NodeView update() 刚同步好的input.checked又退回去;data-checked是普通属性不受影响,症状正是「数据变了、勾没变」。 - 修复:click 不再 preventDefault(原生翻转与文档翻转方向一致,update 再按文档值对齐);取不到节点时手工把视觉退回文档值。回归测试:真实 click 后
input.checked与序列化结果一致。
P3 切标签后旧文档偶发误标未保存
- 根因:编辑器挂载/卸载的序列化回写与磁盘原文存在规范化差异(表格对齐冒号、欢迎页内容最典型),回写经普通 updateContent 落地后 content≠savedContent,干净文档被标脏,进而触发自动保存与恢复记录。
- 修复:新增 reducer 动作
syncEditorContent——标签原本干净时,正文与基线一起对齐(规范化不算编辑);已脏时与普通更新无异。只走两条通道:挂载完成后的首次序列化对齐(EditorPane onSyncInitial)、卸载最终回写(onFinalMarkdown,含原有的重载闸门)。实时输入仍走 updateContent,脏标记语义不变。回归测试已加。
复验建议(对应 docs/13 条目)
P0 复验:留一份草稿 → 点「稍后再说」→ Ctrl+N 应能新建。 B3 复验:按原步骤点「重新加载」应换成磁盘版本且标签变干净。 D3/B12 复验:工作区里新建的文档重命名/删除,已开标签应跟随/关闭,提示不再被「已被外部删除」覆盖。 E2 复验:深色 UI + Notion 切源码模式,文字应为深色(rgb 55,53,47 量级)。 E6 复验:导含表格的 HTML,表格应以 GFM 表格出现。 C3 复验:点任务复选框,勾选视觉立即跟随。 P3 复验:打开欢迎页/含表格的文档来回切标签,不应出现未保存圆点。