<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>規範設計 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/%E8%A6%8F%E7%AF%84%E8%A8%AD%E8%A8%88/</link><description>Recent content in 規範設計 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 21 Aug 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E8%A6%8F%E7%AF%84%E8%A8%AD%E8%A8%88/index.xml" rel="self" type="application/rss+xml"/><item><title>要求執行者做判定的規則，要一併規定判定留下什麼痕跡</title><link>https://tarrragon.github.io/blog/report/judgment-rules-must-specify-their-trace/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/judgment-rules-must-specify-their-trace/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡從一輪針對規則本身的審查抽出。當時已經寫好一組寫作規範（跨模組路由的驗收、判讀內容的情境補寫、模組待辦的欄位格式），前三輪審查查的是規則正不正確、寫得清不清楚、有沒有漏掉維度，三輪都通過。第四輪換了一個問題：&lt;strong>一個趕時間、想通過檢查的執行者，會怎麼「合規地」執行這條規則&lt;/strong>。&lt;/p>
&lt;p>這一輪出來十一項，而十一項全部收斂成同一個形狀——規則要求執行者做一個判定，卻沒有規定判定要留下什麼。舉三個當時的實例：「寫路由前去目的地確認它承接該主題」的產物只有路由條目本身，去看過與沒去看過的條目長得一模一樣；「審查時逐條驗路由」與「抽查三條」在不列出條目的報告裡無法區分；「判定這篇不需補情境」的兩個可能結論裡，只有「讀者是資深端」不帶任何後續動作。&lt;/p>
&lt;p>規則寫得都對，執行也都可以宣告完成。缺的是一個能讓第二個人複驗的產物。&lt;/p>
&lt;p>限制：本卡談的是&lt;strong>要求執行者做判定&lt;/strong>的規則（「先判斷 X、再依判斷做 Y」）。單純規定產物形狀的規則（欄位必填、標題層級）不適用——它們的合規本身就是可觀察的。&lt;/p>
&lt;hr>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>一條要求判定的規則，要同時規定判定留下什麼痕跡；沒有痕跡的判定不可證偽，規則因此形同不存在。&lt;/strong> 判斷這條規則有沒有這個問題，問一句話就夠：認真做過與完全沒做，產物有沒有差別。沒有差別時，這條規則只約束願意遵守它的人。&lt;/p>
&lt;p>規則塌陷有方向，而方向是可以預測的：&lt;strong>它會沿著零後續動作的那個結論走&lt;/strong>。判定的每個可能結論後面掛著不同的工作量，最省力的結論通常是那個「判定完就結束」的分支——判成不適用、判成不需要補、判成份量不夠。這個結論同時也是最難質疑的，因為它不產出任何東西，沒有東西可以被檢查。&lt;/p>
&lt;p>痕跡有三種形態，依規則的性質選：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>產物層&lt;/strong>：判定的結果要寫進成品。路由條目寫出剛才驗到的落點名稱，下一個人能照著複驗一次。&lt;/li>
&lt;li>&lt;strong>清單層&lt;/strong>：判定的範圍要列出來。逐條驗證的產出是一張逐條表，抽查與逐條的差別只在有沒有列出條目。&lt;/li>
&lt;li>&lt;strong>依據層&lt;/strong>：判定成零後續的那個結論時，要說出憑什麼。判成「讀者是資深端」時附上模組的讀者定位或前置章節教過的術語。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="規則被執行之後判準要從做過沒換成做滿沒">規則被執行之後，判準要從「做過沒」換成「做滿沒」&lt;/h2>
&lt;p>規則剛立時的失效是沒有人照做，而規則生效之後的失效換一種形狀：&lt;strong>每一處都留下了規則要求的那個外觀，而要件掉了一半&lt;/strong>。&lt;/p>
&lt;p>實測到的分布很清楚。一條規則要求「明說它不存在、登記待辦、給最小判準」三件事，同一批稿件的五個實例裡只有一處三項齊全，其餘各掉一項不同的——有的明說了沒登記、有的登記了沒給判準、有的只有明說。每一處單看都像是照規則寫的，因為那句明說就在那裡。&lt;/p>
&lt;p>另一種同型的形狀是&lt;strong>判準被同義替換&lt;/strong>。規則要求「挑後果最不直觀的寫，其餘要說出可以不寫的理由」，而實際寫下的理由是「那幾種在別處已經寫過」——聽起來也是理由，但它換掉了判準（直觀程度換成內容是否已存在），兩者不等價。同樣地，「把上游的內容壓縮成閘門加路由」被寫成完整的第二份敘述，形式上有那一段、實質上是複製。&lt;/p>
&lt;p>因此規則生效之後，核心原則那句判準要跟著升級：不再問「認真做過與完全沒做，產物有沒有差別」，改問**「做滿與做一半，產物有沒有差別」**。多要件的規則要讓每個要件各自可見——把三件事寫成三個可以逐一核對的產物，而不是一段讀起來完整的話。&lt;/p>
&lt;h2 id="痕跡要是一個值不是一個標籤">痕跡要是一個值，不是一個標籤&lt;/h2>
&lt;p>三種形態說的是痕跡放在哪裡，還有一層是痕跡長什麼樣：&lt;strong>它要是一個值——可以被下一個人重讀、會隨系統變化而過時、錯了看得出來——而不是一個標籤。&lt;/strong>&lt;/p>
&lt;p>分辨方式是問這個產物能不能被反駁。「不適用」「分佈均勻」「確認過不是共用容器」「已檢查無發現」都是標籤：它們沒有承載任何可核對的內容，第二個人拿到之後唯一能做的是重跑一次整個判定。換成值就不同——「用量 320 / 上限 2666」「頭名佔 75%、前三名累計 81%」「那個 holder 底下有 47 個可獨立回收的單位」「無 slug 頁面 173 篇」，這些數字會隨系統變化而過時，因此下一個人讀到時知道它是什麼時候的判斷；也因為它具體，錯了就看得出來。&lt;/p>
&lt;p>標籤之所以是預設輸出，是因為&lt;strong>否定式判定的產物天生是空的&lt;/strong>。判成「符合、要處理」會長出後續工作，判成「不符合、不必處理」什麼都不長，而規則對兩者的要求通常相同。於是最省力的路徑不只是選那個結論，還包括用最短的形式記下它。&lt;/p>
&lt;p>這一層的修法是把判定改寫成一個要回答的問題，而非一個要勾選的結論：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>標籤式（判定）&lt;/th>
 &lt;th>值式（查詢）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>這個資源不必量&lt;/td>
 &lt;td>用量與上限各是多少&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>分佈接近均勻&lt;/td>
 &lt;td>頭名佔比與前三名累計佔比&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>確認過不是共用的容器&lt;/td>
 &lt;td>這個 holder 底下的東西來自幾個彼此無關的程式&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>配發器不挑受害者&lt;/td>
 &lt;td>耗盡的那一刻它做什麼（回錯誤 / 收回 / 排隊）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>這是記錄在案的邊界、不是遺漏&lt;/td>
 &lt;td>落在邊界外的有幾件，量它的指令是哪一條&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>右欄每一列都有一個確定的答案，答不出來就代表判定還沒做；左欄每一列都可以在零成本下宣告完成。反轉舉證方向的效果也在這裡：量過會留下數字，判成不必量只留下一句話，而兩者的成本差異正好讓紀律有立足點。&lt;/p>
