<?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>規範 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/%E8%A6%8F%E7%AF%84/</link><description>Recent content in 規範 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 25 Aug 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E8%A6%8F%E7%AF%84/index.xml" rel="self" type="application/rss+xml"/><item><title>規則要指到一個打得開的東西：名字錯了跟根本沒指名，後果都是那一步不會被執行</title><link>https://tarrragon.github.io/blog/report/rule-must-point-at-something-openable/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/rule-must-point-at-something-openable/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>一次對兩份規則文件（一份 496 行的寫作規範、一份 264 行的工具專屬補充）的理解取樣，十三個低階模型探針，指令逐字相同、其中一欄要求回報「照這一節工作時我的第一個具體動作是什麼」。這一欄產出了五處，全部是同一個形態。&lt;/p>
&lt;p>限制：單次量測、單一專案、對象都是規則類文件。敘事型與教學型內容沒有測過，那裡的「執行者」不是同一種角色。五處之中有兩處是同一份文件的同一段歷史遺留，不算五個獨立的成因。&lt;/p>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>一條規則的可執行性，由「照它工作的人第一個動作指得出來嗎」決定，不由它寫得清不清楚決定。&lt;/strong> 一條讀起來完整、每個字都懂、卻沒有指向任何打得開的東西的規則，執行與不執行在產物裡沒有差別。&lt;/p>
&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>名字指向不存在的東西&lt;/td>
 &lt;td>規範首條寫「本檔（&lt;code>blog/codex.md&lt;/code>）」，而該檔在改名後已不存在&lt;/td>
 &lt;td>一個看起來很具體的路徑&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>名字指向的東西從來就不是實體&lt;/td>
 &lt;td>「更新章節大綱（outline 為唯一 backlog）」，而 outline 不是任何檔案&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;/tbody>
&lt;/table>
&lt;p>第三種最難發現，因為前兩種至少有一個錯的名字可以被查，而第三種沒有名字可查。它靠的是讀者用自己的知識把缺口補起來——每個讀「寫作規範掃描」的人都知道那大概是什麼意思，於是那一步讀起來成立。&lt;/p>
&lt;h2 id="為什麼規則文件特別容易留下這種缺陷">為什麼規則文件特別容易留下這種缺陷&lt;/h2>
&lt;p>&lt;strong>規則文件的讀者全部自帶答案。&lt;/strong> 讀 &lt;code>AGENTS.md&lt;/code> 的人知道自己打開的是哪一個檔，所以「本檔（&lt;code>blog/codex.md&lt;/code>）」讀起來沒有問題——名字錯了，而讀者用手上那份實體覆蓋掉了它。寫的人更是如此，寫的當下腦中有完整的地圖，步驟名稱只是那張地圖的索引。&lt;/p>
&lt;p>補完發生在讀者這一側，而且無聲。因此這類缺陷可以通過任意多輪的人工審查與任意多個高階 reviewer：每一位都補了同一個缺口，也都沒有察覺自己補過。&lt;/p>
&lt;p>第二個成因是改名。名字寫進規則的那一刻是對的，改名的那次提交動了實體而沒有動指向它的規則。這一種與死鏈的差別在於&lt;strong>它不會報錯&lt;/strong>——路徑寫在括號裡的散文中，沒有任何工具會去解析它。&lt;/p>
&lt;h2 id="判準">判準&lt;/h2>
&lt;p>問一句話就分得開：&lt;strong>照這一條工作，我的第一個動作是打開什麼檔、執行什麼指令、或叫用哪一個具名的東西。&lt;/strong>&lt;/p>
&lt;p>答得出名字，接著驗那個名字現在還在不在（開一次、或 &lt;code>ls&lt;/code> 一次，成本是秒級）。答不出名字，這一步就是壞的，不論它讀起來多完整。&lt;/p>
&lt;p>三種修法對應三種形態：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>名字錯了&lt;/strong>：換成現在的名字，並在同一次提交裡搜全庫還有沒有別處沿用舊名。&lt;/li>
&lt;li>&lt;strong>名字不是實體&lt;/strong>：把它換成實體。若那個概念確實沒有對應的實體，那代表規則要求的東西還不存在，處置是建立它或刪掉這條規則，不是換一個更好聽的名字。&lt;/li>
&lt;li>&lt;strong>沒指名&lt;/strong>：把形容詞換成動作加對象。「寫作規範掃描：核心先行、正向陳述」改成「叫用某個具名的檢查集合，照它的清單逐類掃過，每個命中走一次語意判定」。&lt;/li>
&lt;/ul>
&lt;h2 id="偵測">偵測&lt;/h2>
&lt;p>判準可以自查，但自查對這一類的偵測率低，理由就是上面那條——查的人也自帶答案。&lt;/p>
&lt;p>有效的偵測是把規則交給一個不持有那張地圖的讀者，並且&lt;strong>明確要求他回報第一個動作&lt;/strong>。這一欄不能省略成「你讀懂了嗎」：讀懂與執行得出來是兩回事，而讀者的預設回答是讀懂了。低階模型在這裡特別適合，因為推理能力越強越會自動把缺口填上，填完之後那一步讀起來就成立了——判別與派發方式見 &lt;a href="../comprehension-sampled-not-judged/">#281&lt;/a>。&lt;/p>
&lt;p>自動化只覆蓋得到一部分：寫成 markdown 連結的路徑進得了連結檢查，寫在散文或反引號裡的檔名、工具名、段名不會被任何工具解析。所以這一維的主力是探針與逐條人工核對，不是 lint。&lt;/p>
&lt;h2 id="沒這樣做的麻煩">沒這樣做的麻煩&lt;/h2>
&lt;p>規則存在而不被執行，跟規則不存在的差別，全部落在成本那一側：討論規則的時候大家都同意它在，出事的時候查得到它寫在那裡，而它從來沒有攔下任何東西。更貴的是它會關掉補救——既然規則已經有了，這一塊就被當成有人管了。&lt;/p>
&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>&lt;a href="../comprehension-sampled-not-judged/">#281 理解檢查用低階 model 取樣讀者的實際理解&lt;/a>&lt;/td>
 &lt;td>本卡的偵測入口——探針回報的「第一個具體動作」那一欄就是本卡的判準，而本卡說明那一欄為什麼不能省&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="../routing-destination-must-own-the-topic/">#240 路由的目的地要承接該主題&lt;/a>&lt;/td>
 &lt;td>同一條要求推到不同對象——#240 驗的是連結的目的地承不承接主題，本卡驗的是規則指名的東西存不存在；#240 的對象進得了連結檢查，本卡的對象寫在散文裡、任何工具都不解析&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="../checkable-anchor-must-be-able-to-fall/">#266 可核對的錨要跟它該偵測的狀態連動&lt;/a>&lt;/td>
 &lt;td>兩條合起來才是完整的可執行性——本卡管規則指不指得到東西，#266 管執行完之後留不留得下可判偽的痕跡；只做本卡會得到一條指得到實體、卻仍然無法分辨做過沒做過的規則&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="../reference-by-semantic-title-not-number/">#155 引用用語意標題、不用位置編號&lt;/a>&lt;/td>
 &lt;td>同一個失效機制的另一種載體——編號重排後引用句字面完好而指向錯的內容，跟改名後路徑字面完好而指向不存在的檔是同一種無聲失效，兩者都不報錯&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="../keyword-list-needs-dominant-violating-sense/">#267 關鍵字清單只收違規義項佔多數的詞&lt;/a>&lt;/td>
 &lt;td>相鄰而不同層——#267 管一個清單收哪些成員，本卡管規則有沒有指到那個清單；一份規則可以在指得到清單的前提下，清單本身仍然收錯成員&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>規則裡出現反引號包起來的檔名、目錄名、設定欄位名，而同一句沒有說它在哪裡。&lt;/li>
&lt;li>步驟的內容是形容詞或名詞的並列（「核心先行、正向陳述、案例補足」），沒有動詞加對象。&lt;/li>
&lt;li>同一個東西在文件的不同段落有兩個名字，而其中一個查不到對應的實體。&lt;/li>
&lt;li>探針或新加入的人反覆問同一個「這個 X 是什麼」，而回答的人每次都答得出來——答得出來說明資訊存在於回答者身上，不在文件裡。&lt;/li>
&lt;li>某條規則從來沒有攔下過任何東西，而大家都同意它是對的。&lt;/li>
&lt;/ul>
&lt;h2 id="這條原則什麼時候不成立">這條原則什麼時候不成立&lt;/h2>
&lt;p>概念層的陳述不適用。「Backend 是語言無關層」這種定位宣告本來就不指向實體，它的作用是劃邊界而不是驅動動作，要求它指名一個打得開的東西會把它逼成假的操作步驟。&lt;/p>
&lt;p>判準的成立條件是「這一段要求執行者做事」。純參考、術語定義、背景說明都不觸發。&lt;/p>
&lt;p>指向外部規格與第三方文件的規則也只適用一半：名字要驗，但那個名字會改版、改路徑、下架而自己無法讓它保持有效，處置是連過去的同時寫明「到那裡要拿到什麼」。&lt;/p></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>一次對兩份規則文件（一份 496 行的寫作規範、一份 264 行的工具專屬補充）的理解取樣，十三個低階模型探針，指令逐字相同、其中一欄要求回報「照這一節工作時我的第一個具體動作是什麼」。這一欄產出了五處，全部是同一個形態。</p>
<p>限制：單次量測、單一專案、對象都是規則類文件。敘事型與教學型內容沒有測過，那裡的「執行者」不是同一種角色。五處之中有兩處是同一份文件的同一段歷史遺留，不算五個獨立的成因。</p>
<h2 id="核心原則">核心原則</h2>
<p><strong>一條規則的可執行性，由「照它工作的人第一個動作指得出來嗎」決定，不由它寫得清不清楚決定。</strong> 一條讀起來完整、每個字都懂、卻沒有指向任何打得開的東西的規則，執行與不執行在產物裡沒有差別。</p>
<p>失效有三種形態，成因不同而後果相同：</p>
<table>
  <thead>
      <tr>
          <th>形態</th>
          <th>例子</th>
          <th>讀者看到的</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>名字指向不存在的東西</td>
          <td>規範首條寫「本檔（<code>blog/codex.md</code>）」，而該檔在改名後已不存在</td>
          <td>一個看起來很具體的路徑</td>
      </tr>
      <tr>
          <td>名字指向的東西從來就不是實體</td>
          <td>「更新章節大綱（outline 為唯一 backlog）」，而 outline 不是任何檔案</td>
          <td>一個像是專有名詞的詞</td>
      </tr>
      <tr>
          <td>根本沒指名任何東西</td>
          <td>「寫作規範掃描：核心先行、正向陳述、案例補足」</td>
          <td>三個形容詞，讀起來像在說做什麼</td>
      </tr>
  </tbody>
</table>
<p>第三種最難發現，因為前兩種至少有一個錯的名字可以被查，而第三種沒有名字可查。它靠的是讀者用自己的知識把缺口補起來——每個讀「寫作規範掃描」的人都知道那大概是什麼意思，於是那一步讀起來成立。</p>
<h2 id="為什麼規則文件特別容易留下這種缺陷">為什麼規則文件特別容易留下這種缺陷</h2>
<p><strong>規則文件的讀者全部自帶答案。</strong> 讀 <code>AGENTS.md</code> 的人知道自己打開的是哪一個檔，所以「本檔（<code>blog/codex.md</code>）」讀起來沒有問題——名字錯了，而讀者用手上那份實體覆蓋掉了它。寫的人更是如此，寫的當下腦中有完整的地圖，步驟名稱只是那張地圖的索引。</p>
<p>補完發生在讀者這一側，而且無聲。因此這類缺陷可以通過任意多輪的人工審查與任意多個高階 reviewer：每一位都補了同一個缺口，也都沒有察覺自己補過。</p>
<p>第二個成因是改名。名字寫進規則的那一刻是對的，改名的那次提交動了實體而沒有動指向它的規則。這一種與死鏈的差別在於<strong>它不會報錯</strong>——路徑寫在括號裡的散文中，沒有任何工具會去解析它。</p>
<h2 id="判準">判準</h2>
<p>問一句話就分得開：<strong>照這一條工作，我的第一個動作是打開什麼檔、執行什麼指令、或叫用哪一個具名的東西。</strong></p>
<p>答得出名字，接著驗那個名字現在還在不在（開一次、或 <code>ls</code> 一次，成本是秒級）。答不出名字，這一步就是壞的，不論它讀起來多完整。</p>
<p>三種修法對應三種形態：</p>
<ul>
<li><strong>名字錯了</strong>：換成現在的名字，並在同一次提交裡搜全庫還有沒有別處沿用舊名。</li>
<li><strong>名字不是實體</strong>：把它換成實體。若那個概念確實沒有對應的實體，那代表規則要求的東西還不存在，處置是建立它或刪掉這條規則，不是換一個更好聽的名字。</li>
<li><strong>沒指名</strong>：把形容詞換成動作加對象。「寫作規範掃描：核心先行、正向陳述」改成「叫用某個具名的檢查集合，照它的清單逐類掃過，每個命中走一次語意判定」。</li>
</ul>
<h2 id="偵測">偵測</h2>
<p>判準可以自查，但自查對這一類的偵測率低，理由就是上面那條——查的人也自帶答案。</p>
<p>有效的偵測是把規則交給一個不持有那張地圖的讀者，並且<strong>明確要求他回報第一個動作</strong>。這一欄不能省略成「你讀懂了嗎」：讀懂與執行得出來是兩回事，而讀者的預設回答是讀懂了。低階模型在這裡特別適合，因為推理能力越強越會自動把缺口填上，填完之後那一步讀起來就成立了——判別與派發方式見 <a href="../comprehension-sampled-not-judged/">#281</a>。</p>
<p>自動化只覆蓋得到一部分：寫成 markdown 連結的路徑進得了連結檢查，寫在散文或反引號裡的檔名、工具名、段名不會被任何工具解析。所以這一維的主力是探針與逐條人工核對，不是 lint。</p>
<h2 id="沒這樣做的麻煩">沒這樣做的麻煩</h2>
<p>規則存在而不被執行，跟規則不存在的差別，全部落在成本那一側：討論規則的時候大家都同意它在，出事的時候查得到它寫在那裡，而它從來沒有攔下任何東西。更貴的是它會關掉補救——既然規則已經有了，這一塊就被當成有人管了。</p>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>原則</th>
          <th>關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="../comprehension-sampled-not-judged/">#281 理解檢查用低階 model 取樣讀者的實際理解</a></td>
          <td>本卡的偵測入口——探針回報的「第一個具體動作」那一欄就是本卡的判準，而本卡說明那一欄為什麼不能省</td>
      </tr>
      <tr>
          <td><a href="../routing-destination-must-own-the-topic/">#240 路由的目的地要承接該主題</a></td>
          <td>同一條要求推到不同對象——#240 驗的是連結的目的地承不承接主題，本卡驗的是規則指名的東西存不存在；#240 的對象進得了連結檢查，本卡的對象寫在散文裡、任何工具都不解析</td>
      </tr>
      <tr>
          <td><a href="../checkable-anchor-must-be-able-to-fall/">#266 可核對的錨要跟它該偵測的狀態連動</a></td>
          <td>兩條合起來才是完整的可執行性——本卡管規則指不指得到東西，#266 管執行完之後留不留得下可判偽的痕跡；只做本卡會得到一條指得到實體、卻仍然無法分辨做過沒做過的規則</td>
      </tr>
      <tr>
          <td><a href="../reference-by-semantic-title-not-number/">#155 引用用語意標題、不用位置編號</a></td>
          <td>同一個失效機制的另一種載體——編號重排後引用句字面完好而指向錯的內容，跟改名後路徑字面完好而指向不存在的檔是同一種無聲失效，兩者都不報錯</td>
      </tr>
      <tr>
          <td><a href="../keyword-list-needs-dominant-violating-sense/">#267 關鍵字清單只收違規義項佔多數的詞</a></td>
          <td>相鄰而不同層——#267 管一個清單收哪些成員，本卡管規則有沒有指到那個清單；一份規則可以在指得到清單的前提下，清單本身仍然收錯成員</td>
      </tr>
  </tbody>
</table>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>規則裡出現反引號包起來的檔名、目錄名、設定欄位名，而同一句沒有說它在哪裡。</li>
<li>步驟的內容是形容詞或名詞的並列（「核心先行、正向陳述、案例補足」），沒有動詞加對象。</li>
<li>同一個東西在文件的不同段落有兩個名字，而其中一個查不到對應的實體。</li>
<li>探針或新加入的人反覆問同一個「這個 X 是什麼」，而回答的人每次都答得出來——答得出來說明資訊存在於回答者身上，不在文件裡。</li>
<li>某條規則從來沒有攔下過任何東西，而大家都同意它是對的。</li>
</ul>
<h2 id="這條原則什麼時候不成立">這條原則什麼時候不成立</h2>
<p>概念層的陳述不適用。「Backend 是語言無關層」這種定位宣告本來就不指向實體，它的作用是劃邊界而不是驅動動作，要求它指名一個打得開的東西會把它逼成假的操作步驟。</p>
<p>判準的成立條件是「這一段要求執行者做事」。純參考、術語定義、背景說明都不觸發。</p>
<p>指向外部規格與第三方文件的規則也只適用一半：名字要驗，但那個名字會改版、改路徑、下架而自己無法讓它保持有效，處置是連過去的同時寫明「到那裡要拿到什麼」。</p>
]]></content:encoded></item></channel></rss>