cache-disciplinelisted
Install: claude install-skill poloplay0114/hard-won-claude-skills
# 內容鍵快取紀律(Cache Discipline)
## 什麼時候用
任何時候你想「這個算過了/驗過了,下次別重來」——建置產物快取、增量測試、資料頁攤平快取、
記憶化(memoization)、跨期產物庫。快取是效能的第一把刀,也是**正確性最陰的敵人**:
快取供錯值時,值本身看起來完全合理(它曾經是對的),只是**來源是舊的**——沒有任何當場的荒謬感
提醒你。這技能講怎麼讓「快」不用「對」來換。
---
## 核心法則
### 法則 1:捷徑=可證等值,不是跳驗
「命中快取所以不重算/不重驗」之所以合法,是因為一條可證的推理鏈:
**同內容鍵 → 同 bytes → 同結果,且該 bytes 建造當下已完整驗過**。三環缺一,捷徑就是在驗證上開洞。
- 鍵不合 → **落回完整路徑,或吠**;絕不「不合但大概沒差」放行。靜默放行=洞。
- 推理鏈的最後一環(���造當下已驗)見法則 4。
### 法則 2:鍵必複合,裸雜湊=靜默錯值的入口
內容鍵至少三元複合:**內容雜湊 + 大小 + 身分(路徑/名稱)**。
- 短雜湊(如 32-bit CRC)單獨當鍵,理論上兩份不同內容可同鍵——碰撞的後果不是報錯,是**拿舊內容
當新內容靜默供出**(如拿上一期的資料頁當本期),下游全對、來源全錯。
- 加大小擋「內容變、雜湊碰巧不變」;加身分擋「不同位置的同雜湊互吃」。三者同時巧合才可能碰撞,
機率壓到工程上可忽略。
- 鍵選型也有經濟學:能從容器 metadata 直接取的雜湊(免解壓)優於要展開全文才能算的——快取的
存在理由就是省那次展開(成本考量見 engineering-economy)。
### 法則 3:快取項自帶 manifest,開檔即驗,絕不靜默供值
每個快取項**完成寫入時**同時寫 manifest:來源複合鍵 + 規模統計(筆數/格數)+ 內容摘要 +
(若適用)已通過的驗證層。**每次取用前先驗 manifest**:
- 不符 / 缺失 / 截斷(種到一半崩掉的半成品)→ 一律**視同 miss 重種**,並記錄事件;絕不把可疑項
當好的供出。
- 摘要要能抓「同筆數但內容被竄」(如 XOR/rolling digest),不只數筆數。
- 配**破壞測試常備**:截斷快取項→會吠並重種;竄改內容→摘要不合會吠;偽造 manifest→會吠。
守門的先驗會吠(呼應 verification-discipline「不信自報」——快取也是一種自報)。
### 法則 4:命中=證明傳遞(快取項承載驗證結論)
一般快取只省「算」;把 manifest 記上「此內容建造時已通過哪些驗證」,命中就同時合法傳遞
「已驗過」的結論——**快取成為驗證結論的載體**,增量驗證因此成立(沒變的部分,上次的「過」
繼續有效)。前提兩條,缺一即假:
- 建造時的驗證是**完整的**(該層該驗的全驗了,不是抽驗冒充全驗);
- 「沒變」是**法則 1/2 等級的沒變**(複合鍵一致),不是「看起來沒人動過」。
被快取省掉的檢查,必須能指出它在建造時點的等價完成處——省的是重複,不是覆蓋
(呼應 verification-discipline「該有而沒有」)。
### 法則 5:快取衛生——省的成本不得在別處長回來
快取是用磁碟換時間,這筆帳要持續是正的:
- 快取目錄有**容量上限與汰換**(如 LRU by mtime);沒有上限的快取=慢性磁碟洩漏。
- **孤兒鍵可清**:來源已不存