# 已链接账本(linked.json):增量标记与失效语义 cron 全量重跑时,已整理文件仍会走完整的 parse → TMDB 搜索 →(可能)AI → 链接流水线,虽然链接阶段 inode 幂等兜底正确性,但识别阶段的缓存命中与 ffprobe 仍非零开销。决定:引入 `$CACHE_DIR/media_organizer/linked.json` 已链接账本(`{src: {dest, inode, linked_at}}`),识别池入口先查账本,命中直接跳过(结局 `already_linked`)。 **失效语义(安全关键)**:跳过成立需同时满足——源文件存在、目标文件存在、源与目标同 inode。任一不满足(用户清空目标库 → 目标消失 → 重新识别+链接;源被替换 → inode 变化 → 重新识别+撞名处理)即自动失效。绝不依据"记录存在"单独跳过,杜绝"目标已删但记录还在 → 永不重建"的静默丢失。 **进程模型**:识别池 worker 是 fork 子进程,账本在父进程 `scan_files` 后加载一次(fork 复制内存副本);`ledger_mark_linked` 在链接成功处只更新父进程内存,`ledger_flush` 在运行末尾统一落盘(原子写 + 惰性清理源已消失条目)。中途异常退出不落盘——链接本身 inode 幂等,最坏情况是下次运行重复链接判定,不产生错误。干运行零持久化副作用(不落盘,且不启用跳过——干运行展示全貌)。 **Considered Options**: 每文件写账本(链接阶段逐条原子写)——O(n²) jq 读全文件,大库慢;按 inode 现场 find 校验(同源迁移清理已用)——无需账本但每次全目标目录扫描,开销更大;marker 文件(`ab:renamed` 式)——污染媒体目录且无法表达目标位置。