<?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/%E5%AF%AB%E4%BD%9C%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>Thu, 11 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E5%AF%AB%E4%BD%9C%E8%A6%8F%E7%AF%84/index.xml" rel="self" type="application/rss+xml"/><item><title>引用章節用語意標題、不用位置編號：編號是結構排列的 derivation、會隨版本漂移</title><link>https://tarrragon.github.io/blog/report/reference-by-semantic-title-not-number/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/reference-by-semantic-title-not-number/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>跨段落、跨檔引用一個結構單位（章節、階段、條列項、輪次）時、&lt;strong>引用它的語意標題、不引用它的位置編號&lt;/strong>。「見核心問題」「在操作盤點階段確認」是穩定引用；「見 Stage 3」「Stage 1-3 出現訊號時」是把當下的排列順序寫死進引用點。&lt;/p>
&lt;p>編號可以存在、但只承擔兩個角色：當下閱讀的排序導覽（條列 1、2、3）、跟發布方凍結過的外部 contract（RFC 段號、法條條號）。活文件（會演進的規範、skill、教材、設計文件）的編號是&lt;strong>結構排列的 derivation&lt;/strong> — 插入一個新章節、所有後續編號全部位移、散落各處的引用點卻不會跟著動。&lt;/p>
&lt;p>這條原則同時定義了標題的責任：&lt;strong>每個結構單位都要有說明核心意義的語意標題、讓引用有東西可錨&lt;/strong>。只有編號沒有語意標題的章節（「Stage 3」「第五章」）、等於強迫所有引用者使用會漂移的錨點。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼編號引用會-silent-失效">為什麼編號引用會 silent 失效&lt;/h2>
&lt;h3 id="編號是-derivation引用是複本">編號是 derivation、引用是複本&lt;/h3>
&lt;p>一個章節的編號由「它前面有幾個章節」決定 — 這是排列的衍生值、不是這個章節自身的事實。把「Stage 3」寫進另一個檔案的引用句、等於把這個 derivation 的快照複製出去當 fact 用；結構一變、所有快照同時過期、而且沒有任何機制通知它們過期了。&lt;/p>
&lt;h3 id="失效模式比-broken-link-更糟misdirected不是-dangling">失效模式比 broken link 更糟：misdirected、不是 dangling&lt;/h3>
&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>Broken link（dangling）&lt;/td>
 &lt;td>目標消失&lt;/td>
 &lt;td>工具可掃：link checker 直接報 404&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>編號錯位（misdirected）&lt;/td>
 &lt;td>目標位移、編號被新內容占據&lt;/td>
 &lt;td>工具掃不出來：「Stage 3」字面依然存在、只是指向了別的階段&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>連結斷掉會報錯；編號錯位會&lt;strong>成功解析到錯的內容&lt;/strong>。讀者照著「見 Stage 3」翻過去、看到的是一個真實存在、語意卻完全不同的階段 — 他沒有任何訊號知道引用已經過期。修復也只能靠人工逐處判讀：grep 找得到所有「Stage」字面、但無法判斷哪些語意還對、哪些已經錯位。&lt;/p>
&lt;h3 id="語意標題也會改名--兩種斷裂不同級">語意標題也會改名 — 兩種斷裂不同級&lt;/h3>
&lt;p>語意錨的最強反例是「標題也會改名、改名後所有語意引用一樣過期」。這個攻擊成立一半 — 引用確實會過期、但斷裂的型態與偵測條件完全不同。改名讓舊引用斷成 dangling：「見核心問題」找不到目標、grep 與讀者都判得出引用過期了；編號位移斷成 misdirected：成功解析到錯的內容、無人察覺。更關鍵的差異是操作者在場與否 — 改名是對目標單位的顯式操作、改名者當下就知道該掃引用面、修復可以發生在同一個 commit；編號位移是別處插入章節的副作用、被位移的章節沒有人碰過、它的引用過期沒有任何人在場負責。語意錨輸在「也會變」、贏在「變的時候可偵測、有人在場」。&lt;/p>
&lt;h3 id="時間維度的累積">時間維度的累積&lt;/h3>
&lt;p>寫下引用的當下、編號跟語意完全對得上 — 這正是這個反模式難以自察的原因。漂移發生在後續版本：插入新階段、合併兩章、把一節搬到另一個檔案。文件越活躍、引用點越多、每次重排的人工修復面就越大；漏修一處、就埋下一個 misdirected 引用等讀者踩。&lt;/p>
&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>「見 Stage 3」「進 Stage 4 前確認」&lt;/td>
 &lt;td>「見核心問題」「進維度展開前確認」— 用階段的語意名稱&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「如第 3 點所述」「上述 1-3」&lt;/td>
 &lt;td>重述該點的語意：「如『底線告知協議』所述」「上述三個收斂判準」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「詳見第五章」（活文件）&lt;/td>
 &lt;td>「詳見『防護底線清單』章」— 標題即錨點&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>章節只有編號、沒有語意標題（「## Stage 3」）&lt;/td>
 &lt;td>編號與語意並列（「## Stage 3：核心問題」）、引用時取語意半邊&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>條列項被遠處引用（「套用流程的步驟 2」）&lt;/td>
 &lt;td>給該步驟一個名字、或引用時帶語意（「套用流程的『抽 findings』步」）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>寫作時的判斷次序：先給結構單位一個承載核心意義的標題（這是標題的本職）、編號只作當下排序；引用時一律取語意名稱；引用點離目標越遠（跨檔、跨 surface）、越是只能用語意錨。&lt;/p>
&lt;h3 id="邊界凍結編號是-fact可以引用">邊界：凍結編號是 fact、可以引用&lt;/h3>
&lt;p>發布方承諾編號不變的外部規格、編號本身就是 contract：RFC 的 section number、法條的條號、含版本年份的 ISO 條款（如 ISO 9001:2015 — 跨版改版會重編條款、引用時鎖定版本才算凍結）、已出版書籍的章節。這些編號被凍結成 fact、引用它們反而比引用標題穩定（標題可能在翻譯與再版間變動）。內部活文件想獲得同樣性質、要先付出同樣代價：宣告編號凍結、只加不改 — 多數活文件不值得也做不到、所以預設走語意引用。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/name-collections-by-role-not-count/" data-link-title="集合命名用角色、不內嵌數量：「核心七問」的七是成員數的 derivation、加一問就全面失真" data-link-desc="「核心七問」「成長六階段」「四大支柱」這類名稱把成員數量烤進名字裡 — 數量是集合當前成員的 derivation、不是集合的語意身分；成員增減時名稱失真、且名稱是被複製最多次的字串、缺陷隨每次引用繁殖。修法：命名只承載角色與層級（核心問題 / 次要問題 / 撞牆階段）、數量讓清單自己呈現。本卡是 #155 的命名端 sibling（#155 修引用端、本卡讓「語意標題是穩定錨」的前提真正成立）、#44 SSoT 在名稱內容的實例、#84 命名檢驗的數量維度。">#156 集合命名用角色、不內嵌數量&lt;/a>：命名端 sibling。本卡假設語意標題是穩定 fact、#156 負責讓這個假設成立 — 「核心七問」這種 count-bearing 標題一半是語意、一半是成員數的 derivation、引用端怎麼修都錨在會漂移的字串上。本卡初版的正面範例就用了「見核心七問」而未察覺、由 #156 抓出 — 兩卡是不同認知層的檢查、單獨跑任一個抓不到另一個的違規。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/single-source-of-truth/" data-link-title="Single Source of Truth：值的住址只能有一處" data-link-desc="同一個值（CSS token、視覺基準、runtime 量測）的權威來源只能有一個位置 — 多源時會分歧、會漏改、會讓讀者不知道哪個生效。本文是 #3 / #26 / #27 三篇實作的共同抽象。">#44 Single Source of Truth&lt;/a>：本卡是 SSoT 在「結構引用」維度的實例。編號是位置的 derivation；把編號寫進多處引用點、等於把 derivation 當 fact 散寫多份複本 — fact（章節的語意身分）只在標題一處、引用就該錨在那裡。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/url-slug-must-be-explicit-fact/" data-link-title="URL slug 必須顯式定義為 fact：跨工具 identifier 用單一定義源" data-link-desc="URL slug 在 Hugo 預設下從 title 自動推導、在 mdtools lint 下從檔名讀、在跨檔連結時又要寫第三個值 — 一個 identifier 散落在三個推導鏈、典型 SSoT 違反。當多個工具共用一個 identifier、推導不一致 = silent broken link。修法：把 slug 從 derivation（runtime 推導）升級成 fact（frontmatter 顯式定義）、檔名 / 連結都基於這個 fact。本卡是 #44 在 toolchain integration 情境的具體實例、是 #82 字面 vs 行為在 identifier 維度的展現。">#93 URL slug 必須顯式定義為 fact&lt;/a>：同屬「引用要錨在 fact」家族。#93 把跨工具 identifier 從推導值升級成顯式 fact；本卡把跨段落引用的錨點從位置推導值（編號）換成語意 fact（標題）。兩卡的失效模式同型：推導鏈分歧、silent 失效、compile / lint 階段看不出來。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/naming-as-iterated-artifact/" data-link-title="Naming 是 iterated artifact：第一個名字幾乎不對、四輪 review 才收斂" data-link-desc="命名（變數 / 函式 / 檔名 / slug / API endpoint）幾乎沒有「一次寫對」的可能：第一個名字基於當下狹窄的 context、會在後續 cross-call-site / grep / 重構中暴露錯位。命名的正確設計是 iterated — 寫第一版 → grep-ability 測試 → cross-call-site 一致性 → impl 洩漏 → 重命名。本卡是 #83 在「命名」場景的特化。">#84 Naming 是 iterated artifact&lt;/a>：標題是名字。本卡要求標題承載可被引用的語意、等於對標題套用 #84 的 cross-call-site 檢驗 — 從引用者的角度看、這個標題單獨出現時讀者知道它指什麼嗎？只有編號的標題在這個檢驗下直接不及格。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/metadata-surface-in-writing-review/" data-link-title="Metadata surface 要納入寫作 review 範圍" data-link-desc="寫作 review 的 surface 包含正文與 metadata surface：title、description、frontmatter、heading、link label、MOC 索引條。正文通過 positive wording 或 multi-pass review 只代表 body surface 收斂；讀者入口與索引入口也要跑同一套 frame，才能讓文章在第一眼、搜尋與跨篇路由上維持同一個概念錨點。">#97 Metadata surface 要納入寫作 review 範圍&lt;/a>：引用句屬於 #97 分類中的 navigation surface（跟 link label、索引條目同層）— 同樣是正文之外、卻直接決定讀者入口正確性的層。重排結構時、review 範圍要把散落各檔的引用句列入掃描面、而不是只改目標檔。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="觸發-case">觸發 case&lt;/h2>
&lt;p>設計一個多階段訪談 skill 時、初版流程四階段、各檔用「Stage 1 的核心七問」「Stage 3 收斂時」互相引用。下一版把流程改成六階段：操作盤點與領域切分插入在前、核心七問從 Stage 1 變成 Stage 3、決策收斂從 Stage 3 變成 Stage 5。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>跨段落、跨檔引用一個結構單位（章節、階段、條列項、輪次）時、<strong>引用它的語意標題、不引用它的位置編號</strong>。「見核心問題」「在操作盤點階段確認」是穩定引用；「見 Stage 3」「Stage 1-3 出現訊號時」是把當下的排列順序寫死進引用點。</p>
<p>編號可以存在、但只承擔兩個角色：當下閱讀的排序導覽（條列 1、2、3）、跟發布方凍結過的外部 contract（RFC 段號、法條條號）。活文件（會演進的規範、skill、教材、設計文件）的編號是<strong>結構排列的 derivation</strong> — 插入一個新章節、所有後續編號全部位移、散落各處的引用點卻不會跟著動。</p>
<p>這條原則同時定義了標題的責任：<strong>每個結構單位都要有說明核心意義的語意標題、讓引用有東西可錨</strong>。只有編號沒有語意標題的章節（「Stage 3」「第五章」）、等於強迫所有引用者使用會漂移的錨點。</p>
<hr>
<h2 id="為什麼編號引用會-silent-失效">為什麼編號引用會 silent 失效</h2>
<h3 id="編號是-derivation引用是複本">編號是 derivation、引用是複本</h3>
<p>一個章節的編號由「它前面有幾個章節」決定 — 這是排列的衍生值、不是這個章節自身的事實。把「Stage 3」寫進另一個檔案的引用句、等於把這個 derivation 的快照複製出去當 fact 用；結構一變、所有快照同時過期、而且沒有任何機制通知它們過期了。</p>
<h3 id="失效模式比-broken-link-更糟misdirected不是-dangling">失效模式比 broken link 更糟：misdirected、不是 dangling</h3>
<table>
  <thead>
      <tr>
          <th>失效類型</th>
          <th>觸發</th>
          <th>偵測難度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Broken link（dangling）</td>
          <td>目標消失</td>
          <td>工具可掃：link checker 直接報 404</td>
      </tr>
      <tr>
          <td>編號錯位（misdirected）</td>
          <td>目標位移、編號被新內容占據</td>
          <td>工具掃不出來：「Stage 3」字面依然存在、只是指向了別的階段</td>
      </tr>
  </tbody>
