finding 清單列的是抽樣位置,照著逐處修會留下同一類在沒被點名的地方
論述基礎與限制
本卡從一次三篇短文的多輪審查抽出,事件在 2026-08-30。審查跑了三輪十三個 reviewer 加十六份低階模型探針,其中兩個獨立的 frame 先後指認同一個失效模式:Round 3 的自我應用 reviewer 直接把它寫成診斷(「修改範圍以被點名的那幾處為單位、而不是以這一類為單位」),而稍後的翻譯探針在同一份稿件上抓到該模式的一個現行實例。
限制有兩項。單一作者、單一批次:這個失效模式在這一批出現五次,但五次都由同一個人在同一天造成,頻率不可外推。掃描成本未量測:本卡的修法要求對每個 finding 做一次全批掃描,這在有穩定關鍵詞的類別上是一條指令,在沒有關鍵詞的類別上要另派一輪限定 scope 的複掃,而複掃的成本沒有實際計過。
核心原則
reviewer 回報 finding 時列出的是它抽樣到的位置,不是那一類的全部。照著清單逐處修,會留下同一類在沒被點名的位置上的實例——而那些殘留可能再也不會被抓到,因為這一類已經被回報過、下一輪換了 frame 就不再掃它。
掃描的單位要是「類別」,不是「清單上的行」。
實例:同一個詞的同一個歧義,散在三處而只修了被點名的一處
一篇文章裡的動詞「卡住」有一處主語省略,讀起來可以是「卡住讀者的是 X」,也可以是「被卡住的是 X」。五份理解探針裡有四份自陳為了確認這一句讀了兩次,位置全部指向同一行。
該行修好,補上了明確的主語。三份修後驗證探針重跑同一份指令,四份讀兩次變成零份,缺陷確認翻轉。
接著翻譯探針拿同一段派給三份低階模型翻成英文,三份裡兩份把另一行的「卡住的是自己的用法」譯成 what’s blocking you(致使義),一份譯成 what’s caught(被動義)——同一個詞、同一個歧義、另一個位置,而那個位置從頭到尾沒有被任何一份報告點名。回頭用一條指令掃這個詞的全部出現位置,發現第三處在 description 裡,形態相同。
三處同型,只修了被點名的第一處,直到換一個 frame 才撞見第二處。
同一批還有四次同形態的復發:術語標籤的統一只改了正文而漏了段標、物理化錯配的清理只改了三篇正文而漏了目錄頁、前向指涉的修正只處理了被舉例的那一句。每一次都是清單上的行修完了,而那一類還在。
為什麼 finding 清單讀起來像窮舉
清單的形式在暗示完整性。每一條都有位置、有原文摘引、有嚴重度、有建議修法——這個格式是為了讓人照著執行而設計的,而照著執行的人自然把「執行完清單」讀成「處理完問題」。
reviewer 也沒有義務澄清。多數產出契約要求的是「列出檢查了哪些對象」,不是「這一類我掃了幾處、命中幾處、列出來的是全部還是代表性的幾處」。抽樣三處與逐處驗完,在一份不列出總數的報告裡長得一模一樣。
修的人則有一個反向的誘因:清單全部劃掉是一個乾淨的完成訊號,而回頭掃全批只會把已經劃掉的條目重新打開。
修法
每個 finding 修完之後,用它的特徵字串掃全批。 掃的對象是整批稿件,不是那個 finding 指名的檔案。命中數歸零,或剩下的都逐處判定合規,才算這一條處理完。
「全批」的定義是成品的全部,不是這一輪改過的檔。 指令可以完全正確而作用域錯——正規式對、管道通、逐條列出也做了,而餵給它的路徑集合窄了一圈。錯誤的作用域不是隨便挑的:手邊那份改動清單(diff、這次的 commit 範圍、剛拆出來的那幾個檔)在「這次變更有沒有引入新問題」這個用途上正是對的作用域,而收尾問的是存量不是增量。它不會露餡,因為在改過的檔裡命中歸零、報告讀起來就是乾淨的。判別問句二選一所以便宜——我剛才掃的路徑,是我改過的那些,還是這個成品的全部。連帶一個位置要求:正對照要放在沒有被這一輪改動過的檔裡,放在改過的檔裡它會命中,於是管道通過驗證而作用域缺口原樣留著。
掃描指令本身要先驗過。 拿一個已知會命中的字串餵給同一條指令,確認管道通——零命中有兩個來源,而指令寫錯的那一個看起來跟乾淨一模一樣。
字串掃描抓得到同形殘留,抓不到異形殘留。 一次實測跑了掃描並抓到殘留,仍然漏掉「另一張表也該改」——那一處承載同一個缺陷而字面完全不同,字串比對對它沒有訊號。補位的動作是逐項對照數量:把 reviewer 指出的每個多實例 finding 列成一行,寫下它宣稱的實例數與已修數,兩個數字對不上的回頭找。這一步不依賴關鍵詞,所以它涵蓋掃描涵蓋不到的那一半。
沒有穩定關鍵詞的類別改派複掃。 論元結構、並列轄域、語域這幾類掃不出來,處置是排一輪限定 scope 的審查,指令只說「找出這一類的全部位置」而不給已知的那幾處——給了的話,回報會收斂到那幾處附近。
reviewer prompt 加一個欄位。 要求每個 finding 註明「這一類在本批的全部命中位置」,或註明它是抽樣、抽了幾處、怎麼選的。這一項把責任放回偵測端,比修的人事後補掃便宜。
跟其他原則的關係
- 規則的修法逐句驗證會通過、套到案例上才互撞:改完才查得到的事實管不了動手之前的步驟,修完要拿任務重走:限定本卡的射程:兩條規則在同一個案例上互撞的衝突沒有字串可掃,掃同一類抓不到,要拿任務重走。
- #167 修法是新違規的來源、且常引入同類變體 是本卡的姊妹,方向相反:那裡是修法引入新的同類變體(修掉一個句型就暴露它的另一個寫法),本卡是修法留下舊的同類實例。兩者的偵測難度不同——新引入的變體下一輪近 frame 抓得到,因為它是新出現的;留下的舊實例可能永遠抓不到,因為這一類已經被回報過,後續輪次不會再掃它。
- #247 多次修法會合成缺陷 講的是兩次各自正確的修法疊起來製造出第三個問題,要靠整體通讀才看得見。本卡的缺陷不在條目之間,就在條目所屬的那一類裡面,一條掃描指令就抓得到——兩者的偵測入口完全不同,不要用通讀去找本卡這一類。
- #267 關鍵字清單只收違規義項佔多數的詞 記的是清單本身是抽樣、不是那一類的全部。本卡把同一個結構推到 finding 清單上:清單是抽樣這件事,在關鍵字清單與審查報告上是同一回事,而審查報告更容易被讀成窮舉,因為它逐條寫了位置。
- #291 壞掉的掃描會回報一個看起來合理的數字 是本卡修法的前置條件。本卡要求修完之後回掃驗證,而那條掃描指令若自己壞掉,回報的零命中會直接被讀成「這一類清完了」——先驗指令再信結果。
- #286 翻譯強制消歧 是本卡實例裡撞見第二處的那個 frame。它在這裡的作用是換一個角度重新掃過同一份稿件,而不是抓新缺陷,於是抓到了上一輪修法漏掉的同類實例——換 frame 順帶做了複掃,而那本來應該由修的人主動做。
- #300 查證回報的單位是宣稱,而失效的單位可能是整個框架 與本卡共用同一個成因——清單的形狀暗示完整性——而漏掉的方向正交:本卡漏掉的是同一類問題在沒被點名的位置,那張卡漏掉的是同一處問題貫穿沒被點名的層。偵測入口也因此相反:本卡用一條掃描指令橫向掃全批,那裡要縱向問「這一句在替什麼做功」,掃描指令幫不上忙。
- 掃描的作用域會默默對齊「我這次動過什麼」:同一個動作的另一個維度。本卡要求掃描的單位從「清單上的行」升成「類別」,那一張問類別對了之後餵給指令的路徑集合夠不夠寬。兩者可以同時發生且互不遮蔽——類別對、範圍窄,報告一樣是乾淨的。
- 一次修法會對同一件事寫出兩種形式:那一張明確不是本卡的實例。 本卡的掃描輸入是 pattern,問的是「舊問題還在不在」;那一類的兩種形式都是新寫的、都不命中任何舊 pattern,問的是「我剛寫的東西彼此一致嗎」。一次實測的七個缺陷裡,作者自查抓到的兩個恰好都有 pattern 可比對、獨立審查抓到的五個恰好都沒有。兩者各抓一部分且不重疊,合併規則是 AND 並各自標明負責範圍——寫成取代會讓不量測任何東西的那一個成為主導閘門。
- #344 修法要落在缺陷所在的那一層:正交的另一軸。本卡管修法的範圍(同一類還有哪幾處沒被點名),那張卡管修法的層(這一處動到的是不是缺陷所在的那一層)。兩個檢查互不替代——一次掃遍全批而每一處都修在錯的層上,掃描報告會顯示全部處理完畢。
- #345 修法沒有寫進檔案,而同一輪的無關改善替它簽了名:同屬「產物的形式提供了它沒有量到的保證」——本卡的清單形式在暗示完整性,那裡的紀錄形式在暗示已執行。兩者的驗收動作相同:回到原始材料逐條對照,不讀清單本身。
判讀徵兆
- finding 的位置欄只列了一兩處,而那個 pattern 用一條指令掃全批有十幾個命中。
- 修完某個 finding 之後,沒有回頭跑一次針對那一類的掃描。
- 同一類問題在後續輪次由不同的 frame 再次出現,而位置與前一輪不同。
- 修法的 commit 訊息寫的是「修正 reviewer 指出的三處」而不是某一類。
- 對「這一類還有沒有別處」這個問題,答案來自記憶而不是來自一條剛跑過的指令。