<?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>Visual on Tarragon</title><link>https://tarrragon.github.io/blog/tags/visual/</link><description>Recent content in Visual on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 28 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/visual/index.xml" rel="self" type="application/rss+xml"/><item><title>視覺手段對齊錯誤層次：CSS / emoji 修不到語意 / 邏輯問題</title><link>https://tarrragon.github.io/blog/report/visual-tool-error-layer-alignment/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/report/visual-tool-error-layer-alignment/</guid><description>&lt;h2 id="結論">結論&lt;/h2>
&lt;p>寫作 / UI 中的問題分三層、不同層需要不同修法：&lt;/p>
&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>概念劃分混亂、論證不完整、兩個概念擠在一行&lt;/td>
 &lt;td>重新分概念、改結構&lt;/td>
 &lt;td>CSS / 排版 / emoji（蓋不到根因）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>語意&lt;/td>
 &lt;td>用 emoji 作為唯一區分、用顏色傳達唯一資訊、用視覺替代結構&lt;/td>
 &lt;td>改表達結構、用文本標記、加分段&lt;/td>
 &lt;td>CSS 規則（false confidence）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>視覺&lt;/td>
 &lt;td>容器寬度、字體大小、顏色對比、跨瀏覽器排版&lt;/td>
 &lt;td>CSS、media query、渲染工具&lt;/td>
 &lt;td>改文章結構（過殺）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>核心&lt;/strong>：修視覺工具預設&lt;strong>錯誤就在視覺層&lt;/strong>。當症狀其實來自語意 / 邏輯層、用視覺工具修 = 蓋掉表面、根因還在 + 作者誤以為解決了（false confidence、跟 &lt;a href="../literal-interception-vs-behavioral-refinement/">#82&lt;/a> 的 hook 心理同病）。&lt;/p>
&lt;p>修法的順序是 &lt;strong>深層 → 淺層&lt;/strong>：先問「是不是邏輯 / 語意層的下游症狀」、是的話改結構；確認純視覺、再用視覺工具。&lt;/p>
&lt;hr>
&lt;h2 id="為什麼視覺工具對語意--邏輯問題無能為力">為什麼視覺工具對語意 / 邏輯問題無能為力&lt;/h2>
&lt;p>視覺工具（CSS、emoji、顏色、字體、間距、圖示）的本質是 &lt;strong>呈現層的調整&lt;/strong> — 它能改變字怎麼顯示、不能改變字本身代表的概念。能改的、跟改不到的、有清楚的界線：&lt;/p>
&lt;p>&lt;strong>能改的（純呈現）&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>文字在窄視窗會不會換行&lt;/li>
&lt;li>兩個區塊的視覺距離&lt;/li>
&lt;li>不同類型用什麼顏色標&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>改不到的（結構 / 語意 / 邏輯）&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>兩個概念該不該擠在同一行（結構層）&lt;/li>
&lt;li>用 emoji 區分是否足夠承載語意（語意層）&lt;/li>
&lt;li>論證有沒有完整（邏輯層）&lt;/li>
&lt;/ul>
&lt;p>當作者試圖用視覺工具解語意 / 邏輯問題、結果是 &lt;strong>症狀被表面平整、但下次同類問題會用新形狀冒出來&lt;/strong> — 因為根因（概念混淆 / 結構錯位）沒動。&lt;/p>
&lt;hr>
&lt;h2 id="反模式用視覺修補蓋住下游症狀">反模式：用視覺修補蓋住下游症狀&lt;/h2>
&lt;h3 id="false-confidence-比沒修更危險">False confidence 比沒修更危險&lt;/h3>
&lt;p>修了 CSS 之後、心理上會覺得「處理完了」。實際上 CSS 只擋了表面斷行、語意混淆照舊存在 — 但作者不再警覺、因為「我修過了」。&lt;/p>
&lt;p>下一個讀者在不同 viewport / 不同設備 / 用螢幕閱讀器時、同樣的語意問題會用不同形狀重新出現（換行錯位、TTS 讀錯、複製貼上格式跑掉）。&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>中&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>CSS 修了視覺、根因（語意混淆）還在&lt;/td>
 &lt;td>低（誤以為修了）&lt;/td>
 &lt;td>&lt;strong>高&lt;/strong>（換 context 就復發）&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;a href="../literal-interception-vs-behavioral-refinement/">#82&lt;/a> 的「Hook 抓不到的範圍誤以為有保護」同病。&lt;/p>
