字句層 review:keyword bank 命中是候選、不是判決
核心原則
字句層 review 有兩個獨立步驟:偵測(這句有沒有命中可疑訊號)跟判定(這個命中是不是違規)。keyword bank 解的是偵測、判定仍是一個獨立的語意認知步驟。 reviewer 拿到 grep 命中後、傾向把它合理化成「這個 case 可以接受」而放行 — 偵測成功、判定失敗、違規一樣留在稿件裡。
| 步驟 | 工具 | 失敗模式 |
|---|---|---|
| 偵測 | grep keyword bank(#114) | 關鍵詞不在 bank 裡 → 漏命中(coverage gap) |
| 判定 | reviewer 語意判斷 | 命中了、但被合理化成「可接受對照」→ 放行(judgment gap) |
#114 把字句層 review 的失敗歸到偵測層(沒 keyword bank、靠記憶 sweep)。本卡補它沒覆蓋的另一層:就算 grep 命中、reviewer 仍可能判錯。命中只是候選、不是判決。
情境
寫作規範「正向陳述優先」(主要敘述用正向句建立概念、反例只做對照)的 review、跑 grep 不[行可是要能]|無法|沒[做有]|而非|而不是。這個 bank 會命中兩類完全不同的句子:
- 建立概念的否定:「高階函式不是『用了比較高級』、而是特定場景的自然解」 — 用否定當核心概念的開場、違反正向陳述。
- 反例對照的否定:「對照反例:假設一個只有單一布林設定的 controller…既沒有共用流程、也沒有開放的變化點」 — 在明示的反例段落裡、否定是對照本身、規範允許。
兩者 grep 命中長得一樣、語意角色相反。reviewer 掃命中清單時、若用「這裡有對照意味、應該算反例」的寬鬆預設、會把第一類也放行 —— 這正是本卡的 case:grep 命中了「不是…而是」、被判成「正向對照修辭、OK」、由讀者再次 feedback 才 catch。
另有一類問題連命中都沒有:訴諸群體的安撫贅語(「很多人卡在…」「大家都會搞混…」)。這類句子沒有固定關鍵詞(「很多人 / 大家 / 不少開發者 / 初學時」表面形式發散)、keyword bank 結構上抓不到、只能靠語意 pass。
理想做法
否定句構命中後、用「概念位置」判定、不用「有沒有對照意味」判定
判別問題從「這句有對照意味嗎」(太寬、幾乎都 yes)換成 「這個否定在建立核心概念、還是在明示的反例段落裡做對照」:
| 命中位置 | 判定 | 修法 |
|---|---|---|
| 段首 / 小節開場 / 核心議題句 | 違規 — 用否定建立概念 | 直接陳述「B 是什麼」、把對 A 的否定整個拿掉 |
| 明示的「反例 / 對照 / 不適合場景」段落內 | 保留 — 否定是對照本體 | 不動(規範允許、見 #94) |
| 用對比定義術語(「裸寫 = 略過取名」) | 保留 — 否定是定義的本質 | 不動 |
關鍵修法是正向直述 B:「X 不是 A、而是 B」→「X 是 B」、把 A 的排除留給上下文或反例段。把「不是 A」翻成「而非 A」只是換個負向詞、仍違規。
這條判定準則剛好夾在兩張既有卡之間:#94 警告「別過度刪對照(刪掉承擔 reasoning 的 Y 會讓結論空降)」、正向陳述優先要求「別保留建立概念的否定」。判別線就是上表的「概念位置」—— 概念開場的否定該刪、反例段落的對照該留。
沒有關鍵詞的贅語、靠 reader-simulation 補
訴諸群體的安撫贅語抓不到固定關鍵詞、改用「換視角」pass:假裝讀者、問每一句「這句給了新資訊、還是只在安撫我(讓我覺得不是只有自己不會)」。教學文的責任是把概念講清楚、不是安撫讀者情緒 —— 安撫句一律刪、保留有教學價值的聚焦(「要分清什麼」)。
沒這樣做的麻煩
規範掃描器顯示「乾淨」、違規仍在
跑完 grep、把命中逐條判成「可接受」、回報「字句層 clean」 —— 這個 clean 是 judgment 放水的結果、不是真的沒違規。比「沒跑 grep」更危險:沒跑還知道沒查、跑完誤判會產生「已經查過」的虛假信心。
違規類型有系統性偏移
被合理化放行的是特定一類(建立概念的否定句構),有系統性偏移。同一個寬鬆預設會在每篇文章放行同一類違規 —— 跨稿件累積成 systematic miss、跟 #114 的偵測層 systematic miss 同構、只是發生在判定層。
keyword bank 越長、judgment 放水越隱形
bank 補得越完整、命中越多、reviewer 越依賴「快速掃過命中清單」、每條停留判定的時間越短、越容易用寬鬆預設批次放行。偵測能力提升反而稀釋判定品質 —— 兩層要分開要求、不能假設「有 bank 就會判對」。
跟其他抽象層原則的關係
- #114 Multi-pass review 的 frame 顆粒度盲點:#114 解偵測層(把規則展開成 keyword bank、不靠記憶 sweep)。本卡是它的下一層 —— 就算 bank 命中、判定仍可能放水。#114 的 keyword bank 範例已收「不是 A 而是 B」、但收進 bank 只保證命中、不保證判對;本卡補「命中後怎麼判」。訴諸群體贅語則是 #114 bank 該補的新 coverage(無固定關鍵詞、靠 reader-simulation)。
- #94 正向改寫要保留對照論據、不能空降結論:#94 跟本卡是同一判定軸的兩極。#94 防「過度刪 —— 刪掉承擔 reasoning 的對照 Y、結論變空降」;本卡防「過度留 —— 保留建立概念的否定、用『這是對照』當藉口」。兩卡合起來才是完整判定準則:以「概念位置」區分該刪(概念開場)還是該留(反例段落 / reasoning 對照)。
- #147 規範化跟自審是兩種認知任務:#147 講「立了規範 ≠ 能在自己稿件辨識實例」。本卡是更細一層 —— 連 grep 命中(自審的最強形式、已經指到具體句子)都可能因判定放水而失效。#147 的三層機制(grep / checklist / reviewer in-stream)裡、本卡聚焦 grep 那層的「命中之後」缺口。
- #82 字面攔截 vs 行為精修:grep 命中是字面層攔截、看不到那個否定承擔的是「建立概念」還是「反例對照」 —— 需要 behavioral pass(讀者讀到這句、是拿到正向概念還是被否定句卡住)才能判。本卡是 #82 在「字句層 review 判定」的具體實例。
判讀徵兆
| 徵兆 | 該做的行動 |
|---|---|
| grep 命中清單掃過、大半判「可接受對照」 | 停 —— 寬鬆預設正在放水、逐條改用「概念位置」判定 |
| 命中的否定句在段首 / 小節開場 / 核心議題句 | 違規 —— 改正向直述、別翻成「而非」 |
| 把「不是 A 而是 B」改成「而非 A」就收工 | 沒修 —— 只是換個負向詞、仍是否定建立概念 |
| 回報「字句層 clean」但只跑了 grep、沒做語意 pass | clean 可能是判定放水 —— 補 reader-simulation 一輪 |
| 句子在安撫讀者(「很多人 / 大家都會」)卻無關鍵詞命中 | keyword bank 抓不到 —— 靠「這句給新資訊還是安撫」語意問句刪 |
適用範圍與邊界
- 適用:正向陳述優先這類「同一訊號命中、語意角色相反」的字句層規範 review;AI 輔助寫作的 self-review(最容易在判定層放水);keyword bank 已建立、但 review 回報品質仍不穩的情境。
- 不適用:偵測本身就漏(關鍵詞不在 bank)的問題 —— 那是 #114 的偵測層、先補 bank 再談判定。
- 邊界:判定收緊 ≠ 一律刪否定。明示反例段落的對照(#94 的 reasoning Y)該留;判別線是「概念位置」、不是「有沒有否定詞」。收太緊會退回 #94 警告的「空降斷言」。
Self-case:本卡的觸發來源
本卡觸發於 review 為什麼這個場景適合用高階函式 時。流程是先跑 3 個 frame 的 multi-round review + 字句層 grep keyword bank:
- grep 命中了核心議題句「高階函式不是『用了比較高級』、而是特定場景的自然解」跟小節開場「不是『能用就用』、而是…三個特徵」。
- 我把這些命中判成「正向對照修辭、OK」、回報「字句層大致乾淨」。
- 讀者 feedback 指出這仍違反正向陳述 —— 偵測成功、判定失敗。
- 修正後讀者再指出「很多人卡在…」是訴諸群體的安撫贅語 —— 這類連 grep 都沒命中(無固定關鍵詞)。
對應本卡:keyword bank 命中是候選、不是判決。第一類(命中誤判)揭露判定層盲點、第二類(無命中)揭露 coverage 仍需 reader-simulation 補。兩者共同說明:字句層 review 的偵測(grep)跟判定(語意)是兩個步驟、不能假設「跑了 bank 就會判對、就會抓全」。