</table>
<p>連結斷掉會報錯；編號錯位會<strong>成功解析到錯的內容</strong>。讀者照著「見 Stage 3」翻過去、看到的是一個真實存在、語意卻完全不同的階段 — 他沒有任何訊號知道引用已經過期。修復也只能靠人工逐處判讀：grep 找得到所有「Stage」字面、但無法判斷哪些語意還對、哪些已經錯位。</p>
<h3 id="語意標題也會改名--兩種斷裂不同級">語意標題也會改名 — 兩種斷裂不同級</h3>
<p>語意錨的最強反例是「標題也會改名、改名後所有語意引用一樣過期」。這個攻擊成立一半 — 引用確實會過期、但斷裂的型態與偵測條件完全不同。改名讓舊引用斷成 dangling：「見核心問題」找不到目標、grep 與讀者都判得出引用過期了；編號位移斷成 misdirected：成功解析到錯的內容、無人察覺。更關鍵的差異是操作者在場與否 — 改名是對目標單位的顯式操作、改名者當下就知道該掃引用面、修復可以發生在同一個 commit；編號位移是別處插入章節的副作用、被位移的章節沒有人碰過、它的引用過期沒有任何人在場負責。語意錨輸在「也會變」、贏在「變的時候可偵測、有人在場」。</p>
<h3 id="時間維度的累積">時間維度的累積</h3>
<p>寫下引用的當下、編號跟語意完全對得上 — 這正是這個反模式難以自察的原因。漂移發生在後續版本：插入新階段、合併兩章、把一節搬到另一個檔案。文件越活躍、引用點越多、每次重排的人工修復面就越大；漏修一處、就埋下一個 misdirected 引用等讀者踩。</p>
<hr>
<h2 id="反模式與修法">反模式與修法</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>修法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「見 Stage 3」「進 Stage 4 前確認」</td>
          <td>「見核心問題」「進維度展開前確認」— 用階段的語意名稱</td>
      </tr>
      <tr>
          <td>「如第 3 點所述」「上述 1-3」</td>
          <td>重述該點的語意：「如『底線告知協議』所述」「上述三個收斂判準」</td>
      </tr>
      <tr>
          <td>「詳見第五章」（活文件）</td>
          <td>「詳見『防護底線清單』章」— 標題即錨點</td>
      </tr>
      <tr>
          <td>章節只有編號、沒有語意標題（「## Stage 3」）</td>
          <td>編號與語意並列（「## Stage 3：核心問題」）、引用時取語意半邊</td>
      </tr>
      <tr>
          <td>條列項被遠處引用（「套用流程的步驟 2」）</td>
          <td>給該步驟一個名字、或引用時帶語意（「套用流程的『抽 findings』步」）</td>
      </tr>
  </tbody>
</table>
<p>寫作時的判斷次序：先給結構單位一個承載核心意義的標題（這是標題的本職）、編號只作當下排序；引用時一律取語意名稱；引用點離目標越遠（跨檔、跨 surface）、越是只能用語意錨。</p>
<h3 id="邊界凍結編號是-fact可以引用">邊界：凍結編號是 fact、可以引用</h3>
<p>發布方承諾編號不變的外部規格、編號本身就是 contract：RFC 的 section number、法條的條號、含版本年份的 ISO 條款（如 ISO 9001:2015 — 跨版改版會重編條款、引用時鎖定版本才算凍結）、已出版書籍的章節。這些編號被凍結成 fact、引用它們反而比引用標題穩定（標題可能在翻譯與再版間變動）。內部活文件想獲得同樣性質、要先付出同樣代價：宣告編號凍結、只加不改 — 多數活文件不值得也做不到、所以預設走語意引用。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><a href="/blog/report/name-collections-by-role-not-count/" data-link-title="集合命名用角色、不內嵌數量：「核心七問」的七是成員數的 derivation、加一問就全面失真" data-link-desc="「核心七問」「成長六階段」「四大支柱」這類名稱把成員數量烤進名字裡 — 數量是集合當前成員的 derivation、不是集合的語意身分；成員增減時名稱失真、且名稱是被複製最多次的字串、缺陷隨每次引用繁殖。修法：命名只承載角色與層級（核心問題 / 次要問題 / 撞牆階段）、數量讓清單自己呈現。本卡是 #155 的命名端 sibling（#155 修引用端、本卡讓「語意標題是穩定錨」的前提真正成立）、#44 SSoT 在名稱內容的實例、#84 命名檢驗的數量維度。">#156 集合命名用角色、不內嵌數量</a>：命名端 sibling。本卡假設語意標題是穩定 fact、#156 負責讓這個假設成立 — 「核心七問」這種 count-bearing 標題一半是語意、一半是成員數的 derivation、引用端怎麼修都錨在會漂移的字串上。本卡初版的正面範例就用了「見核心七問」而未察覺、由 #156 抓出 — 兩卡是不同認知層的檢查、單獨跑任一個抓不到另一個的違規。</li>
<li><a href="/blog/report/single-source-of-truth/" data-link-title="Single Source of Truth：值的住址只能有一處" data-link-desc="同一個值（CSS token、視覺基準、runtime 量測）的權威來源只能有一個位置 — 多源時會分歧、會漏改、會讓讀者不知道哪個生效。本文是 #3 / #26 / #27 三篇實作的共同抽象。">#44 Single Source of Truth</a>：本卡是 SSoT 在「結構引用」維度的實例。編號是位置的 derivation；把編號寫進多處引用點、等於把 derivation 當 fact 散寫多份複本 — fact（章節的語意身分）只在標題一處、引用就該錨在那裡。</li>
<li><a href="/blog/report/url-slug-must-be-explicit-fact/" data-link-title="URL slug 必須顯式定義為 fact：跨工具 identifier 用單一定義源" data-link-desc="URL slug 在 Hugo 預設下從 title 自動推導、在 mdtools lint 下從檔名讀、在跨檔連結時又要寫第三個值 — 一個 identifier 散落在三個推導鏈、典型 SSoT 違反。當多個工具共用一個 identifier、推導不一致 = silent broken link。修法：把 slug 從 derivation（runtime 推導）升級成 fact（frontmatter 顯式定義）、檔名 / 連結都基於這個 fact。本卡是 #44 在 toolchain integration 情境的具體實例、是 #82 字面 vs 行為在 identifier 維度的展現。">#93 URL slug 必須顯式定義為 fact</a>：同屬「引用要錨在 fact」家族。#93 把跨工具 identifier 從推導值升級成顯式 fact；本卡把跨段落引用的錨點從位置推導值（編號）換成語意 fact（標題）。兩卡的失效模式同型：推導鏈分歧、silent 失效、compile / lint 階段看不出來。</li>
<li><a href="/blog/report/naming-as-iterated-artifact/" data-link-title="Naming 是 iterated artifact：第一個名字幾乎不對、四輪 review 才收斂" data-link-desc="命名（變數 / 函式 / 檔名 / slug / API endpoint）幾乎沒有「一次寫對」的可能：第一個名字基於當下狹窄的 context、會在後續 cross-call-site / grep / 重構中暴露錯位。命名的正確設計是 iterated — 寫第一版 → grep-ability 測試 → cross-call-site 一致性 → impl 洩漏 → 重命名。本卡是 #83 在「命名」場景的特化。">#84 Naming 是 iterated artifact</a>：標題是名字。本卡要求標題承載可被引用的語意、等於對標題套用 #84 的 cross-call-site 檢驗 — 從引用者的角度看、這個標題單獨出現時讀者知道它指什麼嗎？只有編號的標題在這個檢驗下直接不及格。</li>
<li><a href="/blog/report/metadata-surface-in-writing-review/" data-link-title="Metadata surface 要納入寫作 review 範圍" data-link-desc="寫作 review 的 surface 包含正文與 metadata surface：title、description、frontmatter、heading、link label、MOC 索引條。正文通過 positive wording 或 multi-pass review 只代表 body surface 收斂；讀者入口與索引入口也要跑同一套 frame，才能讓文章在第一眼、搜尋與跨篇路由上維持同一個概念錨點。">#97 Metadata surface 要納入寫作 review 範圍</a>：引用句屬於 #97 分類中的 navigation surface（跟 link label、索引條目同層）— 同樣是正文之外、卻直接決定讀者入口正確性的層。重排結構時、review 範圍要把散落各檔的引用句列入掃描面、而不是只改目標檔。</li>
</ul>
<hr>
<h2 id="觸發-case">觸發 case</h2>
<p>設計一個多階段訪談 skill 時、初版流程四階段、各檔用「Stage 1 的核心七問」「Stage 3 收斂時」互相引用。下一版把流程改成六階段：操作盤點與領域切分插入在前、核心七問從 Stage 1 變成 Stage 3、決策收斂從 Stage 3 變成 Stage 5。</p>
<p>後果具體呈現了上述失效模式：十多處跨檔引用要修、grep「Stage」找得到所有字面、但每一處都要人工判讀語意 — 「Stage 3 收斂時」字面完好、語意卻已指向錯誤階段（舊 Stage 3 是收斂、新 Stage 3 是核心七問）。實際修復中就有兩處漏網、靠第二輪全 repo 掃描才補上。若初版引用寫的是「核心問題」「決策收斂階段」這類語意名稱、這次重排的引用修復成本是零。</p>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>寫出「見 Stage N」「如第 N 點」「上一章提過」「§N」且目標是活文件時 — 改用語意標題引用。</li>
<li>章節標題只有編號或編號加泛稱（「階段三」「Part 2」）— 補語意半邊、否則其他文件只能用編號引用該章節。</li>
<li>Review 掃描可用：<code>rg &quot;Stage [0-9]|第 ?[一二三四五六七八九十0-9]+ ?(章|節|點|步|輪)|§[0-9]&quot;</code> — 命中是候選、要逐處判讀目標是凍結編號還是活文件。</li>
<li>結構重排（插入 / 合併 / 搬移章節）的 commit、檢查清單要包含「全 repo 掃引用句」、不是只改目標檔。</li>
</ul>
]]></content:encoded></item><item><title>集合命名用角色、不內嵌數量：「核心七問」的七是成員數的 derivation、加一問就全面失真</title><link>https://tarrragon.github.io/blog/report/name-collections-by-role-not-count/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/name-collections-by-role-not-count/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>集合型結構（問題清單、階段序列、原則組、支柱組）的命名&lt;strong>只承載角色與層級、把成員數量留給清單自己呈現&lt;/strong>。「核心問題」這個名稱承受任意的成員增減；「核心七問」把當前成員數烤進名字、加一問、七就變八：名稱本身先失真、散落各處的引用跟著全部過期。「次要問題」「撞牆階段」「防護底線」同理 — 角色詞完成分層、數量歸清單。&lt;/p>
&lt;p>區分核心問題跟次要問題、靠的是「核心 / 次要」這組角色詞；讀者選擇讀哪一組、不需要先知道組內有幾個成員。數字在名稱裡有真實的讀者側價值 — 記憶掛鉤與完整性提示（「五原則我只想起四個、漏了一個」）— 但這個價值在活集合下被漂移風險壓過、只有凍結集合能無風險收割它、這也是品牌名刻意用數字的原因；路由本身、角色詞已經完成。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼數量入名比編號引用更深一層">為什麼數量入名比編號引用更深一層&lt;/h2>
&lt;h3 id="數量是-membership-的-derivation">數量是 membership 的 derivation&lt;/h3>
&lt;p>一個集合的成員數由「目前有哪些成員」決定 — 跟章節編號由「前面排了幾章」決定同構、都是會隨演進變動的衍生值。差別在寄生位置：編號寄生在&lt;strong>引用句&lt;/strong>、數量寄生在&lt;strong>名稱本身&lt;/strong>。名稱是整個知識系統裡被複製最多次的字串（標題、引用、索引、目錄、對話、commit message 都在複製它）、缺陷跟著名稱繁殖到每一個出現點。&lt;/p>
&lt;h3 id="它讓語意標題是穩定錨的前提失效">它讓「語意標題是穩定錨」的前提失效&lt;/h3>
&lt;p>引用該錨在語意標題、因為標題被假設是這個單位的 fact。「核心七問」打破這個假設：標題有一半是語意（核心問題）、一半是 derivation（七）。成員一變、想守住名實一致就得全面改名、改名又回到「散落引用逐處修」的老路；想省事不改名、就留下一個說謊的名字（標題寫七問、實際有八問）、比編號錯位更糟 — 錯在系統的權威命名層。&lt;/p>
&lt;h3 id="失真的兩條路都有代價">失真的兩條路都有代價&lt;/h3>
&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>名稱出現過的每一處（標題 / 引用 / 索引 / 歷史對話的延續）都要修、等同一次結構重排&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>保留舊名&lt;/td>
 &lt;td>名實不符常態化 — 讀者數了一下發現是八問、開始懷疑文件其他部分的可信度&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="反模式與修法">反模式與修法&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>核心七問&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>核心支柱（或直接「支柱」）&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>定錨問題&lt;/td>
 &lt;td>行內描述也一樣、數量讓清單自己呈現&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>寫作時的判斷：命名一個集合時、問「這個數字提供了角色詞沒提供的資訊嗎？」— 答案幾乎都是否。讀者需要知道數量的時刻、是看到清單本身的時刻、清單天然自帶數量。&lt;/p>