&lt;h2 id="反模式把不適用寫成裸清單">反模式：把「不適用」寫成裸清單&lt;/h2>
&lt;p>最常見的形態是規則附一份不適用清單（「以下三種情況不需要跑」），而清單只列類型、沒有要求舉證。&lt;/p>
&lt;p>問題出在判定粒度。清單描述的是整份內容的類型，而實際的內容很少純粹——一篇判讀類文章裡通常有一節是分流、有一節是步驟。執行者拿其中一節對上清單的任何一項，就能把整篇判成不適用，而這個判定完全合規。清單於是從「限縮適用範圍」變成「這條規則的關機鍵」。&lt;/p>
&lt;p>同樣的形態出現在數量上限。「挑一兩個最重要的寫」的下限是一，而一永遠滿足「一兩個」；規則想表達的是「不必寫滿」，執行時變成「寫一個就夠」。三級量表的中間值同理：&lt;code>小 / 中 / 大&lt;/code> 裡只有 &lt;code>中&lt;/code> 兩邊都不必舉證，全部填 &lt;code>中&lt;/code> 完全合規，而那一欄的排序功能同時失效。&lt;/p>
&lt;p>這些都不是執行者在違規。規則允許的最省力路徑就是這樣，而那條路徑是規則自己留的。&lt;/p>
&lt;hr>
&lt;h2 id="修法對每條規則跑一次省力路徑推演">修法：對每條規則跑一次省力路徑推演&lt;/h2>
&lt;p>寫完一條判定型規則之後，用三個問題推一次：&lt;/p>
&lt;ol>
&lt;li>一個想少做事的人，會怎麼合規地執行它？&lt;/li>
&lt;li>那條路徑與規則的意圖差多少？&lt;/li>
&lt;li>規則本身有沒有擋住那條路徑？&lt;/li>
&lt;/ol>
&lt;p>第三題答否時，補痕跡、別補語氣。「判定不適用時要指出該篇的哪一段構成該形態」改變產物，因此讓判定變得可以被反駁；「務必認真執行」不改變產物，所以不改變任何事。&lt;/p>
&lt;p>補痕跡有一個成本邊界要顧：每條規則各補一句限定句，規則本身會膨脹到需要導讀。判準是這條判定的錯誤代價——代價高的補具體痕跡，代價低的靠這條共用原則涵蓋就好。三張卡各補三句之後就該停下來抽共用原則，而不是繼續逐條補。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他原則的關係">跟其他原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務&lt;/a>：#147 說立規範不保護已寫好的內容，本卡說立規範也不保護之後照它寫的內容——規則寫下來的當下，它能不能被驗證就已經決定了，而那件事在「規則寫得對不對」的檢查裡看不到。&lt;/li>
&lt;li>&lt;a href="../self-audit-detection-method-must-match-rule-type/">#232 自審 sweep 的偵測方法要對齊規則類型&lt;/a>：#232 處理偵測方法看不見違規形態的情形，本卡處理的是更前面一層——違規形態根本沒有留下可被偵測的東西。#232 的修法是換偵測方法，本卡的修法是讓規則產出可偵測的痕跡。&lt;/li>
&lt;li>&lt;a href="../review-needs-claim-support-frame/">#217 審查要有斷言支撐 frame&lt;/a>：#217 的判準空殼是停在維度清單、沒有條件到行動的映射；本卡的規則有完整映射，缺的是映射被執行過的證據。前者是規則沒寫完，後者是規則寫完了但不可證偽。&lt;/li>
&lt;li>&lt;a href="../lint-scope-must-be-explicit-fact/">#221 檢查規則的作用域要顯式列舉&lt;/a>：兩者都讓「零 error」失去意義。#221 是規則沒涵蓋到那些檔案，本卡是規則涵蓋了但判定沒有留下東西可看——未納管目錄的零 error 與判定過後的零 finding，訊號相同。&lt;/li>
&lt;li>&lt;a href="../principle-operationalization-drifts/">#245 原則層與操作層是兩份會漂移的副本&lt;/a>：本卡的上游。本卡管規則本身留不留得下痕跡，#245 管規則有沒有傳到執行者手上——痕跡條款設計得再好，執行者讀的是沒有那條的舊版就不生效，而本批實測到的正是這個組合。&lt;/li>
&lt;li>&lt;a href="../checkable-anchor-must-be-able-to-fall/">#266 可核對的錨要選會下降的量&lt;/a>：下游——痕跡規定完之後還有一步，痕跡要被計數才能從外部看出維護狀態，而計數方式選錯時痕跡存在而指標讀不到（實測：判定寫在不同句型裡，關鍵詞覆蓋率把最完整的兩筆判成缺口）&lt;/li>
&lt;li>&lt;a href="../evidence-requirement-can-price-out-precision/">#269 舉證要求會把誠實的那個輸出定價成最貴的&lt;/a>：本卡的補集，兩張合起來才涵蓋判定型規則的兩種失效。本卡管沒有痕跡要求的規則、它沿零後續的結論塌陷；#269 管有痕跡要求而定價錯的規則、它沿含糊或省略塌陷。方向要注意——照本卡逐條補要求正是 #269 那個問題最常見的來源，補完之後要再跑一次它的排價。&lt;/li>
&lt;li>&lt;a href="../review-miss-diagnose-design-vs-execution-gap/">#153 Review 漏抓先分 design gap 與 execution gap&lt;/a>：本卡揭露第三種——規則存在、也執行了，但執行的是規則允許的最省力形態。那條路徑是規則自己留的，因此加 frame（design 的修法）與催執行（execution 的修法）都不會收斂。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;ul>
&lt;li>&lt;a href="../resource-exhaustion-symptom-vs-holder/">#252 配額耗盡的症狀落在申請最頻繁的元件、成因在持有最久的那個&lt;/a>：那張卡的修法段是本卡最完整的一個 self-case。它引用了 #221 與 #249、論述的正是「零 error 與沒被檢查不可區分」，而它自己的六條修法在一輪省力路徑推演下出現七處同型缺口——判成「不符合配額耗盡」「分佈均勻」「不是共用容器」「配發器不挑受害者」全部零成本且產物為空。值得記下的是寫下原則與套用原則之間沒有自動的傳導，即使套用的人就是剛寫下它的人（這一點與 #248 的結構相同）。那七處的修法後來全部改成本卡「值不是標籤」那一節的右欄形式。&lt;/li>
&lt;li>&lt;a href="../new-data-shape-silently-changes-analysis/">#250 資料多出一種形狀時，既有分析邏輯靜默換語意&lt;/a>：本卡在程式判定上的形態。本卡處理人做的判定沒有痕跡就不可複驗，#250 的修法「條件式裡的常數要寫下它的來源」是同一條規則套到程式做的判定——&lt;code>= 1&lt;/code> 這個常數承載的資料模型事實沒有留在產物裡，之後就沒有人能反向搜尋出所有依賴它的地方。&lt;/li>
&lt;/ul>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;p>（本卡的規則有一個常被漏掉的對象：&lt;strong>除籍&lt;/strong>。刪掉一列待辦是一次判定，而它的痕跡是「它被哪一次改動完成」，見 &lt;a href="../sequential-fixes-compose-into-defects/">#247&lt;/a>。）&lt;/p>
&lt;ul>
&lt;li>規則要求「先判斷 X」，而判斷的結果不出現在任何產物裡。&lt;/li>
&lt;li>規則的不適用清單只列類型、沒有要求指出是哪一段構成該類型。&lt;/li>
&lt;li>判定的可能結論裡有一個不帶後續動作，而規則對它與其他結論的要求相同。&lt;/li>
&lt;li>數量規則寫成上限（「一兩個」「最多三個」）而沒有下限，或量表的中間值兩邊都不必舉證。&lt;/li>
&lt;li>執行者回報「已檢查、無發現」，而報告裡沒有列出檢查了哪些對象。&lt;/li>
&lt;li>同一批審查的多個 finding 講的是不同規則，但改寫成一句話之後全都變成同一句。&lt;/li>
&lt;li>多要件的規則在同一批稿件裡，各個實例掉的是不同的要件——每一處單看都像照做了。&lt;/li>
&lt;li>規則要求的理由寫出來了，而理由用的判準與規則規定的那個不是同一個。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡從一輪針對規則本身的審查抽出。當時已經寫好一組寫作規範（跨模組路由的驗收、判讀內容的情境補寫、模組待辦的欄位格式），前三輪審查查的是規則正不正確、寫得清不清楚、有沒有漏掉維度，三輪都通過。第四輪換了一個問題：<strong>一個趕時間、想通過檢查的執行者，會怎麼「合規地」執行這條規則</strong>。</p>
<p>這一輪出來十一項，而十一項全部收斂成同一個形狀——規則要求執行者做一個判定，卻沒有規定判定要留下什麼。舉三個當時的實例：「寫路由前去目的地確認它承接該主題」的產物只有路由條目本身，去看過與沒去看過的條目長得一模一樣；「審查時逐條驗路由」與「抽查三條」在不列出條目的報告裡無法區分；「判定這篇不需補情境」的兩個可能結論裡，只有「讀者是資深端」不帶任何後續動作。</p>
<p>規則寫得都對，執行也都可以宣告完成。缺的是一個能讓第二個人複驗的產物。</p>
<p>限制：本卡談的是<strong>要求執行者做判定</strong>的規則（「先判斷 X、再依判斷做 Y」）。單純規定產物形狀的規則（欄位必填、標題層級）不適用——它們的合規本身就是可觀察的。</p>
<hr>
<h2 id="核心原則">核心原則</h2>
<p><strong>一條要求判定的規則，要同時規定判定留下什麼痕跡；沒有痕跡的判定不可證偽，規則因此形同不存在。</strong> 判斷這條規則有沒有這個問題，問一句話就夠：認真做過與完全沒做，產物有沒有差別。沒有差別時，這條規則只約束願意遵守它的人。</p>
<p>規則塌陷有方向，而方向是可以預測的：<strong>它會沿著零後續動作的那個結論走</strong>。判定的每個可能結論後面掛著不同的工作量，最省力的結論通常是那個「判定完就結束」的分支——判成不適用、判成不需要補、判成份量不夠。這個結論同時也是最難質疑的，因為它不產出任何東西，沒有東西可以被檢查。</p>
<p>痕跡有三種形態，依規則的性質選：</p>
<ul>
<li><strong>產物層</strong>：判定的結果要寫進成品。路由條目寫出剛才驗到的落點名稱，下一個人能照著複驗一次。</li>
<li><strong>清單層</strong>：判定的範圍要列出來。逐條驗證的產出是一張逐條表，抽查與逐條的差別只在有沒有列出條目。</li>
<li><strong>依據層</strong>：判定成零後續的那個結論時，要說出憑什麼。判成「讀者是資深端」時附上模組的讀者定位或前置章節教過的術語。</li>
</ul>
<hr>
<h2 id="規則被執行之後判準要從做過沒換成做滿沒">規則被執行之後，判準要從「做過沒」換成「做滿沒」</h2>
<p>規則剛立時的失效是沒有人照做，而規則生效之後的失效換一種形狀：<strong>每一處都留下了規則要求的那個外觀，而要件掉了一半</strong>。</p>
<p>實測到的分布很清楚。一條規則要求「明說它不存在、登記待辦、給最小判準」三件事，同一批稿件的五個實例裡只有一處三項齊全，其餘各掉一項不同的——有的明說了沒登記、有的登記了沒給判準、有的只有明說。每一處單看都像是照規則寫的，因為那句明說就在那裡。</p>
<p>另一種同型的形狀是<strong>判準被同義替換</strong>。規則要求「挑後果最不直觀的寫，其餘要說出可以不寫的理由」，而實際寫下的理由是「那幾種在別處已經寫過」——聽起來也是理由，但它換掉了判準（直觀程度換成內容是否已存在），兩者不等價。同樣地，「把上游的內容壓縮成閘門加路由」被寫成完整的第二份敘述，形式上有那一段、實質上是複製。</p>
<p>因此規則生效之後，核心原則那句判準要跟著升級：不再問「認真做過與完全沒做，產物有沒有差別」，改問**「做滿與做一半，產物有沒有差別」**。多要件的規則要讓每個要件各自可見——把三件事寫成三個可以逐一核對的產物，而不是一段讀起來完整的話。</p>
<h2 id="痕跡要是一個值不是一個標籤">痕跡要是一個值，不是一個標籤</h2>
<p>三種形態說的是痕跡放在哪裡，還有一層是痕跡長什麼樣：<strong>它要是一個值——可以被下一個人重讀、會隨系統變化而過時、錯了看得出來——而不是一個標籤。</strong></p>
<p>分辨方式是問這個產物能不能被反駁。「不適用」「分佈均勻」「確認過不是共用容器」「已檢查無發現」都是標籤：它們沒有承載任何可核對的內容，第二個人拿到之後唯一能做的是重跑一次整個判定。換成值就不同——「用量 320 / 上限 2666」「頭名佔 75%、前三名累計 81%」「那個 holder 底下有 47 個可獨立回收的單位」「無 slug 頁面 173 篇」，這些數字會隨系統變化而過時，因此下一個人讀到時知道它是什麼時候的判斷；也因為它具體，錯了就看得出來。</p>
<p>標籤之所以是預設輸出，是因為<strong>否定式判定的產物天生是空的</strong>。判成「符合、要處理」會長出後續工作，判成「不符合、不必處理」什麼都不長，而規則對兩者的要求通常相同。於是最省力的路徑不只是選那個結論，還包括用最短的形式記下它。</p>
<p>這一層的修法是把判定改寫成一個要回答的問題，而非一個要勾選的結論：</p>
<table>
  <thead>
      <tr>
          <th>標籤式（判定）</th>
          <th>值式（查詢）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>這個資源不必量</td>
          <td>用量與上限各是多少</td>
      </tr>
      <tr>
          <td>分佈接近均勻</td>
          <td>頭名佔比與前三名累計佔比</td>
      </tr>
      <tr>
          <td>確認過不是共用的容器</td>
          <td>這個 holder 底下的東西來自幾個彼此無關的程式</td>
      </tr>
      <tr>
          <td>配發器不挑受害者</td>
          <td>耗盡的那一刻它做什麼（回錯誤 / 收回 / 排隊）</td>
      </tr>
      <tr>
          <td>這是記錄在案的邊界、不是遺漏</td>
          <td>落在邊界外的有幾件，量它的指令是哪一條</td>
      </tr>
  </tbody>
