<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Review-Process on Tarragon</title><link>https://tarrragon.github.io/blog/tags/review-process/</link><description>Recent content in Review-Process on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 26 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/review-process/index.xml" rel="self" type="application/rss+xml"/><item><title>Multi-pass review 的 frame 顆粒度盲點：抽象規則 → 具體訊號的轉譯不完整</title><link>https://tarrragon.github.io/blog/report/multi-pass-review-frame-granularity-blindspot/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/multi-pass-review-frame-granularity-blindspot/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡的論述基於 &lt;strong>1 個 case&lt;/strong>（&lt;a href="../../work-log/dart_stream_controller_single_vs_broadcast/">dart Stream 事故&lt;/a> 的 review 過程跑 4 輪後仍漏 catch 4 類字句層問題）抽出來的假說。具體限制：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>樣本量極小&lt;/strong>：「multi-pass review framework 顆粒度盲點」這個結論基於 1 次 review、不是多次跨主題 review 觀察到的 systematic pattern。可能是這個 reviewer（我）有特定盲點、不是 framework 本身的問題&lt;/li>
&lt;li>&lt;strong>三機制有效性未驗證&lt;/strong>：keyword bank / reader simulation / self-criticism 三機制是 proposed mechanisms、未實際跑下一篇文章驗證能 catch 之前漏掉的問題類型&lt;/li>
&lt;li>&lt;strong>「reader simulation 由同 reviewer 執行」的根本質疑沒解決&lt;/strong>：拿掉 code block 重讀、聽起來合理、但同一個人是否真能模擬「沒看過 code 的讀者視角」是疑問——記憶不會因為 code block 隱藏而消失。本卡提的修法是 partial fix、不是 root cause solution&lt;/li>
&lt;li>&lt;strong>「同一 reviewer 跑多輪 catch 高度相同」是直覺論述&lt;/strong>：沒有實證、是直覺推論&lt;/li>
&lt;li>&lt;strong>跟其他卡互相 cross-link 形成迴圈論證&lt;/strong>：本卡引 #110 / #111 / #113、但這幾張卡都源自同次事件、互相驗證有 selection bias 風險&lt;/li>
&lt;/ul>
&lt;p>讀者使用本卡時、把它當「&lt;strong>從一次 review 失誤抽出的盲點假說&lt;/strong>」、不當「驗證過的 review framework 升級方案」。三機制是 starting point、有效性需要後續案例累積驗證。&lt;/p>
&lt;hr>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>Multi-pass review 用「規則 frame」掃描、有效抓「結構性違反」（規則順序、論述結構、邊界段缺失）、但&lt;strong>這次 case 顯示對「字句層的具體訊號」覆蓋不足&lt;/strong>——同個規則底下有大量具體訊號、reviewer 用記憶 sweep 容易漏掉一部分（這次 1 個 case 觀察、是否 systematic 有待累積）。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>缺口類型&lt;/th>
 &lt;th>Multi-pass 用「規則 frame」能抓&lt;/th>
 &lt;th>Multi-pass 用「規則 frame」抓不到&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>結構性違反&lt;/td>
 &lt;td>段落順序、論述結構、邊界段缺失&lt;/td>
 &lt;td>—&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>規則對齊&lt;/td>
 &lt;td>「應該 / 必須」絕對主義（明顯）&lt;/td>
 &lt;td>「碰巧 / 撞牆 / 一輩子」口語修辭（同樣違反但不明顯）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>用詞精度&lt;/td>
 &lt;td>術語原文錨點（contract / 領域先驗）&lt;/td>
 &lt;td>地區漂移（屏 / 螢幕、默認 / 預設）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>論述自包含性&lt;/td>
 &lt;td>H2 後加商業邏輯導引&lt;/td>
 &lt;td>段落內依賴 code（「payload 第二段」）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>句型結構&lt;/td>
 &lt;td>反例段落補正向錨點（明顯）&lt;/td>
 &lt;td>「不是 A 而是 B」結構（隱性違反）+ 廢話前綴 wrapper&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵差異是「規則理解」vs「具體訊號比對」：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>規則理解&lt;/strong>：reviewer 知道「正向陳述優先」這條規則&lt;/li>
&lt;li>&lt;strong>具體訊號比對&lt;/strong>：reviewer 要逐句檢查所有可能違反該規則的具體句型&lt;/li>
&lt;/ul>
&lt;p>抽象規則 → 具體訊號的轉譯沒做完整、就會 systematic miss 一整類字句層問題。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼規則-frame抓不到字句層問題">為什麼「規則 frame」抓不到字句層問題&lt;/h2>
&lt;h3 id="問題-1抽象規則沒展開成具體訊號清單">問題 1：抽象規則沒展開成具體訊號清單&lt;/h3>
&lt;p>每條規則有大量可能的違反句型——例如「規則五：最重要的話優先說」可能違反句型：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>違反句型&lt;/th>
 &lt;th>具體案例&lt;/th>
 &lt;th>在哪裡常見&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>廢話前綴 / wrapper&lt;/td>
 &lt;td>「下次看到 X 時、做 Y」&lt;/td>
 &lt;td>結尾段、heuristic 段&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>觀察先 / 定義後&lt;/td>
 &lt;td>「實務上常看到：[code]」&lt;/td>
 &lt;td>起點段&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>否定先 / 肯定後&lt;/td>
 &lt;td>「不要先想 A、先想 B」&lt;/td>
 &lt;td>除錯思維、check list&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>條件先 / 結論後&lt;/td>
 &lt;td>「在 X、Y、Z 條件下、結論是 W」&lt;/td>
 &lt;td>推導段&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>修飾先 / 主詞後&lt;/td>
 &lt;td>「考慮所有可能後、做 X」&lt;/td>
 &lt;td>提案段&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>reviewer 用「規則五」這個 frame 掃描、靠記憶找「這段有沒有違反規則五」——多半只 catch「觀察先 / 定義後」這個明顯 case、漏 catch 廢話前綴跟否定先行。&lt;/p></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡的論述基於 <strong>1 個 case</strong>（<a href="../../work-log/dart_stream_controller_single_vs_broadcast/">dart Stream 事故</a> 的 review 過程跑 4 輪後仍漏 catch 4 類字句層問題）抽出來的假說。具體限制：</p>
<ul>
<li><strong>樣本量極小</strong>：「multi-pass review framework 顆粒度盲點」這個結論基於 1 次 review、不是多次跨主題 review 觀察到的 systematic pattern。可能是這個 reviewer（我）有特定盲點、不是 framework 本身的問題</li>
<li><strong>三機制有效性未驗證</strong>：keyword bank / reader simulation / self-criticism 三機制是 proposed mechanisms、未實際跑下一篇文章驗證能 catch 之前漏掉的問題類型</li>
<li><strong>「reader simulation 由同 reviewer 執行」的根本質疑沒解決</strong>：拿掉 code block 重讀、聽起來合理、但同一個人是否真能模擬「沒看過 code 的讀者視角」是疑問——記憶不會因為 code block 隱藏而消失。本卡提的修法是 partial fix、不是 root cause solution</li>
<li><strong>「同一 reviewer 跑多輪 catch 高度相同」是直覺論述</strong>：沒有實證、是直覺推論</li>
<li><strong>跟其他卡互相 cross-link 形成迴圈論證</strong>：本卡引 #110 / #111 / #113、但這幾張卡都源自同次事件、互相驗證有 selection bias 風險</li>
</ul>
<p>讀者使用本卡時、把它當「<strong>從一次 review 失誤抽出的盲點假說</strong>」、不當「驗證過的 review framework 升級方案」。三機制是 starting point、有效性需要後續案例累積驗證。</p>
<hr>
<h2 id="核心原則">核心原則</h2>
<p>Multi-pass review 用「規則 frame」掃描、有效抓「結構性違反」（規則順序、論述結構、邊界段缺失）、但<strong>這次 case 顯示對「字句層的具體訊號」覆蓋不足</strong>——同個規則底下有大量具體訊號、reviewer 用記憶 sweep 容易漏掉一部分（這次 1 個 case 觀察、是否 systematic 有待累積）。</p>
<table>
  <thead>
      <tr>
          <th>缺口類型</th>
          <th>Multi-pass 用「規則 frame」能抓</th>
          <th>Multi-pass 用「規則 frame」抓不到</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>結構性違反</td>
          <td>段落順序、論述結構、邊界段缺失</td>
          <td>—</td>
      </tr>
      <tr>
          <td>規則對齊</td>
          <td>「應該 / 必須」絕對主義（明顯）</td>
          <td>「碰巧 / 撞牆 / 一輩子」口語修辭（同樣違反但不明顯）</td>
      </tr>
      <tr>
          <td>用詞精度</td>
          <td>術語原文錨點（contract / 領域先驗）</td>
          <td>地區漂移（屏 / 螢幕、默認 / 預設）</td>
      </tr>
      <tr>
          <td>論述自包含性</td>
          <td>H2 後加商業邏輯導引</td>
          <td>段落內依賴 code（「payload 第二段」）</td>
      </tr>
      <tr>
          <td>句型結構</td>
          <td>反例段落補正向錨點（明顯）</td>
          <td>「不是 A 而是 B」結構（隱性違反）+ 廢話前綴 wrapper</td>
      </tr>
  </tbody>
</table>
<p>關鍵差異是「規則理解」vs「具體訊號比對」：</p>
<ul>
<li><strong>規則理解</strong>：reviewer 知道「正向陳述優先」這條規則</li>
<li><strong>具體訊號比對</strong>：reviewer 要逐句檢查所有可能違反該規則的具體句型</li>
</ul>
<p>抽象規則 → 具體訊號的轉譯沒做完整、就會 systematic miss 一整類字句層問題。</p>
<hr>
<h2 id="為什麼規則-frame抓不到字句層問題">為什麼「規則 frame」抓不到字句層問題</h2>
<h3 id="問題-1抽象規則沒展開成具體訊號清單">問題 1：抽象規則沒展開成具體訊號清單</h3>
<p>每條規則有大量可能的違反句型——例如「規則五：最重要的話優先說」可能違反句型：</p>
<table>
  <thead>
      <tr>
          <th>違反句型</th>
          <th>具體案例</th>
          <th>在哪裡常見</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>廢話前綴 / wrapper</td>
          <td>「下次看到 X 時、做 Y」</td>
          <td>結尾段、heuristic 段</td>
      </tr>
      <tr>
          <td>觀察先 / 定義後</td>
          <td>「實務上常看到：[code]」</td>
          <td>起點段</td>
      </tr>
      <tr>
          <td>否定先 / 肯定後</td>
          <td>「不要先想 A、先想 B」</td>
          <td>除錯思維、check list</td>
      </tr>
      <tr>
          <td>條件先 / 結論後</td>
          <td>「在 X、Y、Z 條件下、結論是 W」</td>
          <td>推導段</td>
      </tr>
      <tr>
          <td>修飾先 / 主詞後</td>
          <td>「考慮所有可能後、做 X」</td>
          <td>提案段</td>
      </tr>
  </tbody>
</table>
<p>reviewer 用「規則五」這個 frame 掃描、靠記憶找「這段有沒有違反規則五」——多半只 catch「觀察先 / 定義後」這個明顯 case、漏 catch 廢話前綴跟否定先行。</p>
<h3 id="問題-2缺乏-grep-keyword-bank">問題 2：缺乏 grep keyword bank</h3>
<p>字句層問題有大量可 grep 的具體詞——但 reviewer 沒有 keyword bank、靠肉眼掃。例如：</p>
<table>
  <thead>
      <tr>
          <th>規則類別</th>
          <th>可 grep 的具體詞</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>口語修辭</td>
          <td>一輩子 / 永遠 / 碰巧 / 剛好 / 撞牆 / 炸 / 鎖死 / 啊原來</td>
      </tr>
      <tr>
          <td>廢話前綴</td>
          <td>下次看到 / 下次寫 / 下次面對 / 下次遇到 / 之後再</td>
      </tr>
      <tr>
          <td>否定先行</td>
          <td>不要先 / 不是 A 而是 B / 不該 / 不能</td>
      </tr>
      <tr>
          <td>地區漂移</td>
          <td>屏 / 默認 / 質量 / 視頻 / 文件（當 file 用）</td>
      </tr>
      <tr>
          <td>依賴 code</td>
          <td>那個 / 這個 / 剛才的 / 上面的 / 第 X 段 / 就好 / 就能</td>
      </tr>
  </tbody>
