<?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>Cards-Skills on Tarragon</title><link>https://tarrragon.github.io/blog/tags/cards-skills/</link><description>Recent content in Cards-Skills on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Sun, 26 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/cards-skills/index.xml" rel="self" type="application/rss+xml"/><item><title>Cards-Skills 系統的活案例：從一個 search bug 到 14 張新卡的閉環</title><link>https://tarrragon.github.io/blog/posts/cards-skills-%E7%B3%BB%E7%B5%B1%E7%9A%84%E6%B4%BB%E6%A1%88%E4%BE%8B%E5%BE%9E%E4%B8%80%E5%80%8B-search-bug-%E5%88%B0-14-%E5%BC%B5%E6%96%B0%E5%8D%A1%E7%9A%84%E9%96%89%E7%92%B0/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/posts/cards-skills-%E7%B3%BB%E7%B5%B1%E7%9A%84%E6%B4%BB%E6%A1%88%E4%BE%8B%E5%BE%9E%E4%B8%80%E5%80%8B-search-bug-%E5%88%B0-14-%E5%BC%B5%E6%96%B0%E5%8D%A1%E7%9A%84%E9%96%89%E7%92%B0/</guid><description>&lt;h2 id="這篇要說什麼">這篇要說什麼&lt;/h2>
&lt;p>&lt;code>content/report/&lt;/code> 累積了 70+ 張原子化事後檢討卡片、&lt;code>.claude/skills/&lt;/code> 收錄三個 protocol skill。這些是用來指導下一輪實作、又會被下一輪實作的學習回流修正的活基礎建設。&lt;/p>
&lt;p>本文把這套系統實際跑一輪的歷程紀錄下來、當未來「想用這套系統的人」的 onboarding case study。主軸是修一個 search filter bug — 看似一週工作、實際走完八輪迭代、產出 14 張新卡片 + 兩個 skill 的 v0.2 + 4 個 CI test、過程中還抓到自己的 dogfooding 失敗、回頭修一次。&lt;/p>
&lt;hr>
&lt;h2 id="起點使用者問題">起點：使用者問題&lt;/h2>
&lt;p>&amp;ldquo;我們搜尋頁的 標題/內文篩選功能現在雖然做出來了、但是還是有一個很嚴重的 BUG&amp;rdquo;&lt;/p>
&lt;p>具體：Pagefind 分批 load、view 層 post-filter；切到 title-only 後、第二批 load more 的 8 筆全部 title 不含 query → 全 hidden、畫面閃但內容沒變、使用者看到「load more 沒效果」silent 失敗。&lt;/p>
&lt;p>User 還明確補了一句：「&lt;strong>所以除了用 JS 取巧解決畫面、但是實際功能面上怎麼配合跟實作 我們並沒有解決&lt;/strong>」— 這已經點到核心：問題不在畫面、在抽象層。&lt;/p>
&lt;hr>
&lt;h2 id="第一輪拆卡片之前先想清楚">第一輪：拆卡片之前先想清楚&lt;/h2>
&lt;p>直接修 bug 是可選但不是 user 要的。User 強調：「&lt;strong>先思考我的需求、然後思考各種狀況的邊界&lt;/strong>」。&lt;/p>
&lt;p>依當時的兩個 skill — &lt;code>requirement-protocol&lt;/code>（對話協議）跟 &lt;code>frontend-with-playwright&lt;/code>（前端執行協議）— 把問題分解：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Bug 的結構性根因&lt;/strong>：filter 寫在視覺層、source 在資料層分批、兩層的「一筆」定義不一致 → silent 缺口&lt;/li>
&lt;li>&lt;strong>解法策略空間&lt;/strong>：5 個合理選項（推進 query / 自動續抓 / 多 index / 誠實 UX / 明示縮小）— 每個機會成本不同&lt;/li>
&lt;li>&lt;strong>跨領域通用性&lt;/strong>：這結構不只前端有 — 後端 middleware filter、map-reduce、SQL view 都同模式&lt;/li>
&lt;/ol>
&lt;p>User 的關鍵回應：「&lt;strong>這部份可以補充 SKILL 中演算法不足的原因 &amp;hellip; 卡片是經過多次迭代、擴充、然後分拆、再擴充、最後做連結&lt;/strong>」。&lt;/p>
&lt;p>明確了協作方式：先建卡片、再灌進 skill、最後才修。卡片本身要走原子化拆解 → 補充 → 反向擴充 → 連結的多輪迭代。&lt;/p>
&lt;hr>
&lt;h2 id="14-張卡片的拆解第一冷啟">14 張卡片的拆解（第一冷啟）&lt;/h2>
&lt;p>依 user 對 atomic 的標準（一卡一議題、一個議題多面向 OK、議題太多就拆），列出 10 張卡片提案：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>分組&lt;/th>
 &lt;th>卡片&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>問題分析&lt;/td>
 &lt;td>#55 層錯位 / #56 視覺完成 ≠ 功能完成 / #57 三狀態區分&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>指令澄清&lt;/td>
 &lt;td>#58 篩選類指令的澄清時機&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>解法策略&lt;/td>
 &lt;td>#59 五策略對照 + #60-62 三張 pattern 卡（自動續抓 / 推進 query / 誠實 UX）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>抽象原則&lt;/td>
 &lt;td>#63 資料源形狀 / #64 同層合成&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>冷啟版本一次寫完不求完美 — 約 1700 行、各卡 self-contained。&lt;/p>
