真值住在稿件之外的宣稱,讀多少遍都驗不出來
論述基礎與限制
本卡抽自一篇 SQL 教學文章的四輪審查加一次完整事實回歸:約二十個 reviewer 與探針全部放行八項事實錯誤,八項都在實跑那一刻現形。單一批次、對象是帶大量引擎輸出的技術教材;機制的推導比數字強。推翻方式是找一批純文字審查抓到外部真值錯誤的紀錄。
核心原則
一份稿件裡有兩種宣稱,而審查的預設動作只對得上其中一種。 真值住在稿件裡的(論證通不通、指涉解不解得開、體例對不對、與別篇一不一致)讀得出來,因為要比對的材料都在射程內。真值住在稿件之外的(這個引擎回什麼、這段程式跑出什麼、這個數字量出來多少)讀不出來——驗它的動作是執行,而審查的預設動作是閱讀。
兩種宣稱在文字層同形。 錯的「SQLite 回 misuse of aggregate」與對的那一句,讀起來沒有任何差別;句子通順、術語正確、與上下文一致。所以 reviewer 讀完回報沒問題是誠實的:他手上的材料不含判定所需的那一項。
實例:八項全部通過了二十個審查者
那八項包括:引用的錯誤訊息接錯查詢(該查詢實際回的是另一個錯誤碼);NOT IN 展開式寫成三項而該篇的資料只交出兩項(句式是從另一篇搬來的、資料沒跟著換);一段執行計畫是從別的查詢貼過來的;「加上約束之後那一層變大了」而實跑顯示那一層一點沒變。
四輪的 frame 涵蓋了規範、案例引用、跨章一致、斷言支撐、冷讀、體例定位、理解探針、術語探針、翻譯探針、steelman、個案實跑、outbound、搜尋落點、cadence、讀者旅程。十五個 frame 沒有一個碰得到這八項,因為它們全部以閱讀為動作。
修法
先把兩類宣稱分開列,而這一步機械掃得出來。 候選是:程式碼區塊裡的輸出註解、引號裡的錯誤訊息、帶單位的數字、「某某引擎會⋯」「多數實作⋯」這類行為敘述、以及任何寫著「實測」「實跑」的句子。
外部真值那一類的審查動作是執行。 派 reviewer 去讀它是浪費——他能回報的只有「讀起來合理」,而那正是這一類錯誤的常態。
抄外部輸出時連同產生它的完整條件一起記。 版本、資料量、索引狀態、以及產生它的那一句查詢。少了任何一項,下次複驗得到不同結果時分不出是環境變了還是原本就抄錯。實例裡有一處只寫了版本與列數,複驗時多出一個關鍵字,追下去是 SELECT 清單不同。
「驗不了」這個結論本身要驗一次。 本次有一輪把跨引擎的宣稱記成「本機只有 SQLite、驗不了」,而本機一直有 docker——那個沒查證的前提讓一整輪把那一類標成不可驗。這一條的完整推導在能力限制會壓制自己的反證。
反模式
把「reviewer 沒說有問題」當成驗過。 零 finding 在這一類上等於沒有資訊。
用增加輪數或人數來補。 同一種動作做更多次,射程不變。這與同源盲區不同——那個問題加異源視角有救,這個問題加多少人都沒救,因為缺的是動作不是視角。
跟其他原則的關係
- 理解要取樣、不要靠判斷 — 探針也是讀,受同一條射程限制。探針補的是「讀者實際帶走什麼」,補不了「這句話是不是真的」。
- 能力限制會壓制自己的反證 — 本卡的修法有一條依賴它:判定「這一類驗不了」之前先驗那個判定,否則整批外部真值宣稱會被合法地略過。
- 承重事實回到 primary source 查證 — 那一張管來源(拿自己的舊分析當一手事實),本卡管動作(拿閱讀當驗證)。兩者可以同時發生:引用了正確的來源,而抄過來的那一段沒跑過。
- 要交出物件,不要交出關於物件的判斷 — 相鄰而處置相反。本卡的真值住在稿件之外、只能靠執行取得,所以修法是換工具;那一張的物件可以從手上已有的材料構造出來,缺的只是有人要求構造,所以修法是換問句。分辨兩者問一句:這個物件造得出來嗎。
判讀徵兆
- 一批內容裡的程式碼區塊多數帶著輸出註解,而審查報告裡沒有任何一份提到自己跑過。
- 審查報告用「這一段的機制正確」描述一個含具體輸出的段落——機制與輸出是兩件事,機制對而輸出抄錯是這一類的典型形態。
- 某一類宣稱在某一輪被標成「無法驗證」,而標註沒有寫出試過哪些方法。
- 同一段輸出在兩處出現而條件的描述不同,或條件只寫了一部分(有版本沒資料、有資料沒查詢)。