&lt;h3 id="症狀堆疊再加一條-css-規則永遠補不完">症狀堆疊：「再加一條 CSS 規則」永遠補不完&lt;/h3>
&lt;p>視覺修補的直覺反應是「加一條規則」。但語意 / 邏輯下游的症狀無限多、規則永遠補不完。實際軌跡：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln"> 1&lt;/span>&lt;span class="cl">emoji 在窄 viewport 斷行
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 2&lt;/span>&lt;span class="cl"> → 加 white-space: nowrap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 3&lt;/span>&lt;span class="cl"> → 文字溢出容器
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 4&lt;/span>&lt;span class="cl"> → 加 overflow: hidden
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 5&lt;/span>&lt;span class="cl"> → 文字被截斷看不見
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 6&lt;/span>&lt;span class="cl"> → 加 text-overflow: ellipsis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 7&lt;/span>&lt;span class="cl"> → 螢幕閱讀器讀出「...」沒語意
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 8&lt;/span>&lt;span class="cl"> → 加 aria-label 補語意
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln"> 9&lt;/span>&lt;span class="cl"> → 翻譯版本 aria-label 沒翻
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">10&lt;/span>&lt;span class="cl"> → ...&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每加一層 CSS、根因（兩個概念擠在一行）更深埋、修起來更貴。&lt;/p>
&lt;p>→ CSS 規則膨脹是「用錯工具」的訊號、不是「規則寫得不夠細」的訊號。跟 &lt;a href="../literal-interception-vs-behavioral-refinement/">#82&lt;/a> 的 hook 規則膨脹同骨。&lt;/p>
&lt;hr>
&lt;h2 id="三層優先序邏輯--語意--視覺">三層優先序：邏輯 → 語意 → 視覺&lt;/h2>
&lt;h3 id="為什麼是這個順序">為什麼是這個順序&lt;/h3>
&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>整篇 / 整個 feature 的可理解性&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;td>中（讀者抓得到但要花力氣推）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>視覺&lt;/td>
 &lt;td>局部呈現&lt;/td>
 &lt;td>低（改 CSS / 排版）&lt;/td>
 &lt;td>低（讀者覺得醜、但能讀）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>深層問題的影響範圍大、修不到根因的代價高&lt;/strong>。所以修法順序是先問深層、確認沒問題再修淺層。&lt;/p></description><content:encoded><![CDATA[<h2 id="結論">結論</h2>
<p>寫作 / UI 中的問題分三層、不同層需要不同修法：</p>
<table>
  <thead>
      <tr>
          <th>問題層次</th>
          <th>例子</th>
          <th>適合手段</th>
          <th>不適合手段</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>邏輯</td>
          <td>概念劃分混亂、論證不完整、兩個概念擠在一行</td>
          <td>重新分概念、改結構</td>
          <td>CSS / 排版 / emoji（蓋不到根因）</td>
      </tr>
      <tr>
          <td>語意</td>
          <td>用 emoji 作為唯一區分、用顏色傳達唯一資訊、用視覺替代結構</td>
          <td>改表達結構、用文本標記、加分段</td>
          <td>CSS 規則（false confidence）</td>
      </tr>
      <tr>
          <td>視覺</td>
          <td>容器寬度、字體大小、顏色對比、跨瀏覽器排版</td>
          <td>CSS、media query、渲染工具</td>
          <td>改文章結構（過殺）</td>
      </tr>
  </tbody>
</table>
<p><strong>核心</strong>：修視覺工具預設<strong>錯誤就在視覺層</strong>。當症狀其實來自語意 / 邏輯層、用視覺工具修 = 蓋掉表面、根因還在 + 作者誤以為解決了（false confidence、跟 <a href="../literal-interception-vs-behavioral-refinement/">#82</a> 的 hook 心理同病）。</p>
<p>修法的順序是 <strong>深層 → 淺層</strong>：先問「是不是邏輯 / 語意層的下游症狀」、是的話改結構；確認純視覺、再用視覺工具。</p>
<hr>
<h2 id="為什麼視覺工具對語意--邏輯問題無能為力">為什麼視覺工具對語意 / 邏輯問題無能為力</h2>
<p>視覺工具（CSS、emoji、顏色、字體、間距、圖示）的本質是 <strong>呈現層的調整</strong> — 它能改變字怎麼顯示、不能改變字本身代表的概念。能改的、跟改不到的、有清楚的界線：</p>
<p><strong>能改的（純呈現）</strong>：</p>
<ul>
<li>文字在窄視窗會不會換行</li>
<li>兩個區塊的視覺距離</li>
<li>不同類型用什麼顏色標</li>
</ul>
<p><strong>改不到的（結構 / 語意 / 邏輯）</strong>：</p>
<ul>
<li>兩個概念該不該擠在同一行（結構層）</li>
<li>用 emoji 區分是否足夠承載語意（語意層）</li>
<li>論證有沒有完整（邏輯層）</li>
</ul>
<p>當作者試圖用視覺工具解語意 / 邏輯問題、結果是 <strong>症狀被表面平整、但下次同類問題會用新形狀冒出來</strong> — 因為根因（概念混淆 / 結構錯位）沒動。</p>
<hr>
<h2 id="反模式用視覺修補蓋住下游症狀">反模式：用視覺修補蓋住下游症狀</h2>
<h3 id="false-confidence-比沒修更危險">False confidence 比沒修更危險</h3>
<p>修了 CSS 之後、心理上會覺得「處理完了」。實際上 CSS 只擋了表面斷行、語意混淆照舊存在 — 但作者不再警覺、因為「我修過了」。</p>
<p>下一個讀者在不同 viewport / 不同設備 / 用螢幕閱讀器時、同樣的語意問題會用不同形狀重新出現（換行錯位、TTS 讀錯、複製貼上格式跑掉）。</p>
<table>
  <thead>
      <tr>
          <th>狀態</th>
          <th>警覺度</th>
          <th>同類問題復發率</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>沒修任何東西</td>
          <td>高（看到症狀）</td>
          <td>中</td>
      </tr>
      <tr>
          <td>CSS 修了視覺、根因（語意混淆）還在</td>
          <td>低（誤以為修了）</td>
          <td><strong>高</strong>（換 context 就復發）</td>
      </tr>
      <tr>
          <td>改結構修了根因</td>
          <td>適中</td>
          <td>低</td>
      </tr>
  </tbody>
</table>
<p>第二行是最危險組合 — 跟 <a href="../literal-interception-vs-behavioral-refinement/">#82</a> 的「Hook 抓不到的範圍誤以為有保護」同病。</p>
<h3 id="症狀堆疊再加一條-css-規則永遠補不完">症狀堆疊：「再加一條 CSS 規則」永遠補不完</h3>
<p>視覺修補的直覺反應是「加一條規則」。但語意 / 邏輯下游的症狀無限多、規則永遠補不完。實際軌跡：</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">emoji 在窄 viewport 斷行
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  → 加 white-space: nowrap
</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">  → 加 overflow: hidden
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  → 文字被截斷看不見
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  → 加 text-overflow: ellipsis
</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">  → 加 aria-label 補語意
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  → 翻譯版本 aria-label 沒翻
</span></span><span class="line"><span class="ln">10</span><span class="cl">  → ...</span></span></code></pre></div><p>每加一層 CSS、根因（兩個概念擠在一行）更深埋、修起來更貴。</p>
<p>→ CSS 規則膨脹是「用錯工具」的訊號、不是「規則寫得不夠細」的訊號。跟 <a href="../literal-interception-vs-behavioral-refinement/">#82</a> 的 hook 規則膨脹同骨。</p>
<hr>
<h2 id="三層優先序邏輯--語意--視覺">三層優先序：邏輯 → 語意 → 視覺</h2>
<h3 id="為什麼是這個順序">為什麼是這個順序</h3>
<table>
  <thead>
      <tr>
          <th>層次</th>
          <th>影響範圍</th>
          <th>修起來成本</th>
          <th>修不修的代價</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>邏輯</td>
          <td>整篇 / 整個 feature 的可理解性</td>
          <td>高（要重新分概念）</td>
          <td>高（讀者根本看不懂、抓不到重點）</td>
      </tr>
      <tr>
          <td>語意</td>
          <td>段落 / 區塊的表達精度</td>
          <td>中（要改結構）</td>
          <td>中（讀者抓得到但要花力氣推）</td>
      </tr>
      <tr>
          <td>視覺</td>
          <td>局部呈現</td>
          <td>低（改 CSS / 排版）</td>
          <td>低（讀者覺得醜、但能讀）</td>
      </tr>
  </tbody>
</table>
<p><strong>深層問題的影響範圍大、修不到根因的代價高</strong>。所以修法順序是先問深層、確認沒問題再修淺層。</p>
<h3 id="修法的順序">修法的順序</h3>





<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">   否 → 下一層
</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">這是語意層問題嗎？（依賴視覺標記傳達唯一資訊？emoji 是唯一區分？）
</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><span class="line"><span class="ln">12</span><span class="cl">   是 → CSS / media query / 渲染配置</span></span></code></pre></div><p><strong>反向（從視覺往邏輯推）會 false confidence</strong>：先用 CSS 補了、表面平整、誤以為解決了、下次換 context 復發。</p>
<hr>
<h2 id="何時視覺修補真的足夠">何時視覺修補真的足夠</h2>
<p>某些情境純視覺就夠、用 CSS 是對的：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>為什麼 CSS 夠</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>跨 viewport 排版適配（手機 / 桌面）</td>
          <td>內容沒變、只是顯示尺寸要適配</td>
      </tr>
      <tr>
          <td>字體大小 / 行高 / 顏色對比</td>
          <td>純呈現參數</td>
      </tr>
      <tr>
          <td>容器溢出 / 滾動條 / 換行控制</td>
          <td>layout 行為</td>
      </tr>
      <tr>
          <td>跨瀏覽器渲染差異</td>
          <td>引擎差異、不是內容問題</td>
      </tr>
      <tr>
          <td>主題切換（dark / light mode）</td>
          <td>純呈現變數</td>
      </tr>
  </tbody>
</table>
<p>五類共通：<strong>內容本身沒爭議、只是顯示方式要調</strong>。其他情境視覺工具都會在某個時點走到 ceiling。</p>
<hr>
<h2 id="識別-ceiling什麼時候該換手段">識別 ceiling：什麼時候該換手段</h2>
<p>ceiling 訊號：</p>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>該換的手段</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「修了 CSS、換個 viewport / 設備又壞了」</td>
          <td>不是純視覺、有結構問題、改結構</td>
      </tr>
      <tr>
          <td>「加了 CSS rule 但又冒出新症狀」</td>
          <td>症狀堆疊、退回問層次</td>
      </tr>
      <tr>
          <td>「emoji / 顏色 / 圖示是唯一區分方式」</td>
          <td>語意層問題、加文本標記</td>
      </tr>
      <tr>
          <td>「需要 aria-label 補語意才能讀懂」</td>
          <td>結構層問題、aria 是補丁、根本要重排</td>
      </tr>
      <tr>
          <td>「同樣的內容、列表 vs 引用區塊閱讀差很多」</td>
          <td>結構層問題、選擇承載結構錯了</td>
      </tr>
      <tr>
          <td>「螢幕閱讀器讀出來的順序跟視覺順序不同」</td>
          <td>視覺順序跟邏輯順序錯位、改 DOM order</td>
      </tr>
      <tr>
          <td>「複製貼上後格式跑掉、語意也跟著跑掉」</td>
          <td>依賴視覺渲染傳語意、把語意寫進文本</td>
      </tr>
  </tbody>
</table>
<p>看到任一訊號、不是「再加一條 CSS / 換個 emoji」、是 <strong>接受視覺工具對這個層次的問題無能為力、改修結構</strong>。</p>
<hr>
<h2 id="跟其他抽象層原則的關係">跟其他抽象層原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>原則</th>
          <th>關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="../literal-interception-vs-behavioral-refinement/">#82 字面攔截 vs 行為精煉</a></td>
          <td><strong>本卡的 sibling</strong> — #82 是「驗證工具 vs 錯誤層次」、本卡是「呈現工具 vs 內容層次」、同骨不同領域</td>
      </tr>
      <tr>
          <td><a href="../writing-multi-pass-review/">#83 Writing 的 multi-pass review</a></td>
          <td><strong>本卡是 #83 缺的垂直軸</strong> — #83 的 5 輪是 horizontal frame、本卡的 3 層是 vertical layer、兩軸正交</td>
      </tr>
      <tr>
          <td><a href="../ease-of-writing-vs-intent-alignment/">#67 寫作便利度跟意圖對齊反相關</a></td>
          <td>用 emoji 區分概念是「便利寫法」、改結構是「對齊意圖」 — 本卡是 #67 在呈現選擇上的具體實例</td>
      </tr>
      <tr>
          <td><a href="../single-source-of-truth/">#44 Single Source of Truth</a></td>
          <td>用 emoji 替代結構區分 = 把語意分散在「文字 + emoji」兩處、違反 SSoT、emoji 不渲染時語意就遺失</td>
      </tr>
      <tr>
          <td><a href="../native-html-over-aria-role/">#39 Native HTML 優先於 ARIA role</a></td>
          <td>同骨：semantic HTML 把語意寫進結構、ARIA 是補丁；emoji 是視覺補丁、文本標記 / 列表是 semantic 結構</td>
      </tr>
      <tr>
          <td><a href="../visual-completion-vs-functional-completion/">#56 視覺完成 ≠ 功能完成</a></td>
          <td>本卡是 #56 在「呈現層」的擴展 — 視覺驗收訊號早於語意驗收成立、容易誤判修好</td>
      </tr>
      <tr>
          <td><a href="../yes-no-binary-collapse/">#80 Yes/No 二選是隱式 collapse</a></td>
          <td>「emoji 區分」是把多概念 collapse 進視覺維度、跟 yes/no collapse 同骨（多維度被壓成 1 維）</td>
      </tr>
  </tbody>
</table>
<p>本卡是 <a href="../literal-interception-vs-behavioral-refinement/">#82</a> 的 sibling — 兩者都在說「<strong>工具有能擋的層 / 擋不到的層、超出 ceiling 是 false confidence</strong>」。組合理解：</p>
<table>
  <thead>
      <tr>
          <th>軸</th>
          <th>#82</th>
          <th>本卡</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>領域</td>
          <td>驗證 / 防呆</td>
          <td>呈現 / 寫作</td>
      </tr>
      <tr>
          <td>工具</td>
          <td>hook / lint / CI</td>
          <td>CSS / emoji / 顏色 / 排版</td>
      </tr>
      <tr>
          <td>該擋的層</td>
          <td>字面（typo / schema）</td>
          <td>視覺（容器 / 字體 / 顏色）</td>
      </tr>
      <tr>
          <td>抓不到的層</td>
          <td>行為（思考偏差）</td>
          <td>語意 / 邏輯（概念 / 結構）</td>
      </tr>
      <tr>
          <td>False confidence</td>
          <td>「CI 通過 = 沒事」</td>
          <td>「視覺修了 = 沒事」</td>
      </tr>
      <tr>
          <td>規則膨脹</td>
          <td>「再加一條 lint 規則」</td>
          <td>「再加一條 CSS rule」</td>
      </tr>
      <tr>
          <td>正解</td>
          <td>multi-pass review / spiral</td>
          <td>改結構 / 重新分概念</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="套用到本系統的-case">套用到本系統的 case</h2>
<h3 id="case-1blog-文章-mermaid--emoji-圖例">Case 1：blog 文章 mermaid + emoji 圖例</h3>
<p>寫 <a href="../../work-log/git_move_partial_change_to_earlier_commit/">git rebase 搬部分檔案</a> 文章時、用 mermaid gitGraph 配 emoji 圖例：</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="k">&gt; </span><span class="ge">🟢 HIGHLIGHT = 接收檔案變更的目標 commit（A）
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="ge"></span>&gt; 🔴 REVERSE = 含有不該屬於它的檔案變更的 commit（C）</span></span></code></pre></div><p>某 viewport 下 emoji 跟文字之間斷行錯位、🔴 在前一行、REVERSE = &hellip; 在下一行。</p>
<p><strong>第一直覺（錯）</strong>：修 emoji 渲染、加 white-space: nowrap。</p>
<p><strong>追問層次</strong>：</p>
<ul>
<li>視覺層：emoji 斷行 → 改 CSS 可以擋</li>
<li>語意層：HIGHLIGHT 跟 REVERSE 是兩個獨立概念、被擠在 <code>&gt; 引用區塊</code> 的兩行 + 用 emoji 作為唯一區分 — emoji 不渲染（終端 / 老瀏覽器）就完全失語意</li>
<li>邏輯層：兩個獨立概念本就不該擠在引用區塊裡、引用區塊的語意是「附加說明」、但兩個概念都是主要資訊</li>
</ul>
<p><strong>根因在邏輯層</strong>：兩個概念該分開承載。</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">**四個 commit 的角色**：
</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 class="k">-</span> **A**（接收目標）：commit C 中對檔案的修訂應該屬於這裡
</span></span><span class="line"><span class="ln">4</span><span class="cl">- <span class="gs">**C**</span>（變更來源）：同時改了目標檔案和其他 6 個檔案</span></span></code></pre></div><p>修了之後、emoji 斷行、aria-label、複製貼上格式、螢幕閱讀器順序等所有下游症狀同時消失 — 因為根因被處理了。</p>
<h3 id="case-2mermaid-gitgraph-type-顏色設定">Case 2：mermaid gitGraph type 顏色設定</h3>
<p>跟 Case 1 同篇文章的另一個議題：mermaid 的 <code>type: HIGHLIGHT</code> / <code>type: REVERSE</code> 自訂顏色不渲染（<a href="/blog/posts/mermaid_gitgraph_type_color_config/" data-link-title="Mermaid gitGraph：自訂 commit type 顏色不渲染的配置補洞" data-link-desc="Hugo &#43; Mermaid gitGraph 的 type: HIGHLIGHT / REVERSE 顏色不生效時的根因與修復。升級 Mermaid 版本時顏色變數命名會變、要重驗。">mermaid_gitgraph_type_color_config</a>）。</p>
<p>這個 <strong>是</strong> 純視覺問題 — 內容本身沒爭議、只是 mermaid themeVariables 缺配置。修 CSS / themeVariables 是對的。</p>
<p>兩個議題在同一篇文章、但層次不同 — 一個是邏輯層下游症狀（誤判為視覺）、一個是真視覺問題（CSS 修對位）。<strong>判讀層次比修法重要</strong>。</p>
<h3 id="case-3multi-pass-review-的層次盲點">Case 3：multi-pass review 的層次盲點</h3>
<p><a href="../writing-multi-pass-review/">#83</a> 的 5 輪 frame（生成 / 意圖 / 語氣 / grep / 反例）是 horizontal — 同一份文字、5 個視角輪流看。但這 5 輪都可能落在同一個 vertical layer（例如全部在看視覺層）、漏掉語意 / 邏輯層。</p>
<p>本卡補的是垂直軸：<strong>每輪 frame 內、要意識到問題在哪一層</strong>。第 1 輪生成可能寫出語意混淆、第 2 輪對意圖如果只看視覺呈現、整個 review 就停在視覺層。</p>
<p>實際軌跡：blog 文章寫完跑了 #83 的多輪 review、catch 到 emoji 斷行（視覺層）、但沒 catch 到 HIGHLIGHT/REVERSE 概念混淆（語意層）— 因為每輪 frame 都沒把 layer 當成獨立檢查維度。</p>
<hr>
<h2 id="判讀徵兆">判讀徵兆</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>該做的事</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>看到視覺異常、第一直覺是改 CSS</td>
          <td>先問「換個 viewport / 設備會不會復發」、會的話是更深層</td>
      </tr>
      <tr>
          <td>用 emoji / 顏色 / 圖示作為唯一區分</td>
          <td>語意層問題、加文本標記 + 改結構</td>
      </tr>
      <tr>
          <td>加了 CSS 但又冒出新視覺症狀</td>
          <td>症狀堆疊、退回問層次、根因在更深層</td>
      </tr>
      <tr>
          <td>「需要 aria-label 補語意才能讀懂」</td>
          <td>結構層問題、改 DOM order / 重排</td>
      </tr>
      <tr>
          <td>Multi-pass review 跑了、但只 catch 視覺問題</td>
          <td>layer 沒當獨立維度、補垂直軸檢查</td>
      </tr>
      <tr>
          <td>一個改動「視覺好了、但語意感覺怪」</td>
          <td>語意層問題沒解、別停手</td>
      </tr>
      <tr>
          <td>「之後在不同設備 / 螢幕閱讀器再驗證」</td>
          <td>是 <a href="../external-trigger-for-high-roi-work/">#72</a> 結構性跳過、補 trigger</td>
      </tr>
      <tr>
          <td>Commit 訊息只寫「fix layout / fix emoji」</td>
          <td>訊息層級停在視覺、檢查根因是不是更深</td>
      </tr>
  </tbody>
</table>
<p><strong>核心</strong>：視覺工具的 ROI = <strong>跟問題層次對齊</strong> × <strong>不超出 ceiling</strong>。<strong>CSS / emoji / 顏色不會理解語意、所以只能擋呈現</strong>；<strong>語意 / 邏輯問題需要改結構 / 改概念分組、不靠視覺工具</strong>。試圖用視覺工具蓋語意 / 邏輯問題 = 假裝修了、實際比沒修更危險（false confidence 阻止下次警覺）。</p>
]]></content:encoded></item></channel></rss>