&lt;hr>
&lt;h2 id="七輪迭代">七輪迭代&lt;/h2>
&lt;h3 id="迭代-1抽-pattern--瘦身">迭代 1：抽 Pattern + 瘦身&lt;/h3>
&lt;p>寫完 #59 五策略後、發現 A/B/C/D/E 中 C（多 index）、E（明示縮小）沒對應 pattern 卡。抽出 #65 / #66 補完 pattern 卡組。同時瘦身 #59 → 純路由（細節留 pattern 卡）、#55 + #57 移除跟 #63 重複的「四類資料源」段。&lt;/p></description><content:encoded><![CDATA[<h2 id="這篇要說什麼">這篇要說什麼</h2>
<p><code>content/report/</code> 累積了 70+ 張原子化事後檢討卡片、<code>.claude/skills/</code> 收錄三個 protocol skill。這些是用來指導下一輪實作、又會被下一輪實作的學習回流修正的活基礎建設。</p>
<p>本文把這套系統實際跑一輪的歷程紀錄下來、當未來「想用這套系統的人」的 onboarding case study。主軸是修一個 search filter bug — 看似一週工作、實際走完八輪迭代、產出 14 張新卡片 + 兩個 skill 的 v0.2 + 4 個 CI test、過程中還抓到自己的 dogfooding 失敗、回頭修一次。</p>
<hr>
<h2 id="起點使用者問題">起點：使用者問題</h2>
<p>&ldquo;我們搜尋頁的 標題/內文篩選功能現在雖然做出來了、但是還是有一個很嚴重的 BUG&rdquo;</p>
<p>具體：Pagefind 分批 load、view 層 post-filter；切到 title-only 後、第二批 load more 的 8 筆全部 title 不含 query → 全 hidden、畫面閃但內容沒變、使用者看到「load more 沒效果」silent 失敗。</p>
<p>User 還明確補了一句：「<strong>所以除了用 JS 取巧解決畫面、但是實際功能面上怎麼配合跟實作 我們並沒有解決</strong>」— 這已經點到核心：問題不在畫面、在抽象層。</p>
<hr>
<h2 id="第一輪拆卡片之前先想清楚">第一輪：拆卡片之前先想清楚</h2>
<p>直接修 bug 是可選但不是 user 要的。User 強調：「<strong>先思考我的需求、然後思考各種狀況的邊界</strong>」。</p>
<p>依當時的兩個 skill — <code>requirement-protocol</code>（對話協議）跟 <code>frontend-with-playwright</code>（前端執行協議）— 把問題分解：</p>
<ol>
<li><strong>Bug 的結構性根因</strong>：filter 寫在視覺層、source 在資料層分批、兩層的「一筆」定義不一致 → silent 缺口</li>
<li><strong>解法策略空間</strong>：5 個合理選項（推進 query / 自動續抓 / 多 index / 誠實 UX / 明示縮小）— 每個機會成本不同</li>
<li><strong>跨領域通用性</strong>：這結構不只前端有 — 後端 middleware filter、map-reduce、SQL view 都同模式</li>
</ol>
<p>User 的關鍵回應：「<strong>這部份可以補充 SKILL 中演算法不足的原因 &hellip; 卡片是經過多次迭代、擴充、然後分拆、再擴充、最後做連結</strong>」。</p>
<p>明確了協作方式：先建卡片、再灌進 skill、最後才修。卡片本身要走原子化拆解 → 補充 → 反向擴充 → 連結的多輪迭代。</p>
<hr>
<h2 id="14-張卡片的拆解第一冷啟">14 張卡片的拆解（第一冷啟）</h2>
<p>依 user 對 atomic 的標準（一卡一議題、一個議題多面向 OK、議題太多就拆），列出 10 張卡片提案：</p>
<table>
  <thead>
      <tr>
          <th>分組</th>
          <th>卡片</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>問題分析</td>
          <td>#55 層錯位 / #56 視覺完成 ≠ 功能完成 / #57 三狀態區分</td>
      </tr>
      <tr>
          <td>指令澄清</td>
          <td>#58 篩選類指令的澄清時機</td>
      </tr>
      <tr>
          <td>解法策略</td>
          <td>#59 五策略對照 + #60-62 三張 pattern 卡（自動續抓 / 推進 query / 誠實 UX）</td>
      </tr>
      <tr>
          <td>抽象原則</td>
          <td>#63 資料源形狀 / #64 同層合成</td>
      </tr>
  </tbody>