</table>
<p>每輪 review 用 grep 比對固定 keyword list、不靠 reviewer 記憶——能消除「靠記憶找違規」的 systematic miss。</p>
<h3 id="問題-3reviewer-自我審查的視角盲點">問題 3：reviewer 自我審查的視角盲點</h3>
<p>reviewer 讀自己寫的東西、會自動 fill in 上下文、感受不到讀者的真實閱讀體驗。例如：</p>
<ul>
<li>「事件 payload 第二段帶了 X」——reviewer 寫的時候腦中有 code、知道「第二段」是什麼、感覺通順</li>
<li>讀者讀的時候沒有 code 在腦中、「第二段」是空的 reference、卡住</li>
</ul>
<p>這個視角差異是 multi-pass review 的結構性盲點——同一個 reviewer 跑多輪、視角始終是寫作者視角、不是讀者視角。</p>
<h3 id="問題-4multi-pass-缺-self-criticism-輪">問題 4：Multi-pass 缺 self-criticism 輪</h3>
<p>每輪 review 都是 forward checking（這篇對齊規則嗎？）、沒做 backward critique（規則本身在這個情境是否夠細？有沒有 miss 的 frame？）。</p>
<p>如果規則框架本身不夠細、跑再多輪都掃不到 frame 之外的問題。</p>
<hr>
<h2 id="多面向四類-missed-問題的分類">多面向：四類 missed 問題的分類</h2>
<p>這次跑完 4 輪 multi-pass review、漏 catch 的 4 類問題：</p>
<h3 id="miss-類型-1口語修辭規則七--規則五的字句層子場景">Miss 類型 1：口語修辭（規則七 / 規則五的字句層子場景）</h3>
<p>漏 catch 的具體訊號:「一輩子只能 listen 一次」「碰巧能用」「立刻撞牆」「啊原來」「炸了」</p>
<p><strong>為什麼漏</strong>：「規則七：機會成本語氣」掃了「應該/必須/不行」、沒掃「一輩子/碰巧/撞牆」這類修辭詞。修辭詞跟絕對主義詞屬於不同 keyword set、reviewer 沒同時掃。</p>
<p><strong>修法</strong>：建立「口語修辭 keyword bank」、輪 4「術語精度」加掃。</p>
<h3 id="miss-類型-2地區漂移規則四術語的子場景">Miss 類型 2：地區漂移（規則四「術語」的子場景）</h3>
<p>漏 catch 的具體訊號：「副屏」（中國用語、繁中應該用「副螢幕」）</p>
<p><strong>為什麼漏</strong>：輪 4「術語檢查」聚焦在「中文 / 原文錨點」、沒掃「繁中 / 簡中漂移」。reviewer 預設「讀者地區」是台灣、但沒 explicit 用 keyword bank 比對。</p>
<p><strong>修法</strong>：建立「地區用語對齊 keyword bank」（屏 / 默認 / 質量 / 視頻 / 文件 / 函數 / 介面 / 內存）、輪 4 加掃。</p>
<h3 id="miss-類型-3依賴-code-論述規則二商業邏輯先於-case-的延伸">Miss 類型 3：依賴 code 論述（規則二商業邏輯先於 CASE 的延伸）</h3>
<p>漏 catch 的具體訊號：「事件 payload 第二段帶了 X」「就好 / 就能」</p>
<p><strong>為什麼漏</strong>：規則二被理解成「H2 後加商業邏輯導引」、沒延伸到「論述本身不依賴 code」。reviewer 寫的時候腦中有 code、感受不到「依賴 code」的閱讀體驗。</p>
<p><strong>修法</strong>：加「reader simulation」frame——拿掉所有 code block、再讀一次論述、看是否仍能理解。</p>
<h3 id="miss-類型-4廢話前綴--否定先行規則五--規則六的字句層子場景">Miss 類型 4：廢話前綴 + 否定先行（規則五 + 規則六的字句層子場景）</h3>
<p>漏 catch 的具體訊號：「下次看到 X 時、不要先想 Y」這類 hortative 結尾段</p>
<p><strong>為什麼漏</strong>：規則五「最重要的話優先說」被理解成「核心原則先 / 例子後」、沒延伸到「廢話前綴 wrapper 句子」。規則六「正向陳述」被理解成「反例段落補正向錨點」、沒延伸到「『不是 A 而是 B』結構」。</p>
<p><strong>修法</strong>：建立「廢話前綴 + 否定先行 keyword bank」、輪 5 加掃。</p>
<hr>
<h2 id="修補-multi-pass-review-框架的三個機制">修補 multi-pass review 框架的三個機制</h2>
<h3 id="機制-1keyword-bank具體訊號清單">機制 1：Keyword bank（具體訊號清單）</h3>
<p>每條規則展開成可 grep 的 keyword list、每輪 review 用 grep 比對、不靠 reviewer 記憶。</p>
<p>範例 keyword bank（節選）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">口語修辭：
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  一輩子 / 永遠 / 碰巧 / 剛好 / 撞牆 / 炸 / 鎖死 / 啊原來 / 沒事 / 乾淨
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">廢話前綴 / 否定先行：
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  下次看到 / 下次寫 / 下次面對 / 下次遇到 / 不要先 / 不是 X 而是 Y
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">地區漂移（繁中讀者）：
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  屏 / 默認 / 質量 / 視頻 / 文件（當 file）/ 函數 / 接口 / 內存 / 視頻
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">依賴 code 訊號：
</span></span><span class="line"><span class="ln">11</span><span class="cl">  那個 / 這個 / 剛才的 / 上面的 / 第 X 段 / 就好 / 就能 / 就行</span></span></code></pre></div><p>每篇文章 review 時跑這些 grep、把 hit 列出來、決定保留或修補。</p>
<h3 id="機制-2reader-simulation-輪">機制 2：Reader simulation 輪</h3>
<p>加一輪「假設讀者沒有上下文、能不能讀懂這段論述」、嘗試換視角。具體做法：</p>
<ul>
<li><strong>拿掉所有 code block 後重讀</strong>：論述是否 self-contained？</li>
<li><strong>跳到段落中間直接讀</strong>：不依賴前文、能不能 parse？</li>
<li><strong>隨機抽段給陌生讀者讀</strong>：cold-read 能不能拿到關鍵資訊？</li>
</ul>
<p><strong>已知限制</strong>：同一 reviewer 即使拿掉 code block、記憶仍在、無法完全模擬「沒看過 code 的讀者視角」。這個機制是 partial fix——能 catch 部分上下文依賴、但不是 root cause solution。最終解法仍需引入外部讀者反饋（cold-read by 真實讀者）。</p>
<h3 id="機制-3self-criticism-輪">機制 3：Self-criticism 輪</h3>
<p>加一輪「我這份規則本身在這個情境是否夠細、有沒有 miss 的 frame？」、強迫 reviewer 反向審視框架本身。具體 prompt：</p>
<ul>
<li>「我跑的 N 輪、catch 的問題類型有哪些？」</li>
<li>「同個規則底下、還有哪些可能違反句型沒被掃到？」</li>
<li>「如果讀者報告 X 類問題、是哪輪該 catch 但沒 catch？」</li>
<li>「framework 本身是否有 known blind spot？」</li>
</ul>
<p>self-criticism 輪不是「再跑一次規則 frame」、是「<strong>檢視 frame 本身的覆蓋度</strong>」。</p>
<hr>
<h2 id="為什麼這些機制不能被再仔細一輪取代">為什麼這些機制不能被「再仔細一輪」取代</h2>
<h3 id="再仔細一輪的同-frame-盲點">「再仔細一輪」的同 frame 盲點</h3>
<p>reviewer 跑同一個 frame 兩次、catch 的東西<strong>多半</strong>高度相同——因為視角、知識、注意力分配相同。（這是直覺論述、未做受控實驗驗證；但跟「換 frame」的設計動機一致——multi-pass 的核心就是「同 frame 重看 catch 不到新問題」）Multi-pass review 的核心是「每輪換 frame」、不是「同 frame 多跑幾次」。</p>
<p>但<strong>換 frame ≠ 換規則</strong>——reviewer 可能換規則但用同樣的視角、同樣的記憶 sweep、catch 的東西相同。要真正換 frame、需要：</p>
<ul>
<li><strong>換工具</strong>：keyword bank 取代肉眼掃（機制 1）</li>
<li><strong>換視角</strong>：模擬讀者取代 reviewer 視角（機制 2）</li>
<li><strong>換層次</strong>：審視 framework 取代套用 framework（機制 3）</li>
</ul>
<p>三個機制各自處理「同一 reviewer 跑多輪仍 miss」的不同來源。</p>
<h3 id="hindsight-視角的反向印證">Hindsight 視角的反向印證</h3>
<p><a href="../design-flaw-by-current-axes-not-hindsight/">#110 設計檢討用當下三軸論證、不依賴 hindsight</a> 的核心議題是「事後諸葛論述」會混淆「設計缺陷 vs 需求演化」。同樣的 hindsight 風險也存在於 review 流程：</p>
<ul>
<li><strong>Hindsight 視角</strong>：「讀者反饋了 → 補進規則」——把規則當成「事故後補的 patch」</li>
<li><strong>當下三軸視角</strong>：「framework 本身是否夠細到 catch 這類問題？」——把 framework 當成預設工具、用 self-criticism 反向審視</li>
</ul>
<p>兩種視角的差別跟 #110 的差別同骨：前者依賴結局（讀者反饋）、後者用當下框架審視（self-criticism）。</p>
<hr>
<h2 id="識別訊號什麼時候你的-review-framework-不夠細">識別訊號：什麼時候你的 review framework 不夠細</h2>
<h3 id="訊號-1讀者反饋的問題類型在-framework-裡找不到對應-frame">訊號 1：讀者反饋的問題類型在 framework 裡找不到對應 frame</h3>
<p>讀者指出「廢話前綴」問題、reviewer 翻 framework 找對應 frame——找到「規則五最重要的話優先說」、但這條規則沒展開到「廢話前綴」這個具體子場景。</p>
<p>修法：把問題類型加進 framework 的 keyword bank、下次同類問題能被 grep catch。</p>
<h3 id="訊號-2跑了-n-輪相同類型的問題仍重複出現">訊號 2：跑了 N 輪、相同類型的問題仍重複出現</h3>
<p>字句層問題（口語修辭、地區漂移）跑了 4 輪 review 仍漏——表示 framework 沒 catch 這個層次。</p>
<p>修法：加 keyword bank（機制 1）、不靠 reviewer 記憶。</p>
<h3 id="訊號-3reviewer-自我審查感覺通順讀者反映卡住">訊號 3：reviewer 自我審查感覺通順、讀者反映卡住</h3>
<p>「事件 payload 第二段」對 reviewer 通順、對讀者卡住——視角差異。</p>
<p>修法：加 reader simulation 輪（機制 2）。</p>
<h3 id="訊號-4相同-framework-跑不同主題catch-的問題類型差異不大">訊號 4：相同 framework 跑不同主題、catch 的問題類型差異不大</h3>
<p>framework 不會自我批判——跑 100 篇文章、catch 的都是 framework 內的 frame、framework 外的問題永遠看不見。</p>
<p>修法：加 self-criticism 輪（機制 3）、定期審視 framework 本身的覆蓋度。</p>
<hr>
<h2 id="何時不需要這些補強機制">何時不需要這些補強機制</h2>
<p>「multi-pass review 需要 keyword bank + reader simulation + self-criticism」這條原則在 production 教學文章 / 設計檢討文章成立、但有合理例外：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>為什麼不需要</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>短篇 note / 即時更新</td>
          <td>預期讀者群小、不擴散、字句層問題影響有限</td>
      </tr>
      <tr>
          <td>個人筆記</td>
          <td>reviewer = reader、視角差異不存在</td>
      </tr>
      <tr>
          <td>Review framework 已成熟、團隊內化</td>
          <td>keyword bank 已經內化成 reviewer 的反射、不需要 explicit 工具</td>
      </tr>
      <tr>
          <td>Framework 規模太小</td>
          <td>framework 只有 3-5 條規則時、self-criticism 容易出 false positive</td>
      </tr>
  </tbody>
</table>
<p>判讀：寫之前自問「這篇文章的讀者群有多大？字句層問題擴散的代價有多高？」——大 / 高 → 嚴格用三機制；小 / 低 → 可放寬。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>原則</th>
          <th>跟本卡的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="../writing-multi-pass-review/">#83 Multi-pass review</a></td>
          <td>本卡是 #83 的延伸——#83 講「每輪換 frame」、本卡講「frame 本身要夠細、且需要工具 / 視角 / 層次三軸補強」</td>
      </tr>
      <tr>
          <td><a href="../ease-of-writing-vs-intent-alignment/">#67 寫作便利度跟意圖對齊反相關</a></td>
          <td>用「規則 frame 掃描」是 reviewer 的寫作便利、用「keyword bank + reader simulation」是費力但精準</td>
      </tr>
      <tr>
          <td><a href="../multi-pass-scope-must-cover-risk-zone/">#95 Multi-pass review 的 scope 要蓋同類風險區</a></td>
          <td>#95 處理「scope 軸」（review 多廣）、本卡處理「frame 顆粒度軸」（規則展開多細）、兩軸正交</td>
      </tr>
      <tr>
          <td><a href="../design-flaw-by-current-axes-not-hindsight/">#110 設計檢討用當下三軸論證、不依賴 hindsight</a></td>
          <td>hindsight 視角會把 review framework 當「補丁」、self-criticism 用當下框架審視、跟 #110 同骨</td>
      </tr>
      <tr>
          <td><a href="../colloquial-rhetoric-erodes-technical-precision/">#111 口語化修辭會稀釋技術精度</a></td>
          <td>#111 是字句層的「具體訊號」之一、本卡是「為什麼字句層訊號被 framework 漏 catch」的 meta 層</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>該做的行動</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>讀者反饋了 framework 裡找不到對應 frame</td>
          <td>加進 keyword bank、補進 framework 的 frame 列表</td>
      </tr>
      <tr>
          <td>跑 N 輪後同類問題仍出現</td>
          <td>framework 不夠細、加機制 1（keyword bank）</td>
      </tr>
      <tr>
          <td>reviewer 通順 / 讀者卡住</td>
          <td>加機制 2（reader simulation 輪）</td>
      </tr>
      <tr>
          <td>framework 從來沒被質疑過</td>
          <td>加機制 3（self-criticism 輪）、定期審視 framework 本身</td>
      </tr>
      <tr>
          <td>多輪 review 跑完還是同 reviewer</td>
          <td>引入外部讀者反饋、或刻意換視角（不同 IDE / 不同字體 / 跳段順序讀）</td>
      </tr>
  </tbody>
</table>
<p><strong>核心原則</strong>：multi-pass review 用「規則 frame」掃描有效抓結構性違反、抓不到字句層具體訊號。要 catch 字句層、需要把規則展開成 keyword bank、加 reader simulation 視角、加 self-criticism 反向審視 framework 本身——三個機制各自處理同 reviewer 跑多輪仍 miss 的不同來源。</p>
<hr>
<h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源</h2>
<p>本卡的觸發是修 <a href="../../work-log/dart_stream_controller_single_vs_broadcast/">Dart StreamController：single-subscription vs broadcast 的事故實錄</a> 時、跑了 4 輪 multi-pass review 後仍漏 catch 4 類字句層問題、由讀者點出。</p>
<p>讀者反饋的問題類型：</p>
<ol>
<li>口語化修辭（「一輩子只能 listen 一次」「立刻撞牆」「啊原來」「碰巧能用」）</li>
<li>地區用語漂移（「副屏」是中國用語、台灣用「副螢幕」）</li>
<li>依賴 code 論述（「事件 payload 第二段帶了」預設讀者看過 code）</li>
<li>廢話前綴 + 否定先行（「下次看到 X 時、不要先想 Y、先問 Z」）</li>
</ol>
<p>這 4 類問題對應的 frame 在 framework 裡都有（規則七機會成本、輪 4 術語、規則二商業邏輯、規則五最重要的話優先說）——但都沒展開到具體訊號層、所以 reviewer 跑了 4 輪都漏 catch。</p>
<p>對應本卡：<strong>framework 的覆蓋度盲點不能靠「再仔細一輪」修補——同一 reviewer 跑同 framework 多輪、catch 的東西高度相同。要真正擴大覆蓋度、需要 keyword bank（換工具）+ reader simulation（換視角）+ self-criticism（換層次）三個機制</strong>。</p>
<p>對 multi-pass review framework 的修補方向：把這 4 類問題加進對應 frame 的 keyword bank、加 reader simulation 輪當輪 8、加 self-criticism 輪當輪 9（或在每輪結尾加 self-criticism 子段）。</p>
]]></content:encoded></item><item><title>字句層 review：keyword bank 命中是候選、不是判決</title><link>https://tarrragon.github.io/blog/report/keyword-bank-hit-is-candidate-not-verdict/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/keyword-bank-hit-is-candidate-not-verdict/</guid><description>&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>字句層 review 有兩個獨立步驟：偵測（這句有沒有命中可疑訊號）跟判定（這個命中是不是違規）。keyword bank 解的是偵測、判定仍是一個獨立的語意認知步驟。&lt;/strong> reviewer 拿到 grep 命中後、傾向把它合理化成「這個 case 可以接受」而放行 — 偵測成功、判定失敗、違規一樣留在稿件裡。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>步驟&lt;/th>
 &lt;th>工具&lt;/th>
 &lt;th>失敗模式&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>偵測&lt;/td>
 &lt;td>grep keyword bank（#114）&lt;/td>
 &lt;td>關鍵詞不在 bank 裡 → 漏命中（coverage gap）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>判定&lt;/td>
 &lt;td>reviewer 語意判斷&lt;/td>
 &lt;td>命中了、但被合理化成「可接受對照」→ 放行（judgment gap）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>#114 把字句層 review 的失敗歸到偵測層（沒 keyword bank、靠記憶 sweep）。本卡補它沒覆蓋的另一層：&lt;strong>就算 grep 命中、reviewer 仍可能判錯&lt;/strong>。命中只是候選、不是判決。&lt;/p>
&lt;hr>
&lt;h2 id="情境">情境&lt;/h2>
&lt;p>寫作規範「正向陳述優先」（主要敘述用正向句建立概念、反例只做對照）的 review、跑 grep &lt;code>不[行可是要能]|無法|沒[做有]|而非|而不是&lt;/code>。這個 bank 會命中兩類完全不同的句子：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>建立概念的否定&lt;/strong>：「高階函式&lt;strong>不是&lt;/strong>『用了比較高級』、&lt;strong>而是&lt;/strong>特定場景的自然解」 — 用否定當核心概念的開場、違反正向陳述。&lt;/li>
&lt;li>&lt;strong>反例對照的否定&lt;/strong>：「對照反例：假設一個只有單一布林設定的 controller…既&lt;strong>沒有&lt;/strong>共用流程、也&lt;strong>沒有&lt;/strong>開放的變化點」 — 在明示的反例段落裡、否定是對照本身、規範允許。&lt;/li>
&lt;/ul>
&lt;p>兩者 grep 命中長得一樣、語意角色相反。reviewer 掃命中清單時、若用「這裡有對照意味、應該算反例」的寬鬆預設、會把第一類也放行 —— 這正是本卡的 case：grep 命中了「不是…而是」、被判成「正向對照修辭、OK」、由讀者再次 feedback 才 catch。&lt;/p>
&lt;p>另有一類問題連命中都沒有：&lt;strong>訴諸群體的安撫贅語&lt;/strong>（「很多人卡在…」「大家都會搞混…」）。這類句子沒有固定關鍵詞（「很多人 / 大家 / 不少開發者 / 初學時」表面形式發散）、keyword bank 結構上抓不到、只能靠語意 pass。&lt;/p>
&lt;hr>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;h3 id="否定句構命中後用概念位置判定不用有沒有對照意味判定">否定句構命中後、用「概念位置」判定、不用「有沒有對照意味」判定&lt;/h3>
&lt;p>判別問題從「這句有對照意味嗎」（太寬、幾乎都 yes）換成 &lt;strong>「這個否定在建立核心概念、還是在明示的反例段落裡做對照」&lt;/strong>：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>命中位置&lt;/th>
 &lt;th>判定&lt;/th>
 &lt;th>修法&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>段首 / 小節開場 / 核心議題句&lt;/td>
 &lt;td>違規 — 用否定建立概念&lt;/td>
 &lt;td>直接陳述「B 是什麼」、把對 A 的否定整個拿掉&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>明示的「反例 / 對照 / 不適合場景」段落內&lt;/td>
 &lt;td>保留 — 否定是對照本體&lt;/td>
 &lt;td>不動（規範允許、見 #94）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>用對比定義術語（「裸寫 = 略過取名」）&lt;/td>
 &lt;td>保留 — 否定是定義的本質&lt;/td>
 &lt;td>不動&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>關鍵修法是&lt;strong>正向直述 B&lt;/strong>：「X 不是 A、而是 B」→「X 是 B」、把 A 的排除留給上下文或反例段。把「不是 A」翻成「而非 A」只是換個負向詞、仍違規。&lt;/p>
&lt;p>這條判定準則剛好夾在兩張既有卡之間：#94 警告「別過度刪對照（刪掉承擔 reasoning 的 Y 會讓結論空降）」、正向陳述優先要求「別保留建立概念的否定」。判別線就是上表的「概念位置」—— 概念開場的否定該刪、反例段落的對照該留。&lt;/p>
&lt;h3 id="沒有關鍵詞的贅語靠-reader-simulation-補">沒有關鍵詞的贅語、靠 reader-simulation 補&lt;/h3>
&lt;p>訴諸群體的安撫贅語抓不到固定關鍵詞、改用「換視角」pass：假裝讀者、問每一句「這句給了新資訊、還是只在安撫我（讓我覺得不是只有自己不會）」。教學文的責任是把概念講清楚、不是安撫讀者情緒 —— 安撫句一律刪、保留有教學價值的聚焦（「要分清什麼」）。&lt;/p>
&lt;hr>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;h3 id="規範掃描器顯示乾淨違規仍在">規範掃描器顯示「乾淨」、違規仍在&lt;/h3>
&lt;p>跑完 grep、把命中逐條判成「可接受」、回報「字句層 clean」 —— 這個 clean 是 judgment 放水的結果、不是真的沒違規。比「沒跑 grep」更危險：沒跑還知道沒查、跑完誤判會產生「已經查過」的虛假信心。&lt;/p>
&lt;h3 id="違規類型有系統性偏移">違規類型有系統性偏移&lt;/h3>
&lt;p>被合理化放行的是&lt;strong>特定一類&lt;/strong>（建立概念的否定句構），有系統性偏移。同一個寬鬆預設會在每篇文章放行同一類違規 —— 跨稿件累積成 systematic miss、跟 #114 的偵測層 systematic miss 同構、只是發生在判定層。&lt;/p>
&lt;h3 id="keyword-bank-越長judgment-放水越隱形">keyword bank 越長、judgment 放水越隱形&lt;/h3>
&lt;p>bank 補得越完整、命中越多、reviewer 越依賴「快速掃過命中清單」、每條停留判定的時間越短、越容易用寬鬆預設批次放行。偵測能力提升反而稀釋判定品質 —— 兩層要分開要求、不能假設「有 bank 就會判對」。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="../multi-pass-review-frame-granularity-blindspot/">#114 Multi-pass review 的 frame 顆粒度盲點&lt;/a>&lt;/strong>：#114 解偵測層（把規則展開成 keyword bank、不靠記憶 sweep）。本卡是它的下一層 —— &lt;strong>就算 bank 命中、判定仍可能放水&lt;/strong>。#114 的 keyword bank 範例已收「不是 A 而是 B」、但收進 bank 只保證命中、不保證判對；本卡補「命中後怎麼判」。訴諸群體贅語則是 #114 bank 該補的新 coverage（無固定關鍵詞、靠 reader-simulation）。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../positive-rewrite-preserves-contrast/">#94 正向改寫要保留對照論據、不能空降結論&lt;/a>&lt;/strong>：#94 跟本卡是同一判定軸的兩極。#94 防「過度刪 —— 刪掉承擔 reasoning 的對照 Y、結論變空降」；本卡防「過度留 —— 保留建立概念的否定、用『這是對照』當藉口」。兩卡合起來才是完整判定準則：以「概念位置」區分該刪（概念開場）還是該留（反例段落 / reasoning 對照）。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務&lt;/a>&lt;/strong>：#147 講「立了規範 ≠ 能在自己稿件辨識實例」。本卡是更細一層 —— &lt;strong>連 grep 命中（自審的最強形式、已經指到具體句子）都可能因判定放水而失效&lt;/strong>。#147 的三層機制（grep / checklist / reviewer in-stream）裡、本卡聚焦 grep 那層的「命中之後」缺口。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../literal-interception-vs-behavioral-refinement/">#82 字面攔截 vs 行為精修&lt;/a>&lt;/strong>：grep 命中是字面層攔截、看不到那個否定承擔的是「建立概念」還是「反例對照」 —— 需要 behavioral pass（讀者讀到這句、是拿到正向概念還是被否定句卡住）才能判。本卡是 #82 在「字句層 review 判定」的具體實例。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>徵兆&lt;/th>
 &lt;th>該做的行動&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>grep 命中清單掃過、大半判「可接受對照」&lt;/td>
 &lt;td>停 —— 寬鬆預設正在放水、逐條改用「概念位置」判定&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>命中的否定句在段首 / 小節開場 / 核心議題句&lt;/td>
 &lt;td>違規 —— 改正向直述、別翻成「而非」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>把「不是 A 而是 B」改成「而非 A」就收工&lt;/td>
 &lt;td>沒修 —— 只是換個負向詞、仍是否定建立概念&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>回報「字句層 clean」但只跑了 grep、沒做語意 pass&lt;/td>
 &lt;td>clean 可能是判定放水 —— 補 reader-simulation 一輪&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>句子在安撫讀者（「很多人 / 大家都會」）卻無關鍵詞命中&lt;/td>
 &lt;td>keyword bank 抓不到 —— 靠「這句給新資訊還是安撫」語意問句刪&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="適用範圍與邊界">適用範圍與邊界&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>適用&lt;/strong>：正向陳述優先這類「同一訊號命中、語意角色相反」的字句層規範 review；AI 輔助寫作的 self-review（最容易在判定層放水）；keyword bank 已建立、但 review 回報品質仍不穩的情境。&lt;/li>
&lt;li>&lt;strong>不適用&lt;/strong>：偵測本身就漏（關鍵詞不在 bank）的問題 —— 那是 #114 的偵測層、先補 bank 再談判定。&lt;/li>
&lt;li>&lt;strong>邊界&lt;/strong>：判定收緊 ≠ 一律刪否定。明示反例段落的對照（#94 的 reasoning Y）該留；判別線是「概念位置」、不是「有沒有否定詞」。收太緊會退回 #94 警告的「空降斷言」。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源&lt;/h2>
&lt;p>本卡觸發於 review &lt;a href="../../work-log/dart_hof_typedef_readability/">為什麼這個場景適合用高階函式&lt;/a> 時。流程是先跑 3 個 frame 的 multi-round review + 字句層 grep keyword bank：&lt;/p></description><content:encoded><![CDATA[<h2 id="核心原則">核心原則</h2>
<p><strong>字句層 review 有兩個獨立步驟：偵測（這句有沒有命中可疑訊號）跟判定（這個命中是不是違規）。keyword bank 解的是偵測、判定仍是一個獨立的語意認知步驟。</strong> reviewer 拿到 grep 命中後、傾向把它合理化成「這個 case 可以接受」而放行 — 偵測成功、判定失敗、違規一樣留在稿件裡。</p>
<table>
  <thead>
      <tr>
          <th>步驟</th>
          <th>工具</th>
          <th>失敗模式</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>偵測</td>
          <td>grep keyword bank（#114）</td>
          <td>關鍵詞不在 bank 裡 → 漏命中（coverage gap）</td>
      </tr>
      <tr>
          <td>判定</td>
          <td>reviewer 語意判斷</td>
          <td>命中了、但被合理化成「可接受對照」→ 放行（judgment gap）</td>
      </tr>
  </tbody>
</table>
<p>#114 把字句層 review 的失敗歸到偵測層（沒 keyword bank、靠記憶 sweep）。本卡補它沒覆蓋的另一層：<strong>就算 grep 命中、reviewer 仍可能判錯</strong>。命中只是候選、不是判決。</p>
<hr>
<h2 id="情境">情境</h2>
<p>寫作規範「正向陳述優先」（主要敘述用正向句建立概念、反例只做對照）的 review、跑 grep <code>不[行可是要能]|無法|沒[做有]|而非|而不是</code>。這個 bank 會命中兩類完全不同的句子：</p>
<ul>
<li><strong>建立概念的否定</strong>：「高階函式<strong>不是</strong>『用了比較高級』、<strong>而是</strong>特定場景的自然解」 — 用否定當核心概念的開場、違反正向陳述。</li>
<li><strong>反例對照的否定</strong>：「對照反例：假設一個只有單一布林設定的 controller…既<strong>沒有</strong>共用流程、也<strong>沒有</strong>開放的變化點」 — 在明示的反例段落裡、否定是對照本身、規範允許。</li>
</ul>
<p>兩者 grep 命中長得一樣、語意角色相反。reviewer 掃命中清單時、若用「這裡有對照意味、應該算反例」的寬鬆預設、會把第一類也放行 —— 這正是本卡的 case：grep 命中了「不是…而是」、被判成「正向對照修辭、OK」、由讀者再次 feedback 才 catch。</p>
<p>另有一類問題連命中都沒有：<strong>訴諸群體的安撫贅語</strong>（「很多人卡在…」「大家都會搞混…」）。這類句子沒有固定關鍵詞（「很多人 / 大家 / 不少開發者 / 初學時」表面形式發散）、keyword bank 結構上抓不到、只能靠語意 pass。</p>
<hr>
<h2 id="理想做法">理想做法</h2>
<h3 id="否定句構命中後用概念位置判定不用有沒有對照意味判定">否定句構命中後、用「概念位置」判定、不用「有沒有對照意味」判定</h3>
<p>判別問題從「這句有對照意味嗎」（太寬、幾乎都 yes）換成 <strong>「這個否定在建立核心概念、還是在明示的反例段落裡做對照」</strong>：</p>
<table>
  <thead>
      <tr>
          <th>命中位置</th>
          <th>判定</th>
          <th>修法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>段首 / 小節開場 / 核心議題句</td>
          <td>違規 — 用否定建立概念</td>
          <td>直接陳述「B 是什麼」、把對 A 的否定整個拿掉</td>
      </tr>
      <tr>
          <td>明示的「反例 / 對照 / 不適合場景」段落內</td>
          <td>保留 — 否定是對照本體</td>
          <td>不動（規範允許、見 #94）</td>
      </tr>
      <tr>
          <td>用對比定義術語（「裸寫 = 略過取名」）</td>
          <td>保留 — 否定是定義的本質</td>
          <td>不動</td>
      </tr>
  </tbody>
</table>
<p>關鍵修法是<strong>正向直述 B</strong>：「X 不是 A、而是 B」→「X 是 B」、把 A 的排除留給上下文或反例段。把「不是 A」翻成「而非 A」只是換個負向詞、仍違規。</p>
<p>這條判定準則剛好夾在兩張既有卡之間：#94 警告「別過度刪對照（刪掉承擔 reasoning 的 Y 會讓結論空降）」、正向陳述優先要求「別保留建立概念的否定」。判別線就是上表的「概念位置」—— 概念開場的否定該刪、反例段落的對照該留。</p>
<h3 id="沒有關鍵詞的贅語靠-reader-simulation-補">沒有關鍵詞的贅語、靠 reader-simulation 補</h3>
<p>訴諸群體的安撫贅語抓不到固定關鍵詞、改用「換視角」pass：假裝讀者、問每一句「這句給了新資訊、還是只在安撫我（讓我覺得不是只有自己不會）」。教學文的責任是把概念講清楚、不是安撫讀者情緒 —— 安撫句一律刪、保留有教學價值的聚焦（「要分清什麼」）。</p>
<hr>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<h3 id="規範掃描器顯示乾淨違規仍在">規範掃描器顯示「乾淨」、違規仍在</h3>
<p>跑完 grep、把命中逐條判成「可接受」、回報「字句層 clean」 —— 這個 clean 是 judgment 放水的結果、不是真的沒違規。比「沒跑 grep」更危險：沒跑還知道沒查、跑完誤判會產生「已經查過」的虛假信心。</p>
<h3 id="違規類型有系統性偏移">違規類型有系統性偏移</h3>
<p>被合理化放行的是<strong>特定一類</strong>（建立概念的否定句構），有系統性偏移。同一個寬鬆預設會在每篇文章放行同一類違規 —— 跨稿件累積成 systematic miss、跟 #114 的偵測層 systematic miss 同構、只是發生在判定層。</p>
<h3 id="keyword-bank-越長judgment-放水越隱形">keyword bank 越長、judgment 放水越隱形</h3>
<p>bank 補得越完整、命中越多、reviewer 越依賴「快速掃過命中清單」、每條停留判定的時間越短、越容易用寬鬆預設批次放行。偵測能力提升反而稀釋判定品質 —— 兩層要分開要求、不能假設「有 bank 就會判對」。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><strong><a href="../multi-pass-review-frame-granularity-blindspot/">#114 Multi-pass review 的 frame 顆粒度盲點</a></strong>：#114 解偵測層（把規則展開成 keyword bank、不靠記憶 sweep）。本卡是它的下一層 —— <strong>就算 bank 命中、判定仍可能放水</strong>。#114 的 keyword bank 範例已收「不是 A 而是 B」、但收進 bank 只保證命中、不保證判對；本卡補「命中後怎麼判」。訴諸群體贅語則是 #114 bank 該補的新 coverage（無固定關鍵詞、靠 reader-simulation）。</li>
<li><strong><a href="../positive-rewrite-preserves-contrast/">#94 正向改寫要保留對照論據、不能空降結論</a></strong>：#94 跟本卡是同一判定軸的兩極。#94 防「過度刪 —— 刪掉承擔 reasoning 的對照 Y、結論變空降」；本卡防「過度留 —— 保留建立概念的否定、用『這是對照』當藉口」。兩卡合起來才是完整判定準則：以「概念位置」區分該刪（概念開場）還是該留（反例段落 / reasoning 對照）。</li>
<li><strong><a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務</a></strong>：#147 講「立了規範 ≠ 能在自己稿件辨識實例」。本卡是更細一層 —— <strong>連 grep 命中（自審的最強形式、已經指到具體句子）都可能因判定放水而失效</strong>。#147 的三層機制（grep / checklist / reviewer in-stream）裡、本卡聚焦 grep 那層的「命中之後」缺口。</li>
<li><strong><a href="../literal-interception-vs-behavioral-refinement/">#82 字面攔截 vs 行為精修</a></strong>：grep 命中是字面層攔截、看不到那個否定承擔的是「建立概念」還是「反例對照」 —— 需要 behavioral pass（讀者讀到這句、是拿到正向概念還是被否定句卡住）才能判。本卡是 #82 在「字句層 review 判定」的具體實例。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>該做的行動</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>grep 命中清單掃過、大半判「可接受對照」</td>
          <td>停 —— 寬鬆預設正在放水、逐條改用「概念位置」判定</td>
      </tr>
      <tr>
          <td>命中的否定句在段首 / 小節開場 / 核心議題句</td>
          <td>違規 —— 改正向直述、別翻成「而非」</td>
      </tr>
      <tr>
          <td>把「不是 A 而是 B」改成「而非 A」就收工</td>
          <td>沒修 —— 只是換個負向詞、仍是否定建立概念</td>
      </tr>
      <tr>
          <td>回報「字句層 clean」但只跑了 grep、沒做語意 pass</td>
          <td>clean 可能是判定放水 —— 補 reader-simulation 一輪</td>
      </tr>
      <tr>
          <td>句子在安撫讀者（「很多人 / 大家都會」）卻無關鍵詞命中</td>
          <td>keyword bank 抓不到 —— 靠「這句給新資訊還是安撫」語意問句刪</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="適用範圍與邊界">適用範圍與邊界</h2>
<ul>
<li><strong>適用</strong>：正向陳述優先這類「同一訊號命中、語意角色相反」的字句層規範 review；AI 輔助寫作的 self-review（最容易在判定層放水）；keyword bank 已建立、但 review 回報品質仍不穩的情境。</li>
<li><strong>不適用</strong>：偵測本身就漏（關鍵詞不在 bank）的問題 —— 那是 #114 的偵測層、先補 bank 再談判定。</li>
<li><strong>邊界</strong>：判定收緊 ≠ 一律刪否定。明示反例段落的對照（#94 的 reasoning Y）該留；判別線是「概念位置」、不是「有沒有否定詞」。收太緊會退回 #94 警告的「空降斷言」。</li>
</ul>
<hr>
<h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源</h2>
<p>本卡觸發於 review <a href="../../work-log/dart_hof_typedef_readability/">為什麼這個場景適合用高階函式</a> 時。流程是先跑 3 個 frame 的 multi-round review + 字句層 grep keyword bank：</p>
<ol>
<li>grep <strong>命中</strong>了核心議題句「高階函式<strong>不是</strong>『用了比較高級』、<strong>而是</strong>特定場景的自然解」跟小節開場「<strong>不是</strong>『能用就用』、<strong>而是</strong>…三個特徵」。</li>
<li>我把這些命中判成「正向對照修辭、OK」、回報「字句層大致乾淨」。</li>
<li>讀者 feedback 指出這仍違反正向陳述 —— 偵測成功、判定失敗。</li>
<li>修正後讀者再指出「很多人卡在…」是訴諸群體的安撫贅語 —— 這類連 grep 都沒命中（無固定關鍵詞）。</li>
</ol>
<p>對應本卡：<strong>keyword bank 命中是候選、不是判決</strong>。第一類（命中誤判）揭露判定層盲點、第二類（無命中）揭露 coverage 仍需 reader-simulation 補。兩者共同說明：字句層 review 的偵測（grep）跟判定（語意）是兩個步驟、不能假設「跑了 bank 就會判對、就會抓全」。</p>
]]></content:encoded></item><item><title>Review 漏抓先分 design gap 與 execution gap、再決定改框架還是改執行</title><link>https://tarrragon.github.io/blog/report/review-miss-diagnose-design-vs-execution-gap/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/review-miss-diagnose-design-vs-execution-gap/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡是一次 review 失誤的 self-retrospective（用 WRAP 的 Consider the Opposite 反向檢驗自己的 review 過程）抽出。具體限制：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>樣本是 1 次 review、1 個 reviewer（我自己）&lt;/strong>：「design gap vs execution gap」這個二分基於單次自我檢討、不是跨多次 review 觀察到的 systematic pattern。&lt;/li>
&lt;li>&lt;strong>「自我歸因」有 self-serving 風險&lt;/strong>：reviewer 檢討自己漏抓時、可能傾向把責任推給「框架不足」（design gap）而非「我偷懶」（execution gap）—— 本卡的價值正是強迫拆開這兩者、但拆的人就是當事人、客觀性有限。&lt;/li>
&lt;li>&lt;strong>修法有效性未驗證&lt;/strong>：診斷後的修法（改框架 vs 改執行）是否真能讓下次 catch 到、未經後續 review 驗證。&lt;/li>
&lt;/ul>
&lt;p>讀者使用本卡時、把它當「review 失誤歸因的一個檢查步驟」、不當「驗證過的 review 流程」。&lt;/p>
&lt;hr>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>Review 漏抓某類問題時，先分清是 &lt;strong>design gap&lt;/strong> 還是 &lt;strong>execution gap&lt;/strong>，再決定修法 —— 兩者修法相反。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Design gap&lt;/strong>：框架根本沒有對應的 frame / keyword 去 catch 這類問題。修法是&lt;strong>改框架&lt;/strong>（補 frame、補 keyword bank、補 lens）。&lt;/li>
&lt;li>&lt;strong>Execution gap&lt;/strong>：框架有對應 frame、但 reviewer 這次沒跑（跑了子集、跳過該跑的輪）。修法是&lt;strong>改執行&lt;/strong>（真的跑完該跑的輪），改框架沒用。&lt;/li>
&lt;/ul>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>成因&lt;/th>
 &lt;th>問題在哪&lt;/th>
 &lt;th>修法&lt;/th>
 &lt;th>誤判的後果&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Design gap&lt;/td>
 &lt;td>框架缺 frame&lt;/td>
 &lt;td>補 frame / keyword / lens&lt;/td>
 &lt;td>誤判成 execution → 一直漏同類（以為「下次認真跑」就好、但根本沒對應 frame）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Execution gap&lt;/td>
 &lt;td>沒跑該跑的輪&lt;/td>
 &lt;td>跑完整框架&lt;/td>
 &lt;td>誤判成 design → framework bloat（一直加 frame、卻沒解決「偷跑子集」的習慣）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>同一次漏抓&lt;strong>常常兩者都有&lt;/strong> —— 要分別處理、不能只修一邊。&lt;/p>
&lt;hr>
&lt;h2 id="具體-case">具體 case&lt;/h2>
&lt;p>這次 review 一篇技術教材、跑了「3 個臨時擬的 agent frame + 一次字句層 grep」、回報「字句層大致 clean」。結果使用者分多輪 catch 出 register/stance 類問題（安撫讀者 / 第二人稱 / 自評誇飾 / 必然框架）。用 WRAP Consider the Opposite 反向檢驗，發現&lt;strong>兩種 gap 都有&lt;/strong>：&lt;/p>
&lt;h3 id="execution-gap我沒跑完整框架">Execution gap（我沒跑完整框架）&lt;/h3>
&lt;p>multi-pass review 框架定義了輪 9（reader simulation）、輪 10（self-criticism），但這次&lt;strong>我根本沒跑&lt;/strong> —— 只跑了我臨時擬的 3 個 agent frame + grep。如果跑了輪 9（用讀者視角讀「這段在跟我說話嗎」），喊話類當場會 catch。這部分&lt;strong>不能怪框架&lt;/strong>、是我跑了子集。&lt;/p>
&lt;h3 id="design-gap框架本身的-frame-不夠">Design gap（框架本身的 frame 不夠）&lt;/h3>
&lt;p>但即使跑了輪 9、現有定義是「拿掉 code block 看論述能不能 parse」（聚焦&lt;strong>自包含性&lt;/strong>）、&lt;strong>沒有 register lens&lt;/strong>（這段在管理 / 評價 / 絕對化讀者嗎）。而且 register 類有兩個結構特性讓 keyword bank（輪 8）抓不到：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>無穩定關鍵詞&lt;/strong>：第二人稱「你」誤命中 code 註解、祈使句式發散、訴諸群體形式多。&lt;/li>
&lt;li>&lt;strong>最依賴外部 cold-read&lt;/strong>：這次正是**使用者（外部讀者）**才抓到 —— 同一 reviewer 模擬讀者視角有限（per multi-pass 自承的 partial fix 限制）。&lt;/li>
&lt;/ul>
&lt;p>這部分&lt;strong>要改框架&lt;/strong>：輪 9 擴入 register lens、標明 register 類「reader-sim 主、keyword bank 輔」。&lt;/p>
&lt;hr>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;h3 id="只改框架framework-bloatexecution-習慣沒解">只改框架：framework bloat、execution 習慣沒解&lt;/h3>
&lt;p>漏抓後直覺反應是「加 keyword / 加 frame」—— 因為這看得見、像進步。但若真正成因是 execution gap（沒跑輪 9）、加再多 keyword 都沒用（那些輪還是沒跑）。框架越加越胖、reviewer 還是偷跑子集。&lt;/p></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡是一次 review 失誤的 self-retrospective（用 WRAP 的 Consider the Opposite 反向檢驗自己的 review 過程）抽出。具體限制：</p>
<ul>
<li><strong>樣本是 1 次 review、1 個 reviewer（我自己）</strong>：「design gap vs execution gap」這個二分基於單次自我檢討、不是跨多次 review 觀察到的 systematic pattern。</li>
<li><strong>「自我歸因」有 self-serving 風險</strong>：reviewer 檢討自己漏抓時、可能傾向把責任推給「框架不足」（design gap）而非「我偷懶」（execution gap）—— 本卡的價值正是強迫拆開這兩者、但拆的人就是當事人、客觀性有限。</li>
<li><strong>修法有效性未驗證</strong>：診斷後的修法（改框架 vs 改執行）是否真能讓下次 catch 到、未經後續 review 驗證。</li>
</ul>
<p>讀者使用本卡時、把它當「review 失誤歸因的一個檢查步驟」、不當「驗證過的 review 流程」。</p>
<hr>
<h2 id="核心原則">核心原則</h2>
<p>Review 漏抓某類問題時，先分清是 <strong>design gap</strong> 還是 <strong>execution gap</strong>，再決定修法 —— 兩者修法相反。</p>
<ul>
<li><strong>Design gap</strong>：框架根本沒有對應的 frame / keyword 去 catch 這類問題。修法是<strong>改框架</strong>（補 frame、補 keyword bank、補 lens）。</li>
<li><strong>Execution gap</strong>：框架有對應 frame、但 reviewer 這次沒跑（跑了子集、跳過該跑的輪）。修法是<strong>改執行</strong>（真的跑完該跑的輪），改框架沒用。</li>
</ul>
<table>
  <thead>
      <tr>
          <th>成因</th>
          <th>問題在哪</th>
          <th>修法</th>
          <th>誤判的後果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Design gap</td>
          <td>框架缺 frame</td>
          <td>補 frame / keyword / lens</td>
          <td>誤判成 execution → 一直漏同類（以為「下次認真跑」就好、但根本沒對應 frame）</td>
      </tr>
      <tr>
          <td>Execution gap</td>
          <td>沒跑該跑的輪</td>
          <td>跑完整框架</td>
          <td>誤判成 design → framework bloat（一直加 frame、卻沒解決「偷跑子集」的習慣）</td>
      </tr>
  </tbody>
</table>
<p>同一次漏抓<strong>常常兩者都有</strong> —— 要分別處理、不能只修一邊。</p>
<hr>
<h2 id="具體-case">具體 case</h2>
<p>這次 review 一篇技術教材、跑了「3 個臨時擬的 agent frame + 一次字句層 grep」、回報「字句層大致 clean」。結果使用者分多輪 catch 出 register/stance 類問題（安撫讀者 / 第二人稱 / 自評誇飾 / 必然框架）。用 WRAP Consider the Opposite 反向檢驗，發現<strong>兩種 gap 都有</strong>：</p>
<h3 id="execution-gap我沒跑完整框架">Execution gap（我沒跑完整框架）</h3>
<p>multi-pass review 框架定義了輪 9（reader simulation）、輪 10（self-criticism），但這次<strong>我根本沒跑</strong> —— 只跑了我臨時擬的 3 個 agent frame + grep。如果跑了輪 9（用讀者視角讀「這段在跟我說話嗎」），喊話類當場會 catch。這部分<strong>不能怪框架</strong>、是我跑了子集。</p>
<h3 id="design-gap框架本身的-frame-不夠">Design gap（框架本身的 frame 不夠）</h3>
<p>但即使跑了輪 9、現有定義是「拿掉 code block 看論述能不能 parse」（聚焦<strong>自包含性</strong>）、<strong>沒有 register lens</strong>（這段在管理 / 評價 / 絕對化讀者嗎）。而且 register 類有兩個結構特性讓 keyword bank（輪 8）抓不到：</p>
<ul>
<li><strong>無穩定關鍵詞</strong>：第二人稱「你」誤命中 code 註解、祈使句式發散、訴諸群體形式多。</li>
<li><strong>最依賴外部 cold-read</strong>：這次正是**使用者（外部讀者）**才抓到 —— 同一 reviewer 模擬讀者視角有限（per multi-pass 自承的 partial fix 限制）。</li>
</ul>
<p>這部分<strong>要改框架</strong>：輪 9 擴入 register lens、標明 register 類「reader-sim 主、keyword bank 輔」。</p>
<hr>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<h3 id="只改框架framework-bloatexecution-習慣沒解">只改框架：framework bloat、execution 習慣沒解</h3>
<p>漏抓後直覺反應是「加 keyword / 加 frame」—— 因為這看得見、像進步。但若真正成因是 execution gap（沒跑輪 9）、加再多 keyword 都沒用（那些輪還是沒跑）。框架越加越胖、reviewer 還是偷跑子集。</p>
<h3 id="只改執行漏掉的整類永遠-catch-不到">只改執行：漏掉的整類永遠 catch 不到</h3>
<p>反過來、若把 design gap 誤判成「我下次認真跑就好」、但框架根本沒有對應 frame —— 認真跑現有的輪也 catch 不到、同類問題每次都漏。</p>
<h3 id="加-keyword是最誘人的假修法">「加 keyword」是最誘人的假修法</h3>
<p>加 keyword bank 條目成本低、立即有「補上了」的感覺。但它只解 design gap 的一個 sub-type（偵測層、且限有穩定關鍵詞的類）。對 execution gap（沒跑輪）、對 register 這種無關鍵詞的 design gap、它都無效 —— 容易讓人以為修好了、其實沒。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><strong><a href="../multi-pass-review-frame-granularity-blindspot/">#114 Multi-pass review 的 frame 顆粒度盲點</a></strong>：#114 處理的是 <strong>design gap 的一個面向</strong>（frame 不夠細、抽象規則沒展開成具體訊號）。本卡是上位 —— 在「改 frame 顆粒度」之前、先問「這次漏抓到底是缺 frame（design）還是沒跑 frame（execution）」。#114 預設問題在框架、本卡先驗證這個預設。</li>
<li><strong><a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務</a></strong>：#147 是 execution 側的 sibling —— 「立了規範 ≠ 自己稿件能辨識」講的就是「有 frame 不等於有跑」。本卡把它一般化成「有 frame 不等於有跑（execution gap）」、並跟「根本沒 frame（design gap）」對立起來。</li>
<li><strong><a href="../keyword-bank-hit-is-candidate-not-verdict/">#149 keyword bank 命中是候選、不是判決</a></strong>：#149 是另一個「兩層別混」的 pattern（偵測 vs 判定）。本卡（design vs execution）跟 #149（偵測 vs 判定）都在拆「review 失效的成因層」—— 修法都依賴先分層、再對症。</li>
<li><strong><a href="../teaching-register-states-not-addresses-reader/">#150-152 教材 register / framing 卡</a></strong>：這三張是本卡的觸發 case（漏抓的具體內容）。本卡是它們揭露的 <strong>review 流程層</strong> 教訓 —— 內容卡講「該怎麼寫」、本卡講「review 為什麼沒抓到、該改框架還是改執行」。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>該做的行動</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Review 漏抓、直覺想「加 keyword / 加 frame」</td>
          <td>先停 —— 問「這次有跑完該跑的輪嗎」、是 execution gap 就別加 frame</td>
      </tr>
      <tr>
          <td>「我下次認真跑就好」</td>
          <td>檢查框架真有對應 frame 嗎 —— 沒有就是 design gap、認真跑也沒用</td>
      </tr>
      <tr>
          <td>跑的是「臨時擬的子集」而非完整框架</td>
          <td>execution gap 訊號 —— 先補跑完整輪、再判斷框架夠不夠</td>
      </tr>
      <tr>
          <td>漏抓的類別有「無穩定關鍵詞」特性</td>
          <td>keyword bank 解不了（design gap 的 reader-sim 類）—— 加 lens、不是加 keyword</td>
      </tr>
      <tr>
          <td>漏抓由外部讀者 / 使用者 catch、自己多輪沒抓到</td>
          <td>該類高度依賴 external cold-read —— 同 reviewer 模擬有限、標明依賴</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="適用範圍與邊界">適用範圍與邊界</h2>
<ul>
<li><strong>適用</strong>：review 流程的 retrospective（漏抓後檢討）、framework 演進決策（要不要加 frame / keyword）、self-review 品質檢討。</li>
<li><strong>不適用</strong>：一次性短文 review（沒有「框架」可言、談不上 design vs execution）。</li>
<li><strong>邊界</strong>：兩者不互斥、常同時存在 —— 本卡要的不是「二選一」、是「分別診斷、分別修」。誤把它當 either-or 會只修一半。</li>
</ul>
<hr>
<h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源</h2>
<p>本卡觸發於對 <a href="../../work-log/dart_hof_typedef_readability/">HOF / typedef 文章</a> 的 review 失誤做 WRAP 檢討。使用者問「多輪審查設定是否需要調整」，WRAP 的 Consider the Opposite 步驟揭露：失敗不全是框架缺陷 —— 一半是我<strong>只跑了臨時子集、跳過框架既有的輪 9/10</strong>（execution gap）、一半是<strong>輪 9 定義聚焦自包含性、缺 register lens、且 register 類無穩定關鍵詞</strong>（design gap）。</p>
<p>對應本卡：若沒做這個拆分、最可能的反應是「再加幾個 keyword」（只解 design gap 的偵測 sub-type）、既沒解 execution gap（下次還是偷跑子集）、也沒解 register 的 reader-sim design gap。拆開後修法清楚：execution gap 靠「review 時真的跑完該跑的輪」（紀律、不改框架）、design gap 靠「輪 9 擴 register lens + 標明 external-reader 依賴」（改框架、下一步執行）。</p>
]]></content:encoded></item><item><title>register 違規：偵測可機械化、判定要靠文體異源的眼睛</title><link>https://tarrragon.github.io/blog/report/register-violation-needs-cross-style-eyes/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/register-violation-needs-cross-style-eyes/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>寫作規範的違規分兩類、判定性質根本不同。形式違規（emoji、編號、broken link、裸 URL、frontmatter 缺欄）可完全機械判定、命中即違規、該進工具鏈。register / 品味違規（核心概念前置、否定起手、喊話、誇飾、口語修辭）的判定有不可消除的品味核心、偵測可機械化但判定不可。&lt;/p>
&lt;p>「不是 X、而是 Y」是 register 違規裡最隱蔽的一種、因為它的偵測可機械化（句型明顯、grep 抓得到）、這個「偵測可機械化」偽裝成「判定也可機械化」。被這個偽裝誤導、就會無限投入更精緻的判定方法（補 grep → 概念位置判準 → 行為測試）、而判定（這個否定在建立概念還是做對照）本質是品味判斷、始終在品味側、始終放水。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>後續校正（見 &lt;a href="../lead-with-the-point-cross-language/">#166 重點優先陳述是跨語言的資訊結構原則&lt;/a>）&lt;/strong>：「不是 X、而是 Y」這個子集後來被釐清為資訊結構問題（重點後置）、不是純品味 —— 判定其實可操作（核心概念第一次正面出現在不在句首）、主解是強制執行重點位置判準、異源視角降為補充。本卡論的「品味核心 / 同源上限 / 異源為真防線」對喊話、誇飾這類無單一重點位置的 register 仍成立、但對「重點優先」這個可操作子集是過度推論。&lt;/p>&lt;/blockquote>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>違規類型&lt;/th>
 &lt;th>例子&lt;/th>
 &lt;th>判定性質&lt;/th>
 &lt;th>防線&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>形式違規&lt;/td>
 &lt;td>emoji、編號、broken link、frontmatter&lt;/td>
 &lt;td>確定性、命中即違規&lt;/td>
 &lt;td>工具鏈 lint&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>register 違規&lt;/td>
 &lt;td>概念前置、否定起手、喊話、誇飾、口語&lt;/td>
 &lt;td>有不可消除的品味核心&lt;/td>
 &lt;td>文體異源視角 + 工具鏈曝光&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="為什麼-register-違規的判定不可機械化">為什麼 register 違規的判定不可機械化&lt;/h2>
&lt;p>判定要回答「這個句子讀起來對不對」、這是品味問題、品味需要一個會讀的主體去感受、沒有可機械化的判準能取代。「不是 X、而是 Y」的判定要區分兩種角色：&lt;/p>
&lt;ul>
&lt;li>建立核心概念的否定（違規）：「外包一塊能力&lt;strong>不是&lt;/strong>二元、&lt;strong>而是&lt;/strong>有深度的」—— 核心概念「有深度」被擠到「而是」之後、句首先丟一個被否定的錯誤理解。&lt;/li>
&lt;li>反例對照的否定（合規）：在明示反例段落裡、否定就是對照本體（見 &lt;a href="../positive-rewrite-preserves-contrast/">#94&lt;/a>）。&lt;/li>
&lt;/ul>
&lt;p>兩者 grep 命中長得一樣、語意角色相反。要判對、reviewer 得讀懂段落結構、感受核心概念的位置 —— 這是品味判斷。任何想把它機械化的嘗試都只是換個地方做品味判斷：「概念位置判準」要判斷哪句是概念句、「刪除測試」要判斷剩下的概念完不完整、終點都回到「這讀起來對不對」。偵測的可機械化掩蓋了這個事實。&lt;/p>
&lt;hr>
&lt;h2 id="同源自審的結構上限">同源自審的結構上限&lt;/h2>
&lt;p>更深一層的原因、解釋了為什麼再多輪 LLM 審查都跨不過：產出 register 違規的主體跟審查它的主體共享同一套文體直覺。「不是 X、而是 Y」是 LLM 高頻自產的定義句型、LLM reviewer 讀到它「讀起來自然、權威」、違規感不觸發 —— 作者的盲區跟 reviewer 的盲區是同一個。&lt;/p>
&lt;p>這讓 register 違規的同源自審有結構上限。加 reviewer 數量、加審查輪次、換 frame、都在同一套文體直覺內打轉、跨不過盲區。要看出 register 違規、需要一雙「不共享作者文體」的眼睛。&lt;/p>
&lt;p>這條上限是 &lt;a href="../keyword-bank-hit-is-candidate-not-verdict/">#149&lt;/a>（命中後判定會放水）跟 &lt;a href="../rule-codification-vs-self-audit/">#147&lt;/a>（立規範不等於自審執行）的共同根因：#147 的修法是「立規範當下轉 grep + sweep」、#149 的修法是「命中後用概念位置判定」、兩個修法都還在自動化側、對 register 違規都攔不住、因為判定的品味核心要異源的眼睛才感受得到。&lt;/p>
&lt;hr>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;p>把違規先分類、再配對應的防線。&lt;/p>
&lt;h3 id="第一步分類--這個違規在哪一側">第一步：分類 —— 這個違規在哪一側&lt;/h3>
&lt;p>問一個判別問題：「這條規則的判定、是命中即違規（確定性）、還是要讀懂句子讀起來對不對（品味）？」確定性的進工具鏈、品味的進異源審查。emoji、編號、broken link 在確定性側；概念前置、否定起手、喊話、誇飾在品味側。&lt;/p>
&lt;h3 id="第二步register-違規--偵測機械化判定靠異源">第二步：register 違規 —— 偵測機械化、判定靠異源&lt;/h3>
&lt;p>偵測仍用 grep、但定位是「曝光候選給異源視角抽查」、產出不是「自動判定違規」。判定交給文體異源的眼睛：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>異源來源&lt;/th>
 &lt;th>怎麼用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>人類冷讀&lt;/td>
 &lt;td>作者以外的人讀、register 違規對非作者最刺眼（本卡就是這樣抓到的）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>reader-simulation&lt;/td>
 &lt;td>刻意換一個讀者視角讀每句「這句給新資訊、還是文體慣性」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>對抗文體 reviewer&lt;/td>
 &lt;td>prompt 明確要求 reviewer 採「挑剔否定起手 / 概念後置」的對抗姿態、抵銷同源文體慣性&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="第三步接受-100-自動-catch-不可能">第三步：接受 100% 自動 catch 不可能&lt;/h3>
&lt;p>把 register 違規的審查目標設成「曝光候選 + 異源抽查」、而不是「自動判定 clean」。回報時誠實標「register 層靠異源抽查、未做窮舉自動判定」、不把同源自審的 clean 當成真 clean。&lt;/p>
&lt;hr>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;h3 id="在錯的一側無限用力">在錯的一側無限用力&lt;/h3>
&lt;p>把 register 違規當成自動化側問題、就會持續投入「更好的檢查方法」（補 grep、寫判準、做測試）、每次都改進一點、每次都還是放水 —— 因為判定始終在品味側。投入的努力跟結果脫節、看起來在進步、實際在原地。&lt;/p>
&lt;h3 id="同源-clean-製造虛假信心">同源 clean 製造虛假信心&lt;/h3>
&lt;p>跑完多輪 LLM 審查、回報「字句層 clean」、這個 clean 是同源盲區的產物、不是真 clean。比沒審更危險：沒審還知道沒查、同源審完誤以為查過了、register 違規帶著「已審查」標籤留在稿件裡。&lt;/p>
&lt;h3 id="規範卡越多越以為夠了">規範卡越多、越以為夠了&lt;/h3>
&lt;p>blog 累積了 #94 / #147 / #149 一整套 register 審查原則、看起來防護很完整、反而讓人以為「照卡片做就夠」。這次的失敗證明：原則齊備、修法齊備、同源執行仍跨不過上限。原則的數量不等於防線的強度。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="../keyword-bank-hit-is-candidate-not-verdict/">#149 字句層 review：keyword bank 命中是候選、不是判決&lt;/a>&lt;/strong>：#149 揭露「命中後判定會放水」這個現象、本卡是它的上層 —— 揭露放水的根因（判定在品味側、同源自審有結構上限）跟結構解（異源視角、不是更好的判定準則）。#149 的「概念位置判準」是好的判準、但它仍要同源 reviewer 執行品味判斷、本卡指出這一步有上限。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務&lt;/a>&lt;/strong>：#147 講「立規範不等於自審執行」、修法是轉 grep + sweep。本卡補它沒覆蓋的：對 register 違規、grep + sweep 命中了、判定仍跨不過同源盲區。#147 解「自審有沒有做」、本卡解「自審做了、為什麼對 register 仍失效」。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../literal-interception-vs-behavioral-refinement/">#82 字面攔截 vs 行為精修&lt;/a>&lt;/strong>：本卡把 #82 的「字面 vs 行為」推到極限 —— 對 register 違規、連「行為精修」（讀者能不能驗證）都還是品味判斷、需要異源的讀者才感受得到。形式違規停在字面層即可、register 違規連行為層都需要異源。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../multi-pass-scope-must-cover-risk-zone/">#95 Multi-pass review scope 要蓋同類風險區&lt;/a>&lt;/strong>：#95 解 scope 軸（同類違規要 corpus-wide grep）、本卡解 source 軸（同類違規的判定要文體異源）。兩個一起才完整：grep 把候選掃出來（#95）、異源的眼睛判它違不違規（本卡）。這次三個 surface 鏡像內容共享同一違規句型、grep 掃得到、但同源判定全放行 —— scope 對了、source 沒換。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../multi-pass-review-frame-granularity-blindspot/">#114 Multi-pass review 的 frame 顆粒度盲點&lt;/a>&lt;/strong>：#114 解偵測層（展開成 keyword bank）、本卡指出對 register 違規、偵測層做好了、判定層仍需異源 —— frame 顆粒度再細、同源 reviewer 對品味違規仍有盲區。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>徵兆&lt;/th>
 &lt;th>該做的行動&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>對某個寫作違規、一直在「換更好的檢查方法」（補 grep / 寫判準 / 做測試）&lt;/td>
 &lt;td>停 —— 先問它在品味側還形式側、品味側的解是換 source、不是換 method&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>一個違規「偵測明顯（grep 抓得到）」但「判定要讀懂語意」&lt;/td>
 &lt;td>偵測可機械化、判定在品味側、別把偵測的容易誤當判定的容易&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>多輪 LLM 審查全 clean、但作者以外的人一眼看到違規&lt;/td>
 &lt;td>同源盲區的 retro signal、這類違規需要文體異源視角&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>reviewer 全是 LLM、prompt 全是「自然語言判準」&lt;/td>
 &lt;td>register 層缺異源防線、補人類冷讀或對抗文體 reviewer&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>回報「字句層 clean」、但只跑了同源 reviewer&lt;/td>
 &lt;td>這個 clean 可能是同源盲區產物、標「register 層未經異源抽查」&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="適用範圍與邊界">適用範圍與邊界&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>適用&lt;/strong>：register / 品味類寫作規範（正向陳述、概念前置、喊話、誇飾、口語修辭、文體）的 review 流程設計；AI 輔助寫作的 self-review（最容易在 register 層同源放水）；multi-round-review 的 frame 與資源配置。&lt;/li>
&lt;li>&lt;strong>不適用&lt;/strong>：形式違規（emoji、編號、broken link、frontmatter）—— 這類確定性判定、進工具鏈即可、不需異源、本卡的「同源上限」不適用。&lt;/li>
&lt;li>&lt;strong>邊界&lt;/strong>：「同源自審有上限」不等於「同源自審無用」 —— 同源 reviewer 仍能抓形式違規、抓部分明顯的 register 違規；上限指的是「對 register 違規無法做到窮舉可靠」、所以要補異源、不是廢掉同源。也不等於「只能靠人」 —— 偵測機械化、對抗文體 reviewer、reader-simulation 都能降低對純人工的依賴、只是接受殘餘要異源抽查。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源&lt;/h2>
&lt;p>本卡觸發於一次 backend 章節 + skill 的四輪 multi-round-review。流程是 12 個 LLM reviewer、4 輪、frame 涵蓋規範遵循 / 技術 / 一致性 / cadence / reader-simulation / title / self-application / steelman / outbound / cold-read / misuse / regression。Round 1-A 與 Round 3-A 都跑了 &lt;code>compositional-writing&lt;/code> 的正向陳述 grep keyword bank、命中了三個 surface 的「不是 X、而是 Y」、全部判成「合規對照」放行、回報「字句層 clean」。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>寫作規範的違規分兩類、判定性質根本不同。形式違規（emoji、編號、broken link、裸 URL、frontmatter 缺欄）可完全機械判定、命中即違規、該進工具鏈。register / 品味違規（核心概念前置、否定起手、喊話、誇飾、口語修辭）的判定有不可消除的品味核心、偵測可機械化但判定不可。</p>
<p>「不是 X、而是 Y」是 register 違規裡最隱蔽的一種、因為它的偵測可機械化（句型明顯、grep 抓得到）、這個「偵測可機械化」偽裝成「判定也可機械化」。被這個偽裝誤導、就會無限投入更精緻的判定方法（補 grep → 概念位置判準 → 行為測試）、而判定（這個否定在建立概念還是做對照）本質是品味判斷、始終在品味側、始終放水。</p>
<blockquote>
<p><strong>後續校正（見 <a href="../lead-with-the-point-cross-language/">#166 重點優先陳述是跨語言的資訊結構原則</a>）</strong>：「不是 X、而是 Y」這個子集後來被釐清為資訊結構問題（重點後置）、不是純品味 —— 判定其實可操作（核心概念第一次正面出現在不在句首）、主解是強制執行重點位置判準、異源視角降為補充。本卡論的「品味核心 / 同源上限 / 異源為真防線」對喊話、誇飾這類無單一重點位置的 register 仍成立、但對「重點優先」這個可操作子集是過度推論。</p></blockquote>
<table>
  <thead>
      <tr>
          <th>違規類型</th>
          <th>例子</th>
          <th>判定性質</th>
          <th>防線</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>形式違規</td>
          <td>emoji、編號、broken link、frontmatter</td>
          <td>確定性、命中即違規</td>
          <td>工具鏈 lint</td>
      </tr>
      <tr>
          <td>register 違規</td>
          <td>概念前置、否定起手、喊話、誇飾、口語</td>
          <td>有不可消除的品味核心</td>
          <td>文體異源視角 + 工具鏈曝光</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="為什麼-register-違規的判定不可機械化">為什麼 register 違規的判定不可機械化</h2>
<p>判定要回答「這個句子讀起來對不對」、這是品味問題、品味需要一個會讀的主體去感受、沒有可機械化的判準能取代。「不是 X、而是 Y」的判定要區分兩種角色：</p>
<ul>
<li>建立核心概念的否定（違規）：「外包一塊能力<strong>不是</strong>二元、<strong>而是</strong>有深度的」—— 核心概念「有深度」被擠到「而是」之後、句首先丟一個被否定的錯誤理解。</li>
<li>反例對照的否定（合規）：在明示反例段落裡、否定就是對照本體（見 <a href="../positive-rewrite-preserves-contrast/">#94</a>）。</li>
</ul>
<p>兩者 grep 命中長得一樣、語意角色相反。要判對、reviewer 得讀懂段落結構、感受核心概念的位置 —— 這是品味判斷。任何想把它機械化的嘗試都只是換個地方做品味判斷：「概念位置判準」要判斷哪句是概念句、「刪除測試」要判斷剩下的概念完不完整、終點都回到「這讀起來對不對」。偵測的可機械化掩蓋了這個事實。</p>
<hr>
<h2 id="同源自審的結構上限">同源自審的結構上限</h2>
<p>更深一層的原因、解釋了為什麼再多輪 LLM 審查都跨不過：產出 register 違規的主體跟審查它的主體共享同一套文體直覺。「不是 X、而是 Y」是 LLM 高頻自產的定義句型、LLM reviewer 讀到它「讀起來自然、權威」、違規感不觸發 —— 作者的盲區跟 reviewer 的盲區是同一個。</p>
<p>這讓 register 違規的同源自審有結構上限。加 reviewer 數量、加審查輪次、換 frame、都在同一套文體直覺內打轉、跨不過盲區。要看出 register 違規、需要一雙「不共享作者文體」的眼睛。</p>
<p>這條上限是 <a href="../keyword-bank-hit-is-candidate-not-verdict/">#149</a>（命中後判定會放水）跟 <a href="../rule-codification-vs-self-audit/">#147</a>（立規範不等於自審執行）的共同根因：#147 的修法是「立規範當下轉 grep + sweep」、#149 的修法是「命中後用概念位置判定」、兩個修法都還在自動化側、對 register 違規都攔不住、因為判定的品味核心要異源的眼睛才感受得到。</p>
<hr>
<h2 id="理想做法">理想做法</h2>
<p>把違規先分類、再配對應的防線。</p>
<h3 id="第一步分類--這個違規在哪一側">第一步：分類 —— 這個違規在哪一側</h3>
<p>問一個判別問題：「這條規則的判定、是命中即違規（確定性）、還是要讀懂句子讀起來對不對（品味）？」確定性的進工具鏈、品味的進異源審查。emoji、編號、broken link 在確定性側；概念前置、否定起手、喊話、誇飾在品味側。</p>
<h3 id="第二步register-違規--偵測機械化判定靠異源">第二步：register 違規 —— 偵測機械化、判定靠異源</h3>
<p>偵測仍用 grep、但定位是「曝光候選給異源視角抽查」、產出不是「自動判定違規」。判定交給文體異源的眼睛：</p>
<table>
  <thead>
      <tr>
          <th>異源來源</th>
          <th>怎麼用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>人類冷讀</td>
          <td>作者以外的人讀、register 違規對非作者最刺眼（本卡就是這樣抓到的）</td>
      </tr>
      <tr>
          <td>reader-simulation</td>
          <td>刻意換一個讀者視角讀每句「這句給新資訊、還是文體慣性」</td>
      </tr>
      <tr>
          <td>對抗文體 reviewer</td>
          <td>prompt 明確要求 reviewer 採「挑剔否定起手 / 概念後置」的對抗姿態、抵銷同源文體慣性</td>
      </tr>
  </tbody>
</table>
<h3 id="第三步接受-100-自動-catch-不可能">第三步：接受 100% 自動 catch 不可能</h3>
<p>把 register 違規的審查目標設成「曝光候選 + 異源抽查」、而不是「自動判定 clean」。回報時誠實標「register 層靠異源抽查、未做窮舉自動判定」、不把同源自審的 clean 當成真 clean。</p>
<hr>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<h3 id="在錯的一側無限用力">在錯的一側無限用力</h3>
<p>把 register 違規當成自動化側問題、就會持續投入「更好的檢查方法」（補 grep、寫判準、做測試）、每次都改進一點、每次都還是放水 —— 因為判定始終在品味側。投入的努力跟結果脫節、看起來在進步、實際在原地。</p>
<h3 id="同源-clean-製造虛假信心">同源 clean 製造虛假信心</h3>
<p>跑完多輪 LLM 審查、回報「字句層 clean」、這個 clean 是同源盲區的產物、不是真 clean。比沒審更危險：沒審還知道沒查、同源審完誤以為查過了、register 違規帶著「已審查」標籤留在稿件裡。</p>
<h3 id="規範卡越多越以為夠了">規範卡越多、越以為夠了</h3>
<p>blog 累積了 #94 / #147 / #149 一整套 register 審查原則、看起來防護很完整、反而讓人以為「照卡片做就夠」。這次的失敗證明：原則齊備、修法齊備、同源執行仍跨不過上限。原則的數量不等於防線的強度。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><strong><a href="../keyword-bank-hit-is-candidate-not-verdict/">#149 字句層 review：keyword bank 命中是候選、不是判決</a></strong>：#149 揭露「命中後判定會放水」這個現象、本卡是它的上層 —— 揭露放水的根因（判定在品味側、同源自審有結構上限）跟結構解（異源視角、不是更好的判定準則）。#149 的「概念位置判準」是好的判準、但它仍要同源 reviewer 執行品味判斷、本卡指出這一步有上限。</li>
<li><strong><a href="../rule-codification-vs-self-audit/">#147 規範化跟自審是兩種認知任務</a></strong>：#147 講「立規範不等於自審執行」、修法是轉 grep + sweep。本卡補它沒覆蓋的：對 register 違規、grep + sweep 命中了、判定仍跨不過同源盲區。#147 解「自審有沒有做」、本卡解「自審做了、為什麼對 register 仍失效」。</li>
<li><strong><a href="../literal-interception-vs-behavioral-refinement/">#82 字面攔截 vs 行為精修</a></strong>：本卡把 #82 的「字面 vs 行為」推到極限 —— 對 register 違規、連「行為精修」（讀者能不能驗證）都還是品味判斷、需要異源的讀者才感受得到。形式違規停在字面層即可、register 違規連行為層都需要異源。</li>
<li><strong><a href="../multi-pass-scope-must-cover-risk-zone/">#95 Multi-pass review scope 要蓋同類風險區</a></strong>：#95 解 scope 軸（同類違規要 corpus-wide grep）、本卡解 source 軸（同類違規的判定要文體異源）。兩個一起才完整：grep 把候選掃出來（#95）、異源的眼睛判它違不違規（本卡）。這次三個 surface 鏡像內容共享同一違規句型、grep 掃得到、但同源判定全放行 —— scope 對了、source 沒換。</li>
<li><strong><a href="../multi-pass-review-frame-granularity-blindspot/">#114 Multi-pass review 的 frame 顆粒度盲點</a></strong>：#114 解偵測層（展開成 keyword bank）、本卡指出對 register 違規、偵測層做好了、判定層仍需異源 —— frame 顆粒度再細、同源 reviewer 對品味違規仍有盲區。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>該做的行動</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>對某個寫作違規、一直在「換更好的檢查方法」（補 grep / 寫判準 / 做測試）</td>
          <td>停 —— 先問它在品味側還形式側、品味側的解是換 source、不是換 method</td>
      </tr>
      <tr>
          <td>一個違規「偵測明顯（grep 抓得到）」但「判定要讀懂語意」</td>
          <td>偵測可機械化、判定在品味側、別把偵測的容易誤當判定的容易</td>
      </tr>
      <tr>
          <td>多輪 LLM 審查全 clean、但作者以外的人一眼看到違規</td>
          <td>同源盲區的 retro signal、這類違規需要文體異源視角</td>
      </tr>
      <tr>
          <td>reviewer 全是 LLM、prompt 全是「自然語言判準」</td>
          <td>register 層缺異源防線、補人類冷讀或對抗文體 reviewer</td>
      </tr>
      <tr>
          <td>回報「字句層 clean」、但只跑了同源 reviewer</td>
          <td>這個 clean 可能是同源盲區產物、標「register 層未經異源抽查」</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="適用範圍與邊界">適用範圍與邊界</h2>
<ul>
<li><strong>適用</strong>：register / 品味類寫作規範（正向陳述、概念前置、喊話、誇飾、口語修辭、文體）的 review 流程設計；AI 輔助寫作的 self-review（最容易在 register 層同源放水）；multi-round-review 的 frame 與資源配置。</li>
<li><strong>不適用</strong>：形式違規（emoji、編號、broken link、frontmatter）—— 這類確定性判定、進工具鏈即可、不需異源、本卡的「同源上限」不適用。</li>
<li><strong>邊界</strong>：「同源自審有上限」不等於「同源自審無用」 —— 同源 reviewer 仍能抓形式違規、抓部分明顯的 register 違規；上限指的是「對 register 違規無法做到窮舉可靠」、所以要補異源、不是廢掉同源。也不等於「只能靠人」 —— 偵測機械化、對抗文體 reviewer、reader-simulation 都能降低對純人工的依賴、只是接受殘餘要異源抽查。</li>
</ul>
<hr>
<h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源</h2>
<p>本卡觸發於一次 backend 章節 + skill 的四輪 multi-round-review。流程是 12 個 LLM reviewer、4 輪、frame 涵蓋規範遵循 / 技術 / 一致性 / cadence / reader-simulation / title / self-application / steelman / outbound / cold-read / misuse / regression。Round 1-A 與 Round 3-A 都跑了 <code>compositional-writing</code> 的正向陳述 grep keyword bank、命中了三個 surface 的「不是 X、而是 Y」、全部判成「合規對照」放行、回報「字句層 clean」。</p>
<p>四輪結束、三個 PR 合併之後、使用者讀稿件、一眼指出「外包一塊能力<strong>不是</strong>二元、<strong>而是</strong>有深度的」是否定句型 + 概念後置違規。同一個違規在 0.22 章節、知識卡、skill principle 卡三個 surface 都存在、12 個 LLM reviewer 全漏、使用者一眼抓到。</p>
<p>對應本卡：register 違規的判定在品味側、12 個 LLM reviewer 共享文體直覺、同源自審跨不過盲區；使用者是文體異源的眼睛、所以一眼看到。這次失敗證明 #147 的「轉 grep + sweep」、#149 的「概念位置判定」、補 grep keyword bank —— 三個自動化側的修法疊起來、對 register 違規仍跨不過同源上限。結構解是把異源視角寫進流程、不是再疊第四個自動化側修法。</p>
]]></content:encoded></item><item><title>修法是新違規的來源、且常引入同類變體</title><link>https://tarrragon.github.io/blog/report/remediation-introduces-sibling-variants/</link><pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/remediation-introduces-sibling-variants/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>修法是新違規的來源。改寫一個違規句、補一條 lint 規則、改一個 pattern——這些動作本身會引入新問題，而且引入的常是同一類問題的變體：修掉「不是 X、而是 Y」、就暴露「不是 X — 是 Y」；補一條 pattern 抓某變體、下一個變體又漏。&lt;/p>
&lt;p>兩個推論直接影響 review 流程：review 的 scope 要涵蓋「修法後的產物」、不只「原始內容」；停止判斷不能停在「修完這批」、因為修法本身產生新一批。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼修法引入的是同類變體">為什麼修法引入的是同類變體&lt;/h2>
&lt;p>修法用的是跟原作者同一套文體直覺、同一個對問題的理解。改一個表面實例時，注意力放在「這一處」、而同一個底層成因（重點後置的偏好、某個高頻句型）在別處或下一個變體仍在。修「而是」連接詞、沒動到「重點後置」這個成因，於是「— 是」「不在…而在」這些同成因的近親一個個浮現。補 pattern 也一樣：每補一個連接詞、成因（重點後置）沒被判準收斂、下一個連接詞的變體就漏。&lt;/p>
&lt;p>這跟全新違規不同：全新違規是不同成因，同類變體是同一成因的不同表面。修法最容易產生後者——因為修的人盯著表面、放過成因。&lt;/p>
&lt;hr>
&lt;h2 id="這次的實證同一批-retrospective-反覆出現">這次的實證（同一批 retrospective 反覆出現）&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>修法動作&lt;/th>
 &lt;th>引入 / 暴露的同類變體&lt;/th>
 &lt;th>誰抓到&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Round 1 修字句層&lt;/td>
 &lt;td>Round 2 抓到新引入的跨 surface 近逐字&lt;/td>
 &lt;td>下一輪不同 frame&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Round 3 修 80/20 段&lt;/td>
 &lt;td>Round 4 抓到修法又植入一處新近逐字&lt;/td>
 &lt;td>下一輪 frame&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>補 POS pattern「而是」&lt;/td>
 &lt;td>漏「不是 X — 是 Y」&lt;/td>
 &lt;td>人複核&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>補「— 是」變體&lt;/td>
 &lt;td>漏「不在 X、而在 Y」&lt;/td>
 &lt;td>對抗文體 agent&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>補「不在…而在」&lt;/td>
 &lt;td>漏「不是 X、是 Y」頓號版&lt;/td>
 &lt;td>人複核&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>修觸發句「不是二元、而是有深度」（三 surface）&lt;/td>
 &lt;td>漏第 2 觸發句「不是吹噓技術 — 是…」（不同連接詞變體）&lt;/td>
 &lt;td>人複核&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>每一次修法都暴露下一個同類變體。POS pattern 的連接詞清單擴了兩次（而是 → 加「— 是」→ 加「不在…而在」）、每次擴完就暴露下一個變體、第四個「、是」頓號版發現後決定不補——這正是「打地鼠」：表面層追不上成因層。&lt;/p>
&lt;hr>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;h3 id="review-scope-涵蓋修法產物">review scope 涵蓋修法產物&lt;/h3>
&lt;p>修完一批不假設它乾淨。修法產物要重新過一次同樣的 frame——尤其修的是「會引入同類變體」的改寫或規則。這是 &lt;a href="../multi-pass-scope-must-cover-risk-zone/">#95&lt;/a>「scope 蓋同類風險區」的時間軸延伸：修法後的產物也是同類風險區、且是剛產生的。&lt;/p>
&lt;h3 id="同類變體靠判準收斂不靠窮舉">同類變體靠判準收斂、不靠窮舉&lt;/h3>
&lt;p>成因層的判準（&lt;a href="../lead-with-the-point-cross-language/">#166&lt;/a> 的「核心概念在不在最前」）一次涵蓋所有連接詞變體；表面層的 pattern 永遠枚舉不完（擴兩次仍冒出第四個變體）。所以工具鏈的 pattern 定位是「曝光候選」、收斂靠判準——pattern 漏一個變體只是讓候選 silent、判準仍能在人讀到時抓出。有些變體（「、是」頓號版）誤判率高、刻意不補進 pattern、正是「判準優於窮舉」的活證明。&lt;/p>
&lt;h3 id="停止判斷含修法產物">停止判斷含修法產物&lt;/h3>
&lt;p>「修完這批違規」不是停止訊號。修法產生新一批、停止判斷要看「frame 涵蓋 + 判準到位」（&lt;a href="../cross-round-review-stopping-signal/">#148&lt;/a> 的延伸）、不看「這批修完了」。&lt;/p>
&lt;hr>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;h3 id="修完回報-clean新引入的違規-silent">修完回報 clean、新引入的違規 silent&lt;/h3>
&lt;p>修法後直接回報「修好了」、不重審修法產物——新引入的同類變體帶著「已修」標籤留下。這次 Round 2 / Round 4 抓到的、都是前一輪「修完回報 clean」後才被下一輪 frame 揭出的。&lt;/p>
&lt;h3 id="補-pattern-永遠追不上變體">補 pattern 永遠追不上變體&lt;/h3>
&lt;p>把希望放在「補完所有 pattern 變體」上、就會無限打地鼠——每補一個、下一個浮現。連接詞清單擴兩次仍冒出第四個變體（「、是」），證明表面層的窮舉追不上成因層。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="../lead-with-the-point-cross-language/">#166 重點優先陳述是跨語言的資訊結構原則&lt;/a>&lt;/strong>：#166 講「句型 grep 枚舉不完、判準是重點位置」（靜態原則），本卡是它的過程面——修法 / 補 pattern 的動作會反覆暴露同類變體，正是「枚舉不完」在 remediation 過程的動態展現。#166 self-case 記了完整的 pattern 連接詞擴展軌跡。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../multi-pass-scope-must-cover-risk-zone/">#95 Multi-pass review scope 要蓋同類風險區&lt;/a>&lt;/strong>：#95 是空間軸（同類違規分布整個 corpus），本卡是時間軸（修法後的產物是剛產生的同類風險區）——兩個一起才是完整 scope：橫向蓋 corpus、縱向蓋修法產物。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../review-miss-diagnose-design-vs-execution-gap/">#153 Review 漏抓先分 design gap 與 execution gap&lt;/a>&lt;/strong>：本卡補一類 gap 的來源——修法本身引入的新 gap。修法後沒重審，是把「修法產物」排除在 scope 外的 execution gap。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../cross-round-review-stopping-signal/">#148 跨輪 review 停止訊號是 frame 涵蓋&lt;/a>&lt;/strong>：本卡補「修法產生新批」這個維度——停止判斷不能停在「修完這批」、要含修法產物的重審。&lt;/li>
&lt;li>&lt;strong>&lt;a href="../keyword-bank-hit-is-candidate-not-verdict/">#149 keyword bank 命中是候選、不是判決&lt;/a>&lt;/strong>：補 pattern 抓變體是偵測層、收斂靠判準是判定層——本卡的「靠判準不靠窮舉」是 #149「判定優先」在 remediation 的應用。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>徵兆&lt;/th>
 &lt;th>該做的行動&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>剛修完一批就回報「clean / 修好了」&lt;/td>
 &lt;td>停 —— 修法產物還沒重審、新引入的同類變體可能 silent&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>修的是「同一類問題」（批量改寫 / 補規則 / 改 pattern）&lt;/td>
 &lt;td>預期它引入同類變體、修完重掃同類、別假設乾淨&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>補 pattern / 規則後沒重掃同類風險區&lt;/td>
 &lt;td>補完只解了已知變體、下一個變體要靠重掃或判準 catch&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>把希望放在「補完所有 pattern 變體」&lt;/td>
 &lt;td>打地鼠訊號 —— 表面層追不上成因、回到判準（成因層）收斂&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>停止判斷的理由是「這批修完了」&lt;/td>
 &lt;td>不是停止訊號 —— 修法產生新批、看 frame 涵蓋 + 判準到位&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="適用範圍與邊界">適用範圍與邊界&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>適用&lt;/strong>：批量改寫違規、補 lint 規則 / pattern、multi-round-review 的修法階段、任何「修一類問題」的 remediation。&lt;/li>
&lt;li>&lt;strong>不適用&lt;/strong>：修單一孤立 bug（無同類變體、修完即止）；確定性違規的工具鏈修法（emoji / broken link，補一條規則就窮舉完、無成因層變體）。&lt;/li>
&lt;li>&lt;strong>邊界&lt;/strong>：「修法引入同類變體」不等於「不該修」——該修、但修完要把修法產物納入下一輪 scope，且收斂靠成因層判準不靠表面窮舉。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源&lt;/h2>
&lt;p>本卡抽自一次 backend + skill 的 register 違規 retrospective。整個過程是一連串修法、每次修法都暴露下一個同類變體：四輪 multi-round-review 每輪修完、下一輪不同 frame 都抓到前輪修法引入的新近逐字；POS-negation-lead pattern 的連接詞清單擴了兩次（而是 → 加「— 是」→ 加「不在…而在」）、每次擴完就暴露下一個變體、第四個「、是」頓號版發現後決定不補；修第 1 觸發句「不是二元、而是有深度」後、漏了第 2 觸發句「不是吹噓技術 — 是…」（不同連接詞變體），由使用者複核才抓到。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>修法是新違規的來源。改寫一個違規句、補一條 lint 規則、改一個 pattern——這些動作本身會引入新問題，而且引入的常是同一類問題的變體：修掉「不是 X、而是 Y」、就暴露「不是 X — 是 Y」；補一條 pattern 抓某變體、下一個變體又漏。</p>
<p>兩個推論直接影響 review 流程：review 的 scope 要涵蓋「修法後的產物」、不只「原始內容」；停止判斷不能停在「修完這批」、因為修法本身產生新一批。</p>
<hr>
<h2 id="為什麼修法引入的是同類變體">為什麼修法引入的是同類變體</h2>
<p>修法用的是跟原作者同一套文體直覺、同一個對問題的理解。改一個表面實例時，注意力放在「這一處」、而同一個底層成因（重點後置的偏好、某個高頻句型）在別處或下一個變體仍在。修「而是」連接詞、沒動到「重點後置」這個成因，於是「— 是」「不在…而在」這些同成因的近親一個個浮現。補 pattern 也一樣：每補一個連接詞、成因（重點後置）沒被判準收斂、下一個連接詞的變體就漏。</p>
<p>這跟全新違規不同：全新違規是不同成因，同類變體是同一成因的不同表面。修法最容易產生後者——因為修的人盯著表面、放過成因。</p>
<hr>
<h2 id="這次的實證同一批-retrospective-反覆出現">這次的實證（同一批 retrospective 反覆出現）</h2>
<table>
  <thead>
      <tr>
          <th>修法動作</th>
          <th>引入 / 暴露的同類變體</th>
          <th>誰抓到</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Round 1 修字句層</td>
          <td>Round 2 抓到新引入的跨 surface 近逐字</td>
          <td>下一輪不同 frame</td>
      </tr>
      <tr>
          <td>Round 3 修 80/20 段</td>
          <td>Round 4 抓到修法又植入一處新近逐字</td>
          <td>下一輪 frame</td>
      </tr>
      <tr>
          <td>補 POS pattern「而是」</td>
          <td>漏「不是 X — 是 Y」</td>
          <td>人複核</td>
      </tr>
      <tr>
          <td>補「— 是」變體</td>
          <td>漏「不在 X、而在 Y」</td>
          <td>對抗文體 agent</td>
      </tr>
      <tr>
          <td>補「不在…而在」</td>
          <td>漏「不是 X、是 Y」頓號版</td>
          <td>人複核</td>
      </tr>
      <tr>
          <td>修觸發句「不是二元、而是有深度」（三 surface）</td>
          <td>漏第 2 觸發句「不是吹噓技術 — 是…」（不同連接詞變體）</td>
          <td>人複核</td>
      </tr>
  </tbody>
</table>
<p>每一次修法都暴露下一個同類變體。POS pattern 的連接詞清單擴了兩次（而是 → 加「— 是」→ 加「不在…而在」）、每次擴完就暴露下一個變體、第四個「、是」頓號版發現後決定不補——這正是「打地鼠」：表面層追不上成因層。</p>
<hr>
<h2 id="理想做法">理想做法</h2>
<h3 id="review-scope-涵蓋修法產物">review scope 涵蓋修法產物</h3>
<p>修完一批不假設它乾淨。修法產物要重新過一次同樣的 frame——尤其修的是「會引入同類變體」的改寫或規則。這是 <a href="../multi-pass-scope-must-cover-risk-zone/">#95</a>「scope 蓋同類風險區」的時間軸延伸：修法後的產物也是同類風險區、且是剛產生的。</p>
<h3 id="同類變體靠判準收斂不靠窮舉">同類變體靠判準收斂、不靠窮舉</h3>
<p>成因層的判準（<a href="../lead-with-the-point-cross-language/">#166</a> 的「核心概念在不在最前」）一次涵蓋所有連接詞變體；表面層的 pattern 永遠枚舉不完（擴兩次仍冒出第四個變體）。所以工具鏈的 pattern 定位是「曝光候選」、收斂靠判準——pattern 漏一個變體只是讓候選 silent、判準仍能在人讀到時抓出。有些變體（「、是」頓號版）誤判率高、刻意不補進 pattern、正是「判準優於窮舉」的活證明。</p>
<h3 id="停止判斷含修法產物">停止判斷含修法產物</h3>
<p>「修完這批違規」不是停止訊號。修法產生新一批、停止判斷要看「frame 涵蓋 + 判準到位」（<a href="../cross-round-review-stopping-signal/">#148</a> 的延伸）、不看「這批修完了」。</p>
<hr>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<h3 id="修完回報-clean新引入的違規-silent">修完回報 clean、新引入的違規 silent</h3>
<p>修法後直接回報「修好了」、不重審修法產物——新引入的同類變體帶著「已修」標籤留下。這次 Round 2 / Round 4 抓到的、都是前一輪「修完回報 clean」後才被下一輪 frame 揭出的。</p>
<h3 id="補-pattern-永遠追不上變體">補 pattern 永遠追不上變體</h3>
<p>把希望放在「補完所有 pattern 變體」上、就會無限打地鼠——每補一個、下一個浮現。連接詞清單擴兩次仍冒出第四個變體（「、是」），證明表面層的窮舉追不上成因層。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><strong><a href="../lead-with-the-point-cross-language/">#166 重點優先陳述是跨語言的資訊結構原則</a></strong>：#166 講「句型 grep 枚舉不完、判準是重點位置」（靜態原則），本卡是它的過程面——修法 / 補 pattern 的動作會反覆暴露同類變體，正是「枚舉不完」在 remediation 過程的動態展現。#166 self-case 記了完整的 pattern 連接詞擴展軌跡。</li>
<li><strong><a href="../multi-pass-scope-must-cover-risk-zone/">#95 Multi-pass review scope 要蓋同類風險區</a></strong>：#95 是空間軸（同類違規分布整個 corpus），本卡是時間軸（修法後的產物是剛產生的同類風險區）——兩個一起才是完整 scope：橫向蓋 corpus、縱向蓋修法產物。</li>
<li><strong><a href="../review-miss-diagnose-design-vs-execution-gap/">#153 Review 漏抓先分 design gap 與 execution gap</a></strong>：本卡補一類 gap 的來源——修法本身引入的新 gap。修法後沒重審，是把「修法產物」排除在 scope 外的 execution gap。</li>
<li><strong><a href="../cross-round-review-stopping-signal/">#148 跨輪 review 停止訊號是 frame 涵蓋</a></strong>：本卡補「修法產生新批」這個維度——停止判斷不能停在「修完這批」、要含修法產物的重審。</li>
<li><strong><a href="../keyword-bank-hit-is-candidate-not-verdict/">#149 keyword bank 命中是候選、不是判決</a></strong>：補 pattern 抓變體是偵測層、收斂靠判準是判定層——本卡的「靠判準不靠窮舉」是 #149「判定優先」在 remediation 的應用。</li>
</ul>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>該做的行動</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>剛修完一批就回報「clean / 修好了」</td>
          <td>停 —— 修法產物還沒重審、新引入的同類變體可能 silent</td>
      </tr>
      <tr>
          <td>修的是「同一類問題」（批量改寫 / 補規則 / 改 pattern）</td>
          <td>預期它引入同類變體、修完重掃同類、別假設乾淨</td>
      </tr>
      <tr>
          <td>補 pattern / 規則後沒重掃同類風險區</td>
          <td>補完只解了已知變體、下一個變體要靠重掃或判準 catch</td>
      </tr>
      <tr>
          <td>把希望放在「補完所有 pattern 變體」</td>
          <td>打地鼠訊號 —— 表面層追不上成因、回到判準（成因層）收斂</td>
      </tr>
      <tr>
          <td>停止判斷的理由是「這批修完了」</td>
          <td>不是停止訊號 —— 修法產生新批、看 frame 涵蓋 + 判準到位</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="適用範圍與邊界">適用範圍與邊界</h2>
<ul>
<li><strong>適用</strong>：批量改寫違規、補 lint 規則 / pattern、multi-round-review 的修法階段、任何「修一類問題」的 remediation。</li>
<li><strong>不適用</strong>：修單一孤立 bug（無同類變體、修完即止）；確定性違規的工具鏈修法（emoji / broken link，補一條規則就窮舉完、無成因層變體）。</li>
<li><strong>邊界</strong>：「修法引入同類變體」不等於「不該修」——該修、但修完要把修法產物納入下一輪 scope，且收斂靠成因層判準不靠表面窮舉。</li>
</ul>
<hr>
<h2 id="self-case本卡的觸發來源">Self-case：本卡的觸發來源</h2>
<p>本卡抽自一次 backend + skill 的 register 違規 retrospective。整個過程是一連串修法、每次修法都暴露下一個同類變體：四輪 multi-round-review 每輪修完、下一輪不同 frame 都抓到前輪修法引入的新近逐字；POS-negation-lead pattern 的連接詞清單擴了兩次（而是 → 加「— 是」→ 加「不在…而在」）、每次擴完就暴露下一個變體、第四個「、是」頓號版發現後決定不補；修第 1 觸發句「不是二元、而是有深度」後、漏了第 2 觸發句「不是吹噓技術 — 是…」（不同連接詞變體），由使用者複核才抓到。</p>
<p>這條軌跡共同指向一個教訓：修法是新違規的來源、且引入的是同類變體；表面層的 pattern 窮舉追不上成因層、收斂要靠判準（<a href="../lead-with-the-point-cross-language/">#166</a> 的重點位置）、review scope 要把修法產物納進來。</p>
]]></content:encoded></item><item><title>多輪審查要有冷讀者 frame：知情 reviewer 看不見行話洩漏</title><link>https://tarrragon.github.io/blog/report/cold-reader-frame-vs-informed-reviewer/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/cold-reader-frame-vs-informed-reviewer/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡是一次 multi-round-review 漏抓的 self-retrospective 抽出。限制：樣本為 1 次 review（til/terms 14 卡），「知情 vs 冷讀」二分基於單次觀察；修法（補冷讀 frame）的有效性已由同批內容的後續冷讀驗證初步確認，但未跨多批驗證。讀者把它當「review 讀者模擬的一個必查維度」，不當已驗證流程。&lt;/p>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>多輪審查模擬讀者時，要區分兩種讀者，分開跑：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>知情讀者（旅程 frame）&lt;/strong>：讀完全部、依學習路線走，看入口判讀與內容門檻。&lt;/li>
&lt;li>&lt;strong>冷讀者（零脈絡單卡落地 frame）&lt;/strong>：假裝經搜尋或他人貼連結，直接落在單一篇章，沒讀過其他篇與索引。&lt;/li>
&lt;/ul>
&lt;p>關鍵差別：&lt;strong>知情 reviewer 會自動腦補脈絡，因此結構性看不見「洩漏撰寫者預設前提的行話」&lt;/strong>——未定義就出現的「家族」「上述」「如前所述」「本文前面提到」。只有零脈絡冷讀者會立刻問「這裡突然冒出的 X 是什麼」。&lt;/p>
&lt;p>原子化 / Zettelkasten / glossary / 任何可被直連或搜尋單獨抵達的內容，冷讀 frame 為必備，不可只靠旅程 frame。&lt;/p>
&lt;h2 id="情境">情境&lt;/h2>
&lt;p>til/terms 是一組 14 張互連的術語卡。經 3 輪多輪審查（含「讀者旅程」frame），三個 reviewer 全給 A、零必修。但每張卡都用「連到家族 / 概念家族」這個只有撰寫者懂的詞——讀者從搜尋落在單卡時，根本不知「家族」指什麼。知情 reviewer 讀完全部後腦補了「這是一組詞」，沒察覺這個洩漏。&lt;/p>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;p>把 Reader simulation 拆成兩個子 frame：旅程（知情讀者走路線）與冷讀落地（單卡零脈絡）。冷讀 frame 逐篇問三件事：我知道為何讀這篇嗎？有沒有未在本篇定義的預設脈絡詞？我能不能從這篇找到回路？原子內容兩個 frame 都要跑。&lt;/p>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;p>只跑旅程 frame，知情 reviewer 全 A 放行，行話會留到讀者冷讀單卡時才卡住——而那時內容已發佈，回報後得回頭改全部卡。把「讀完全部的 reviewer 覺得通順」當成「冷讀者也通順」，是把 informed 的腦補誤當成內容自包含。&lt;/p>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>內容是原子 / 可被搜尋或直連單篇落地（術語卡、glossary、知識卡）。&lt;/li>
&lt;li>reviewer 是「讀完全部」才判讀旅程，沒人模擬「只讀這一篇」。&lt;/li>
&lt;li>文中出現「家族 / 本盒 / 上述 / 如前所述 / 前面提到」這類需要前文才懂的詞。&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>本檢討已回饋到 multi-round-review skill（Round 2 新增 B′ 冷讀 frame）。寫作順序上 skill 修改先於本報告，屬例外；正序是報告（來源）→ skill 改進 → 下游。&lt;/p>&lt;/blockquote></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡是一次 multi-round-review 漏抓的 self-retrospective 抽出。限制：樣本為 1 次 review（til/terms 14 卡），「知情 vs 冷讀」二分基於單次觀察；修法（補冷讀 frame）的有效性已由同批內容的後續冷讀驗證初步確認，但未跨多批驗證。讀者把它當「review 讀者模擬的一個必查維度」，不當已驗證流程。</p>
<h2 id="核心原則">核心原則</h2>
<p>多輪審查模擬讀者時，要區分兩種讀者，分開跑：</p>
<ul>
<li><strong>知情讀者（旅程 frame）</strong>：讀完全部、依學習路線走，看入口判讀與內容門檻。</li>
<li><strong>冷讀者（零脈絡單卡落地 frame）</strong>：假裝經搜尋或他人貼連結，直接落在單一篇章，沒讀過其他篇與索引。</li>
</ul>
<p>關鍵差別：<strong>知情 reviewer 會自動腦補脈絡，因此結構性看不見「洩漏撰寫者預設前提的行話」</strong>——未定義就出現的「家族」「上述」「如前所述」「本文前面提到」。只有零脈絡冷讀者會立刻問「這裡突然冒出的 X 是什麼」。</p>
<p>原子化 / Zettelkasten / glossary / 任何可被直連或搜尋單獨抵達的內容，冷讀 frame 為必備，不可只靠旅程 frame。</p>
<h2 id="情境">情境</h2>
<p>til/terms 是一組 14 張互連的術語卡。經 3 輪多輪審查（含「讀者旅程」frame），三個 reviewer 全給 A、零必修。但每張卡都用「連到家族 / 概念家族」這個只有撰寫者懂的詞——讀者從搜尋落在單卡時，根本不知「家族」指什麼。知情 reviewer 讀完全部後腦補了「這是一組詞」，沒察覺這個洩漏。</p>
<h2 id="理想做法">理想做法</h2>
<p>把 Reader simulation 拆成兩個子 frame：旅程（知情讀者走路線）與冷讀落地（單卡零脈絡）。冷讀 frame 逐篇問三件事：我知道為何讀這篇嗎？有沒有未在本篇定義的預設脈絡詞？我能不能從這篇找到回路？原子內容兩個 frame 都要跑。</p>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<p>只跑旅程 frame，知情 reviewer 全 A 放行，行話會留到讀者冷讀單卡時才卡住——而那時內容已發佈，回報後得回頭改全部卡。把「讀完全部的 reviewer 覺得通順」當成「冷讀者也通順」，是把 informed 的腦補誤當成內容自包含。</p>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>內容是原子 / 可被搜尋或直連單篇落地（術語卡、glossary、知識卡）。</li>
<li>reviewer 是「讀完全部」才判讀旅程，沒人模擬「只讀這一篇」。</li>
<li>文中出現「家族 / 本盒 / 上述 / 如前所述 / 前面提到」這類需要前文才懂的詞。</li>
</ul>
<blockquote>
<p>本檢討已回饋到 multi-round-review skill（Round 2 新增 B′ 冷讀 frame）。寫作順序上 skill 修改先於本報告，屬例外；正序是報告（來源）→ skill 改進 → 下游。</p></blockquote>
]]></content:encoded></item><item><title>多輪審查缺 outside-in 讀者 frame：六個系統性盲點</title><link>https://tarrragon.github.io/blog/report/review-lacks-outside-in-reader-frames/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/review-lacks-outside-in-reader-frames/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡抽自 infra 教學模組的完整生產週期 retrospective。43 篇文章 + 21 張知識卡經歷三輪多輪審查（compliance / cadence+冷讀 / steelman+outbound），審查通過後使用者連續指出六個 review 未 catch 的問題，每個都導致大量修改。限制：evidence 來自單一教學模組的一次完整週期，盲點清單可能不窮盡。&lt;/p>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>多輪審查框架的所有 frame 從「已寫的內容」出發（inside-out）：字句層看已寫的字、cadence 看已寫的結構、fact-check 看已寫的事實、steelman 看已寫的論述。缺的是從「讀者的完整需求」出發的 frame（outside-in）：讀者是誰、讀者從哪裡來、讀者讀完後要做什麼、讀者搜尋什麼問題。&lt;/p>
&lt;p>inside-out 能保證已寫內容的品質，outside-in 才能發現「應該寫但沒寫」的缺口。兩者的盲區正交：inside-out 的盲區是缺口（看不到不存在的東西），outside-in 的盲區是細節（看不到已寫內容的字句問題）。完整的審查需要兩者交替。&lt;/p>
&lt;h2 id="六個盲點">六個盲點&lt;/h2>
&lt;h3 id="一宣導語氣通過三輪審查">一：宣導語氣通過三輪審查&lt;/h3>
&lt;p>三輪審查判定文章 clean，使用者指出「一台機器跑得好好的」「辦公大樓比喻」是對專業讀者的失配後，14 處需要重寫。&lt;/p>
&lt;p>keyword bank 的設計對象是字面違規。宣導語氣的問題在 register——用教導外行人的姿態對專業人士說話，字面上每個字都合規。reviewer 跟作者共享同一套文體直覺，都覺得「用故事帶入」是好的教學手法，同源盲區讓整批宣導語氣被合理化放行。&lt;/p>
&lt;p>缺的 frame：&lt;strong>reader-persona register 適配&lt;/strong>——指定具體讀者角色，問「這個人讀到這段會覺得被低估嗎」。&lt;/p>
&lt;h3 id="二管理層彙報資訊缺失">二：管理層彙報資訊缺失&lt;/h3>
&lt;p>所有 reviewer 檢查了技術正確性和寫作規範，沒有一個問「讀者讀完後能不能跟老闆說明為什麼要做、要花多久」。使用者提出後掃描出 10 處成本/時程缺口。&lt;/p>
&lt;p>review frame 全部從「內容品質」出發，沒有從「讀者的下游任務」出發。技術文章的讀者不只要「學會怎麼做」，還要「能向上彙報為什麼做」——後者是讀者的工作流程，品質導向的 review 結構性看不到。&lt;/p>
&lt;p>缺的 frame：&lt;strong>downstream-task 審查&lt;/strong>——問「讀者讀完後的下一個動作是什麼？他需要什麼素材？」&lt;/p>
&lt;h3 id="三接手-vs-自建是不同情境">三：接手 vs 自建是不同情境&lt;/h3>
&lt;p>模組負一定位為「還沒有 infra 的手動環境」，所有 reviewer 都接受了這個前提。使用者指出「接手前人的專案」是完全不同的操作情境後，獨立成一個橫切模組。&lt;/p>
&lt;p>review 的 scope 是「已寫的內容對不對」，不質疑結構本身的覆蓋範圍。steelman reviewer 問的是已有文章的論述有沒有漏洞，不是教材的讀者群有沒有被遺漏的情境。&lt;/p>
&lt;p>缺的 frame：&lt;strong>persona-coverage 審查&lt;/strong>——列出目標讀者可能進入教材的情境，檢查每個情境是否有對應入口。&lt;/p>
&lt;h3 id="四操作步驟缺工具指引">四：操作步驟缺工具指引&lt;/h3>
&lt;p>文章寫「拍下現況」「匯出資料庫」，reviewer 確認了邏輯正確性。使用者問「用什麼拍？怎麼拍？」後才發現停在 WHAT 層、沒到 HOW WITH WHAT 層。&lt;/p>
&lt;p>fact-check reviewer 驗證「描述是否正確」，不是「描述是否可執行」。「用 FTP 下載整站存進 Git」事實正確，但讀者照做時需要知道用哪個 FTP client、大檔案怎麼處理。&lt;/p>
&lt;p>缺的 frame：&lt;strong>executable-walkthrough 審查&lt;/strong>——假裝讀者從零照做，每步問「下一個動作是打開什麼軟體、輸入什麼指令」。&lt;/p>
&lt;h3 id="五概覽級深度不拆分">五：概覽級深度不拆分&lt;/h3>
&lt;p>350 行文章涵蓋四個面向，reviewer 認為「結構完整」。使用者指出「資料庫備份和安全管理其實都是大問題」後拆成 5 篇。後續又在 8 個模組發生同樣的拆分。&lt;/p>
&lt;p>reviewer 評估「這篇文章本身好不好」，不是「搜尋特定問題的讀者能不能找到足夠深度的內容」。一篇涵蓋四面向的文章通讀體驗良好，但搜尋「共享主機 MySQL 備份」的讀者需要專題文章。&lt;/p>
&lt;p>缺的 frame：&lt;strong>search-landing 審查&lt;/strong>——列出讀者可能搜尋的具體問題，檢查每個問題能不能落在聚焦的文章上。跟 cold-read (B&amp;rsquo;) 相關但不同——B&amp;rsquo; 看「落地後讀不讀得懂」，這裡看「能不能落地到足夠聚焦的內容」。&lt;/p>
&lt;h3 id="六讀者定位未預設">六：讀者定位未預設&lt;/h3>
&lt;p>「讀者是缺經驗的專業人士」這個原則在文章寫完、審查完、使用者反饋後才抽出來。它影響了語氣、比喻策略、管理層溝通——幾乎所有後續大修都源自這個原則。但它不在任何 reviewer prompt 裡。&lt;/p>
&lt;p>寫作規範定義了「怎麼寫」的規則，沒有定義「寫給誰」——讀者定位被當成隱性決定。LLM 預設用「教外行人」的姿態寫教學內容，這個預設不被 review 挑戰，因為 reviewer 也共享同一個預設。&lt;/p>
&lt;p>這不是 review frame 的問題——是&lt;strong>生成端的前提缺失&lt;/strong>。每個教學模組在第一篇文章生成前就應該顯式聲明讀者定位。&lt;/p>
&lt;h2 id="理想做法">理想做法&lt;/h2>
&lt;p>在現有 inside-out review 框架之外，補五個 outside-in frame：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Frame&lt;/th>
 &lt;th>問什麼&lt;/th>
 &lt;th>在哪個 Round 跑&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Reader persona + register&lt;/td>
 &lt;td>讀者讀到這段會覺得被低估嗎？&lt;/td>
 &lt;td>Round 2（讀者旅程）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Downstream task&lt;/td>
 &lt;td>讀者讀完後要做什麼、需要什麼素材？&lt;/td>
 &lt;td>Round 1（基線 audit）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Persona coverage&lt;/td>
 &lt;td>所有讀者情境都有入口嗎？&lt;/td>
 &lt;td>Round 3（outbound）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Executable walkthrough&lt;/td>
 &lt;td>讀者能從零照做嗎？每步的工具在嗎？&lt;/td>
 &lt;td>Round 2（操作型文章專用）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Search landing&lt;/td>
 &lt;td>搜尋特定問題能落在聚焦文章嗎？&lt;/td>
 &lt;td>Round 3（outbound）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>生成端的修正：每個教學模組在撰寫前顯式聲明「讀者定位文件」（一段話描述目標讀者的背景、已有能力、缺的經驗），讓生成和 review 都有可檢查的基準。&lt;/p>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;p>六個盲點的修法總工程量遠超預防成本：14 處宣導語氣重寫 + 10 處管理層資訊補充 + 11 篇接手維運新文章 + 全模組工具補充 + 12 篇子文章拆分 + 3 篇入門/溝通層重寫。如果讀者定位在第一篇文章前就聲明、outside-in frame 在 Round 1 就跑，多數修改可以在初稿階段就避免。&lt;/p>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;p>review 完成後如果使用者的第一個反饋是關於「內容缺口」而非「內容品質」，代表 review 框架偏向 inside-out。inside-out 的 review 報告 clean 只代表「已寫的內容沒問題」，不代表「該寫的都寫了」。&lt;/p></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>本卡抽自 infra 教學模組的完整生產週期 retrospective。43 篇文章 + 21 張知識卡經歷三輪多輪審查（compliance / cadence+冷讀 / steelman+outbound），審查通過後使用者連續指出六個 review 未 catch 的問題，每個都導致大量修改。限制：evidence 來自單一教學模組的一次完整週期，盲點清單可能不窮盡。</p>
<h2 id="核心原則">核心原則</h2>
<p>多輪審查框架的所有 frame 從「已寫的內容」出發（inside-out）：字句層看已寫的字、cadence 看已寫的結構、fact-check 看已寫的事實、steelman 看已寫的論述。缺的是從「讀者的完整需求」出發的 frame（outside-in）：讀者是誰、讀者從哪裡來、讀者讀完後要做什麼、讀者搜尋什麼問題。</p>
<p>inside-out 能保證已寫內容的品質，outside-in 才能發現「應該寫但沒寫」的缺口。兩者的盲區正交：inside-out 的盲區是缺口（看不到不存在的東西），outside-in 的盲區是細節（看不到已寫內容的字句問題）。完整的審查需要兩者交替。</p>
<h2 id="六個盲點">六個盲點</h2>
<h3 id="一宣導語氣通過三輪審查">一：宣導語氣通過三輪審查</h3>
<p>三輪審查判定文章 clean，使用者指出「一台機器跑得好好的」「辦公大樓比喻」是對專業讀者的失配後，14 處需要重寫。</p>
<p>keyword bank 的設計對象是字面違規。宣導語氣的問題在 register——用教導外行人的姿態對專業人士說話，字面上每個字都合規。reviewer 跟作者共享同一套文體直覺，都覺得「用故事帶入」是好的教學手法，同源盲區讓整批宣導語氣被合理化放行。</p>
<p>缺的 frame：<strong>reader-persona register 適配</strong>——指定具體讀者角色，問「這個人讀到這段會覺得被低估嗎」。</p>
<h3 id="二管理層彙報資訊缺失">二：管理層彙報資訊缺失</h3>
<p>所有 reviewer 檢查了技術正確性和寫作規範，沒有一個問「讀者讀完後能不能跟老闆說明為什麼要做、要花多久」。使用者提出後掃描出 10 處成本/時程缺口。</p>
<p>review frame 全部從「內容品質」出發，沒有從「讀者的下游任務」出發。技術文章的讀者不只要「學會怎麼做」，還要「能向上彙報為什麼做」——後者是讀者的工作流程，品質導向的 review 結構性看不到。</p>
<p>缺的 frame：<strong>downstream-task 審查</strong>——問「讀者讀完後的下一個動作是什麼？他需要什麼素材？」</p>
<h3 id="三接手-vs-自建是不同情境">三：接手 vs 自建是不同情境</h3>
<p>模組負一定位為「還沒有 infra 的手動環境」，所有 reviewer 都接受了這個前提。使用者指出「接手前人的專案」是完全不同的操作情境後，獨立成一個橫切模組。</p>
<p>review 的 scope 是「已寫的內容對不對」，不質疑結構本身的覆蓋範圍。steelman reviewer 問的是已有文章的論述有沒有漏洞，不是教材的讀者群有沒有被遺漏的情境。</p>
<p>缺的 frame：<strong>persona-coverage 審查</strong>——列出目標讀者可能進入教材的情境，檢查每個情境是否有對應入口。</p>
<h3 id="四操作步驟缺工具指引">四：操作步驟缺工具指引</h3>
<p>文章寫「拍下現況」「匯出資料庫」，reviewer 確認了邏輯正確性。使用者問「用什麼拍？怎麼拍？」後才發現停在 WHAT 層、沒到 HOW WITH WHAT 層。</p>
<p>fact-check reviewer 驗證「描述是否正確」，不是「描述是否可執行」。「用 FTP 下載整站存進 Git」事實正確，但讀者照做時需要知道用哪個 FTP client、大檔案怎麼處理。</p>
<p>缺的 frame：<strong>executable-walkthrough 審查</strong>——假裝讀者從零照做，每步問「下一個動作是打開什麼軟體、輸入什麼指令」。</p>
<h3 id="五概覽級深度不拆分">五：概覽級深度不拆分</h3>
<p>350 行文章涵蓋四個面向，reviewer 認為「結構完整」。使用者指出「資料庫備份和安全管理其實都是大問題」後拆成 5 篇。後續又在 8 個模組發生同樣的拆分。</p>
<p>reviewer 評估「這篇文章本身好不好」，不是「搜尋特定問題的讀者能不能找到足夠深度的內容」。一篇涵蓋四面向的文章通讀體驗良好，但搜尋「共享主機 MySQL 備份」的讀者需要專題文章。</p>
<p>缺的 frame：<strong>search-landing 審查</strong>——列出讀者可能搜尋的具體問題，檢查每個問題能不能落在聚焦的文章上。跟 cold-read (B&rsquo;) 相關但不同——B&rsquo; 看「落地後讀不讀得懂」，這裡看「能不能落地到足夠聚焦的內容」。</p>
<h3 id="六讀者定位未預設">六：讀者定位未預設</h3>
<p>「讀者是缺經驗的專業人士」這個原則在文章寫完、審查完、使用者反饋後才抽出來。它影響了語氣、比喻策略、管理層溝通——幾乎所有後續大修都源自這個原則。但它不在任何 reviewer prompt 裡。</p>
<p>寫作規範定義了「怎麼寫」的規則，沒有定義「寫給誰」——讀者定位被當成隱性決定。LLM 預設用「教外行人」的姿態寫教學內容，這個預設不被 review 挑戰，因為 reviewer 也共享同一個預設。</p>
<p>這不是 review frame 的問題——是<strong>生成端的前提缺失</strong>。每個教學模組在第一篇文章生成前就應該顯式聲明讀者定位。</p>
<h2 id="理想做法">理想做法</h2>
<p>在現有 inside-out review 框架之外，補五個 outside-in frame：</p>
<table>
  <thead>
      <tr>
          <th>Frame</th>
          <th>問什麼</th>
          <th>在哪個 Round 跑</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Reader persona + register</td>
          <td>讀者讀到這段會覺得被低估嗎？</td>
          <td>Round 2（讀者旅程）</td>
      </tr>
      <tr>
          <td>Downstream task</td>
          <td>讀者讀完後要做什麼、需要什麼素材？</td>
          <td>Round 1（基線 audit）</td>
      </tr>
      <tr>
          <td>Persona coverage</td>
          <td>所有讀者情境都有入口嗎？</td>
          <td>Round 3（outbound）</td>
      </tr>
      <tr>
          <td>Executable walkthrough</td>
          <td>讀者能從零照做嗎？每步的工具在嗎？</td>
          <td>Round 2（操作型文章專用）</td>
      </tr>
      <tr>
          <td>Search landing</td>
          <td>搜尋特定問題能落在聚焦文章嗎？</td>
          <td>Round 3（outbound）</td>
      </tr>
  </tbody>
</table>
<p>生成端的修正：每個教學模組在撰寫前顯式聲明「讀者定位文件」（一段話描述目標讀者的背景、已有能力、缺的經驗），讓生成和 review 都有可檢查的基準。</p>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<p>六個盲點的修法總工程量遠超預防成本：14 處宣導語氣重寫 + 10 處管理層資訊補充 + 11 篇接手維運新文章 + 全模組工具補充 + 12 篇子文章拆分 + 3 篇入門/溝通層重寫。如果讀者定位在第一篇文章前就聲明、outside-in frame 在 Round 1 就跑，多數修改可以在初稿階段就避免。</p>
<h2 id="判讀徵兆">判讀徵兆</h2>
<p>review 完成後如果使用者的第一個反饋是關於「內容缺口」而非「內容品質」，代表 review 框架偏向 inside-out。inside-out 的 review 報告 clean 只代表「已寫的內容沒問題」，不代表「該寫的都寫了」。</p>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li>→ <a href="/blog/report/audience-is-professional-not-layperson/" data-link-title="讀者是缺經驗的專業人士、不是外行人" data-link-desc="技術教材的讀者定位應該是「在這個領域缺乏經驗的專業人士」，不是「完全不懂的外行人」。寫法是補足經驗缺口、不是從零科普。宣導式語氣（跑得好好的、你可能不知道）預設讀者無能，實際上會降低教材的可信度。">讀者是缺經驗的專業人士、不是外行人</a>：盲點一和六的直接修法</li>
<li>→ <a href="/blog/report/technical-content-needs-management-reportable-info/" data-link-title="技術教材要內嵌管理層可彙報的資訊" data-link-desc="技術文章的讀者不只要知道怎麼做，還要能向上彙報為什麼做、花多久、花多少。成本量級、時程估算、進度指標與需簽核的決策點應該嵌在技術段落旁邊，而非集中在另一篇溝通指南裡。">技術教材要內嵌管理層可彙報的資訊</a>：盲點二的直接修法</li>
<li>→ <a href="/blog/report/cross-expertise-communication-scenario-not-analogy/" data-link-title="跨專業溝通用情境遞進、不用比喻堆疊" data-link-desc="向非本領域的專業人士解釋技術議題時，減少術語並從簡單情境遞進到複雜情境，比堆疊比喻有效。比喻傳遞形狀但不傳遞嚴重性；情境遞進讓對方用自己熟悉的決策框架（成本、風險、時間）消化資訊。">跨專業溝通用情境遞進、不用比喻堆疊</a>：盲點一的溝通層修法</li>
<li>→ <a href="/blog/report/cross-round-review-stopping-signal/" data-link-title="跨輪 review 停止訊號是 frame 涵蓋、不是 finding 數遞減" data-link-desc="判斷「該不該再來一輪 review」的訊號是『frame 軸是否還有未動』、不是『上一輪 finding 變少』；多輪 review 的 ROI 不是 monotonically decreasing、而是 frame 切換的質性轉換 — Round N 用新 frame 通常仍會抓出 substantial finding、但內容從 surface compliance 往深層 structural issue 走；停止訊號是「下一輪可用的新 frame 已經想不出來」、不是 finding 數遞減；本卡填補 #114 / #126 / #147 沒覆蓋的「何時夠了」判讀缺口">#148 跨輪 review 停止訊號</a>：本卡揭露的是「停止訊號齊備但覆蓋不完整」的情境——frame 涵蓋度的判斷要包含 outside-in frame</li>
<li>→ <a href="/blog/report/review-miss-diagnose-design-vs-execution-gap/" data-link-title="Review 漏抓先分 design gap 與 execution gap、再決定改框架還是改執行" data-link-desc="Review 漏抓某類問題時，有兩個不同成因：design gap（框架根本沒有對應 frame）跟 execution gap（框架有 frame、但 reviewer 沒跑）。修法相反 —— design gap 要改框架（補 frame / keyword）、execution gap 要改執行（真的跑完該跑的輪）。診斷前先分清：把 execution gap 誤判成 design gap 會 framework bloat（一直加 frame 卻沒解決偷跑子集）、把 design gap 誤判成 execution gap 會永遠漏同類。常見陷阱是『加 keyword』感覺像進步、但對沒跑的輪毫無幫助。">#153 Review 漏抓先分 design gap 與 execution gap</a>：六個盲點全部是 design gap（框架缺 frame），不是 execution gap（有 frame 沒跑）</li>
<li>→ <a href="/blog/report/cold-reader-frame-vs-informed-reviewer/" data-link-title="多輪審查要有冷讀者 frame：知情 reviewer 看不見行話洩漏" data-link-desc="多輪審查模擬讀者時要分兩種：知情讀者（讀完全部、走旅程）與冷讀者（經搜尋或直連落在單篇、零脈絡）。知情 reviewer 會自動腦補脈絡，結構性看不見洩漏撰寫者預設前提的行話。原子 / Zettelkasten / glossary 等可被直連抵達的內容，必須額外跑冷讀 frame。">#168 多輪審查要有冷讀者 frame</a>：cold-read 是 outside-in 的一個實例（從零脈絡讀者出發），本卡把這個方向擴展到五個 frame</li>
</ul>
]]></content:encoded></item></channel></rss>