論述基礎與限制

本卡從一次批次清理的收尾抽出,由併行的另一個工作階段回報。單一個案;「這個預設有多常發生」沒有量測,而預設的來源(手邊就有一份改動清單)是結構性的。

核心原則

修法收尾的掃描,指令可以完全正確而作用域錯。 正規式對、管道通、逐條列出也做了,而餵給它的路徑集合窄了一圈。

錯誤的作用域不是隨便挑的,它是一個在別處正確的東西被搬到這裡。 修法的人手上有一份現成的改動清單——版本控制的 diff、這次的 commit 範圍、剛拆出來的那幾個檔——它就在手邊,而且它在另一個用途上正是對的作用域:判斷「這次變更有沒有引入新問題」用的就是改動集合。搬到收尾這一步就錯了,因為收尾問的是存量而不是增量。

它不會露餡。 在改過的檔裡命中歸零,報告讀起來就是乾淨的。零命中有兩個來源——真的清完了、與沒掃到——而兩者的輸出相同。

判別問句是二選一的,所以便宜:我剛才掃的路徑,是我改過的那些,還是這個成品的全部。 答案當下就知道,不需要任何額外的查證。

兩種作用域各有正確的場合

作用域回答的問題用在哪裡
改動集合這次變更有沒有引入新問題提交前的品質判斷、增量檢查
成品全集這一類在成品裡還有沒有殘留批次清理的收尾、存量稽核

兩者都對,錯的是把前者用在後者的位置上。而它們在指令上的差別只有路徑參數那一段,所以替換的成本接近零、被寫錯的機率卻很高。

實例:三十二處覆蓋的全部是拆分產生的檔

一次單檔拆成多份的重構之後,做了一輪章節編號的整批移除,處理了三十二處。掃描跑了、逐項對照也做了。

隨後對整份成品重掃,那些沒有被這一輪動過的既有檔案裡還留著三個序號——標示的是三種並列的測試類型,是道地的內嵌計數,加第四種就漂。

失效的位置不在掃描的深度:那次的掃描做到了逐項對照這一層。失效在作用域的預設值來自工作流程的痕跡,而拆分這個動作讓「我改過的檔」看起來就是全部,因為新檔確實是這一輪產生的。

修法

掃描指令的路徑參數寫成受檢對象的定義,不寫成改動清單。 整個目錄、整個模組、整個分類——寫得出那個定義,就寫得出路徑。

報告要附掃描指令本身,含路徑參數。 「掃了哪些」因此變成可核對的東西,而不是一段回憶。少了這一項,作用域不留任何痕跡:它由執行者當下打的那幾個路徑決定,事後沒有人查得到。

正對照要放在沒有被這一輪改動過的檔裡。 這一條是對「把正對照放進掃描的輸出」那個做法的補強——正對照放在改過的檔裡會命中,於是它證明了管道是通的,而作用域的缺口原樣留著。

反模式

用「處理了 N 處」描述一輪清理,而 N 的分母沒有寫出來。 分子看起來越大,分母越不會被問。

把拆分或新建當成「我改過的就是全部」的理由。 新產生的檔確實全部經手過,而成品裡的舊檔一個都沒動到,兩者合起來才是受檢對象。

跟其他原則的關係

  • 掃描指令壞掉時不會報錯,它報一個數字 — 失效樣態相同而成因相反。那一張的指令壞了,本卡的指令完全正確。所以那一張的修法擋不到本卡:正對照那一列若放在改過的檔裡就會命中,管道通過驗證而作用域仍然是窄的。本卡因此給正對照加一個位置要求。

  • 檢查規則的作用域要顯式列舉 — 同一件事在兩種載體上。那裡的作用域寫在設定檔的路徑常數裡,查得到、錯了會長期存在;本卡的作用域是執行者當下的一次選擇,不留痕跡、每一次都要重新做對。共用的處置是把涵蓋範圍變成可以逐條核對的東西。

  • finding 清單列的是抽樣位置 — 同一個動作的另一個維度。那一張要求掃描的單位從「清單上的行」升成「類別」,本卡問類別對了之後餵給指令的路徑集合夠不夠寬。兩者可以同時發生且互不遮蔽:類別對、範圍窄,報告一樣乾淨。

  • 已經記錄過的失效仍然重演 — 那一張補的「執行本身有深淺」講的是動作做得多深(不掃、只掃同形、逐項對照),本卡講的是動作作用在多大範圍上。深度與廣度獨立失效,所以收尾清單要分開列。

  • 一次修法會對同一件事寫出兩種形式:正確作用域相反,而兩者不衝突。 本卡說批次清理的收尾要掃成品的全部,因為它問的是存量;那一張的正確作用域恰好就是改動集合,因為它問的是增量的內部一致性。本卡那張兩種作用域對照表裡「改動集合答增量」那一格,它就是具體內容。

  • 代理比本體便宜 — 本卡的改動集合是成品全集的代理,而本卡指出的成因(手邊那份清單在另一個用途上正是對的作用域)是那一張「差價很小」的一個實例:換掉它只要改一個路徑參數。

  • #349 量測的前置步驟決定了分母 — 本卡是那張卡四種前置步驟裡「納入條件」的一個高頻實例:以本次改動的新增字面作為差集基準時,來源從未改過的那些命中在差集下恆為零。那張卡給的是同一機制的其餘三種形態(丟棄規則、抽取單位、步驟順序)與共同的驗證形式(守恆式對帳,而抽樣比對對這一類結構上無效)。

判讀徵兆

  • 掃描指令的路徑參數來自版本控制的改動清單,或是手打的那幾個剛動過的檔。
  • 收尾報告寫「命中歸零」而沒有寫掃了哪些路徑。
  • 修法的敘述寫成「整批處理了 N 處」,而 N 的分母說不出來。
  • 這一輪的改動是拆分、搬移或新建檔,所以「改過的檔」這個集合看起來就是全部。