</table>
<p>冷啟版本一次寫完不求完美 — 約 1700 行、各卡 self-contained。</p>
<hr>
<h2 id="七輪迭代">七輪迭代</h2>
<h3 id="迭代-1抽-pattern--瘦身">迭代 1：抽 Pattern + 瘦身</h3>
<p>寫完 #59 五策略後、發現 A/B/C/D/E 中 C（多 index）、E（明示縮小）沒對應 pattern 卡。抽出 #65 / #66 補完 pattern 卡組。同時瘦身 #59 → 純路由（細節留 pattern 卡）、#55 + #57 移除跟 #63 重複的「四類資料源」段。</p>
<h3 id="迭代-2補概念深度">迭代 2：補概念深度</h3>
<p>回頭讀 #56 / #63 / #64、補抽象層的「為什麼」：</p>
<ul>
<li>#56 加「驗收的時間軸：四個 checkpoint」概念</li>
<li>#63 加「形狀識別 protocol」+「形狀混合」+「形狀的可改造性」</li>
<li>#64 加「跨領域通用的本質 = 資訊可見範圍」+「上推代價」</li>
</ul>
<h3 id="迭代-3跨卡連結">迭代 3：跨卡連結</h3>
<p>新卡跟 #1-#54 既有卡互相補連結。例如 #55 ↔ #11 playwright、#57 ↔ #38 aria-live、#58 ↔ #21 decide-vs-confirm、#64 ↔ #43 minimum-scope + #44 SSOT。整個 collection 從兩個獨立輪次變一張互連網。</p>
<h3 id="迭代-4抽更高層原則">迭代 4：抽更高層原則</h3>
<p>重讀新卡發現兩個議題夠 abstract、值得抽獨立卡：</p>
<ul>
<li><strong>#67 寫作便利度跟意圖對齊反相關</strong> — 從「為什麼層錯位 bug 容易寫出來」抽出。發現它是 #43 / #44 / #45 / #64 的共同上位原則：<strong>便利位置 vs 對齊位置永遠反相關</strong></li>
<li><strong>#68 驗收的時間軸：四個 checkpoint</strong> — 從 #56 抽出獨立成卡</li>
</ul>
<h3 id="迭代-5跨輪共骨">迭代 5：跨輪共骨</h3>
<p>系統性掃 #1-#54 找跟新系列共骨的、加連結。例：#6 filter-order ↔ #58 / #59、#10 placeholder ↔ #68、#15 layout-test ↔ #68、#14 selector / #20 failure / #28 class-toggle ↔ #67。</p>
<h3 id="迭代-66768-加深">迭代 6：#67/#68 加深</h3>
<p>再讀兩張抽象卡、補「為什麼人會違反這條規則」的結構性解釋：</p>
<ul>
<li>#67 加「便利度的時間維度：當下便利 vs 未來便利反向」+「我等下會 refactor 是個謊言」</li>
<li>#68 加「為什麼 Ship 前 checkpoint 最常被跳過」（沒便利路徑）+「瀑布原則：漏一層代價指數放大」</li>
</ul>
<p>從「規則陳述」進到「結構性解釋」 — 不只說「該怎麼做」、也說「為什麼人會違反」。</p>
<h3 id="迭代-7compositional-writing-規範稽核">迭代 7：compositional-writing 規範稽核</h3>
<p>User 提醒「再做一次 compositional-writing 的檢查」。發現兩類違規：</p>
<ol>
<li><strong>Rule 7 違規</strong>：26 處「X 才合理的情境：實務上幾乎不存在」假反模式 — 改成「X 是反模式：理由」格式</li>
<li><strong>結構違規</strong>：#67/#68 是抽象層原則卡、不該寫設計取捨 ABCD（情境檢討卡的格式）— 改成「不該套用本原則的情境」（適用邊界）</li>
</ol>
<p>修完 31 張卡片（含既有 #1-#54）。整個 collection 對齊 v0.6 規範。</p>
<hr>
<h2 id="灌進-skills">灌進 Skills</h2>
<p>把 #55-#68 系列接進兩個 skill：</p>
<ul>
<li><strong>requirement-protocol v0.2</strong>：clarifying-ambiguous-instructions 加第 5 類「篩選類」+ 三問模板（呼應 #58）；SKILL.md 加「相關抽象層原則」段路由 #42-45 + #67-68</li>
<li><strong>frontend-with-playwright v0.2</strong>：新增第 7 份 reference <code>data-flow-and-filter-composition</code>（涵蓋 #55-#66 跨領域範例）；強調「不只前端、適用後端 / 演算法 / DB」</li>
</ul>
<p>Skill 的角色 = 路由器、Reports = 深度內容 — 兩層分工不重述。</p>
<hr>
<h2 id="實作策略-c--phase-1-4">實作：策略 C + Phase 1-4</h2>
<p>依 #59 + Pagefind 1.5.2 capabilities：</p>
<ul>
<li><strong>A 推進 query</strong>：不可行（Pagefind 無 native title filter API）</li>
<li><strong>C 多 index</strong>：採用（最對齊意圖）</li>
<li>B / D / E 是 fallback</li>
</ul>
<p>Phase 1-4：</p>
<ol>
<li>Makefile 跑 3 輪 pagefind（all / title / content）</li>
<li>single.html <code>&lt;content&gt;</code> → <code>&lt;div class=&quot;article-body&quot; data-pagefind-body&gt;</code></li>
<li>search.html 移除 view 層 post-filter、改 destroy + new PagefindUI(bundlePath)</li>
<li>4 個 Playwright tests 固化</li>
</ol>
<p>跑出來：<code>make site</code> 三 index 成功、<code>make test</code> 4/4 PASS、live 驗證 sparse case 顯示 explicit empty。<strong>看起來完工</strong>。</p>
<hr>
<h2 id="user-抓到-dogfooding-失敗--第-8-輪">User 抓到 dogfooding 失敗 — 第 8 輪</h2>
<p>User 問：「<strong>剛剛的過程我不確定、你開始修改之前有先寫測試確保符合預測狀態、然後才調整嗎？</strong>」</p>
<p>沒有。流程是：先修 → 才補測試 → 4/4 GREEN。<strong>沒走 RED</strong>。</p>
<p>這是 #67「便利驅動」+ #68「Checkpoint 2/3 內部協議」的 dogfooding 失敗。我寫了 #67/#68 教這些原則、自己卻違反。</p>
<p>依 user 規範：先建卡片再修。抽 <strong>#69 Test-First：先看到 RED 才相信 GREEN</strong>：</p>
<ul>
<li>測試本身是程式、會有 bug（5 種失敗模式）</li>
<li>沒看過 RED = 不知道測試有沒有 catch 能力</li>
<li>RED → GREEN 兩個訊號都看到 = 測試 + 修復都被驗證</li>
</ul>
<p>retrospective 補驗證流程：checkout pre-fix commit → cherry-pick test → build → run（看 RED）→ restore → run（看 GREEN）。</p>
<p>跑下去 — 結果震撼：<strong>4 個測試只有 1 個真的 catch 到 bug、其他 3 個對 buggy code 也 PASS</strong>（placebo）。如果不做 retrospective、會帶著 3/4 placebo 測試 ship。</p>
<p>強化測試（network-level + structural assertion 替換弱 invariant）：buggy code 1 PASS / 3 FAIL、fixed code 4 PASS。RED-GREEN 真的 catch 到 bug + 真的解掉。</p>
<hr>
<h2 id="user-抓到第二個-dogfooding-失敗--checkpoint-1">User 抓到第二個 dogfooding 失敗 — Checkpoint 1</h2>
<p>我問 user 還有什麼該迭代。User 列了 7 項、選 1+2：</p>
<ol>
<li>補 Checkpoint 1（列使用者意圖完整集）</li>
<li>跟 user 確認 known limitations</li>
</ol>
<p>跑 Checkpoint 1 retrospective — 用 Playwright MCP 系統性測 5 維度（data / interaction / URL / a11y / performance）。發現 3 個 silent 缺口：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>漏掉的 case</th>
          <th>結論</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>URL state</td>
          <td><code>?q=X&amp;scope=Y</code> 持久化</td>
          <td>完全沒實作</td>
      </tr>
      <tr>
          <td>A11y</td>
          <td>Tab order: scope 在 search input 之前</td>
          <td>反 mental model</td>
      </tr>
      <tr>
          <td>Filter UX</td>
          <td>type/tag filter 在 sub-mode 完全消失</td>
          <td>Silent 限制</td>
      </tr>
  </tbody>
