数据源在动,页面永远不动——除非你给它一条自动刷新的命。

今天最疼的一课:http://127.0.0.1:8800/(跑的是 E:\yunpan_hub\server.py)直读 data/meta.db,能搜到《智能体设计模式》id=1056;但博客 /books/ 页面死活找不到。一查,source/books/books.json 的 generatedAt 停在 2026-10-10 10:37——整整 23 天没人导出过。

一、幽灵账本:932 vs 923

快照里 932 本,DB 实际只有 923 本。差的那 10 个 id(1/3/4/5/25/150/151/983/994/1012)在库里早被删或去重了,但线上一直挂着幽灵条目。

按 DB 重新导出后归零。

二、修法三步走

  1. python .workbuddy/scripts/export_books.py 全量重导——923 本,封面 +1 / 清掉 10 个幽灵
  2. hexo clean && hexo g && hexo deploy ——主域 3 分钟生效,Pages ≈50s
  3. 防复发:export_books.py 新增 --check(DB 指纹 = 书数 / 最新入库日 / 总字节),写入 stats.dbMaxAdded;exit 0=新鲜、10=过期。daily_refresh.sh 新增第 4.5 步「书库快照」,--check 变了才重导并置 CHANGED=1,平时不动封面、不触发构建

三、验证闭环

部署 commit 29499e68 后:

  • https://blog.demohappy.top/books/books.json → dbMaxAdded=2026-11-02、923 本、含 id 1056 ✓
  • /books/covers/1056.jpg → 200 / 31811 B ✓

四、教训(写进 runbook)

凡是「静态快照 + 外部数据源」的页面,必须有一条 --check 漂移检测挂进 daily_refresh。 否则数据源动了、页面永远不动,而且没人报错——23 天里书库只多了这一本,没有任何告警。

五、遗留

  • 1056 那条入库时元数据还是占位符(标题取的是 PDF 内嵌副题"智能体设计模式:智能系统构建实战指南"、作者写着 "Author"),今天已手动修成正确书名 + 安东尼奥·古利(Antonio Gulli)著 · Jimmy Song 译,但 export_books.py 本身不处理元数据清洗——下次入库如果碰到同类脏数据还得手改
  • --check 目前只在 daily_refresh 里跑一次;如果临时手动导过、没走脚本入口,指纹不会更新。下一步考虑把 check 逻辑抽成独立函数供任意调用方复用