&lt;h3 id="邊界三種數字可以留">邊界：三種數字可以留&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>外部凍結的品牌名&lt;/strong>：SOLID 五原則、OWASP Top 10、WRAP 四步驟 — 數量由發布方凍結、是名稱 fact 的一部分、跟引用 RFC 段號同理。&lt;/li>
&lt;li>&lt;strong>數字是概念內容本身&lt;/strong>：&lt;a href="https://tarrragon.github.io/blog/report/two-occurrence-threshold/" data-link-title="2 次門檻：第一次是運氣、第二次是訊號" data-link-desc="同一個問題出現第 2 次時、就該停下來把處理層級升一階 — 從推理升到量測、從手動驗證升到自動化、從同方向嘗試升到換思路。第 1 次失敗的資訊不足、第 2 次提供「重複出現」的證據、值得付出升級成本。本文是 #11 / #15 / #20 / #23 四篇實作的共同抽象。">兩次門檻&lt;/a> 的二是規則的閾值、不是成員數 — 改了二就是改了概念、這種數字承載語意、該留。&lt;/li>
&lt;li>&lt;strong>緊鄰清單的行內計數&lt;/strong>：「確認三件事：」後面直接跟三條列 — 數字跟清單同視野、改清單時順手改數字、漂移會立刻被看見。風險低、但仍是小負債、清單就在下面時「確認下列事項：」更省。&lt;/li>
&lt;li>&lt;strong>內部宣告凍結的集合&lt;/strong>：團隊把某個方法論名稱當內部品牌用、可以明文宣告凍結後收割記憶價值 — 代價比凍結編號更嚴：凍結編號還能往後加、凍結數量連加都不能加、成員增減等於名稱重新談判。&lt;/li>
&lt;/ol>
&lt;p>判別線是「這個數字是 fact 還是 derivation」：發布方凍結的、概念內容本身的是 fact；內部活集合的成員數是 derivation、不入名。&lt;/p>
&lt;hr>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/reference-by-semantic-title-not-number/" data-link-title="引用章節用語意標題、不用位置編號：編號是結構排列的 derivation、會隨版本漂移" data-link-desc="跨段落、跨檔引用結構單位（章節 / 階段 / 條列項）時、引用語意標題（副標題）、不引用位置編號（Stage 3、第 5 章、第 3 點）。編號是「目前結構排列」的 derivation、不是 fact；結構重排時編號全部位移、引用點不會報錯、而是 silent 指向錯的內容 — 比 broken link 更難偵測。標題的存在意義就是承載可被引用的語意。是 #44 SSoT 在結構引用維度的實例、#93 identifier-as-fact 家族的 sibling、#84 命名承載語意的引用面延伸。">#155 引用章節用語意標題、不用位置編號&lt;/a>：直接 sibling、分工在管線的兩端 — #155 修引用端（錨點選什麼）、本卡修命名端（錨點本身怎麼長）。#155 假設語意標題是穩定 fact、本卡負責讓這個假設成立：count-bearing 標題是「一半 fact 一半 derivation」的混合體、先淨化命名、#155 的引用紀律才有穩定的錨可用。實證：#155 卡初版自己用「見核心七問」當正面範例、修引用端時沒發現錨點內嵌數量。兩卡查的是不同層：引用端的檢查抓不到命名端的缺陷、反過來也一樣。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/single-source-of-truth/" data-link-title="Single Source of Truth：值的住址只能有一處" data-link-desc="同一個值（CSS token、視覺基準、runtime 量測）的權威來源只能有一個位置 — 多源時會分歧、會漏改、會讓讀者不知道哪個生效。本文是 #3 / #26 / #27 三篇實作的共同抽象。">#44 Single Source of Truth&lt;/a>：成員數量的 truth 在清單本身（數一下就有）；把數量寫進名稱是把這個 derivation 複製成第二個源、且這個源被嵌進最高頻複製的字串裡：是 SSoT 違反裡擴散速度最快的形態。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/naming-as-iterated-artifact/" data-link-title="Naming 是 iterated artifact：第一個名字幾乎不對、四輪 review 才收斂" data-link-desc="命名（變數 / 函式 / 檔名 / slug / API endpoint）幾乎沒有「一次寫對」的可能：第一個名字基於當下狹窄的 context、會在後續 cross-call-site / grep / 重構中暴露錯位。命名的正確設計是 iterated — 寫第一版 → grep-ability 測試 → cross-call-site 一致性 → impl 洩漏 → 重命名。本卡是 #83 在「命名」場景的特化。">#84 Naming 是 iterated artifact&lt;/a>：本卡給 #84 的命名 review 加一個檢查維度 — 數量入名是「第一版命名基於當下狹窄 context」的典型產物：寫名字的當下成員剛好七個、七看起來是這個集合的屬性；cross-time 檢驗（成員會不會變）才暴露它是快照。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/ease-of-writing-vs-intent-alignment/" data-link-title="寫作便利度跟意圖對齊反相關" data-link-desc="寫程式時最容易寫出的版本、通常是離意圖最遠的版本。便利度建立在「現有上下文 / 已 materialize 資料 / 已存在 API」上、而意圖對齊需要找到正確的層、處理上游、跨抽象層 — 兩者方向相反。識別這個反相關 = 識別自己掉進「容易寫的陷阱」。">#67 寫作便利度跟意圖對齊反相關&lt;/a>：「七問」「六階段」順口、有節奏感、好記 — 正是便利驅動的選擇；意圖對齊的名稱（核心問題）平淡但誠實。便利的代價延遲到第一次成員變動才結算。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="觸發-case">觸發 case&lt;/h2>
&lt;p>同一份多階段訪談 skill、同一天內兩次命中：&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>集合型結構（問題清單、階段序列、原則組、支柱組）的命名<strong>只承載角色與層級、把成員數量留給清單自己呈現</strong>。「核心問題」這個名稱承受任意的成員增減；「核心七問」把當前成員數烤進名字、加一問、七就變八：名稱本身先失真、散落各處的引用跟著全部過期。「次要問題」「撞牆階段」「防護底線」同理 — 角色詞完成分層、數量歸清單。</p>
<p>區分核心問題跟次要問題、靠的是「核心 / 次要」這組角色詞；讀者選擇讀哪一組、不需要先知道組內有幾個成員。數字在名稱裡有真實的讀者側價值 — 記憶掛鉤與完整性提示（「五原則我只想起四個、漏了一個」）— 但這個價值在活集合下被漂移風險壓過、只有凍結集合能無風險收割它、這也是品牌名刻意用數字的原因；路由本身、角色詞已經完成。</p>
<hr>
<h2 id="為什麼數量入名比編號引用更深一層">為什麼數量入名比編號引用更深一層</h2>
<h3 id="數量是-membership-的-derivation">數量是 membership 的 derivation</h3>
<p>一個集合的成員數由「目前有哪些成員」決定 — 跟章節編號由「前面排了幾章」決定同構、都是會隨演進變動的衍生值。差別在寄生位置：編號寄生在<strong>引用句</strong>、數量寄生在<strong>名稱本身</strong>。名稱是整個知識系統裡被複製最多次的字串（標題、引用、索引、目錄、對話、commit message 都在複製它）、缺陷跟著名稱繁殖到每一個出現點。</p>
<h3 id="它讓語意標題是穩定錨的前提失效">它讓「語意標題是穩定錨」的前提失效</h3>
<p>引用該錨在語意標題、因為標題被假設是這個單位的 fact。「核心七問」打破這個假設：標題有一半是語意（核心問題）、一半是 derivation（七）。成員一變、想守住名實一致就得全面改名、改名又回到「散落引用逐處修」的老路；想省事不改名、就留下一個說謊的名字（標題寫七問、實際有八問）、比編號錯位更糟 — 錯在系統的權威命名層。</p>
<h3 id="失真的兩條路都有代價">失真的兩條路都有代價</h3>
<table>
  <thead>
      <tr>
          <th>成員變動後的選擇</th>
          <th>代價</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>全面改名</td>
          <td>名稱出現過的每一處（標題 / 引用 / 索引 / 歷史對話的延續）都要修、等同一次結構重排</td>
      </tr>
      <tr>
          <td>保留舊名</td>
          <td>名實不符常態化 — 讀者數了一下發現是八問、開始懷疑文件其他部分的可信度</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="反模式與修法">反模式與修法</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>修法</th>
          <th>說明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>核心七問</td>
          <td>核心問題</td>
          <td>角色詞（核心）已完成分層、七是冗餘的快照</td>
      </tr>
      <tr>
          <td>成長六階段</td>
          <td>規模成長撞牆階段</td>
          <td>階段數會隨教材演進增減</td>
      </tr>
      <tr>
          <td>四大支柱</td>
          <td>核心支柱（或直接「支柱」）</td>
          <td>「大」字結構強迫帶數量、整個棄用</td>
      </tr>
      <tr>
          <td>訪談流程（六階段）</td>
          <td>訪談流程</td>
          <td>流程有幾站、目錄自己會說</td>
      </tr>
      <tr>
          <td>五個定錨問題</td>
          <td>定錨問題</td>
          <td>行內描述也一樣、數量讓清單自己呈現</td>
      </tr>
  </tbody>
