mirror of
https://github.com/panatgithub/AnkiHeadingSync.git
synced 2026-07-22 17:10:28 +00:00
2.4 KiB
2.4 KiB
Deck Rule Migration Gap Report
审查范围
本报告只审查 deck 规则变更后“旧卡未按最新规则重梳理”的主链路实现:
FileIndexerServiceRenderConfigServiceDiffPlannerServiceManualSyncPlan/ManualSyncResultAnkiBatchExecutorManualSyncServicePluginState/FileState持久化
审查结论
修复前,旧卡不会在普通同步中按最新 deck 规则重梳理,原因不是单点 bug,而是三层实现同时把这种变化当作“可忽略”:
1. 索引复用条件缺少规则失效
FileIndexerService 只按文件时间戳、pending write-back、缺卡状态判断是否重读文件。
缺口:
- deck 规则变化时,未改动文件仍会直接复用旧
deckHint - 旧
CardState.deck会继续作为比较基线 - 普通同步无法感知“规则变了但内容没变”
2. 计划阶段把 deck-only 变化视为 unchanged
RenderConfigService 的 renderConfigHash 本来已经不包含 deck,但 DiffPlannerService 仍通过兼容 hash 逻辑把历史 deck 差异豁免掉。
缺口:
- deck-only 变化不会进入执行计划
- 仅 deck 变化的卡会继续计入
unchangedCards - 缺少单独的
toChangeDeck计划集合
3. 执行阶段没有主链路 deck 迁移
AnkiBatchExecutor 只做:
ensureDecks + addNotesupdateNotes- marker write-back
缺口:
- 主链路没有使用
ankiGateway.changeDecks(...) UpdateAnkiNoteInput.deckName仍让接口看起来像 update 会顺带迁移 deck- 同步结果没有统计 migrated decks
4. 状态层缺少规则版本比较基准
FileState 中没有任何 deck 规则指纹,因此即使 settings 变了,也没有稳定方式让旧索引失效。
5. 文档与测试仍锁定旧语义
仓库中的模块 5 文档和旧的 deck 决策文档仍写着:
- 旧卡不自动移动
changeDeck不启用- deck 变化不应触发普通同步迁移
这些表述已经和新任务目标冲突,必须同步修正。
本轮修复边界
本轮只解决 deck 规则变更后的旧卡重梳理:
- deck 规则指纹失效
- 旧卡 deck 迁移计划生成
changeDecks主链路执行- 迁移统计与状态回写
- rebuildIndex 保持不迁移
- 文档和测试改成新语义
不扩展到:
- note type 迁移
- 字段映射迁移
- card identity 迁移
- 单独的 deck migration 命令 UI