</table>
<p>依 user 規範：<strong>先建卡片再修</strong>。抽：</p>
<ul>
<li><strong>#70 URL 是 stateful UI 的儲存層</strong> — 5 個儲存層特性對照 + 三問判準</li>
<li><strong>#71 Tab Order = DOM Order = Mental Model 三者對齊</strong> — DOM 順序 = tab 順序、不對齊時優先重排 DOM</li>
<li>更新 #68 加「為什麼 Checkpoint 1 也常被跳過」段、用本次任務當 self-case</li>
</ul>
<p>然後實作 — 依 #69 RED-GREEN 順序：</p>
<ol>
<li>寫 4 個 RED tests</li>
<li>跑 → 4 個 fail（confirms RED）</li>
<li>修 search.html（URL persist + DOM reorder + UI hint）</li>
<li>跑 → 8/8 GREEN</li>
</ol>
<hr>
<h2 id="ci--自動化">CI + 自動化</h2>
<p>最後補 CI 防護：</p>
<ul>
<li><strong><code>.github/workflows/playwright.yml</code></strong> — push / PR 自動跑 8 個 tests</li>
<li><strong><code>deploy.yml</code> 修 critical bug</strong> — production 一直只 build 單 index、現在 build 三份對齊本地</li>
<li><strong><code>make test</code> + <code>make verify-red-green PRE_FIX=&lt;sha&gt;</code></strong> — codify retrospective 流程、不需手動 stash / checkout / restore</li>
</ul>
<hr>
<h2 id="數字總結">數字總結</h2>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>數字</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Commits</td>
          <td>30+</td>
      </tr>
      <tr>
          <td>新卡片</td>
          <td>17（#55-#71）</td>
      </tr>
      <tr>
          <td>既有卡修改</td>
          <td>31 張（rule 7 稽核）</td>
      </tr>
      <tr>
          <td>新 skill reference</td>
          <td>1（data-flow-and-filter-composition）</td>
      </tr>
      <tr>
          <td>Skill 版本</td>
          <td>requirement-protocol v0.1 → v0.2、frontend-with-playwright v0.1 → v0.2</td>
      </tr>
      <tr>
          <td>Playwright tests</td>
          <td>8</td>
      </tr>
      <tr>
          <td>RED-GREEN cycles</td>
          <td>2（初版測試 + 強化版）</td>
      </tr>
      <tr>
          <td>CI workflows 加 / 修</td>
          <td>2（新增 playwright + 修 deploy multi-index）</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="學到什麼">學到什麼</h2>
