論述基礎與限制

本卡從一次書單分類的重審抽出。那批內容為三類會隨時間失準的判定各補了一個作者以外可以核對的數字,並且明白寫下每一類的重算觸發:判定類跟著新增書走,機械類承認沒有觸發、只靠下一次全站檢查,結構計數(書線有幾條、主題篇有幾篇、書目小節總數與各維度的分佈)跟著「新增或移除一條線、一篇主題」走。

第三類的觸發把新增一本書明白排除在外。而書目小節的定義是各主題篇的 H2,每一本書就佔一個小節——新增一本書必然改變那個總數。實際發生的事情因此可以逐步指認:某一篇加了兩本書,總數從 67 變成 69,而那次改動照規定不觸發任何重算,於是頁面停在 67,連帶三個分項與另一個以 67 為分母的比例一起停住。

限制有兩層。第一層是對象:本卡談的是人工維護、要由人回頭重算的數字;由資料自動產生的數字(模板從內容算出來的計數、CI 產生的報表)沒有這個問題,那裡不存在「誰在什麼時候去重算」這個空缺。第二層是這個數字要隨內容變動:記錄某個時點狀態的快照(當時查到幾門課、那一年的營收)不該隨後續變動,它過期是設計而不是缺陷。

這條原則的推翻方式很具體:寫得出一個觸發條款,它排除掉的事件確實不會改變那個值,本卡對那一格就不成立——本卡主張的是排除句要逐條驗證,不是排除句一律有問題。下面記的是單一批次的單一實例,它說明這個缺陷通得過什麼樣的檢查,不說明它多常發生。


核心原則

一個要由人回頭重算的數字有兩個獨立的失效面:值算錯了,以及沒有人會回頭算。 前者重算一次就知道,後者要看的是重算的觸發綁在什麼事件上。設計可核對的錨時通常只想到第一個,於是寫下一個數字、寫下它的計數單位,然後把重算交給一個聽起來相關而實際上不會發生的事件。

觸發要從「什麼事件會改變這個值」推出來,不能從「這個數字屬於哪一類」推出來。實例裡的分類本身是對的——書目小節總數確實是結構性的量、跟逐本判定不同類——而錯誤發生在下一步:分類決定了它跟哪些數字放在同一條規則裡,那條規則的觸發卻是照分類的名字想出來的。結構的變動聽起來是線與篇的增減,而這個數字的定義單位是小節,兩者差一層。

寫下來的觸發比缺席的觸發難查。 缺席時後續的人還會問「這個數字誰在維護」;寫下來之後那個問題不會再被問,因為條款讀起來就是有人想過了。實例裡的條款還特別加了排除句(「而不是新增一本書」),那句排除讀起來像是刻意分辨過的結果。


反模式:內部自洽被當成驗證過

一組數字彼此加得起來時,它讀起來像是被核對過的。實例裡的分佈是 36 / 6 / 25,總數 67,三個分項加起來剛好等於總數;一位審查者驗了這個加法、判定這一項通過。加法是對的,而三個數字全部停在同一個舊時點——自洽只證明它們出自同一次計算,不證明那次計算是什麼時候做的。

外部重算之後四個獨立的計數全部得到 69,而每一次的成本都只是照頁面自己給的計數單位跑一次。所以這個缺陷的成因是沒有人查,而不是難查——內部自洽把「該不該去查」這個問題關掉了。

分辨兩者的問句只有一句:這個數字上一次被實際算出來是什麼時候。 答得出來就進值的正確性,答不出來的話,先處理觸發,再回頭處理值。


修法

逐條列出會改變這個值的事件,再跟寫下的觸發比對。 差集就是靜默過期的入口。實例的差集只有一項——新增或移除一本書——而那一項正好被排除句寫進去了。

觸發用值的定義單位描述,不用它所屬的分類描述。 那個數字的單位是書目小節,觸發就寫成書目小節的增減;線與篇的增減會改變小節數,所以它們自然被涵蓋,不必另外列舉。用分類的名字寫觸發時,涵蓋範圍由那個名字讓人聯想到什麼決定,而聯想不是定義。

排除句要單獨驗一次。 「跟著 A 走,而不是跟著 B 走」這種寫法把 B 排除在檢查之外,成本比沒有寫它更高。驗法是把 B 當成已發生,問這個值會不會變。

改動的當下要能看見這條規則。 實例裡的觸發條款住在母頁,而改動發生在某一篇主題文,兩者是不同的檔案——寫下觸發不會讓改動的人經過它。這一層的處置與 #221 檢查規則的作用域要顯式列舉 相同:靠人記得的規則與不存在的規則,在產物上看起來一樣。