</table>
<p>寫作時的判斷：命名一個集合時、問「這個數字提供了角色詞沒提供的資訊嗎？」— 答案幾乎都是否。讀者需要知道數量的時刻、是看到清單本身的時刻、清單天然自帶數量。</p>
<h3 id="邊界三種數字可以留">邊界：三種數字可以留</h3>
<ol>
<li><strong>外部凍結的品牌名</strong>：SOLID 五原則、OWASP Top 10、WRAP 四步驟 — 數量由發布方凍結、是名稱 fact 的一部分、跟引用 RFC 段號同理。</li>
<li><strong>數字是概念內容本身</strong>：<a href="/blog/report/two-occurrence-threshold/" data-link-title="2 次門檻：第一次是運氣、第二次是訊號" data-link-desc="同一個問題出現第 2 次時、就該停下來把處理層級升一階 — 從推理升到量測、從手動驗證升到自動化、從同方向嘗試升到換思路。第 1 次失敗的資訊不足、第 2 次提供「重複出現」的證據、值得付出升級成本。本文是 #11 / #15 / #20 / #23 四篇實作的共同抽象。">兩次門檻</a> 的二是規則的閾值、不是成員數 — 改了二就是改了概念、這種數字承載語意、該留。</li>
<li><strong>緊鄰清單的行內計數</strong>：「確認三件事：」後面直接跟三條列 — 數字跟清單同視野、改清單時順手改數字、漂移會立刻被看見。風險低、但仍是小負債、清單就在下面時「確認下列事項：」更省。</li>
<li><strong>內部宣告凍結的集合</strong>：團隊把某個方法論名稱當內部品牌用、可以明文宣告凍結後收割記憶價值 — 代價比凍結編號更嚴：凍結編號還能往後加、凍結數量連加都不能加、成員增減等於名稱重新談判。</li>
</ol>
<p>判別線是「這個數字是 fact 還是 derivation」：發布方凍結的、概念內容本身的是 fact；內部活集合的成員數是 derivation、不入名。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><a href="/blog/report/reference-by-semantic-title-not-number/" data-link-title="引用章節用語意標題、不用位置編號：編號是結構排列的 derivation、會隨版本漂移" data-link-desc="跨段落、跨檔引用結構單位（章節 / 階段 / 條列項）時、引用語意標題（副標題）、不引用位置編號（Stage 3、第 5 章、第 3 點）。編號是「目前結構排列」的 derivation、不是 fact；結構重排時編號全部位移、引用點不會報錯、而是 silent 指向錯的內容 — 比 broken link 更難偵測。標題的存在意義就是承載可被引用的語意。是 #44 SSoT 在結構引用維度的實例、#93 identifier-as-fact 家族的 sibling、#84 命名承載語意的引用面延伸。">#155 引用章節用語意標題、不用位置編號</a>：直接 sibling、分工在管線的兩端 — #155 修引用端（錨點選什麼）、本卡修命名端（錨點本身怎麼長）。#155 假設語意標題是穩定 fact、本卡負責讓這個假設成立：count-bearing 標題是「一半 fact 一半 derivation」的混合體、先淨化命名、#155 的引用紀律才有穩定的錨可用。實證：#155 卡初版自己用「見核心七問」當正面範例、修引用端時沒發現錨點內嵌數量。兩卡查的是不同層：引用端的檢查抓不到命名端的缺陷、反過來也一樣。</li>
<li><a href="/blog/report/single-source-of-truth/" data-link-title="Single Source of Truth：值的住址只能有一處" data-link-desc="同一個值（CSS token、視覺基準、runtime 量測）的權威來源只能有一個位置 — 多源時會分歧、會漏改、會讓讀者不知道哪個生效。本文是 #3 / #26 / #27 三篇實作的共同抽象。">#44 Single Source of Truth</a>：成員數量的 truth 在清單本身（數一下就有）；把數量寫進名稱是把這個 derivation 複製成第二個源、且這個源被嵌進最高頻複製的字串裡：是 SSoT 違反裡擴散速度最快的形態。</li>
<li><a href="/blog/report/naming-as-iterated-artifact/" data-link-title="Naming 是 iterated artifact：第一個名字幾乎不對、四輪 review 才收斂" data-link-desc="命名（變數 / 函式 / 檔名 / slug / API endpoint）幾乎沒有「一次寫對」的可能：第一個名字基於當下狹窄的 context、會在後續 cross-call-site / grep / 重構中暴露錯位。命名的正確設計是 iterated — 寫第一版 → grep-ability 測試 → cross-call-site 一致性 → impl 洩漏 → 重命名。本卡是 #83 在「命名」場景的特化。">#84 Naming 是 iterated artifact</a>：本卡給 #84 的命名 review 加一個檢查維度 — 數量入名是「第一版命名基於當下狹窄 context」的典型產物：寫名字的當下成員剛好七個、七看起來是這個集合的屬性；cross-time 檢驗（成員會不會變）才暴露它是快照。</li>
<li><a href="/blog/report/ease-of-writing-vs-intent-alignment/" data-link-title="寫作便利度跟意圖對齊反相關" data-link-desc="寫程式時最容易寫出的版本、通常是離意圖最遠的版本。便利度建立在「現有上下文 / 已 materialize 資料 / 已存在 API」上、而意圖對齊需要找到正確的層、處理上游、跨抽象層 — 兩者方向相反。識別這個反相關 = 識別自己掉進「容易寫的陷阱」。">#67 寫作便利度跟意圖對齊反相關</a>：「七問」「六階段」順口、有節奏感、好記 — 正是便利驅動的選擇；意圖對齊的名稱（核心問題）平淡但誠實。便利的代價延遲到第一次成員變動才結算。</li>
</ul>
<hr>
<h2 id="觸發-case">觸發 case</h2>
<p>同一份多階段訪談 skill、同一天內兩次命中：</p>
<ol>
<li><strong>已發生</strong>：skill 初版有「四大支柱」、第二版需求調整後支柱變六個 — 名稱被迫改成「六大支柱」、所有提到四大支柱的地方同步修。改完的新名字仍然內嵌數量、下次支柱增減會原樣重演。</li>
<li><strong>被預見</strong>：第二版的「核心七問」「成長六階段」被指出同樣結構 — 核心問題若加一問、「七」就散落在標題、引用、索引、路由表裡等著逐處修。</li>
</ol>
<p>更深的訊號是第三點：當天稍早為了修「Stage 3」編號引用立了一張卡（引用端）、該卡自己用「見核心七問」當正面範例；在專注檢查引用端時、命名端的同型缺陷完全隱形。確認了這是獨立的檢查維度、不是引用卡的子情況。</p>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>命名或標題出現「N 大 X」「N 問」「N 階段」「N 支柱」「N 原則」「N 步驟」且 X 是內部活集合時 — 抽掉數字、看角色詞夠不夠分層、幾乎都夠。</li>
<li>Review 掃描可用：<code>rg &quot;[一二三四五六七八九十0-9]+ ?(大|問|階段|支柱|原則|步驟|件事|個維度)&quot; --type md</code> — 掃出來的不全是病灶：外部凍結品牌與概念閾值是 fact、留；內部活集合的成員數是 derivation、改。</li>
<li>集合成員增減的 commit、檢查名稱是否還誠實 — 需要同步改名的話、這次改名時順便把數量抽掉、別讓下次再來一遍。</li>
</ul>
]]></content:encoded></item><item><title>跨 surface 同主題內容要重新語境化、不是搬運：逐字相同句是未語境化的訊號</title><link>https://tarrragon.github.io/blog/report/cross-surface-recontextualize-not-transplant/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/cross-surface-recontextualize-not-transplant/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>同主題內容要落在兩個 surface（人類教材 ↔ agent 協議、公開文章 ↔ 內部 skill）時、每一份要&lt;strong>為自己的讀者與用途重寫、不是把句子搬過去&lt;/strong>。「各寫一份」的規範如果用複製貼上執行、得到的是最差組合：兩份字面綁定（改一邊、另一邊變成過期複本、且沒有任何機制提醒）、卻又各自沒有為自己的 surface 最佳化（教材句直接當協議用、agent 拿到的是給人類讀的敘述而不是可執行的指令）。&lt;/p>
&lt;p>語境化的可操作判準：&lt;strong>兩個 surface 之間 grep 逐字相同的完整句、命中就是候選&lt;/strong>。同一個原則、教材版該長成「為什麼 + 案例 + 判讀」、協議版該長成「步驟 + 條件 + 產出格式」— 兩版講同一件事、句子自然長得不一樣；句子一樣、代表至少有一邊在用別人的形狀。&lt;/p>
&lt;h2 id="為什麼搬運是預設行為">為什麼搬運是預設行為&lt;/h2>
&lt;p>寫第二份時、第一份就在手邊、而且它「已經寫對了」— 複製是零成本、重寫要重新思考這個 surface 的讀者需要什麼形狀。搬運在當下看起來甚至更安全（兩邊保證一致）；代價在第一次單邊修改時兌現：修了教材版的措辭、skill 版還是舊句、兩邊開始各說各話、而因為當初沒有宣告同源關係、沒有人知道要同步。&lt;/p>
&lt;p>「禁止跨 surface 引用」防的是顯性耦合；搬運建立的是隱性耦合 — 更糟、因為看不見。語境化重寫讓兩份真正獨立：主旨對應靠概念、不靠字串。&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;/td>
 &lt;td>協議版改寫成操作指令（「gate 逐條業務流程過、混合結論寫進交付形態欄」）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>反向問的問句兩邊同字&lt;/td>
 &lt;td>教材版是讀者自問、協議版是「請使用者……然後對照」的訪談動作&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>比喻句 / 警句原樣複製（修辭跨 surface 失效最快）&lt;/td>
 &lt;td>各 surface 用自己的語感重寫、或協議版直接刪修辭留判準&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>表格整張複製&lt;/td>
 &lt;td>欄位依用途裁剪：教材表帶「為什麼」欄、協議表帶「下一步路由」欄&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>欄位與句式跟著用途走之後、兩份的字面自然分開；對照查漏時找的是概念缺口、不是字串差異。&lt;/p>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/single-source-of-truth/" data-link-title="Single Source of Truth：值的住址只能有一處" data-link-desc="同一個值（CSS token、視覺基準、runtime 量測）的權威來源只能有一個位置 — 多源時會分歧、會漏改、會讓讀者不知道哪個生效。本文是 #3 / #26 / #27 三篇實作的共同抽象。">#44 Single Source of Truth&lt;/a>：逐字搬運讓同一段論述以兩份完整複本存在、誰是權威沒有任何標記。比一般 SSoT 違反更難修 — 第一步的困難不在改、在發現同源關係存在。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/cadence-homogenization-in-batch-writing/" data-link-title="Cadence 同質化是模板的隱形維度" data-link-desc="規範定義「模板」時通常只指內容欄位（規模對照、tripwire、失敗模式），忽略句型骨架 / 段首語 / 段末收尾語 / 表格前導句 / 過渡詞同樣是模板的一種；批量寫作時最易讓 cadence 同質化、單篇看起來都合規、連讀多篇才浮現預期化；51 vendor 都用「四件事 → 任一缺失就是 X 邊界的待補項目」是案例；自檢要 grep 首句 / 段末句 / 表格前導句、不是只看欄位">#122 Cadence 同質化是模板的隱形維度&lt;/a>：偵測手段同構 — 都是 grep 句子層的字面重複；差別在範圍：#122 抓同 surface 多檔的句式骨架重複、本卡抓跨 surface 的完整句逐字重複。兩個掃描可以同一輪跑。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/rule-codification-vs-self-audit/" data-link-title="規範化跟自審是兩種認知任務、立規範當下無法保護同批稿件" data-link-desc="把反模式抽象成規範卡、跟在自己稿件辨識該反模式的局部實例、是兩種不同認知任務；前者用『歸納共同特徵』的視角、後者用『局部 pattern matching』的視角；用相同概念詞、走不同神經路徑；案例：#146 卡描述「看 X 如何 Y」是反模式、同 batch 5 篇章節仍有 11 處該句型未被作者察覺；修法是規範化當下立刻把規範轉成 grep keyword、對同 batch 稿件主動 sweep；不修則 #122 主題語意 attractor 跟 #124 emergence 違規會在同 batch 內持續累積">#147 規範化跟自審是兩種認知任務&lt;/a>：本卡的 case 正是規範已存在（「各寫一份、語境化在各 surface 內」白紙黑字）、執行時仍搬運 — 立規範的人在執行時用了「各寫一份」的字面（檔案確實是兩個）、漏了「語境化」的實質（句子是同一批）。規範的字面合規與實質合規是兩層檢查。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/teaching-register-states-not-addresses-reader/" data-link-title="教材用中性陳述、不對讀者喊話" data-link-desc="教材的 register 是中性陳述概念、不是對讀者說話。三種對讀者喊話的形式 —— 安撫情緒（很多人卡在）、第二人稱代入（你天天寫）、祈使控制閱讀（先讀懂 / 別搞混）—— 表面不同、共同違反是把讀者當成要管理的對話對象、而非把概念講清楚。問題不在精度（「你天天寫的 int count」精度完全正確）、在 stance。修法是換成中性陳述（常見的 int count）或描述性名詞標題（簽章的型別與名字拆解）。邊界：hook / narrative 段落的輕度第二人稱可幫讀者進入、不一律禁。">#150 教材用中性陳述、不對讀者喊話&lt;/a>：register 是語境化最敏感的維度 — 教材的中性陳述、協議的指令語氣、訪談的問句、三種 register 不可互換；搬運最先破壞的就是 register 對位。&lt;/li>
&lt;/ul>
&lt;h2 id="觸發-case">觸發 case&lt;/h2>
&lt;p>一個交付形態判讀主題同時寫進 blog 教學章節與 agent 訪談 skill。Cadence 審查跨 surface 比對、抓到三句完整句逐字相同：「官方首頁文案」反向問、「判讀單位是每條業務流程」、「同一個錯誤的兩個方向」。兩個 surface 的規範明文要求各寫一份語境化 — 檔案確實是兩份、句子卻是搬的。修法把 skill 版三句全部改寫成訪談操作語氣（「請使用者用一句話描述核心流程、然後對照」「gate 逐條業務流程過、混合結論直接寫進決策記錄的交付形態欄」）、修辭句直接刪除 — 改寫後兩邊各自更貼自己的用途、概念對應不變。&lt;/p>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>寫第二個 surface 時發現自己在開兩個視窗對照逐段抄 — 關掉第一份、憑概念重寫、寫完再對照查漏。&lt;/li>
&lt;li>跨 surface 掃描可操作：對兩份檔案跑完整句比對（句號切分後 grep 交集）、逐字相同的非術語句逐處判讀。&lt;/li>
&lt;li>兩份同主題內容的 register 相同（教材版讀起來像協議、或協議版讀起來像散文）— 即使句子不同、也是語境化不完整的訊號。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>同主題內容要落在兩個 surface（人類教材 ↔ agent 協議、公開文章 ↔ 內部 skill）時、每一份要<strong>為自己的讀者與用途重寫、不是把句子搬過去</strong>。「各寫一份」的規範如果用複製貼上執行、得到的是最差組合：兩份字面綁定（改一邊、另一邊變成過期複本、且沒有任何機制提醒）、卻又各自沒有為自己的 surface 最佳化（教材句直接當協議用、agent 拿到的是給人類讀的敘述而不是可執行的指令）。</p>
<p>語境化的可操作判準：<strong>兩個 surface 之間 grep 逐字相同的完整句、命中就是候選</strong>。同一個原則、教材版該長成「為什麼 + 案例 + 判讀」、協議版該長成「步驟 + 條件 + 產出格式」— 兩版講同一件事、句子自然長得不一樣；句子一樣、代表至少有一邊在用別人的形狀。</p>
<h2 id="為什麼搬運是預設行為">為什麼搬運是預設行為</h2>
<p>寫第二份時、第一份就在手邊、而且它「已經寫對了」— 複製是零成本、重寫要重新思考這個 surface 的讀者需要什麼形狀。搬運在當下看起來甚至更安全（兩邊保證一致）；代價在第一次單邊修改時兌現：修了教材版的措辭、skill 版還是舊句、兩邊開始各說各話、而因為當初沒有宣告同源關係、沒有人知道要同步。</p>
<p>「禁止跨 surface 引用」防的是顯性耦合；搬運建立的是隱性耦合 — 更糟、因為看不見。語境化重寫讓兩份真正獨立：主旨對應靠概念、不靠字串。</p>
<h2 id="反模式與修法">反模式與修法</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>修法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>教材的判讀句逐字進協議（「判讀單位是每條業務流程」）</td>
          <td>協議版改寫成操作指令（「gate 逐條業務流程過、混合結論寫進交付形態欄」）</td>
      </tr>
      <tr>
          <td>反向問的問句兩邊同字</td>
          <td>教材版是讀者自問、協議版是「請使用者……然後對照」的訪談動作</td>
      </tr>
      <tr>
          <td>比喻句 / 警句原樣複製（修辭跨 surface 失效最快）</td>
          <td>各 surface 用自己的語感重寫、或協議版直接刪修辭留判準</td>
      </tr>
      <tr>
          <td>表格整張複製</td>
          <td>欄位依用途裁剪：教材表帶「為什麼」欄、協議表帶「下一步路由」欄</td>
      </tr>
  </tbody>
</table>
<p>欄位與句式跟著用途走之後、兩份的字面自然分開；對照查漏時找的是概念缺口、不是字串差異。</p>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><a href="/blog/report/single-source-of-truth/" data-link-title="Single Source of Truth：值的住址只能有一處" data-link-desc="同一個值（CSS token、視覺基準、runtime 量測）的權威來源只能有一個位置 — 多源時會分歧、會漏改、會讓讀者不知道哪個生效。本文是 #3 / #26 / #27 三篇實作的共同抽象。">#44 Single Source of Truth</a>：逐字搬運讓同一段論述以兩份完整複本存在、誰是權威沒有任何標記。比一般 SSoT 違反更難修 — 第一步的困難不在改、在發現同源關係存在。</li>
<li><a href="/blog/report/cadence-homogenization-in-batch-writing/" data-link-title="Cadence 同質化是模板的隱形維度" data-link-desc="規範定義「模板」時通常只指內容欄位（規模對照、tripwire、失敗模式），忽略句型骨架 / 段首語 / 段末收尾語 / 表格前導句 / 過渡詞同樣是模板的一種；批量寫作時最易讓 cadence 同質化、單篇看起來都合規、連讀多篇才浮現預期化；51 vendor 都用「四件事 → 任一缺失就是 X 邊界的待補項目」是案例；自檢要 grep 首句 / 段末句 / 表格前導句、不是只看欄位">#122 Cadence 同質化是模板的隱形維度</a>：偵測手段同構 — 都是 grep 句子層的字面重複；差別在範圍：#122 抓同 surface 多檔的句式骨架重複、本卡抓跨 surface 的完整句逐字重複。兩個掃描可以同一輪跑。</li>
<li><a href="/blog/report/rule-codification-vs-self-audit/" data-link-title="規範化跟自審是兩種認知任務、立規範當下無法保護同批稿件" data-link-desc="把反模式抽象成規範卡、跟在自己稿件辨識該反模式的局部實例、是兩種不同認知任務；前者用『歸納共同特徵』的視角、後者用『局部 pattern matching』的視角；用相同概念詞、走不同神經路徑；案例：#146 卡描述「看 X 如何 Y」是反模式、同 batch 5 篇章節仍有 11 處該句型未被作者察覺；修法是規範化當下立刻把規範轉成 grep keyword、對同 batch 稿件主動 sweep；不修則 #122 主題語意 attractor 跟 #124 emergence 違規會在同 batch 內持續累積">#147 規範化跟自審是兩種認知任務</a>：本卡的 case 正是規範已存在（「各寫一份、語境化在各 surface 內」白紙黑字）、執行時仍搬運 — 立規範的人在執行時用了「各寫一份」的字面（檔案確實是兩個）、漏了「語境化」的實質（句子是同一批）。規範的字面合規與實質合規是兩層檢查。</li>
<li><a href="/blog/report/teaching-register-states-not-addresses-reader/" data-link-title="教材用中性陳述、不對讀者喊話" data-link-desc="教材的 register 是中性陳述概念、不是對讀者說話。三種對讀者喊話的形式 —— 安撫情緒（很多人卡在）、第二人稱代入（你天天寫）、祈使控制閱讀（先讀懂 / 別搞混）—— 表面不同、共同違反是把讀者當成要管理的對話對象、而非把概念講清楚。問題不在精度（「你天天寫的 int count」精度完全正確）、在 stance。修法是換成中性陳述（常見的 int count）或描述性名詞標題（簽章的型別與名字拆解）。邊界：hook / narrative 段落的輕度第二人稱可幫讀者進入、不一律禁。">#150 教材用中性陳述、不對讀者喊話</a>：register 是語境化最敏感的維度 — 教材的中性陳述、協議的指令語氣、訪談的問句、三種 register 不可互換；搬運最先破壞的就是 register 對位。</li>
</ul>
<h2 id="觸發-case">觸發 case</h2>
<p>一個交付形態判讀主題同時寫進 blog 教學章節與 agent 訪談 skill。Cadence 審查跨 surface 比對、抓到三句完整句逐字相同：「官方首頁文案」反向問、「判讀單位是每條業務流程」、「同一個錯誤的兩個方向」。兩個 surface 的規範明文要求各寫一份語境化 — 檔案確實是兩份、句子卻是搬的。修法把 skill 版三句全部改寫成訪談操作語氣（「請使用者用一句話描述核心流程、然後對照」「gate 逐條業務流程過、混合結論直接寫進決策記錄的交付形態欄」）、修辭句直接刪除 — 改寫後兩邊各自更貼自己的用途、概念對應不變。</p>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>寫第二個 surface 時發現自己在開兩個視窗對照逐段抄 — 關掉第一份、憑概念重寫、寫完再對照查漏。</li>
<li>跨 surface 掃描可操作：對兩份檔案跑完整句比對（句號切分後 grep 交集）、逐字相同的非術語句逐處判讀。</li>
<li>兩份同主題內容的 register 相同（教材版讀起來像協議、或協議版讀起來像散文）— 即使句子不同、也是語境化不完整的訊號。</li>
</ul>
]]></content:encoded></item><item><title>摘要壓縮可以丟細節、不可以改模態</title><link>https://tarrragon.github.io/blog/report/summary-compression-preserves-modality/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/summary-compression-preserves-modality/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>讀 description 進來的人以為底線零彈性 — 這個誤解是摘要製造的、本體沒寫過這種規則。摘要、description、索引 hook 對規則做壓縮時、&lt;strong>可以丟細節、不可以改模態&lt;/strong>：模態是約束的強度與結構：禁止（不可做）、條件允許（可做、但要滿足 X）、預設加例外（預設 A、條件 B 時走 C）。「防護底線可延後、但不可沉默跳過、要記錄延後理由與重評條件」是條件允許 — 壓成「不可跳過的防護底線」變成禁止、規則精心設計的出口（記錄式延後）在摘要層消失了。&lt;/p>
&lt;p>檢驗的問題只有一個：&lt;strong>讀者只依摘要行動、會不會做出本體不要求、或錯過本體允許的事？&lt;/strong>「不可跳過」的讀者會以為底線零彈性、可能因此放棄整個流程、或在現實壓力下偷偷跳過 — 兩種行為都是本體設計（給一條光明正大的延後路）想避免的。&lt;/p>
&lt;h2 id="為什麼模態最容易被壓掉">為什麼模態最容易被壓掉&lt;/h2>
&lt;p>摘要追求短、模態詞通常比較長：「不可沉默跳過」比「不可跳過」多兩個字、「可延後但要記錄重評條件」比「必須做」多七個字。壓縮時每個字都在被審視「能不能省」、而模態詞看起來像修飾 — 砍掉之後句子更乾脆、語氣更有力、寫摘要的人甚至會覺得更好。失真就藏在「更有力」裡：力度是模態的一部分、加強力度就是改模態。&lt;/p>
&lt;p>另一個機制：摘要常在本體完成後補寫、寫摘要時人記得的是規則的「主旨」（底線很重要、不能隨便跳）、不是規則的「結構」（重要、而且有一條設計好的延後路徑）。主旨記憶天然丟結構。&lt;/p>
&lt;h2 id="反模式與修法">反模式與修法&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>「不可跳過的防護底線」&lt;/td>
 &lt;td>可延後、不可沉默、要記錄&lt;/td>
 &lt;td>讀者以為零彈性、放棄流程或偷偷跳過&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「必須先寫測試」&lt;/td>
 &lt;td>預設先寫、prototype 階段可後補&lt;/td>
 &lt;td>探索性工作被迫套不適用的紀律&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「禁止使用 X」&lt;/td>
 &lt;td>預設避免、場景 Y 經評估可用&lt;/td>
 &lt;td>場景 Y 的合法使用被誤殺、或規則被整體無視&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「自動部署到 production」&lt;/td>
 &lt;td>通過 gate 後自動部署&lt;/td>
 &lt;td>讀者以為無人把關、信任崩壞&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>前三列的失真都往絕對化壓（彈性 → 禁令）、這是主要的重力方向；第四列是反向 — 把有把關講成無把關 — 較少見、但判準同一條：摘要引發的行為偏離本體。&lt;/p>
&lt;p>修法：壓縮時保留模態的最小標記 — 「不可沉默跳過」「預設 X、例外見本體」「通過 gate 後自動」。模態標記是摘要裡優先級最高的字、跟主詞動詞同級、比任何細節都後砍。&lt;/p>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/metadata-surface-in-writing-review/" data-link-title="Metadata surface 要納入寫作 review 範圍" data-link-desc="寫作 review 的 surface 包含正文與 metadata surface：title、description、frontmatter、heading、link label、MOC 索引條。正文通過 positive wording 或 multi-pass review 只代表 body surface 收斂；讀者入口與索引入口也要跑同一套 frame，才能讓文章在第一眼、搜尋與跨篇路由上維持同一個概念錨點。">#97 Metadata surface 要納入寫作 review 範圍&lt;/a>：本卡是 #97 的「審什麼」具體化之一 — metadata surface 進了 review 範圍之後、模態一致性是該 surface 最該查的維度、因為 description 是讀者第一個（常常也是唯一一個）讀到的版本。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/article-body-must-align-with-title-commitment/" data-link-title="文章主體要對齊標題承諾、WRAP 內部分析不該喧賓奪主" data-link-desc="文章標題對讀者做了承諾、文章主體必須對齊這個承諾。WRAP 內部分析（Widen Options &amp;#43; Reality Test 含 prior 引用 &amp;#43; evidence weight）即使方法論做得好、如果不是標題承諾的內容、就不該佔文章主體—屬於 scope mismatch、跟 process metadata 暴露（#141）的議題分開。附帶議題：當 WRAP 內部分析喧賓奪主、為了支撐 prior 容易引入沒實際出處的 source citation；把 WRAP 內部分析從主體移除、hallucination 風險自然降低。是 #141 的姊妹卡—#141 處理章節標題 surface、本卡處理章節內容 scope。">#142 文章主體要對齊標題承諾&lt;/a>：方向相反的同一條對齊軸 — #142 查 body 有沒有兌現 title 的承諾（由上往下）、本卡查摘要有沒有忠實代表 body 的約束（由下往上）。兩個方向都通過、surface 跟本體才真正一致。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/design-choices-framed-as-choices-not-necessity/" data-link-title="教材把設計選擇講成選擇、不講成必然或天性" data-link-desc="本質主義 / 必然性框架（天生 / 本質就是 / 必然 / 唯一）把一個設計選擇講成自然法則、抹掉設計能動性，讓讀者以為沒得選。它是『機會成本語氣 vs 絕對主義』違反的一個 subtype —— 不是命令式絕對（應該做 X）、而是必然性絕對（X 本來就這樣）、更隱形。sharp feature 是常局部牴觸作者自己在別處的條件性立場。修法是把必然框架還原成條件性：X 在『選了某前提』之後才以此形式成立。邊界：物理 / 法律 / 合規事實可講必然。">#152 教材把設計選擇講成選擇、不講成必然&lt;/a>：跟 #152 同在「模態失真」這條軸上。#152 抓正文把條件性講成必然性、本卡抓摘要把條件允許壓成絕對禁止 — 主要失真方向相同（彈性 → 絕對；反向較少見、見上表第四列）、發生層不同（正文論述 vs 壓縮層）。絕對化的句子在兩層都更省字、更有力、更好寫 — 失真有一致的重力方向。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/ease-of-writing-vs-intent-alignment/" data-link-title="寫作便利度跟意圖對齊反相關" data-link-desc="寫程式時最容易寫出的版本、通常是離意圖最遠的版本。便利度建立在「現有上下文 / 已 materialize 資料 / 已存在 API」上、而意圖對齊需要找到正確的層、處理上游、跨抽象層 — 兩者方向相反。識別這個反相關 = 識別自己掉進「容易寫的陷阱」。">#67 寫作便利度跟意圖對齊反相關&lt;/a>：「不可跳過」比「不可沉默跳過」好寫好讀、正是便利驅動 — 摘要層的字數壓力讓這個重力更強、所以摘要的模態審查要比正文更嚴。&lt;/li>
&lt;/ul>
&lt;h2 id="觸發-case">觸發 case&lt;/h2>
&lt;p>使用者開啟一個訪談 skill、description 告訴他「每個維度附不可跳過的防護底線」— 他合理推論底線零彈性、可能因此覺得流程太硬。本體寫的是另一回事：「可延後、不可沉默跳過（記錄『已告知 + 延後理由 + 重評條件』）」、整個 baseline reference 的核心設計就是那條延後記錄協議。跨 surface 審查的判定：「body 的設計更精緻、description 的壓縮把它講成絕對禁令」。修復把「不可跳過」改成「不可沉默跳過」— 模態跟著那兩個字一起回來。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>讀 description 進來的人以為底線零彈性 — 這個誤解是摘要製造的、本體沒寫過這種規則。摘要、description、索引 hook 對規則做壓縮時、<strong>可以丟細節、不可以改模態</strong>：模態是約束的強度與結構：禁止（不可做）、條件允許（可做、但要滿足 X）、預設加例外（預設 A、條件 B 時走 C）。「防護底線可延後、但不可沉默跳過、要記錄延後理由與重評條件」是條件允許 — 壓成「不可跳過的防護底線」變成禁止、規則精心設計的出口（記錄式延後）在摘要層消失了。</p>
<p>檢驗的問題只有一個：<strong>讀者只依摘要行動、會不會做出本體不要求、或錯過本體允許的事？</strong>「不可跳過」的讀者會以為底線零彈性、可能因此放棄整個流程、或在現實壓力下偷偷跳過 — 兩種行為都是本體設計（給一條光明正大的延後路）想避免的。</p>
<h2 id="為什麼模態最容易被壓掉">為什麼模態最容易被壓掉</h2>
<p>摘要追求短、模態詞通常比較長：「不可沉默跳過」比「不可跳過」多兩個字、「可延後但要記錄重評條件」比「必須做」多七個字。壓縮時每個字都在被審視「能不能省」、而模態詞看起來像修飾 — 砍掉之後句子更乾脆、語氣更有力、寫摘要的人甚至會覺得更好。失真就藏在「更有力」裡：力度是模態的一部分、加強力度就是改模態。</p>
<p>另一個機制：摘要常在本體完成後補寫、寫摘要時人記得的是規則的「主旨」（底線很重要、不能隨便跳）、不是規則的「結構」（重要、而且有一條設計好的延後路徑）。主旨記憶天然丟結構。</p>
<h2 id="反模式與修法">反模式與修法</h2>
<table>
  <thead>
      <tr>
          <th>反模式（摘要層）</th>
          <th>本體實際模態</th>
          <th>失真後果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「不可跳過的防護底線」</td>
          <td>可延後、不可沉默、要記錄</td>
          <td>讀者以為零彈性、放棄流程或偷偷跳過</td>
      </tr>
      <tr>
          <td>「必須先寫測試」</td>
          <td>預設先寫、prototype 階段可後補</td>
          <td>探索性工作被迫套不適用的紀律</td>
      </tr>
      <tr>
          <td>「禁止使用 X」</td>
          <td>預設避免、場景 Y 經評估可用</td>
          <td>場景 Y 的合法使用被誤殺、或規則被整體無視</td>
      </tr>
      <tr>
          <td>「自動部署到 production」</td>
          <td>通過 gate 後自動部署</td>
          <td>讀者以為無人把關、信任崩壞</td>
      </tr>
  </tbody>
</table>
<p>前三列的失真都往絕對化壓（彈性 → 禁令）、這是主要的重力方向；第四列是反向 — 把有把關講成無把關 — 較少見、但判準同一條：摘要引發的行為偏離本體。</p>
<p>修法：壓縮時保留模態的最小標記 — 「不可沉默跳過」「預設 X、例外見本體」「通過 gate 後自動」。模態標記是摘要裡優先級最高的字、跟主詞動詞同級、比任何細節都後砍。</p>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><a href="/blog/report/metadata-surface-in-writing-review/" data-link-title="Metadata surface 要納入寫作 review 範圍" data-link-desc="寫作 review 的 surface 包含正文與 metadata surface：title、description、frontmatter、heading、link label、MOC 索引條。正文通過 positive wording 或 multi-pass review 只代表 body surface 收斂；讀者入口與索引入口也要跑同一套 frame，才能讓文章在第一眼、搜尋與跨篇路由上維持同一個概念錨點。">#97 Metadata surface 要納入寫作 review 範圍</a>：本卡是 #97 的「審什麼」具體化之一 — metadata surface 進了 review 範圍之後、模態一致性是該 surface 最該查的維度、因為 description 是讀者第一個（常常也是唯一一個）讀到的版本。</li>
<li><a href="/blog/report/article-body-must-align-with-title-commitment/" data-link-title="文章主體要對齊標題承諾、WRAP 內部分析不該喧賓奪主" data-link-desc="文章標題對讀者做了承諾、文章主體必須對齊這個承諾。WRAP 內部分析（Widen Options &#43; Reality Test 含 prior 引用 &#43; evidence weight）即使方法論做得好、如果不是標題承諾的內容、就不該佔文章主體—屬於 scope mismatch、跟 process metadata 暴露（#141）的議題分開。附帶議題：當 WRAP 內部分析喧賓奪主、為了支撐 prior 容易引入沒實際出處的 source citation；把 WRAP 內部分析從主體移除、hallucination 風險自然降低。是 #141 的姊妹卡—#141 處理章節標題 surface、本卡處理章節內容 scope。">#142 文章主體要對齊標題承諾</a>：方向相反的同一條對齊軸 — #142 查 body 有沒有兌現 title 的承諾（由上往下）、本卡查摘要有沒有忠實代表 body 的約束（由下往上）。兩個方向都通過、surface 跟本體才真正一致。</li>
<li><a href="/blog/report/design-choices-framed-as-choices-not-necessity/" data-link-title="教材把設計選擇講成選擇、不講成必然或天性" data-link-desc="本質主義 / 必然性框架（天生 / 本質就是 / 必然 / 唯一）把一個設計選擇講成自然法則、抹掉設計能動性，讓讀者以為沒得選。它是『機會成本語氣 vs 絕對主義』違反的一個 subtype —— 不是命令式絕對（應該做 X）、而是必然性絕對（X 本來就這樣）、更隱形。sharp feature 是常局部牴觸作者自己在別處的條件性立場。修法是把必然框架還原成條件性：X 在『選了某前提』之後才以此形式成立。邊界：物理 / 法律 / 合規事實可講必然。">#152 教材把設計選擇講成選擇、不講成必然</a>：跟 #152 同在「模態失真」這條軸上。#152 抓正文把條件性講成必然性、本卡抓摘要把條件允許壓成絕對禁止 — 主要失真方向相同（彈性 → 絕對；反向較少見、見上表第四列）、發生層不同（正文論述 vs 壓縮層）。絕對化的句子在兩層都更省字、更有力、更好寫 — 失真有一致的重力方向。</li>
<li><a href="/blog/report/ease-of-writing-vs-intent-alignment/" data-link-title="寫作便利度跟意圖對齊反相關" data-link-desc="寫程式時最容易寫出的版本、通常是離意圖最遠的版本。便利度建立在「現有上下文 / 已 materialize 資料 / 已存在 API」上、而意圖對齊需要找到正確的層、處理上游、跨抽象層 — 兩者方向相反。識別這個反相關 = 識別自己掉進「容易寫的陷阱」。">#67 寫作便利度跟意圖對齊反相關</a>：「不可跳過」比「不可沉默跳過」好寫好讀、正是便利驅動 — 摘要層的字數壓力讓這個重力更強、所以摘要的模態審查要比正文更嚴。</li>
</ul>
<h2 id="觸發-case">觸發 case</h2>
<p>使用者開啟一個訪談 skill、description 告訴他「每個維度附不可跳過的防護底線」— 他合理推論底線零彈性、可能因此覺得流程太硬。本體寫的是另一回事：「可延後、不可沉默跳過（記錄『已告知 + 延後理由 + 重評條件』）」、整個 baseline reference 的核心設計就是那條延後記錄協議。跨 surface 審查的判定：「body 的設計更精緻、description 的壓縮把它講成絕對禁令」。修復把「不可跳過」改成「不可沉默跳過」— 模態跟著那兩個字一起回來。</p>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>寫完 description / hook / 目錄註解、回頭比對本體：摘要裡的每個禁止詞與必須詞、本體是同等強度嗎？本體帶「但 / 除非 / 可…需」的句子、摘要保留出口了嗎？</li>
<li>摘要讀起來比本體「更有力、更乾脆」— 力度差就是模態差的訊號、不是文筆進步。</li>
<li>規則被使用者抱怨「太死」或被整體無視時、先查他讀到的是哪一層 — 常常本體無罪、是摘要把彈性壓掉了。</li>
<li>反方向也要掃一眼：摘要讀起來比本體更寬鬆（「自動」「隨時可」）、把本體的把關與條件吃掉了 — 較少見、同樣是模態失真。</li>
</ul>
]]></content:encoded></item><item><title>引用卡片用被引卡自己的分類詞彙：改寫對方的 taxonomy 是隱性錯引</title><link>https://tarrragon.github.io/blog/report/cite-cards-with-their-own-taxonomy/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/cite-cards-with-their-own-taxonomy/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>寫關係段的第一個動作是把被引卡重新打開 — 因為&lt;strong>描述另一張卡、要用它自己的分類詞彙&lt;/strong>、而記憶給不出 taxonomy 級的細節。「引用句是 metadata surface 的一種」這句話裡、「metadata surface」是被引卡的術語 — 而被引卡自己的分類表把 link label、索引條目歸在與 metadata surface 並列的 &lt;strong>navigation surface&lt;/strong>。引用方憑印象把對方的兩個分類併成一個、關係宣告的精神沒錯、詞彙錯位了。&lt;/p>
&lt;p>錯位的代價由循線的讀者支付：他讀到引用句、點過去想看完整論述、發現被引卡的分類表跟引用句對不上 — 輕則困惑（是我讀錯還是卡寫錯）、重則回頭懷疑引用卡的其他關係宣告是不是也是憑印象寫的。關係段的價值在「可回溯」、詞彙錯位直接打在回溯體驗上。&lt;/p>
&lt;h2 id="為什麼憑印象轉述是預設">為什麼憑印象轉述是預設&lt;/h2>
&lt;p>寫關係段時、被引卡是「自己以前寫的、很熟」— 熟悉感讓人跳過重讀、直接憑記憶描述。而記憶存的是概念（「那張卡講非正文的 surface 要進 review」）、不是分類結構（它把非正文拆成 metadata 跟 navigation 兩類）。概念記憶寫出來的引用、語意大方向對、taxonomy 細節隨機。翻譯憑語感不查原文、換掉的是術語的角色；引用憑記憶不開原卡、換掉的是分類的歸屬 — 兩個介面、同一種失誤。&lt;/p>
&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>「X 是 metadata surface 的一種」（被引卡歸 navigation）&lt;/td>
 &lt;td>重讀被引卡分類段、改用它的詞：「X 屬於該卡分類中的 navigation surface」&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>把被引卡的三分法轉述成二分法&lt;/td>
 &lt;td>引用時保留它的分法、自己的簡化標明是簡化&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>用自己卡的術語替換對方同概念的術語&lt;/td>
 &lt;td>兩套術語並陳（「本卡稱 A、該卡稱 B」）、讓讀者能雙向對照&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>引用句的宣稱強度超過被引卡（它說 sibling、引成上位）&lt;/td>
 &lt;td>關係的方向與層級照抄被引卡的自我定位、有分歧就明寫分歧&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>再陳述的查核對象永遠是原文、不是記憶 — 不論那張卡是不是自己寫的、寫關係段前把結論段跟分類表重新攤開。&lt;/p>
&lt;h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/translation-must-preserve-concept-role/" data-link-title="術語翻譯要保留概念角色" data-link-desc="術語翻譯不能只追求中文好讀，還要保留原詞在論證中的概念角色。Steelman 若翻成「最強版本測試」，reader 會以為它是一個檢查動作；但在決策語境裡，它更核心的責任是把反方論點重建成最強版本。">#109 術語翻譯要保留概念角色&lt;/a>：同一條紀律在不同介面 — #109 管跨語言轉述（翻譯時概念在原文的角色不能換位）、本卡管跨卡片轉述（引用時概念在被引卡的分類位置不能換位）。兩者的失誤機制相同：轉述者用自己的理解重新組織了對方的結構。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/terminology-keeps-original-anchor/" data-link-title="術語翻譯要保留原文錨點" data-link-desc="翻譯術語時、中文名稱負責降低閱讀門檻，原文名稱負責鎖定概念邊界。只留中文會把 reader 帶進中文詞的日常歧義，只留英文會提高閱讀成本；中文後接英文括號是技術文章的穩定折衷。">#107 術語翻譯要保留原文錨點&lt;/a>：#107 的「保留原文讓概念可回溯」在引用場景的對應物 — 引用句裡被引卡的術語就是錨點、錨點寫錯、回溯就斷。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/fact-vs-derive-citation-layering/" data-link-title="引用案例要分觀察層 / 判讀層、強化詞是錯位訊號" data-link-desc="引用案例（特別是 rich case）時、case 內容分兩層：觀察層（具體 fact）跟判讀層（作者推論）；兩層在章節引用時要分層標明、避免把作者判讀升級成 case fact；強化詞（才是 / 必須 / 一定 / 關鍵是）通常是錯位訊號、保留 case 原文的條件性表述（取決於 / 核心瓶頸 / 主要驅動）">#116 引用案例要分觀察層 / 判讀層&lt;/a>：跟 #116 都在守引用的準確性。#116 管引用內容的層次標註（哪些是 case 的事實、哪些是本文推導）、本卡管引用所用詞彙的歸屬（描述對方時用對方的詞）— 兩者都在防「引用方的加工被讀者當成被引方的原文」。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/report/metadata-surface-in-writing-review/" data-link-title="Metadata surface 要納入寫作 review 範圍" data-link-desc="寫作 review 的 surface 包含正文與 metadata surface：title、description、frontmatter、heading、link label、MOC 索引條。正文通過 positive wording 或 multi-pass review 只代表 body surface 收斂；讀者入口與索引入口也要跑同一套 frame，才能讓文章在第一眼、搜尋與跨篇路由上維持同一個概念錨點。">#97 Metadata surface 要納入寫作 review 範圍&lt;/a>：本卡的觸發 case 恰好是引用 #97 時錯置了它的分類 — fact-check reviewer 打開 #97 的分類表逐欄比對才抓到。關係段的 review 方法就是這個動作：逐條開被引卡核對。&lt;/li>
&lt;/ul>
&lt;h2 id="觸發-case">觸發 case&lt;/h2>
&lt;p>一張新卡的關係段寫「引用句是 metadata surface 的一種 — 它不是正文論述、是指向結構的導航層」、引用對象是「Metadata surface 要納入寫作 review 範圍」卡。Fact-check 審查打開被引卡、發現它的分類表把 link label / 索引條目列在 &lt;strong>navigation surface&lt;/strong>、跟 metadata surface 是並列的兩列 — 引用句把對方明確分開的兩類併成了一類。判定原文：「關係精神成立（非正文 surface 要納入 review 掃描面）、但嚴格按被引卡的詞彙、引用句更接近 navigation surface」。修法：引用句改成「引用句屬於該卡分類中的 navigation surface（跟 link label、索引條目同層）」— 關係宣告不變、詞彙歸位。&lt;/p>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>寫關係段時沒有重新打開被引卡 — 不論多熟、開來把結論段跟分類表掃一遍再寫。&lt;/li>
&lt;li>引用句使用了被引卡的專有分類詞（surface 類型、層級名、模式名）— 逐詞回原卡確認歸屬、這些詞是對方的 taxonomy、不是公共詞彙。&lt;/li>
&lt;li>review 關係段的方法：每條關係宣告配一次「開被引卡、找到支撐句」的核對、找不到支撐句的宣告就是憑印象寫的。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>寫關係段的第一個動作是把被引卡重新打開 — 因為<strong>描述另一張卡、要用它自己的分類詞彙</strong>、而記憶給不出 taxonomy 級的細節。「引用句是 metadata surface 的一種」這句話裡、「metadata surface」是被引卡的術語 — 而被引卡自己的分類表把 link label、索引條目歸在與 metadata surface 並列的 <strong>navigation surface</strong>。引用方憑印象把對方的兩個分類併成一個、關係宣告的精神沒錯、詞彙錯位了。</p>
<p>錯位的代價由循線的讀者支付：他讀到引用句、點過去想看完整論述、發現被引卡的分類表跟引用句對不上 — 輕則困惑（是我讀錯還是卡寫錯）、重則回頭懷疑引用卡的其他關係宣告是不是也是憑印象寫的。關係段的價值在「可回溯」、詞彙錯位直接打在回溯體驗上。</p>
<h2 id="為什麼憑印象轉述是預設">為什麼憑印象轉述是預設</h2>
<p>寫關係段時、被引卡是「自己以前寫的、很熟」— 熟悉感讓人跳過重讀、直接憑記憶描述。而記憶存的是概念（「那張卡講非正文的 surface 要進 review」）、不是分類結構（它把非正文拆成 metadata 跟 navigation 兩類）。概念記憶寫出來的引用、語意大方向對、taxonomy 細節隨機。翻譯憑語感不查原文、換掉的是術語的角色；引用憑記憶不開原卡、換掉的是分類的歸屬 — 兩個介面、同一種失誤。</p>
<p>被引卡越熟、風險越高：陌生的卡會被打開來查、自己的卡靠記憶。</p>
<h2 id="反模式與修法">反模式與修法</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>修法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「X 是 metadata surface 的一種」（被引卡歸 navigation）</td>
          <td>重讀被引卡分類段、改用它的詞：「X 屬於該卡分類中的 navigation surface」</td>
      </tr>
      <tr>
          <td>把被引卡的三分法轉述成二分法</td>
          <td>引用時保留它的分法、自己的簡化標明是簡化</td>
      </tr>
      <tr>
          <td>用自己卡的術語替換對方同概念的術語</td>
          <td>兩套術語並陳（「本卡稱 A、該卡稱 B」）、讓讀者能雙向對照</td>
      </tr>
      <tr>
          <td>引用句的宣稱強度超過被引卡（它說 sibling、引成上位）</td>
          <td>關係的方向與層級照抄被引卡的自我定位、有分歧就明寫分歧</td>
      </tr>
  </tbody>
