Skip to content

feat(sync): Native 个人知识树离线创建、移动与冲突恢复 - #831

Merged
cropflre merged 13 commits into
release/v1.5.2from
codex/native-knowledge-tree-offline
Oct 11, 2026
Merged

cropflre merged 13 commits into
release/v1.5.2from
codex/native-knowledge-tree-offline

Conversation

@cropflre

@cropflre cropflre commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

本次修改

Android 登录态个人知识树可以先在 Native SQLite 保存 Markdown/富文本和普通文件夹,再由现有 Sync V2 同步。文件夹支持根级、嵌套、已有文档下创建及移动/批量移动/排序;新目录内可继续创建文档。断网、重启或 ACK 丢失保持稳定资源与 mutationId,恢复网络自动上传。

完整个人树订阅保存跨文档父子关系;schema 7 无损扩展既有 Outbox/Conflict。业务资源先于结构意图发送,结构 Apply 沿用现有 tuple CAS 和容器感知的移动服务。创建、结构投影、来源记录与两类 Outbox 同事务落库。后续业务重命名保留隐藏兼容容器,避免重新触发新建守卫。全量重建页内新建的文件夹依据原始创建 mutationId 保留,快照缺席不误记为远端墓碑;真实多库回归覆盖并发嵌套创建及正文。REST 树提交后发送不含正文的同步提示。

Native 图不提供 ACL。已有权限快照的原始父链及本机意图父链均须是个人 owner、无文件夹密码,并与 Native 图一致;仅本机创建来源可补充待交接的目录。在线元数据接管权限。结构并发保留双方位置并支持两种选择;远端目录永久删除先保留本机意图和子正文,再等待明确选择。

数据一致性 / 用户数据安全

  • 本地持久化:资源、图、创建来源与 Outbox 的事务失败全部回滚(DCC-002)。
  • 服务端确认:笔记回执依据当前修改和有效服务端 ACK,结构依据应用/重复确认;入队不等于云端确认(DCC-001 / DCC-010)。
  • 故障与重试:覆盖断网、401/403、5xx、重复请求、完整/仅结构 ACK 丢失、重启和 100 条 Push 分页依赖,保留待发送数据(DCC-003 / DCC-009)。
  • 并发冲突:保留双方结构与最新本机位置;目录墓碑暂停级联业务删除,明确远端选择也保护子节点待发送数据(DCC-004 / DCC-007)。
  • 同步游标和身份:完整 Snapshot ACK 后绑定;失败不推进游标,已绑定订阅不静默降级;账号/Profile 隔离(DCC-005 / DCC-006)。
  • 恢复风险:schema 6→7 实际 SQLite 迁移保留 mutationId、payload、重试与历史,第二表重建失败整体回滚;既有备份/恢复门禁已跑(DCC-008)。

本次涉及的契约编号和验收记录

  • DCC-001~010;矩阵新增离线文件夹创建、嵌套/第二客户端、入队失败、丢 ACK、分页顺序、权限拒绝及 Bridge 交接行为。
  • 沿用 schema 7 与现有同步协议,本批未增加迁移或清空任何真实数据。
  • 当前证据:中文验收、English、Android 机器记录。之前两阶段证据保留原范围。

本地回归检查

  • 契约映射:12 不变量 / 97 引用 / 8 后端文件 / 20 前端文件。
  • 相关后端 323/323、前端 257/257(39 文件),无跳过。全部 8 个契约后端文件另跑 125/125,与前项重叠。
  • 后端 build/build:tsc、前端 TypeScript/正常 build、Android Gradle build;lint 1447 历史错误、0 新错误。正常产物排除验收入口。
  • API 35 只读模拟器、独立包 com.nowen.note.syncacceptance、隔离数据库、实际 Native SQLite/生产 API Bridge:离线创建文件夹/嵌套/文档子目录及目录内 Markdown、立即读取、强制停止重开、mutationId 与正文保留、自动上传及回执、移动/冲突、丢提示轮询和重连通过。APK/后端来源 c3d9b9f,crash buffer 0 行;第二客户端接收由独立 SQLite 回归证明。
  • 平台边界已说明:APK 为显式测试入口,未验收完整 EditorPane/ConflictCenter GUI、真实旧用户库、第二实体 Android、连接的真实手机、共享/密码目录、附件 bytes、WAN、iOS/HarmonyOS、NAS/正式包。正文延迟为 30 个 loopback 样本;创建批次 2002 ms 是单次样本。
  • 最终提交 c260199c 的 CI 状态以检查为准,正在重跑。此前 c892f5ea 的 Android Local-first、契约、知识树、移动树、Docker 插件、导入、扩展、语音与数据保护门禁通过。
  • 既有 I18n 基线失败:本批日志与改动前 8119a34c相同,覆盖测试未合并已有 encryptedConversion 翻译模块,缺同样 16 个键。生产 index 已加载该模块;相关组件/i18n 目录相对 release 基准未改动。本地补跑该套件 38/39,同一项失败,不计入上述 257 项。本地回归通过不表示所有 CI 已通过。

后续范围

保持 Draft,目标 release/v1.5.2,不合并、发布或关闭 #829。普通文件夹删除/恢复、文档/脑图/文件移动与正文/附件队列联动,以及共享/密码路径和真实设备专项验收仍需后续阶段。

@cropflre cropflre changed the title fix(android): persist personal knowledge-tree notes for offline recovery fix(sync): Native 个人文档离线创建与知识树结构接收 Oct 11, 2026
@cropflre cropflre changed the title fix(sync): Native 个人文档离线创建与知识树结构接收 fix(sync): Native 文档离线创建、结构接收与个人文件夹写入 Oct 11, 2026
@cropflre cropflre changed the title fix(sync): Native 文档离线创建、结构接收与个人文件夹写入 feat(sync): Native 个人知识树离线创建、移动与冲突恢复 Oct 11, 2026
@cropflre
cropflre merged commit c260199 into release/v1.5.2 Oct 11, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant