入口由違規形態寫不寫得成 pattern 決定,佔比只決定能不能原樣進清單
論述基礎與限制
本卡的觀察來自一次全站用詞清理。#234 的物理化錯配有一組 grep 清單(撐 / 掛 / 扛 / 垮 / 頂 / 咬 / 啃),寫作規範把它操作化時標成三種錯配裡「唯一有穩定關鍵詞可掃的」一種。照清單掃完並修完 68 處之後,另一個人在同一批內容裡指出兩處清單完全沒碰到的錯配:把失敗說成「滑進去」「另一條滑坡」,以及用「拿到的是」承接讀書得到的理解。兩處照 #234 的判斷標準都成立——滑需要斜坡、拿需要手,而失敗與理解兩樣都沒有。
限制:本卡不談用詞錯配的判斷標準(那是 #234,而這次的兩個實例證明那個判斷標準是對的),只談偵測。兩個實例都是中文,但「一個詞該用哪一種入口」這條判斷標準跟語言無關——它問的是一個詞的違規義項佔它全部用法多少,任何語言都算得出來;下面兩個探針則各自綁在中文的句構與詞義上,換語言要重新設計。
入選標準跟下面兩個探針的可信度不在同一級。前者由「噪音蓋掉訊號、蓋掉之後維護者會把整條拿掉」這個機制支持;後者只有一個量測過(滑)、另一個沒有(拿),而且都沒有換一批內容驗過。修法段裡標著「候選訊號」的那一條,標的就是這個差別。
核心原則
入口由兩件事決定:違規義項佔它全部用法多少,以及那個違規形態寫不寫得成 pattern。 佔比只決定「原樣進清單」這一個選項可不可行,其餘的入口由形態決定;兩者都不決定這個詞要不要被涵蓋。清單是判斷標準的一次抽樣,不是判斷標準本身——抽到的是那些「幾乎只在違規時才出現」的詞;違規義項只佔少數的詞違規可以同樣嚴重,差別在原樣加進清單會用噪音蓋掉訊號。
入口有四種,前三種成本遞增:原樣進清單(違規義項佔多數)、收窄 pattern 或加豁免子句(違規義項少、而違規形態穩定到寫得出來)、改用探針(違規形態不穩定,沒有可寫成 regex 的外形)。還有兩種不在這條成本線上:排一輪限定 scope 的 review(例如「這批新寫的、從外語文獻讀來的概念詞」),它是探針缺的那個偵測入口;以及承認沒有可行的入口——形態不穩定、佔比又低到連探針都設計不出來時,寫下「這一類目前只能靠讀的人自己注意」,比擺一個抓不到的 pattern 誠實,姊妹卡 #266 對「補不出錨的維度」做的是同一個處理。這份清單本身也是抽樣。而抽樣宣告要下到清單所在的那一層,不只下到清單裡的詞。 一份文件可以在每個清單旁邊都寫「以下為抽樣」,同時讓「有哪些類別」這一層讀起來完整——實例是一份規範摘錄了五類 keyword bank、而權威來源另有七類不在那裡,五類各自標了抽樣,類別的集合沒有標。後果比漏抓嚴重:漏抓還有機會被別的路徑撞見,而一份讀起來完整的類別清單會主動關掉「是不是還有別類」這個問題。判斷標準是問「這份東西跑完之後,還有人會去查它沒涵蓋的部分嗎」——答否時,邊界要寫在使用點上,並且大致說出外面有什麼。本站三種都在用:物理化清單收了「撐 / 咬 / 頂」這些違規義項佔比極低的詞,靠一句豁免處理(主詞是實體或系統負載時不觸發);「滑坡」收窄成 另一條滑坡|滑進 就抓得到;而「拿」的違規形態描述得出來(「⋯⋯的是」後面接一個完整斷言)卻寫不成 pattern,因為「完整斷言」不是 regex 判得出來的東西——這種只剩探針。
因此漏抓一個詞之後,先算比例、再看形態、然後選入口——既不是直接加進 regex,也不是一律改探針。兩個實例各自示範原樣加進去為什麼行不通:
- 本義合法:「滑坡」在中文的本義是山崩,另有漢語固有的衰退引申義(經濟滑坡、成績滑坡),而「下滑」「滑落」「滑向某個狀態」都是正常用法(毛利下滑、成績逐級滑落、語氣滑向抱怨)。違規的只有從英文 slippery slope 借來的那個義項——把一個失敗當成可以滑進去的地方、當成可數的路徑。全站掃「滑」得到兩百多處,絕大多數是滑鼠、下滑、滑動、滑向、滑落這些正常用法(精確數字這裡不寫:量測範圍含這一頁,而寫下數字的動作會改變它——這正是本卡姊妹卡在講的量測對象問題)。違規集中在
滑坡|滑進這一小群,本批修掉五處:兩處把失敗說成滑進去、兩處把倒閉說成滑進去、一個段標把風險命名成滑坡。 - 詞頻過高:「拿」在技術寫作裡到處都是(拿到的需求、拿去用、拿它對照自己的處境),這些全部合規。違規的只有拿一個物理取得動詞去承接認知關係那一種。這一個的佔比沒有量測過——本卡修法 2 要求算,而寫卡當下沒有算。
原樣加進清單之後,噪音會蓋掉訊號,而下一步多半是有人把它們整條拿掉。那個動作實際會走成:加進去的當下沒有人反對,理由是涵蓋要完整;幾輪之後每次掃描回來幾百行而真違規只有個位數,於是有人刪掉那幾個詞,commit 訊息寫的是移除誤報率過高的規則。沒有被發現的是同一個動作也移除了規則對那一類的涵蓋——刪的人看的是命中率,而涵蓋範圍寫在規則正文、不在清單旁邊。收窄 pattern 與豁免子句存在的理由就是避開這個結局。
反模式
這一類問題出現在規則由少數人維護、而執行入口是一條 grep 的體系:規則正文寫的是判斷標準,pre-commit 或 CI 跑的是清單,兩者的涵蓋範圍不同而沒有人比對過——判斷標準寫得越好,落差越大。執行入口若是人工或 agent review,判斷標準可以直接被執行,「清單 vs 探針」這個分工就不是問題。
把清單的涵蓋當成規則的涵蓋。 「物理化是唯一有穩定關鍵詞可掃的一種」這句標註在被讀的時候會變成「掃完清單就掃完這一類」。實測是掃完清單、修完 68 處(該次全站 716 個關鍵詞命中行,修正後降到 651)、跑完全站驗證都乾淨之後,同一批內容裡仍有兩類完整的違規在。零命中是「清單沒抓到」,不是「沒有違規」。
用清單的命中數判斷這一類清乾淨了。 68 這個數字讀起來像一次徹底的清理,而它量的是清單的產能,不是這一類違規的總量。這跟 #266 的失效同源,只是那裡的關鍵詞當分子、這裡當偵測入口。
依賴外部指正當唯一的補漏機制。 這兩處都是使用者在旁邊看到的,不是任何 review frame 抓到的——語言的容錯讓作者自己讀不出來(「滑進去的失敗」「拿到的是理解」通順、意思也到得了)。外部眼睛有效,但它排不進行程表,把它當唯一機制等於把偵測交給運氣。反向的實例也有一個:既有義項探針寫進規則之後,第三處違規(一張方法論卡的段標「模板化滑坡」)是那條探針自己抓到的,不必再等人指出。
修法
- 判斷標準與清單分開寫,並標明清單是抽樣。 規則的正文寫可執行的判斷標準(「問這個動詞照字面成立需要什麼物理條件」),清單另起一段標成「目前抽到的高密度詞」。兩者混在一起時,讀規則的人會停在清單。
- 新詞進清單前先算違規比例、再看形態,然後選入口。 全站掃一次那個詞,數違規佔多少。比例高就原樣進清單;比例低而違規形態寫得成 pattern,收窄 pattern 或加一句豁免(清單裡的「撐 / 咬 / 頂」就是這樣留住的);形態描述得出來卻寫不成 pattern,才輪到探針;連形態都不穩定的,剩下的是排一輪限定 scope 的 review 或明說沒有入口。第三個實例是「承載 / 載體」——它照 #234 的判斷標準成立(承載要有重量與支承面,而「即時反應」「功能」都沒有),佔比低而形態穩定,屬於收窄 pattern 那一格;它出現在寫下本卡的同一批稿子裡,而清單抓不到。跳過計數直接選入口是這一步最常被省掉的部分。
- 補語型態探針(抓泛用動詞頂替具體關係、中文):「⋯⋯的是」後面接一個完整斷言時,前面那個動詞值得回頭看——精準的認知動詞(學到 / 看出 / 意識到)容得下子句,而物理取得動詞(拿到 / 抓到)接上去會讀不順。實測那句「拿到的是自己的哪些反應正在製造沉默」同時犯用詞與語法兩項,而語法那一項是接不下去、因此看得見的。這一條目前是候選訊號而不是已驗證的探針:只有一個實例,沒有掃過全站的真陽性率,也沒有跨批驗證——照上一條的要求,它自己還沒過那一關。
- 既有義項探針(抓外語隱喻直譯、中文):把那個詞在本語言的全部既有義項列出來(本義與固有的引申義都算),再問句子用的是哪一個。滑坡的本義是山崩這個地質事件、固有引申義是衰退(經濟滑坡、成績滑坡),兩者都不容許「另一條滑坡」這種把它當成可數路徑的用法——那個用法只在英文 slippery slope 裡成立。只列本義會誤判:漏掉衰退這個引申義的話,「成績滑坡」會被判成違規。詞典查得到不等於這個用法成立,這個探針要抓的正是那個落差。它沒有偵測入口——這是判定程序,要先有人懷疑某個詞才跑得起來。懷疑有兩個現成的來源,都排得進行程:讀的時候卡了一下卻指不出哪裡怪,以及某個概念本來從英文文獻讀來、這是第一次用中文寫它。這兩個時刻各跑一次既有義項清單,比等一張已知外語隱喻詞的清單被建出來早得多。
- 換詞時同義詞要分散。 一個泛用動詞換掉之後,替代詞要按語境各自選(拿到 → 學到 / 讀出來 / 掌握 / 得到的教訓),不要一律換成同一個——一律替換會用新模具換掉舊模具,理由見 #122。
跟其他原則的關係
#296 同一個 session 派出的 reviewer 共用它的盲區 補的是本卡沒有處理的一半。本卡回答「漏抓了要擴充清單還是換偵測方式」,而那張卡指出即使換成判斷標準逐句掃,同源的人套用同一個判斷標準在自己的文字上仍會通過——實例是一個可機械執行的判斷標準(問這個動詞照字面成立需要什麼物理條件),寫的人套在自己的小節標題上判定通過、另一個來源套同一個標準當場判定不通過。換偵測方式解決不了換來源才能解決的事。
| 原則 | 關係 |
|---|---|
| #234 描述抽象概念要用貼合屬性的謂語 | 直接的上游,本卡只動它的偵測層。這次兩個實例照 #234 的判斷標準都成立,證明判斷標準沒問題;被推翻的是操作化時加上的那句「物理化是唯一有穩定關鍵詞可掃的」——可掃的是清單裡那幾個詞,不是這一類 |
| #203 避免濫用泛用詞 | 姊妹但軸不同——#203 的訊號是密度(同一個泛用詞反覆出現,把不同情境壓成同一個標籤;它的清單同時含名詞與動詞),本卡的訊號是單次出現時謂語與賓語的關係對不上。「拿到的是理解」只出現一次也是錯的 |
| #266 可核對的錨要選會下降的量 | 同源的另一半——#266 講關鍵詞不能當覆蓋率的分子(漏數判定),本卡講關鍵詞不能當違規涵蓋的全部入口(漏抓違規)。兩者的共同根因是關鍵詞量的是措辭 |
| #149 keyword bank 命中是候選不是判決 | 對稱的另一邊——#149 處理偽陽性(命中要再判定),本卡處理偽陰性(沒命中不表示沒有)。兩張合起來說明關鍵詞只適合當入口的一部分,兩端都要有別的機制接 |
| #165 register 違規:偵測可機械化、判定要靠文體異源的眼睛 | 同型的作者盲區——#165 的作者讀不出自己的語域,本卡的作者讀不出自己的謂語,共同機制是語言容得下、通順度不下降。差別在 #165 靠異源的眼睛,本卡想把那雙眼睛的一部分換成可排程的探針,目前只做到一半:兩個探針裡只有補語型態那個有偵測入口,而它自己還沒量測過真陽性率 |
| #278 機械約束買到被量測的那個數字 | 同一個機制在程式碼度量上——可機械偵測的形態是違規集合的一個投影,而達成投影上的合規比達成實質合規便宜 |
| #282 規則要指到一個打得開的東西 | 相鄰而不同層——本卡管一個清單收哪些成員,#282 管規則有沒有指到那個清單;一份規則可以在指得到清單的前提下,清單本身仍然收錯成員 |
| #289 一個詞是不是通用術語,用多份獨立定義的收斂度量 | 本卡的上游供料端。探針產出的新候選要先過本卡的入選判斷才進清單——同一次量測抓出「站得住」與「站穩」,前者進了(技術寫作裡幾乎沒有字面義)、後者沒進(攻擊鏈階段名、「」內引用、就地展開的類比佔多數) |
| #304 探針回報的信心與它的準確度是兩個量 | 兩張卡都在講一個便宜的訊號會蓋住它抓不到的那一類,差別在本卡是 grep 的命中、那張是探針的自評。 |
#288 關鍵詞清單換一個體裁就失準 限定本卡入選標準的適用邊界:違規義項的佔比是在某個體裁上算的。「前一本 / 下一本」在論述型內容裡幾乎不出現,因此永遠不會被本卡的判斷標準抽中;而在書單那種以「一篇裡的一組成員」為結構單位的內容裡,它是位置指涉這一類的主流違規形態。本卡說清單是判斷標準的一次抽樣,那張卡補的是抽樣的母體——換體裁時佔比高的詞會整組更換,而 pattern 仍然回傳大量命中,於是缺口不產生訊號。
#295 查不到的反證要換一個維度 是同一個上限在查證方向上的形態:這裡漏掉的是寫不成 pattern 的違規詞,那裡漏掉的是想不到的查詢詞,兩邊都是用已知的形態去找未知的東西。
#298 finding 清單列的是抽樣位置 把本卡「清單是抽樣、不是那一類的全部」推到審查報告上。兩者是同一個結構,而審查報告更容易被讀成窮舉——它逐條寫了位置、原文摘引與嚴重度,那個格式本身在暗示完整性,於是照著清單逐處修完就被當成這一類處理完了。
判讀徵兆
| 訊號 | 該做的事 |
|---|---|
| 某條用詞規則的漏抓實例持續從外部指正進來 | 不要先擴充清單;先算那些詞的違規比例,低的改做探針 |
| 一個詞有既有義項、而句子用的是外語搭配裡的那個 | 既有義項探針命中;本義與固有引申義都列出來,再問句子用的是哪一個 |
| 「⋯⋯的是」後面接的是完整斷言而不是名詞組 | 前面那個動詞多半選錯;換成容得下子句的認知動詞 |
| 掃完清單、全站零命中,而規則涵蓋的範圍描述得比清單廣 | 零命中只證明清單沒抓到;規則正文與清單要分開寫,並標明清單是抽樣 |
| 想把一個高頻常用詞加進 grep 清單 | 先掃一次數違規佔比;佔比低就會用噪音蓋掉訊號,且下一個維護者會把它整個拿掉 |
| 換掉一個泛用動詞時所有位置都換成同一個替代詞 | 那是用新模具換舊模具;替代詞按語境各自選 |