跟其他抽象層原則的關係

#292 更新一個可數宣稱時,加法不算重算 補上本卡列的兩個失效面之外的第三個。本卡處理的是觸發沒有發生、數字停在舊值;那張卡處理的是觸發正常發生、人也回頭更新了,而更新的動作是把新增的加上去而不是重數一遍——總數因此對得上,分項則不然。拿本卡的檢查(什麼事件會讓有人回頭算)通過之後,還要問那一次回頭算做的是哪一種動作。

#266 可核對的錨要跟它該偵測的狀態連動 是本卡的姊妹卡,兩者分別管錨的兩個時間點。#266 管的是值與狀態的連動——該偵測的事情發生時,這個數字會不會動;本卡管的是誰在什麼時候去看它動了沒。一個錨可以完全符合 #266(覆蓋率未飽和、會下降、計數單位定義清楚)而仍然停在舊值,因為連動是它的性質、重算是一個要被觸發的動作。兩張卡出自同一批內容,而 #266 寫成之後那批的數字才失準,這件事本身說明兩者不互相涵蓋。

#221 檢查規則的作用域要顯式列舉 講的是同一個不對稱在自動化檢查上的形態:未納管目錄的零錯誤與合規目錄的零錯誤,訊號完全相同。本卡是它的人工版——沒有觸發的數字與剛剛重算過的數字,在頁面上長得一樣。兩者共用的處置也相同:把涵蓋範圍寫成可以逐條核對的清單,而不是寫成一個讀起來完整的宣告。

#251 清單過時的代價要落在精度、不落在覆蓋 描述的是同一種靜默:那裡的清單過時之後,新出現的成員完全不被標記,而統計上的呈現是自動化流量比例下降——與「內容吸引到更多真人」在數字上不可區分。本卡的數字停在舊值時同樣不產生訊號,差別在那裡的失效由外部世界推進(新爬蟲出現)、這裡由自己的編輯動作推進,所以這裡的觸發綁得到一個具體的動作,而那讓它比時間型觸發可靠得多——前提是綁對事件。

#268 要維持當期的內容只能放在更新到得了讀者的載體上 處理的是同一條鏈的下游:改完之後送不送得到讀者。本卡在它的上游——送達之前要先有人知道該改。兩者的失敗都表現為讀者拿到一個過期而看不出過期的值。


判讀徵兆

徵兆為什麼是訊號下一個動作
觸發條款裡有「而不是 X」這種排除句排除句把 X 移出檢查範圍,而它讀起來像是分辨過的結果把 X 當成已發生,問這個值會不會變
一組分項加起來剛好等於總數自洽只證明同一次計算,不證明計算的時點照頁面給的計數單位實際重算一次
「這個數字上次被算是什麼時候」答不出來值的正確性與重算的觸發是兩個問題,這一句分辨得了先查觸發,再查值
觸發用分類的名字寫、而值的計數單位寫在另一段涵蓋範圍由名字的聯想決定,而聯想與定義會分岔改用計數單位重寫觸發
觸發條款與會觸動它的編輯動作在不同的檔案寫下觸發不會讓改動的人經過它在改動點留下檢查,或改用掃描得到的形式承載那個值
#291 掃描指令壞掉時不會報錯,它報一個數字姊妹卡,共用「內部自洽會蓋住外部失準」而對象不同——本卡是內容裡的數字停在舊值(分項加得起來),#291 是量測工具本身壞掉(輸出剛好等於另一條管道)。分辨問句同型:本卡問這個數字上一次被實際算出來是什麼時候,#291 問這條指令上一次被實際驗證過是什麼時候

這條原則什麼時候不成立

值由程式從內容算出來時不成立——那裡沒有人工重算這個動作,數字與內容之間沒有可以脫節的空隙。這也是實例最省力的治本方向:把三分狀態放進各節或各檔的欄位,總數就變成算得出來的值、而不是記下來的值。

記錄時點狀態的快照不成立。「2026 年 8 月查到十五門課」隨後續變動而不動是對的,它要的是查證日期而不是重算觸發。分辨兩者看這個值宣稱的是現況還是當時:宣稱現況的要重算,宣稱當時的要日期。

值的變動頻率低到單靠通讀就會撞見時,補觸發的成本高於收益。判斷標準是問這個值多久會被改動一次、而下一次有人完整讀過這一頁是什麼時候;後者比前者密的話,通讀就是它的觸發。