fix(sync): 持久化冲突决定前验证复制目标

This commit is contained in:
2026-09-09 07:09:23 +08:00
parent 3ef4766da4
commit 195ee9de84
5 changed files with 107 additions and 6 deletions
+3
View File
@@ -92,3 +92,6 @@ Core 通过绑定 Vault 的 workspace.persona.get/write RPC 读写;Host 先校
旧全局人设导入使用只读 GET `/api/settings/persona/legacy`,仅桌面模式提供,并先向 Host 验证当前 Vault。返回 available 与旧人设内容,不返回旧记录 revision,也不写入任何 Workspace 记录。UI 展示预览后,用户可以点击“填入当前表单”;这只替换可编辑内容,保留当前目标的 version/revision。最终保存沿用正常人设 PUT、Host CAS 与 journal。取消预览/关闭表单不会导入,切换 Vault 后迟到响应被丢弃,旧 SQLite 来源始终保留。没有自动清除或把读取行为作为迁移完成标记。
逻辑记录的“另存副本并采用远端”可将原始记录内容导出为 `attachments/*.txt`;文本副本作为普通附件同步,拥有独立 file_id,不作为活动设置自动应用。副本目标必须属于同步白名单;若目标本身位于记录命名空间,还必须与原始记录 kind/id/schema 一致。这些检查在持久化冲突决定之前完成,因此无效路径不占用该冲突的解决选择。
@@ -710,3 +710,13 @@ Core 的独立数据目录目前不等于已授权 Vault。Python 旧笔记写
- 前端人设定向 6 项、Python 人设定向 7 项通过;完整前端 101 文件/529 项通过,日志 .build/persona-import-frontend.log。完整后端与类型检查结果另列。
- 此流程是用户明确选择的复制导入,不是自动所有权推断;没有实现旧来源清除。完整导入进程中断矩阵、独立设备 UI 与发布兼容验收仍需继续,完整生产化目标保持未完成。
- 最终后端全套 904 通过、1 项依赖弃用警告,81.49 秒;前端 type-check 通过。日志 .build/persona-import-python.log、.build/persona-import-types.log。本轮无 Rust 生产代码改动,未重复 Rust 全套;用户 Vault 修改保持原状。
## 增量:副本路径预检与逻辑记录文本副本
- 发现 sync_resolve 会先持久化 copy 决定,再由写入路径校验逻辑记录;无效目标可使 pending 决定无法应用且不允许改选。现于 INSERT 前检查目标同步白名单,并针对记录目标流式验证原始快照及目标记录 schema,不在验证失败时冻结选择。
- 新增真实 Workspace 故障测试:人设同改后,copy.json(不在同步白名单)与 layout/sidebars(错误记录身份)均被拒绝,sync_resolutions 行数仍为 0,本地内容保留;随后改选 attachments/persona-copy.txt 成功,重开后文本副本是完整本地记录、活动人设是远端记录,冲突已关闭。定向测试通过,日志 .build/record-copy-preflight.log。
- SyncSettings 对逻辑记录提供 attachments/settings-copy.txt 路径提示,并说明文本副本用于查看恢复而不自动应用。
- 真实 HTTP 双客户端测试扩充为人设、布局各 60 轮同改冲突,三种选择各 20 轮。副本分支额外要求两端副本正文/摘要一致,副本 file_id 在两端一致且不同于活动记录。最终执行结果另列。
- 生产代码完整 Rust 回归 139 通过、12 ignored,日志 .build/record-copy-full-rust.log;随后单独运行扩充后的 60 轮/类别 HTTP 用例通过,38.97 秒,日志 .build/record-copy-http-final.log。Clippy 首次发现新测试重开变量多余 mut,已移除,最终全目标 -D warnings 通过(.build/record-copy-clippy-final.log)。前端 529 项及 type-check 通过,日志 .build/record-copy-frontend.log、.build/record-copy-types.log。
- 上述结果证明本机双客户端同改的三种选择与文本副本,不代替完整 S-03 改对删/rename/历史恢复、独立硬件 UI 或发布验收。本轮未更改用户 Vault 数据,完整目标仍未完成。