<h3 id="1-cards-skills-系統是雙向的">1. Cards-skills 系統是雙向的</h3>
<p>不是「先寫卡片、再用卡片」。是「卡片指導實作、實作問題回流卡片」。每一輪迭代都把學到的東西反饋。本次 14 張新卡有 8 張是修過程中實際遇到的問題抽出來的、不是預先想的。</p>
<h3 id="2-user-提問是外部觸發">2. User 提問是「外部觸發」</h3>
<p>我自己跑 #67 / #68 / Checkpoint 1 的機率低 — 因為這些都是「沒便利路徑」的工作。User 的兩次提問（「有先寫測試嗎」+「需求確認最重要功能」）剛好對應 #69 + Checkpoint 1 的觸發。<strong>結構性偏差需要外部觸發來修正、不能靠自我提醒</strong>。</p>
<h3 id="3-test-過--對齊使用者意圖">3. Test 過 ≠ 對齊使用者意圖</h3>
<p>第一輪修完、跑 4/4 GREEN、看起來完工。實際漏了：</p>
<ul>
<li>3 個測試是 placebo（沒做 RED 不知道）</li>
<li>3 個 silent 缺口（沒做 Checkpoint 1 不知道）</li>
</ul>
<p>任何「跑得通就 OK」的訊號都低資訊量。Real 訊號 = 對照「使用者意圖完整集合」逐一驗收。</p>
<h3 id="4-一個-bug-修完--一個-case-study-起點">4. 一個 bug 修完 = 一個 case study 起點</h3>
<p>如果停在「bug 修了、test 過了」、這次任務 5 個 commits 結束。User 的兩次提問把它變成 30+ 個 commits 的 case study、產出 17 張新卡 + 兩個 skill 升級 + CI 補強。<strong>修 bug 是 trigger、不是終點</strong>。</p>
<hr>
<h2 id="適合-reuse-這個流程的條件">適合 reuse 這個流程的條件</h2>
<p>不是每個 bug 都該走這套。適合的訊號：</p>
<ul>
<li>Bug 修法不直觀、會碰到多種策略選項（→ 需要 #59 類取捨架構）</li>
<li>修法可能影響其他 feature 或產生新案例（→ 需要 Checkpoint 1）</li>
<li>需要長期 regression 防護（→ 需要 #69 RED-GREEN 驗證）</li>
<li>修的過程中發現新原則（→ 抽卡片）</li>
</ul>
<p>不適合：純 typo / config / build 失敗 — 直接修。</p>
<hr>
<h2 id="對未來想用這套系統的人">對未來想用這套系統的人</h2>
<p>進入點：</p>
<ol>
<li>讀 <code>content/skills/_index.md</code> — 三個 skill 的 routing table</li>
<li>從你的問題情境找對應 skill：
<ul>
<li>不確定怎麼跟 user 溝通 → <code>requirement-protocol</code></li>
<li>前端 / 資料流實作 → <code>frontend-with-playwright</code></li>
<li>寫文件 / 註解 / log → <code>compositional-writing</code></li>
</ul>
</li>
<li>Skill 路由你到 specific reference、reference 路由你到 <code>content/report/</code> 深度卡片</li>
<li>修問題過程中發現新原則 → 抽卡片回流</li>
</ol>
<p>「卡片不是在實作之前一次寫完、是在實作之中持續累積」 — 這套系統的 leverage 在於「下一個類似問題能直接用、不用重新發明」。</p>
<hr>
<h2 id="結語">結語</h2>
<p><code>content/report/</code> 從 54 張長到 71 張、<code>.claude/skills/</code> 從 v0.1 進到 v0.2、CI 從假 pass 變真防護、search bug 從 silent 失敗變到 8/8 regression test 守護。</p>
<p>過程不是線性。是「先做 → 抓到 dogfooding 失敗 → 抽卡片 → 回頭修 → 再被抓失敗 → 再抽卡片 → 再修」。每一輪都讓系統往對齊使用者意圖的方向多走一點。</p>
<p>User 的角色關鍵：兩次提問都不在「指出 bug」、是在「指出我跳過的 checkpoint」。這是純執行者看不到的盲點 — 自己的 dogfooding 失敗。<strong>外部 reviewer 是 cards-skills 系統的必要組件、不是 optional</strong>。</p>
<p>下次有類似情境的人 — 不需要把這條路再走一遍、直接用 #55-#71 + 三個 skill 起步。如果發現新 case、抽新卡回流。系統的價值在每次使用都會變強。</p>
]]></content:encoded></item><item><title>決策對話協議的浮現：從 #74 到 #81 的多層迭代</title><link>https://tarrragon.github.io/blog/posts/%E6%B1%BA%E7%AD%96%E5%B0%8D%E8%A9%B1%E5%8D%94%E8%AD%B0%E7%9A%84%E6%B5%AE%E7%8F%BE%E5%BE%9E-%2374-%E5%88%B0-%2381-%E7%9A%84%E5%A4%9A%E5%B1%A4%E8%BF%AD%E4%BB%A3/</link><pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/posts/%E6%B1%BA%E7%AD%96%E5%B0%8D%E8%A9%B1%E5%8D%94%E8%AD%B0%E7%9A%84%E6%B5%AE%E7%8F%BE%E5%BE%9E-%2374-%E5%88%B0-%2381-%E7%9A%84%E5%A4%9A%E5%B1%A4%E8%BF%AD%E4%BB%A3/</guid><description>&lt;h2 id="這篇要說什麼">這篇要說什麼&lt;/h2>
&lt;p>&lt;a href="../cards-skills-system-case-study/">前一篇 case study&lt;/a> 紀錄的是「實作驅動」的閉環 — 從一個 bug 出發、逼出新卡片。&lt;/p>
&lt;p>本篇紀錄的是 &lt;strong>「對話驅動」的閉環&lt;/strong> — 不修任何 production code、純粹從對話中浮現新卡。觸發點是 user 的一句反思：「&lt;strong>剛剛提出很多不同方向的決策做選擇、這些選擇應該被做成卡片然後分析或者分拆細節研究&lt;/strong>」。&lt;/p>
&lt;p>接下來六輪 spiral 迭代、產生 8 張新卡（&lt;a href="https://tarrragon.github.io/blog/report/" data-link-title="Report — 開發過程的事後檢討" data-link-desc="blog 開發過程中、把實際遇到的版型 / 整合 / 框架共處等情境、整理成『應該怎麼做、沒這樣做會有什麼麻煩』的事後檢討。每篇皆為正向指引、幫助下一輪同類任務跳過反覆試錯。">#74-#81&lt;/a>）+ 1 份 SKILL reference + skill v0.5。本文紀錄這條路徑、當作 &lt;a href="https://tarrragon.github.io/blog/report/cards-as-living-system-iteration/" data-link-title="卡片系統的迭代浮現：原子卡 → meta-卡 → reference 三層展開" data-link-desc="知識卡片系統不是一次寫成、是 dialogue → 原子卡 → meta-卡 → reference 的迭代浮現。每一輪迭代解決上一輪的 over-fit / under-fit、串連分散的卡片、抽出 meta-原則、最後沉澱成可直接套用的 reference 文件。本卡是 cards-skills 系統設計的 process-level 元原則。">#81 卡片系統的迭代浮現&lt;/a> 的具體實例。&lt;/p>
&lt;hr>
&lt;h2 id="起點對話中的反思訊號">起點：對話中的反思訊號&lt;/h2>
&lt;p>對話到第 N 回合時、agent 已經在多次出現「決策呈現」的場景：&lt;/p>
&lt;ul>
&lt;li>「Content mode 三選一」 → user 答 (a)&lt;/li>
&lt;li>「一次 ship 全部 vs 分批」 → user 答「一次」&lt;/li>
&lt;li>「五策略選一」 → user 答 「C 主 + D 補」&lt;/li>
&lt;li>「ship D 還是 B/C」 → user 答 「先 D、B/C 下輪」&lt;/li>
&lt;li>「反省選哪幾個」 → user 答 「1+2」&lt;/li>
&lt;/ul>
&lt;p>每次 agent 都呈現得不一樣、user 也每次回得不一樣。&lt;strong>反覆出現但形式各異 = 抽 meta 的訊號&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 四篇實作的共同抽象。">#42 2 次門檻&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/report/cards-as-living-system-iteration/" data-link-title="卡片系統的迭代浮現：原子卡 → meta-卡 → reference 三層展開" data-link-desc="知識卡片系統不是一次寫成、是 dialogue → 原子卡 → meta-卡 → reference 的迭代浮現。每一輪迭代解決上一輪的 over-fit / under-fit、串連分散的卡片、抽出 meta-原則、最後沉澱成可直接套用的 reference 文件。本卡是 cards-skills 系統設計的 process-level 元原則。">#81 迭代浮現&lt;/a>）。&lt;/p>
&lt;p>User 的「&lt;strong>這些選擇應該被做成卡片&lt;/strong>」就是 meta-訊號的明確化 — 不是 agent 自己浮現的、是 user 點出來的。&lt;strong>External trigger（&lt;a href="https://tarrragon.github.io/blog/report/external-trigger-for-high-roi-work/" data-link-title="高 ROI 無外部觸發的工作會被結構性跳過" data-link-desc="工作有兩個獨立維度：ROI 高低 &amp;#43; 是否有外部觸發。高 ROI &amp;#43; 無觸發 = ROI 的承諾、拖延的現實。靠紀律不可行 — 結構性偏差需要結構性對策（外部觸發 / CI / hook / 排程 / pair）。本卡是 #67 便利反相關、#68 checkpoint 跳過、#69 RED 跳過的共同上位原則。">#72&lt;/a>）才能逼出抽 meta 這個高 ROI 但無觸發的工作&lt;/strong>。&lt;/p></description><content:encoded><![CDATA[<h2 id="這篇要說什麼">這篇要說什麼</h2>
<p><a href="../cards-skills-system-case-study/">前一篇 case study</a> 紀錄的是「實作驅動」的閉環 — 從一個 bug 出發、逼出新卡片。</p>
<p>本篇紀錄的是 <strong>「對話驅動」的閉環</strong> — 不修任何 production code、純粹從對話中浮現新卡。觸發點是 user 的一句反思：「<strong>剛剛提出很多不同方向的決策做選擇、這些選擇應該被做成卡片然後分析或者分拆細節研究</strong>」。</p>
<p>接下來六輪 spiral 迭代、產生 8 張新卡（<a href="/blog/report/" data-link-title="Report — 開發過程的事後檢討" data-link-desc="blog 開發過程中、把實際遇到的版型 / 整合 / 框架共處等情境、整理成『應該怎麼做、沒這樣做會有什麼麻煩』的事後檢討。每篇皆為正向指引、幫助下一輪同類任務跳過反覆試錯。">#74-#81</a>）+ 1 份 SKILL reference + skill v0.5。本文紀錄這條路徑、當作 <a href="/blog/report/cards-as-living-system-iteration/" data-link-title="卡片系統的迭代浮現：原子卡 → meta-卡 → reference 三層展開" data-link-desc="知識卡片系統不是一次寫成、是 dialogue → 原子卡 → meta-卡 → reference 的迭代浮現。每一輪迭代解決上一輪的 over-fit / under-fit、串連分散的卡片、抽出 meta-原則、最後沉澱成可直接套用的 reference 文件。本卡是 cards-skills 系統設計的 process-level 元原則。">#81 卡片系統的迭代浮現</a> 的具體實例。</p>
<hr>
<h2 id="起點對話中的反思訊號">起點：對話中的反思訊號</h2>
<p>對話到第 N 回合時、agent 已經在多次出現「決策呈現」的場景：</p>
<ul>
<li>「Content mode 三選一」 → user 答 (a)</li>
<li>「一次 ship 全部 vs 分批」 → user 答「一次」</li>
<li>「五策略選一」 → user 答 「C 主 + D 補」</li>
<li>「ship D 還是 B/C」 → user 答 「先 D、B/C 下輪」</li>
<li>「反省選哪幾個」 → user 答 「1+2」</li>
</ul>
<p>每次 agent 都呈現得不一樣、user 也每次回得不一樣。<strong>反覆出現但形式各異 = 抽 meta 的訊號</strong>（<a href="/blog/report/two-occurrence-threshold/" data-link-title="2 次門檻：第一次是運氣、第二次是訊號" data-link-desc="同一個問題出現第 2 次時、就該停下來把處理層級升一階 — 從推理升到量測、從手動驗證升到自動化、從同方向嘗試升到換思路。第 1 次失敗的資訊不足、第 2 次提供「重複出現」的證據、值得付出升級成本。本文是 #11 / #15 / #20 / #23 四篇實作的共同抽象。">#42 2 次門檻</a> + <a href="/blog/report/cards-as-living-system-iteration/" data-link-title="卡片系統的迭代浮現：原子卡 → meta-卡 → reference 三層展開" data-link-desc="知識卡片系統不是一次寫成、是 dialogue → 原子卡 → meta-卡 → reference 的迭代浮現。每一輪迭代解決上一輪的 over-fit / under-fit、串連分散的卡片、抽出 meta-原則、最後沉澱成可直接套用的 reference 文件。本卡是 cards-skills 系統設計的 process-level 元原則。">#81 迭代浮現</a>）。</p>
<p>User 的「<strong>這些選擇應該被做成卡片</strong>」就是 meta-訊號的明確化 — 不是 agent 自己浮現的、是 user 點出來的。<strong>External trigger（<a href="/blog/report/external-trigger-for-high-roi-work/" data-link-title="高 ROI 無外部觸發的工作會被結構性跳過" data-link-desc="工作有兩個獨立維度：ROI 高低 &#43; 是否有外部觸發。高 ROI &#43; 無觸發 = ROI 的承諾、拖延的現實。靠紀律不可行 — 結構性偏差需要結構性對策（外部觸發 / CI / hook / 排程 / pair）。本卡是 #67 便利反相關、#68 checkpoint 跳過、#69 RED 跳過的共同上位原則。">#72</a>）才能逼出抽 meta 這個高 ROI 但無觸發的工作</strong>。</p>
<hr>
<h2 id="迭代過程六輪-spiral">迭代過程：六輪 spiral</h2>
<h3 id="輪-1列候選不寫卡">輪 1：列候選、不寫卡</h3>
<p>User 的「應該被做成卡片」沒指定要寫幾張、寫什麼。Agent 列五個候選（A-E）+ 推薦 B+C 組合。User 回「<strong>每個都做成卡片</strong>」+ 給出迭代原則：「<strong>先拓展知識庫、然後才整理成上層的抽象決策依據、最後才做決策</strong>」。</p>
<p>這個原則 = [#81] 的 process explicit form：先原子卡 → 後 meta-卡 → 最後決策（套用）。</p>
<h3 id="輪-2寫五張原子卡74-78">輪 2：寫五張原子卡（#74-#78）</h3>
<p>每張一個維度：</p>
<ul>
<li>#74 呈現格式（選項表 + 推薦 + 開放修改）</li>
<li>#75 主策略 + 補強疊加（不必互斥）</li>
<li>#76 分批 ship（三軸切分）</li>
<li>#77 「現在不決定」是合法選項</li>
<li>#78 反省任務預設複選</li>
</ul>
<p>寫的時候各自獨立、沒明確意識到「這五張其實是同一回事的五個面向」。<strong>在第 5 張寫到一半才開始覺得「好像每張都在打開一個固定的 default」</strong>。</p>
<p>訊號：[#81] 「寫第 N 張卡、發現大段內容跟前一張重複」 → 抽 meta。</p>
<h3 id="輪-3抽-meta-卡-79">輪 3：抽 meta-卡 #79</h3>
<p>User 接著問「都做、用多層迭代去拓展卡片」、agent 回應時自己浮現了 meta-發現：<strong>這五張其實對應五個獨立維度、可組合成 2^5 = 32 種對話形態</strong>。</p>
<p>寫 #79 時、把五張卡的「打開的 default」歸納成五個維度 + 五步判讀。<strong>Meta-卡讓五張原子卡從「平行五張」變成「有結構的網」</strong>。</p>
<p>回頭給每張原子卡補上「跟 #79 的對應」 cross-link、迭代結束。</p>
<h3 id="輪-4沉澱成-reference">輪 4：沉澱成 reference</h3>
<p>光有卡還不夠 — 實作中要翻 5 張卡才能完整 apply、太貴。</p>
<p>寫 <code>references/decision-dialogue.md</code>、把五步判讀 + 完整模板 + self-check 沉澱成一份可直接套用的 protocol。同時更新 SKILL.md 加 trigger route（「呈現決策 / 開放問 / 反省題」）+ Directory Index + 抽象層原則段。</p>
<p>訊號：[#81] 「實作中要回查 ≥ 3 張卡」 → 沉澱 reference。</p>
<h3 id="輪-5dogfood--反向補卡80-81">輪 5：dogfood + 反向補卡（#80-#81）</h3>
<p>User 的「我們想得到的都作、直到推演到極限」逼 agent 自查：</p>
<p><strong>自查 1</strong>：回頭看 agent 在這輪對話的回應、找 collapse 反模式。發現 4 處：</p>
<ul>
<li>「需要我繼續嗎？」 = yes/no（最隱形的 collapse）</li>
<li>「下一層候選」用 bullet 沒適配欄</li>
<li>推薦騎牆「A 比較好不過 B 也行」</li>
<li>反省題列點未明示「互不衝突」</li>
</ul>
<p>→ 寫 #80 Yes/No 二選、把 dogfood 4 例寫進 reference 作為「Bad/Good 對照」。</p>
<p><strong>自查 2</strong>：「這套迭代過程本身是不是 cardable？」是 — 寫 #81 卡片系統的迭代浮現、紀錄「原子 → meta → reference」的 spiral 結構。</p>
<p>訊號：[#81] 「meta-卡寫太早、新 case 一直破壞」的反面 — 寫得剛好、反而能容納新 case（#80、#81 自己）。</p>
<h3 id="輪-6跨連--補強">輪 6：跨連 + 補強</h3>
<p>把 #75（主+補強疊加）展開到 selector pattern：[#46-#49] 看似互斥（每個元件選一個起點）、實際在同一份 code 內可疊加（document + closest 共用）。<strong>Meta-原則的價值之一就是回頭發現舊卡之間有新關係</strong>。</p>
<p>更新 #59（五策略選擇矩陣）加「並用」段落、引用 #75 + #76。</p>
<hr>
<h2 id="過程中的觀察">過程中的觀察</h2>
<h3 id="1-user-的-prompt-直接決定-spiral-深度">1. User 的 prompt 直接決定 spiral 深度</h3>
<p>User 的三句話分別觸發三層深度：</p>
<table>
  <thead>
      <tr>
          <th>User 的話</th>
          <th>觸發深度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「應該被做成卡片」</td>
          <td>寫原子卡（layer 1）</td>
      </tr>
      <tr>
          <td>「先拓展知識庫、再整理上層、最後決策」</td>
          <td>抽 meta-卡（layer 2）+ reference（layer 3）</td>
      </tr>
      <tr>
          <td>「都作、推演到極限」</td>
          <td>dogfood + 反向補卡（layer 4-5）</td>
      </tr>
  </tbody>
</table>
<p>每句話都是 [#72] L4 外部觸發 — 沒這些話、agent 不會自己走到第 5 層。<strong>Spiral 深度由 trigger 決定、不由 agent 紀律決定</strong>。</p>
<h3 id="2-dogfood-回饋的-roi-比新卡高">2. Dogfood 回饋的 ROI 比新卡高</h3>
<p>#80（yes/no）的內容比 #74 短得多、但 ROI 可能更高 — 因為它捕捉的是「最常見、最隱形」的反模式。同樣 reference 的「dogfood Bad/Good 4 例」比抽象描述有用 — 將來 agent 看到自己寫類似格式、能直接認出來。</p>
<p>訊號：<strong>具體例子（特別是反例）的 ROI 通常 &gt; 抽象描述</strong>。</p>
<h3 id="3-meta-卡跟-reference-的職責不同">3. Meta-卡跟 reference 的職責不同</h3>
<p>寫完 #79 還不夠、需要 reference — 因為：</p>
<ul>
<li>卡片回答「為什麼」、reference 回答「怎麼做」</li>
<li>卡片是讀爽的、reference 是被翻的</li>
<li>卡片可選、reference 在實作中是 must</li>
</ul>
<p><strong>兩者缺一不可</strong>：只寫卡 → 知道但忘記用；只寫 reference → 知道做但不知道為什麼、難 maintain。</p>
<h3 id="4-真實的-spiral-不是線性">4. 真實的 spiral 不是線性</h3>
<p>寫 #74 時不知道有 #79、寫 #79 時回頭改 #74-#78、寫 reference 時又發現 #80 漏了、寫 #80 時補 reference 的 dogfood 段。<strong>每一層完成後都會反過來修上一層</strong>。</p>
<p>線性思維（「先寫完 layer 1 才寫 layer 2」）會卡住、spiral 思維（「來回修、每輪都加深」）才能浮現完整結構。</p>
<hr>
<h2 id="跟既有原則的關係">跟既有原則的關係</h2>
<table>
  <thead>
      <tr>
          <th>既有原則</th>
          <th>在本次 spiral 中的角色</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/report/two-occurrence-threshold/" data-link-title="2 次門檻：第一次是運氣、第二次是訊號" data-link-desc="同一個問題出現第 2 次時、就該停下來把處理層級升一階 — 從推理升到量測、從手動驗證升到自動化、從同方向嘗試升到換思路。第 1 次失敗的資訊不足、第 2 次提供「重複出現」的證據、值得付出升級成本。本文是 #11 / #15 / #20 / #23 四篇實作的共同抽象。">#42 2 次門檻</a></td>
          <td>第 N 次出現決策呈現 = 抽 meta 的訊號</td>
      </tr>
      <tr>
          <td><a href="/blog/report/minimum-necessary-scope-is-sanity-defense/" data-link-title="最小必要範圍是 sanity 防線：保護行為可預測性" data-link-desc="縮 selector 範圍、observer 範圍、JS 操作範圍 — 不是為了效能、是為了讓行為可預測、不被未來變動打破。本文是 #13 / #14 / #29 三篇實作的共同抽象。">#43 最小必要範圍</a></td>
          <td>先窄後寬：原子卡（窄）→ meta（寬）、不要直接寫 meta</td>
      </tr>
      <tr>
          <td><a href="/blog/report/ease-of-writing-vs-intent-alignment/" data-link-title="寫作便利度跟意圖對齊反相關" data-link-desc="寫程式時最容易寫出的版本、通常是離意圖最遠的版本。便利度建立在「現有上下文 / 已 materialize 資料 / 已存在 API」上、而意圖對齊需要找到正確的層、處理上游、跨抽象層 — 兩者方向相反。識別這個反相關 = 識別自己掉進「容易寫的陷阱」。">#67 寫作便利度反相關</a></td>
          <td>「直接寫 meta」容易、「迭代浮現」難 — 真實結構不對齊容易寫的格式</td>
      </tr>
      <tr>
          <td><a href="/blog/report/external-trigger-for-high-roi-work/" data-link-title="高 ROI 無外部觸發的工作會被結構性跳過" data-link-desc="工作有兩個獨立維度：ROI 高低 &#43; 是否有外部觸發。高 ROI &#43; 無觸發 = ROI 的承諾、拖延的現實。靠紀律不可行 — 結構性偏差需要結構性對策（外部觸發 / CI / hook / 排程 / pair）。本卡是 #67 便利反相關、#68 checkpoint 跳過、#69 RED 跳過的共同上位原則。">#72 高 ROI 無觸發</a></td>
          <td>抽 meta + 寫 reference 沒外部觸發不會做、user 的話是 L4 觸發</td>
      </tr>
      <tr>
          <td><a href="/blog/report/decision-dialogue-dimensions/" data-link-title="決策對話的五個維度：保持完整選擇空間" data-link-desc="對話中的「決策」不是單一動作、是多維度選擇空間：呈現格式 / 策略疊加 / 批次邊界 / 時間軸 / 選項類型。預設多半 collapse 到最窄格（開放問 &#43; 單策略 &#43; 一次完成 &#43; 立刻決 &#43; 單選）、塞使用者進最少自由度的盒子。本卡是 #74-#78 的上層串連 — 五張卡各對應一個維度的鬆綁。">#79 決策對話的五維度</a></td>
          <td>本次 spiral 的 output、也是元素之一</td>
      </tr>
      <tr>
          <td><a href="/blog/report/cards-as-living-system-iteration/" data-link-title="卡片系統的迭代浮現：原子卡 → meta-卡 → reference 三層展開" data-link-desc="知識卡片系統不是一次寫成、是 dialogue → 原子卡 → meta-卡 → reference 的迭代浮現。每一輪迭代解決上一輪的 over-fit / under-fit、串連分散的卡片、抽出 meta-原則、最後沉澱成可直接套用的 reference 文件。本卡是 cards-skills 系統設計的 process-level 元原則。">#81 卡片系統的迭代浮現</a></td>
          <td>本次 spiral 的 process-level 抽象</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="本次-spiral-的-output-清單">本次 spiral 的 output 清單</h2>
<table>
  <thead>
      <tr>
          <th>類型</th>
          <th>數量</th>
          <th>內容</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>原子卡</td>
          <td>5</td>
          <td>#74-#78（呈現 / 疊加 / 分批 / 延後 / 複選）</td>
      </tr>
      <tr>
          <td>Meta-卡</td>
          <td>1</td>
          <td>#79 五維度</td>
      </tr>
      <tr>
          <td>反向補卡</td>
          <td>2</td>
          <td>#80 yes/no、#81 迭代浮現</td>
      </tr>
      <tr>
          <td>Reference</td>
          <td>1</td>
          <td><code>decision-dialogue.md</code>（runtime + blog）</td>
      </tr>
      <tr>
          <td>Skill 整合</td>
          <td>2</td>
          <td>requirement-protocol v0.5、frontend-with-playwright v0.4</td>
      </tr>
      <tr>
          <td>跨連</td>
          <td>多處</td>
          <td>#59 加疊加段、#46-#49 加 #75 跨連</td>
      </tr>
      <tr>
          <td>Case study</td>
          <td>1</td>
          <td>本文</td>
      </tr>
  </tbody>
</table>
<p><strong>整輪迭代的成本</strong>：純對話、無 production code 改動、無新測試。<strong>整輪迭代的價值</strong>：未來 agent 在每次「決策呈現」場景都有 reference 可翻、有 self-check 可用、有 dogfood 例子可對照。</p>
<hr>
<h2 id="結語">結語</h2>
<p>本系統的成型不是「用心寫文件」、是接受**「對話會浮現結構、原子卡會自我串連、meta-卡會回頭修原子卡」這個 spiral 真相**、然後讓每輪迭代都加深一點。</p>
<p>下一次 user 在對話中又出現「這個應該被做成卡片」訊號時、流程已經是現成的 — 套 [#81] 的三層展開 + [#72] 的 L4 觸發、就能繼續長新卡。<strong>真正的 knowledge infrastructure 不是寫一次的文件、是長期 spiral 的 living system</strong>。</p>
]]></content:encoded></item></channel></rss>