</table>
<p>右欄每一列都有一個確定的答案，答不出來就代表判定還沒做；左欄每一列都可以在零成本下宣告完成。反轉舉證方向的效果也在這裡：量過會留下數字，判成不必量只留下一句話，而兩者的成本差異正好讓紀律有立足點。</p>
<h2 id="反模式把不適用寫成裸清單">反模式：把「不適用」寫成裸清單</h2>
<p>最常見的形態是規則附一份不適用清單（「以下三種情況不需要跑」），而清單只列類型、沒有要求舉證。</p>
<p>問題出在判定粒度。清單描述的是整份內容的類型，而實際的內容很少純粹——一篇判讀類文章裡通常有一節是分流、有一節是步驟。執行者拿其中一節對上清單的任何一項，就能把整篇判成不適用，而這個判定完全合規。清單於是從「限縮適用範圍」變成「這條規則的關機鍵」。</p>
<p>同樣的形態出現在數量上限。「挑一兩個最重要的寫」的下限是一，而一永遠滿足「一兩個」；規則想表達的是「不必寫滿」，執行時變成「寫一個就夠」。三級量表的中間值同理：<code>小 / 中 / 大</code> 裡只有 <code>中</code> 兩邊都不必舉證，全部填 <code>中</code> 完全合規，而那一欄的排序功能同時失效。</p>
<p>這些都不是執行者在違規。規則允許的最省力路徑就是這樣，而那條路徑是規則自己留的。</p>
<hr>
<h2 id="修法對每條規則跑一次省力路徑推演">修法：對每條規則跑一次省力路徑推演</h2>
<p>寫完一條判定型規則之後，用三個問題推一次：</p>
<ol>
<li>一個想少做事的人，會怎麼合規地執行它？</li>
<li>那條路徑與規則的意圖差多少？</li>
<li>規則本身有沒有擋住那條路徑？</li>
</ol>
<p>第三題答否時，補痕跡、別補語氣。「判定不適用時要指出該篇的哪一段構成該形態」改變產物，因此讓判定變得可以被反駁；「務必認真執行」不改變產物，所以不改變任何事。</p>
<p>補痕跡有一個成本邊界要顧：每條規則各補一句限定句，規則本身會膨脹到需要導讀。判準是這條判定的錯誤代價——代價高的補具體痕跡，代價低的靠這條共用原則涵蓋就好。三張卡各補三句之後就該停下來抽共用原則，而不是繼續逐條補。</p>
<hr>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<ul>
<li><a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務</a>：#147 說立規範不保護已寫好的內容，本卡說立規範也不保護之後照它寫的內容——規則寫下來的當下，它能不能被驗證就已經決定了，而那件事在「規則寫得對不對」的檢查裡看不到。</li>
<li><a href="../self-audit-detection-method-must-match-rule-type/">#232 自審 sweep 的偵測方法要對齊規則類型</a>：#232 處理偵測方法看不見違規形態的情形，本卡處理的是更前面一層——違規形態根本沒有留下可被偵測的東西。#232 的修法是換偵測方法，本卡的修法是讓規則產出可偵測的痕跡。</li>
<li><a href="../review-needs-claim-support-frame/">#217 審查要有斷言支撐 frame</a>：#217 的判準空殼是停在維度清單、沒有條件到行動的映射；本卡的規則有完整映射，缺的是映射被執行過的證據。前者是規則沒寫完，後者是規則寫完了但不可證偽。</li>
<li><a href="../lint-scope-must-be-explicit-fact/">#221 檢查規則的作用域要顯式列舉</a>：兩者都讓「零 error」失去意義。#221 是規則沒涵蓋到那些檔案，本卡是規則涵蓋了但判定沒有留下東西可看——未納管目錄的零 error 與判定過後的零 finding，訊號相同。</li>
<li><a href="../principle-operationalization-drifts/">#245 原則層與操作層是兩份會漂移的副本</a>：本卡的上游。本卡管規則本身留不留得下痕跡，#245 管規則有沒有傳到執行者手上——痕跡條款設計得再好，執行者讀的是沒有那條的舊版就不生效，而本批實測到的正是這個組合。</li>
<li><a href="../checkable-anchor-must-be-able-to-fall/">#266 可核對的錨要選會下降的量</a>：下游——痕跡規定完之後還有一步，痕跡要被計數才能從外部看出維護狀態，而計數方式選錯時痕跡存在而指標讀不到（實測：判定寫在不同句型裡，關鍵詞覆蓋率把最完整的兩筆判成缺口）</li>
<li><a href="../evidence-requirement-can-price-out-precision/">#269 舉證要求會把誠實的那個輸出定價成最貴的</a>：本卡的補集，兩張合起來才涵蓋判定型規則的兩種失效。本卡管沒有痕跡要求的規則、它沿零後續的結論塌陷；#269 管有痕跡要求而定價錯的規則、它沿含糊或省略塌陷。方向要注意——照本卡逐條補要求正是 #269 那個問題最常見的來源，補完之後要再跑一次它的排價。</li>
<li><a href="../review-miss-diagnose-design-vs-execution-gap/">#153 Review 漏抓先分 design gap 與 execution gap</a>：本卡揭露第三種——規則存在、也執行了，但執行的是規則允許的最省力形態。那條路徑是規則自己留的，因此加 frame（design 的修法）與催執行（execution 的修法）都不會收斂。</li>
</ul>
<hr>
<ul>
<li><a href="../resource-exhaustion-symptom-vs-holder/">#252 配額耗盡的症狀落在申請最頻繁的元件、成因在持有最久的那個</a>：那張卡的修法段是本卡最完整的一個 self-case。它引用了 #221 與 #249、論述的正是「零 error 與沒被檢查不可區分」，而它自己的六條修法在一輪省力路徑推演下出現七處同型缺口——判成「不符合配額耗盡」「分佈均勻」「不是共用容器」「配發器不挑受害者」全部零成本且產物為空。值得記下的是寫下原則與套用原則之間沒有自動的傳導，即使套用的人就是剛寫下它的人（這一點與 #248 的結構相同）。那七處的修法後來全部改成本卡「值不是標籤」那一節的右欄形式。</li>
<li><a href="../new-data-shape-silently-changes-analysis/">#250 資料多出一種形狀時，既有分析邏輯靜默換語意</a>：本卡在程式判定上的形態。本卡處理人做的判定沒有痕跡就不可複驗，#250 的修法「條件式裡的常數要寫下它的來源」是同一條規則套到程式做的判定——<code>= 1</code> 這個常數承載的資料模型事實沒有留在產物裡，之後就沒有人能反向搜尋出所有依賴它的地方。</li>
</ul>
<h2 id="判讀徵兆">判讀徵兆</h2>
<p>（本卡的規則有一個常被漏掉的對象：<strong>除籍</strong>。刪掉一列待辦是一次判定，而它的痕跡是「它被哪一次改動完成」，見 <a href="../sequential-fixes-compose-into-defects/">#247</a>。）</p>
<ul>
<li>規則要求「先判斷 X」，而判斷的結果不出現在任何產物裡。</li>
<li>規則的不適用清單只列類型、沒有要求指出是哪一段構成該類型。</li>
<li>判定的可能結論裡有一個不帶後續動作，而規則對它與其他結論的要求相同。</li>
<li>數量規則寫成上限（「一兩個」「最多三個」）而沒有下限，或量表的中間值兩邊都不必舉證。</li>
<li>執行者回報「已檢查、無發現」，而報告裡沒有列出檢查了哪些對象。</li>
<li>同一批審查的多個 finding 講的是不同規則，但改寫成一句話之後全都變成同一句。</li>
<li>多要件的規則在同一批稿件裡，各個實例掉的是不同的要件——每一處單看都像照做了。</li>
<li>規則要求的理由寫出來了，而理由用的判準與規則規定的那個不是同一個。</li>
</ul>
]]></content:encoded></item><item><title>原則層與操作層是兩份會漂移的副本，而漂移只往一個方向</title><link>https://tarrragon.github.io/blog/report/principle-operationalization-drifts/</link><pubDate>Wed, 29 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/principle-operationalization-drifts/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡從一次多輪審查的第三輪抽出。當時查的是「規則寫下來之後同批稿件仍然犯」，掃到一條規則的套用率是零：九則微案例沒有任何一則做了那條規則要求的動作。&lt;/p>
&lt;p>直覺的解釋是自審失效——規則在那裡、寫的人沒照做。實際去查才發現另一件事：那條規則寫在原則卡上，而執行時實際被讀的是另一份操作文件，那一份停在規則被抽出時的第一版，後來卡片修過三次的內容一次都沒有同步過去。&lt;strong>套用率零不是因為沒照做，是因為照的是舊版。&lt;/strong>&lt;/p>
&lt;p>回頭比對同一批的其他規則，漂移的分布有規律：與操作文件同時寫下的那幾條都同步了；卡片在後續輪次被修正的那幾條，操作文件全部停在原版。&lt;/p>
&lt;p>限制：本卡談的是同一條原則被寫在兩個地方的情形（抽象層與操作層各一份）。單一來源的規則不適用；兩份內容本來就該不同的情形（規格與實作、需求與測試）也不適用——那裡的差異是設計，不是漂移。&lt;/p>
&lt;hr>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>一條原則同時存在於抽象層與操作層時，兩份是會各自演化的副本，而修正流向單向：抽象層被反覆修改、操作層停在第一次抽出時的版本。&lt;/strong> 判斷某條規則有沒有漂移，不看抽象層寫了什麼，看&lt;strong>執行者實際會讀的那一份&lt;/strong>寫了什麼。&lt;/p>
&lt;p>單向性來自修改成本不對稱。抽象層是討論的焦點，反駁、補條件、改措辭都直接落在它身上，改一段文字就完成。操作層是程序性的，同一條改動要先判斷「它影響哪幾個步驟、插在哪一步之後」，而那個判斷比改文字貴得多。時間壓力下的自然順序因此是先改抽象層、操作層稍後——而「稍後」沒有觸發器。&lt;/p>
&lt;p>漂移看不見的原因是&lt;strong>兩份各自讀起來都完整&lt;/strong>。操作層沒有殘缺、沒有內部矛盾、也沒有指向抽象層說「以那邊為準」；它就是一份自洽的舊版本。要看見差異只能把兩份並排逐句比對，而既有的檢查沒有一項在做這件事——審查抽象層的人讀抽象層，審查稿件的人讀操作層。&lt;/p>
&lt;hr>
&lt;h2 id="反模式把漂移誤診成自審失效">反模式：把漂移誤診成自審失效&lt;/h2>
&lt;p>套用率異常低時，兩種成因的表徵一模一樣：規則存在、稿件沒照做。而它們的修法相反。&lt;/p>
&lt;p>自審失效的修法是加強檢查——把規則寫進 reviewer 的維度、加一輪掃描、寫進完稿清單。漂移的修法是同步兩份副本。&lt;strong>誤診成前者的代價是修法完全無效&lt;/strong>：加再多輪審查，reviewer 拿的還是那份舊操作文件，掃出來的仍然是「符合舊規則」。而審查通過會反過來確認「規則已經落實」，讓漂移更難被發現。&lt;/p>
&lt;p>分辨方式只有一個動作：套用率低到不像疏忽時，先打開執行者實際讀的那一份，確認它寫的與抽象層是不是同一件事。這個動作要排在歸因之前，而不是歸因之後。&lt;/p>
&lt;hr>
&lt;h2 id="修法改抽象層時同批改操作層並把執行者讀哪一份寫下來">修法：改抽象層時同批改操作層，並把「執行者讀哪一份」寫下來&lt;/h2>
&lt;p>&lt;strong>改動的單位是這條原則的所有副本，不是被指出問題的那一份。&lt;/strong> 審查報告點名的通常是抽象層（因為討論在那裡發生），修完它只完成一半。收尾動作是問「這條原則還寫在哪裡」，逐一同步。&lt;/p>
&lt;p>&lt;strong>每條原則要記錄它的執行入口&lt;/strong>。抽象層在文末註明「操作面在哪一份文件的哪一節」，讓下一次修改時目的地是現成的而不必回想。這一步的成本在寫下的當下最低，因為那時剛做完抽出的動作、還記得放在哪。&lt;/p>
&lt;p>&lt;strong>版本號的粒度要對得上&lt;/strong>。操作層有版本號時，抽象層的每一次實質修改都該對應一次版本更新；抽象層改了而操作層版本沒動，本身就是漂移的訊號。反過來也成立——操作層的變更紀錄若寫不出「這次同步的是哪一條原則的哪一次修正」，代表同步是憑印象做的。&lt;/p>
&lt;p>&lt;strong>排定一次反向核對&lt;/strong>。抽象層的原則累積到一定數量之後，從操作層那一端逐條回查：這一句對應的原則現在長什麼樣。方向要從操作層出發，因為漂移的形態是操作層缺內容，而從抽象層出發只會確認「每一條都有對應段落」。&lt;/p>
&lt;p>&lt;strong>新內容引用既有文件的某條判準時，把那一段整段讀完並判定以誰為準。&lt;/strong> 這一條處理的是本卡最高頻的接觸點：寫新內容時回頭在既有文件補一條指向新內容的連結。那個動作只讀既有文件的路由段，不讀它的正文——於是連結對上了、判準沒有被並排過一次，而兩份此刻可能已經在講不同的事。判定的結果只有兩種：以新的為準就同批改舊的，以舊的為準就改新的；兩份都留是漂移的起點，不是折衷。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他原則的關係">跟其他原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務&lt;/a>：本卡是它最常見的誤診來源。#147 的形態是規則正確而自審沒抓到，本卡的形態是執行者讀到的規則是舊的；兩者的表徵相同（套用率低）而修法相反（加強檢查 vs 同步副本）。歸因錯了，修法的方向也就錯了。&lt;/li>
&lt;li>&lt;a href="../judgment-rules-must-specify-their-trace/">#243 要求執行者做判定的規則，要一併規定判定留下什麼痕跡&lt;/a>：本卡在它的上游。#243 管規則本身留不留得下痕跡，本卡管規則有沒有傳到執行者手上——規則設計得再好，執行者讀的是舊版就不生效。&lt;/li>
&lt;li>&lt;a href="../lint-scope-must-be-explicit-fact/">#221 檢查規則的作用域要顯式列舉&lt;/a>：兩者都讓「已檢查」失去意義，斷點不同。#221 是規則沒有涵蓋那些檔案，本卡是規則的兩個副本內容不同。共同的處置方向是把涵蓋範圍與版本從隱性變成顯性。&lt;/li>
&lt;li>&lt;a href="../single-source-of-truth/">#44 Single Source of Truth：值的住址只能有一處&lt;/a>：本卡是它在「無法只有一處」時的處置。原則與操作化必須各有一份，因為兩者的讀者與用法不同；SSoT 在這裡無法直接套用，能做的是把同步變成有觸發器的動作而不是靠記憶。&lt;/li>
&lt;li>&lt;a href="../sequential-fixes-compose-into-defects/">#247 多次局部正確的修法會合成缺陷&lt;/a>：同屬「沒有人並排讀」的家族，對象不同——本卡的兩份是同一條原則的兩個副本，那一張的兩處是同一份內容的兩次修改。&lt;/li>
&lt;li>&lt;a href="../declared-composition-is-not-performed-composition/">#239 宣告的組合不等於執行的組合&lt;/a>：同型的宣告與實際落差，層次不同。#239 是同一個執行者宣告啟用兩件事而只做了一件，本卡是規則在傳遞過程中掉了版本。&lt;/li>
&lt;li>&lt;a href="../content-pressure-resolves-by-expansion-not-compression/">#262 內容超出容器時擴充結構、不壓縮內容&lt;/a>：本卡在容器決策裡的位置由它指定——同一概念的多個版本要在選容器出口之前收斂，否則展開會寫出兩套更詳細的版本、連結會把讀者送到用不同語彙描述同一件事的地方。它的第二輪試點裡這一類是最大宗（一章的階段表整張與同模組另一章不相容），而每篇單獨讀都不顯示問題——本卡的漂移在教學內容裡的形態是兩篇平行章節，不只是原則卡與操作文件那一組。&lt;/li>
&lt;li>&lt;a href="../incompatible-decompositions-look-complementary/">#263 同一個對象被兩篇各自分解一次時，不相容會長得像互補&lt;/a>：機制相反的 sibling，兩者的表徵接近而修法互斥。本卡的兩份有共同起源、差異單向累積、修法是同步；那張卡的兩套是平行發明、從未相同過，同步會把兩份各自完整的分解合成一個兩邊都不像的第三套。誤診的方向可預測——跨篇撞到兩套不一致時，先假設漂移比先假設平行發明省力，因為漂移有現成的修法。&lt;/li>
&lt;li>&lt;a href="../doc-sync-needs-mechanism-or-demotion/">#256 多份文件必然漂移：同步期待要嘛有機制承接、要嘛明示降級&lt;/a>：本卡的上游選項。本卡處理既有雙副本的機制補法（反向核對、版本號對齊、改動單位取所有副本），#256 補上更早的問題——這第二份副本該不該以「被期待最新」的身分存在；能引用就不複製、能降級成一次性 scaffold 就不掛同步期待，雙副本機制是拆不掉時的退位處置。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>一條規則的套用率是零或接近零，而執行者是有能力做到的人。&lt;/li>
&lt;li>抽象層的文件被修改過多次，而對應的操作文件版本紀錄停在很早的日期。&lt;/li>
&lt;li>審查報告反覆點名同一條規則沒被遵守，修法每次都是「加強檢查」。&lt;/li>
&lt;li>抽象層寫得出「這條原則的操作面在哪」，操作層寫不出「這一段對應哪一條原則」——單向的可追溯性代表同步只往一個方向做過。&lt;/li>
&lt;li>把兩份並排讀是從來沒有人做過的動作，而且沒有任何檢查要求它。&lt;/li>
&lt;li>新內容宣告「這件事的分工見某份既有文件」，而寫的人不知道那份文件對應段落現在寫了什麼——回指是路由層的動作，判準層沒有被並排。&lt;/li>
&lt;li>兩份的成對關係跨了文件類型（概念卡與操作章、規格與教學），因此不會被當成「同一份東西的兩個副本」而納入任何同步習慣。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡從一次多輪審查的第三輪抽出。當時查的是「規則寫下來之後同批稿件仍然犯」，掃到一條規則的套用率是零：九則微案例沒有任何一則做了那條規則要求的動作。</p>
<p>直覺的解釋是自審失效——規則在那裡、寫的人沒照做。實際去查才發現另一件事：那條規則寫在原則卡上，而執行時實際被讀的是另一份操作文件，那一份停在規則被抽出時的第一版，後來卡片修過三次的內容一次都沒有同步過去。<strong>套用率零不是因為沒照做，是因為照的是舊版。</strong></p>
<p>回頭比對同一批的其他規則，漂移的分布有規律：與操作文件同時寫下的那幾條都同步了；卡片在後續輪次被修正的那幾條，操作文件全部停在原版。</p>
<p>限制：本卡談的是同一條原則被寫在兩個地方的情形（抽象層與操作層各一份）。單一來源的規則不適用；兩份內容本來就該不同的情形（規格與實作、需求與測試）也不適用——那裡的差異是設計，不是漂移。</p>
<hr>
<h2 id="核心原則">核心原則</h2>
<p><strong>一條原則同時存在於抽象層與操作層時，兩份是會各自演化的副本，而修正流向單向：抽象層被反覆修改、操作層停在第一次抽出時的版本。</strong> 判斷某條規則有沒有漂移，不看抽象層寫了什麼，看<strong>執行者實際會讀的那一份</strong>寫了什麼。</p>
<p>單向性來自修改成本不對稱。抽象層是討論的焦點，反駁、補條件、改措辭都直接落在它身上，改一段文字就完成。操作層是程序性的，同一條改動要先判斷「它影響哪幾個步驟、插在哪一步之後」，而那個判斷比改文字貴得多。時間壓力下的自然順序因此是先改抽象層、操作層稍後——而「稍後」沒有觸發器。</p>
<p>漂移看不見的原因是<strong>兩份各自讀起來都完整</strong>。操作層沒有殘缺、沒有內部矛盾、也沒有指向抽象層說「以那邊為準」；它就是一份自洽的舊版本。要看見差異只能把兩份並排逐句比對，而既有的檢查沒有一項在做這件事——審查抽象層的人讀抽象層，審查稿件的人讀操作層。</p>
<hr>
<h2 id="反模式把漂移誤診成自審失效">反模式：把漂移誤診成自審失效</h2>
<p>套用率異常低時，兩種成因的表徵一模一樣：規則存在、稿件沒照做。而它們的修法相反。</p>
<p>自審失效的修法是加強檢查——把規則寫進 reviewer 的維度、加一輪掃描、寫進完稿清單。漂移的修法是同步兩份副本。<strong>誤診成前者的代價是修法完全無效</strong>：加再多輪審查，reviewer 拿的還是那份舊操作文件，掃出來的仍然是「符合舊規則」。而審查通過會反過來確認「規則已經落實」，讓漂移更難被發現。</p>
<p>分辨方式只有一個動作：套用率低到不像疏忽時，先打開執行者實際讀的那一份，確認它寫的與抽象層是不是同一件事。這個動作要排在歸因之前，而不是歸因之後。</p>
<hr>
<h2 id="修法改抽象層時同批改操作層並把執行者讀哪一份寫下來">修法：改抽象層時同批改操作層，並把「執行者讀哪一份」寫下來</h2>
<p><strong>改動的單位是這條原則的所有副本，不是被指出問題的那一份。</strong> 審查報告點名的通常是抽象層（因為討論在那裡發生），修完它只完成一半。收尾動作是問「這條原則還寫在哪裡」，逐一同步。</p>
<p><strong>每條原則要記錄它的執行入口</strong>。抽象層在文末註明「操作面在哪一份文件的哪一節」，讓下一次修改時目的地是現成的而不必回想。這一步的成本在寫下的當下最低，因為那時剛做完抽出的動作、還記得放在哪。</p>
<p><strong>版本號的粒度要對得上</strong>。操作層有版本號時，抽象層的每一次實質修改都該對應一次版本更新；抽象層改了而操作層版本沒動，本身就是漂移的訊號。反過來也成立——操作層的變更紀錄若寫不出「這次同步的是哪一條原則的哪一次修正」，代表同步是憑印象做的。</p>
<p><strong>排定一次反向核對</strong>。抽象層的原則累積到一定數量之後，從操作層那一端逐條回查：這一句對應的原則現在長什麼樣。方向要從操作層出發，因為漂移的形態是操作層缺內容，而從抽象層出發只會確認「每一條都有對應段落」。</p>
<p><strong>新內容引用既有文件的某條判準時，把那一段整段讀完並判定以誰為準。</strong> 這一條處理的是本卡最高頻的接觸點：寫新內容時回頭在既有文件補一條指向新內容的連結。那個動作只讀既有文件的路由段，不讀它的正文——於是連結對上了、判準沒有被並排過一次，而兩份此刻可能已經在講不同的事。判定的結果只有兩種：以新的為準就同批改舊的，以舊的為準就改新的；兩份都留是漂移的起點，不是折衷。</p>
<hr>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<ul>
<li><a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務</a>：本卡是它最常見的誤診來源。#147 的形態是規則正確而自審沒抓到，本卡的形態是執行者讀到的規則是舊的；兩者的表徵相同（套用率低）而修法相反（加強檢查 vs 同步副本）。歸因錯了，修法的方向也就錯了。</li>
<li><a href="../judgment-rules-must-specify-their-trace/">#243 要求執行者做判定的規則，要一併規定判定留下什麼痕跡</a>：本卡在它的上游。#243 管規則本身留不留得下痕跡，本卡管規則有沒有傳到執行者手上——規則設計得再好，執行者讀的是舊版就不生效。</li>
<li><a href="../lint-scope-must-be-explicit-fact/">#221 檢查規則的作用域要顯式列舉</a>：兩者都讓「已檢查」失去意義，斷點不同。#221 是規則沒有涵蓋那些檔案，本卡是規則的兩個副本內容不同。共同的處置方向是把涵蓋範圍與版本從隱性變成顯性。</li>
<li><a href="../single-source-of-truth/">#44 Single Source of Truth：值的住址只能有一處</a>：本卡是它在「無法只有一處」時的處置。原則與操作化必須各有一份，因為兩者的讀者與用法不同；SSoT 在這裡無法直接套用，能做的是把同步變成有觸發器的動作而不是靠記憶。</li>
<li><a href="../sequential-fixes-compose-into-defects/">#247 多次局部正確的修法會合成缺陷</a>：同屬「沒有人並排讀」的家族，對象不同——本卡的兩份是同一條原則的兩個副本，那一張的兩處是同一份內容的兩次修改。</li>
<li><a href="../declared-composition-is-not-performed-composition/">#239 宣告的組合不等於執行的組合</a>：同型的宣告與實際落差，層次不同。#239 是同一個執行者宣告啟用兩件事而只做了一件，本卡是規則在傳遞過程中掉了版本。</li>
<li><a href="../content-pressure-resolves-by-expansion-not-compression/">#262 內容超出容器時擴充結構、不壓縮內容</a>：本卡在容器決策裡的位置由它指定——同一概念的多個版本要在選容器出口之前收斂，否則展開會寫出兩套更詳細的版本、連結會把讀者送到用不同語彙描述同一件事的地方。它的第二輪試點裡這一類是最大宗（一章的階段表整張與同模組另一章不相容），而每篇單獨讀都不顯示問題——本卡的漂移在教學內容裡的形態是兩篇平行章節，不只是原則卡與操作文件那一組。</li>
<li><a href="../incompatible-decompositions-look-complementary/">#263 同一個對象被兩篇各自分解一次時，不相容會長得像互補</a>：機制相反的 sibling，兩者的表徵接近而修法互斥。本卡的兩份有共同起源、差異單向累積、修法是同步；那張卡的兩套是平行發明、從未相同過，同步會把兩份各自完整的分解合成一個兩邊都不像的第三套。誤診的方向可預測——跨篇撞到兩套不一致時，先假設漂移比先假設平行發明省力，因為漂移有現成的修法。</li>
<li><a href="../doc-sync-needs-mechanism-or-demotion/">#256 多份文件必然漂移：同步期待要嘛有機制承接、要嘛明示降級</a>：本卡的上游選項。本卡處理既有雙副本的機制補法（反向核對、版本號對齊、改動單位取所有副本），#256 補上更早的問題——這第二份副本該不該以「被期待最新」的身分存在；能引用就不複製、能降級成一次性 scaffold 就不掛同步期待，雙副本機制是拆不掉時的退位處置。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>一條規則的套用率是零或接近零，而執行者是有能力做到的人。</li>
<li>抽象層的文件被修改過多次，而對應的操作文件版本紀錄停在很早的日期。</li>
<li>審查報告反覆點名同一條規則沒被遵守，修法每次都是「加強檢查」。</li>
<li>抽象層寫得出「這條原則的操作面在哪」，操作層寫不出「這一段對應哪一條原則」——單向的可追溯性代表同步只往一個方向做過。</li>
<li>把兩份並排讀是從來沒有人做過的動作，而且沒有任何檢查要求它。</li>
<li>新內容宣告「這件事的分工見某份既有文件」，而寫的人不知道那份文件對應段落現在寫了什麼——回指是路由層的動作，判準層沒有被並排。</li>
<li>兩份的成對關係跨了文件類型（概念卡與操作章、規格與教學），因此不會被當成「同一份東西的兩個副本」而納入任何同步習慣。</li>
</ul>
]]></content:encoded></item><item><title>舉證要求會把誠實的那個輸出定價成最貴的：檢查梯度指向哪裡</title><link>https://tarrragon.github.io/blog/report/evidence-requirement-can-price-out-precision/</link><pubDate>Fri, 21 Aug 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/evidence-requirement-can-price-out-precision/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡從一次書單分類的四輪審查抽出。第四輪的問題是「一個趕時間、想通過檢查的執行者會怎麼合規地執行這批規則」，出來的十一項裡有九項收斂成 &lt;a href="https://tarrragon.github.io/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243&lt;/a> 已經寫過的形狀——規則要求判定卻沒規定判定留下什麼。剩下兩項是另一個形狀，而且方向相反：那兩條規則&lt;strong>確實要求了依據&lt;/strong>，只是把依據的代價算在誠實的那一側。&lt;/p>
&lt;p>兩個實例都在同一頁上。其一是可信度的分辨規則，它寫著「出現章節名、或指出某一段論證的前提落在哪裡的判定，屬於需要密讀才下得了的那一類」，而那一類要當待驗證的線索、不能當結論。它的用意是提醒讀者哪些判定比較軟，實際效果是：把判定寫具體會自動觸發降級，寫粗則不會。同一份工作，講得清楚的那個版本被標成可信度較低。其二是「本書單未評估」這個標籤，規則要求它一併寫出未評估的是哪一項（角色歸屬、內容重疊、適用邊界、還是時效）。那條要求本身是對的，它讓「不知道」與「知道它不適用」分得開，代價是承認不知道變成一件要填欄位的事——而最省力的做法不是填欄位，是根本不把那本書寫進頁面。&lt;/p>
&lt;p>限制：本卡談的是&lt;strong>已經有舉證要求&lt;/strong>的規則。完全不要求痕跡的規則走 &lt;a href="https://tarrragon.github.io/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243&lt;/a>，那裡的修法是加上要求；照那個修法加要求而不看梯度，正是這張卡描述的問題的來源。兩個實例出自同一批內容、同一位作者、同一輪審查，說明得了形狀，說明不了發生率。&lt;/p>
&lt;hr>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>寫下一條舉證要求時，把它產出的幾種輸出排一次價：誠實而具體的那個、含糊的那個、以及乾脆不寫的那個，哪一個最便宜。&lt;/strong> 最便宜的那個會變成預設，而規則寫得再對都攔不住——執行者不必違規就走得到那裡。&lt;/p>
&lt;p>價格不只是字數。降級標記也是價格：一條規則若讓具體的判定自動被標成可信度較低，那個標記就是對具體收的稅。要填的欄位也是價格：一條規則若讓承認不知道比保持沉默多做一步，沉默就會贏。&lt;/p>
&lt;p>判準可以機械執行：&lt;strong>問這條規則有沒有讓「多說一點」的那個版本比「少說一點」的版本更貴&lt;/strong>。答是的話，梯度指向含糊，而含糊在頁面上跟認真做過長得一樣。&lt;/p>
&lt;hr>
&lt;h2 id="反模式">反模式&lt;/h2>
&lt;p>&lt;strong>把降級掛在措辭上。&lt;/strong> 用判定的寫法（有沒有出現章節名、有沒有指出前提）決定它的可信度分級，等於讓作者可以靠寫粗來換分級。這一條的偽裝性很強，因為它看起來是在提醒讀者，實際上是在給作者一個開關。&lt;/p>
&lt;p>&lt;strong>只加要求、不看梯度。&lt;/strong> 讀到 &lt;a href="https://tarrragon.github.io/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243&lt;/a> 之後逐條補舉證要求，是這張卡描述的問題最常見的來源。補要求會讓誠實輸出變貴，除非同時把成本挪走。&lt;/p>
&lt;p>&lt;strong>用欄位懲罰承認不知道。&lt;/strong> 「未評估要寫出未評估的是哪一項」比「未評估」貴，而比兩者都便宜的是不提那本書。規則因此把資訊擠出頁面，而頁面上看不出少了什麼。&lt;/p>
&lt;p>&lt;strong>逐條補限定句。&lt;/strong> 發現梯度歪掉之後，對每一條規則各補一句例外，會讓規則膨脹到需要導讀。收斂成同一形狀的 finding 補到第三條就該停下來抽共用原則——收斂本身是訊號。&lt;/p>
&lt;hr>
&lt;h2 id="修法">修法&lt;/h2>
&lt;p>&lt;strong>把分級的依據從措辭換成來源。&lt;/strong> 可信度那一條的修法不是放寬標準，是改判定的輸入：每一則判定標它的來源（通讀、章節摘要、第三方評述、體裁推斷），沒有標記的一律視為未經密讀。這樣寫得具體不再自動觸發降級，而想避開降級的人得去補來源、不是去刪細節。&lt;/p>
&lt;p>&lt;strong>讓誠實輸出的成本不高於沉默。&lt;/strong> 「未評估」那一條的修法是把欄位變成選單而非填空，或在收錄段主動點名該主題最常被想到而沒收的那一本——把那個位置變成有人會檢查的地方，沉默就不再免費。&lt;/p>
&lt;p>&lt;strong>排價要對整組規則做一次，不是逐條做。&lt;/strong> 一組規則裡的每一條單看都可能沒問題，而梯度是它們合起來的結果。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>跟 &lt;a href="https://tarrragon.github.io/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243 要求執行者做判定的規則，要一併規定判定留下什麼痕跡&lt;/a> 是互補的兩半，合起來才涵蓋一條判定型規則的兩種失效。#243 管的是沒有痕跡要求的規則，它會沿零後續的結論塌陷；本卡管的是有痕跡要求而定價錯的規則，它會沿含糊或省略塌陷。兩者的修法方向相反——前者加要求、後者挪成本，所以照 #243 補完之後要再跑一次本卡的排價。&lt;/li>
&lt;li>跟 &lt;a href="https://tarrragon.github.io/blog/report/checkable-anchor-must-be-able-to-fall/" data-link-title="可核對的錨要跟它該偵測的狀態連動：會下降只是連動的一種形態" data-link-desc="要為一批自己做的判定補一個作者以外可核對的東西時，用來檢查它會不會在該偵測的事情發生時毫無反應">#266 可核對的錨要跟它該偵測的狀態連動&lt;/a> 在同一條鏈上而位置不同。#266 檢查的是錨本身會不會在該偵測的事情發生時毫無反應，本卡檢查的是產生那個錨的動作有沒有被規則反向定價——錨設計得再好，若記錄它比不記錄貴，記錄就不會發生。&lt;/li>
&lt;li>跟 &lt;a href="https://tarrragon.github.io/blog/report/count-threshold-is-a-proxy-for-a-checkable-judgment/" data-link-title="規則用數量當門檻時，先問那個數量在代理什麼判斷" data-link-desc="訂規則時想寫「累積 N 個再做 X」的當下，判斷這個 N 是證據本身還是某個判斷的代理。代理型門檻在維護者角度成立、在使用者角度失效，而它代理的判斷通常可以直接檢查。">#264 規則用數量當門檻時，先問那個數量在代理什麼判斷&lt;/a> 是同一種提問套在規則的不同部位。#264 問門檻裡的那個數字在代理什麼，本卡問整條規則的成本結構在鼓勵什麼；兩者都預設規則會被人用最省力的方式滿足。&lt;/li>
&lt;li>跟 &lt;a href="https://tarrragon.github.io/blog/report/declared-composition-is-not-performed-composition/" data-link-title="宣告的組合不等於執行的組合：顯著的那半擠掉費力的那半" data-link-desc="同時啟用兩個行為 / 規則 / skill、並宣告「都在」時，判斷該不該在每次輸出點驗證兩半都真的現形——因為顯著省力的那半會執行、費力不顯眼的那半會靜默掉，而自審只查『有沒有宣告啟用』抓不到">#239 宣告的組合不等於執行的組合&lt;/a> 共用同一個機制而作用在不同層。#239 說的是兩件事並行時有檢查表的那件會擠掉沒有的，本卡說的是同一件事的幾種寫法裡便宜的會擠掉貴的——兩者都是顯著性或成本決定了實際發生什麼，而宣告決定不了。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;p>下次遇到同類情境時，這幾個訊號可以提早識別：&lt;/p>
&lt;ul>
&lt;li>一輪誤用審查的 finding 大量收斂成「沒有痕跡」，而剩下的少數幾項方向相反——那少數幾項就是本卡的形態，不要跟多數一起處理。&lt;/li>
&lt;li>一條規則同時規定了「怎麼做」與「做了之後會被怎麼評價」，而評價的輸入是措辭。&lt;/li>
&lt;li>規範裡有一個誠實用的標籤（未評估、待驗證、可信度較低），而使用它需要額外填寫。&lt;/li>
&lt;li>同一批內容裡，寫得最詳細的那幾則被標成可信度最低的那幾則。&lt;/li>
&lt;li>補完一輪舉證要求之後，下一輪的內容變得比較短、比較平、比較沒有具體名詞。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡從一次書單分類的四輪審查抽出。第四輪的問題是「一個趕時間、想通過檢查的執行者會怎麼合規地執行這批規則」，出來的十一項裡有九項收斂成 <a href="/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243</a> 已經寫過的形狀——規則要求判定卻沒規定判定留下什麼。剩下兩項是另一個形狀，而且方向相反：那兩條規則<strong>確實要求了依據</strong>，只是把依據的代價算在誠實的那一側。</p>
<p>兩個實例都在同一頁上。其一是可信度的分辨規則，它寫著「出現章節名、或指出某一段論證的前提落在哪裡的判定，屬於需要密讀才下得了的那一類」，而那一類要當待驗證的線索、不能當結論。它的用意是提醒讀者哪些判定比較軟，實際效果是：把判定寫具體會自動觸發降級，寫粗則不會。同一份工作，講得清楚的那個版本被標成可信度較低。其二是「本書單未評估」這個標籤，規則要求它一併寫出未評估的是哪一項（角色歸屬、內容重疊、適用邊界、還是時效）。那條要求本身是對的，它讓「不知道」與「知道它不適用」分得開，代價是承認不知道變成一件要填欄位的事——而最省力的做法不是填欄位，是根本不把那本書寫進頁面。</p>
<p>限制：本卡談的是<strong>已經有舉證要求</strong>的規則。完全不要求痕跡的規則走 <a href="/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243</a>，那裡的修法是加上要求；照那個修法加要求而不看梯度，正是這張卡描述的問題的來源。兩個實例出自同一批內容、同一位作者、同一輪審查，說明得了形狀，說明不了發生率。</p>
<hr>
<h2 id="核心原則">核心原則</h2>
<p><strong>寫下一條舉證要求時，把它產出的幾種輸出排一次價：誠實而具體的那個、含糊的那個、以及乾脆不寫的那個，哪一個最便宜。</strong> 最便宜的那個會變成預設，而規則寫得再對都攔不住——執行者不必違規就走得到那裡。</p>
<p>價格不只是字數。降級標記也是價格：一條規則若讓具體的判定自動被標成可信度較低，那個標記就是對具體收的稅。要填的欄位也是價格：一條規則若讓承認不知道比保持沉默多做一步，沉默就會贏。</p>
<p>判準可以機械執行：<strong>問這條規則有沒有讓「多說一點」的那個版本比「少說一點」的版本更貴</strong>。答是的話，梯度指向含糊，而含糊在頁面上跟認真做過長得一樣。</p>
<hr>
<h2 id="反模式">反模式</h2>
<p><strong>把降級掛在措辭上。</strong> 用判定的寫法（有沒有出現章節名、有沒有指出前提）決定它的可信度分級，等於讓作者可以靠寫粗來換分級。這一條的偽裝性很強，因為它看起來是在提醒讀者，實際上是在給作者一個開關。</p>
<p><strong>只加要求、不看梯度。</strong> 讀到 <a href="/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243</a> 之後逐條補舉證要求，是這張卡描述的問題最常見的來源。補要求會讓誠實輸出變貴，除非同時把成本挪走。</p>
<p><strong>用欄位懲罰承認不知道。</strong> 「未評估要寫出未評估的是哪一項」比「未評估」貴，而比兩者都便宜的是不提那本書。規則因此把資訊擠出頁面，而頁面上看不出少了什麼。</p>
<p><strong>逐條補限定句。</strong> 發現梯度歪掉之後，對每一條規則各補一句例外，會讓規則膨脹到需要導讀。收斂成同一形狀的 finding 補到第三條就該停下來抽共用原則——收斂本身是訊號。</p>
<hr>
<h2 id="修法">修法</h2>
<p><strong>把分級的依據從措辭換成來源。</strong> 可信度那一條的修法不是放寬標準，是改判定的輸入：每一則判定標它的來源（通讀、章節摘要、第三方評述、體裁推斷），沒有標記的一律視為未經密讀。這樣寫得具體不再自動觸發降級，而想避開降級的人得去補來源、不是去刪細節。</p>
<p><strong>讓誠實輸出的成本不高於沉默。</strong> 「未評估」那一條的修法是把欄位變成選單而非填空，或在收錄段主動點名該主題最常被想到而沒收的那一本——把那個位置變成有人會檢查的地方，沉默就不再免費。</p>
<p><strong>排價要對整組規則做一次，不是逐條做。</strong> 一組規則裡的每一條單看都可能沒問題，而梯度是它們合起來的結果。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li>跟 <a href="/blog/report/judgment-rules-must-specify-their-trace/" data-link-title="要求執行者做判定的規則，要一併規定判定留下什麼痕跡" data-link-desc="寫下一條「先判斷 X、再依判斷做 Y」的規則時，判斷它可不可證偽——判定過與沒判定過的產物相同時，規則會沿著零後續的那個結論塌陷">#243 要求執行者做判定的規則，要一併規定判定留下什麼痕跡</a> 是互補的兩半，合起來才涵蓋一條判定型規則的兩種失效。#243 管的是沒有痕跡要求的規則，它會沿零後續的結論塌陷；本卡管的是有痕跡要求而定價錯的規則，它會沿含糊或省略塌陷。兩者的修法方向相反——前者加要求、後者挪成本，所以照 #243 補完之後要再跑一次本卡的排價。</li>
<li>跟 <a href="/blog/report/checkable-anchor-must-be-able-to-fall/" data-link-title="可核對的錨要跟它該偵測的狀態連動：會下降只是連動的一種形態" data-link-desc="要為一批自己做的判定補一個作者以外可核對的東西時，用來檢查它會不會在該偵測的事情發生時毫無反應">#266 可核對的錨要跟它該偵測的狀態連動</a> 在同一條鏈上而位置不同。#266 檢查的是錨本身會不會在該偵測的事情發生時毫無反應，本卡檢查的是產生那個錨的動作有沒有被規則反向定價——錨設計得再好，若記錄它比不記錄貴，記錄就不會發生。</li>
<li>跟 <a href="/blog/report/count-threshold-is-a-proxy-for-a-checkable-judgment/" data-link-title="規則用數量當門檻時，先問那個數量在代理什麼判斷" data-link-desc="訂規則時想寫「累積 N 個再做 X」的當下，判斷這個 N 是證據本身還是某個判斷的代理。代理型門檻在維護者角度成立、在使用者角度失效，而它代理的判斷通常可以直接檢查。">#264 規則用數量當門檻時，先問那個數量在代理什麼判斷</a> 是同一種提問套在規則的不同部位。#264 問門檻裡的那個數字在代理什麼，本卡問整條規則的成本結構在鼓勵什麼；兩者都預設規則會被人用最省力的方式滿足。</li>
<li>跟 <a href="/blog/report/declared-composition-is-not-performed-composition/" data-link-title="宣告的組合不等於執行的組合：顯著的那半擠掉費力的那半" data-link-desc="同時啟用兩個行為 / 規則 / skill、並宣告「都在」時，判斷該不該在每次輸出點驗證兩半都真的現形——因為顯著省力的那半會執行、費力不顯眼的那半會靜默掉，而自審只查『有沒有宣告啟用』抓不到">#239 宣告的組合不等於執行的組合</a> 共用同一個機制而作用在不同層。#239 說的是兩件事並行時有檢查表的那件會擠掉沒有的，本卡說的是同一件事的幾種寫法裡便宜的會擠掉貴的——兩者都是顯著性或成本決定了實際發生什麼，而宣告決定不了。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<p>下次遇到同類情境時，這幾個訊號可以提早識別：</p>
<ul>
<li>一輪誤用審查的 finding 大量收斂成「沒有痕跡」，而剩下的少數幾項方向相反——那少數幾項就是本卡的形態，不要跟多數一起處理。</li>
<li>一條規則同時規定了「怎麼做」與「做了之後會被怎麼評價」，而評價的輸入是措辭。</li>
<li>規範裡有一個誠實用的標籤（未評估、待驗證、可信度較低），而使用它需要額外填寫。</li>
<li>同一批內容裡，寫得最詳細的那幾則被標成可信度最低的那幾則。</li>
<li>補完一輪舉證要求之後，下一輪的內容變得比較短、比較平、比較沒有具體名詞。</li>
</ul>
]]></content:encoded></item></channel></rss>