</table>
<p>再陳述的查核對象永遠是原文、不是記憶 — 不論那張卡是不是自己寫的、寫關係段前把結論段跟分類表重新攤開。</p>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<ul>
<li><a href="/blog/report/translation-must-preserve-concept-role/" data-link-title="術語翻譯要保留概念角色" data-link-desc="術語翻譯不能只追求中文好讀，還要保留原詞在論證中的概念角色。Steelman 若翻成「最強版本測試」，reader 會以為它是一個檢查動作；但在決策語境裡，它更核心的責任是把反方論點重建成最強版本。">#109 術語翻譯要保留概念角色</a>：同一條紀律在不同介面 — #109 管跨語言轉述（翻譯時概念在原文的角色不能換位）、本卡管跨卡片轉述（引用時概念在被引卡的分類位置不能換位）。兩者的失誤機制相同：轉述者用自己的理解重新組織了對方的結構。</li>
<li><a href="/blog/report/terminology-keeps-original-anchor/" data-link-title="術語翻譯要保留原文錨點" data-link-desc="翻譯術語時、中文名稱負責降低閱讀門檻，原文名稱負責鎖定概念邊界。只留中文會把 reader 帶進中文詞的日常歧義，只留英文會提高閱讀成本；中文後接英文括號是技術文章的穩定折衷。">#107 術語翻譯要保留原文錨點</a>：#107 的「保留原文讓概念可回溯」在引用場景的對應物 — 引用句裡被引卡的術語就是錨點、錨點寫錯、回溯就斷。</li>
<li><a href="/blog/report/fact-vs-derive-citation-layering/" data-link-title="引用案例要分觀察層 / 判讀層、強化詞是錯位訊號" data-link-desc="引用案例（特別是 rich case）時、case 內容分兩層：觀察層（具體 fact）跟判讀層（作者推論）；兩層在章節引用時要分層標明、避免把作者判讀升級成 case fact；強化詞（才是 / 必須 / 一定 / 關鍵是）通常是錯位訊號、保留 case 原文的條件性表述（取決於 / 核心瓶頸 / 主要驅動）">#116 引用案例要分觀察層 / 判讀層</a>：跟 #116 都在守引用的準確性。#116 管引用內容的層次標註（哪些是 case 的事實、哪些是本文推導）、本卡管引用所用詞彙的歸屬（描述對方時用對方的詞）— 兩者都在防「引用方的加工被讀者當成被引方的原文」。</li>
<li><a href="/blog/report/metadata-surface-in-writing-review/" data-link-title="Metadata surface 要納入寫作 review 範圍" data-link-desc="寫作 review 的 surface 包含正文與 metadata surface：title、description、frontmatter、heading、link label、MOC 索引條。正文通過 positive wording 或 multi-pass review 只代表 body surface 收斂；讀者入口與索引入口也要跑同一套 frame，才能讓文章在第一眼、搜尋與跨篇路由上維持同一個概念錨點。">#97 Metadata surface 要納入寫作 review 範圍</a>：本卡的觸發 case 恰好是引用 #97 時錯置了它的分類 — fact-check reviewer 打開 #97 的分類表逐欄比對才抓到。關係段的 review 方法就是這個動作：逐條開被引卡核對。</li>
</ul>
<h2 id="觸發-case">觸發 case</h2>
<p>一張新卡的關係段寫「引用句是 metadata surface 的一種 — 它不是正文論述、是指向結構的導航層」、引用對象是「Metadata surface 要納入寫作 review 範圍」卡。Fact-check 審查打開被引卡、發現它的分類表把 link label / 索引條目列在 <strong>navigation surface</strong>、跟 metadata surface 是並列的兩列 — 引用句把對方明確分開的兩類併成了一類。判定原文：「關係精神成立（非正文 surface 要納入 review 掃描面）、但嚴格按被引卡的詞彙、引用句更接近 navigation surface」。修法：引用句改成「引用句屬於該卡分類中的 navigation surface（跟 link label、索引條目同層）」— 關係宣告不變、詞彙歸位。</p>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>寫關係段時沒有重新打開被引卡 — 不論多熟、開來把結論段跟分類表掃一遍再寫。</li>
<li>引用句使用了被引卡的專有分類詞（surface 類型、層級名、模式名）— 逐詞回原卡確認歸屬、這些詞是對方的 taxonomy、不是公共詞彙。</li>
<li>review 關係段的方法：每條關係宣告配一次「開被引卡、找到支撐句」的核對、找不到支撐句的宣告就是憑印象寫的。</li>
</ul>
]]></content:encoded></item><item><title>技術文章撰寫規範</title><link>https://tarrragon.github.io/blog/posts/%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%92%B0%E5%AF%AB%E8%A6%8F%E7%AF%84/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/posts/%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%92%B0%E5%AF%AB%E8%A6%8F%E7%AF%84/</guid><description>&lt;h2 id="適用範圍">適用範圍&lt;/h2>
&lt;p>本規範適用於團隊內部各類型技術文章，包含：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>概念說明&lt;/strong>：技術原理、系統架構、協定規格&lt;/li>
&lt;li>&lt;strong>實作教學&lt;/strong>：操作步驟、範例、API 用法&lt;/li>
&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;p>核心目標：讓讀者能複製&lt;strong>思考過程&lt;/strong>，不只複製&lt;strong>結論&lt;/strong>。結論一行就能給，思考過程才是文章的主體。&lt;/p></description><content:encoded><![CDATA[<h2 id="適用範圍">適用範圍</h2>
<p>本規範適用於團隊內部各類型技術文章，包含：</p>
<ul>
<li><strong>概念說明</strong>：技術原理、系統架構、協定規格</li>
<li><strong>實作教學</strong>：操作步驟、範例、API 用法</li>
<li><strong>架構決策</strong>：方案比較、選型紀錄、設計文件</li>
<li><strong>除錯復盤</strong>：事故紀錄、疑難排解</li>
<li><strong>技術評估</strong>：工具調研、可行性評估</li>
</ul>
<p>核心目標：讓讀者能複製<strong>思考過程</strong>，不只複製<strong>結論</strong>。結論一行就能給，思考過程才是文章的主體。</p>
<p>本規範四條規則各自後方附有正反例，來源標註：</p>
<ul>
<li>正例多引自 <code>/work-log/</code> 目錄下的已成文文章</li>
<li>反例多引自同系列文章<strong>修改前的版本</strong>（實際寫作過程中踩到過的問題）</li>
</ul>
<hr>
<h2 id="一階段分層">一、階段分層</h2>
<h3 id="規則的商業邏輯">規則的商業邏輯</h3>
<p>技術文章的內容從「事實或需求」推導到「動作或結論」，這個過程有四個功能不同的階段。每個階段處理的問題不同、失敗模式不同：</p>
<ul>
<li><strong>觀察</strong>：描述現況、需求、事實或訊息</li>
<li><strong>判讀</strong>：說明本質、原理、問題所在</li>
<li><strong>策略</strong>：列出可選方案並比較</li>
<li><strong>執行</strong>：具體操作或實作</li>
</ul>
<p>四階段若混著寫，讀者無法區分「這一段失敗是哪個階段」，也無法判斷自己的類似情境卡在哪一步。文章只能被原封不動複製，不能被理解後套用。</p>
<h3 id="做法">做法</h3>
<p>每個主題段落應包含四階段。不同類型文章中四階段的對應：</p>
<table>
  <thead>
      <tr>
          <th>階段</th>
          <th>概念說明</th>
          <th>實作教學</th>
          <th>架構決策</th>
          <th>除錯復盤</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>觀察</td>
          <td>需求或背景</td>
          <td>使用情境</td>
          <td>現況限制</td>
          <td>錯誤訊息</td>
      </tr>
      <tr>
          <td>判讀</td>
          <td>概念本質</td>
          <td>工具的位置與功能</td>
          <td>需求本質</td>
          <td>問題根因</td>
      </tr>
      <tr>
          <td>策略</td>
          <td>不同用法</td>
          <td>不同操作路徑</td>
          <td>可選方案</td>
          <td>可行解法</td>
      </tr>
      <tr>
          <td>執行</td>
          <td>程式碼範例</td>
          <td>操作步驟</td>
          <td>選定實作</td>
          <td>修復動作</td>
      </tr>
  </tbody>
</table>
<h3 id="實例對照">實例對照</h3>
<p><strong>反例（跳過判讀，觀察直接進執行）</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln">1</span><span class="cl"><span class="gu">## 錯誤
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="gu"></span>flutter_broadcasts_4m：Kotlin 1.8 vs Java 17 mismatch
</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 class="gu">## 解法
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="gu"></span>在 subprojects 加上：
</span></span><span class="line"><span class="ln">6</span><span class="cl">tasks.withType(KotlinCompile).configureEach { jvmTarget = &#39;17&#39; }</span></span></code></pre></div><p>問題：讀者能複製貼上，但無法回答「為什麼是 configureEach 不是其他方式」「遇到下一個類似問題怎麼想」。思考過程沒有被保存。</p>
<p><strong>正例</strong>：<code>gradle_reasoning_traps</code> 的節點 A 結構，每個節點顯式展開成「當下看到 → 判讀 → 可選策略 → 選擇與理由 → 結果 → 事後檢視」六個子段落。讀者看完後即使遇到不同錯誤訊息，也能套用同一個四階段推導。</p>
<h3 id="禁止事項">禁止事項</h3>
<ul>
<li>從觀察直接跳執行，省略判讀與策略</li>
<li>判讀留下未解問題就進策略</li>
<li>文章中出現「選擇」卻只列一個選項</li>
</ul>
<h3 id="例外">例外</h3>
<p>純介紹性段落（例如 API 參數說明）可以省略「策略」階段，但不得省略判讀。</p>
<hr>
<h2 id="二商業邏輯先於-case">二、商業邏輯先於 CASE</h2>
<h3 id="規則的商業邏輯-1">規則的商業邏輯</h3>
<p>技術文章的內容包含兩種資訊層次：</p>
<ul>
<li><strong>商業邏輯</strong>：系統層的概念（為什麼這件事存在、在體系中代表什麼）</li>
<li><strong>CASE</strong>：實例層的資料（具體的數值、路徑、屬性、設定）</li>
</ul>
<p>CASE 單獨存在沒有意義。「<code>jvmTarget = 17</code>」這個值需要「為什麼 JVM target 要一致」這個概念當容器才能被理解。</p>
<p>順序顛倒（先 CASE 後商業邏輯）等於讓讀者先記一組沒有脈絡的資料，再倒推抽象概念。這條認知路徑是反向的，多數讀者在倒推失敗後會放棄，即使專業讀者能勉強跟上也會覺得閱讀成本偏高。</p>
<h3 id="做法-1">做法</h3>
<p>每個主題段落包含兩層，順序不得顛倒：</p>
<h4 id="商業邏輯層">商業邏輯層</h4>
<ul>
<li>主題涉及的系統層概念</li>
<li>該概念為什麼存在、解決什麼問題</li>
<li>該類內容的共通本質</li>
</ul>
<p>此層不討論具體數值、路徑、屬性名。</p>
<h4 id="case-層">CASE 層</h4>
<ul>
<li>訊息或規格中的關鍵字對應商業邏輯的哪個位置</li>
<li>具體數值或內容</li>
<li>從 CASE 推論的結論</li>
</ul>
<h3 id="實例對照-1">實例對照</h3>
<p><strong>反例（直接給 CASE，預設讀者懂背景）</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln">1</span><span class="cl"><span class="gu">### 判讀
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">-</span> 這個子專案的 Java task 產出 bytecode target = 17
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="k">-</span> 同一個子專案的 Kotlin task 產出 bytecode target = 1.8
</span></span><span class="line"><span class="ln">5</span><span class="cl">- 兩者不一致觸發 Kotlin 2.2 的 strict validation</span></span></code></pre></div><p>專業人士看了懂，但讀者若不知道「bytecode target」「strict validation」在系統中代表什麼，只能抓到字面字串，無法建立模型。</p>
<p><strong>正例</strong>（加上商業邏輯層當容器）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="gu">### 判讀
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="gs">**這類錯誤的本質（商業邏輯）**</span>：
</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">Android 每個 module 會分別編譯 Java 跟 Kotlin 原始碼，各自產出
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">JVM bytecode。每個 bytecode 有 target version，決定能在哪些 JVM
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">runtime 上跑。同 module 內若兩種語言產出不同 target，runtime
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">可能踩到 API 相容性問題。Kotlin 2.2 把這個從 warning 提升為 error。
</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"><span class="gs">**這次訊息具體說了什麼（CASE）**</span>：
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="k">-</span> compileDebugJavaWithJavac (17) → Java 產出 target 17
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="k">-</span> compileDebugKotlin (1.8) → Kotlin 產出 target 1.8
</span></span><span class="line"><span class="ln">14</span><span class="cl">- 符合上面「module 內不一致」的 pattern</span></span></code></pre></div><p>（出自 <code>gradle_reasoning_traps</code> 節點 A 修改後的版本。修改前是反例那種寫法，修改後加入商業邏輯層。）</p>
<h3 id="完成標準">完成標準</h3>
<p>段落結束前，讀者應能回答：</p>
<ol>
<li>這個主題在系統中為什麼重要？</li>
<li>這個主題的具體案例對應商業邏輯的哪個位置？</li>
</ol>
<p>若只能回答第二題，商業邏輯層不足。</p>
<hr>
<h2 id="三評估用內在屬性">三、評估用內在屬性</h2>
<h3 id="規則的商業邏輯-2">規則的商業邏輯</h3>
<p>技術文章經常包含選擇或比較：選 A 不選 B、用 X 不用 Y、選這個架構不選另一個。選擇的優劣取決於方案的<strong>內在屬性</strong>，不取決於執行者的<strong>時間消耗</strong>：</p>
<ul>
<li><strong>內在屬性</strong>：覆蓋完整性、風險、可逆性、維護成本、可理解性、依賴前提</li>
<li><strong>時間消耗</strong>：實作要多久、多少人工時</li>
</ul>
<p>時間消耗是執行者的資源考量，跟方案本身的正確性無關。用時間當評估維度會造成結構性偏差：<strong>投資型方案</strong>（擴大影響、建立基礎）看起來總是比<strong>消費型方案</strong>（解當前問題）差，但兩者能力的性質不同，不應以同一量度比較。</p>
<p>讀者讀到時間評估會誤以為「這個方案比較好」，但真正該學到的是「兩個方案各自適合什麼情境」。</p>
<h3 id="做法-2">做法</h3>
<p>每個方案比較必須包含下列維度中至少三項：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>評估內容</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>覆蓋完整性</td>
          <td>處理所有同類情境，還是只處理當前</td>
      </tr>
      <tr>
          <td>風險</td>
          <td>失敗機率與代價</td>
      </tr>
      <tr>
          <td>可逆性</td>
          <td>出錯能否回滾</td>
      </tr>
      <tr>
          <td>維護成本</td>
          <td>長期需要多少精力</td>
      </tr>
      <tr>
          <td>可理解性</td>
          <td>未來接手者能否理解</td>
      </tr>
      <tr>
          <td>依賴前提</td>
          <td>建立在什麼假設上，前提變了會如何</td>
      </tr>
  </tbody>
</table>
<h3 id="實例對照-2">實例對照</h3>
<p><strong>反例（用時間成本換算划不划算）</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln">1</span><span class="cl">節點 A 事後回顧：
</span></span><span class="line"><span class="ln">2</span><span class="cl">這一步多 2 分鐘掃一遍 pub-cache，但可以省下後來約 30 分鐘的
</span></span><span class="line"><span class="ln">3</span><span class="cl">build-炸-修循環。明顯划算。</span></span></code></pre></div><p>讀者學到的是「划不划算」這個執行層結論，沒學到兩個方案的結構性差異。</p>
<p><strong>正例</strong>（用內在屬性列出方案差異）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln"> 1</span><span class="cl">節點 A 事後檢視：
</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">若當下選擇「A2 + 同步盤點 pub-cache」：
</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"><span class="k">-</span> 優點：一次盤點所有同類地雷，修復範圍完整；避免之後
</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 class="k">-</span> 缺點：盤點結果可能含假陽性；擴大修復範圍可能引入新變數
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</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">單點錯誤修復後沒有主動擴大搜尋同類問題。
</span></span><span class="line"><span class="ln">11</span><span class="cl">這是決策是否涵蓋完整問題面的問題，不是執行層的快慢考量。</span></span></code></pre></div><p>（出自 <code>gradle_reasoning_traps</code> 節點 A 事後檢視。修改前是反例版本，修改後改用「覆蓋完整性」「範圍完整」這類內在屬性。）</p>
<h3 id="禁止事項-1">禁止事項</h3>
<p>不得以時間成本作為主要評估維度，包含：</p>
<ul>
<li>「這方案比較快」</li>
<li>「多花 X 分鐘省下 Y 分鐘」</li>
<li>「立即可完成」</li>
</ul>
<hr>
<h2 id="四事後檢視看判讀品質">四、事後檢視看判讀品質</h2>
<h3 id="規則的商業邏輯-3">規則的商業邏輯</h3>
<p>技術文章的品質檢視（review、事故檢討、復盤）常只看「結論對不對」，但多數失敗的根源在<strong>判讀階段</strong>：</p>
<ul>
<li>判讀未確認的推論被當結論</li>
<li>判讀觀察範圍不足（只看單點）</li>
<li>判讀用類比代替機制驗證</li>
</ul>
<p>這類問題會表現成「結論失敗」的樣子，但改善方向完全不同：</p>
<ul>
<li>結論失敗 → 下次多列幾個選項</li>
<li>判讀失敗 → 下次判讀要更嚴謹、更廣、更實證</li>
</ul>
<p>兩者混為一談會得到「要更仔細」這種無法行動的結論。</p>
<h3 id="做法-3">做法</h3>
<p>文章或決策完成後，必須回答下列四題：</p>
<ol>
<li>判讀階段的「需要確認」項目是否全部解答？</li>
<li>觀察範圍是否涵蓋同類情境，或僅處理當前一個？</li>
<li>推論中的類比假設是否驗證？</li>
<li>策略列舉是否完整？</li>
</ol>
<p>任一題答「否」，對應失敗類型必須明確標示：</p>
<table>
  <thead>
      <tr>
          <th>答「否」的題</th>
          <th>失敗類型</th>
          <th>改善方向</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>題 1</td>
          <td>未確認推論帶入結論</td>
          <td>判讀完成標準要收緊</td>
      </tr>
      <tr>
          <td>題 2</td>
          <td>觀察範圍不足</td>
          <td>擴大搜尋類似情境</td>
      </tr>
      <tr>
          <td>題 3</td>
          <td>類比代替驗證</td>
          <td>機制差異需實證</td>
      </tr>
      <tr>
          <td>題 4</td>
          <td>策略列舉不足</td>
          <td>至少列兩個選項</td>
      </tr>
  </tbody>
</table>
<h3 id="實例對照-3">實例對照</h3>
<p><strong>反例（只檢視結論，歸因模糊）</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln">1</span><span class="cl">這次修復走了彎路，下次應該更仔細。</span></span></code></pre></div><p>無法行動。下次遇到類似情境仍會犯同樣錯誤。</p>
<p><strong>正例</strong>（分類失敗類型，對應不同改善方向）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><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">| 節點 C | 需要新資訊（toolchain 時機） | 節點 B 判讀留下「需要確認」但沒補 |
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">| 節點 D1 | 對稱假設 | 節點 D 判讀用「結構對稱」取代「機制驗證」 |
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">| 節點 F | 方法呼叫時機 | 節點 E 判讀沒展開 API 的兩階段行為 |
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</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">進入策略時，還帶著未解決的問題。</span></span></code></pre></div><p>（出自 <code>gradle_reasoning_traps</code> 的「整個過程的決策品質檢視」段落。）</p>
<p>這樣的檢視產出具體改善方向：「判讀完成標準要收緊」、「機制差異需實證」，而不是模糊的「要更仔細」。</p>
<hr>
<h2 id="五判讀徵兆對照">五、判讀徵兆對照</h2>
<p>技術文章撰寫中常見的徵兆與對應的判讀要求。看到徵兆時，作者必須回答對應問題。</p>
<h3 id="徵兆單一位置指向檔案行號屬性名">徵兆：單一位置指向（檔案、行號、屬性名）</h3>
<p>該位置是「現場」，不一定是「根因」。必須追問：</p>
<ul>
<li>為什麼是這個位置出問題？</li>
<li>是目標的狀態錯了，還是呼叫的時機錯了？</li>
</ul>
<h3 id="徵兆同類情境第二次出現">徵兆：同類情境第二次出現</h3>
<p>前次處理範圍不完整。必須追問：</p>
<ul>
<li>還有哪些同類情境？</li>
<li>是否有共通原因？</li>
</ul>
<h3 id="徵兆修改看似合理但未生效">徵兆：修改看似合理但未生效</h3>
<p>時機或機制假設錯誤。必須追問：</p>
<ul>
<li>修改的生效時機是否晚於覆蓋對象？</li>
<li>覆蓋機制是否真的能蓋過目標？</li>
</ul>
<h3 id="徵兆finalalreadycannot這類字眼">徵兆：「final」「already」「cannot」這類字眼</h3>
<p>目標已進入不可修改狀態。必須追問：</p>
<ul>
<li>目標何時進入該狀態？</li>
<li>修改能否提前到狀態轉換之前？</li>
</ul>
<h3 id="徵兆inconsistentmismatch這類字眼">徵兆：「inconsistent」「mismatch」這類字眼</h3>
<p>兩部分不一致。必須追問：</p>
<ul>
<li>哪一邊是正確的目標值？</li>
<li>不一致的方向決定治理施加在哪一邊？</li>
</ul>
<h3 id="實例">實例</h3>
<p>這組徵兆對照表的完整應用案例見 <code>gradle_evaluation_order_traps</code>，該文將三種 Gradle 時序錯誤（<code>already evaluated</code>、<code>is final</code>、覆寫沒生效）各自對應到同一個底層問題（時機錯位），並給出對應的解法方向。這就是「看到徵兆 → 查表 → 推出判讀結論」的標準路徑。</p>
<hr>
<h2 id="六術語">六、術語</h2>
<table>
  <thead>
      <tr>
          <th>術語</th>
          <th>定義</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>商業邏輯</td>
          <td>系統層次的概念說明，不涉及具體值</td>
      </tr>
      <tr>
          <td>CASE</td>
          <td>具體內容（數值、路徑、屬性名）</td>
      </tr>
      <tr>
          <td>判讀</td>
          <td>從事實推導本質的過程</td>
      </tr>
      <tr>
          <td>策略</td>
          <td>可選方案</td>
      </tr>
      <tr>
          <td>現場</td>
          <td>訊息直接指向的位置</td>
      </tr>
      <tr>
          <td>根因</td>
          <td>底層原因，不一定等於現場</td>
      </tr>
      <tr>
          <td>投資型策略</td>
          <td>有長期回報的方案（擴大覆蓋、建立認知）</td>
      </tr>
      <tr>
          <td>消費型策略</td>
          <td>只處理當前問題的方案</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="七提交自檢">七、提交自檢</h2>
<p>提交文章前自檢：</p>
<ul>
<li><input disabled="" type="checkbox"> 四階段（觀察／判讀／策略／執行）完整，或已說明可省略的階段</li>
<li><input disabled="" type="checkbox"> 每個主題段落先商業邏輯後 CASE</li>
<li><input disabled="" type="checkbox"> 判讀中所有「需要確認」項目已解答或註明可暫不確認</li>
<li><input disabled="" type="checkbox"> 每個方案比較至少三個評估維度</li>
<li><input disabled="" type="checkbox"> 未以時間成本為主要評估維度</li>
<li><input disabled="" type="checkbox"> 事後檢視四題已回答</li>
<li><input disabled="" type="checkbox"> 失敗類型已標示（若有）</li>
</ul>
<hr>
<h2 id="參考範例">參考範例</h2>
<p>本規範四條規則的完整應用案例：</p>
<ul>
<li><a href="/blog/work-log/gradle-jvm-target-%E9%99%A4%E9%8C%AF%E5%BE%A9%E7%9B%A4%E4%B8%83%E5%80%8B%E7%AF%80%E9%BB%9E%E7%9A%84%E7%AD%96%E7%95%A5%E6%AC%8A%E8%A1%A1/" data-link-title="Gradle JVM target 除錯復盤：七個節點的策略權衡" data-link-desc="Gradle JVM target 不一致的除錯決策復盤，重點在每步的策略權衡與走過的彎路。">Gradle JVM target 除錯復盤：七個節點的策略權衡</a> — 全四條規則的完整應用，每個節點皆含觀察／判讀／策略／結果／事後檢視五層</li>
<li><a href="/blog/work-log/gradle-%E5%BC%B7%E5%88%B6%E8%A6%86%E5%AF%AB-plugin-%E7%9A%84-jvm-targetkotlin-%E8%88%87-java-%E7%9A%84%E5%88%87%E5%85%A5%E9%BB%9E%E4%B8%8D%E5%B0%8D%E7%A8%B1/" data-link-title="Gradle 強制覆寫 plugin 的 JVM target：Kotlin 與 Java 的切入點不對稱" data-link-desc="Kotlin / AGP 升級後 build 報 `Inconsistent JVM-target compatibility`。為何要強制覆寫 plugin 的 JVM target，以及 Kotlin 與 Java 設定切入點的不對稱。">Gradle 強制覆寫 plugin 的 JVM target：Kotlin 與 Java 的切入點不對稱</a> — 商業邏輯先於 CASE 的範例（先講 Kotlin plugin 與 AGP 的機制差異，再講具體寫法）</li>
<li><a href="/blog/work-log/gradle-configuration-%E6%99%82%E5%BA%8F%E9%99%B7%E9%98%B1afterevaluateevaluationdependsonfinalized-properties/" data-link-title="Gradle Configuration 時序陷阱：afterEvaluate、evaluationDependsOn、finalized properties" data-link-desc="Gradle 報 `Cannot run Project.afterEvaluate ... already evaluated` 或 `property is final`。時序錯誤同源於 callback 註冊太晚或屬性賦值太晚，附各 API 的正確時機。">Gradle Configuration 時序陷阱：afterEvaluate、evaluationDependsOn、finalized properties</a> — 判讀徵兆對照的完整應用</li>
<li><a href="/blog/work-log/%E7%82%BA%E4%BB%80%E9%BA%BC-bug-%E5%9C%A8%E5%90%88%E4%BD%B5%E5%BE%8C%E6%89%8D%E7%88%86gradle-cache-%E6%8E%A9%E8%93%8B%E6%BD%9B%E4%BC%8F%E5%95%8F%E9%A1%8C%E7%9A%84%E9%82%8F%E8%BC%AF/" data-link-title="為什麼 Bug 在合併後才爆：Gradle Cache 掩蓋潛伏問題的邏輯" data-link-desc="feature branch build 正常、合併到 main 後才爆、但合併前 main 也沒錯。根因早已潛伏，Gradle cache 掩蓋、合併只是觸發條件。">為什麼 Bug 在合併後才爆：Gradle Cache 掩蓋潛伏問題的邏輯</a> — 事後檢視看判讀品質的範例（將「合併造成」重新歸因為「判讀時把觸發條件當根因」）</li>
</ul>]]></content:encoded></item></channel></rss>