## Before / After\n\n| 场景 | Before:一次性脚本/手工处理 | After:Anki 实时维护工具箱 |\n|---|---|---|\n| 模板变更 | 重新生成 `.apkg` 后以为导入会更新 note type,实际 Anki 可能保留旧字段和旧模板 | `sync-notetype --deck 钢琴五线谱认音 --notetype ...` 先 diff live note type,再写入字段、正反模板、CSS,并抽样验证 |\n| 字段改值 | 只改本地脚本里的 `TimeLimitSeconds=2`,但 live note 里抽样读不到值 | `field-audit --deck ... --field TimeLimitSeconds --expect 2 --sample 10` 检查 88 张 note 的字段覆盖率和值分布 |\n| 删除清理 | 用户以为 `Context` 为空就可以删除,实际字段里有 `<mark>` 或 URL 参数片段 | `cleanup-preview --query 'deck:\"英语概念卡\" flag:1' --field Context` 先输出原始字段样本和删除候选,再备份后执行 |\n| 新卡乱序 | 直接调用不可用的 `repositionCards` 或误改已学习卡 due | `shuffle-new --deck 英文歌词` 只选 `is:new`,随机 due,复核学习中/复习卡未变化 |\n| MP3 同步 | 只凭 AnkiWeb 同步感觉判断媒体是否有问题 | `media-doctor --deck 英文歌词 --max-mb 10` 列出引用 MP3、缺失文件、孤儿文件和超大文件 |\n\n### 诊断流程样例\n\n1. 入口:`python -m anki_live_maintenance doctor --deck 英文歌词 --include media,new-order`。\n2. 输入来源:AnkiConnect live collection、`collection.media` 目录、可选的本地模板/字段配置文件。\n3. 核心检查:确认 AnkiConnect 可用;导出目标 deck 备份;读取 live note/card;解析 `[sound:...]`;检查缺失媒体;识别 `is:new` 卡;确认不会触碰 review/learning 卡。\n4. 成功信号:输出 `backup_path`、`checked_notes/cards`、`missing_media=0`、`review_cards_changed=0`,并生成 `out/anki_doctor_<deck>.md`。\n5. 失败信号:AnkiConnect 不可用、字段不存在、样本字段值不符合预期、媒体缺失、命令将影响非新卡。失败时只输出修复建议和 dry-run 清单,不直接写库。\n\n### 建议落地路径\n\n先做只读 `doctor/media-doctor/field-audit`,把 live 状态查清;再加需要写库的 `sync-notetype/shuffle-new/cleanup-apply`,所有写操作强制先备份、默认 dry-run,并在执行后用 AnkiConnect 复核结果。