要求執行者做判定的規則,要一併規定判定留下什麼痕跡
論述基礎與限制
本卡從一輪針對規則本身的審查抽出。當時已經寫好一組寫作規範(跨模組路由的驗收、判讀內容的情境補寫、模組待辦的欄位格式),前三輪審查查的是規則正不正確、寫得清不清楚、有沒有漏掉維度,三輪都通過。第四輪換了一個問題:一個趕時間、想通過檢查的執行者,會怎麼「合規地」執行這條規則。
這一輪出來十一項,而十一項全部收斂成同一個形狀——規則要求執行者做一個判定,卻沒有規定判定要留下什麼。舉三個當時的實例:「寫路由前去目的地確認它承接該主題」的產物只有路由條目本身,去看過與沒去看過的條目長得一模一樣;「審查時逐條驗路由」與「抽查三條」在不列出條目的報告裡無法區分;「判定這篇不需補情境」的兩個可能結論裡,只有「讀者是資深端」不帶任何後續動作。
規則寫得都對,執行也都可以宣告完成。缺的是一個能讓第二個人複驗的產物。
限制:本卡談的是要求執行者做判定的規則(「先判斷 X、再依判斷做 Y」)。單純規定產物形狀的規則(欄位必填、標題層級)不適用——它們的合規本身就是可觀察的。
核心原則
一條要求判定的規則,要同時規定判定留下什麼痕跡;沒有痕跡的判定不可證偽,規則因此形同不存在。 判斷這條規則有沒有這個問題,問一句話就夠:認真做過與完全沒做,產物有沒有差別。沒有差別時,這條規則只約束願意遵守它的人。
規則塌陷有方向,而方向是可以預測的:它會沿著零後續動作的那個結論走。判定的每個可能結論後面掛著不同的工作量,最省力的結論通常是那個「判定完就結束」的分支——判成不適用、判成不需要補、判成份量不夠。這個結論同時也是最難質疑的,因為它不產出任何東西,沒有東西可以被檢查。
痕跡有三種形態,依規則的性質選:
- 產物層:判定的結果要寫進成品。路由條目寫出剛才驗到的落點名稱,下一個人能照著複驗一次。
- 清單層:判定的範圍要列出來。逐條驗證的產出是一張逐條表,抽查與逐條的差別只在有沒有列出條目。
- 依據層:判定成零後續的那個結論時,要說出憑什麼。判成「讀者是資深端」時附上模組的讀者定位或前置章節教過的術語。
規則被執行之後,判準要從「做過沒」換成「做滿沒」
規則剛立時的失效是沒有人照做,而規則生效之後的失效換一種形狀:每一處都留下了規則要求的那個外觀,而要件掉了一半。
實測到的分布很清楚。一條規則要求「明說它不存在、登記待辦、給最小判準」三件事,同一批稿件的五個實例裡只有一處三項齊全,其餘各掉一項不同的——有的明說了沒登記、有的登記了沒給判準、有的只有明說。每一處單看都像是照規則寫的,因為那句明說就在那裡。
另一種同型的形狀是判準被同義替換。規則要求「挑後果最不直觀的寫,其餘要說出可以不寫的理由」,而實際寫下的理由是「那幾種在別處已經寫過」——聽起來也是理由,但它換掉了判準(直觀程度換成內容是否已存在),兩者不等價。同樣地,「把上游的內容壓縮成閘門加路由」被寫成完整的第二份敘述,形式上有那一段、實質上是複製。
因此規則生效之後,核心原則那句判準要跟著升級:不再問「認真做過與完全沒做,產物有沒有差別」,改問**「做滿與做一半,產物有沒有差別」**。多要件的規則要讓每個要件各自可見——把三件事寫成三個可以逐一核對的產物,而不是一段讀起來完整的話。
痕跡要是一個值,不是一個標籤
三種形態說的是痕跡放在哪裡,還有一層是痕跡長什麼樣:它要是一個值——可以被下一個人重讀、會隨系統變化而過時、錯了看得出來——而不是一個標籤。
分辨方式是問這個產物能不能被反駁。「不適用」「分佈均勻」「確認過不是共用容器」「已檢查無發現」都是標籤:它們沒有承載任何可核對的內容,第二個人拿到之後唯一能做的是重跑一次整個判定。換成值就不同——「用量 320 / 上限 2666」「頭名佔 75%、前三名累計 81%」「那個 holder 底下有 47 個可獨立回收的單位」「無 slug 頁面 173 篇」,這些數字會隨系統變化而過時,因此下一個人讀到時知道它是什麼時候的判斷;也因為它具體,錯了就看得出來。
標籤之所以是預設輸出,是因為否定式判定的產物天生是空的。判成「符合、要處理」會長出後續工作,判成「不符合、不必處理」什麼都不長,而規則對兩者的要求通常相同。於是最省力的路徑不只是選那個結論,還包括用最短的形式記下它。
這一層的修法是把判定改寫成一個要回答的問題,而非一個要勾選的結論:
| 標籤式(判定) | 值式(查詢) |
|---|---|
| 這個資源不必量 | 用量與上限各是多少 |
| 分佈接近均勻 | 頭名佔比與前三名累計佔比 |
| 確認過不是共用的容器 | 這個 holder 底下的東西來自幾個彼此無關的程式 |
| 配發器不挑受害者 | 耗盡的那一刻它做什麼(回錯誤 / 收回 / 排隊) |
| 這是記錄在案的邊界、不是遺漏 | 落在邊界外的有幾件,量它的指令是哪一條 |
右欄每一列都有一個確定的答案,答不出來就代表判定還沒做;左欄每一列都可以在零成本下宣告完成。反轉舉證方向的效果也在這裡:量過會留下數字,判成不必量只留下一句話,而兩者的成本差異正好讓紀律有立足點。
反模式:把「不適用」寫成裸清單
最常見的形態是規則附一份不適用清單(「以下三種情況不需要跑」),而清單只列類型、沒有要求舉證。
問題出在判定粒度。清單描述的是整份內容的類型,而實際的內容很少純粹——一篇判讀類文章裡通常有一節是分流、有一節是步驟。執行者拿其中一節對上清單的任何一項,就能把整篇判成不適用,而這個判定完全合規。清單於是從「限縮適用範圍」變成「這條規則的關機鍵」。
同樣的形態出現在數量上限。「挑一兩個最重要的寫」的下限是一,而一永遠滿足「一兩個」;規則想表達的是「不必寫滿」,執行時變成「寫一個就夠」。三級量表的中間值同理:小 / 中 / 大 裡只有 中 兩邊都不必舉證,全部填 中 完全合規,而那一欄的排序功能同時失效。
這些都不是執行者在違規。規則允許的最省力路徑就是這樣,而那條路徑是規則自己留的。
修法:對每條規則跑一次省力路徑推演
寫完一條判定型規則之後,用三個問題推一次:
- 一個想少做事的人,會怎麼合規地執行它?
- 那條路徑與規則的意圖差多少?
- 規則本身有沒有擋住那條路徑?
第三題答否時,補痕跡、別補語氣。「判定不適用時要指出該篇的哪一段構成該形態」改變產物,因此讓判定變得可以被反駁;「務必認真執行」不改變產物,所以不改變任何事。
補痕跡有一個成本邊界要顧:每條規則各補一句限定句,規則本身會膨脹到需要導讀。判準是這條判定的錯誤代價——代價高的補具體痕跡,代價低的靠這條共用原則涵蓋就好。三張卡各補三句之後就該停下來抽共用原則,而不是繼續逐條補。
跟其他原則的關係
- #147 規範化跟自審是兩種認知任務:#147 說立規範不保護已寫好的內容,本卡說立規範也不保護之後照它寫的內容——規則寫下來的當下,它能不能被驗證就已經決定了,而那件事在「規則寫得對不對」的檢查裡看不到。
- #232 自審 sweep 的偵測方法要對齊規則類型:#232 處理偵測方法看不見違規形態的情形,本卡處理的是更前面一層——違規形態根本沒有留下可被偵測的東西。#232 的修法是換偵測方法,本卡的修法是讓規則產出可偵測的痕跡。
- #217 審查要有斷言支撐 frame:#217 的判準空殼是停在維度清單、沒有條件到行動的映射;本卡的規則有完整映射,缺的是映射被執行過的證據。前者是規則沒寫完,後者是規則寫完了但不可證偽。
- #221 檢查規則的作用域要顯式列舉:兩者都讓「零 error」失去意義。#221 是規則沒涵蓋到那些檔案,本卡是規則涵蓋了但判定沒有留下東西可看——未納管目錄的零 error 與判定過後的零 finding,訊號相同。
- #245 原則層與操作層是兩份會漂移的副本:本卡的上游。本卡管規則本身留不留得下痕跡,#245 管規則有沒有傳到執行者手上——痕跡條款設計得再好,執行者讀的是沒有那條的舊版就不生效,而本批實測到的正是這個組合。
- #266 可核對的錨要選會下降的量:下游——痕跡規定完之後還有一步,痕跡要被計數才能從外部看出維護狀態,而計數方式選錯時痕跡存在而指標讀不到(實測:判定寫在不同句型裡,關鍵詞覆蓋率把最完整的兩筆判成缺口)
- #269 舉證要求會把誠實的那個輸出定價成最貴的:本卡的補集,兩張合起來才涵蓋判定型規則的兩種失效。本卡管沒有痕跡要求的規則、它沿零後續的結論塌陷;#269 管有痕跡要求而定價錯的規則、它沿含糊或省略塌陷。方向要注意——照本卡逐條補要求正是 #269 那個問題最常見的來源,補完之後要再跑一次它的排價。
- #153 Review 漏抓先分 design gap 與 execution gap:本卡揭露第三種——規則存在、也執行了,但執行的是規則允許的最省力形態。那條路徑是規則自己留的,因此加 frame(design 的修法)與催執行(execution 的修法)都不會收斂。
- #252 配額耗盡的症狀落在申請最頻繁的元件、成因在持有最久的那個:那張卡的修法段是本卡最完整的一個 self-case。它引用了 #221 與 #249、論述的正是「零 error 與沒被檢查不可區分」,而它自己的六條修法在一輪省力路徑推演下出現七處同型缺口——判成「不符合配額耗盡」「分佈均勻」「不是共用容器」「配發器不挑受害者」全部零成本且產物為空。值得記下的是寫下原則與套用原則之間沒有自動的傳導,即使套用的人就是剛寫下它的人(這一點與 #248 的結構相同)。那七處的修法後來全部改成本卡「值不是標籤」那一節的右欄形式。
- #250 資料多出一種形狀時,既有分析邏輯靜默換語意:本卡在程式判定上的形態。本卡處理人做的判定沒有痕跡就不可複驗,#250 的修法「條件式裡的常數要寫下它的來源」是同一條規則套到程式做的判定——
= 1這個常數承載的資料模型事實沒有留在產物裡,之後就沒有人能反向搜尋出所有依賴它的地方。
判讀徵兆
(本卡的規則有一個常被漏掉的對象:除籍。刪掉一列待辦是一次判定,而它的痕跡是「它被哪一次改動完成」,見 #247。)
- 規則要求「先判斷 X」,而判斷的結果不出現在任何產物裡。
- 規則的不適用清單只列類型、沒有要求指出是哪一段構成該類型。
- 判定的可能結論裡有一個不帶後續動作,而規則對它與其他結論的要求相同。
- 數量規則寫成上限(「一兩個」「最多三個」)而沒有下限,或量表的中間值兩邊都不必舉證。
- 執行者回報「已檢查、無發現」,而報告裡沒有列出檢查了哪些對象。
- 同一批審查的多個 finding 講的是不同規則,但改寫成一句話之後全都變成同一句。
- 多要件的規則在同一批稿件裡,各個實例掉的是不同的要件——每一處單看都像照做了。
- 規則要求的理由寫出來了,而理由用的判準與規則規定的那個不是同一個。