panatgithub_AnkiHeadingSync/docs/deck-rule-migration-decisions.md

69 lines
No EOL
2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Deck Rule Migration Decisions
## 1. 规则失效策略
新增 `deckRulesFingerprint`,并持久化到 `FileState`
指纹内容固定包含:
1. `defaultDeck`
2. `fileDeckEnabled`
3. `fileDeckMarker`
4. `folderDeckMode`
5. 规则版本常量
当文件内容未变但指纹变化时,普通全库同步必须强制重读文件并重新提取 deck 线索。
## 2. 计划语义
`renderConfigHash` 继续只表达字段渲染语义,不再承担 deck 兼容豁免。
新增 `ManualSyncPlan.toChangeDeck`
1. 仅 deck 变化时进入 `toChangeDeck`
2. 字段变化且 deck 变化时,同时进入 `toUpdate``toChangeDeck`
3. 仅字段变化时,不触发 deck 迁移
## 3. 执行语义
`AnkiBatchExecutor` 在主链路正式启用 `ankiGateway.changeDecks(...)`
1. `updateNotes` 只更新字段
2. `changeDecks` 只迁移 deck
3. deck 迁移基于 note summary 的 `cardIds`
4. 为避免迁移到不存在的 deckadd 和 changeDeck 目标 deck 都先走 `ensureDecks`
## 4. 结果统计
新增迁移统计字段:
1. `ManualSyncPlan.toChangeDeck`
2. `AnkiBatchExecutionResult.migratedDecks`
3. `ManualSyncResult.migratedDecks`
统计口径按“计划迁移的 note 数量”计算,而不是按 Anki card 数量计算。
## 5. 状态回写
`ManualSyncService.buildNextState` 继续把最新 resolved deck 写回 `CardState.deck`,并把当前 `deckRulesFingerprint` 写回 `FileState.deckRulesFingerprint`,作为下一次普通同步的比较基线。
## 6. rebuildIndex 语义
`rebuildIndex` 仍只负责:
1. 索引刷新
2. marker 修复
即使规则变了,也不执行 `changeDecks`
## 7. 类型兼容策略
`UpdateAnkiNoteInput.deckName` 保留为可选字段,仅用于兼容旧测试桩和调用面;主链路不再依赖它承载 deck 迁移语义。
## 8. 文档语义
仓库文档统一改为以下产品语义:
1. 普通同步会按最新 deck 规则重算旧卡
2. 若 resolved deck 变化,普通同步会迁移旧 note 到新 deck
3. rebuildIndex 不负责 Anki deck 迁移