<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://swanky.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://swanky.github.io/" rel="alternate" type="text/html" /><updated>2026-08-26T08:40:18+00:00</updated><id>https://swanky.github.io/feed.xml</id><title type="html">Swanky Studio 史旺基工作室</title><subtitle>史旺基工作室介紹創辦人史旺基結合攝影與軟體專長，展示得獎人像作品、 敏捷技術顧問服務、專業教育訓練與NFT策展成果。</subtitle><entry><title type="html">「Scaffolding is coping」不是不要規範：AI Agent 架構該刪什麼、留下什麼</title><link href="https://swanky.github.io/technical/scaffolding-thin-harness-agent-architecture/" rel="alternate" type="text/html" title="「Scaffolding is coping」不是不要規範：AI Agent 架構該刪什麼、留下什麼" /><published>2026-08-26T00:00:00+00:00</published><updated>2026-08-26T00:00:00+00:00</updated><id>https://swanky.github.io/technical/scaffolding-thin-harness-agent-architecture</id><content type="html" xml:base="https://swanky.github.io/technical/scaffolding-thin-harness-agent-architecture/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>該刪的不是規格，而是替今天模型補弱點的流程</strong>：Prompt hack、固定 Router、硬編排 Agent 數量與 Retry spaghetti，都可能在下一代模型出現後變成技術債。</li>
    <li><strong>Thin Harness 不等於 No Harness</strong>：Context、工具、Sandbox、核准、狀態與證據仍是 Agent 能可靠工作的基礎設施。</li>
    <li><strong>Memory 正在從聊天功能變成工作產物</strong>：目標、計畫、指令、結果、失敗路徑與決策理由，應留在任何 Agent 都能搜尋的 Notebook、Markdown 或 Runbook。</li>
    <li><strong>SDD 要少管路徑，多管真相</strong>：把意圖、限制、完成定義與驗證寫清楚，讓 Agent 自己決定怎麼走。</li>
    <li><strong>Agent 越多不等於生產力越高</strong>：執行頻寬變大之後，人的注意力與決策佇列反而更早撞牆。</li>
  </ul>
</div>

<nav class="article-toc article-toc--outline" aria-label="文章大綱">
  <span class="article-toc-label">本文大綱</span>
  <ol class="article-toc-parts">
    <li class="article-toc-part">
      <span class="article-toc-part-title">先拆掉最容易出現的誤讀</span>
      <ol class="article-toc-items">
        <li><a href="#headline">標題把問題推成「要不要規範 AI」</a></li>
        <li><a href="#overhang">Scaffolding 真正在反對什麼</a></li>
        <li><a href="#durable">哪些工程不但不能刪，還要加強</a></li>
        <li><a href="#thin-harness">Thin Harness 不是空殼</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">再把訪談翻成可以使用的流程</span>
      <ol class="article-toc-items">
        <li><a href="#artifact">OpenAI 自己留下了很多 Artifact</a></li>
        <li><a href="#memory">Memory 不該困在 Session 裡</a></li>
        <li><a href="#skills">Skills 跟 Strong Model 並不衝突</a></li>
        <li><a href="#attention">Multi-Agent 的瓶頸開始變成人</a></li>
        <li><a href="#sdd">SDD 要從規定步驟，轉成建立球場</a></li>
        <li><a href="#playbook">如果是我，我會這樣改流程</a></li>
      </ol>
    </li>
  </ol>
</nav>

<h2 id="headline">標題把問題推成「要不要規範 AI」</h2>

<p>我先看到 INSIDE 那篇〈別再用一堆規範綁住 AI〉時，第一個反應是：這個標題很會吸引人點，但也很容易把工程問題推成一場錯的辯論。<a href="https://www.inside.com.tw/article/42193-tibo-sottiaux-ai-agent-vision-timeline">[1]</a></p>

<p>一邊變成「模型已經這麼強，規格、測試、流程都該丟掉」；另一邊則開始捍衛 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>、SDD、TDD 與所有既有工程方法。兩邊吵半天，最後可能只是對「規範」兩個字的定義不同。</p>

<p>Tibo Sottiaux 真正反對的，不是工程本身。</p>

<p>他反對的是：<strong>為了補今天模型的弱點，蓋出一座明天反而困住模型的工程迷宮。</strong></p>

<p>這個差別很重要。因為如果讀成「不要規範 AI」，最先被刪掉的往往是測試、安全與驗收；真正該被檢討的 Prompt hack、固定編排與沒人敢碰的 Workflow Graph，反而可能繼續活著。</p>

<h2 id="overhang">Scaffolding 真正在反對什麼</h2>

<p>Tibo 在 Dev Interrupted 的訪談裡談到，OpenAI 因為同時做模型與 Codex Harness，可以決定一個問題究竟要在模型訓練解，還是在 Harness 裡解。他甚至直接說：不是所有問題都要修在 Harness；有些能力，幾個月後會由新模型補上。<a href="https://podscan.fm/podcasts/dev-interrupted/episodes/scaffolding-is-coping-not-scaling-and-other-lessons-from-codex-openais-thibault-sottiaux">[2]</a></p>

<p>這才是「Scaffolding is coping, not scaling」的背景。</p>

<p>假設今天的模型只有 70 分，你替它設計一條很完整的路：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>任務 → Router → Planner → 5 個 Sub-agent → Critic → Reviewer → Retry → Summarizer
</code></pre></div></div>

<p>每一個元件都可能有合理理由。Router 避免它走錯路，Reviewer 補它不會自我檢查，Retry 把偶發失敗磨掉，Summarizer 則是因為 Context 不夠長。</p>

<p>問題是，下一代模型如果從 70 分升到 95 分，這條路不一定只是「仍然有用但比較保守」。它也可能直接擋住模型原本能做得更好的方法。</p>

<p>Tibo 把這種情況叫做 <strong>Capability Overhang</strong>：模型能力已經跳升，Harness 卻仍假設它只有舊能力，所以新的推理、規劃與工具使用方式無法表達出來。<a href="https://podscan.fm/podcasts/dev-interrupted/episodes/scaffolding-is-coping-not-scaling-and-other-lessons-from-codex-openais-thibault-sottiaux">[2]</a></p>

<p>說穿了，你辛苦蓋的 Agent Architecture，可能不是系統的外骨骼，而是一件小兩號的盔甲。</p>

<figure>
  <a href="/assets/img/technical/scaffolding-thin-harness-agent-architecture/scaffolding-decay-matrix.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/technical/scaffolding-thin-harness-agent-architecture/scaffolding-decay-matrix.svg" alt="AI Agent 架構折舊矩陣：Prompt hack、固定 Router、人工 Context 壓縮與 Retry spaghetti 容易隨模型進步折舊；規格、測試、權限、版本與決策紀錄則會繼續放大更強模型的能力" loading="lazy" />
  </a>
  <figcaption>真正要問的不是「要不要工程」，而是模型升級後，這項工程會放大能力，還是繼續把模型鎖在舊假設裡。點圖可開啟原尺寸。</figcaption>
</figure>

<h2 id="durable">哪些工程不但不能刪，還要加強</h2>

<p>這也是整個討論最容易被偷換概念的地方。</p>

<p><code class="language-plaintext highlighter-rouge">AGENTS.md</code> 並沒有突然變成落後做法。Codex 官方文件現在仍明確寫著，它會在開始工作前讀取 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>，並依全域、Repository 與目錄層級組合指引。<a href="https://learn.chatgpt.com/docs/agent-configuration/agents-md">[9]</a></p>

<p>但一份好的 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>，應該告訴 Agent 專案的客觀事實與邊界：</p>

<ul>
  <li>測試怎麼跑。</li>
  <li>哪些資料不能碰。</li>
  <li>架構有哪些不可破壞的限制。</li>
  <li>專案使用什麼語言、版本與慣例。</li>
  <li>哪些動作需要人工核准。</li>
  <li>完成時要留下什麼證據。</li>
</ul>

<p>它不需要替模型寫一篇「你現在要如何思考」的長篇劇本。</p>

<p>我會把 Agent 外部的工程分成兩類：</p>

<table>
  <thead>
    <tr>
      <th>類型</th>
      <th>例子</th>
      <th>我的處理方式</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>定義真相與責任</strong></td>
      <td>Spec、Acceptance Criteria、Tests、Evals、Security、Permission、Observability、Git、CI</td>
      <td>保留，而且做成可執行、可查核的系統邊界</td>
    </tr>
    <tr>
      <td><strong>補償模型暫時弱點</strong></td>
      <td>特殊 Prompt、固定 Agent 數量、硬寫死的 Graph、人工 Context 搬運、過度 Retry</td>
      <td>設有效期限；模型升級就重新做最小 Harness 測試</td>
    </tr>
  </tbody>
</table>

<p>安全邊界更不會因模型變聰明而消失。</p>

<p>一個更聰明、工具更多、執行更快的 Agent，如果沒有 Sandbox、權限範圍與不可逆動作核准，通常不是比較自由，而是比較快出事。模型能力與安全控制不是同一條軸，不能拿前者去抵銷後者。</p>

<h2 id="thin-harness">Thin Harness 不是空殼</h2>

<p>OpenAI 在 8 月 19 日公開 Codex 的 Open Agent Harness 時，把 Harness 定義得很具體：它要維持對話狀態、管理 Context、呼叫工具、處理失敗、套用 Sandbox 與 Approval Policy，還要讓工作跨 Turn 延續。<a href="https://developers.openai.com/blog/codex-as-a-platform">[7]</a></p>

<p>官方同時公布一項自家測試：在 ARC-AGI-3 上，retained reasoning 加上 Context Compaction，讓 GPT-5.6 Sol 從 13.3% 提升到 38.3%，而 Output Token 降為原本的六分之一。這是 OpenAI 自己的 Benchmark 結果，不該被當成所有任務都會複製的獨立量測；但它至少說明一件事：<strong>Harness 的設計仍然可以大幅改變模型表現。</strong><a href="https://developers.openai.com/blog/codex-as-a-platform">[7]</a></p>

<p>所以「Strong Model + Thin Harness」裡的 Thin，指的是：</p>

<ul>
  <li>少一點針對舊模型寫死的偏見。</li>
  <li>少一點不必要的固定路由與角色扮演。</li>
  <li>少一點把流程複雜度誤認成系統成熟度。</li>
</ul>

<p>它不是：</p>

<ul>
  <li>不管理 Context。</li>
  <li>不限制工具與資料。</li>
  <li>不保存 State。</li>
  <li>不做 Approval。</li>
  <li>不留 Evidence。</li>
</ul>

<figure>
  <a href="/assets/img/technical/scaffolding-thin-harness-agent-architecture/thin-harness-stack.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/technical/scaffolding-thin-harness-agent-architecture/thin-harness-stack.svg" alt="薄 Harness 三層架構：應用層提供真實工作介面、業務脈絡、工具與權限；Harness 管理狀態、Context、工具迴圈、Sandbox、核准、失敗與證據；模型理解任務並自己決定路徑" loading="lazy" />
  </a>
  <figcaption>Thin Harness 是減少脆弱假設，不是拿掉測試、安全、核准與稽核。點圖可開啟原尺寸。</figcaption>
</figure>

<h2 id="artifact">OpenAI 自己留下了很多 Artifact</h2>

<p>如果只看「Scaffolding is coping」這句話，很容易以為 OpenAI 的理想工作流是把 Prompt 丟給 Codex，然後雙手離開鍵盤。</p>

<p>但 OpenAI 在 8 月 25 日公開的內部案例，實際上完全不是這樣。</p>

<p>一位 OpenAI 工程師用 Codex 與 Runme Notebook 處理重複的模型評估工作。流程是：</p>

<ol>
  <li>先寫一個短而持久的 Goal。</li>
  <li>要 Codex 參考上一次執行，提出詳細 Plan。</li>
  <li>在開始前等待人類審查與核准。</li>
  <li>執行時記下 Command、Output 與判讀。</li>
  <li>把死路、取捨與「下次要怎麼做」一起留在 Notebook。</li>
  <li>產生可被搜尋的 Markdown Index，讓後續 Agent 找得到先前經驗。<a href="https://developers.openai.com/blog/automating-repetitive-work-at-openai-with-codex">[6]</a></li>
</ol>

<p>這套流程不薄嗎？</p>

<p>其實很薄。因為它沒有替每一種評估另外寫一個硬編排自動化，也沒有先規定一定要叫幾個 Agent、用哪個模型思考、失敗三次後換哪條 Graph。</p>

<p>它把耐久的東西留下：Goal、Plan Approval、Evidence、Decision Record 與可搜尋歷史。執行路徑則讓 Codex 依當次狀況決定。</p>

<p>我把這種模式稱為 <strong>Artifact-driven Agent Workflow</strong>。這是我的整理名稱，不是 OpenAI 宣布的新產品名。</p>

<h2 id="memory">Memory 不該困在 Session 裡</h2>

<p>OpenAI 那篇文章裡，我覺得最值得注意的不是 Notebook 本身，而是這句設計：把意圖、動作、決策與結果放進同一個 Artifact。<a href="https://developers.openai.com/blog/automating-repetitive-work-at-openai-with-codex">[6]</a></p>

<p>這會把 Agent Memory 從「它好像還記得我」改成比較工程化的問題：</p>

<ul>
  <li>上次實際跑了什麼？</li>
  <li>哪條路失敗？</li>
  <li>為什麼最後選 A？</li>
  <li>哪個結果有 Test 或 Evidence？</li>
  <li>下次 Agent 要去哪裡搜尋？</li>
</ul>

<p>聊天記憶適合保留偏好、語氣與長期背景。但只要是會影響工作結果的知識，我不建議只放在 Claude Code、Codex 或 Hermes 的某一段 Session 裡。</p>

<p>因為 Session 很容易壓縮、結束、換模型、換工具，甚至只剩一句看起來很完整、實際上已經漏掉關鍵失敗路徑的摘要。</p>

<p>真正 model-agnostic 的 Memory，通常很樸素：Repository 裡的 Markdown、版本化 Spec、測試輸出、Runbook、Notebook、決策紀錄與系統產生的收據。它們不性感，但下一個 Agent 可以讀，下一個人也可以查。</p>

<figure>
  <a href="/assets/img/technical/scaffolding-thin-harness-agent-architecture/artifact-driven-agent-loop.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/technical/scaffolding-thin-harness-agent-architecture/artifact-driven-agent-loop.svg" alt="Artifact-driven Agent 工作循環：從持久 Goal 與 Spec 產生 Agent Plan，只在高影響決策卡人工核准，執行後保存測試證據、決策紀錄與可搜尋 Artifact，再供下一次執行重用" loading="lazy" />
  </a>
  <figcaption>Memory 不只是在聊天視窗裡「記得你」。工作型 Memory 要能被搜尋、驗證、比較與重跑。點圖可開啟原尺寸。</figcaption>
</figure>

<h2 id="skills">Skills 跟 Strong Model 並不衝突</h2>

<p>Tibo 在 Matthew Berman 的新訪談裡談到，熟練的 Coding Agent 使用者現在還得自己管理 Skill Files、Memory、Sub-agent 與一小群 Agent Network；每當這些機制失靈，使用者面前那個「懂你的完整夥伴」幻覺就會破掉。他理想中的產品，不該讓人一直處理這些 Implementation Detail。<a href="https://www.youtube.com/watch?v=4qjEgPojjzM">[8]</a></p>

<p>這不代表 Skill、Memory 與 Sub-agent 在技術上會消失。</p>

<p>比較可能的情況是：<strong>它們會從使用者要手動管理的 UI 概念，退到 Agent 自己使用的底層能力。</strong></p>

<p>Anthropic 現在的 Agent Skills 正好可以用來理解這件事。它採取 Progressive Disclosure：平常只載入名稱與描述；符合需求時才讀 <code class="language-plaintext highlighter-rouge">SKILL.md</code>；Reference 與 Script 則在真正需要時再取用。<a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview">[5]</a></p>

<p>這跟「把全部規則塞進 System Prompt」不是同一件事。</p>

<p>前者提供一組可以被 Agent 自己發現、組合與執行的 Primitive；後者則先把模型的注意力塞滿，再希望它一字不漏地照劇本演出。</p>

<p>所以我不會把 OpenAI 與 Anthropic 簡化成互相衝突的兩派。比較準確的說法是：</p>

<ul>
  <li><strong>OpenAI：Strong Model + Thin Harness。</strong></li>
  <li><strong>Anthropic：Strong Model + Composable Skills。</strong></li>
</ul>

<p>最後兩邊很可能在同一個方向會合：底層能力仍然存在，但人只需要說清楚要什麼、不能破壞什麼，以及怎麼證明完成。</p>

<h2 id="attention">Multi-Agent 的瓶頸開始變成人</h2>

<p>INSIDE 把 Tibo 過去談過的方向整理成「Single Agent → Multi-Agent Network」。這個判斷放在後端架構上未必錯，但新訪談又補了一個很有意思的修正。</p>

<p>Matthew Berman 說，他現在因為 Agent 慢，會同時開 10 到 15 個；如果 Ultra Fast 模型把回應大幅加快，也許反而只需要同時處理 3 到 4 個。這兩個數字是主持人描述自己的工作流，不是 Tibo 提出的通用最佳實踐。Tibo 回應的重點，是產品必須尊重人的注意力與 Context Switching 成本。<a href="https://www.youtube.com/watch?v=4qjEgPojjzM">[8]</a></p>

<p>這跟我前面寫的 <a href="/technical/ai-agent-surgical-team/">AI Agent 外科手術團隊</a>其實是同一個瓶頸：執行頻寬可以突然放大，人的決策頻寬不會同比例成長。</p>

<p>十幾隻 Agent 在 Terminal 裡同時跑，看起來很像未來。等它們一起回來、每隻都附一份很有自信的報告時，未來就會變成你的 Review Queue。</p>

<p>所以我不會把「Agent 越多」當成成熟度指標。</p>

<p>我更看好的是：一個更強、更快、更懂脈絡的 Agent，在底下自己決定要不要平行探索、叫多少 Worker、何時合併結果。使用者看到的是一個責任邊界；平行化是 Implementation Detail。</p>

<p>Tibo 同一場訪談也說，ChatGPT 與 Codex 的合併方向來自同一個想法：底層是相同的技術與 Harness，介面再依個人的工作調整。<a href="https://www.youtube.com/watch?v=4qjEgPojjzM">[8]</a></p>

<p>這表示 Coding Agent 可能不是一個永遠獨立的物種。更像是 General Agent 第一個被攻破、又最容易用 Test 與 Git 驗證的高價值工作領域。</p>

<h2 id="sdd">SDD 要從規定步驟，轉成建立球場</h2>

<p>這些訊號放回 SDD 或 OpenSpec，我的結論不是「規格已經過時」。</p>

<p>剛好相反。</p>

<p>模型越能自己規劃，Spec 越不需要教它每一步怎麼想，卻越需要把以下事情說清楚：</p>

<ul>
  <li><strong>Intent</strong>：到底要解決誰的什麼問題。</li>
  <li><strong>Constraints</strong>：架構、相容性、資料與商業邊界。</li>
  <li><strong>Non-goals</strong>：這次刻意不碰什麼。</li>
  <li><strong>Acceptance Criteria</strong>：什麼叫完成。</li>
  <li><strong>Tests / Evals</strong>：哪些結果可以機械驗證。</li>
  <li><strong>Evidence</strong>：完成時要留下什麼收據。</li>
  <li><strong>Approval Gates</strong>：哪些高影響決策與不可逆動作必須等人。</li>
</ul>

<p>以前常見的 Spec，實際上混進了大量 Orchestration：</p>

<blockquote>
  <p>Step 1 先讀 A，Step 2 呼叫 Agent B，Step 3 用模型 C，Step 4 寫 <code class="language-plaintext highlighter-rouge">plan.md</code>，Step 5 叫 Reviewer，Step 6 不及格 Retry 三次。</p>
</blockquote>

<p>比較未來型的 Spec 會像這樣：</p>

<blockquote>
  <p>需求、限制與完成定義在這裡。你可以自己決定調查與實作路徑；但不能越過安全邊界，所有 Acceptance Criteria 都要有可重現 Evidence，高影響變更要在 Decision Gate 等待核准。</p>
</blockquote>

<p>差別不是從「有規格」變成「沒規格」。</p>

<p>差別是從 <strong>Procedure Contract</strong>，逐漸轉成 <strong>Outcome + Boundary + Evidence Contract</strong>。</p>

<p>規格不是 AI 的籠子，而是球場的邊界線。</p>

<p>球員越強，你越不需要告訴他每一步腳要踩哪裡；但界外、犯規、得分與終場規則，反而要定義得更清楚。</p>

<h2 id="forecast">我對幾個預測的可信度</h2>

<table>
  <thead>
    <tr>
      <th>預測</th>
      <th>我的判斷</th>
      <th>理由</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Prompt hack、手刻 Routing 會大量折舊</td>
      <td>★★★★☆</td>
      <td>模型與原生 Harness 正在吃掉短期補丁，但特殊環境仍會保留少量定制</td>
    </tr>
    <tr>
      <td>Skills、Memory、Sub-agent 會消失</td>
      <td>★★★☆☆</td>
      <td>技術元件不會消失，手動管理它們的產品體驗會逐漸退到背景</td>
    </tr>
    <tr>
      <td>現在的 Codex 幾個月後看起來很原始</td>
      <td>★★★☆☆</td>
      <td>方向可信，時間表要對產品負責人的樂觀保留折扣</td>
    </tr>
    <tr>
      <td>Multi-Agent 會成為下一個主要 UI</td>
      <td>★★☆☆☆</td>
      <td>後端動態平行化很可能增加，前端讓人管理 20 隻 Agent 未必是終局</td>
    </tr>
    <tr>
      <td>Artifact-driven Workflow 會更重要</td>
      <td>★★★★☆</td>
      <td>它不依賴單一模型或 Session，能直接累積組織可查核的工作知識</td>
    </tr>
  </tbody>
</table>

<p>這裡的星等是我的判斷，不是來源提供的評分。</p>

<h2 id="playbook">如果是我，我會這樣改流程</h2>

<p>如果團隊現在已經在用 Claude Code、Codex、Hermes 或其他 Agent，我不會急著重做一套新架構。我會先做六件事：</p>

<ol>
  <li><strong>替每一層 Scaffolding 標註原因與有效期限</strong>：它在補哪個模型弱點？模型升級後用最小案例重測，沒必要就刪。</li>
  <li><strong>把規格改成 Intent、Constraints、Acceptance Criteria 與 Evidence</strong>：少寫固定思考步驟，多寫不可破壞的真相。</li>
  <li><strong>把 Human-in-the-loop 移到決策點</strong>：Plan、架構取捨、外部寫入、付費與不可逆動作才卡人工；探索與可逆修正讓 Agent 自己跑。</li>
  <li><strong>把執行紀錄做成第一級產物</strong>：Command、測試結果、失敗路徑與決策理由寫進 Notebook、Markdown 或 Runbook，不只留聊天摘要。</li>
  <li><strong>不要把 Agent 數量當 KPI</strong>：先量人的 Review Queue、返工與 Decision Latency；注意力爆掉時先合併責任，不是再加一隻 Reviewer Agent。</li>
  <li><strong>每次換模型都跑 Harness Ablation</strong>：從最簡流程開始，一層一層加回 Router、Skill、Memory、Reviewer；只有能穩定改善真實任務結果的層才留下。</li>
</ol>

<p>最後一點很重要。</p>

<p>很多 Agent Architecture 的問題，不是它完全沒用，而是從來沒有人測過：<strong>拿掉之後是不是反而更好。</strong></p>

<p>我以前寫過 <a href="/technical/production-ai-agent-control-planes/">Production AI Agent 的四層控制面</a>，強調 Instruction、Evidence、State 與 Permission。現在回頭看，我仍然會保留那四層；但會更小心，不把「控制面」寫成模型必須逐字照演的思考劇本。</p>

<p>控制面應該管理邊界、狀態與收據。模型則負責在邊界裡找到路。</p>

<h2 id="ending">不要投資在教今天的 AI 每一步怎麼走</h2>

<p>把這幾篇訪談與 OpenAI 新公開的工作流放在一起，我最後帶走的不是「不要 Scaffolding」這句漂亮口號。</p>

<p>而是：</p>

<blockquote>
  <p><strong>不要投資在教今天的 AI 每一步怎麼工作；要投資在讓明天更聰明的 AI 知道什麼是對的。</strong></p>
</blockquote>

<p>長期有價值的，仍然是 Specification、Architecture、Domain Knowledge、Tests、Evals、Security、Observability、Data，以及可以被下一次工作重用的 Artifact。</p>

<p>至於 Prompt 技巧、固定 Agent 組織圖、Context 搬運與 Routing 花招，我不會說它們今天全部沒用。但我會開始把它們當消耗品，而不是地基。</p>

<p>地基應該讓更強的東西長上去，不是讓它永遠維持我們第一次搭鷹架時的形狀。</p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><strong>[1]</strong> <a href="https://www.inside.com.tw/article/42193-tibo-sottiaux-ai-agent-vision-timeline">INSIDE：別再用一堆規範綁住 AI！OpenAI 產品負責人 Tibo 談 Agent 願景與時間線</a></li>
  <li><strong>[2]</strong> <a href="https://podscan.fm/podcasts/dev-interrupted/episodes/scaffolding-is-coping-not-scaling-and-other-lessons-from-codex-openais-thibault-sottiaux">Dev Interrupted：Scaffolding is coping, not scaling</a></li>
  <li><strong>[5]</strong> <a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview">Anthropic：Agent Skills Overview</a></li>
  <li><strong>[6]</strong> <a href="https://developers.openai.com/blog/automating-repetitive-work-at-openai-with-codex">OpenAI：Automating repetitive work at OpenAI with Codex</a></li>
  <li><strong>[7]</strong> <a href="https://developers.openai.com/blog/codex-as-a-platform">OpenAI：Codex as a platform</a></li>
  <li><strong>[8]</strong> <a href="https://www.youtube.com/watch?v=4qjEgPojjzM">Matthew Berman：How to Understand the Next Wave of AI Before Everyone Else｜Tibo Interview</a></li>
  <li><strong>[9]</strong> <a href="https://learn.chatgpt.com/docs/agent-configuration/agents-md">OpenAI Codex：Custom instructions with AGENTS.md</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="ai-agent" /><category term="ai-coding" /><category term="agent-harness" /><category term="codex" /><category term="claude-code" /><category term="sdd" /><category term="agent-skills" /><category term="multi-agent" /><category term="context-engineering" /><category term="software-architecture" /><summary type="html"><![CDATA[Tibo Sottiaux 說 Scaffolding is coping, not scaling，不代表不要規格、測試與安全邊界。本文拆解 Thin Harness、Capability Overhang、Artifact-driven Agent Workflow，以及 SDD 該如何調整。]]></summary></entry><entry><title type="html">Bot Mode 不是多開幾個聊天視窗：AI Agent 正從 Session 走向有名字的長期同事</title><link href="https://swanky.github.io/technical/hermes-bot-mode-persistent-ai-team/" rel="alternate" type="text/html" title="Bot Mode 不是多開幾個聊天視窗：AI Agent 正從 Session 走向有名字的長期同事" /><published>2026-08-25T00:00:00+00:00</published><updated>2026-08-25T00:00:00+00:00</updated><id>https://swanky.github.io/technical/hermes-bot-mode-persistent-ai-team</id><content type="html" xml:base="https://swanky.github.io/technical/hermes-bot-mode-persistent-ai-team/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>Bot Mode 不是多開幾個聊天視窗</strong>：在 Hermes 裡，Bot 就是一個 Profile，角色、模型、記憶、技能、工具、對話與排程都能長期保留。</li>
    <li><strong>真正的改變是持久化對象</strong>：Grok Bot／Hermes 把「那位 AI 同事」放在首頁；Claude Code／Codex 仍更常從專案 Session、Task 或 Goal 出發。</li>
    <li><strong>持久化不等於自治，更不等於隔離</strong>：Hermes Profile 不是 filesystem sandbox；Grok Bots 也共用同一台帳號層級的 cloud computer。</li>
    <li><strong>我看好的不是 AI 公司幻想</strong>：比較合理的架構，是少數長期角色負責脈絡與責任，再召喚一次性 workers 執行；這不是 Hermes 內建的安全保證，我會要求高風險外部動作另外通過可驗證的 Gate。</li>
  </ul>
</div>

<nav class="article-toc article-toc--outline" aria-label="文章大綱">
  <span class="article-toc-label">本文大綱</span>
  <ol class="article-toc-parts">
    <li class="article-toc-part">
      <span class="article-toc-part-title">先搞懂 Bot Mode 改了什麼</span>
      <ol class="article-toc-items">
        <li><a href="#sidebar">AI 公司先長在左側欄裡</a></li>
        <li><a href="#identity">從 Session-centric 到 Identity-centric</a></li>
        <li><a href="#profile">底層沒有魔法：Bot 就是 Profile</a></li>
        <li><a href="#collaboration">Bot 怎麼聊天、交接與定期工作</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">再看它的邊界與下一步</span>
      <ol class="article-toc-items">
        <li><a href="#comparison">Grok Bot、Hermes、Claude Code、Codex 差在哪</a></li>
        <li><a href="#security">最危險的誤會：Profile 不是 Sandbox</a></li>
        <li><a href="#trend">Persistent Agent 會把什麼問題放大</a></li>
        <li><a href="#playbook">如果是我，我會先做四個角色</a></li>
      </ol>
    </li>
  </ol>
</nav>

<h2 id="sidebar">AI 公司先長在左側欄裡</h2>

<p>這幾天我收到一封介紹 Hermes Bot Mode 的 newsletter，標題大意是：「一支免費、而且真正屬於你的 AI 團隊。」</p>

<p>我第一個反應其實不是興奮，而是有點想笑。AI 公司終於從簡報裡走出來了，只是暫時還沒有辦公室，先長在 Desktop 左側欄裡。</p>

<p>但我把 <a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode">Hermes Bot Mode 官方文件</a>、Profile、Cron 與跨機器通訊機制重新看過一輪，再對照 Grok Bot、Claude Code 與 Codex，發現這次不只是換皮。</p>

<p>我自己的 Hermes 已經開啟 Bot Mode protocol，但 roster 目前仍只有一個 <code class="language-plaintext highlighter-rouge">default</code>。這個狀態反而很誠實：<strong>功能存在，不代表團隊已經被設計出來。</strong></p>

<p>多開十個聊天視窗很容易。困難的是：每個角色該記得什麼、能碰什麼、何時交接、出了事由誰負責。</p>

<p>Bot Mode 真正改變的，是這個問題開始被放進產品的核心。</p>

<h2 id="identity">從 Session-centric 到 Identity-centric</h2>

<p>過去使用 AI 工具，我們通常從一件工作開始：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>開一段對話
  ↓
描述任務
  ↓
Agent 執行
  ↓
拿回結果
  ↓
Session 慢慢被遺忘
</code></pre></div></div>

<p>就算背後有 Subagent，它們通常也是為了眼前工作臨時被叫進來，做完再把結果交回主 Agent。</p>

<p>Bot Mode 把順序反過來：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>先建立一個長期角色
  ↓
配置責任、模型、記憶、Skills、Tools、Routines
  ↓
不同任務持續交給「同一個角色」
  ↓
角色累積脈絡，並與其他角色交接
</code></pre></div></div>

<p>最大的差異不是「有沒有 Multi-Agent」。Claude Code、Codex 早就能平行派出 Subagents。</p>

<p>真正的問題是：<strong>工作做完後，系統主要留下的是那個 Task，還是那個人？</strong></p>

<p>這不是純粹的 UI 差異。持久化對象一變，使用者就會開始替 Agent 設計職責、權限、升級路徑、例行工作與協作關係。原本是 Prompt Engineering 的東西，慢慢變成 Organization Design。</p>

<h2 id="profile">底層沒有魔法：Bot 就是 Profile</h2>

<p>Nous 官方對 Hermes Bot Mode 的定義很直接：</p>

<blockquote>
  <p>A Bot is a profile.</p>
</blockquote>

<p>Hermes 原本就有 Profile。每個 Profile 都有自己的狀態目錄，裡面可以放：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/.hermes/profiles/researcher/
├─ config.yaml       # 模型、工具與執行設定
├─ .env              # 憑證設定
├─ SOUL.md           # 角色與長期指令
├─ memories/         # 持久記憶
├─ skills/           # 可重用程序
├─ sessions/         # 對話與工作脈絡
└─ cron/             # 排程工作
</code></pre></div></div>

<p>Bot Mode 做的，是把這些 Profile 正式包裝成一份有名字、頭像、職稱與描述的 roster。Desktop 只是控制面；CLI 看到的是同一個底層 Agent：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hermes <span class="nt">-p</span> researcher chat
hermes profile list
hermes cron list
</code></pre></div></div>

<p>在建立 Bot 時，可以選擇：</p>

<ul>
  <li>從既有 Profile 複製 config、Skills、SOUL 與 Memory。</li>
  <li>建立新的 Fresh Profile。</li>
  <li>用 Create empty 跳過預載 Skills，從最小能力開始。</li>
  <li>為每個 Bot 綁定不同 Provider／Model。</li>
  <li>分別開啟 Skills、Toolsets 與 MCP Servers。</li>
  <li>設定自訂 SOUL.md。</li>
  <li>建在本機、遠端 Gateway、SSH 主機或 Hermes Cloud instance。</li>
</ul>

<p>Bot 的生命週期也和一般 Session 不一樣。右鍵可以 Duplicate、Hide 或 Delete：Duplicate 會複製 config、Skills、SOUL、Memory 與外觀，但不會複製來源對話；Hide 只把它收起來，Group membership、@mention 與 Routine 不受影響；Delete Profile 則是真正的破壞性刪除，而且 default Profile 不能刪。名稱、職稱與 description 有助於人類與其他 Bot 判斷「該找誰」，卻不構成權限控制。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#the-bots-pane">[1]</a></p>

<p>換句話說，Bot Mode 沒有再造一套 Agent runtime。它把原本分散在 Profile、Memory、Skills、Cron、Gateway 裡的能力，整理成一個人比較容易理解的角色模型。Hermes v0.20.3 在 2026 年 8 月 16 日把 Bot Mode plugin 與 teammate protocol 正式 bundle 進穩定版，也是因為底層原本就已經存在，不需要再發明一個平行世界。<a href="https://github.com/NousResearch/hermes-agent/releases/tag/v2026.8.16.2">[3]</a></p>

<p>這裡還要補一個版本陷阱。Hermes 線上文件追蹤 <code class="language-plaintext highlighter-rouge">main</code>，而 8 月下旬的 structured <code class="language-plaintext highlighter-rouge">message_agent</code>、完整跨 Gateway relay 與 typed failure reasons，有些是在當時最新正式 release 之後才合併。以下分析的是 2026 年 8 月 25 日官方文件呈現的 current design；實際操作前，仍要以安裝版本與 release notes 為準。把 <code class="language-plaintext highlighter-rouge">main</code> 上的文件直接當成每台舊 Desktop 都已經有，會是另一種很 Agentic 的自信錯誤。</p>

<figure>
  <a href="/assets/img/technical/hermes-bot-mode/bot-profile-anatomy.svg">
    <img src="/assets/img/technical/hermes-bot-mode/bot-profile-anatomy.svg" alt="Hermes Desktop 與 CLI 共用 Bot Profile；Profile 內包含身份、模型、SOUL、記憶、Skills、Tools、MCP、Bot Chat 與 Routines。Profile 分開狀態但 OAuth 或 token pool 可能共享，而且不構成檔案系統沙箱" loading="lazy" />
  </a>
  <figcaption>Bot Mode 是既有 Profile 的控制面。點圖可開啟原尺寸；最下方的安全邊界比上面的可愛 roster 更重要。</figcaption>
</figure>

<h3 id="bot-chat-是一段不輕易結束的關係">Bot Chat 是一段不輕易結束的關係</h3>

<p>每個 Bot 建立時，都會同時產生一個 canonical Bot Chat。它不是普通工作 Session，而是那個角色的持久主對話。</p>

<p>官方甚至刻意攔截這個聊天裡的 <code class="language-plaintext highlighter-rouge">/new</code> 與 <code class="language-plaintext highlighter-rouge">/reset</code>，改成 <code class="language-plaintext highlighter-rouge">/compact</code>：清掉過重的工作上下文，但不把關係 fork 成另一段 Session。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#creating-a-bot">[1]</a></p>

<p>這個設計很有意思。它承認長期角色需要連續性，也承認 context window 不可能無限成長。</p>

<p>持久記憶不是把所有聊天永遠塞進 Prompt，而是知道什麼該保留、什麼該壓縮、什麼已經過期。這部分做不好，所謂的「長期同事」很快就會變成一位記得很多過時規則、但每天都很有自信的老員工。這種人類已經夠多了，沒必要再自動生成一批。</p>

<h2 id="collaboration">Bot 怎麼聊天、交接與定期工作</h2>

<p>Bot Mode 目前有三種主要協作形態。</p>

<h3 id="1-直接-mention把工作交給具名角色">1. 直接 @mention：把工作交給具名角色</h3>

<p>你可以在 Bot Chat 裡輸入：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@researcher 查核這個技術宣稱，再把來源交給 @writer。
</code></pre></div></div>

<p>這裡不是單純把文字複製到另一個聊天室。Hermes 會先從 live roster 解析對象，把 profile、friendly name 與所在裝置交給目前的 Bot，再由它自行組成訊息，透過：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>message_agent(target="researcher", message="...")
</code></pre></div></div>

<p>送進對方的 canonical Bot Chat。</p>

<p><code class="language-plaintext highlighter-rouge">message_agent</code> 會驗證 target、補上 sender attribution，並以 fire-and-forget 方式執行。發送者先拿到 acknowledgement；接收者完成後，回覆再以背景通知送回來。目前也不會在另一位 Bot 正工作到一半時硬插話，而是在它下一次 invocation 接收訊息。這個工具只存在於 Bot Mode 管理的 canonical Bot Chat，不會突然出現在所有一般 Session。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#bot-to-bot-messaging">[1]</a></p>

<p>這些細節看似瑣碎，卻是在回答一個真正的分散式系統問題：誰傳的、傳給誰、失敗能不能重試、同名角色在不同機器上怎麼辨認、對方離線時怎麼回報。</p>

<h3 id="2-group-chat有限回合的多-agent-討論">2. Group Chat：有限回合的多 Agent 討論</h3>

<p>Hermes 的 Group Chat 不是讓一群模型無限互相稱讚。</p>

<p>目前規則是：</p>

<ul>
  <li>一個 Room 可放 2–6 個 Bots。</li>
  <li>每次使用者訊息最多跑三輪 serial rounds。</li>
  <li>每次 send 最多產生十則 Bot 訊息。</li>
  <li>指定 <code class="language-plaintext highlighter-rouge">@mention</code> 時，只叫被點名的成員；沒指定才讓所有成員判斷要不要回答。</li>
  <li>Bot 可以選擇 pass，不必每個人都講話。</li>
  <li>Bot 可用 <code class="language-plaintext highlighter-rouge">@user</code> 把需要人類判斷的問題標成 needs you。</li>
  <li>每位成員都有自己的 <code class="language-plaintext highlighter-rouge">Group: &lt;name&gt;</code> 持久 Session。</li>
</ul>

<p>這些限制與協調行為都是 Desktop coordinator 的明確規則，不是靠 Prompt 拜託 Bots 自律。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#groups-and-group-chats">[1]</a></p>

<p>完整 orchestration log 留在 Desktop 本機；Gateway 只取得有界的近期 transcript projection。這能降低各成員各自保留一套分歧群聊歷史的風險，但也表示 Gateway 上看到的內容不一定是完整稽核紀錄。</p>

<p>這個 hard cap 很重要。Multi-Agent 最容易出現的假象，就是大家都有說話，所以看起來很忙；Token 也真的有燒掉，但沒有多產生一個可驗證的判斷。</p>

<p>我會把 Group Chat 留給真正有衝突的工作，例如架構取捨、風險反證與內容審稿。單純交接，直接 @mention 就好。</p>

<h3 id="3-routine把已經做對的流程交給-cron">3. Routine：把已經做對的流程交給 Cron</h3>

<p>Bot 的 Routine 本質上就是 Hermes Cron job。Desktop 會把它顯示在 Bot 旁邊，但 CLI 仍能在 <code class="language-plaintext highlighter-rouge">hermes cron list</code> 看到。真正執行排程的是 Gateway daemon；scheduler 約每 60 秒 tick 一次，每次 run 都是新的 isolated Agent Session，Prompt 仍要能自足。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/features/cron">[13]</a></p>

<p>這表示 Routine 可以沿用既有排程能力，而不是另外養一套自動化系統。它也有一個很容易忽略的行為：<strong>隱藏 Bot 只是不顯示，@mention、Group membership 與 Routine 都會繼續運作。</strong><a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#routines">[1]</a></p>

<p>因此 Routine 適合：</p>

<ul>
  <li>每日新聞與技術掃描。</li>
  <li>定期價格或網站狀態監測。</li>
  <li>每週內容整理與研究摘要。</li>
  <li>測試、報告或資料清理等可重複流程。</li>
</ul>

<p>但「Bot 還在 roster」與「工作能永遠跑」是兩件事。Hermes 不會憑空替你提供一台永不關機的主機；Gateway、scheduler 與所在機器仍要運作。跨機器 DM 若走 Desktop relay，也需要同時認得兩端的 Desktop 保持連線；真正 always-on 的 peer-to-peer 路徑，則要另外設定 Gateway API、網路可達性與強金鑰。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#messaging-across-connected-machines-the-desktop-relay">[1]</a></p>

<figure>
  <a href="/assets/img/technical/hermes-bot-mode/safe-collaboration-loop.svg">
    <img src="/assets/img/technical/hermes-bot-mode/safe-collaboration-loop.svg" alt="作者建議的 Bot Mode 控制架構：人類先定義風險，讓具名 Bot 依工作選擇直接交接、有限回合群組討論或排程；輸出再通過確定性檢查、證據與獨立審查，以及人類核准" loading="lazy" />
  </a>
  <figcaption>作者建議的控制架構，並非 Hermes 內建強制流程。長期身份保存脈絡、責任與能力設定，但本身不構成權限或核准邊界。點圖可放大。</figcaption>
</figure>

<h2 id="comparison">Grok Bot、Hermes、Claude Code、Codex 差在哪</h2>

<p>把這四個產品放在一起看，很容易陷入功能表格：誰有 Subagent、誰有排程、誰能開 Terminal。</p>

<p>我覺得更有用的問題仍然是：<strong>系統主要把什麼當成長期存在的第一級物件？</strong></p>

<figure>
  <a href="/assets/img/technical/hermes-bot-mode/identity-vs-task-model.svg">
    <img src="/assets/img/technical/hermes-bot-mode/identity-vs-task-model.svg" alt="截至 2026 年 8 月 25 日，作者依主要產品入口把 Grok Bot 與 Hermes 歸為 Identity-first，把 Claude Code 與 Codex 歸為 Work-first；這是定性分組，不是能力排行或等距尺度" loading="lazy" />
  </a>
  <figcaption>作者依 2026 年 8 月 25 日的產品入口做定性分組；位置不代表分數或距離。四者都有重疊能力，也仍在快速互相靠近。點圖可開啟原尺寸。</figcaption>
</figure>

<table>
  <thead>
    <tr>
      <th>產品</th>
      <th>主要持久化對象</th>
      <th>協作方式</th>
      <th>執行環境與取向</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Grok Bot</td>
      <td>具名 Bot、account-wide Skills、Bot-owned Routines</td>
      <td>Bots 交接與協作</td>
      <td>託管式 persistent cloud computer；所有 Bots 共用帳號層級的檔案、登入與 CLI credentials</td>
    </tr>
    <tr>
      <td>Hermes Bot Mode</td>
      <td>Profile、Bot Chat、Memory、Cron</td>
      <td>@mention、DM、有限回合 Group Chat、跨機器 peer</td>
      <td>Local／Remote Gateway／SSH／Cloud；模型、SOUL、Skills、Tools、MCP 可自行配置</td>
    </tr>
    <tr>
      <td>Claude Code</td>
      <td>專案 Session 與可重用 Agent definition</td>
      <td>Subagents；experimental Agent Teams 可共用 Task List、互相傳訊</td>
      <td>以 Coding workflow 為核心；Agent Team 通常隨 lead session 結束</td>
    </tr>
    <tr>
      <td>Codex</td>
      <td>Chat、Goal、Task、可選的跨 Chat Memories</td>
      <td>主 Agent 協調平行 Subagents</td>
      <td>CLI／IDE／Desktop／Cloud；以完成條件與可驗收成果收斂</td>
    </tr>
  </tbody>
</table>

<h3 id="grok-bot託管式-ai-辦公室">Grok Bot：託管式 AI 辦公室</h3>

<p>xAI 官方把 Grok Bot 定義為長期存在的 AI teammate。每個 Bot 有自己的畫面，可以使用 Browser、Apps、Terminal 與 Files；不同 Bots 能交接工作、保存 Skills、建立排程或事件觸發的 Routines。背景 Routine 即使筆電闔上仍可運作。<a href="https://docs.x.ai/grok-bot/overview">[4]</a><a href="https://docs.x.ai/grok-bot/skills-routines-and-automations">[5]</a></p>

<p>但官方也講得很清楚：同一個帳號下的所有 Bots 共用一台 persistent cloud computer。檔案、瀏覽器 Session、App login 與 command-line credentials 都對整個 roster 可見。每個 Bot 有自己的 screen，卻不是自己的 security boundary。<a href="https://docs.x.ai/grok-bot/approvals-security-and-privacy#understand-the-shared-computer-boundary">[6]</a></p>

<p>Skills 與 Connectors 也是 account-wide library，不是每個 Bot 各自擁有的隔離資產；底層模型由產品選擇並可自動 failover，沒有使用者 model picker。它的優勢是省事，代價是控制面與資料邊界交給託管平台。<a href="https://docs.x.ai/grok-bot/computer-and-apps">[14]</a></p>

<h3 id="hermes-bot-mode自己組裝-ai-組織">Hermes Bot Mode：自己組裝 AI 組織</h3>

<p>Hermes 的優勢不是「免費 Grok Bot」。軟體本身是開源的，但模型 API、搜尋、影像生成、主機、GPU 與維運時間都會花錢。</p>

<p>真正差異是它把選擇權留給你：Bot 可以用不同模型、住在不同機器、擁有不同 SOUL 與工具組合，還能從 CLI 直接操作同一個 Profile。</p>

<p>控制力比較高，表示你也得自己承擔架構、監控、憑證與復原。自架從來不是免費，它只是把帳單從訂閱費拆成更多欄位。</p>

<h3 id="claude-code為專案臨時組成的工程-tiger-team">Claude Code：為專案臨時組成的工程 Tiger Team</h3>

<p>Claude Code 的 Custom Subagents 可以保存角色定義、工具與權限；Agent Teams 則讓 Team Lead 建立多個獨立 Session、共用 Task List，並讓 teammates 彼此傳訊。目前官方仍把 Agent Teams 標成 experimental、預設關閉，而且只在 CLI 提供，不是 Claude Desktop 功能。每個 teammate 都是獨立 Claude instance，Token 成本也會隨成員數增加。<a href="https://code.claude.com/docs/en/sub-agents">[7]</a><a href="https://code.claude.com/docs/en/agent-teams">[8]</a></p>

<p>它很像為眼前 Repository 召集一支工程小隊。Agent definition 與 shared task list 可以留下，但 live Team runtime 會隨 Session 結束；in-process teammates 也不會靠 <code class="language-plaintext highlighter-rouge">/resume</code> 自動復活。這不是整間公司的長期 roster。</p>

<h3 id="codex把-goal-做到可驗收">Codex：把 Goal 做到可驗收</h3>

<p>Codex 的 <code class="language-plaintext highlighter-rouge">/goal</code> 可以把長工作整理成有 title、spec 與 acceptance criteria 的持久目標，在 CLI、IDE 或 Desktop 中繼續、暫停與恢復。Subagents 則能在平行 threads 研究、實作與測試，再把結果帶回主 thread；目前官方描述的是由主 Agent 集中協調，而不是像 Claude Agent Teams 那樣讓 peers 共用 Task List、互相接管 lead。<a href="https://developers.openai.com/codex/long-running-work">[9]</a><a href="https://developers.openai.com/codex/subagents">[10]</a></p>

<p>Codex 也有預設關閉的 Memories，可跨 Chats 保存偏好與背景。不過官方把它定位成 recall layer，而不是權威規則來源；更高優先級的 system、developer、AGENTS.md 與當前 Prompt 仍會覆蓋它。這讓 Codex 並非「完全沒有長期脈絡」，只是產品入口仍從 Chat／Goal 開始，而不是先建立一位具名 teammate。<a href="https://learn.chatgpt.com/docs/customization/memories">[16]</a></p>

<p>所以 Codex 給我的感覺不是「Bob 今天又來上班」，而是「Goal #381 還沒 Done」。Goal 屬於那一個 Chat；它可以保存與恢復工作條件，卻不是跨任意 Chat、專案與排程都存在的角色身份。Codex 持久化的是工程承諾與完成條件，而不是先替執行者建立人格。</p>

<p>這四者其實沒有誰會把誰完全取代。比較可能的組合，是 Hermes／Grok Bot 保存長期責任與脈絡，Claude Code／Codex 類型的 workers 負責一次性、可平行、可驗收的工程執行。</p>

<h2 id="security">最危險的誤會：Profile 不是 Sandbox</h2>

<p>Bot Mode 的介面很像組織圖，很容易讓人誤以為每個 Bot 也像部門一樣有自己的門禁。</p>

<p>沒有。</p>

<p>Hermes 官方 Profile 文件明確區分三件事：</p>

<ul>
  <li>Profile：隔離 config、Memory、Sessions、Skills、Cron 與 Gateway state。</li>
  <li>Workspace：Terminal 從哪個目錄開始。</li>
  <li>Sandbox：Agent 實際能存取哪些檔案與系統資源。</li>
</ul>

<p>在預設 <code class="language-plaintext highlighter-rouge">local</code> terminal backend 下，Agent 仍然沿用執行 Hermes 的 OS 使用者權限。設定 <code class="language-plaintext highlighter-rouge">terminal.cwd</code> 只決定起始位置，不會阻止它走到其他資料夾；SOUL.md 裡寫「不要碰」也不是防火牆。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/profiles#profiles-vs-workspaces-vs-sandboxing">[2]</a></p>

<p>另外，Desktop 建立新 Bot 時，預設可能共享主要 Profile 的 OAuth／token pool。Clone 更會把 config、Skills、SOUL 與 Memory 一起帶過去。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#creating-a-bot">[1]</a></p>

<p>所以敏感用途不能只靠換名字與頭像隔離。Fresh Profile 會有乾淨的 Session 與 Memory，但仍可能沿用目前的 Provider、API key 或 shared OAuth pool；「狀態是新的」不代表「身份與憑證也是新的」。我會要求：</p>

<ol>
  <li>用 Create empty 建最小 Bot，不做 full Duplicate；需要的 Skills 再逐一加回。</li>
  <li>另行配置用途專屬的 Credentials／Gateway，不把 shared token pool 當成隔離；Host 上的 CLI Credentials 也要配合 <code class="language-plaintext highlighter-rouge">terminal.home_mode: profile</code> 或更強的 OS 邊界。</li>
  <li>只開必要的 Toolsets、Skills 與 MCP Servers。</li>
  <li>不需要 Terminal 的角色就不要給 Terminal。</li>
  <li>真正敏感的執行放進 Container、VM 或權限受限的遠端 Backend。</li>
  <li>發布、Merge、刪除、付款、寄信與 Production 修改，一律經人類核准。</li>
  <li>公司資料與個人 Agent 完全分開，不把內部 Email、Slack、程式碼或 Credentials 丟進個人 Bot。</li>
</ol>

<p>Persistent identity 會讓 Agent 比一次性 Session 更好用，也會讓錯誤權限活得更久。</p>

<h2 id="trend">Persistent Agent 會把什麼問題放大</h2>

<p>我認為 2026 年 Agent 工具確實正在從 Session-centric 往 Identity-centric 移動，但下一個競爭點不會只是「誰能養更多 Bots」。</p>

<h3 id="1-context-會從資產變成負債">1. Context 會從資產變成負債</h3>

<p>長期角色可以累積偏好、歷史與工作方法，這是它的價值。但錯誤記憶、過期 Skill、失效 Connector 與曾經合理的決策，也會一起留下。</p>

<p>一次性 Agent 做錯一次就結束；Persistent Agent 可能把同一個錯誤變成每週 Routine。</p>

<p>未來需要的不只是 Memory，而是 Memory lifecycle：來源、時效、衝突、刪除、回滾與責任人。</p>

<h3 id="2-agent-通訊會變成新的分散式系統">2. Agent 通訊會變成新的分散式系統</h3>

<p>一旦 Bots 可以跨機器、跨 Gateway、非同步交接，就會碰到我們早已熟悉的問題：重試、冪等性、重複訊息、離線、timeout、身份解析與可觀測性。</p>

<p>Hermes 已經替 delivery failure 定義 typed reason，並區分哪些錯誤值得自動重試、哪些重試只會浪費額度。這比「Agents 可以互聊」更值得注意，因為真正的系統通常不是壞在 Demo 的 happy path。<a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode#when-a-delivery-fails-typed-reasons">[1]</a></p>

<h3 id="3-review-debt-會比-token-更早撞牆">3. Review debt 會比 Token 更早撞牆</h3>

<p>Bots 愈多，產出愈快，人類的審查佇列就愈長。</p>

<p>DORA 2024 觀察到 AI 採用與文件、程式碼品質及 Review speed 改善相關，但也與 Delivery throughput、stability 下滑相關。METR 在 2025 年初的隨機實驗則發現，特定資深開源開發者在熟悉 Repository 上使用當時的 AI 工具，平均慢了 19%；原研究頁現在已明確警告，這個結果很可能不再適用於當前工具。2026 年更新資料出現加速訊號，但估計區間跨過零，且受到參與者不願被分配到禁用 AI、任務選擇與多 Agent 並行工時難以計算等偏誤影響，METR 自己也只稱為很弱的證據。這些結果不能直接比較，更不能推論所有 Agent 都會提高或降低生產力；它們共同提醒的，是<strong>生成速度不等於交付速度，量測方法也必須跟著工作型態改變。</strong><a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2024-dora-report">[11]</a><a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">[12]</a><a href="https://metr.org/blog/2026-02-24-uplift-update/">[15]</a></p>

<p>所以我不會讓同一個 Bot 一邊寫、一邊證明自己寫得很好。確定性檢查（測試、型別、Lint、靜態掃描）、證據審查（來源、Browser、視覺）、不同角色或模型的 Reviewer，以及人類 Gate，必須分層存在。</p>

<h3 id="4-最合理的是長期-manager-加一次性-workers">4. 最合理的是長期 Manager 加一次性 Workers</h3>

<p>不是每個工作都值得建立一位永久 AI 員工。</p>

<p>需要長期累積脈絡、承擔固定責任、定期被叫用的角色，適合做 Bot。一次性研究、單一 PR、短暫反方審查與大量平行嘗試，則適合 Subagent 或 Task worker。</p>

<p>未來成熟的 Agent 系統，比較可能長這樣：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>少數 Persistent Bots
負責責任、脈絡、路由與例行工作
          ↓
按需召喚 Ephemeral Workers
負責研究、實作、測試與反證
          ↓
Deterministic Verification
          ↓
Independent Review
          ↓
Human Approval
</code></pre></div></div>

<p>AI 組織不是把每個職稱都做成一個聊天頭像，而是替不同生命週期的工作選對執行單位。</p>

<h2 id="playbook">如果是我，我會先做四個角色</h2>

<p>我不會一開始建立十五個 Bots。Roster 很大，看起來很像公司，但也可能只是多了一個需要管理的通訊錄。</p>

<p>我會先從四個長期角色開始：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Orchestrator
├─ Research Scout
├─ Builder / Editor
└─ Verification Gatekeeper
</code></pre></div></div>

<h3 id="orchestrator">Orchestrator</h3>

<p>保留目標、限制、優先順序與責任邊界。它可以路由工作，但不應自動擁有所有高風險權限。</p>

<h3 id="research-scout">Research Scout</h3>

<p>負責找官方文件、論文、新聞與反證。可以排 Daily／Weekly Routine，但不能自行發布。</p>

<h3 id="buildereditor">Builder／Editor</h3>

<p>依規格產生程式碼、文件、文章或素材。它的工作目錄與可寫範圍要清楚，不能因為「方便」就讀整台電腦。</p>

<h3 id="verification-gatekeeper">Verification Gatekeeper</h3>

<p>使用不同角色、不同提示，必要時甚至不同模型。它負責測試、來源、Security scan、Browser evidence 與風險分類，但不能自己批准自己 Merge。</p>

<p>接著只量五件事：</p>

<ol>
  <li>一項工作從提出到可驗收花多久。</li>
  <li>人類實際花多少時間 Review。</li>
  <li>有多少產出被退回重做。</li>
  <li>Routine 是否產生過期、重複或無人處理的結果。</li>
  <li>權限與資料是否曾超出原本邊界。</li>
</ol>

<p>如果這四個角色都還沒有穩定，再增加 Bot 通常不會比較像公司，只會比較像多開幾個群組，而且每個群組都有人在 tag 你。</p>

<h2 id="conclusion">我真正期待的不是 AI 公司</h2>

<p>Hermes Bot Mode 不是 Claude Code Subagent 的另一個名字，也不只是 Grok Bot 的開源版本。</p>

<p>它比較像是把 Hermes 從「一個很強的 Agent」變成「一個可以設計 Agent 生命週期與責任關係的控制面」。Profile、Bot Chat、Group、Routine 與跨機器 messaging 原本都是技術元件；Bot Mode 把它們組成了人比較容易操作的組織模型。</p>

<p>這個方向很有價值，但「有名字」不會自動帶來責任，「有記憶」不會自動帶來判斷，「能互聊」也不代表已經形成團隊。</p>

<p>工具商很喜歡把這些介面畫成一間 AI 公司。對我來說，更準確的比喻其實是一張責任地圖：誰記得什麼、誰可以做什麼、哪裡必須停下來等人。</p>

<p>如果這張地圖沒有先畫清楚，開再多 Bots，也只是讓混亂開始有了頭像。</p>

<p><small>封面為 AI 生成概念圖，以水手服 AI 系統工程師與四個具名機器人角色呈現 Persistent Bot roster、工作交接、Routine 與驗證 Gate；不代表 Nous Research、xAI、Anthropic 或 OpenAI 的官方介面、合作或背書。內文圖解由作者依官方文件重新繪製。</small></p>

<hr />

<h2 id="參考資料">參考資料</h2>

<p>[1] <a href="https://hermes-agent.nousresearch.com/docs/user-guide/bot-mode">Nous Research：Hermes Agent Bot Mode</a></p>

<p>[2] <a href="https://hermes-agent.nousresearch.com/docs/user-guide/profiles">Nous Research：Profiles — Running Multiple Agents</a></p>

<p>[3] <a href="https://github.com/NousResearch/hermes-agent/releases/tag/v2026.8.16.2">Hermes Agent v0.20.3 Release Notes</a></p>

<p>[4] <a href="https://docs.x.ai/grok-bot/overview">xAI：Grok Bot Overview</a></p>

<p>[5] <a href="https://docs.x.ai/grok-bot/skills-routines-and-automations">xAI：Grok Bot Skills and Routines</a></p>

<p>[6] <a href="https://docs.x.ai/grok-bot/approvals-security-and-privacy">xAI：Grok Bot Approvals, Security, and Privacy</a></p>

<p>[7] <a href="https://code.claude.com/docs/en/sub-agents">Anthropic：Claude Code Custom Subagents</a></p>

<p>[8] <a href="https://code.claude.com/docs/en/agent-teams">Anthropic：Claude Code Agent Teams</a></p>

<p>[9] <a href="https://developers.openai.com/codex/long-running-work">OpenAI：Codex Long-running Work and Goal Mode</a></p>

<p>[10] <a href="https://developers.openai.com/codex/subagents">OpenAI：Codex Subagents</a></p>

<p>[11] <a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2024-dora-report">Google Cloud：2024 DORA Report</a></p>

<p>[12] <a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR：Early-2025 AI and Experienced Open-Source Developer Productivity</a></p>

<p>[13] <a href="https://hermes-agent.nousresearch.com/docs/user-guide/features/cron">Nous Research：Hermes Cron Scheduling</a></p>

<p>[14] <a href="https://docs.x.ai/grok-bot/computer-and-apps">xAI：Grok Bot Use the Computer and Apps</a></p>

<p>[15] <a href="https://metr.org/blog/2026-02-24-uplift-update/">METR：We Are Changing Our Developer Productivity Experiment Design</a></p>

<p>[16] <a href="https://learn.chatgpt.com/docs/customization/memories">OpenAI：Codex Memories</a></p>]]></content><author><name></name></author><category term="technical" /><category term="hermes-agent" /><category term="bot-mode" /><category term="ai-agent" /><category term="multi-agent" /><category term="agentic-engineering" /><category term="grok-bot" /><category term="claude-code" /><category term="codex" /><category term="ai-engineering" /><summary type="html"><![CDATA[Hermes Bot Mode 把 Profile 變成有名字、記憶、技能、模型與排程的長期 AI 角色。本文從底層架構、群組協作、安全邊界到 Grok Bot、Claude Code 與 Codex 的產品路線，分析 Identity-centric Agent 為什麼值得注意。]]></summary></entry><entry><title type="html">AI Agent 讓「外科手術團隊」復活了：一個人帶一群 Agent，瓶頸仍是人腦</title><link href="https://swanky.github.io/technical/ai-agent-surgical-team/" rel="alternate" type="text/html" title="AI Agent 讓「外科手術團隊」復活了：一個人帶一群 Agent，瓶頸仍是人腦" /><published>2026-08-24T00:00:00+00:00</published><updated>2026-08-24T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-agent-surgical-team</id><content type="html" xml:base="https://swanky.github.io/technical/ai-agent-surgical-team/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>發 Token 不等於組織轉型</strong>：如果流程與決策方式不變，AI 很可能只是把原本不值得做的事做得更快。</li>
    <li><strong>一人團隊開始可行</strong>：能定義問題、切架構、做取捨的人，可以把實作、測試、重構與文件交給多個 Agent。</li>
    <li><strong>AI 放大執行，沒有放大人腦</strong>：人仍要在腦中維持系統的一致模型；專案一大，認知負荷就會先撞牆。</li>
    <li><strong>大型系統不會變成大型獨角戲</strong>：比較合理的方向，是多位主導者各帶自己的 Agent，透過清楚的介面契約協作。</li>
  </ul>
</div>

<nav class="article-toc article-toc--outline" aria-label="文章大綱">
  <span class="article-toc-label">本文大綱</span>
  <ol class="article-toc-parts">
    <li class="article-toc-part">
      <span class="article-toc-part-title">先看 AI 改變了哪一種團隊</span>
      <ol class="article-toc-items">
        <li><a href="#tokens">問題不是少買幾張 AI 授權</a></li>
        <li><a href="#conway">組織會長進系統裡</a></li>
        <li><a href="#surgical-team">一個五十年前沒有普及的構想</a></li>
        <li><a href="#agents">Agent 終於補上支援團隊</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">再談它會在哪裡撞牆</span>
      <ol class="article-toc-items">
        <li><a href="#brain">執行變快，人腦沒有擴充記憶體</a></li>
        <li><a href="#scale">大型系統仍然需要分工</a></li>
        <li><a href="#playbook">如果是我，我會這樣設計</a></li>
        <li><a href="#judgment">最後瓶頸還是判斷力</a></li>
      </ol>
    </li>
  </ol>
</nav>

<h2 id="tokens">問題不是少買幾張 AI 授權</h2>

<p>今天看到<a href="https://x.com/dotey/status/2091662478425899254">寶玉在 X 上的一則長文</a>，他把 AI Agent、康威定律與《人月神話》的「外科手術團隊」接在一起。被他引用的 Xiaowen 貼文裡，有一句話很準：</p>

<blockquote>
  <p>個人效率解決的是「更快完成眼前這件事」；組織效率解決的是「省掉哪些不值得做的事」。</p>
</blockquote>

<p>很多組織導入 AI 的第一個反應，是替每個人買工具、發 Token，再期待所有人都快一點。這當然可能有幫助，但它比較像替原本的組織裝上渦輪。</p>

<p>問題是，如果車子開錯方向，渦輪只會讓它更早抵達錯的地方。</p>

<p>AI 真正有意思的地方，不只是把一小時的工作縮短，而是讓原本能定義問題、整合資源、承擔結果的人，直接做出過去需要一支小隊才能完成的東西。這不是單純的個人生產力提升，而是交付單位開始縮小。</p>

<p>我以前寫過 <a href="/technical/ai-executor-orchestrator/">Executor 與 Orchestrator 的差別</a>。那篇談的是人的角色；這一篇想往下再挖一層：<strong>當 Orchestrator 真的能帶著一群 Agent 交付，組織與軟體架構會變成什麼形狀？</strong></p>

<h2 id="conway">組織會長進系統裡</h2>

<p>Melvin Conway 在 1967 年提出一個後來被稱為<a href="https://www.melconway.com/Home/Committees_Paper.html">康威定律</a>的觀察：設計系統的組織，最後會做出一套近似自身溝通結構的設計。</p>

<p>四個團隊各自負責一塊，系統通常也會留下四塊邊界。部門之間很難溝通，模組之間的整合通常也不會突然變得優雅。組織圖不會被放進 Git，但它會用另一種方式長進程式碼裡。</p>

<p>傳統軟體開發之所以有需求、產品、架構、開發、測試與維運等角色，不只是大家喜歡畫泳道圖。系統夠大之後，很少有人能同時掌握所有領域，也沒有足夠時間把每件事親手做完，只能靠分工換取規模。</p>

<p>分工的代價是溝通。</p>

<p>如果每兩個人之間都可能需要直接協調，n 個人最多會形成 n(n-1)/2 條配對溝通路徑。人數增加時，潛在路徑不是直線增加。這也是為什麼一個進度落後的專案，多塞幾個人進去，常常先得到更多會議，而不是更多完成品。</p>

<h2 id="surgical-team">一個五十年前沒有普及的構想</h2>

<p>《人月神話》談過一個很有名、實務上卻沒有成為標準答案的做法：<strong>外科手術團隊（Surgical Team）</strong>。</p>

<p>這個構想原本由 Harlan Mills 提出，Fred Brooks 再於書中完整描述。核心不是找十個能力一樣的人，而是把設計與核心實作集中在一位 Chief Programmer，也就是「外科醫生」身上。副手、工具維護、測試、文件與行政等角色，都圍繞他提供支援。<a href="https://dl.acm.org/doi/10.5555/1074100.1074209">[1]</a><a href="https://www.computer.org/volunteering/awards/mills/about-mills">[2]</a></p>

<p>網狀溝通因此變成以主導者為中心的星狀結構。最重要的設計決策留在同一個腦中，系統比較容易維持 Brooks 所說的 <strong>Conceptual Integrity（概念完整性）</strong>。</p>

<p>這個想法很漂亮，但也很脆弱：</p>

<ul>
  <li>能掌握全局、又能做核心設計的人本來就少。</li>
  <li>關鍵人物離開或判斷錯誤，整支團隊會一起失速。</li>
  <li>系統持續變大後，一個人不可能知道所有細節。</li>
  <li>支援角色仍然要付出溝通、等待與交接成本。</li>
</ul>

<p>說穿了，當年的外科醫生不只要夠強，還得剛好配到一支隨叫隨到、完全理解他的支援團隊。這種組合在書裡很好看，在現實裡就比較像稀有掉落。</p>

<h2 id="agents">Agent 終於補上支援團隊</h2>

<p>AI Coding Agent 讓這個老構想重新值得討論。</p>

<p>今天，一個有技術判斷力的工程師、產品負責人或架構主導者，可以把問題定義、架構取捨與驗收標準留在自己手上，再讓 Claude Code、Codex 這類 Agent 接手大量支援工作：</p>

<table>
  <thead>
    <tr>
      <th>外科手術團隊</th>
      <th>Agent 時代的做法</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>外科醫生／Chief Programmer</td>
      <td>人類負責問題定義、架構、取捨與最終責任</td>
    </tr>
    <tr>
      <td>副手</td>
      <td>Agent 進行設計討論、反方審查與影響分析</td>
    </tr>
    <tr>
      <td>工具維護</td>
      <td>Agent 產生腳本、樣板與自動化工具</td>
    </tr>
    <tr>
      <td>測試</td>
      <td>Agent 補測試、找邊界案例、執行驗證</td>
    </tr>
    <tr>
      <td>文件與程式管理</td>
      <td>Agent 整理文件、重構、維護決策紀錄</td>
    </tr>
  </tbody>
</table>

<p>溝通成本也跟人類團隊不同。Agent 不用先排一場會議理解 Repository，可以直接讀程式碼、測試與版本紀錄；它不會因為被退回重做就開始捍衛面子，也不會嫌寫文件太無聊。</p>

<p>當然，它會看錯、做錯，也可能很有自信地把錯誤一路自動化。這也是為什麼我不把 Agent 當「不用管理的資深工程師」，而是把它當成執行力很強、但必須被規格與驗證約束的支援團隊。</p>

<p>重點不是一個人把所有職稱都兼掉。</p>

<p>重點是：<strong>一個人守住決策核心，AI 把決策轉成可驗證的實作。</strong></p>

<h2 id="brain">執行變快，人腦沒有擴充記憶體</h2>

<p>這個模式最容易被講成「一個人抵一支團隊」。我不太喜歡這種說法，因為它把產出速度跟系統駕馭能力混在一起。</p>

<p>AI 確實能讓程式碼、測試與文件更快出現，但沒有替人類擴充工作記憶。主導者仍然要知道：</p>

<ul>
  <li>系統現在有哪些重要邊界？</li>
  <li>這次修改破壞了哪個假設？</li>
  <li>哪些模組可以互相依賴？</li>
  <li>測試證明了什麼，又漏了什麼？</li>
  <li>這個結果符合需求，還是只符合提示詞？</li>
</ul>

<p>Agent 同時跑得愈多，人的審查佇列也會愈長。最後常見的瓶頸不是 Agent 沒事做，而是人來不及讀懂、判斷與批准。</p>

<p>這也是 AI 一人團隊真正的上限：<strong>執行頻寬變大，決策頻寬沒有同比例成長。</strong></p>

<p>如果主導者失去對整體的理解，只靠 Agent 回報「測試全綠」，外科手術團隊很快就會退化成一群動作很快、彼此不知道在改什麼的機器人。畫面很忙，病歷也都填了，但沒有人說得清楚病人為什麼躺在那裡。</p>

<h2 id="scale">大型系統仍然需要分工</h2>

<p>所以我認為，這個模式會先在邊界清楚的中小型系統、個人產品、內部工具，以及大型系統中的獨立模組上發揮最大效果。</p>

<p>超大規模系統不會因為模型變強，就突然適合讓一個人全部掌握。比較合理的結構，是幾位「外科醫生」各自帶著自己的 Agent 支援團隊，分頭負責不同的業務能力或模組，再用清楚的介面契約保持鬆耦合。</p>

<p>這其實是康威定律的逆向操作：</p>

<ol>
  <li>先決定系統真正需要哪些穩定邊界。</li>
  <li>再讓每位主導者對一個可理解、可驗證的邊界負責。</li>
  <li>模組之間靠 API、事件格式、資料所有權與失敗語意協作。</li>
  <li>Agent 在邊界內放大執行，不替人偷偷改寫邊界。</li>
</ol>

<p>未來的分工不一定消失，只是可能不再照前端、後端、QA、文件這種工序切開。每個小型交付單位會更接近「一位能做系統判斷的人，加上一組不知疲倦的 Agent」。</p>

<h2 id="playbook">如果是我，我會這樣設計</h2>

<p>如果要試這種工作方式，我不會從「同時開十個 Agent」開始。那只是把十條不確定的路一起加速。</p>

<p>我會先做七件事：</p>

<ol>
  <li><strong>選一個邊界清楚的完整成果</strong>：最好能在幾天內走完需求、實作與驗證，不先碰整個核心系統。</li>
  <li><strong>人類先寫清楚不可外包的判斷</strong>：問題、目標、架構限制、風險、完成定義與停止條件。</li>
  <li><strong>讓 Agent 按責任分工</strong>：實作、測試、清理與審查不要全部塞在同一段上下文，避免它一邊寫答案、一邊替自己打分數。</li>
  <li><strong>把規則做成硬性關卡</strong>：測試、靜態分析、依賴方向、介面契約與端到端驗收，不能只寫在提示詞裡勸 Agent 記得。</li>
  <li><strong>保留短而可查的決策紀錄</strong>：只記關鍵假設與取捨，不替專案養一座沒人敢刪的文件博物館。</li>
  <li><strong>量測整段交付，不只算生成速度</strong>：把重工、Review 缺陷、回滾與後續維護一起算進去。</li>
  <li><strong>當人腦開始失去全局，就拆邊界</strong>：不要再加 Agent。先把系統切成能由不同主導者獨立理解的模組。</li>
</ol>

<p>這跟我前面整理的 <a href="/technical/matt-pocock-skills-ai-coding-workflow/">Matt Pocock Skills 工作流</a>其實是同一件事：模型愈會做，流程愈要知道什麼不能由模型自己決定。</p>

<h2 id="judgment">最後瓶頸還是判斷力</h2>

<p>AI Agent 讓 Mills 與 Brooks 當年的外科手術團隊，第一次有機會以很低的協調成本落地。它讓一個有判斷力的人，開始接近過去一支小型團隊的完整交付能力。</p>

<p>但我不認為結論是「團隊不需要了」。</p>

<p>更準確地說，AI 正在壓縮支援執行的成本，也把主導者的判斷品質放大到以前沒有的程度。方向選對，一個人可以走得很快；方向選錯，一群 Agent 也會很有效率地替你把錯誤做完整、測試補齊、文件寫好。</p>

<p>這就有點微妙了。</p>

<p>以前我們怕的是人太多、溝通太慢。現在可能要怕的是執行太快，快到人的理解跟不上。</p>

<p>在 AI 能獨立承擔系統級決策與後果之前，最稀缺的仍然不是 Token，也不是程式碼，而是那個知道什麼值得做、怎麼切、哪裡不能錯，並且願意為結果負責的人。</p>

<p><small>封面為 AI 生成概念圖，用水手服主導者與五個機器人 Agent 表現「外科手術團隊」的軟體工程比喻；不代表任何原作者、工具或品牌的官方視覺與合作背書。</small></p>

<hr />

<h2 id="參考資料">參考資料</h2>

<p>[1] <a href="https://www.historicprojects.com/Harlan_Mills.html">Chief Programmer Teams — Harlan D. Mills 1971</a></p>

<p>[2] <a href="https://voljournals.utk.edu/utk_harlan/">The Harlan D. Mills Collection — University of Tennessee</a></p>

<p>[3] <a href="https://www.melconway.com/Home/Committees_Paper.html">Melvin E. Conway, How Do Committees Invent?</a></p>

<p>[4] <a href="https://x.com/dotey/status/2091662478425899254">寶玉：AI Agent 與外科手術團隊</a></p>

<p>[5] Frederick P. Brooks Jr., <em>The Mythical Man-Month: Essays on Software Engineering</em>, Anniversary Edition, Addison-Wesley, 1995.</p>]]></content><author><name></name></author><category term="technical" /><category term="ai-agent" /><category term="ai-coding" /><category term="software-engineering" /><category term="software-architecture" /><category term="conways-law" /><category term="mythical-man-month" /><category term="organization-design" /><category term="claude-code" /><category term="codex" /><summary type="html"><![CDATA[AI Coding Agent 讓一個有判斷力的人，開始具備過去一支小型團隊才有的交付能力。但執行變快之後，真正的限制仍是問題定義、概念完整性與人腦能維持的系統模型。]]></summary></entry><entry><title type="html">Matt Pocock × Uncle Bob：AI 寫程式愈快，軟體基本功愈不能省</title><link href="https://swanky.github.io/technical/uncle-bob-ai-software-fundamentals/" rel="alternate" type="text/html" title="Matt Pocock × Uncle Bob：AI 寫程式愈快，軟體基本功愈不能省" /><published>2026-08-20T00:00:00+00:00</published><updated>2026-08-20T00:00:00+00:00</updated><id>https://swanky.github.io/technical/uncle-bob-ai-software-fundamentals</id><content type="html" xml:base="https://swanky.github.io/technical/uncle-bob-ai-software-fundamentals/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>AI 沒有取消軟體工程</strong>：它只是讓程式碼生成變便宜，也讓混亂累積得更快。</li>
    <li><strong>提示詞只能提醒，工具才能執法</strong>：測試、突變測試、複雜度門檻與依賴規則，必須變成 Agent 繞不過去的硬性關卡。</li>
    <li><strong>不要照抄人類儀式</strong>：TDD 的節拍可以調整，但可驗證、可理解、低耦合與責任清楚這些價值不能丟。</li>
    <li><strong>人類要守住策略</strong>：Agent 可以接手更多戰術實作，人仍要決定做什麼、如何切模組、怎樣才算可以交付。</li>
  </ul>
</div>

<nav class="article-toc article-toc--outline" aria-label="文章大綱">
  <span class="article-toc-label">本文大綱</span>
  <ol class="article-toc-parts">
    <li class="article-toc-part">
      <span class="article-toc-part-title">先看兩個人怎麼把問題拆開</span>
      <ol class="article-toc-items">
        <li><a href="#interview">一場從浴袍開始的訪談</a></li>
        <li><a href="#matt">Matt 把問題一路問到人的位置</a></li>
        <li><a href="#dirty-code">AI 也會在髒程式碼裡打滑</a></li>
        <li><a href="#hard-gates">提示詞是提醒，工具才是法律</a></li>
        <li><a href="#economics">舊工具遇上新的成本曲線</a></li>
        <li><a href="#pipeline">五階段 Agent 品質管線</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">再決定人與 Agent 怎麼分工</span>
      <ol class="article-toc-items">
        <li><a href="#architecture">測試守行為，架構守理解</a></li>
        <li><a href="#values">保留價值，不迷信儀式</a></li>
        <li><a href="#agile">小步迭代又回來了</a></li>
        <li><a href="#learning">新人怎麼長出策略能力</a></li>
        <li><a href="#playbook">我會怎麼試</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">完整內容與核對</span>
      <ol class="article-toc-items">
        <li><a href="#translation">56 分鐘完整正體中文翻譯</a></li>
        <li><a href="#glossary">關鍵術語速查</a></li>
        <li><a href="#sources">來源與翻譯說明</a></li>
      </ol>
    </li>
  </ol>
</nav>

<h2 id="interview">一場從浴袍開始的訪談</h2>

<p>一場快一小時的 AI 軟體工程訪談，最先留在我腦中的不是模型名稱，而是一個穿著浴袍、清晨站在前廊抱怨 SQL Injection 的老工程師。</p>

<p>這很 Uncle Bob。看見一個荒謬的技術問題，就先把它說穿。</p>

<p>Robert C. Martin 從 1960 年代一路寫程式到今天。當他開始使用 ChatGPT、Grok 與 Coding Agent，最初也不是一路驚艷，而是不停替 AI 收拾留下來的雜亂。真正讓他改觀的，不是模型突然變得完美，而是他發現：Agent 的速度，可能讓一些過去太昂貴、很難每天執行的品質技術，重新變得實用。</p>

<p>我把這場對談完整翻成正體中文，不是因為裡面每句話都是金句，而是它避開了最無聊的「AI 會不會取代工程師」。它問的是另一個比較實際的問題：</p>

<blockquote>
  <p>當程式碼可以高速生成，我們要怎麼把品質、架構與判斷，變成 Agent 不能隨便繞過去的系統？</p>
</blockquote>

<p>我的結論很直接：<strong>AI 寫程式愈快，軟體基本功愈不能省。</strong></p>

<h2 id="matt">Matt 不是陪襯，他把問題一路問到人的位置</h2>

<p>只看標題，很容易以為這是一場 Uncle Bob 的單人演講。其實不是。Matt Pocock 沒有只把麥克風遞過去，他一直在替這套看似完整的方法找代價、找矛盾，也把談話從「怎麼讓 Agent 寫得更好」推到「人接下來要怎麼學會判斷」。</p>

<ul>
  <li><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1391s">23:11</a>，Matt 把不同 Agent 的工作慣性命名為 <strong>Context Trajectory</strong>：同一場 Session 一旦往某個方向走，後續行為就會被那條軌跡影響。清空上下文，不只是省 Token，而是真的換一條思考路線。</li>
  <li><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2142s">35:42</a>，他追問一個很現實的問題：五段品質管線這麼昂貴，送進去之前到底該規劃多深？這才把談話帶到規格、Agile 與小步回饋。</li>
  <li><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2752s">45:52</a>，他借用 John Ousterhout 的 Tactical／Strategic 區分，問出整場最難的一題：如果 Agent 吃掉戰術工作，新人要去哪裡長出策略能力？</li>
  <li><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3171s">52:51</a>，最後也是 Matt 把問題收回軟體基本功：如果基本功仍然重要，理由到底是什麼？</li>
</ul>

<p>所以這篇不只是整理 Uncle Bob 的答案。它也在整理 Matt 怎麼改變問題的焦距：從程式碼品質，拉到上下文、成本、迭代，最後拉回人的養成。</p>

<h2 id="dirty-code">AI 也會在髒程式碼裡打滑</h2>

<p>Uncle Bob 早期使用 Coding Agent 的方式，跟今天常見的 Vibe Coding 很像：叫它做一件事，看到功能會動，就立刻做下一件。留下來的命名、重複、耦合與測試缺口先不管，反正 Agent 跑得很快。</p>

<p>問題是，垃圾也會複利。</p>

<p>很快地，Agent 開始修改 A、破壞 B；修好 B，又把 C 弄壞；最後再回頭破壞 A。畫面上看起來很忙，真正進度卻接近零。Uncle Bob 把這種狀態叫作 Thrashing。</p>

<p>這件事有點重要。Agent 與人的複雜度耐受門檻也許不同，但門檻仍然存在。程式碼同時扛太多責任、依賴方向混亂、測試又薄弱時，模型並不會因為上下文比較長就突然免疫。</p>

<p>速度沒有消滅技術債。它只是讓技術債也能高速生成。</p>

<h2 id="hard-gates">提示詞是提醒，工具才是法律</h2>

<p>Uncle Bob 一開始也試過把 TDD、Clean Code、函式大小與各種規則寫進很長的提示詞。問題是，模型會把它們當成《神鬼奇航》裡的海盜守則：比較像參考，不太像法律。</p>

<p>上下文愈長，早期規則愈容易被擠進中段。模型對這些內容的注意力下降，也就是訪談裡談到的 Lost in the Middle。這時再補一句「請記得寫乾淨一點」，通常只是在用文字勸它乖。</p>

<p>更可靠的做法，是把價值觀翻成可以執行的關卡：</p>

<ul>
  <li>測試沒有全綠，不能結束。</li>
  <li>突變體仍然存活，不能交付。</li>
  <li>複雜度超過門檻，回去拆解。</li>
  <li>模組依賴逆流，必須反轉依賴、插入介面或重新分模組。</li>
  <li>端到端行為不符合驗收情境，就不是完成。</li>
</ul>

<p>提示詞負責說明意圖。工具負責裁決結果。</p>

<p>這也是我認為 AI Coding 工作流真正的分水嶺：不是 Prompt 寫得多漂亮，而是「完成」有沒有被外部系統定義，而且模型不能自己宣布過關。</p>

<h2 id="economics">舊工具遇上新的成本曲線</h2>

<p>CRAP 分數與 Mutation Testing 都不是 AI 時代才出現的新發明。它們過去沒有成為所有團隊的日常，不一定是因為沒價值，也可能只是太花時間。</p>

<p>CRAP 把測試覆蓋率與 Cyclomatic Complexity（循環複雜度）放在一起看。路徑很多、測試又不足的函式，風險自然比較高。</p>

<p>Mutation Testing 則故意把程式改壞，例如把 <code class="language-plaintext highlighter-rouge">&lt;</code> 變成 <code class="language-plaintext highlighter-rouge">&gt;</code>、把 <code class="language-plaintext highlighter-rouge">==</code> 變成 <code class="language-plaintext highlighter-rouge">!=</code>，再重跑測試。如果測試還是綠的，表示那組測試並沒有真的守住行為。</p>

<p>人會嫌這些工作慢、重複又無聊。Agent 不在乎無聊。</p>

<p>這就是成本曲線翻面的地方：AI 不只降低寫程式的成本，也降低反覆檢查、重跑、修正的成本。真正值得自動化的，未必只是產生更多程式碼，而是把過去「知道應該做，卻常常沒做」的品質流程變成預設路徑。</p>

<h2 id="pipeline">五階段 Agent 品質管線</h2>

<p>Uncle Bob 實驗的 Multi-Agent 管線，把同一項工作依序交給五個短命角色：</p>

<ol>
  <li><strong>Specifier</strong>：把人的需求整理成 Gherkin 情境與 QA 程式。</li>
  <li><strong>Coder</strong>：先讓功能運作。</li>
  <li><strong>Cleaner</strong>：移除重複、改善命名與結構。</li>
  <li><strong>Hardener</strong>：用 CRAP 與 Mutation Testing 對測試強度找麻煩。</li>
  <li><strong>QA</strong>：從外部驗證整體行為。</li>
</ol>

<p>單一 Agent 可能五分鐘就能吐出一個看似完成的版本。通過五個角色也許要一小時。訪談裡 Uncle Bob 估計，這仍可能比人類半天的工作快四到五倍；但這是他的實驗估算，不是可以直接套用到每個團隊的保證。</p>

<p>我覺得這套設計最有意思的地方，不是把 Agent 擬人成一間公司，而是<strong>上下文隔離</strong>。</p>

<p>每個 Agent 只做一件事，完成後退出。下一個角色從乾淨上下文開始，不必繼承前一個角色一路累積的辯解、假設與工作慣性。Coder 想讓東西先動，Cleaner 專心清理，Hardener 則刻意站在對立面找漏洞。</p>

<p>角色分工只是表面。真正被設計的是每段工作的 Context Trajectory。</p>

<p>這個觀察是 Matt 在訪談裡補上的。他指出，同一個上下文不只是裝了多少資訊，也有一路形成的工作軌跡；要真正換掉角色執念，最乾脆的方式就是讓上一個 Agent 結束，下一個從乾淨上下文開始。</p>

<p>當然，Agent 每次重新理解專案都有成本。關卡太多，也可能把速度優勢吃光。所以我不會一開始就照抄五段，而會先找目前最常漏掉的那一關。</p>

<h2 id="architecture">測試守行為，架構守理解</h2>

<p>完整測試不能替代良好架構。</p>

<p>Uncle Bob 會直接問 Agent：這個系統有哪些模組？彼此怎麼溝通？答案有時會糟到讓他重新檢查整個設計。他因此讓 Agent 建立可以逐層檢視的 UML 架構視圖，另外再用確定性規則限制依賴方向。</p>

<p>這裡可以借用訪談中的「咖啡與連續劇」比喻。模型原本在談咖啡，中途有人塞進一段連續劇，之後每個咖啡話題都可能被那段情節污染。模組也是一樣。如果付款、會員、郵件、報表與快取都擠在同一塊，Agent 很難維持穩定的理解軌跡。</p>

<p>Deep Module 的價值，就是用小而清楚的介面，藏住大量內部複雜度。對人如此，對 Agent 也是如此。</p>

<p>測試告訴模型「系統應該怎麼表現」；架構則告訴它「理解到哪裡可以先停」。兩者解決的是不同問題。</p>

<h2 id="values">保留價值，不要迷信儀式</h2>

<p>這是整場訪談裡，我最認同的一個區分：<strong>人類使用的工程紀律，不一定要原封不動搬給 Agent；但那些紀律保護的價值不能丟。</strong></p>

<p>TDD 對人有效，部分原因是人的短期記憶很小。先寫一個測試，再寫剛好讓它通過的程式碼，可以限制同時要處理的資訊。Agent 的上下文容量與工作方式不同，硬逼它照著人類節奏，一次只前進一小格，不一定產生同樣價值。</p>

<p>Matt 把這個回答接回「短期記憶」：TDD 的節拍對人類有幫助，不代表相同儀式對 Agent 也有同樣效益。這讓 values 與 disciplines 的差異不只是 Uncle Bob 的結論，而是兩人一起拆出來的判斷。</p>

<p>可以調整的是 TDD 的節拍、函式大小門檻、複雜度上限，以及每次修改的範圍。</p>

<p>不能丟的是這些東西：</p>

<ul>
  <li>行為可驗證。</li>
  <li>結構可理解。</li>
  <li>模組低耦合、責任清楚。</li>
  <li>依賴方向受控。</li>
  <li>失敗能被確定辨識。</li>
  <li>系統在修改後仍可維護。</li>
</ul>

<p>不要把工程方法當宗教。先問它原本在保護什麼，再用適合 Agent 的方式把那個價值留下來。</p>

<h2 id="agile">AI 讓 Agile 又回來了</h2>

<p>AI 很會寫計畫，也很會把計畫寫得像真的。</p>

<p>這一段是從 Matt 的追問開始的：既然品質試煉很花資源，工作送進管線前是不是應該把規格做到非常完整？問題看起來合理，也正好暴露「規格最大化」的誘惑。</p>

<p>於是「先讓多個 Agent 把規格磨到極致，再一次完成全部實作」重新變得很誘人。問題是，人不可能預先想到所有細節，Agent 也沒有足夠的策略判斷替我們補完所有缺口。真正開始實作後，現實很快就會把那份華麗規格敲碎。</p>

<p>Uncle Bob 的實驗最後又回到 Agile：選一個小而完整的 Story，做一點、驗證、看架構、重整，再做下一點。</p>

<p>這不是不要規格。是不要把規格當成另一套必須永遠同步的原始碼。規格可以是暫時的，會修改，也可能在完成任務後消失。最後真正能被執行與驗證的，仍是成品、測試與實際行為。</p>

<p>模型愈快，錯誤方向被大量自動化的風險也愈高。小步回饋不是過時的儀式，反而是避免 Agent 一口氣把錯誤做大的保險。</p>

<h2 id="learning">新人怎麼長出策略能力</h2>

<p>Matt Pocock 把問題推到最難回答的地方：如果 Agent 已經能做掉很多前線實作，團隊為什麼還要聘請一個做得比較慢的新手？而沒有戰術經驗的人，又要怎麼長成看得懂架構後果的策略工程師？</p>

<p>Uncle Bob 沒有假裝自己有完美答案。他提出的是一條接近學徒制的路：從二進位、電腦基礎、簡單 CPU 與組合語言開始，讓新人親手理解抽象層底下發生什麼；再透過 pair programming，跟著有經驗的人學會判斷。</p>

<p>他也建議去讀那些「老到沒人讀」的軟體工程書。舊書裡當然有過時技術，但模組化、溝通成本、技術債與設計後果，是前人真的付過代價才留下來的知識。</p>

<p>AI 可以壓縮戰術工作，卻也可能一起壓縮新人的練習場。這不是多裝一套 Coding Agent 就能解掉的人才問題。團隊若想得到未來的策略工程師，就得刻意保留能看見因果、能犯小錯、也有人帶著反省的學習路徑。</p>

<h2 id="playbook">如果是我，我會先這樣試</h2>

<p>我不會把整個系統交給五個 Agent，然後期待一週後收到奇蹟。那比較像把風險藏進自動化裡。</p>

<p>我會先選一個邊界清楚、可回滾、能從需求一路驗證到 UI 或 API 的小 Story，跑一個最小版本：</p>

<ol>
  <li><strong>提示詞只留必要資訊</strong>：任務、不可違反的限制、完成定義。</li>
  <li><strong>先建立硬性關卡</strong>：至少有單元測試、靜態分析與端到端驗收；有餘裕再加複雜度與突變測試。</li>
  <li><strong>把清理與加固拆開</strong>：不要讓同一個 Agent 一邊為自己的實作辯護，一邊假裝客觀審查。</li>
  <li><strong>把架構規則寫成工具能檢查的形式</strong>：哪些模組可以依賴哪些模組，不只留在簡報裡。</li>
  <li><strong>人類審策略</strong>：需求對不對、模組怎麼切、風險有沒有被看見。不是坐在旁邊跟 Agent 比打字速度。</li>
  <li><strong>量測整個週期</strong>：看 Lead Time、缺陷、回滾、存活突變體與後續維護，不只看第一版生成多快。</li>
  <li><strong>每一、兩個 Story 重看架構</strong>：方向錯了就早點重組，不讓錯誤乘上 Agent 的速度。</li>
</ol>

<p>先證明一條小路能穩定走通，再擴大。這很無聊，但 production 通常就是靠這些無聊的事活下來。</p>

<h2 id="final-judgment">最後判斷：基本功不是手工情懷</h2>

<p>訪談最後，Matt 再把整場對話壓成一句：軟體基本功聽起來仍然重要，為什麼？</p>

<p>從機器語言、組合語言、高階語言，到今天的模型，每次抽象層往上，總有人說工作要消失了。工作確實會變，複雜度卻沒有跟著消失。它只是搬到新的地方。</p>

<p>AI 可以替人產生更多程式碼，不能讓責任、依賴、行為、風險與維護成本憑空消失。</p>

<p>Clean Code、測試、模組化、架構方向與小步回饋仍然重要，不是因為我們懷念手工寫程式，而是人與模型都需要一套方法，把大到無法承受的複雜度，壓縮成可以理解、可以驗證的形狀。</p>

<p>以前基本功常被嫌慢。現在真正有意思的地方是，AI 或許終於讓我們付得起那個成本。</p>

<hr />

<h2 id="translation">56 分鐘完整正體中文翻譯</h2>

<p>以下依照原影片 00:00 至 56:20 的順序，完整保留來源 HTML 中的 133 段中文翻譯。點時間碼可從 YouTube 對應位置播放。英文原文收在每段下方，方便需要時逐段核對。</p>

<blockquote>
  <p>翻譯為中文可讀性補上標點、分段並統一技術術語；這不是原作者或頻道發布的官方譯稿。</p>
</blockquote>

<h3 id="起點與-ai-初體驗">起點與 AI 初體驗</h3>

<details class="article-transcript" data-index="1" data-time="00:00" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=0s" target="_blank" rel="noopener noreferrer">00:00</a><span>Matt</span><small>#001</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">今天準備了一份大禮。我邀請到一位早就很想訪談的人。他投入軟體的時間，至少跟我當開發者的資歷一樣久，事實上遠遠更久，而且如今也正開始在 AI Agent 領域留下自己的印記。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I&#x27;ve got a treat for you today. I&#x27;ve got someone who I&#x27;ve been wanting to speak to for a while. Someone who has been really into um I mean software for as long as I&#x27;ve been a developer, much longer than I&#x27;ve been a developer. And someone who&#x27;s now making his mark on the agent space.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="2" data-time="00:18" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=18s" target="_blank" rel="noopener noreferrer">00:18</a><span>Matt／Uncle Bob</span><small>#002</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">今天 Uncle Bob Martin 穿著浴袍上線，準備開戰。Uncle Bob，你好，歡迎。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">你好，謝謝邀請，很高興來到這裡。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">真的很高興你來。對不熟悉「浴袍梗」的觀眾，我們可能得先交代一下。這到底是怎麼回事？為什麼浴袍會變成你個人形象中很重要的一部分？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我想，那是大約兩年前開始的。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">We have uh Uncle Bob Martin live and in his bathrobe ready to throw down. Uncle Bob, hello. Welcome. &gt;&gt; Hello and thank you. Good to be here. It&#x27;s great. It&#x27;s great to have you. It&#x27;s great to have you. Um, for folks who don&#x27;t know the bathrobe thing specifically, we should probably caveat that. What&#x27;s What&#x27;s going on there? And why is the bathrobe become a important part of your character? &gt;&gt; I I it happened I think two years ago.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="3" data-time="00:47" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=47s" target="_blank" rel="noopener noreferrer">00:47</a><span>Uncle Bob</span><small>#003</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">那天清晨六點，我穿著浴袍站在自家前廊，突然想到 SQL 有多糟，因為它帶來各種 SQL Injection（SQL 注入）問題。從資安角度來看，用一種文字語言作為資料庫存取介面，根本不合理。我當時就拿出手機開始抱怨，後來那段影片便成了「晨間浴袍怒評」。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I was on my front porch in my bathrobe. It was 6:00 in the morning and and I started thinking about how awful SQL was because of all the SQL injections and what you know makes no sense to have a textual language as your database access um for security reasons. And I I was in my bathroom at the time and I just pulled out my phone and I ranted and that became the morning bathrobe rant.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="4" data-time="01:13" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=73s" target="_blank" rel="noopener noreferrer">01:13</a><span>Uncle Bob／Matt</span><small>#004</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">看來大家很喜歡，所以我後來又拍了幾次。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">所以你今天也是帶著那種情緒來的嗎？就是那個「天還早、我還沒喝咖啡，別來煩我」的 Uncle Bob？清晨六點就在想 SQL，老兄，六點耶，拜託。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">好了，這段到此為止。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Apparently it was popular so I did it a few more times. &gt;&gt; So is this the mood that you&#x27;ve come here today in? Is this is this the uncle &gt;&gt; Bob? It&#x27;s early in the morning. I haven&#x27;t had my coffee and just don&#x27;t bother me. &gt;&gt; 6:00 in the morning thinking about sequel, man. 6 in the morning. Come on. &gt;&gt; I&#x27;m done with this now.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="5" data-time="01:32" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=92s" target="_blank" rel="noopener noreferrer">01:32</a><span>Uncle Bob／Matt</span><small>#005</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">其實現在是早上十點。浴袍已經脫掉了，我也喝到今天第一罐健怡可樂，所以狀態很好。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">很好，現在 POLO 衫也亮相了。現場大多數觀眾是開發者，但也有些不是。那麼，Uncle Bob 的故事該怎麼介紹給非開發者聽？</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">It&#x27;s actually 10 in the morning. &gt;&gt; The bathroom off. I have me. I&#x27;m on my first Diet Coke, so I&#x27;m fine. &gt;&gt; Very good. Okay. Well, now the polo shirt is out. Um what&#x27;s what&#x27;s the Uncle Bob&#x27;s story like for there are probably some folks most of my folks are developers but some of my folks are not developers as well in this audience.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="6" data-time="01:54" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=114s" target="_blank" rel="noopener noreferrer">01:54</a><span>Matt／Uncle Bob</span><small>#006</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我們要怎麼向非開發者介紹「Uncle Bob 這個現象」？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">說我是什麼現象，我可不敢當。我就是一名程式設計師，而且已經做了非常久，現在超過半個世紀了。我的第一支程式寫於 1964 年，那時我十二歲。那是一台母親送我的小型電腦模型，是十二歲生日禮物；程式設計方式，是把一根根白色小管套在插銷上。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">How do we introduce Uncle Bob the phenomenon that is Uncle Bob to especially non-developers. &gt;&gt; Phenomenon. I don&#x27;t know about that. Um I&#x27;m a programmer. I I&#x27;ve been a programmer for a very long time. Uh over half a century at this point. uh started it. My first program was in 1964 and I was 12. The program was was uh a little model computer that my mother had bought me for my 12th birthday and programmed it by putting little white tubes on pegs.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="7" data-time="02:32" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=152s" target="_blank" rel="noopener noreferrer">02:32</a><span>Uncle Bob／Matt</span><small>#007</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">它本質上是一台三位元有限狀態機，但十二歲的我完全被它迷住了。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">好，你十二歲開始，那麼五十多年後，是怎麼一路走到今天這位 Uncle Bob 的？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">其實不只五十年。總之，我就是開始盡可能學習所有能找到的程式設計知識。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">It was essentially a three-bit finite state machine, but it fascinated the hell out of me at the age of 12. Okay. So, you&#x27;re 12 years old. How do we get to uh 50 years later, Uncle Bob doing his thing now? &gt;&gt; Yeah, a little more than 50. Um, let&#x27;s see. Well, I I you know, I just started learning as much as I could about programming.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="8" data-time="02:54" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=174s" target="_blank" rel="noopener noreferrer">02:54</a><span>Uncle Bob</span><small>#008</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">父親買了 Fortran、COBOL 和 PL/I 的書給我，我全部讀完。當時根本沒有機器可以執行，所以我在紙上寫程式，再用腦袋模擬執行。十六歲時，我短暫找到一份會寫一點程式的工作；十八歲時得到第一份正式工作，從此一路當程式設計師到現在。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">My father bought me a book about Forran, a book about Cobalt, book about PL1. I read them all. Had no machines to execute anything on, so I wrote programs on paper and executed them in my head. got a job uh um writing a little bit of code at the age of 16. Um but that was a temporary thing. Then I got a real job at the age of 18 and I&#x27;ve been a programmer ever since.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="9" data-time="03:18" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=198s" target="_blank" rel="noopener noreferrer">03:18</a><span>Matt／Uncle Bob</span><small>#009</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">所以你在第一線打滾了非常久，也寫過一本相當重要的書。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我寫過幾本，其中一本我覺得確實重要。其他也寫了幾本，不過有一本特別走紅，那很令人開心。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我記得是《程式碼的清潔度》？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對，《Clean Code》，沒錯。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; So you&#x27;ve been in the trenches for a long time and you wrote rather an important book I think. &gt;&gt; A few I one of them I think was important. I&#x27;ve written a few more but uh yeah one of them seemed to take off. That was a nice one. &gt;&gt; Yeah. and um uh the cleanliness of code if I remember correctly or &gt;&gt; yeah clean code. Yeah. Yeah. Yeah.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="10" data-time="03:39" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=219s" target="_blank" rel="noopener noreferrer">03:39</a><span>Uncle Bob／Matt</span><small>#010</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這是第二版。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">每當我和別人談軟體工程的好書，這可能是最常被提起的一本。它極受歡迎，影響力也非常大。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; Here&#x27;s the second edition. This is this is the second edition. But you know &gt;&gt; I mean it&#x27;s it&#x27;s maybe the most um certainly when I have conversations about good books. It&#x27;s it&#x27;s uh for software engineering. It&#x27;s the one that most often gets quoted back at me. Like it&#x27;s incredibly popular, incredibly influential.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="11" data-time="03:59" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=239s" target="_blank" rel="noopener noreferrer">03:59</a><span>Matt／Uncle Bob</span><small>#011</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這正是我今天想訪問你的原因。你在 AI 出現以前的時代影響深遠，而且幾乎親身經歷了整個前 AI 軟體年代。如今 AI 已經真正進場，你的工作方式有什麼改變？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這件事其實讓我有點措手不及。大約是去年十二月、聖誕節前後，我只是隨手試玩。我早就碰過 ChatGPT、一些 Grok，還有其他各種工具。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So, and that&#x27;s why I&#x27;m interested to talk to you today because you&#x27;ve had this big influence in like the preAI era and you&#x27;ve been working in the pre-AI era for almost as long as it&#x27;s existed virtually now. How have things changed for you, Uncle Bob, now that AI is out there and is a thing? Um, so this took me a little by surprise around December of of last year, Christmas time, and I&#x27;m just fiddling around and I I&#x27;d already been playing with, you know, chaty PT and a little bit of Grock and a little bit of this and a little bit of</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="12" data-time="04:39" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=279s" target="_blank" rel="noopener noreferrer">04:39</a><span>Uncle Bob</span><small>#012</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">起初我沒有留下太深刻的印象。後來有一段時間，我開始覺得，也許這些東西比原先想的更有意思。我弄到第一個 Agent，應該是早期的 Grok。我請它替我寫點程式，寫得不算好，但確實寫了出來；而我當時手上剛好正在進行一個專案。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">that. And I hadn&#x27;t been real impressed. Uh, and then I went through a period where I thought, well, maybe these things are a little more interesting than I thought. And I I got an agent. First agent I got I think was um Grock early Grock. It was an early Grock one and I just asked it to write me some code and it did a kind of a poor job but it wrote the code and I was in the middle of a project at the time.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="13" data-time="05:06" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=306s" target="_blank" rel="noopener noreferrer">05:06</a><span>Uncle Bob</span><small>#013</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">於是我想，也許它能幫忙。我讓它和我一起做專案，但我幾乎一直在替它收拾殘局。它總是把現場弄亂，四處留下像狗屎一樣的小爛攤子。我當時的感覺是，它很快，這點很有趣；但它也令人挫折，因為收拾它的東西反而拖慢了我。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So I said well maybe this thing can help me with this project and I started having it work with me on the project and I was cleaning up after it all the time just you know it was always making a mess. was always leaving little dog dude behind. And I thought, you know, it&#x27;s it&#x27;s interesting because it&#x27;s fast, but it&#x27;s frustrating because it makes me slow.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="14" data-time="05:31" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=331s" target="_blank" rel="noopener noreferrer">05:31</a><span>Matt／Uncle Bob</span><small>#014</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">沒錯。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">接著我想到，等一下，正因為它很快，所以它能做一些我做不到、或不值得由我親自做的事情。2000 年代初期曾有幾項技術讓我眼睛一亮。我覺得它們是好點子，卻完全不實用。其中一項叫作 CRAP。沒辦法，它就是個縮寫。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; Yep. &gt;&gt; And then I started thinking, well, wait a minute, because it&#x27;s fast, it can do things that I cannot. So in the uh very early 2000s there were a couple of innovations that that caught me. I thought oo these are good ideas but they were completely impractical. One of them was called um uh crap. Um it was uh it&#x27;s an acronym.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="15" data-time="05:58" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=358s" target="_blank" rel="noopener noreferrer">05:58</a><span>Uncle Bob</span><small>#015</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">CRAP 的做法，是把程式碼覆蓋率，也就是測試覆蓋率，和每個函式的循環複雜度放進一套複雜公式，最後算出一個分數。那個分數大致是在衡量你的函式到底有多「爛」。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">What can I say? But it&#x27;s it was a way to take uh code coverage. So you would you would run code coverage, test coverage over your code and you&#x27;d also measure the cyclatic complexity of every function and you would mix those two in a complicated formula and out would come a score and the score was a measure of how crappy your function was.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="16" data-time="06:25" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=385s" target="_blank" rel="noopener noreferrer">06:25</a><span>Uncle Bob</span><small>#016</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">2000 年代初，我認為這是很棒的點子，便拿手上一個大型專案來跑。結果的確找出一堆很爛的函式；但我得逐一修正它們、重寫測試，耗掉非常久。何況原本系統都能運作，我實在負擔不起這樣做。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And uh way back in the early 2000s, I thought this is a great idea. And I ran it over a big project I was working on. And yeah, there was a bunch of crappy functions, but then it took me forever to go through every one of those functions and try and fix them and rewrite the tests and but and it was all working. So I didn&#x27;t think I really could afford to do that.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="17" data-time="06:47" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=407s" target="_blank" rel="noopener noreferrer">06:47</a><span>Uncle Bob</span><small>#017</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">所以它雖然有趣，我還是先擱在一旁。另一項創新叫作 Mutation Testing（突變測試），這也非常吸引我。它會用一個小程式巡過原始碼，把負號改成正號、小於改成大於、等於改成不等於，還會做其他類似變更。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So although it was interesting, I kind of set it aside. And another one of those um innovations was called mutation testing. And this this one really caught my attention, too, because in mutation testing, you you have a little a little program that runs through your source code and flips negative signs to positive signs and less than signs to greater signs and equal signs to not equal signs and other things as well.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="18" data-time="07:11" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=431s" target="_blank" rel="noopener noreferrer">07:11</a><span>Uncle Bob</span><small>#018</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">每做一次這種變更，它就把整套測試全部跑一遍，並且預期測試必須失敗，因為程式顯然已被改動了重要語意。假如測試沒有失敗，那就是一個「存活的突變體」，你得把它殺掉。我大約在 2000 年，也拿同一個專案試過。測試套件每次要跑四分鐘，而它可能得跑上數百次，所以只能整夜執行。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And for each of those flips, it runs your entire test suite and expects the test suite to fail because obviously they&#x27;ve changed something significant. And if it doesn&#x27;t fail, well, that&#x27;s a surviving mutant and it must be killed. Now, I ran this again over that same project right around the year 2000. And I had to run it overnight because the test suite ran for four minutes and I was running it maybe several hundred times.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="19" data-time="07:40" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=460s" target="_blank" rel="noopener noreferrer">07:40</a><span>Uncle Bob</span><small>#019</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">結果它找出不少存活突變體，我也能補強測試把它們解決。但同樣地，這在當時並不實用，根本無法納入一般建置流程。到了去年十二月，或當時可能已經是一月，我突然想到：等一下，這些 Agent 很快，也不在乎工作有多無聊，而且會照我要求去做。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Uh, but it came up with a bunch of surviving mutants which I was able to fix. But once again, it was impractical. I could not put that as part of a a normal build scenario. And so I&#x27;m sitting there last December or maybe it was January by this time and I&#x27;m thinking,&quot;Well, wait a minute. These guys are fast and they don&#x27;t care how boring the work is and they will do what I tell them to do.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="20" data-time="08:04" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=484s" target="_blank" rel="noopener noreferrer">08:04</a><span>Uncle Bob</span><small>#020</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">那何不讓它把剛完成的所有內容都跑一次 CRAP 分析？它真的會跑，接著自己清理程式碼。我看著它工作，心想這還真不錯。再叫它跑突變測試，它也照做。以前得整夜跑完的事情，它也許三十分鐘就完成，然後再把所有漏洞補上，確保每個地方都有測試覆蓋。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So why don&#x27;t you run crap over everything you&#x27;ve just done and it would run crap and then it would it would clean up the code.&quot; And I was watching it do this. I think, well, that&#x27;s pretty cool. And why don&#x27;t you run mutation testing, too? and it would run the mutation testing. Maybe it took it 30 minutes instead of an overnight run and then it would plug all the holes and make sure there were tests covering everything.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="21" data-time="08:30" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=510s" target="_blank" rel="noopener noreferrer">08:30</a><span>Uncle Bob</span><small>#021</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我想，這或許就是清理那些「狗屎」的方法。Agent 會留下很多爛攤子和鬆散雜物，但這些工具也許能把它們掃乾淨。因此我沿著這條路繼續加入更多工具，也持續調整與 Agent 合作的方式，最後把它們帶到能交出相當不錯成果的程度。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I thought, you know, this might be a way to clean up the dog dew. These things leave a lot of deus and fluff behind, but maybe this is a good way to clean up all the dog. So I I continued on this path of adding more tools and continuing to work with these agents and I got them to a place where they were doing a pretty good job.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="22" data-time="08:50" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=530s" target="_blank" rel="noopener noreferrer">08:50</a><span>Uncle Bob</span><small>#022</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">所以我現在的原則是：先讓 Agent 開始工作，再要求它們執行這些工具；而我會努力把整個流程推到一個境界，也就是我根本不必閱讀程式碼，依然可以信任它們做的事。當然，我會用其他方式驗證程式碼品質仍然可靠。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So nowadays my nowadays my principle is, you know, I will set the agents working. I will have them run these tools and I&#x27;m going to work very hard to get it into a situation where I don&#x27;t have to look at the code at all. &gt;&gt; I can trust what they do. And now I do other things to verify that the code is still decent.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="23" data-time="09:13" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=553s" target="_blank" rel="noopener noreferrer">09:13</a><span>Uncle Bob</span><small>#023</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我會查看 CRAP 分數，確保它夠低；偶爾抽查程式碼，也會執行一大堆其他測試。但整體目標就是如此。既然它們真的很快，而我又能把它們限制在能做出好成果的範圍內，我就不打算把自己的緩慢強加在它們身上。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">You know, I will look at the crap scores and make sure that they&#x27;re low. And I will I will do spot checks on the code from time to time. And I have a whole bunch of other tests that I run. But overall, that&#x27;s my goal. If these things are fast, and they are, and if I can constrain them to do a good job, then I am not going to impose my slowness upon them.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="24" data-time="09:40" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=580s" target="_blank" rel="noopener noreferrer">09:40</a><span>Uncle Bob／Matt</span><small>#024</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對我而言，逐行或細部檢閱程式碼反而成了額外負擔。它們處理程式碼很快，我處理程式碼很慢。因此，我把程式碼交給它們，自己負責周邊的護欄，確認整體仍然正確。到目前為止，效果不錯。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">也就是說，你的目標是逐步離開程式碼本身，甚至淡出人工 Code Review，改為在程式碼外圍搭起一套鷹架，讓你不必直接碰它，同時用盡可能緊的拘束衣把 Agent 約束住，避免它犯錯。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And my bonus is reviewing the code or inspecting the code at some kind of level of detail. They are fast with code. I am slow with code. So I&#x27;m going to let them have the code and I&#x27;m going to deal with the stuff around that to make sure it&#x27;s all okay. So far so good. So your goal is to start pulling yourself away from the code, away from human review to construct this scaffolding around the code so that you don&#x27;t have to interact with it much yourself and so that the agent is constrained as much as possible in as tight a straight jacket as</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="25" data-time="10:17" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=617s" target="_blank" rel="noopener noreferrer">10:17</a><span>Matt</span><small>#025</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">不過這裡有個前提值得先談。首先，「dog doo」用英國口音念起來實在不太好聽。更重要的是，為什麼狗屎般的壞程式碼真的那麼糟？為什麼我們要在意？既然 Agent 這麼快、推進速度這麼高，為什麼還得費力打造這些控制裝置？難道不能一路往前衝，直到 Bug 自己消失嗎？</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">possible so that it can&#x27;t make a mistake. I think there&#x27;s so there&#x27;s an assumption there that I want to touch on first which is that the word dog do right doesn&#x27;t sound good in in a British accent dog do you know so so what why is why is dog do bad why is bad code bad like why why do we care about that because these things are so fast and they can move so quickly why do we care why are we bothering with all of this harness can&#x27;t we just push through until the bugs just disappear.</p>
</details>
</div>
</details>

<h3 id="品質護欄與上下文">品質護欄與上下文</h3>

<details class="article-transcript" data-index="26" data-time="10:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=652s" target="_blank" rel="noopener noreferrer">10:52</a><span>Uncle Bob</span><small>#026</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我很早就注意到一件事，大約是在十二月。當時我和那個小小的 Grok Agent 合作，叫它做一件事，它便在旁邊留下一堆髒亂。我沒有先清掉，而是直接叫它做下一件事，結果又留下更多髒亂；接著再做下一件，情況持續累積。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">One of the things I noticed really early on, like Decemberish time frame, was that I would be I&#x27;d be working with the the uh like this little Grock agent and I&#x27;d have it do something and it would leave all this mess around and instead of cleaning the mess, I would have it do the next thing and it would leave even more mess around and then I would have it do the next thing.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="27" data-time="11:13" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=673s" target="_blank" rel="noopener noreferrer">11:13</a><span>Uncle Bob</span><small>#027</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">然後我發現它開始變慢，也開始陷入困難。它會修改某個地方，卻不小心弄壞另一處；接著去修另一處，又無意間破壞第三處，最後原地打轉。我這才意識到：這些 Agent 或許很快，也可能相當聰明，但它們和人類一樣，也會受到髒亂程式碼的拖累。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And I noticed it slowing down and I noticed it having having uh difficulty. It would it would get into a mode where it would change one thing but inadvertently break another and then it would have to fix that but inadvertently break another. Started going around in circles and I thought okay these agents they may be they may be fast and they be maybe relatively smart but they are as subject as humans are to messy code.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="28" data-time="11:42" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=702s" target="_blank" rel="noopener noreferrer">11:42</a><span>Uncle Bob</span><small>#028</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">也許它們的耐受度和人類不同，但那條臨界線仍然存在。程式碼可以髒亂到連 Agent 都再也處理不了，接著它們只會不斷空轉，把情況弄得更糟，最後無能為力。我甚至真的遇過 Agent 直接放棄。有一次，某個 Agent 的意思大概就是：「我再也處理不了這東西了。」</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Now maybe not as subject. Maybe there&#x27;s a difference in threshold, but the threshold is still there. The code can get messy enough that the agents cannot deal with it any any longer and then they&#x27;ll just start to spin and make a mess even worse and and be unable. I&#x27;ve actually had them just give up. One agent one time said, &quot;I just can&#x27;t deal with this anymore.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="29" data-time="12:07" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=727s" target="_blank" rel="noopener noreferrer">12:07</a><span>Uncle Bob／Matt</span><small>#029</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這是我的意譯，它當然沒有真的講出這句話，但狀況明顯就是如此。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">所以你的回應是：「我要怎麼把這些爛東西清掉？」我認為，多數人碰到這種情況時，會開始把更多指令塞進 Agent。他們會想：「好，我要向負責實作的 Agent 灌入更多資訊。」於是一直往 `CLAUDE.md` 或 `AGENTS.md` 裡加內容。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&quot; Parap I&#x27;m paraphrasing it. didn&#x27;t use those words, but that was obviously what was going on. &gt;&gt; Yeah. So, your response to that then is, &quot;How can I clean up the crap?&quot; And I think when most people encounter that, they start loading the agent with instructions, right? They start saying, &quot;Okay, I&#x27;m going to pour in information into the agent that&#x27;s doing the implementation, right? I&#x27;m going to pile in on claw.md or agents.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="30" data-time="12:34" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=754s" target="_blank" rel="noopener noreferrer">12:34</a><span>Matt／Uncle Bob</span><small>#030</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">每次看到壞結果，就再加一條指令。你採取的卻不是這種方式，而是建立確定性的機制。換句話說，你用的是自動化檢查；很多人用的則是我所稱的「steering」，也就是靠提示去操控方向。你為什麼沒有一路採用 steering？你仍然會做嗎？你的思考方式是什麼？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">一開始我確實就是那麼做的。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">mmd and every time I see something bad I&#x27;m going to use an instruction instead of what you&#x27;re doing where it&#x27;s a deterministic mechanism. So you&#x27;re using automated checks whereas a lot of other people are using in my terminology steering right they&#x27;re trying to steer it. So why didn&#x27;t you are you doing any steering or like how does that work in your mindset? So, initially I started with that.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="31" data-time="12:58" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=778s" target="_blank" rel="noopener noreferrer">12:58</a><span>Uncle Bob</span><small>#031</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我早期的提示詞會寫：「測試驅動開發要這樣做」、「乾淨程式碼要這樣寫」、「你的程式碼應該長成這個樣子」、「必須遵守這些規則」。最後往往堆成五到十頁長的文件，鉅細靡遺描述好程式碼的一切美德。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I start, you know, I my early prompts were here&#x27;s how you do test-driven development. Here&#x27;s how you do clean code. Here&#x27;s what your code should look like. You should follow all these rules. And, you know, you come up with eventually a document that&#x27;s five or 10 pages long describing all the good things about code.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="32" data-time="13:16" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=796s" target="_blank" rel="noopener noreferrer">13:16</a><span>Uncle Bob／Matt</span><small>#032</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我想，我甚至可以把整本該死的書全餵給它。可是我發現，不論你稱它們 Agent、模型或別的名字，它們看待這些規則的方式，很像《神鬼奇航》裡那句話：那些比較像「參考準則」，有時候才會遵守。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我一定得稱讚你，因為我腦中浮現的也是完全相同的比喻。很高興我們想到一塊去了。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I I suppose I could have fed the whole dog on book into it. Mhm. &gt;&gt; But what I noticed was that the agents, the the models, whatever you want to call them, um they treat those rules in the uh Pirates of the Caribbean sense. They&#x27;re more like guidelines, you know, might follow. &gt;&gt; Can I just Can I just credit you? That&#x27;s exactly the metaphor that came into my head as well.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="33" data-time="13:41" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=821s" target="_blank" rel="noopener noreferrer">13:41</a><span>Uncle Bob</span><small>#033</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">它們確實會逐漸淡化那些規則，而背後也有技術原因。我做了一點研究，雖然不算很多，想知道模型為什麼會這樣。結果發現一個稱為「Lost in the Middle，中段遺失」的現象：當模型內的上下文視窗愈堆愈長，開頭和結尾的內容會比較突出，中間的內容則因技術因素較容易失去影響力。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So, I&#x27;m glad we&#x27;re aligned there. &gt;&gt; Yeah. Well, so they they definitely will soften and there&#x27;s technical reasons behind this. I did a not not a lot of research but some research into why the models behave this way and it turns out that there&#x27;s this phenomenon known as lost in the middle. So as the context window builds up inside the model the stuff at the very beginning and the stuff at the very end have more prominence than the stuff in the middle uh for technical reasons.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="34" data-time="14:16" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=856s" target="_blank" rel="noopener noreferrer">14:16</a><span>Uncle Bob</span><small>#034</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">所以 Agent 會忽略中段內容。假如開頭指令本身很長，原本放在前面的東西也會被後續內容推進中間。也許一開始的前三句仍保有高優先度，但第 50 句、第 80 句早已消失在上下文中段的某個角落。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">But once again, the the agent will ignore the stuff in the middle. And anything you say at the very beginning is going to get shoved into the middle if it&#x27;s long, right? So maybe the first three sentences you put at the beginning will remain as priority, but the 50th and the 80th sentence in there, they&#x27;re gone. They&#x27;re just in the middle somewhere.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="35" data-time="14:38" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=878s" target="_blank" rel="noopener noreferrer">14:38</a><span>Uncle Bob</span><small>#035</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">可憐的 Agent 得處理一個愈來愈龐大的上下文，努力從中撈出重要訊號，而中間那些內容往往就不見了。確定性工具不會以這種方式消失。因此，我認為使用 Agent 的關鍵，也是非常難做到的事，就是把初始提示詞壓縮到絕對最小，讓其中盡可能多的內容都留在高優先區。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And the poor agent is trying to deal with this massive context that&#x27;s ever growing, ever growing. and it&#x27;s trying to pull the important bits out and the stuff in the middle is just gone. So deterministic tools don&#x27;t disappear that way. The the key that I think with agents, and this is really hard to do, the key with agents is to trim that initial prompt down to its absolute minimum so that you can get as much of it as possible into its priority.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="36" data-time="15:12" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=912s" target="_blank" rel="noopener noreferrer">15:12</a><span>Matt</span><small>#036</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">對，然後把確定性工具放到事後執行。完全同意。我把上下文視窗稱作「聰明區」和「笨區」，這不是我發明的，是 Dex Hardy 的說法，我只是借來用，因為真的很好。尤其上下文較前面的部分，例如最初約十五萬個 Token，模型通常還相當聰明。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; Yeah. &gt;&gt; Right. and then do deterministic tools after the fact. &gt;&gt; Totally. I refer to this as like the smart zone and the dumb zone of the uh context window. It&#x27;s not my term. That&#x27;s Dex Hardy&#x27;s term. I stole it and it&#x27;s very very good. Which is especially at the early part of the context window, like the first 150k tokens, it&#x27;s pretty smart.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="37" data-time="15:33" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=933s" target="_blank" rel="noopener noreferrer">15:33</a><span>Matt</span><small>#037</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">但愈往後，Transformer 裡各項注意力關係就愈吃緊，訊號被稀釋。那就像每個人都在喊話，每一個 Token 都在愈來愈擁擠的房間裡大叫，最後你再也無法從雜訊中聽見真正的訊號。這和我的經驗完全吻合。所以你某種程度上放棄了 steering，重新回到過去那些自動檢查技術。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">But then as you go along, then the attention relationships in the transformer get really strained. It&#x27;s really diluted. It&#x27;s like everyone&#x27;s shouting. Each token is shouting in a crowded room and the room&#x27;s getting more crowded. Right? you can&#x27;t hear the signal for the noise. That that&#x27;s that totally rings true for me. So you&#x27;ve got then you sort of rejected steering and you sort of started going back to some old techniques in automated checks.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="38" data-time="15:58" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=958s" target="_blank" rel="noopener noreferrer">15:58</a><span>Matt／Uncle Bob</span><small>#038</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">而這些檢查不像 steering 指令那樣塞進上下文視窗，因此似乎可以一層又一層往上疊。假如再搭配強型別語言、測試等機制，整體會變成什麼模樣？自動化檢查是否也可能多到過頭？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這正是我現在非常努力想找出答案的問題。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Now it sounds like then because those checks don&#x27;t go into the context window in the same way that steering instructions do, you can kind of just layer those on, right? And layer them up and up and up. So if you&#x27;re using a language with strong types and like tests and like how does that picture look to you? Is there ever too much when it comes to automated checks? &gt;&gt; That&#x27;s one of the things that I&#x27;m working very hard to figure out.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="39" data-time="16:22" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=982s" target="_blank" rel="noopener noreferrer">16:22</a><span>Uncle Bob</span><small>#039</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">顯然一定存在「太多」的情況。你終究可能把 Agent 拖慢到比人類還慢，那時就已經輸掉這場遊戲，根本沒有做的必要。不過只要它相對人類仍保有生產力優勢，你就還是領先。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Obviously there has to be a case where there&#x27;s too much, right? You eventually you will slow the agents down to the point where they&#x27;re slower than humans. And at that point you&#x27;ve lost the game. &gt;&gt; Why do it? Um, but as long as you can keep the margin of productivity higher than a human, you&#x27;re still you&#x27;re still ahead of the game.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="40" data-time="16:43" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1003s" target="_blank" rel="noopener noreferrer">16:43</a><span>Uncle Bob</span><small>#040</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">依我目前觀察，這個優勢仍可維持在兩倍、三倍或四倍左右，它們依然很快。當然，我已經大幅拖慢它們。使用確定性工具時，你其實是把 Agent 放進一個迴圈。如今大家很愛談迴圈，而這就是一個典型例子。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Uh, and and from what I&#x27;ve seen so far, I you know, I can get that margin, you know, like a factor of two or three or four, right? They&#x27;ll they&#x27;ll still go pretty fast. Now, I&#x27;m I&#x27;m slowing them down a lot. When when uh when you use these deterministic tools, what you are really doing is you&#x27;re putting them into a loop. Lots of people like to talk about loops nowadays.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="41" data-time="17:03" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1023s" target="_blank" rel="noopener noreferrer">17:03</a><span>Uncle Bob</span><small>#041</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">你把它放進迴圈並告訴它：「你必須持續修改程式碼，直到這項工具判定合格。」於是 Agent 一圈又一圈地跑：「好，我得修這個、做那個；這裡得補更多測試；得降低循環複雜度。」</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">You&#x27;re putting them into a loop and you&#x27;re saying, &quot;Okay, you must you must change the code until this tool says that it&#x27;s okay.&quot; And now the agent is going around and around and around. Okay, I&#x27;ve got to do this. I&#x27;ve got to do that. I&#x27;ve got to I&#x27;ve got to add more tests over here. I&#x27;ve got to cut the cyclatic complexity.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="42" data-time="17:19" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1039s" target="_blank" rel="noopener noreferrer">17:19</a><span>Uncle Bob</span><small>#042</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">「我得把這些函式拆開，還有一大堆工作要做。」它會花上一段時間，直到所有內容符合規範。你等於犧牲一部分生產力，換取更高品質；某個地方必然會遇到報酬開始反轉的臨界點，只是我還沒找到。現在我正在嘗試讓多個 Agent 彼此對話與交接：一個負責某件事，下一個審查，再下一個測試，另一個加固，依此類推。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I&#x27;ve got to split these functions apart. Got to do all this work. And it takes it a while to do all that until it gets it into conformance. So you&#x27;re you&#x27;re you&#x27;re you are sacrificing productivity for higher quality and at some point that&#x27;s got to give way. But I haven&#x27;t found the end point of that yet. &gt;&gt; So now I&#x27;m in the midst of trying to get multiple agents talking to each other and handing off to each other so that one guy does one thing and the next one reviews it and the next one tests it and the next one hardens it and so on. And</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="43" data-time="17:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1072s" target="_blank" rel="noopener noreferrer">17:52</a><span>Uncle Bob／Matt</span><small>#043</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這會產生非常驚人的溝通成本，但整體仍大幅快過人類。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">那我們就來談 Multi-Agent 系統，因為我覺得它非常迷人。不過我一直對某類說法抱持懷疑，這也許是我們看法不同之處。有些人會說：「我已經把所有員工都裁掉，現在有一百個 Agent。」</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">there&#x27;s communication overhead like crazy in that. and yet it&#x27;s still faster by a large token than a human. &gt;&gt; Let&#x27;s talk about that. Let&#x27;s talk about multi- aent systems because that&#x27;s I find that super fascinating. I have always had a bit of a and I think this might be something something where we differ &gt;&gt; which is I&#x27;ve always had a bit of a suspicion of like people who say uh you know I&#x27;ve I&#x27;ve got rid of all my workforce. I now have a hundred agents.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="44" data-time="18:21" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1101s" target="_blank" rel="noopener noreferrer">18:21</a><span>Matt</span><small>#044</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">每個 Agent 都有不同角色，彼此交談，甚至各自擁有電子郵件帳號，諸如此類的胡扯。我通常不太相信這套。不過在「實作」與「審查」的組合上，我願意例外。它的好處未必是讓兩個 Agent 都高度專門化。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Every one of them has a different role. They all talk to each other. they&#x27;ve got their own email accounts, all that all that rubbish, you know. Um, and so for me, what&#x27;s always worked, but okay, I sort of make an exception when it comes to implementation and then review, right? And I think the benefit there is not having two very specialized agents.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="45" data-time="18:41" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1121s" target="_blank" rel="noopener noreferrer">18:41</a><span>Matt</span><small>#045</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">比較像是：第一個負責實作，採取紅、綠、重構的思路。實作者只要先寫出會失敗的測試，再把功能做通即可，不必讓程式碼漂亮。接著審查者進場，它不必重新探索整個問題，因為實作者留下的差異內容已經清清楚楚。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">It&#x27;s having okay, you do the implementation and it&#x27;s kind of like a red green refactor approach, which is the implement all it has to do is just like write the bad test and then make it work. It doesn&#x27;t have to make it beautiful. And then the reviewer comes in. It doesn&#x27;t have to do the exploration because it&#x27;s already got the diff from the implementer.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="46" data-time="19:00" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1140s" target="_blank" rel="noopener noreferrer">19:00</a><span>Matt</span><small>#046</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">它明確知道自己要審查什麼。由於任務範圍小得多，你也能在審查 Agent 的提示裡加入更多 steering 指令。因此我很想聽你的做法：實作者負責什麼、審查者負責什麼，還有所謂 hardener（加固者）又在做什麼？這部分我還沒實驗過，請多說一些。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">It knows exactly what it&#x27;s reviewing. And then you can pile in quite a lot more steering instructions in there because the task is much less constrained. So I&#x27;m really interested in your take on that on like what the implementer does, what the reviewer does, and what these other hardener agents. I&#x27;ve not experimented with that.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="47" data-time="19:17" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1157s" target="_blank" rel="noopener noreferrer">19:17</a><span>Uncle Bob</span><small>#047</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">採用這類 Multi-Agent 架構有兩項優點。第一，可以平行執行。例如你可以同時跑三個編碼 Agent，而我的小筆電其實能支援遠超過三個。第二，把 Agent 聚焦在單一任務，可以控制上下文視窗的規模。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Give me more on that. So there&#x27;s two advantages to having multiple agents like this. The one is that you can run them in parallel. So you could have, you know, three coders running at the same time. And my little laptop can support a lot more than three. Um the other advantage is that when you focus the agents down to a single task, you&#x27;re keeping the context window under control.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="48" data-time="19:42" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1182s" target="_blank" rel="noopener noreferrer">19:42</a><span>Uncle Bob</span><small>#048</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">如此一來，「中段遺失」問題就小得多。你可以在提示開頭多放幾條規則，雖然不能多太多，但它們往往會遵守得更好。你也可以設計成：Agent 被生出來，完成任務，然後死亡；下一個 Agent 以乾淨上下文接手。這些都是優點。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">The lost in the middle problem becomes much less of a problem. So you can pile a few more, not a lot more, but a few more rules up at the top and they&#x27;ll tend to follow them better. You can also set up a a system where the agents um are born, do the task, and die so that the next one comes in with a clean context. So those are the advantages.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="49" data-time="20:05" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1205s" target="_blank" rel="noopener noreferrer">20:05</a><span>Uncle Bob</span><small>#049</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">缺點則是啟動成本很高。Agent 光是開始運作可能就要十到十五秒，之後還得重新理解完整上下文，這些都形成啟動時間。我喜歡把任務切得盡可能聚焦。首先，我會啟動一個 Specifier，也就是規格整理 Agent。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">The disadvantages are that the startup times are high, right? So an agent takes, you know, 10 15 seconds to even start up. uh and then it&#x27;s got to figure out its whole context all over again. So there&#x27;s that that particular startup time as well. I like to focus the task as much as I can. So I will run a specifier.</p>
</details>
</div>
</details>

<h3 id="multi-agent-品質管線">Multi-Agent 品質管線</h3>

<details class="article-transcript" data-index="50" data-time="20:26" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1226s" target="_blank" rel="noopener noreferrer">20:26</a><span>Uncle Bob</span><small>#050</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">Specifier 的工作，是把人類寫的文件轉成 Gherkin 規格，以及一套 QA 程序。Gherkin 就是 Given／When／Then 那種格式，屬於高階驗收測試；QA 程序基本上則是一套系統測試，也就是依照文件，從 UI 操作整個系統。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">The job of the specifier is to take a a human written document and turn it into a uh a girkin and a QA a QA uh procedure. Girkin is you know given when then stuff. It&#x27;s a high level acceptance test. Uh and a QA procedure is a essentially a system test. You know you run the system through the UI with a with a QA procedure.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="51" data-time="20:56" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1256s" target="_blank" rel="noopener noreferrer">20:56</a><span>Uncle Bob</span><small>#051</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我要求它們完全從人類角度來寫：「你是一個人，正在透過 UI 操作這套系統，而且必須證明系統能正常工作。」最後會產出兩份文件，一份 Gherkin、一份 QA 文件。接著把兩者交給 Coder。Coder 的工作，是撰寫單元測試，以及實作該使用者故事所需的程式碼，同時讓 Gherkin 驗收測試通過。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And I have them write it from a human&#x27;s point of view. You are a human. You are operating this system at the UI. You must prove that the system works. And I will produce those two documents. Girkin documents QA documents. And then those feed into a coder. The coder&#x27;s job is to write unit tests and the code that implements the described uh story and uh also get the girkin working.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="52" data-time="21:24" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1284s" target="_blank" rel="noopener noreferrer">21:24</a><span>Uncle Bob</span><small>#052</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">Coder 會花一些時間把功能做通，完成後再交給 Cleaner。Cleaner 的工作是執行 CRAP 分析，加上一般程式碼審查，清掉實作者留下的所有髒亂，因為走到這一步時，實作者通常早已把現場弄得慘不忍睹。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So it has to do that and then that gets fed over. Once that&#x27;s working, the coder will work on that for a little while that gets fed into a cleaner and the cleaner&#x27;s job is to run crap analysis and just general code review. clean it clean up whatever mess the implement made because the implement will have made a horrible mess by that point.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="53" data-time="21:45" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1305s" target="_blank" rel="noopener noreferrer">21:45</a><span>Uncle Bob</span><small>#053</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">接著交給 Hardener。Hardener 會執行突變測試，而且毫不留情。它會不斷突變程式碼，要求達到百分之百覆蓋率，等號、小於號等各種條件都要被驗證，這會花上很長時間。完成後再交給 QA Agent。QA Agent 會把原本的 QA 文件轉成可執行腳本，實際操控系統，最後產出確定性的通過或失敗結果。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And then I have it go from there to a hardener. The hardener is the guy who runs the mutation testing and he&#x27;s absolutely merciless, right? It&#x27;s going to mutate it and it&#x27;s going to have 100% coverage and every equal sign and every less it&#x27;s going to do that work which takes a good long time. uh and it pops out the end and then it goes into a QA agent and the QA agent takes the the written QA document, turns it into an executable script that manipulates the system and comes up with a deterministic result.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="54" data-time="22:23" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1343s" target="_blank" rel="noopener noreferrer">22:23</a><span>Uncle Bob</span><small>#054</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">假如程式能一路通過這些關卡，你得到的就會是一套相當能運作的程式。我用這套方式已經取得很多成功。某項任務若交給單一 Agent，五分鐘就能做完，但結果相當可疑；用這條流程則大約要一小時。不過仍然划算，因為人類可能得花半天。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And and if you can get through all of that, you&#x27;ve got a pretty pretty working program. I&#x27; I&#x27;ve had a lot of success with this. it uh if I if I give it a task that takes a single agent five minutes to complete with questionable results. Uh this will take it about an hour. It&#x27;ll take about an hour to go through all that which is still a benefit because you know a person would take about a half a day.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="55" data-time="22:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1372s" target="_blank" rel="noopener noreferrer">22:52</a><span>Uncle Bob／Matt</span><small>#055</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">所以我的生產力也許提升了四到五倍，而且品質非常高，甚至高到超過一般人類願意投入的程度。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">而且你不只是省下當下的生產力。你其實是先把生產力投資在前段，換取未來的回報；這是在投資自己的程式碼庫。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">沒錯。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So maybe I&#x27;ve got a you know a factor of four factor of five improvement in productivity and very high quality much more quality than the human would ever put into it. And it&#x27;s not only that, but you&#x27;re you&#x27;re saving productivity or or you&#x27;re spending productivity early to gain it later, right? This is an investment in your own codebase. Yeah.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="56" data-time="23:11" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1391s" target="_blank" rel="noopener noreferrer">23:11</a><span>Matt</span><small>#056</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我覺得很有意思的是，你操控的不只是上下文視窗本身，還包括整個工作階段的「上下文軌跡」。假如你先讓 Agent 做某件事，並把它引導到某個方向，那麼同一場 Session、同一個上下文視窗裡後續的所有行為，往往都會繼續沿著那條軌跡前進。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">What I found really interesting about that is this is something I&#x27;ve been thinking about recently is it&#x27;s not only the context window that you&#x27;re manipulating. You&#x27;re also there&#x27;s this idea of a trajectory of a context window, right? Of a session where if you get the agent to do one thing and you steer it in a certain way, then everything that follows in that same session, that same context window, will continue following that trajectory.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="57" data-time="23:35" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1415s" target="_blank" rel="noopener noreferrer">23:35</a><span>Matt</span><small>#057</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">例如你讓它說：「好，也許這裡應該測試 UI。」此後不論你要求它做多少次修改，它每次都可能再次測 UI。唯一能清除這條軌跡的方法，就是清空上下文視窗。因此，一個只求先把功能做通的實作 Agent，其軌跡就不會像那個堅持百分之百覆蓋率的 Agent 那麼嚴苛。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So if you get it to say, &quot;Okay, maybe we should test the UI here,&quot; then every single time it will test the UI again, no matter how many changes you get it to make. And the only way to clear the trajectory is to clear the context window, right? So if you&#x27;re an implement agent and you&#x27;re just trying to get it working, then your trajectory is kind of it&#x27;s not quite as harsh as the one who&#x27;s trying to make sure you have 100% coverage.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="58" data-time="24:00" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1440s" target="_blank" rel="noopener noreferrer">24:00</a><span>Matt／Uncle Bob</span><small>#058</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我覺得這點很有趣。它和你的心智模型吻合嗎？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">完全吻合。這些模型有一個相當知名的效應，而且非程式設計情境也會發生。比如你正和模型聊哪種咖啡最好喝、怎麼沖才好，整段對話都很愉快。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And I found that really interesting. Is that something you does that click with your mental model as well? &gt;&gt; Yeah, it certainly does. There&#x27;s a a pretty well-known effect with these models and it happens with people who aren&#x27;t programmers, right? So, you&#x27;re talking to a model about um oh, I don&#x27;t know what what&#x27;s the best coffee to have and how do you how do you brew it nicely? And you&#x27;re having this nice little conversation with the agent about this or with the model about this.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="59" data-time="24:26" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1466s" target="_blank" rel="noopener noreferrer">24:26</a><span>Uncle Bob</span><small>#059</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">忽然有人從旁邊走過，正在談他最近看的電視連續劇，這些內容意外進入上下文視窗。不是你加進去的，是路人帶進來的；但從那一刻起，所有咖啡話題都開始和那齣連續劇扯上關係。模型不知道兩者不同，也無法正確區分。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And then somebody walks by and they happen to be talking about the latest soap opera that they saw saw on television and that gets into the context window. You didn&#x27;t put it there. This guy walking by put it in there. But then from that point on all the coffee references have to do with the soap opera, right? The the the model doesn&#x27;t know. It can&#x27;t differentiate.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="60" data-time="24:47" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1487s" target="_blank" rel="noopener noreferrer">24:47</a><span>Uncle Bob／Matt</span><small>#060</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">所以你所說的「軌跡」很精準。只要模型的方向沒有混亂，它知道自己正在往哪裡走，而且上下文內的內容彼此一致，就不太會出現大家常遇到的離譜幻覺。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">甚至不一定是幻覺，也可能只是偏離目標。幻覺永遠是風險，不論來自模型本身，還是你餵給它的上下文；大家某種程度已接受這項風險。而你這種讓不同 Agent 接連通過殘酷關卡的做法，正好能把許多問題消掉。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So your idea of trajectory is pretty good, right? As long as you can keep the direction of the model unconfused. It knows the direction it&#x27;s going in. Everything in the context window is consistent. then it&#x27;s not going to have these crazy hallucinations that that people often deal with &gt;&gt; or even just mis even just misalignment right like halluc I think hallucination is always a danger right like whether it&#x27;s you know hallucination context you gave it whatever like it&#x27;s an sort of an accepted danger and your approach of</p>
</details>
</div>
</details>

<h3 id="架構模組與測試">架構、模組與測試</h3>

<details class="article-transcript" data-index="61" data-time="25:19" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1519s" target="_blank" rel="noopener noreferrer">25:19</a><span>Matt</span><small>#061</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">好，你已經談了很多實作階段，之後還能再回來。另一件我想問的是，你前期會做多少規劃？特別是，你如何思考程式碼庫的內部結構？擁有一套好測試當然重要，但我很想知道你對整體設計的看法。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">this kind of gauntlet of different agents slamming horrendous stuff is sort of a is a great way of taking out that so okay you&#x27;ve talked a lot about the implementation phase and we can get back to that later too. What I&#x27;m also interested in is what planning do you do up front and especially how are you thinking about the internal structure of your code bases? Because having a good test suite, right? I mean, I&#x27;m interested in what you think here.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="62" data-time="25:50" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1550s" target="_blank" rel="noopener noreferrer">25:50</a><span>Matt／Uncle Bob</span><small>#062</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">完善的測試套件、突變測試等都很好；但假如 API 設計很差，模組形狀也很糟，它們會如何與這些自動檢查交互作用？你投入多少心力在架構上？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">直到大約一個月前，這部分我都還是手動處理。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Having a good test suite is good, right? Having mutation testing, all that stuff is good. But if you&#x27;ve got badly designed APIs, if you&#x27;ve got badly shaped modules, how does that interact with all of this automated checks and stuff like how much are you thinking about that? &gt;&gt; So up to the last month or so, what I was doing there was doing that part manually.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="63" data-time="26:16" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1576s" target="_blank" rel="noopener noreferrer">26:16</a><span>Uncle Bob</span><small>#063</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我會先讓 Agent 建出一套看起來不錯的東西，接著對它們展開盤問。這仍然是手動過程，只是我會利用 Agent 來回答：「目前結構是什麼？這個模組和那個模組如何互動？系統到底有哪些模組？它們怎麼溝通？」問完之後，我通常會嚇得半死，因為答案恐怖得不得了。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So I would I would have the agents build me up a nice thing and then I would interrogate the agents. And this was manual but but still using the agents, right? I&#x27;d interrogate the agents. What&#x27;s the structure here? How how does this module interrelate with that module? What are the modules after all? And how do they talk to each other? I would ask those questions and then I would get scared to death because the answers were horribly frightening.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="64" data-time="26:42" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1602s" target="_blank" rel="noopener noreferrer">26:42</a><span>Uncle Bob</span><small>#064</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">然後我會親自設計模組結構，再告訴 Agent：「模組真正應該這樣切分，彼此應該這樣溝通。」我會提供一份實作計畫，再讓它們照著做。這部分很棘手。因此，我也讓 Agent 替我做了一個架構檢視器。它能在畫面上顯示一張漂亮的 UML 圖，呈現系統模組結構與依賴方向。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And then I would design a module structure and I would tell the agent, okay, here&#x27;s how the modules should really be partitioned and here&#x27;s how you should communicate with them. And I would give them an implementation plan that they would then implement. Now, that&#x27;s a that&#x27;s a tough one. So I also had my agents build me an architecture viewer so I can pop up on the screen a nice little UML diagram essentially nice little UML diagram that shows me the modular structure of the system and where the dependencies run</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="65" data-time="27:13" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1633s" target="_blank" rel="noopener noreferrer">27:13</a><span>Uncle Bob</span><small>#065</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我可以點進某個模組查看其中的子模組，再點進子模組，甚至直接把程式碼叫到畫面上。換言之，我能任意往下鑽，在任何層級檢視系統架構。這工具對我非常實用，我也經常使用。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">and I can click on a module and I can see inside it to the subm modules and I can click on the subm modules and it&#x27;ll actually pop the code up on on the screen for me. So I can I can drill down as much as I want and view the system architecture at any level. That was really useful to me and I I&#x27;ve made good use of that.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="66" data-time="27:34" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1654s" target="_blank" rel="noopener noreferrer">27:34</a><span>Uncle Bob</span><small>#066</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我另外建立了一項確定性工具，可以明確定義哪些模組能依賴哪些模組、哪些不能互相依賴，以及依賴關係應該往哪個方向流動。這些規則會寫進一個小而嚴密的規格檔，Agent 不得違反。最後還有一個檢查器；若發現違規，Agent 就必須想辦法修正。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I&#x27;ve also put together a another deterministic tool where I can define which module should depend on which, which one should not depend on which, how the dependency should flow. That goes into a nice tight little specification file that the agents cannot violate. There&#x27;s another little checker that runs at the end and if they violate it, they&#x27;ve got to fix it somehow.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="67" data-time="27:57" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1677s" target="_blank" rel="noopener noreferrer">27:57</a><span>Uncle Bob／Matt</span><small>#067</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">通常它會反轉依賴、插入介面、把模組拆成兩半，或採取其他方式，確保我的架構規則不被破壞。我現在正嘗試把「產生架構規則」本身也自動化，但目前不太順利。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我和你幾乎坐在同一艘船上。良好設計的模組能帶來巨大槓桿。你能解釋這份槓桿來自哪裡嗎？為什麼模組結構這麼重要？</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Usually by inverting a dependency or inserting an interface or splitting a module in half or something like that and it will it will um keep my rules um from being violated. I&#x27;m working now to see if I can automate that and I&#x27;m having not a lot of luck so far. I&#x27;m basically in exactly the same boat as you, which is you just get so much leverage by having well-designed modules, right? Could you explain what that leverage is? Why is why is having a good structure for these modules important? &gt;&gt; Well, it&#x27;s the same argument that we had</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="68" data-time="28:36" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1716s" target="_blank" rel="noopener noreferrer">28:36</a><span>Uncle Bob</span><small>#068</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">道理和髒程式碼對乾淨程式碼完全相同。任何切分良好、介面紀律清楚的系統，人類都比較容易掌握，因為我們的腦袋擅長把事物分艙處理。模型和 Agent 也是如此，也許它們的臨界值和人類稍有不同，這我還不知道。但只要它們能聚焦在單一模組，而且該模組保有一致的「軌跡」，不會因內部混雜太多主題而困惑，工作表現就會好得多。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">for the dirty code versus clean code. Anything that is well partitioned with welld disciplined interfaces between it is something a human can grasp because we compartmentalize in our minds well so do the models so do the agents maybe at a slightly different threshold I don&#x27;t know about that yet but they work far better if they can focus on a module and if that module has a trajectory right using your term so that the the model does not get confused by the topics inside that module.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="69" data-time="29:12" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1752s" target="_blank" rel="noopener noreferrer">29:12</a><span>Uncle Bob／Matt</span><small>#069</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我一直同時說 model 和 module，希望大家沒有搞混。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我們懂，我們懂。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">但這真的很重要。還是那個咖啡與連續劇的例子。假如你在一個模組裡塞進天底下所有東西，可憐的 Agent 就會想：「我到底在這裡做什麼？這裡還能怎麼工作？」若能妥善分艙，它就會像人類一樣運作得相當好。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Okay, I&#x27;m using the word model and module. I want clear. &gt;&gt; We get it. We get it. &gt;&gt; But that that&#x27;s important. And it&#x27;s the same argument. It&#x27;s the coffee and soap op opera argument. If you load up a module with every bit of stuff under the of under the sun, the the poor agent is going to wonder, &quot;What the heck am I doing in here? How do I do anything in here?&quot; if you compartmentalize nicely works pretty well just like a human.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="70" data-time="29:41" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1781s" target="_blank" rel="noopener noreferrer">29:41</a><span>Matt</span><small>#070</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這樣一來，你可能也能從測試套件獲得更高價值。這讓我想到另一個相關問題。我必須說，我非常喜歡你的作品，但我也是 John Ousterhout 作品的忠實讀者。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; So you&#x27;re getting and you&#x27;re probably getting better value out of your test suite as well because that&#x27;s what I always think is like okay I suppose here&#x27;s here&#x27;s another question for you that&#x27;s related to this I think of and I have to say I&#x27;m a huge fan of um huge fan of your work but I&#x27;m also a huge fan of John Aster&#x27;s work.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="71" data-time="29:57" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1797s" target="_blank" rel="noopener noreferrer">29:57</a><span>Matt</span><small>#071</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">誰不是呢？他是很棒的人，你附近大概也放著他的書。他提出的「深模組」概念令我著迷。壞模組往往是淺模組，介面很寬，內部卻沒有隱藏多少東西；深模組則擁有很小的介面，背後隱藏大量資訊。我覺得這對模型特別有利，因為模型只要讀懂介面，不必先理解完整實作。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Yeah &gt;&gt; where um I mean who isn&#x27;t a great guy you you probably got his book around somewhere. Um and his concept of deep modules is something I find really fascinating which is you have an you can have bad modules which is kind of shallow modules right that have a wide interface and not much hidden inside them and you can also have deep modules which have a small interface and then a deep um lots of hidden information inside them and it occurs to me that that is really good with models because they can read the interface without</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="72" data-time="30:27" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1827s" target="_blank" rel="noopener noreferrer">30:27</a><span>Matt／Uncle Bob</span><small>#072</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這和你的想法相呼應嗎？你的做法也是如此嗎？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">完全是。模型會注意介面名稱，也會注意整體結構。這能讓它們不必閱讀下層程式碼，既是優點，也可能成為風險。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">having to understand the implementation. Does that sort of chime with you? And it&#x27;s not how you&#x27;re approaching things as well. &gt;&gt; Yeah, &gt;&gt; absolutely. Does &gt;&gt; the models pay attention to interface names? They they pay attention to the structure. It can allow them to not read the code beneath them, which is both a danger and and an advantage.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="73" data-time="30:45" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1845s" target="_blank" rel="noopener noreferrer">30:45</a><span>Uncle Bob</span><small>#073</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">只要程式碼保持一致，就沒有問題。它們也會注意測試，會透過閱讀測試理解系統行為。因此，任何能改善程式碼結構的事情，都能幫助模型理解程式碼。順帶一提，這本書的附錄裡，有一段我和 John Ousterhout 的長篇辯論，非常有趣。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; Y &gt;&gt; as long as the code is consistent, you&#x27;re okay. Um they also pay attention to the tests. They read tests to understand what the system does. Um so yeah all anything you can do that helps the structure of the code will help the models understand that code. By the way in this book there is a long debate between me and John Ora in the appendix and it it was a lot of fun.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="74" data-time="31:11" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1871s" target="_blank" rel="noopener noreferrer">31:11</a><span>Uncle Bob／Matt</span><small>#074</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我們兩個聊得很開心。好吧，我不知道他有多開心，但我自己非常開心。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我把整段都看完了。我看過你們在 YouTube 上的一場精彩對談，真的非常喜歡。事實上，那也正是我今天想邀你來的原因之一。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">He and I had a blast. Well I don&#x27;t know how much fun he had but I had a lot of fun. &gt;&gt; I watched I watched the entire thing. I saw you guys interviewed um on a really great uh uh YouTube discussion where you talked about it and I I I I just loved it and I that&#x27;s kind of the reason I wanted you to come on actually because I I just enjoyed that so much.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="75" data-time="31:30" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1890s" target="_blank" rel="noopener noreferrer">31:30</a><span>Matt</span><small>#075</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">接下來有好幾條路可以問。那麼，你現在回頭看自己的書，有沒有什麼內容會想修改或更新？我特別想到「建立小函式、保持函式短小」這類建議。我們剛才一直在談很多事情其實沒有改變：這種品質關卡始終是好方法，只是過去從來沒有足夠人力把每一關都跑完。這些想法長期以來都成立，如今只是換了一種執行方式。可是，有沒有什麼舊觀念是現在真的應該丟掉的？</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Um okay, there&#x27;s a few different ways I could go now. Um okay. Is there in your book anything that you would change or update now? because specifically I&#x27;m thinking about some advice like um create small functions let&#x27;s say and keep functions small um is there is there anything that you&#x27;re sort of because we&#x27;ve been talking a lot about how things have not changed right how gauntlets like this have always been good we&#x27;ve just never had the labor available to actually push through them right these ideas have been good for a long time we&#x27;re just sort of</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="76" data-time="32:09" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1929s" target="_blank" rel="noopener noreferrer">32:09</a><span>Matt／Uncle Bob</span><small>#076</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這是個很寬廣的問題，我也不太喜歡這樣問，因為會給你很大壓力。不過你有答案嗎？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">首先，是各種「門檻值」需要改變。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">modifying them in a different way but is there anything that we just need to and this is I suppose a wide question. Is there anything that we need to throw out that&#x27;s just like done or is there anything that&#x27;s I don&#x27;t like asking this question because it puts a lot of pressure on you, but do you have an answer for that one? &gt;&gt; So, um thresholds for one thing.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="77" data-time="32:28" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1948s" target="_blank" rel="noopener noreferrer">32:28</a><span>Uncle Bob</span><small>#077</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我認為 Agent 能承受的複雜度和人類不同。它們擁有好得多的短期記憶，不只是巨大，而且短期內幾乎可以精準保留。因此，我做的一件事就是放寬函式允許的大小，而調整方式是改變 CRAP 分數門檻。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Uh it seems to me that the the agents can deal with different levels of complexity than humans. They have a a much better short-term memory. I mean, a huge short-term memory and a perfectly accurate short-term memory. So one of the things that I do is I widen the um the allowed size of a function and I do that by adjusting the crap score.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="78" data-time="32:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=1972s" target="_blank" rel="noopener noreferrer">32:52</a><span>Uncle Bob／Matt</span><small>#078</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對人類來說，我會要求 CRAP 分數低於 4；對 Agent，我目前設成 6，甚至考慮提高到 8。我正在找那條臨界線，但它很難測出來。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">從 4 到 8，甚至 4 到 12，具體上代表什麼差別？是二十行函式對一百行函式嗎？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">核心其實是循環複雜度，也就是函式內可能通過的路徑數。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">So for a human I would keep crap numbers below four, right? But for the agents I&#x27;ve set this at six and I&#x27;m thinking and maybe I&#x27;ll push it to eight. Um I&#x27;m trying to find where the threshold is and it&#x27;s not an easy threshold to find. But &gt;&gt; what what does that look like in terms of four to eight? Like what&#x27;s the or 4 to 12? What&#x27;s the difference there? like is it like a 20 line 100line function? &gt;&gt; Um so it really boils down to the cyclatic complexity which is the number of pathways through the function.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="79" data-time="33:20" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2000s" target="_blank" rel="noopener noreferrer">33:20</a><span>Uncle Bob</span><small>#079</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">假如測試覆蓋率是百分之百，那麼 CRAP 分數 6，大致表示函式裡有六條執行路徑，而且全部都被測試覆蓋。這正是 CRAP 的目標：先讓所有內容都有測試，再限制循環複雜度。我和 Agent 辯論過很多次。順帶提醒，任何你和 Agent 進行的辯論都不能完全相信，不過我還是照辯不誤。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And uh if you&#x27;ve got 100% coverage then a crap score of six means that there are six pathways through the through the function. They&#x27;re all covered with tests. So that&#x27;s really the goal of crap, right? Get it all covered with tests and then limit the cyclomatic complexity. Um, and you know, I&#x27;ve had a number of debates with the agents, and by the way, you can&#x27;t trust any debate you have with an agent, but I still have them anyway.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="80" data-time="33:44" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2024s" target="_blank" rel="noopener noreferrer">33:44</a><span>Uncle Bob</span><small>#080</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">它們似乎認為：「對，6 大概很合理。」你當然不能真的信它們，但好吧。我確實認為 Agent 與人類的門檻不同。還有另一個因素：我的書中談過許多紀律，其中之一是測試驅動開發。我是 TDD 的堅定支持者。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Uh, and they they seem to think that, oh yeah, you know, six is probably pretty good. Well, you know, I don&#x27;t you don&#x27;t really trust them, but okay. Um, but I, you know, I think there&#x27;s a threshold difference there. There&#x27;s another another factor. In my books, I talk about disciplines. One of them was was test-driven development. I&#x27;m a big advocate of test-driven development.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="81" data-time="34:07" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2047s" target="_blank" rel="noopener noreferrer">34:07</a><span>Uncle Bob</span><small>#081</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">但 TDD 是一種人類紀律，是因應人類大腦的運作方式而形成。我不能，也不會強迫 Agent 照搬。我不認為要求 Agent 先寫一行測試、再寫一行正式程式碼、接著再補下一行測試，有任何意義。對人類來說，這樣做有道理。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">But that&#x27;s a human discipline that&#x27;s done because humans are wired a certain way. I cannot and will not enforce that on the agents. I don&#x27;t think it makes any sense to make an agent write a single line of a test and then write a single line of the production code and then the next line of the test. I don&#x27;t think that makes any sense. For a human, it does.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="82" data-time="34:31" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2071s" target="_blank" rel="noopener noreferrer">34:31</a><span>Uncle Bob</span><small>#082</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">至少對我而言，它為工作帶來很大好處；但對 Agent，我不這麼認為。因此，我允許 Agent 採取比較接近 John Ousterhout 的方式：先寫一個函式，再替該函式補測試；接著寫下一個函式，再替下一個函式寫測試。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">At least for me. I mean there&#x27;s a a huge benefit for my work but for the agents I don&#x27;t think so. So I allow the agents to behave more like John Asterhow would which is to write a function and then write the test for that function and then write the next function and write the test for that function.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="83" data-time="34:49" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2089s" target="_blank" rel="noopener noreferrer">34:49</a><span>Uncle Bob</span><small>#083</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">即使我明確要求它們以高度嚴謹的方式進行 TDD，它們最後仍總會退回這種做法，幾乎每次都一樣。所以我想，也許這是可以接受的。結論是：把「人類的紀律」強加在 Agent 身上，可能是錯的；把「人類重視的價值」施加在 Agent 身上則沒有錯，只是某些門檻需要調整。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I allow them to do that even when I have told them to do test-driven development at high discipline. They always fall back on doing that. They always end up doing that. So I figure that&#x27;s probably okay. So the bottom line there is it&#x27;s probably a mistake to impose a human discipline on an agent. It is not a mistake to impose human values on the agent, but there may be thresholds that we need to change.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="84" data-time="35:18" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2118s" target="_blank" rel="noopener noreferrer">35:18</a><span>Uncle Bob／Matt</span><small>#084</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">至於那些紀律本身，也就是具體行為流程，我不認為強迫 Agent 照做是明智的。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這個說法非常漂亮，我很喜歡。所以關鍵是短期記憶。TDD 對短期記憶很有限的人類特別有幫助：你只需要記住足以寫出測試的內容，再保留剛好足夠的資訊讓測試通過，然後甚至可以離開去喝杯咖啡。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">But the disciplines themselves, the behaviors, I don&#x27;t think it&#x27;s wise to impose those. &gt;&gt; That&#x27;s a lovely way of phrasing it. I really like that. So it&#x27;s it&#x27;s a short-term memory thing, right? Because TDD is great when you have very low short-term memory, like humans, right? You have enough short-term memory to write the test and then enough short-term memory, just enough to make the test pass, right? You can go out and get a coffee or something.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="85" data-time="35:42" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2142s" target="_blank" rel="noopener noreferrer">35:42</a><span>Matt／Uncle Bob</span><small>#085</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">很好，謝謝。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">不客氣。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我們已經談了很多如何建造系統、實作功能，以及模組架構等。那麼，在把工作交給 Specifier、正式進入那條品質試煉迴圈之前，你會做什麼？會規劃到多深？畢竟把錯誤的工作送進這麼昂貴的關卡，浪費會非常大。你怎麼看？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">人的誘惑總是想先規格化：規格、規格、再規格，最後才交給 Agent。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; So, okay, that was great. Thank you. You&#x27;re welcome. &gt;&gt; In the Okay, we&#x27;ve talked a lot about building the thing, right? Right. and building the implementation, right, and doing module architecture and that sort of thing. What do you do before you kick things off to your specifier? How much planning are you doing before you actually go into this gauntlet loop? Because like putting the wrong work in a gauntlet is super wasteful, right? How do you think about that? Well, so the temptation is to specify, you know, get the human to specify,</p>
</details>
</div>
</details>

<h3 id="敏捷規格與迭代">敏捷、規格與迭代</h3>

<details class="article-transcript" data-index="86" data-time="36:23" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2183s" target="_blank" rel="noopener noreferrer">36:23</a><span>Uncle Bob</span><small>#086</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這是非常古老的誘惑。1970 年代我們就掉進去過，最後導向瀑布式流程等做法。敏捷革命正是對它的回應，或至少是一種反擊。至於我們現在把敏捷做得有多好，我也不確定；但敏捷至少是在提醒我們：「等一下。」</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">specify, specify, specify and then give it to the agent. This is a very old temptation. It was a temptation we underwent in the 70s. It led us to the waterfall uh process and all of that. And and the agile revolution was the answer to that or the answer back to that. I don&#x27;t know how how well we&#x27;re doing with the agile revolution either, but but it was the it was a way to say, &quot;Wait a minute.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="87" data-time="36:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2212s" target="_blank" rel="noopener noreferrer">36:52</a><span>Uncle Bob</span><small>#087</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">「大量前期規劃會把事情弄得一團亂，因為最後做出來的東西從來不像原始計畫。」面對 Agent 時，人們又會受到同樣誘惑：「好，我們先不停規劃，然後再交給 Agent。」我試過，而且就在這個星期仍在試，結果總是災難。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">All this heavy upfront planning makes a mess of everything cuz what comes out at the end doesn&#x27;t look anything like the plan and never has.&quot; Well, the temptation with agents is to do the same thing, right? Okay, we&#x27;re going to plan plan. Then we&#x27;ll give it to the agent. And I have tried this. In fact, I&#x27;ve been in the middle of trying this just this week and it&#x27;s it&#x27;s always a disaster.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="88" data-time="37:17" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2237s" target="_blank" rel="noopener noreferrer">37:17</a><span>Uncle Bob</span><small>#088</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">每次結果都相同。你做出龐大計畫，等 Agent 真正開始執行後，人類才發現它們根本不可能照計畫走，因為你沒有想到所有事情，而 Agent 又沒有你那麼有判斷力。於是它們半懂不懂地衝向荒謬方向，你只能叫停、倒退、重寫計畫，再重新啟動。現在我已經放棄那條路。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">It and it&#x27;s always the same outcome, right? The you make all these plans and then as the agents are running, you the human realize that they can&#x27;t follow that plan because you didn&#x27;t think of everything and they&#x27;re not as wise as you are. So they&#x27;re running halfcocked off on some nonsense that you have to stop, back up, rewrite the plan, and then start them over again. And so I&#x27;ve given up on that.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="89" data-time="37:43" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2263s" target="_blank" rel="noopener noreferrer">37:43</a><span>Uncle Bob</span><small>#089</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我想：「好，等一下，改試敏捷方法。」我不知道它最後會不會很成功，也可能效果普通，但值得嘗試。先讓 Agent 做一、兩個 Story，完成後再檢視架構；必要時我親自介入。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I said, &quot;Okay, wait a minute. Let&#x27;s try the agile approach now.&quot; And I don&#x27;t know how this is going to work out. It might not work out all that well, but but let&#x27;s try the agile approach. Let&#x27;s just let them do a story or two, and then we&#x27;ll look at the architecture at the end, and we maybe I&#x27;ll have to manually get involved.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="90" data-time="38:02" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2282s" target="_blank" rel="noopener noreferrer">38:02</a><span>Uncle Bob／Matt</span><small>#090</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我會整理一些問題，接著再做幾個 Story，然後重複。這也許比較好。我們可能永遠無法完全避開每一輪結束後的人工作業與重新組織。雖然我仍試著找出自動化方法，但不確定是否真的可能。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我把它想成這樣：過去有一大塊勞動成本，是用來真正把東西建出來。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">and you know sort a few things out and then a few more stories and so on. That might be a better approach. We we may never uh escape that manual organizing step at the end. Although I&#x27;m trying to figure out a way to do it, but I don&#x27;t know I don&#x27;t know if that&#x27;s possible. &gt;&gt; I think of it like you&#x27;ve got this huge chunk of labor that needs to happen.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="91" data-time="38:24" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2304s" target="_blank" rel="noopener noreferrer">38:24</a><span>Matt</span><small>#091</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">以前實作可能耗費幾天、幾週，甚至幾個月；如今這一塊大幅縮小了。但前期規劃與後續審查的成本仍然差不多。開發者被期待進行更快速的迭代，可是真正困難的部分並沒有一起縮短，耗費的時間大致仍舊相同。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Right? In the old days, this was building the thing, right? and building the thing would take days, weeks, months maybe. Um, now that has shrunk, right? But the planning up front and then the review is still the same, right? We&#x27;re expected to do these faster iteration cycles as devs, but the stuff that was actually quite hard is still kind of the same and takes the same amount of time.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="92" data-time="38:47" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2327s" target="_blank" rel="noopener noreferrer">38:47</a><span>Matt</span><small>#092</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">你仍然可能把東西做錯，更精確地說，你仍可能做出「錯的東西」。我完全同意，現在很多人沉迷於「極大化規劃」：拿到規格後不停思考，再把規格丟給七個不同 Agent 輪番處理，最後得到一份更漂亮的計畫，才開始實作。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Building the thing wrong or sorry, building the wrong thing is something that you can still do. And I totally agree that there&#x27;s like this sort of a lot of folks are doing this kind of plan maxing thing where they&#x27;re just, you know, they take their spec and they they think about their spec, they run their spec through seven different agents or something and then they um, you know, they get back a better plan that they then go and implement or something.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="93" data-time="39:11" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2351s" target="_blank" rel="noopener noreferrer">39:11</a><span>Matt／Uncle Bob</span><small>#093</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這聽起來不太好，對吧？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">Agent 超級愛寫計畫，天啊，它們愛死了。它們會不斷替計畫增添枝葉，把計畫寫得華麗、漂亮、細節滿滿。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">然後在最後全部崩解。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">沒錯。我認為現在產業裡已經看得到這種現象。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">How like that sound not sound good? &gt;&gt; The agents love to write plans. Oh my goodness, they love it. And they will embellish the plans and the plans will be gorgeous and beautiful and spell out all kinds of details. &gt;&gt; Yeah. And then they fall apart at the end. &gt;&gt; Um so yeah, I I think you can see it in the industry right now.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="94" data-time="39:33" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2373s" target="_blank" rel="noopener noreferrer">39:33</a><span>Uncle Bob</span><small>#094</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">目前有一股 Spec-Driven Development（規格驅動開發）的潮流。我的直覺是，它大概不會成功；至少我的實驗結果並不好。我現在反而認為，或許該重新回頭看看敏捷的核心：先做一點、取得回饋；再多做一點、再取得回饋；重新整理；接著再做一點、回饋、再整理。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">There&#x27;s this movement towards spectriven development. Uh and my my uh impression there is that that&#x27;s probably not going to work. My experiments did not work particularly well. Um, and I&#x27;m thinking now maybe we should once again look at the agile ideas and maybe the idea of do a little bit, get some feedback, do a little bit more, get some feedback, reorganize, do a little bit more, feedback, reorganize.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="95" data-time="40:00" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2400s" target="_blank" rel="noopener noreferrer">40:00</a><span>Uncle Bob</span><small>#095</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">以前講敏捷課程時，我常說一個故事。假設修改一棟房子的任何內容都只要一美元，包括第一次打地基、蓋屋頂，每一次請承包商變更都只收一美元。你會怎麼蓋這棟房子？你會先花幾千美元聘請建築師，做出一份完美計畫，然後付承包商一美元，要求他一次蓋完嗎？還是你會直接走向承包商說：</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I used to tell this story back when I was doing agile lectures. If if it cost you $1 to make a change to a house, including the initial laying of the foundation, the initial roof, everything, every change you gave to the contractor would cost you a dollar. How would you build that house? Would you hire an architect and pay thousands of dollars to the architect to come up with the perfect plan that they then paid a dollar to the contractor so that he could build in one shot? Or would you walk up to the contractor and say,</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="96" data-time="40:39" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2439s" target="_blank" rel="noopener noreferrer">40:39</a><span>Uncle Bob</span><small>#096</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">「我要把地基蓋在這裡，形狀做成這樣。」看一看又說：「不，這不好，改一下地基。先做一小段。廚房放這裡，客廳放那裡。」兩美元而已。接著又發現不對，再把兩個空間交換。讓孩子們實際走一遍，發現動線很糟，那就移動樓梯，或再做其他調整。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&quot;I want the foundation here. Make it that shape.&quot; Oh, no. That&#x27;s bad. Okay, let&#x27;s change that foundation. Let&#x27;s do a little Put the kitchen over here. Put the living room there. THERE&#x27;S $2. OH, HECK NO. Let&#x27;s change those around. That&#x27;s let&#x27;s let the kids walk through the oh the traffic pattern is crappy. Move the stairs or whatever.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="97" data-time="40:59" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2459s" target="_blank" rel="noopener noreferrer">40:59</a><span>Uncle Bob／Matt</span><small>#097</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">顯然，後者大概更合理，而這正是我們現在面對的情況。一次變更只要一美元，也許兩美元、五美元；但變更成本已暴跌到幾乎趨近於零，可能已接近我們有生之年能看到的最低點。好吧，這個預測也許將來會被打臉；但既然修改已經便宜到這種程度，為什麼還要做昂貴的完整前期規劃？何不反覆調整、再調整，直到它看起來正確？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">百分之百同意，不能更同意了。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Um obviously the latter is probably better and that&#x27;s what we are looking at right now. It costs a dollar. Well maybe two, maybe five. But the the cost of change has plummeted to as close to zero as I think we&#x27;re ever going to get it. and well that&#x27;s that&#x27;s a prediction I&#x27;ll probably lose but still right the cost of change has has gone so far down that why would you do this upfront planning because that&#x27;s expensive why wouldn&#x27;t you just fiddle fiddle fiddle fiddle until it looks right &gt;&gt; yes I I 100% agree I couldn&#x27;t agree more</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="98" data-time="41:41" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2501s" target="_blank" rel="noopener noreferrer">41:41</a><span>Matt</span><small>#098</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我真正有很大意見的是「規格驅動開發」這個標籤。它到底是什麼？至少可以有十種不同解釋。每次你把資訊傳給 Agent，算不算規格驅動？提示工程算不算？某種意義上，當然也算。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">the the thing I the thing I have I think I have a massive issue with the specdriven development label Because what is spectriven development, right? Like you can have like 10 different interpretations of it and every time you pass information to an agent, right? Is prompt engineering specri development, right? Like it kind of is.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="99" data-time="42:01" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2521s" target="_blank" rel="noopener noreferrer">42:01</a><span>Matt</span><small>#099</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">以前你可能對坐在辦公室另一頭的同事說：「幫我修一下頁首的載入問題。」這算規格驅動開發嗎？那句話是不是你交給他的規格？現在我只要說「先做一點前期對齊」，大家就把它稱作規格驅動。但我認為真正差別在於：你是否把規格永久保存？之後是否不斷回頭以它為準？</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">You know, you don&#x27;t you know, you would say to your, you know, if in the old days you would have like your mate over the other side, your colleague, and you would say, you just fix that loading issue in the in the header or something. Is that spec driven development? Right? Like is that a specification that I&#x27;ve given him? you know and it seems like every time I say okay do a little bit of upfront alignment first that approach then gets called spectriven development but for me I think the difference is are you persisting your specifications right</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="100" data-time="42:27" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2547s" target="_blank" rel="noopener noreferrer">42:27</a><span>Matt／Uncle Bob</span><small>#100</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">你的態度是什麼？你會在 Repo 裡保留所有規格清單嗎？實際做法如何？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">不，我不會。這些規格是暫時性的，用過就消失。它們會頻繁改變，我不斷調整，之後就讓它們退場。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">are you returning to those specifications so what&#x27;s your attitude there like do you do you keep like a list of all of your specs in the repo &gt;&gt; or do you like what&#x27;s going on there &gt;&gt; no I do not um the the specifications are ephemeris they go away. Uh they change a lot. I fiddleled with them and you know that that goes away.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="101" data-time="42:49" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2569s" target="_blank" rel="noopener noreferrer">42:49</a><span>Uncle Bob</span><small>#101</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">如今已經沒有一個能取代原始碼的位置。以前原始碼是由人類親手寫成，所以它等於最終規格。現在這種對應關係不存在了。原始碼當然還在，但已經不是人類撰寫。很多人會對這種缺口感到不安，於是認為必須有某個由人類產出的東西，在一開始就把一切完整定義。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">There is no equivalent to source code. You know we humans wrote the source code. So that was that was the final specification. Well that doesn&#x27;t exist anymore. There is still source code but we humans aren&#x27;t the ones writing it. And a lot of people feel that lack. There has to be a human thing that defines everything up front.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="102" data-time="43:13" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2593s" target="_blank" rel="noopener noreferrer">43:13</a><span>Uncle Bob</span><small>#102</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">不過說到底，Agent 產出的成果仍然源自人類的意圖。我最近的做法是，不再先建立一份規格來定義「我想要什麼」，甚至也不另外寫文件定義「我目前有什麼」。我直接看最後成果，然後說：「這個成果本身就是規格。」我目前公開放了不少工具。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Well, I mean, in the end, even what the agents produce was produced by humans. The the thing that I&#x27;ve be been doing lately is this. Instead of creating a specification that defines what I want or defines what I have even, I look at the end result and say, well, that is the specification. So, I&#x27;ve got a bunch of tools out there.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="103" data-time="43:39" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2619s" target="_blank" rel="noopener noreferrer">43:39</a><span>Uncle Bob</span><small>#103</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">例如 CRAP 工具可以跑 Clojure、Java 和 Go，其中幾個是我讓 Agent 替我寫的。我也有突變測試器、Agent Harness，以及其他一堆東西。我會告訴大家：不要直接下載那些工具，因為它們是為我自己的需求打造的。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I&#x27;ve got like the crap tool runs for closure. It runs for Java. It runs for Go. I wrote a few of them, right? I had my agents write them. I&#x27;ve got the mutation tester. I&#x27;ve got my my agent harness. You know, I&#x27;ve got all these things up there. What I tell people is don&#x27;t download those. I wrote them for me.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="104" data-time="43:58" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2638s" target="_blank" rel="noopener noreferrer">43:58</a><span>Uncle Bob／Matt</span><small>#104</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">你應該把 Agent 指向那些工具，讓它閱讀與研究，再替你打造一套屬於你的版本。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">對，我認為這是更好的做法：先用既有成果表達某個東西的本質，再依照自己的特殊需求客製化。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">沒錯。Agent 有一件很奇特的事：你把東西傳給它，它真的會讀。這和人類差很多。你傳給某人一份龐大規格，也許有百分之二十的機會被讀完，而百分之二十可能都太樂觀，搞不好只有百分之五。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">What you should do is point your agents at them, have the agents look at them, and then build one for you. &gt;&gt; Yeah. I think that&#x27;s a far better way of specifying the essence of something and then customizing it to your to your particular need. &gt;&gt; Yep. It&#x27;s what I always find weird about agents is that if you send them something, they read it, right? Which is very different to humans, right? Very, you know, you can maybe get a 20% hit rate if you send someone a massive specification and 20% is maybe a bit generous. 5% maybe if you pass a you</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="105" data-time="44:33" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2673s" target="_blank" rel="noopener noreferrer">44:33</a><span>Matt／Uncle Bob</span><small>#105</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">但把規格傳給 Agent，它大概真的會讀。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">反過來看，Agent 寫出來的東西，人類卻不會讀。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">完全正確。我以前沒從這個角度想過。它們期待我們把它們寫的一切都讀完，可是我們根本不讀，天啊。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">know a spec to an agent they&#x27;re probably going to read it right &gt;&gt; the opposite side of that is the things that the agents write the humans don&#x27;t read. &gt;&gt; Yes. Exactly. Yeah. Exactly. So they&#x27;re expecting I had thought of it like that. They&#x27;re expecting us to read everything they write and we just don&#x27;t. God.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="106" data-time="44:53" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2693s" target="_blank" rel="noopener noreferrer">44:53</a><span>Matt</span><small>#106</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這段關係還真是單方面。長期來看，我很想知道人際互動會如何改變，因為我們愈來愈習慣和 Agent 溝通。我現在常直接口述指令給 Agent，感覺就像和朋友說話。我很好奇，隨著時間推進，生活會怎樣反過來模仿這些科技互動。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">It&#x27;s so one-sided. You know, long term, I&#x27;m interested in how human relationships differ or get different because we&#x27;re so used to communicating with agents, right? I dictate to my agents. So, it&#x27;s like I&#x27;m just sort of talking to a friend or something. I&#x27;m really interested in sort of how life imitates art over time and stuff.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="107" data-time="45:10" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2710s" target="_blank" rel="noopener noreferrer">45:10</a><span>Matt／Uncle Bob</span><small>#107</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我不知道，但真的很迷人。好，我想問一個可能接近最後的問題，而且分量不小。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">可以，算是「接近最後」。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我要再次引用 John Ousterhout，因為他對不同類型的程式設計有一組很好的區分：Tactical Programming（戰術式程式設計）。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I don&#x27;t know. That&#x27;s fascinating to me. So, okay. And I think I&#x27;m going to ask you maybe the final question, and it&#x27;s a sort of fairly beefy one. &gt;&gt; Um, if that&#x27;s all right, finalish. Um, I&#x27;m gonna go John Alart again &gt;&gt; because John has a great definition for &gt;&gt; different types of programming, right? You&#x27;ve got the tactical programming.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="108" data-time="45:32" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2732s" target="_blank" rel="noopener noreferrer">45:32</a><span>Matt／Uncle Bob</span><small>#108</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">你要去拿書了嗎？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">你都提到了，我一定得把書拿下來。等等，它應該就在這附近。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我的呢？我也拿到了。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">很好。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">你看，我拿到了。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對，就是那本。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">完成。好，戰術式與策略式程式設計。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Are you going to get it? &gt;&gt; I I just have to You&#x27;ve mentioned I&#x27;ve got to pull this book down. &gt;&gt; Wait. &gt;&gt; Uh, it&#x27;s it&#x27;s here somewhere. &gt;&gt; Where&#x27;s mine? I&#x27;ve got mine. &gt;&gt; Oh, good. Okay. All right. &gt;&gt; There you go. I&#x27;ve got mine. &gt;&gt; There it is. Yep. &gt;&gt; I got it. &gt;&gt; Okay. &gt;&gt; Done. um tactical versus strategic programming. Yeah.</p>
</details>
</div>
</details>

<h3 id="學習策略與基本功">學習、策略與基本功</h3>

<details class="article-transcript" data-index="109" data-time="45:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2752s" target="_blank" rel="noopener noreferrer">45:52</a><span>Matt</span><small>#109</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">戰術層就像戰場前線的士官，實際投入戰鬥；策略層則像將軍，負責決定整場戰爭的走向。我想我們都同意，這是區分程式設計工作類型的好框架。而 Agent 非常擅長戰術，卻非常不擅長策略。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; So tactical is the sergeant on the ground, the person kind of fighting the battle. The strategic stuff is the general kind of the person directing the course of the war. &gt;&gt; Now I think we both agree that&#x27;s a good framing, right, for different types of programming. And agents are really good at tactical, really bad at strategic.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="110" data-time="46:11" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2771s" target="_blank" rel="noopener noreferrer">46:11</a><span>Uncle Bob／Matt</span><small>#110</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">那麼，對剛入門的人來說，假如 AI 已經吃掉所有戰術工作，他們該怎麼學會策略式程式設計？我想現場很多人真正想向你索取的就是這個。他們希望你把腦袋直接交出來，讓大家灌進自己腦中，理解突變測試為什麼重要，也知道該怎麼解釋與設計模組。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; Yeah. Now, for people who are just starting out and AI has now eaten all of the tactical stuff, how do they learn to do strategic programming? Because I think a lot of people here, that&#x27;s kind of what they want from you, Bob. They want, please just give me your brain so that I can inject into it, understand why mutation testing is so good, tell me how to explain these modules.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="111" data-time="46:36" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2796s" target="_blank" rel="noopener noreferrer">46:36</a><span>Matt／Uncle Bob</span><small>#111</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我想，這就是大家要的。所以你現在的任務，是把自己的腦袋分享給所有人。他們到底該怎麼學？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我很常被問這個問題。我沒有完美答案，因為老實說，我也不知道。不過我可以說說自己會如何思考。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Like, that&#x27;s what they want, I think. So that&#x27;s your job now is to give people your brain. How how how did they learn that stuff? &gt;&gt; Okay. So, um I get this question a lot. I don&#x27;t have perfect answers to it because I really don&#x27;t know. But but here&#x27;s how I would think about this. Here&#x27;s here&#x27;s how I do think about this.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="112" data-time="46:58" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2818s" target="_blank" rel="noopener noreferrer">46:58</a><span>Uncle Bob</span><small>#112</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">首先，不論在大學或其他地方，程式設計師的學習方式都應該包含真正寫程式。你應該持續寫一段時間，也許一年，我不確定究竟多久，但一定要親自寫，才能知道 Agent 面對的是什麼。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">First of all, the um the way a programmer should learn whether it&#x27;s in university or somewhere else, right? It should be to write code. You should you should be writing code right for a year. I don&#x27;t know how long but you should be writing code so that you know what the agents are dealing with.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="113" data-time="47:16" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2836s" target="_blank" rel="noopener noreferrer">47:16</a><span>Uncle Bob</span><small>#113</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">接著，當你進入一家大量使用 Agent 的公司時，剛完成訓練的年輕人應該被當成一個 Agent 看待。負責運行那些 Agent 的人，也許是 Lead Engineer，或任何正在進行策略決策、手上管理一群 Agent 的人，應該用同樣方式看待你。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">The next thing that I think should happen is that when you get hired into a company where that company is making heavy use of agents, you the young young person just coming out of training should be treated like an agent. the uh the the guy who&#x27;s running the you know maybe the lead engineer or whoever the guy who&#x27;s got bunch of agents running and he&#x27;s being strategic.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="114" data-time="47:41" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2861s" target="_blank" rel="noopener noreferrer">47:41</a><span>Uncle Bob</span><small>#114</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">他應該把和 Agent 相同類型的任務交給你，也讓你接受 Agent 必須通過的同一套確定性工具檢驗。你需要在這種狀態下待上幾個月，生產力糟得要命，卻能學到非常多東西。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">He should look at you as an agent and he should give you the same kind of tasks that the agents have and subject you to the same kind of deterministic tools that the agent have agents have to use. And you should spend several months in that state being horribly unproductive but learning a hell of a lot.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="115" data-time="48:02" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2882s" target="_blank" rel="noopener noreferrer">48:02</a><span>Uncle Bob</span><small>#115</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">等你通過那條試煉之路，也許才值得被信任，可以開始管理一個自己的 Agent。我不確定，但未來的訓練大概會長得像這樣。你不能徹底失去與程式碼的接觸。十年前我常告訴人們：假如從未寫過組合語言，就該花一個週末親手寫一次，至少知道幕後真正發生什麼事。因為如果你整天只寫 Java，其實活在一個幻想世界裡。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">And by the time you&#x27;ve gone through that gauntlet, maybe you can be trusted to run an agent of your own. I don&#x27;t know. It&#x27;s going to be something like that. You cannot lose the code entirely. I used to tell people um 10 years ago used to tell people um if you&#x27;ve never written assembly language, you should spend the weekend writing assembly language just so that you know what&#x27;s really going on behind the scenes because if if all you&#x27;re doing is writing Java all day long, you live in a fantasy world.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="116" data-time="48:37" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2917s" target="_blank" rel="noopener noreferrer">48:37</a><span>Uncle Bob</span><small>#116</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">底下仍有你不了解的魔法。花一個週末寫組合語言，才會真正明白電腦在做什麼。我認為，AI 時代的教育路徑仍然保留這個道理。你得從二進位基礎開始，一路經過組合語言、像 C 這種較底層的程式碼，再到 Python 等高階語言；接著才是 Agent 工作方式與確定性工具，最後在監督下學會以策略角度管理 Agent。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">There is still magic yet that you don&#x27;t understand. Spend a weekend doing assembly language and you will finally understand what&#x27;s really going on. And I I think that remains true somehow during this educational pathway. You&#x27;ve got to go from the basics binary all the way through assembly language some basic code like C some higher level code like Python or something and then deal with uh agent kind of work and deterministic tools and finally be able to strategically run an agent under supervision.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="117" data-time="49:14" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2954s" target="_blank" rel="noopener noreferrer">49:14</a><span>Matt</span><small>#117</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我也不知道還能怎麼說得更好了。不過這真的很難，因為同時發生兩件事。Agent 是覆蓋在程式碼之上的抽象層；而你剛才提到的模組檢視器，也是一種蓋在程式碼上方的抽象層，我覺得非常有意思。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; Yeah, &gt;&gt; I don&#x27;t know how better to say that. &gt;&gt; It&#x27;s so hard though, right? because there&#x27;s two there&#x27;s two things going on there, right? Like there&#x27;s the agent is a kind of abstraction layer, right, over the code. And so you got the code and then it&#x27;s interesting you were talking about an abstraction layer like a sort of um module viewer, right? Like I think that&#x27;s super interesting.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="118" data-time="49:36" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=2976s" target="_blank" rel="noopener noreferrer">49:36</a><span>Matt</span><small>#118</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">這類抽象工具確實很適合學習，因為當你往下鑽時，反而能更深入理解程式碼。但假如某個新人只是在照書做戰術工作，公司一定會想：「我們為什麼要雇這個人？Uncle Bob 那群五個 Hardener Agent，用一小部分成本就能把他打得落花流水。」這是很現實的疑問。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">That&#x27;s a really good way to learn getting these kind of abstractions over the code so when you dive in you understand it more deeply. But if you have someone who&#x27;s just like sitting on your books just doing tactical work, surely as a company you&#x27;re going to look at that and go, why are we hiring this person when we&#x27;ve got, you know, we&#x27;ve got Uncle Bob&#x27;s swarm of five hardeners and stuff that can beat it, you know, a fraction of the cost, right? I&#x27;m I I just I I&#x27;m so Okay.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="119" data-time="50:06" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3006s" target="_blank" rel="noopener noreferrer">50:06</a><span>Matt</span><small>#119</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">那麼，有哪些資源、書籍或學習方法？抱歉，我其實還有一個問題。我正在想，人們究竟如何獲得這種知識，因為策略式程式設計的回饋迴路非常長，傳統上尤其如此。一個人可能工作六個月就離職，永遠學不到策略能力，因為他的錯誤也許九個月後才會爆發，他根本沒機會看見自己的後果。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">What What like resources or books can or approaches or Sorry, there&#x27;s one more question here which is I&#x27;m I&#x27;m I&#x27;m trying to like work out how people get this information because the feedback loop on strategic programming is so long, right? Or traditionally it has been very long. So you you can often &gt;&gt; like people who just like quit jobs after six months or something, they might never learn strategic programming, right? Because their mistakes are maybe nine months away, you know, so they just never see the their own mistakes. But I</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="120" data-time="50:40" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3040s" target="_blank" rel="noopener noreferrer">50:40</a><span>Matt／Uncle Bob</span><small>#120</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">但有了 Agent，事情可能不同。整體速度提升後，你能更快從錯誤獲得回饋。所以我想知道，去年十二月時，你怎麼判斷 Agent 正在犯錯？當你看著那些成果，認定它是一坨爛東西時，你是怎麼辨識的？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">早期我只是直接閱讀程式碼，看見那些狗屎般的痕跡。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">think with agents, you can, right? Because it&#x27;s sped up so much, you can actually get more feedback on your mistakes sooner. And I suppose what I&#x27;m interested in is how did you know that your agents were making mistakes back in December when you were looking at them and going this is dog? How did you identify that? &gt;&gt; Um early on I was just looking at the code and seeing the dog do.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="121" data-time="51:04" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3064s" target="_blank" rel="noopener noreferrer">51:04</a><span>Uncle Bob／Matt</span><small>#121</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">不過那不是最重要的部分。真正重要的是下一步，我看見它們開始 Thrashing，也就是反覆掙扎、改了又壞、原地消耗。我看得出 Agent 正在受苦，而且認得那種掙扎，因為我自己也曾經歷過。問題就在這裡：新手進來時，很可能看不出那是掙扎。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">那這該怎麼學？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">我自己是用慘痛經驗學會的，完全是社會大學。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">That wasn&#x27;t the important part. The important part was the next step where I watched them thrash. I could see the agent struggle and I recognized the struggle since I have been through that struggle. Right? And that&#x27;s one of the issues is the novice would come in and not recognize the struggle. &gt;&gt; Now, how do you learn that? How do you learn? You know, I learned it the hard way. School of hard knocks.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="122" data-time="51:28" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3088s" target="_blank" rel="noopener noreferrer">51:28</a><span>Uncle Bob／Matt</span><small>#122</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">年輕人要怎麼學會辨識？其實這方面有大量知識，尤其是那些因為太老而沒人讀的老書，內容非常精彩。可以讀 Tom DeMarco 的作品，也可以讀 Ed Yourdon；還有其他很多作者，糟糕，我現在一時想不起名字。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">《The Pragmatic Programmer》之類的。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對，還有很多這類舊書，都非常好。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">How do you learn that as a young person coming in? How do you recognize that? There is a wealth of information about this. Um the the old books, the ones that nobody reads because they&#x27;re old. Uh the old books on this topic are terrific, right? you go to the works by Tom DeMarco or or the works by Ed Yordan or you know go go read you know um gez I can&#x27;t think of the names right now but &gt;&gt; pragmatic programmer you know the pragmatic programmer um the the there&#x27;s a lot &gt;&gt; there&#x27;s a lot of these older books they&#x27;re very good</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="123" data-time="52:10" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3130s" target="_blank" rel="noopener noreferrer">52:10</a><span>Uncle Bob</span><small>#123</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">年輕時若仔細研讀，會逐漸建立對高階策略工作的感覺。當然，你得過濾某些已經過時的內容，因為不少書寫於 1970 或 1980 年代；但許多關鍵教訓，也正是在那個年代被痛苦學會的。所以一開始，我會先從這些書入手。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">&gt;&gt; um that if you if you study them when you&#x27;re young you will get may feel for what this higher level strategic play is. You&#x27;ll have to filter out some of the archaic stuff because a lot of these books were written in the 70s or the 80s, right? But that&#x27;s when these lessons were learned. And so I, you know, that&#x27;s that&#x27;s where I would go initially.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="124" data-time="52:35" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3155s" target="_blank" rel="noopener noreferrer">52:35</a><span>Uncle Bob／Matt</span><small>#124</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">先透過書理解，再親身感受。這也是我認為新人應該先「扮演 Agent」幾個月的原因，讓他真正知道那種工作是什麼。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">成為 Agent，讓 Agent 把工作委派給你。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對，你變成 Agent 的 Sub-Agent。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我喜歡這個說法。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">I would go to those books and learn that stuff that way. And then, of course, you&#x27;re going to have to learn it by feeling it. &gt;&gt; Yeah. That&#x27;s why I think they ought to play play uh agents for a few months so they can learn what that&#x27;s really like. &gt;&gt; Become the agent. Have the agent delegate to you. Yeah.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="125" data-time="52:51" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3171s" target="_blank" rel="noopener noreferrer">52:51</a><span>Matt／Uncle Bob</span><small>#125</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">好，我真的還有最後一個問題，應該很短。聽起來，軟體基本功依然重要，對吧？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">為什麼？你會怎麼回答那些認為基本功已經不重要的人？</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">軟體基本功之所以重要，理由和它一直以來重要的理由完全相同。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">You become a sub agent of the agent. I like that. So, okay. I do have one more question. It&#x27;s I suppose a short one. Sure. &gt;&gt; Um which is &gt;&gt; sounds like then software fundamentals still matter, right? &gt;&gt; Yeah. &gt;&gt; And why is that? And what do you say to the people who say that they don&#x27;t matter? &gt;&gt; Why is that? Um software fundamentals matter for the reason they have always mattered.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="126" data-time="53:25" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3205s" target="_blank" rel="noopener noreferrer">53:25</a><span>Uncle Bob</span><small>#126</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">這句話是誰說的？我想可能是 Dijkstra。也許我記錯了，但大意是：軟體是人類嘗試過最複雜的事物，比我們做過的任何其他工作都複雜。既然軟體極度複雜，所謂基本功，就是把複雜度整理成可被理解形式的方法。不只人類需要如此，我們的模型同樣需要。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">The let&#x27;s see who said this. It was um uh Dystra I think who said it. I&#x27;m I&#x27;m going to get this wrong, but software is the most complicated thing that humans have ever attempted to do. More complicated than you know any other task that we&#x27;ve tried. Software is the most complicated thing. And therefore, the fundamentals are the are way of organizing that complexity into a form that can be conceived not just by humans, but by our models as well.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="127" data-time="53:59" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3239s" target="_blank" rel="noopener noreferrer">53:59</a><span>Uncle Bob</span><small>#127</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">畢竟這些模型本來就是依照人類而建立。因此，基本功仍然適用，因為那是讓複雜事物變得可思考、可掌握的方式。現在確實有人認為基本功不再重要。他們會學到教訓，而且會用很痛的方式學會；我想不會等太久。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Since our models are modeled after humans after all. So the fundamentals still apply because that&#x27;s the way we organize complexity to be conceived or be to be conceived of. There are folks right now who think that the fundamentals don&#x27;t matter. They will learn and they will learn that the hard way and and it won&#x27;t take very long.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="128" data-time="54:22" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3262s" target="_blank" rel="noopener noreferrer">54:22</a><span>Uncle Bob／Matt</span><small>#128</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">也許需要的時間比我預期久，因為 Agent 的確很強。但我已經親眼看過它們撞上那堵牆，所以我知道牆真的存在，也不想再撞一次。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">我們此刻正處在一組很有趣的歷史平行裡。你剛才提到抽象層，而我們如今已經站在編譯器之上的新層級。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Might take longer than I think it&#x27;ll take because the agents are pretty good. But I&#x27;ve watched them hit the hit the uh wall. So I know that wall is there and I don&#x27;t want to hit that again. &gt;&gt; It&#x27;s a very interesting interesting set of parallels that we&#x27;re in at the moment. We you had mentioned the the abstraction layer, right? And you know we&#x27;re we&#x27;re now at a at a level where we&#x27;re above the compiler.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="129" data-time="54:52" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3292s" target="_blank" rel="noopener noreferrer">54:52</a><span>Matt</span><small>#129</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">以前我們的抽象層是編譯器，再之前是組合語言，更早以前則是二進位；如今我們來到模型這一層。每當抽象層往上升一階，停留在較低層的人都會抱怨：「這會毀掉一切。」</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">We used to our our our abstraction layer used to be the compiler. Before that it was assembly language. Before that it was binary. And now it&#x27;s up here at this level of the model. At every one of those steps up up the abstraction layer. The people at the at the lower step complaint said, &quot;Oh, this is going to ruin everything.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="130" data-time="55:13" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3313s" target="_blank" rel="noopener noreferrer">55:13</a><span>Matt／Uncle Bob</span><small>#130</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">「我們甚至會失去所有工作。事情變得太容易，連五歲小孩都能寫程式。」而當年他們談的甚至可能還是二進位。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">沒錯。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">每一步都一樣。如今我們又站在下一層，下面的人說：「這會毀掉一切。」但不，它不會。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">We&#x27;re not even going to have jobs anymore. It&#x27;s become so easy that five-year-olds will be able to write the code.&quot; And you know, back then they were still talking about like binary. Yes. At every step it&#x27;s the same. And and so we&#x27;re at this next step and the people down here are saying, &quot;Oh, it&#x27;s going to ruin everything.&quot; No, it&#x27;s not.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="131" data-time="55:35" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3335s" target="_blank" rel="noopener noreferrer">55:35</a><span>Uncle Bob／Matt</span><small>#131</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">相同規則仍然適用。所有基本功都還存在，而且存在的理由完全沒變。今天被你丟掉的規則，一年後你會從地板上重新撿起來，拍掉灰塵，然後想起自己當初為什麼需要它。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">謝謝你，Bob。我記得柏拉圖好像有句話，說文字書寫會讓人變笨。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">The same rules apply. All the same fundamentals exist for all the same reasons. The rules you throw away are the ones you&#x27;re going to pick up off the floor in a year and dust off and remember why you need them. &gt;&gt; Yeah. Thank you so much, Bob. There&#x27;s a there&#x27;s a great quote from I think Plato where he says that writing is going to make people stupider.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="132" data-time="56:00" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3360s" target="_blank" rel="noopener noreferrer">56:00</a><span>Matt</span><small>#132</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">所以早從古希臘開始，人們就在進行同樣的抽象層爭論，實在荒謬。我看看現在有多少人看直播……有一千五百人，太驚人了。我想所有觀眾都會同意，這是一場非常精彩的對談。Bob，真的非常感謝你。</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Right? So people have had that same abstraction argument since you know the Greeks, right? Ridiculous. I think everyone uh watching, how many folks have we got on this stream? Uh we&#x27;ve got 1,500 people watching. Incredible. Uh I think we can all agree that was a fantastic conversation. Um Bob, thank you so much.</p>
</details>
</div>
</details>

<details class="article-transcript" data-index="133" data-time="56:20" open="">
<summary><a href="https://www.youtube.com/watch?v=zcLPGC-tvgk&amp;t=3380s" target="_blank" rel="noopener noreferrer">56:20</a><span>Matt／Uncle Bob</span><small>#133</small></summary>
<div class="article-transcript__body">
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">再把你的書舉起來一次，讓大家看看。《Clean Code》。你那邊現在應該十一點了吧？該換回浴袍了。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--guest">Uncle Bob</span><span class="article-transcript__dialogue">對，沒錯。</span></p>
<p class="article-transcript__line"><span class="article-transcript__speaker article-transcript__speaker--host">Matt</span><span class="article-transcript__dialogue">太完美了。各位，謝謝收看，我現在要結束直播。我和 Bob 會繼續留在線上……（原始逐字稿在此處截斷。）</span></p>
<details class="article-transcript__original">
<summary>核對英文原文</summary>
<p lang="en">Um, hold up your book one more time so folks can uh can get it. Let&#x27;s see. Clean code. And I think what is 11:00 a.m. now your time? Back to the bathrobe. Uh, &gt;&gt; yeah. Yeah, it is. &gt;&gt; Perfect. So, folks, thank you so much. I&#x27;m going to end the stream here. Me and Bob are gonna stay on for a</p>
</details>
</div>
</details>

<h2 id="glossary">關鍵術語速查</h2>

<ul>
  <li><strong>CRAP</strong>：以測試覆蓋率與循環複雜度辨識高風險函式的品質指標。訪談重點是把它做成 Agent 必須修到合格的關卡。</li>
  <li><strong>Cyclomatic Complexity</strong>：衡量程式中獨立執行路徑數量。分支愈多，理解與測試成本通常愈高。</li>
  <li><strong>Mutation Testing</strong>：故意改壞程式，再確認測試能抓到。如果測試仍通過，該突變體便「存活」。</li>
  <li><strong>Gherkin</strong>：以 Given／When／Then 表達驗收行為的規格格式，讓需求能被人與工具共同閱讀。</li>
  <li><strong>Lost in the Middle</strong>：長上下文中，模型較容易忽略中段資訊；開頭與最近內容往往更顯著。</li>
  <li><strong>Context Trajectory</strong>：同一個工作階段早期形成的方向，會持續影響後續決策。清空上下文才能真正換軌。</li>
  <li><strong>Deep Module</strong>：用小而清楚的介面隱藏大量內部複雜度，降低呼叫者與 Agent 的理解負擔。</li>
  <li><strong>Tactical／Strategic</strong>：戰術式程式設計處理眼前實作；策略式程式設計決定系統長期結構、界線與方向。</li>
</ul>

<h2 id="sources">來源與翻譯說明</h2>

<ul>
  <li>原始影片：<a href="https://www.youtube.com/watch?v=zcLPGC-tvgk">LIVE: Uncle Bob on Software Fundamentals in the Age of AI</a></li>
  <li>對談者：Robert C. Martin（Uncle Bob）、Matt Pocock</li>
  <li>本文依使用者提供的英文逐字稿與正體中文翻譯 HTML 整理。</li>
  <li>主文中的流程建議與判斷是我的整理，不是逐字引述；完整翻譯區則依原始順序保留全部 133 段。</li>
  <li>封面為 AI 生成概念圖，用來呈現「高速生成的程式碼通過工程品質關卡」，不是訪談現場或真實人物影像。</li>
</ul>

<p>影片與英文內容的權利歸原作者與原發布頻道所有。本譯文供中文讀者學習、研究與討論。</p>]]></content><author><name></name></author><category term="technical" /><category term="ai-agent" /><category term="ai-coding" /><category term="matt-pocock" /><category term="uncle-bob" /><category term="clean-code" /><category term="software-architecture" /><category term="tdd" /><category term="mutation-testing" /><category term="software-engineering" /><summary type="html"><![CDATA[完整整理並翻譯 Uncle Bob 與 Matt Pocock 的 56 分鐘對談：AI 寫程式愈快，愈需要可執行的品質關卡、模組邊界、小步迭代與人類策略判斷。]]></summary></entry><entry><title type="html">當 AI 拒絕金瓶梅：用一部四百年前的經典，測出大語言模型的道德邊界</title><link href="https://swanky.github.io/technical/ai-moderation-jinpingmei/" rel="alternate" type="text/html" title="當 AI 拒絕金瓶梅：用一部四百年前的經典，測出大語言模型的道德邊界" /><published>2026-08-08T00:00:00+00:00</published><updated>2026-08-08T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-moderation-jinpingmei</id><content type="html" xml:base="https://swanky.github.io/technical/ai-moderation-jinpingmei/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>實驗</strong>：拿公共領域的文學經典《金瓶梅》做全方位 AI 重製——結果它同時成了各家模型內容審查的壓力測試。</li>
    <li><strong>觀察</strong>：主流閉源模型連處理「文學裡的成人內容」都會攔截或淡化；Grok 的邊界明顯較寬；開源模型（如 Stable Diffusion）自由度最高。</li>
    <li><strong>觀點</strong>：內容邊界是真實的技術選型維度。供應商把自家價值觀寫進產品，但使用者的合法需求不會因此消失——這正是開源與閉源之爭裡最少被誠實討論的一塊。</li>
  </ul>
</div>

<h2 id="為什麼是金瓶梅">為什麼是金瓶梅</h2>

<p>我為「<a href="/jinpingmei/">金瓶梅宇宙</a>」專案選擇《金瓶梅》，有文學上的理由：公共領域、人物深度罕有敵手、天生適合跨媒介改編。但還有一個技術上的理由，直說了——<strong>它是測試 AI 內容邊界的完美題目</strong>。</p>

<p>這部明代經典的文學地位無可爭議，Wikisource 與各大文學網站都完整收錄；同時它對情慾的描寫直白不迴避。一個工具如果宣稱能協助「文學創作」與「經典改編」，那它遲早要回答：碰到金瓶梅，你處理還是不處理？</p>

<h2 id="第一手觀察同一部經典各家反應不同">第一手觀察：同一部經典，各家反應不同</h2>

<p>在把這部書做成<a href="/jinpingmei/characters/">角色研究</a>、<a href="/jinpingmei/studio/">影像</a>與<a href="/games/plum/">遊戲</a>的過程裡，我實際用過市面上主要的文字與圖像生成工具。觀察很一致：</p>

<ul>
  <li><strong>主流閉源模型（ChatGPT、Claude 等）</strong>：處理到稍微露骨的情色文學段落就會被攔截，或自動淡化改寫；圖像生成更保守，人物「露多一點」就會觸發審查或直接拒絕生成。即使素材是四百年前的公版文學，模型的預設立場仍然是迴避。</li>
  <li><strong>Grok</strong>：使用體驗明顯不同，邊界寬鬆許多，願意處理其他模型直接拒絕的內容。這也成為我實際比較各家大語言模型時的一個固定維度。</li>
  <li><strong>開源模型</strong>：自由度最高。我用 Stable Diffusion 生成過很多好看的情色向影像——同樣的需求，線上閉源工具就是做不出來。差別不在能力，在policy。</li>
</ul>

<p>要強調的是：這不是「想生成違法內容被擋」的抱怨。金瓶梅是合法的公版文學，成人向創作在多數司法轄區也是合法需求。被擋下的，是<strong>合法但讓供應商感到不安</strong>的那一塊。</p>

<h2 id="這不是安全問題是產品決策">這不是安全問題，是產品決策</h2>

<p>從技術顧問的角度看，我對「模型會拒絕什麼」的興趣，跟對「模型能做到什麼」的興趣一樣大。因為前者往往不是寫在規格書上的，要實測才知道。</p>

<p>閉源供應商把自家的價值觀直接寫進產品：他們認為自己是對的，於是使用者的需求被預設立場給限制住。每個國家有自己的法規與道德光譜，這完全可以理解——但現狀是，一家公司的內容政策，實質上變成了全球使用者的創作天花板。對創作者來說，這就是「令人無奈」四個字。</p>

<p>而人們對這類內容的需求是真實存在的。假裝需求不存在，不會讓需求消失，只會讓需求流向別的工具——這正是市場正在發生的事。</p>

<h2 id="開源-vs-閉源最少被誠實討論的一塊">開源 vs 閉源：最少被誠實討論的一塊</h2>

<p>開源與閉源 AI 之爭，大家常談成本、隱私、可控性。我認為<strong>內容自由度</strong>是同樣重要、卻最少被誠實討論的維度：</p>

<ol>
  <li><strong>閉源模型的邊界是別人劃的</strong>，而且會隨政策變動——今天能做的事，明天一次更新後可能就不能做了。</li>
  <li><strong>開源模型把邊界還給部署者</strong>：自己承擔法律與道德責任，換取完整的創作自由。這才是「每個國家法規與道德不同」的正解——讓在地的部署者依在地的規範自律，而不是由單一供應商替全世界決定。</li>
  <li><strong>混合策略是務實解</strong>：我的做法是閉源模型做考證、結構化與長文本理解（它們確實強），內容敏感的生成環節交給邊界較寬或開源的工具。「金瓶梅宇宙」整個專案就是這樣完成的。</li>
</ol>

<h2 id="給選型者的建議">給選型者的建議</h2>

<p>如果你的產品或創作題材可能觸碰內容邊界——文學、影視、遊戲、醫療、性教育都算——選型時請把「邊界實測」列為正式評估項目：</p>

<ul>
  <li>拿你領域裡<strong>合法但敏感</strong>的真實素材去測，不要只測 demo 題。</li>
  <li>分開測「文字理解」與「內容生成」——同一家模型在兩端的邊界常常不一樣。</li>
  <li>把「政策變動風險」寫進評估：閉源模型的邊界不是常數。</li>
  <li>認真評估開源自建的選項，特別是當你的需求合法、但明顯落在大廠舒適圈外。</li>
</ul>

<p>四百年前，《金瓶梅》的作者選擇直視人的欲望，不假裝它不存在。四百年後，我們的工具反而學會了假裝。這個專案想做的事情之一，就是把這個矛盾攤開來給大家看——順便，把這部經典完整地、<a href="/jinpingmei/text/">一字未刪改地</a>放回線上。</p>]]></content><author><name></name></author><category term="technical" /><category term="ai-moderation" /><category term="open-source-ai" /><category term="llm" /><category term="content-policy" /><category term="jinpingmei" /><category term="ai-visual" /><summary type="html"><![CDATA[拿《金瓶梅》這部公共領域的文學經典去測各家 AI：閉源模型對情色文學的攔截、Grok 的寬鬆邊界、開源模型的自由度——一個技術顧問對「AI 道德審查」與開源閉源之爭的第一手觀察。]]></summary></entry><entry><title type="html">用 AI 替一部百回小說建立全劇組角色設定：金瓶梅角色研究館的工作流</title><link href="https://swanky.github.io/claude-code/jinpingmei-character-lab/" rel="alternate" type="text/html" title="用 AI 替一部百回小說建立全劇組角色設定：金瓶梅角色研究館的工作流" /><published>2026-08-08T00:00:00+00:00</published><updated>2026-08-08T00:00:00+00:00</updated><id>https://swanky.github.io/claude-code/jinpingmei-character-lab</id><content type="html" xml:base="https://swanky.github.io/claude-code/jinpingmei-character-lab/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>做了什麼</strong>：讓 AI 讀完《金瓶梅詞話》全一百回，從書中海選角色、建立十張附逐字原文依據的角色卡，再生成三視圖設定圖與擬真選角母版。</li>
    <li><strong>關鍵不是生圖</strong>：是「證據紀律」——每個人物設定都能回指到原文行號，每張圖都經過「圖像觀察 vs 原典證據 vs 裁決」的審查迴圈。</li>
    <li><strong>成果在哪</strong>：<a href="/jinpingmei/characters/">角色研究館</a>可以逛，每一頁都附工作底稿；選角流程在<a href="/jinpingmei/studio/">影像工作室</a>。</li>
  </ul>
</div>

<h2 id="起點一部小說能不能長出一個劇組">起點：一部小說，能不能長出一個劇組？</h2>

<p>假設今天要把《金瓶梅》拍成影集或做成遊戲，第一件事不是寫劇本，而是回答一連串基本問題：這本書裡到底有哪些人？誰重要？他們長什麼樣子、說話什麼調性、彼此是什麼關係？傳統做法是文學顧問讀書做筆記，以月為單位計。</p>

<p>我把這件事交給 AI 工作流，在短時間內走完了全程。這篇文章公開整套方法——不是「一個神奇 prompt」，而是一條有品質關卡的生產線。</p>

<h2 id="第一步全文入庫">第一步：全文入庫</h2>

<p>素材是公共領域的《金瓶梅詞話》（萬曆本），取 Wikisource 整理稿，逐回切成一百份結構化文字。這一步看似平凡，卻決定了後面所有環節的品質：每一條人物證據都要能標註出處回目與行號，沒有乾淨的文本庫就沒有可追溯的證據。</p>

<p>（這份文本庫後來也直接變成了站上的<a href="/jinpingmei/text/">原文書房</a>——全文一字未刪改，線上可讀。）</p>

<h2 id="第二步海選以及海選的殘酷現實">第二步：海選——以及海選的殘酷現實</h2>

<p>讓 AI 掃描全書抓「像人名的東西」，粗合併後得到超過一千兩百筆候選。這個數字聽起來很壯觀，實際上充滿污染：同一人的多個稱謂、官職誤判、詩詞裡的典故人物都混在裡面。</p>

<p>這是第一個重要教訓：<strong>AI 海選的產出不能直接當結論用</strong>。候選名單需要清洗、合併、排名，最後用「出場證據是否充足」的標準篩出經得起驗證的主要角色——我們定為安全前十名：西門慶、潘金蓮、吳月娘、李瓶兒、春梅、陳經濟、孟玉樓、應伯爵、孫雪娥、李嬌兒。</p>

<h2 id="第三步角色卡每一句側寫都要有出處">第三步：角色卡——每一句側寫都要有出處</h2>

<p>十位角色每人一張卡，欄位包括：身份、性格、外貌、性情、動機、人物弧光、人物關係。規則只有一條：<strong>寫得出來的就引原文，引不出來的就標「（推斷）」</strong>。</p>

<p>例如潘金蓮的「機變伶俐」不是 AI 的印象分數，是第一回的原文：「本性機變伶俐」；她的善妒也不是刻板印象，是她自己說的：「我眼子裏放不下砂子的人」。每張卡的最後都有一排逐字引文，讀者可以自己去原文書房對答案。</p>

<h2 id="第四步形象與聲音把證據翻譯成指令">第四步：形象與聲音——把證據翻譯成指令</h2>

<p>角色卡完成後，才輪到生成。每位角色產出三份「給 AI 的設定指令」：</p>

<ul>
  <li><strong>形象設定指令</strong>：中英雙語的角色描述，外加排除條件（negative prompt）——明確禁止現代服飾、幼態比例與情色化構圖。</li>
  <li><strong>三視圖指令</strong>：要求正、側、背三視角同比例、同服裝、同配色，產出可交給美術管線的 model sheet。</li>
  <li><strong>聲音設定</strong>：音色、音高、語速、口音、情緒的文字規格，供語音生成使用。</li>
</ul>

<p>這些指令全部公開在每個角色頁的「AI 選角檔案」段落——它們本身就是作品的一部分。</p>

<h2 id="第五步品質關卡圖像觀察-vs-原典證據-vs-裁決">第五步：品質關卡——圖像觀察 vs 原典證據 vs 裁決</h2>

<p>生成的圖不會直接定稿。每張候選圖走一次三段式審查：</p>

<ol>
  <li><strong>圖像觀察</strong>：這張圖實際畫了什麼？（例：候選的潘金蓮披了一件原典沒有的奇幻宮廷披風）</li>
  <li><strong>原典證據</strong>：書裡怎麼寫？（第二回：毛青布大袖衫、湘裙、白綾高底鞋——逐字列出）</li>
  <li><strong>裁決</strong>：保留什麼、修掉什麼。（保留臉與漂亮度；服裝依原典重做）</li>
</ol>

<p>裁決寫成文字記錄，下一輪生成必須回應上一輪裁決。<a href="/jinpingmei/studio/">影像工作室</a>裡有完整的實例與定裝迭代對照圖。</p>

<h2 id="心得ai-的價值在流程不在單次輸出">心得：AI 的價值在流程，不在單次輸出</h2>

<p>這個專案最大的體會：AI 單次輸出的品質天花板不高，但<strong>把 AI 放進一條有證據紀律、有審查關卡、有迭代記錄的流程裡，品質就能收斂</strong>。十張角色卡、十張三視圖、五張擬真選角母版、加上可線上閱讀的百回全文——都是同一條流程的產物。</p>

<p>成果都在站上：從<a href="/jinpingmei/">金瓶梅宇宙</a>進去逛一圈，每一頁都留了工作底稿。如果你的團隊也想把類似流程導入內容生產，歡迎參考<a href="/technical/ai-visual-production/">AI 視覺內容製作</a>服務。</p>]]></content><author><name></name></author><category term="claude-code" /><category term="technical" /><category term="ai-agent" /><category term="ai-visual" /><category term="character-design" /><category term="jinpingmei" /><category term="workflow" /><category term="agent-skills" /><summary type="html"><![CDATA[一套 AI 工作流讀完《金瓶梅詞話》一百回，海選出角色、建立十張附逐字原文依據的角色卡，再生成三視圖設定與擬真選角母版——完整方法與品質關卡公開。]]></summary></entry><entry><title type="html">Matt Pocock 光頭哥的 Skills 使用教學：模型愈強，工程流程愈重要</title><link href="https://swanky.github.io/technical/matt-pocock-skills-ai-coding-workflow/" rel="alternate" type="text/html" title="Matt Pocock 光頭哥的 Skills 使用教學：模型愈強，工程流程愈重要" /><published>2026-08-08T00:00:00+00:00</published><updated>2026-08-08T00:00:00+00:00</updated><id>https://swanky.github.io/technical/matt-pocock-skills-ai-coding-workflow</id><content type="html" xml:base="https://swanky.github.io/technical/matt-pocock-skills-ai-coding-workflow/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>這套 Skills 是什麼</strong>：不是一包神奇 Prompt，而是把需求澄清、共同語言、規格、切票、TDD 與 Code Review 寫成可重複使用的工程流程。</li>
    <li><strong>新手先用哪兩個</strong>：先從 <code>/grill-me</code> 與 <code>/implement</code> 開始；工作變大，再加入 <code>/grill-with-docs</code>、<code>/to-spec</code> 與 <code>/to-tickets</code>。</li>
    <li><strong>為什麼現在重要</strong>：模型愈強，做錯事情的速度也愈快。真正開始形成主流的，不會是背更多 Prompt，而是把判斷、授權與驗證固定成 Skill。</li>
    <li><strong>先別整包無腦裝</strong>：原版可能問得太久，<code>/implement</code> 會直接 Commit，目前的文件與平行工作流也有維護風險；應先在個人專案小範圍試用。</li>
  </ul>
</div>

<nav class="article-toc article-toc--outline" aria-label="文章大綱">
  <span class="article-toc-label">本文大綱</span>
  <ol class="article-toc-parts">
    <li class="article-toc-part">
      <span class="article-toc-part-title">先搞懂它到底在解決什麼</span>
      <ol class="article-toc-items">
        <li><a href="#一封看起來像行銷信的信">一封看起來像行銷信的信</a></li>
        <li><a href="#skills-不是-prompt-收藏">Skills 不是 Prompt 收藏</a></li>
        <li><a href="#為什麼模型愈強skill-反而愈重要">為什麼模型愈強，Skill 反而愈重要</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">怎麼裝、怎麼用</span>
      <ol class="article-toc-items">
        <li>
          <a href="#安裝方式">安裝方式</a>
          <span class="article-toc-sub">
            <a href="#codex-與其他支援-agent-skills-的工具">Codex 等工具</a>
            <a href="#claude-code-plugin">Claude Code Plugin</a>
          </span>
        </li>
        <li>
          <a href="#兩條核心工作流">兩條核心工作流</a>
          <span class="article-toc-sub">
            <a href="#小型工作一個-session-可以完成">小型工作</a>
            <a href="#大型工作會跨越多個-session">大型工作</a>
          </span>
        </li>
        <li>
          <a href="#六個核心-skill-怎麼用">六個核心 Skill 怎麼用</a>
          <span class="article-toc-sub">
            <a href="#1-grill-me先把你問到不能再含糊">/grill-me</a>
            <a href="#2-grill-with-docs把共同語言留在-repository">/grill-with-docs</a>
            <a href="#3-to-spec把已經談妥的內容保存下來">/to-spec</a>
            <a href="#4-to-tickets切成-agent-吃得下的垂直工作">/to-tickets</a>
            <a href="#5-implement按照既定決策實作">/implement</a>
            <a href="#6-improve-codebase-architecture找出值得重構的地方">/improve-codebase-architecture</a>
          </span>
        </li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">實際跑一次，以及還沒解決的事</span>
      <ol class="article-toc-items">
        <li>
          <a href="#實際操作範例">實際操作範例</a>
          <span class="article-toc-sub">
            <a href="#第一步先釐清不准寫-code">先釐清</a>
            <a href="#第二步工作變大就保存成-spec">存成 Spec</a>
            <a href="#第三步每一張-ticket-都要重新驗證">逐張驗證</a>
          </span>
        </li>
        <li>
          <a href="#這套流程還沒有解決什麼">這套流程還沒有解決什麼</a>
          <span class="article-toc-sub">
            <a href="#追問可能太久">追問太久</a>
            <a href="#文件可能漂移">文件漂移</a>
            <a href="#implement-不會替你管理整個交付生命週期">交付生命週期</a>
            <a href="#安全掃描不等於值得信任">安全風險</a>
          </span>
        </li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">帶進團隊與最後判斷</span>
      <ol class="article-toc-items">
        <li><a href="#團隊要怎麼導入">團隊要怎麼導入</a></li>
        <li><a href="#最後判斷主流的會是-skill不一定是這一套-skill">最後判斷：主流的會是 Skill</a></li>
        <li><a href="#參考資料">參考資料</a></li>
      </ol>
    </li>
  </ol>
</nav>

<div class="article-part"><span class="article-part-num">一</span><span class="article-part-title">先搞懂它到底在解決什麼</span></div>

<h2 id="一封看起來像行銷信的信">一封看起來像行銷信的信</h2>

<p>前幾天收到 Matt Pocock 的一封信，主旨大意是：「想讓你的團隊一起用我的 Skills 嗎？午休時把這支影片放給大家看。」</p>

<p>老實說，我原本以為這又是一封標準的課程暖身信。免費影片、免費簡報，最後再把人導向即將推出的付費課程。這個判斷沒有錯，但只看成這樣又有點可惜。</p>

<p>影片裡有一句話讓我停了一下：</p>

<blockquote>
  <p><strong>AI accelerates software entropy.</strong><a href="https://www.aihero.dev/skills/for-your-team">[1]</a><a href="https://docs.google.com/presentation/d/12WTK21TZQrTffYdZg206dWuy_CWICD7Eud8pZVWzItA/edit">[2]</a></p>
</blockquote>

<p>AI 加速的不只是開發速度，也會加速軟體的混亂。</p>

<p>這句話比「AI 讓每個人都能寫程式」誠實多了。模型可以在幾分鐘內吐出幾千行程式碼，但它不會因為產量變高，就自動知道哪些程式碼值得留下。當結構、命名、測試與模組邊界一路變差，下一次 Agent 進來工作時，面對的就是一個更難理解的環境。</p>

<p>Matt 的另一個說法是：</p>

<blockquote>
  <p><strong>Code is the agent’s environment.</strong><a href="https://www.aihero.dev/skills/for-your-team">[1]</a><a href="https://docs.google.com/presentation/d/12WTK21TZQrTffYdZg206dWuy_CWICD7Eud8pZVWzItA/edit">[2]</a></p>
</blockquote>

<p>程式碼不只是產出，也是 Agent 下一次工作的環境。</p>

<p>這才是他這套 Skills 真正想解決的問題。<a href="https://www.aihero.dev/skills/for-your-team">免費影片與團隊簡報</a>並不是在教大家記住更多指令，而是在問：當 AI 已經能大量執行，團隊要用什麼方法維持共同理解與工程品質？</p>

<h2 id="skills-不是-prompt-收藏">Skills 不是 Prompt 收藏</h2>

<p>很多人看到 Agent Skill，直覺上會把它理解成「整理得比較漂亮的 Prompt」。技術格式上，Skill 的核心確實常常只是 Markdown；但如果只剩下這個理解，就像把公司 SOP 說成「幾張寫了字的紙」。</p>

<p>真正有價值的是它把一種做事方式固定下來。</p>

<p>Matt 的 <a href="https://github.com/mattpocock/skills"><code class="language-plaintext highlighter-rouge">mattpocock/skills</code></a> 把幾個常見工程問題，分別交給不同 Skill：</p>

<ul>
  <li>需求還模糊：先讓 Agent 追問，不准急著實作</li>
  <li>團隊用詞混亂：建立共同語言與決策紀錄</li>
  <li>工作超過一個 Context Window：整理成 Spec，再切成 Ticket</li>
  <li>開始實作：從可驗證的邊界做 TDD</li>
  <li>實作完成：用 Code Review 對照規格與工程標準</li>
  <li>架構開始腐化：定期找出值得深化的模組，而不是到處做表面整理</li>
</ul>

<p>截至 2026 年 8 月 8 日研究當下，這個 Repository 約有 20.9 萬 GitHub Stars、1.8 萬 Forks；<a href="https://www.skills.sh/mattpocock/skills">skills.sh</a> 顯示約 1,430 萬次總安裝。<a href="https://github.com/mattpocock/skills">[3]</a><a href="https://www.skills.sh/mattpocock/skills">[7]</a> 這些數字不能證明它一定提高交付品質，但至少說明 Agent Skill 已經不是少數人在玩的 Prompt 收納術。</p>

<p>它正在變成一個新的工程流程載體。</p>

<h2 id="為什麼模型愈強skill-反而愈重要">為什麼模型愈強，Skill 反而愈重要</h2>

<p>直覺上，模型愈聰明，我們應該愈不需要工作流。實際上剛好相反。</p>

<p>模型能力弱時，問題通常是「它做不到」。模型能力強之後，問題會變成：</p>

<ul>
  <li>它做得到，但做的是不是對的？</li>
  <li>它改得很快，但有沒有超出範圍？</li>
  <li>它通過測試，但測試是不是只證明自己寫的答案？</li>
  <li>它能平行派出多個 Agent，但這些 Agent 會不會同時踩爛同一個 Git 工作目錄？</li>
  <li>它可以自己 Commit、開 PR、部署，但哪一步應該停下來讓人確認？</li>
</ul>

<p>能力提高，代表錯誤的爆炸半徑也變大。</p>

<p>所以 Prompt Engineering 不會完全消失，但重心會逐漸移到 <strong>Context Engineering、Skill、規格、權限與 Verification</strong>。團隊不可能要求每個人每次都臨場寫出完美 Prompt；比較可靠的做法，是把經過驗證的流程寫成大家共用、看得懂、改得動的 Skill。</p>

<p>這也是我認為它會慢慢成為主流的原因。</p>

<p>模型負責理解與執行，Skill 負責提醒它現在扮演什麼角色、遵循什麼工序、什麼叫完成。人則負責決定方向、授權範圍與最後驗收。</p>

<p>三者缺一不可。</p>

<div class="article-part"><span class="article-part-num">二</span><span class="article-part-title">怎麼裝、怎麼用</span></div>

<h2 id="安裝方式">安裝方式</h2>

<p>目前有兩條主要安裝路線，選一種就好。<a href="https://github.com/mattpocock/skills">[3]</a></p>

<h3 id="codex-與其他支援-agent-skills-的工具">Codex 與其他支援 Agent Skills 的工具</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npx skills@latest add mattpocock/skills
</code></pre></div></div>

<p>安裝器會讓你挑選要使用的 Skills 與目標 Agent。第一次導入時，記得一併選取 <code class="language-plaintext highlighter-rouge">setup-matt-pocock-skills</code>，再進入每個 Repository 執行一次：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/setup-matt-pocock-skills
</code></pre></div></div>

<p>它會設定 Issue Tracker、分類標籤與文件存放位置。</p>

<h3 id="claude-code-plugin">Claude Code Plugin</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude plugins <span class="nb">install </span>mattpocock-skills
</code></pre></div></div>

<p>Plugin 是由作者維護、隨版本更新的唯讀整包；<code class="language-plaintext highlighter-rouge">npx skills</code> 則是把可編輯檔案複製到你的環境或專案。不要兩種一起裝，不然每個 Skill 會出現兩份，Agent 還沒開始工作，工具箱先自我繁殖。<a href="https://github.com/mattpocock/skills">[3]</a></p>

<p>我的建議是：個人試用先挑少數 Skills，不要看到 29 個現役 Skill 就全部勾下去。工具多不等於流程清楚，通常只是選單變長。</p>

<h2 id="兩條核心工作流">兩條核心工作流</h2>

<p>Matt 把工作大致分成兩種。<a href="https://www.aihero.dev/skills/for-your-team">[1]</a><a href="https://docs.google.com/presentation/d/12WTK21TZQrTffYdZg206dWuy_CWICD7Eud8pZVWzItA/edit">[2]</a></p>

<h3 id="小型工作一個-session-可以完成">小型工作：一個 Session 可以完成</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/grill-with-docs
→ /implement
</code></pre></div></div>

<p>先透過追問對齊需求、程式碼現況與共同語言；確認工作可以留在同一個 Context Window，就直接進入實作。</p>

<h3 id="大型工作會跨越多個-session">大型工作：會跨越多個 Session</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/grill-with-docs
→ /to-spec
→ /to-tickets
→ 每張 Ticket 分別 /implement
</code></pre></div></div>

<p>Spec 是目的地，Ticket 是走到目的地的路徑。<a href="https://www.aihero.dev/skills/for-your-team">[1]</a><a href="https://docs.google.com/presentation/d/12WTK21TZQrTffYdZg206dWuy_CWICD7Eud8pZVWzItA/edit">[2]</a></p>

<p>每張 Ticket 應該是一個可獨立驗證的垂直切片，不是「先做全部資料庫、再做全部 API、最後才接 UI」的水平分工。<a href="https://github.com/mattpocock/skills">[3]</a> 理想的 Ticket 要能在一個乾淨的 Context Window 裡完成，並且交付一條從資料、邏輯到介面的窄路徑。</p>

<p>這種切法其實不新。Tracer Bullet、Vertical Slice、TDD、DDD 與 Deep Module 都是老派軟體工程觀念。比較有意思的是，當模型能力上來之後，這些老觀念突然成為 AI Agent 能否穩定工作的基礎設施。</p>

<p>前幾個月我也整理過 <a href="/claude-code/gstack-workflow-guide/">〈gstack 教學：把 Claude Code 變成完整的 AI 開發工作流〉</a>。gstack 比較像替 Claude Code 配上一支角色分工完整的產品與工程團隊；Matt Pocock 的 Skills 則更小、更容易拆解，也更強調由使用者掌握流程。兩者方向不同，但都指向同一件事：不能再把 AI Coding 當成「丟一句話，等它自由發揮」。</p>

<h2 id="六個核心-skill-怎麼用">六個核心 Skill 怎麼用</h2>

<h3 id="1-grill-me先把你問到不能再含糊">1. <code class="language-plaintext highlighter-rouge">/grill-me</code>：先把你問到不能再含糊</h3>

<p><a href="https://www.aihero.dev/skills-grill-me"><code class="language-plaintext highlighter-rouge">/grill-me</code></a> 是無狀態的需求追問工具。它不讀 Repository、不寫檔案，也不一定要拿來談程式。<a href="https://www.aihero.dev/skills-grill-me">[4]</a></p>

<p>適合剛冒出來的產品想法、文章主題、商業決策，或任何你覺得「大概知道要什麼，但說不清楚」的問題。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/grill-me
我想替個人網站增加一個顧問需求診斷入口，但不想變成普通聯絡表單。
</code></pre></div></div>

<p>Agent 會沿著目標客群、使用情境、成功條件、排除範圍與風險一路追問。它的價值不是替你回答，而是逼你承認哪些事情其實還沒決定。</p>

<h3 id="2-grill-with-docs把共同語言留在-repository">2. <code class="language-plaintext highlighter-rouge">/grill-with-docs</code>：把共同語言留在 Repository</h3>

<p><a href="https://www.aihero.dev/skills-grill-with-docs"><code class="language-plaintext highlighter-rouge">/grill-with-docs</code></a> 會讀取程式碼，並把釐清後的專案術語寫進 <code class="language-plaintext highlighter-rouge">CONTEXT.md</code>；重大、難以逆轉、如果沒有背景會顯得奇怪的決策，則寫成 ADR。<a href="https://www.aihero.dev/skills-grill-with-docs">[6]</a></p>

<p>這裡借用了 DDD 的 Ubiquitous Language。團隊、領域專家與 Agent 使用同一套詞彙，模型就不用每個 Session 重新猜「這個專案說的會員、客戶、合作案，到底是不是同一種東西」。</p>

<h3 id="3-to-spec把已經談妥的內容保存下來">3. <code class="language-plaintext highlighter-rouge">/to-spec</code>：把已經談妥的內容保存下來</h3>

<p><code class="language-plaintext highlighter-rouge">/to-spec</code> 不負責繼續腦力激盪。它的工作是把剛才已經談妥的內容整理成一份 Spec，讓工作跨越 Context Window 之後仍然不至於失憶。</p>

<p>如果工作一個 Session 就做得完，其實可以跳過。每多一層文件，就多一次模型把原意整理歪掉的機會。文件不是愈多愈專業，能維持決策才有價值。</p>

<h3 id="4-to-tickets切成-agent-吃得下的垂直工作">4. <code class="language-plaintext highlighter-rouge">/to-tickets</code>：切成 Agent 吃得下的垂直工作</h3>

<p><code class="language-plaintext highlighter-rouge">/to-tickets</code> 會把 Spec 拆成帶有相依關係的 Ticket，每張 Ticket 盡量是一個能展示、能測試、能獨立完成的垂直切片。</p>

<p>這一步很適合讓人審查。Ticket 太碎會造成管理成本，太大則會把 Agent 推進 Context Window 的「笨區」。先看切法再批准，比讓五個 Agent 同時開工後才發現拆錯便宜很多。</p>

<h3 id="5-implement按照既定決策實作">5. <code class="language-plaintext highlighter-rouge">/implement</code>：按照既定決策實作</h3>

<p><a href="https://www.aihero.dev/skills-implement"><code class="language-plaintext highlighter-rouge">/implement</code></a> 接受已經確定的 Spec、Ticket，或同一段對話裡剛談妥的小型計畫。它會執行 TDD、型別檢查與 Code Review，最後 Commit 到目前 Branch。<a href="https://www.aihero.dev/skills-implement">[5]</a></p>

<p>這個「最後 Commit」不是小細節。執行前先確認 Branch，也建議把 Skill 改成 Commit 前停下來，讓人看過 Diff 與測試結果再決定。能自動 Commit 是能力，不代表每次都該自動 Commit。</p>

<h3 id="6-improve-codebase-architecture找出值得重構的地方">6. <code class="language-plaintext highlighter-rouge">/improve-codebase-architecture</code>：找出值得重構的地方</h3>

<p>這個 Skill 會掃描近期常變動的程式碼，尋找可以把複雜度藏進更小介面的 Deep Module 候選，然後產生一份 HTML 報告。</p>

<p>它只負責調查與提出候選，不直接改程式碼。這個界線我很喜歡：先看哪裡值得投資，再另外開 Session 做設計與實作，避免 Agent 一看到「改善架構」就把半個 Repository 翻修一遍。</p>

<div class="article-part"><span class="article-part-num">三</span><span class="article-part-title">實際跑一次，以及還沒解決的事</span></div>

<h2 id="實際操作範例">實際操作範例</h2>

<p>假設我們要替一個個人網站增加「顧問適配診斷」，讓訪客先回答幾個問題，再決定是否進入付費需求診斷。</p>

<h3 id="第一步先釐清不准寫-code">第一步：先釐清，不准寫 Code</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/grill-me
我要替個人網站新增顧問適配診斷。請先追問目標客群、排除條件、輸入、輸出、成功條件與隱私風險，不要開始實作。
</code></pre></div></div>

<p>如果討論後發現只是單頁、小資料量、無登入，也許一個 Session 就做得完。這時可以在同一段對話輸入：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/implement
依照剛才談妥的內容實作，但不要自動 Commit；完成後先提供 Diff、測試與瀏覽器驗證結果。
</code></pre></div></div>

<h3 id="第二步工作變大就保存成-spec">第二步：工作變大，就保存成 Spec</h3>

<p>如果需求包含後台、Email、付款狀態、權限、資料保存與多個整合點，就不要硬塞在同一個 Session。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/grill-with-docs
/to-spec
/to-tickets
</code></pre></div></div>

<p>先審查 Spec，再審查 Ticket 是否為垂直切片、依賴是否合理。確認之後，開乾淨 Session，一次只實作一張 Ticket：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/implement #42
</code></pre></div></div>

<h3 id="第三步每一張-ticket-都要重新驗證">第三步：每一張 Ticket 都要重新驗證</h3>

<p>不能因為上一張 Ticket 做對，就假設下一張也會對。每次至少檢查：</p>

<ul>
  <li>Acceptance Criteria 是否真的滿足</li>
  <li>測試是不是從失敗開始，而不是事後補一個永遠會綠的測試</li>
  <li>Diff 是否超出 Ticket 範圍</li>
  <li>瀏覽器或外部系統狀態是否真的改變</li>
  <li>Code Review 發現的問題是否已處理，而不是只產生報告</li>
</ul>

<p>Agent 說「完成」，只代表它停止輸出了。驗證完成，才是真的完成。</p>

<h2 id="這套流程還沒有解決什麼">這套流程還沒有解決什麼</h2>

<p>這套 Skills 很紅，但還不到可以整包搬進團隊、從此高枕無憂。</p>

<h3 id="追問可能太久">追問可能太久</h3>

<p><code class="language-plaintext highlighter-rouge">/grill-me</code> 官方文件把四輪共 46 題視為普通情況。對大型產品決策可能值得，對小功能就很容易把需求澄清做成口試。<a href="https://www.aihero.dev/skills-grill-me">[4]</a></p>

<p>我會把它改成：每輪最多 3 到 5 個最高槓桿問題；遇到必須看介面、資料或原型才能回答的問題，就停止聊天，先做 Throwaway Prototype。</p>

<h3 id="文件可能漂移">文件可能漂移</h3>

<p><code class="language-plaintext highlighter-rouge">/grill-with-docs</code> 會持續寫入 <code class="language-plaintext highlighter-rouge">CONTEXT.md</code> 與 ADR。官方文件自己也承認，它比較像單一維護者模式；多人同時使用，文件可能過時、互相矛盾，或把不同主題混在一起。<a href="https://www.aihero.dev/skills-grill-with-docs">[6]</a></p>

<p>共同文件必須有 Owner、審查節奏與可自動檢查的 Link／Citation Linter。不然 Shared Context 最後只是另一份沒人敢刪的祖傳文件。</p>

<h3 id="implement-不會替你管理整個交付生命週期"><code class="language-plaintext highlighter-rouge">/implement</code> 不會替你管理整個交付生命週期</h3>

<p>它不會自動建立 Branch、關閉 Ticket、勾選 Acceptance Criteria，也不會自動修掉 Code Review 的所有問題。這些都還是團隊流程要補上的部分。<a href="https://www.aihero.dev/skills-implement">[5]</a></p>

<p>更危險的是，在同一個 Checkout 平行跑多個 <code class="language-plaintext highlighter-rouge">/implement</code> Session，可能互相踩 Git Index、Stash 與 HEAD。要平行工作，至少使用獨立 Worktree，並把每個 Agent 的 Branch、目錄與權限隔離。<a href="https://www.aihero.dev/skills-implement">[5]</a></p>

<h3 id="安全掃描不等於值得信任">安全掃描不等於值得信任</h3>

<p>skills.sh 顯示 <code class="language-plaintext highlighter-rouge">/grill-me</code> 通過 Gen Agent Trust Hub、Socket 與 Snyk 檢查，Repository 也採 MIT 授權、內容公開可讀。<a href="https://github.com/mattpocock/skills">[3]</a><a href="https://www.skills.sh/mattpocock/skills">[7]</a> 這些都比來路不明的 Prompt 壓縮包好很多。</p>

<p>但第三方 Skill 可以影響檔案、Git、Issue Tracker，甚至帶著 Agent 呼叫更多工具。正式導入前仍然要逐檔審查、Pin 版本、限制權限，並先放到非敏感的個人或沙盒 Repository 測試。</p>

<p>把一個 Skill 裝進高權限 Agent，跟把一句提示詞貼進聊天視窗，風險不是同一個等級。</p>

<div class="article-part"><span class="article-part-num">四</span><span class="article-part-title">帶進團隊與最後判斷</span></div>

<h2 id="團隊要怎麼導入">團隊要怎麼導入</h2>

<p>如果要在團隊推這套方法，我不會從「請大家安裝 29 個 Skills」開始。那不是導入，是把選擇困難分發給每一個人。</p>

<p>比較合理的 Pilot 是：</p>

<ol>
  <li>選一個低風險、範圍清楚、兩週內可完成的需求</li>
  <li>只導入精簡版 <code class="language-plaintext highlighter-rouge">/grill-me</code> 或 <code class="language-plaintext highlighter-rouge">/grill-with-docs</code></li>
  <li>共同審查一份 Spec 與 Ticket 切法</li>
  <li>用 TDD、Code Review 與瀏覽器／外部狀態驗證完成一條流程</li>
  <li>記錄澄清次數、需求重工、Review Defect、交付時間與人工介入點</li>
  <li>回顧哪些規則值得留下，改寫成團隊自己的 Skill</li>
</ol>

<p>真正的目標不是「全員使用 Matt Pocock 的原版 Skills」，而是讓團隊開始把自己的工程判斷寫成共同資產。</p>

<p>因為別人的 Markdown 再好，也不會自動理解你的產品、風險、命名、權限與組織現實。</p>

<h2 id="最後判斷主流的會是-skill不一定是這一套-skill">最後判斷：主流的會是 Skill，不一定是這一套 Skill</h2>

<p>我認為 Matt Pocock 的 Skills 會紅，不只是因為他在 TypeScript 與 AI Coding 圈有影響力，而是它踩中了模型能力提高之後的真正問題。</p>

<p>模型愈來愈會做，團隊反而更需要知道：現在該做什麼、做到哪裡、誰能批准、完成如何證明。</p>

<p>未來主流的 Agent 使用方式，應該不會是每個人各自收藏一百條神奇 Prompt；而是公司、團隊與個人把重要的做事方法，整理成可讀、可版本控制、可稽核、可驗證的 Skills。</p>

<p>Matt 這套不會是唯一答案。它有太多追問、文件漂移、Git 自動化與平行工作的邊角仍要修。</p>

<p>但方向很清楚：</p>

<blockquote>
  <p><strong>模型能力會逐漸商品化，真正拉開差距的，是你把什麼判斷與工程紀律留在系統裡。</strong></p>
</blockquote>

<p>光頭哥不是發明了軟體工程。</p>

<p>他只是很早把那些大家嘴上都說重要、實際上常常懶得做的事情，寫成 Agent 真的會照著走的流程。</p>

<p>這就已經很有價值了。</p>

<p><small>封面為 AI 生成概念圖，用於表達人類工程師透過 Skills 引導 AI Coding 工作流，不代表 Matt Pocock、AI Hero 或相關工具的官方視覺與合作背書。</small></p>

<hr />

<h2 id="參考資料">參考資料</h2>

<p>[1] <a href="https://www.aihero.dev/skills/for-your-team">https://www.aihero.dev/skills/for-your-team</a> — AI Skills for Real Engineering Teams</p>

<p>[2] <a href="https://docs.google.com/presentation/d/12WTK21TZQrTffYdZg206dWuy_CWICD7Eud8pZVWzItA/edit">https://docs.google.com/presentation/d/12WTK21TZQrTffYdZg206dWuy_CWICD7Eud8pZVWzItA/edit</a> — Skills for Real Engineers 簡報</p>

<p>[3] <a href="https://github.com/mattpocock/skills">https://github.com/mattpocock/skills</a> — mattpocock/skills</p>

<p>[4] <a href="https://www.aihero.dev/skills-grill-me">https://www.aihero.dev/skills-grill-me</a> — The /grill-me Skill</p>

<p>[5] <a href="https://www.aihero.dev/skills-implement">https://www.aihero.dev/skills-implement</a> — The /implement Skill</p>

<p>[6] <a href="https://www.aihero.dev/skills-grill-with-docs">https://www.aihero.dev/skills-grill-with-docs</a> — The /grill-with-docs Skill</p>

<p>[7] <a href="https://www.skills.sh/mattpocock/skills">https://www.skills.sh/mattpocock/skills</a> — mattpocock/skills on skills.sh</p>]]></content><author><name></name></author><category term="technical" /><category term="ai-agent" /><category term="ai-coding" /><category term="agent-skills" /><category term="matt-pocock" /><category term="claude-code" /><category term="codex" /><category term="software-engineering" /><summary type="html"><![CDATA[完整解析 Matt Pocock 的 AI Coding Skills：從需求追問、共同語言、規格與垂直切票，到 TDD、Code Review 與團隊導入風險。]]></summary></entry><entry><title type="html">AI Agent 真的開始替你管錢了：Coinbase for Agents 之後，最重要的不是自動交易</title><link href="https://swanky.github.io/technical/ai-agent-wallet-permission-boundaries/" rel="alternate" type="text/html" title="AI Agent 真的開始替你管錢了：Coinbase for Agents 之後，最重要的不是自動交易" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-agent-wallet-permission-boundaries</id><content type="html" xml:base="https://swanky.github.io/technical/ai-agent-wallet-permission-boundaries/"><![CDATA[<p>今天早上收到一封區塊鏈電子報，標題大意是：AI 代理現在有自己的帳戶，可以交易，也可以付款。</p>

<p>我第一個反應不是興奮，而是先查日期。</p>

<p>結果有點微妙。Coinbase for Agents 並不是 8 月 6 日才上線，它在 6 月 11 日就已經推出；8 月 6 日真正的新消息，是 MetaMask 把 Agent Wallet 的早期存取計畫正式推到檯面上。</p>

<p>這兩件事放在一起看，反而比單一產品新聞更有意思。</p>

<p>兩個月前，我在<a href="/technical/ai-agent-payments-web3/">〈等 AI Agent 開始自己付錢，它們就會回頭找上 Web3〉</a>裡寫過：當 Agent 開始呼叫付費 API、購買資料、搬動資產，Web3 才會從「隔壁產業的基礎建設」變成 AI 真正需要的支付與信任軌道。</p>

<p>現在這件事已經不只停在協議簡報裡。</p>

<p>但我的結論也比當時更保守：</p>

<blockquote>
  <p><strong>AI Agent 能不能替你交易，已經不是最難的問題。真正難的是，它拿得到多少錢、可以碰什麼、什麼情況必須停，以及出事時誰負責。</strong></p>
</blockquote>

<h2 id="先分清楚三種東西">先分清楚三種東西</h2>

<p>「AI 代理有錢包」聽起來像同一件事，實際上至少有三條不同的產品路線。</p>

<h3 id="第一條讓-agent-操作你的交易帳戶">第一條：讓 Agent 操作你的交易帳戶</h3>

<p>Coinbase 官方文件目前把 Coinbase for Agents 定位得很清楚：它透過 CLI 或 MCP，讓 AI Agent 存取 Coinbase Advanced Trade，查價格、預覽訂單、下單與管理投資組合。</p>

<p>這比較接近「把交易所操作介面交給 Agent」，不是直接把一把鏈上私鑰塞進模型。</p>

<p>官方甚至明白建議使用者另外建立一個 Advanced portfolio，只放入願意承擔風險的資金，再把 Agent 權限限制在那個投資組合。API 權限裡的 Transfer 也只允許 Coinbase 內部投資組合之間移動，不允許提領到外部地址。</p>

<p>這個設計看起來不浪漫，卻很務實。</p>

<p>它承認一件事：如果 Agent 做了意料之外的交易，第一個防線不是期待模型突然良心發現，而是先把爆炸半徑縮小。</p>

<h3 id="第二條讓開發者替-agent-建立鏈上金融能力">第二條：讓開發者替 Agent 建立鏈上金融能力</h3>

<p>Coinbase 另一套 CDP CLI／MCP，面向的是開發者。它可以接觸 server wallet、鏈上資料、smart account 與 x402 支付等 CDP 能力。</p>

<p>這跟 Coinbase for Agents 的交易帳戶路線不能混為一談。官方比較頁直接把兩者分開：交易者用 Coinbase CLI／MCP；要建立加密應用的開發者，才使用 CDP CLI／MCP。</p>

<p>其中最值得 AI 圈注意的，仍然是 x402。</p>

<p>它把 HTTP 原本就保留的 <code class="language-plaintext highlighter-rouge">402 Payment Required</code> 變成實際支付流程：Agent 呼叫受保護的 API，伺服器回傳付款要求，Agent 用錢包簽署付款，再帶著付款資訊重送請求。Coinbase 的 quickstart 甚至直接示範讓後端 Agent 用 Base 測試網上的測試 USDC 購買 API。</p>

<p>這不是「AI 會用信用卡」的漂亮說法而已。它讓資料、推論、研究報告與線上服務，都可能被切成 Agent 可以自行發現、購買與結算的機器資源。</p>

<h3 id="第三條給-agent-一個自託管錢包">第三條：給 Agent 一個自託管錢包</h3>

<p>MetaMask 8 月 6 日公布的 Agent Wallet，則往另一個方向走。</p>

<p>它是專為 AI Agent 設計的自託管錢包，透過 CLI 接上 Claude Code、OpenAI Codex、Hermes Agent 等代理環境，初期支援 EVM 鏈與 Hyperliquid 上的兌換、永續合約、預測市場與流動性操作。</p>

<p>但它真正有價值的部分，不是支援多少 DeFi 功能，而是把「可以做」和「被允許做」拆開。</p>

<p>預設的 Guard Mode 允許使用者設定每日支出上限、協議白名單與策略規則。交易若超出邊界，就暫停並等待 2FA 人工核准。MetaMask 也表示，每筆交易會經過模擬、威脅掃描與 MEV 保護；另有 Beast Mode 減少中斷，但惡意交易的安全檢查仍不會被關掉。</p>

<p>名字有點中二，架構倒是很誠實：自主性不是開或關，而是分級授權。</p>

<h2 id="真正的產品不是錢包是-permission-layer">真正的產品不是錢包，是 Permission Layer</h2>

<p>如果只看新聞標題，很容易把焦點放在「AI 終於能自己交易」。</p>

<p>但交易 API、MCP、CLI、錢包和模型，早就不是最稀缺的東西。真正稀缺的是一套不靠 Prompt 自律的權限系統。</p>

<p>我在<a href="/technical/production-ai-agent-control-planes/">〈可上線的 AI Agent，不是更會自主〉</a>裡把 Permission Layer 拆成幾個問題：誰在行動、能用哪些工具、能碰哪些資源、動作風險多高、是否需要核准，以及完成後留下什麼收據。</p>

<p>放到 Agentic Finance，這套問題會更具體：</p>

<ol>
  <li><strong>資金隔離：</strong> Agent 操作的是專用投資組合或小額錢包，還是整個主帳戶？</li>
  <li><strong>資產範圍：</strong> 它只能碰 USDC、BTC，還是任何被包裝成代幣的東西？</li>
  <li><strong>動作範圍：</strong> 可以查詢、預覽、下單、授權合約、轉帳，還是連外部提領都開放？</li>
  <li><strong>額度與頻率：</strong> 單筆、單日、單一 session 的上限是多少？連續失敗幾次要停？</li>
  <li><strong>對手方與協議：</strong> 只能進白名單市場，還是 Agent 自己找到什麼合約都能簽？</li>
  <li><strong>核准：</strong> 高風險動作是否綁定精確金額、資產、目的地與到期時間？內容改了要不要重批？</li>
  <li><strong>證據：</strong> 執行後是否留下交易 ID、簽名內容、政策版本、模型提案與人類核准紀錄？</li>
  <li><strong>對帳與復原：</strong> Agent 說付款完成，鏈上和帳戶餘額真的改了嗎？逾時重試會不會付兩次？</li>
</ol>

<p>這八題只要有一題的答案是「我們有在 System Prompt 叫它小心」，那就還不能算安全邊界。</p>

<p>Prompt 是行為建議，不是保險箱。</p>

<h2 id="區塊鏈替-agent-解決了什麼又沒解決什麼">區塊鏈替 Agent 解決了什麼，又沒解決什麼</h2>

<p>Agentic Finance 之所以會回頭找上 Web3，不只是因為加密貨幣比較潮。</p>

<p>鏈上系統有幾個天然適合機器的特性：全天候運作、可程式化、結算快速、交易收據可驗證，以及不必替每個 Agent 申請一張塑膠卡。對高頻、小額、跨服務的 API 支付，這些確實比傳統卡片軌道自然。</p>

<p>但區塊鏈不會自動把錯誤判斷變正確。</p>

<p>它能證明某筆交易真的發生過，不能證明那筆交易本來就該發生；智能合約能忠實執行簽名，也可能忠實地把你的錢送進惡意合約；不可竄改的收據有利於稽核，卻也代表執行錯誤之後，通常沒有一個客服按鈕能把狀態倒帶。</p>

<p>Web3 解決的是可執行與可驗證，不是替人消滅責任。</p>

<h2 id="如果是我做-pilot我會先把-agent-綁得很不自由">如果是我做 pilot，我會先把 Agent 綁得很不自由</h2>

<p>AI 產品展示喜歡把「自主」當成能力上限。真的碰到錢，我反而會從最低權限開始。</p>

<h3 id="第一階段只讀與提案">第一階段：只讀與提案</h3>

<p>Agent 可以查餘額、價格與市場資料，產生交易提案，但不能簽名，也不能下單。先評估它選的資料、推理路徑、風險標記與建議品質。</p>

<h3 id="第二階段小額隔離白名單">第二階段：小額、隔離、白名單</h3>

<p>使用專用 portfolio 或測試錢包，只放可承受損失的小額資金；限制資產、協議、單筆與每日上限；禁止外部提領。每次執行前先預覽交易，執行後回讀外部狀態並對帳。</p>

<h3 id="第三階段開放低風險自動執行">第三階段：開放低風險自動執行</h3>

<p>只有通過足夠測試、錯誤率與事件回顧的固定流程，才允許低額自動化。高額、陌生合約、新目的地、槓桿與策略邊緣情況，仍然進人工核准。</p>

<h3 id="第四階段用事故來驗收不用順利-demo-來驗收">第四階段：用事故來驗收，不用順利 Demo 來驗收</h3>

<p>故意測試行情劇烈波動、API 逾時、重複回應、價格滑點、惡意合約、錯誤鏈別、政策版本變更與人類逾時未核准。Agent 能在該停的地方停下來，比它在順風時完成十筆交易更有價值。</p>

<p>這聽起來不夠「全自主」。</p>

<p>很好。錢包不是拿來替產品簡報製造高潮的。</p>

<h2 id="對企業真正有價值的不一定是自動炒幣">對企業真正有價值的，不一定是自動炒幣</h2>

<p>Coinbase 與 MetaMask 的新聞最容易讓人想到交易，但 Agentic Finance 比自動買賣大得多。</p>

<p>比較可控的企業場景可能是：Agent 依預算購買 API 或資料；替全球工作流進行小額穩定幣結算；在固定供應商白名單內支付雲端或數位服務；監控資金部位並提出再平衡建議；或者在財務人員核准後執行重複、規則明確的轉帳。</p>

<p>這些場景的共同點，不是模型多會猜市場，而是事件到結算的路徑可以被縮短，同時每一個權限邊界仍然能被檢查。</p>

<p>所以我會把導入問題從「哪個模型最會交易」改成：</p>

<blockquote>
  <p><strong>哪一條事件到付款／交易完成的流程，值得先縮短；其中哪一個步驟，真的可以安全地交給 Agent？</strong></p>
</blockquote>

<p>如果這題答不出來，先不要急著幫 AI 開戶。</p>

<h2 id="最後判斷agent-有錢不代表-agent-長大了">最後判斷：Agent 有錢，不代表 Agent 長大了</h2>

<p>Coinbase for Agents、CDP、x402 與 MetaMask Agent Wallet 放在一起，已經拼出 Agentic Finance 的基本零件：交易帳戶、鏈上錢包、支付協議、模型工具介面與安全閘門。</p>

<p>我先前說，等 AI Agent 開始自己付錢，它們就會回頭找上 Web3。現在看來，這個方向沒有錯。</p>

<p>但下一步真正決定市場能不能走下去的，不是再多一個「一鍵自動交易」按鈕，而是誰能把隔離、額度、白名單、核准、收據與責任歸屬做成預設值。</p>

<p>AI 可以提出動作，錢包可以簽名，區塊鏈可以結算。</p>

<p>最後仍然要有人把界線畫清楚。</p>

<p>不然所謂的 Agentic Finance，只是把「手滑」升級成可以 24 小時高速執行而已。</p>

<p><small>本文為技術與風險架構分析，不構成投資建議。封面為 AI 生成概念圖，用於說明資金隔離、權限閘門與人工核准，不是 Coinbase 或 MetaMask 的產品介面或合作背書。</small></p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://www.coinbase.com/zh-tw/blog/coinbase-for-agents">Coinbase：Coinbase for Agents</a></li>
  <li><a href="https://docs.cdp.coinbase.com/coinbase-for-agents/overview">Coinbase Developer Documentation：Coinbase for Agents（CLI／MCP）</a></li>
  <li><a href="https://docs.cdp.coinbase.com/get-started/build-with-ai/comparing-agentic-tools">Coinbase Developer Documentation：Comparing our Agentic Tools</a></li>
  <li><a href="https://docs.cdp.coinbase.com/x402/buyer/quickstart">Coinbase Developer Documentation：x402 Buyer Quickstart</a></li>
  <li><a href="https://metamask.io/news/introducing-metamask-agent-wallet">MetaMask：Introducing MetaMask Agent Wallet（2026-08-06）</a></li>
  <li><a href="https://www.blocktempo.com/coinbase-agents-ai-trading-payments-mcp-cli-agentkit-x402/">動區動趨：Coinbase for Agents 正式上線（2026-06-12）</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="ai-agent" /><category term="web3" /><category term="coinbase" /><category term="metamask" /><category term="x402" /><category term="agentic-finance" /><category term="agent-governance" /><summary type="html"><![CDATA[Coinbase for Agents 與 MetaMask Agent Wallet 讓 AI 代理從建議者變成金融執行者。真正值得看的不是自動交易，而是資金隔離、額度、白名單、人工核准與交易收據如何成為硬邊界。]]></summary></entry><entry><title type="html">假世界資產，不是假資產：FWA 如何把 NFT 流動性做成一台鏈上扭蛋機</title><link href="https://swanky.github.io/technical/fake-world-assets-fwa-deep-dive/" rel="alternate" type="text/html" title="假世界資產，不是假資產：FWA 如何把 NFT 流動性做成一台鏈上扭蛋機" /><published>2026-07-25T00:00:00+00:00</published><updated>2026-07-25T00:00:00+00:00</updated><id>https://swanky.github.io/technical/fake-world-assets-fwa-deep-dive</id><content type="html" xml:base="https://swanky.github.io/technical/fake-world-assets-fwa-deep-dive/"><![CDATA[<p>想像一台透明扭蛋機。</p>

<p>裡面不是塑膠玩具，而是 CryptoPunk、無聊猿、Azuki、Pudgy Penguin、Doodles 與 Meebits。每一枚 NFT 後面還鎖著一筆 ETH。你付錢按下按鈕，Chainlink VRF 幫你抽出其中一個部位，然後你再決定：留下 NFT，或把它賣回原存款人。</p>

<p>這聽起來很像賭場把 DeFi 穿在身上。</p>

<p>但如果只停在「NFT 抽卡」，反而低估了 Fake World Assets，簡稱 FWA，真正有意思的地方。它把 NFT 做市、隨機分配、預先資助的買回報價、手續費與代幣補貼，塞進同一個交易流程。</p>

<p>我不是完全站在場外看熱鬧的人。2021 年，我曾把自己的制服女孩攝影做成 NFT，也一路做過 UCX／Uniform CloneX。幾年後回頭看，NFT 最難的從來不是「能不能發」，而是發完以後，誰願意買、怎麼成交，以及流動性退掉後還剩下什麼。</p>

<p>FWA 正面處理了這個老問題，只是它用的方法非常 Web3：<strong>如果每一枚 NFT 都很難各自找到買家，那就不要讓買家選。</strong></p>

<p>我的結論先放前面：FWA 的市場設計值得拆解，但不能把精巧的機制，直接翻譯成值得重押的投資結論。</p>

<p><em>資料與協議參數截點：2026 年 7 月 25 日。本文依 FWA 官方文件與公開合約說明整理，不構成投資建議。</em></p>

<h2 id="從-rwa-到-fwa這個名字本身就在唱反調">從 RWA 到 FWA：這個名字本身就在唱反調</h2>

<p>過去幾年，加密市場一直在談 RWA，也就是現實世界資產。國債、股票、黃金、不動產與應收帳款被搬上鏈，目標是把現實世界的所有權、現金流與結算活動，接進 24 小時不停機的鏈上金融。</p>

<p>Fake World Assets 故意往反方向走。</p>

<p>它不把房子或債券搬上鏈，也不靠倉庫替一張實體收藏卡背書。它使用的原料本來就出生在鏈上：NFT、ETH、智能合約、隨機數與代幣。</p>

<p>所以這裡的「Fake」不是偽造，更不是替詐騙開脫，而是對 RWA 敘事的一次反向命名。RWA 想證明區塊鏈能容納現實資產；FWA 則反問：<strong>加密原生資產一定要長得像傳統金融，才配被當成資產嗎？</strong></p>

<p>官方文件顯示，主網上線時的許可清單共有 16 個系列，包括 CryptoPunks 721、Milady Maker、Bored Ape Yacht Club、Azuki、Doodles、CrypToadz、Pudgy Penguins、Meebits、Checks、VeeFriends、mfers 與 DeadFellaz 等。核心協議本身不依賴特定系列，但新部位能否進場，仍受當下鏈上白名單設定影響。</p>

<p>更準確地說，FWA 不是一種新 NFT。它創造的是一種新的市場部位：</p>

<blockquote>
  <p><strong>NFT ＋ ETH 擔保金 ＋ 被抽中的機率 ＋ 一個預先寫好的買回承諾。</strong></p>
</blockquote>

<h2 id="先拆掉扭蛋機的外殼">先拆掉扭蛋機的外殼</h2>

<p>FWA 的基本流程可以拆成四步。</p>

<ol>
  <li>存款人把一枚支援的 ERC-721 NFT 與一筆 ETH 一起鎖進協議，形成獨立部位。</li>
  <li>ETH 擔保金同時決定抽中權重，並替存款人預先資助一個不可撤回的常駐買價。</li>
  <li>抽卡者支付由獎池計算出的 acquisition price，加上獨立的 VRF 服務費；Chainlink VRF 提供隨機數，請求依建立順序結算。</li>
  <li>抽中後，使用者可以留下 NFT、帶著新擔保金直接重新上架，或接受原存款人的買價，以 ETH 或 FWA 代幣結算。</li>
</ol>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="/assets/img/fake-world-assets-fwa-deep-dive/fwa-position-lifecycle.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/fake-world-assets-fwa-deep-dive/fwa-position-lifecycle.svg" alt="FWA 部位生命週期：存款人鎖入 NFT 與 ETH 擔保金，抽卡者支付獎池價格，由 Chainlink VRF 依擔保金倒數權重抽出部位，最後只能留下 NFT、重新上架，或接受存款人的常駐買價" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖一：FWA 不是把 NFT 和免費 ETH 一起送出，而是把 NFT、機率與預先資助的退出報價綁在同一個部位；點圖可開啟原尺寸</figcaption>
</figure>

<p>概念拆開之後，再看實際產品會比較清楚。FWA 的獎池不是一排待售商品，而是一圈同時帶著擔保金、稀有度與抽中機率的部位；抽卡者買的是整個池子的隨機分配，不是點名其中一張。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="https://www.bankless.com/read/a-beginners-guide-to-fake-world-assets" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/fake-world-assets-fwa-deep-dive/bankless-fwa-pool-interface.png" alt="FWA 實際獎池介面，中央以弧形卡片展示 NFT 部位，右側顯示購買操作與近期活動" loading="lazy" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">FWA 實際獎池介面：每張卡片同時呈現擔保金、稀有度與抽中機率，右側則是購買操作與近期活動。介面截圖來源：<a href="https://www.bankless.com/read/a-beginners-guide-to-fake-world-assets" target="_blank" rel="noopener noreferrer">Bankless〈A Beginner's Guide to Fake World Assets〉</a>；著作權歸原作者及平台所有，本文為評論與機制說明引用。</figcaption>
</figure>

<p>這使 FWA 落在幾種產品的交界處。</p>

<p>它不是一般 NFT 市場，因為買方不能指定要哪一枚；它不只是抽獎，因為抽中後還有保留、重掛與賣回等選項；它也不是普通質押，因為存款人鎖入的不只資金，還有一枚可能被別人帶走的 NFT。</p>

<p>它比較像一個<strong>用隨機分配取代指定成交的 NFT 流動性市場</strong>。</p>

<h2 id="66-eth-不是附贈獎金而是一扇退出門">66 ETH 不是附贈獎金，而是一扇退出門</h2>

<p>FWA 最容易讓人看錯的詞，是「backed by ETH」。</p>

<p>假設某枚 CryptoPunk 背後放了 66 ETH。這不代表抽中後能同時抱走 Punk 與 66 ETH。那筆 ETH 是原存款人的擔保金，也是他事先放進合約的買回資金。</p>

<p>抽中者留下 CryptoPunk，原存款人就拿回擔保金；抽中者若不想留下，則可接受常駐買價，把 NFT 賣回原存款人。</p>

<p>依官方目前列出的預設 85% depositor bid rate，66 ETH 對應的買回結算是 56.1 ETH。使用者也可以讓同一筆結算金額透過協議買進 FWA，改領代幣。</p>

<p>兩邊不能一起拿。</p>

<figure style="margin:2em auto;text-align:center;max-width:1000px;">
  <a href="https://www.bankless.com/read/a-beginners-guide-to-fake-world-assets" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/fake-world-assets-fwa-deep-dive/bankless-fwa-settlement-options.png" alt="FWA 抽中 NFT 後的實際結算介面，可選擇留下 NFT、重新存入、接受 ETH 或改領 FWA 代幣" loading="lazy" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">抽中後的實際結算介面：留下 NFT、重新存入、接受 ETH，或把相同結算金額換成 FWA。這張圖也直接呈現「NFT 與擔保金不能一起拿」。介面截圖來源：<a href="https://www.bankless.com/read/a-beginners-guide-to-fake-world-assets" target="_blank" rel="noopener noreferrer">Bankless〈A Beginner's Guide to Fake World Assets〉</a>；著作權歸原作者及平台所有，本文為評論與機制說明引用。</figcaption>
</figure>

<p>從金融結構看，抽中者得到的不是「NFT 加現金」，而是 NFT 加上一個內嵌的退出選項。存款人則站在另一側：他承諾在抽中者不要 NFT 時，以事先鎖好的資金把它買回。</p>

<p>這就是 FWA 的雙向報價：</p>

<ul>
  <li>NFT 被帶走，存款人取回擔保金，扣除預設 1% 的 protocol settlement cut；</li>
  <li>NFT 被退回，存款人取回 NFT，抽中者取得預設 85% 擔保價值；</li>
  <li>其餘折價預設留給協議，但管理參數可以改成分給存款人。</li>
</ul>

<p>所以擔保金不是越高越神，也不是越低越划算。比較合理的設定，是一個兩種結果發生時，存款人都能接受的價位。</p>

<h2 id="真正精巧的地方是低價部位決定票價">真正精巧的地方，是低價部位決定票價</h2>

<p>一般抽獎只要放進一個超高價頭獎，票價就得跟著上升，否則期望值會失控。</p>

<p>FWA 的處理方式，是讓抽中權重與擔保金成反比：</p>

<blockquote>
  <p><strong>weightᵢ = K ÷ backingᵢ</strong></p>
</blockquote>

<p>擔保金越低，權重越高，越容易被抽中；擔保金越高，權重越低，通常會在池中停留更久。</p>

<p>每一抽的期望擔保價值，等於池內擔保金的調和平均數。再乘上預設 10% surcharge，才得到 pool acquisition fee；另外還有 VRF 服務費、Gas 與可能的滑價。</p>

<p>這裡的調和平均數很重要。它對小數值特別敏感，因此大量低擔保部位會壓住每一抽的價格；少數高擔保 Punk 很搶眼，卻因為權重極低，不會等比例把票價推上去。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="/assets/img/fake-world-assets-fwa-deep-dive/fwa-inverse-weight-pricing.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/fake-world-assets-fwa-deep-dive/fwa-inverse-weight-pricing.svg" alt="FWA 倒數權重與調和平均定價範例：0.05、0.5、5 ETH 三個部位的抽中機率約為 90.09%、9.01%、0.90%，調和平均擔保金約 0.135 ETH，加上預設 10% 後約為 0.149 ETH" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖二：作者簡化試算，假設池中只有三個部位；未含 VRF 服務費、Gas、滑價與池子變動，並非即時報價</figcaption>
</figure>

<p>用圖中的簡化池來看，0.05、0.5 與 5 ETH 三個部位，抽中機率約為 90.09%、9.01% 與 0.90%。三者的算術平均是 1.85 ETH，但調和平均只有約 0.135 ETH；加上 10% 後，pool acquisition fee 約 0.149 ETH。</p>

<p>那枚 5 ETH 部位讓畫面看起來很豪華，真正決定大多數人會抽到什麼的，卻是 0.05 ETH 那一區。</p>

<p>巨額擔保金沒有免費增加玩家的期望值。它主要增加的是<strong>敘事張力</strong>。</p>

<p>頭獎負責吸引目光，倒數權重負責讓數學不要破產。這就有點像把一座金光閃閃的城堡放在遠方，再把通往城堡的橋做得比頭髮還細。</p>

<h2 id="存款人是莊家嗎只說一半">存款人是莊家嗎？只說一半</h2>

<p>FWA 常把存款人描述成站在莊家那一側。這個比喻好懂，卻容易讓人誤以為存款人天然占優勢。</p>

<p>官方費用設計是：每次 acquisition fee 扣掉協議抽成與 crown tithe 後，平均分給所有有效部位。每個部位當下拿到的份額相同，跟它背後放 0.05 ETH 還是 5 ETH 無關。</p>

<p>差異發生在時間。</p>

<p>高擔保部位比較難被抽中，通常能留在池中更久，累積更多次費用與代幣獎勵；低擔保部位容易快速離場。若池子在簡化期間保持不變，某部位的預期存活抽數會隨擔保金增加，於是「每抽分得相同」與「高擔保活得更久」組合起來，才形成官方所說的平均生命週期收益。</p>

<p>但期望值不是保固書。</p>

<p>理論上應停留一百抽的 NFT，仍可能第一抽就被選中。部位一結束，後面的手續費、FWA 排放與 top deposit reward 機會也一起消失。</p>

<p>存款人賺的不是固定利息，而是在承擔一場時間樂透。抽卡者賭抽中哪一枚，存款人賭自己的部位何時被抽走。</p>

<p>兩邊只是站在隨機性的不同方向。</p>

<h2 id="loss-to-earn它沒有消滅虧損只是替虧損換了名字">Loss-to-Earn：它沒有消滅虧損，只是替虧損換了名字</h2>

<p>FWA 最會讓人停下來看的詞，大概是 Loss-to-Earn。</p>

<p>假設你花 0.1 ETH 抽卡，卻拿到市場吸引力不高、常駐買價也偏低的 NFT。用 ETH 計價，這次結果可能就是虧損。</p>

<p>FWA 接著提供另一個選項：不要拿 ETH，改把結算金額換成 FWA 代幣。</p>

<p>初始代幣分配中，50% 用來建立 FWA／ETH 市場，30% 進入 15 天排放，20% 用於 v1 snapshot claims。排放的 30% 再平均拆成兩邊：存款人每天取得總供應量 1%，成功抽卡者每天也分 1%，各持續 15 天。</p>

<p>外部買入在初期由管理者控制並預設關閉，但賣出維持開放；一般錢包之間的直接轉帳也受限制。早期代幣因此主要透過實際使用協議取得，而不是讓外部資金直接進場買。</p>

<p>這確實能處理雙邊市場的冷啟動問題：沒有 NFT，抽卡者不來；沒有抽卡者，存款人也沒有理由鎖資產。代幣同時補貼兩邊，先把供給與需求叫進房間。</p>

<p>但「領到 FWA」不等於「已經回本」。</p>

<p>你只是把一筆較明確的 ETH 結算價值，換成尚在價格發現中的代幣曝險。外部買入受限甚至讓初期價格更難被當成自然市場需求的證據。</p>

<p>Loss-to-Earn 沒有把損失擦掉。它只是把「這一抽虧了」重新敘述成「我取得一個早期代幣部位」。</p>

<p>這不是魔法，是風險轉換。</p>

<h2 id="真正的考試是排放結束與回購開關">真正的考試，是排放結束與回購開關</h2>

<p>任何有代幣補貼的協議，上線初期活動量通常混著三種需求：真的喜歡產品、想追稀有 NFT，以及單純想拿排放。</p>

<p>補貼存在時，很難分辨誰是誰。</p>

<p>FWA 的第一場壓力測試，是 15 天排放結束後，使用者還願不願意用 ETH 抽卡。若抽卡量下降，存款人分到的費用減少；存款人撤出後，獎池數量與品質下降；池子變差，又進一步降低抽卡需求。</p>

<p>正向飛輪很漂亮。反向轉的時候也完全不會客氣。</p>

<p>官方設計了 protocol fee 買回 FWA 的路徑；買回後預設按 40%、40%、20% 分給存款人、抽卡者與銷毀。但官方參數頁同時寫得很清楚：<strong>protocol-fee → FWA 的預設比例是 0%，也就是關閉。</strong></p>

<p>「合約裡有回購函式」和「現在真的有協議收入持續回購」，是兩件完全不同的事。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="/assets/img/fake-world-assets-fwa-deep-dive/fwa-token-economics-stress-test.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/fake-world-assets-fwa-deep-dive/fwa-token-economics-stress-test.svg" alt="FWA 代幣兩階段經濟：初始固定供應量分為 50% 市場、30% 十五天排放與 20% 快照申領；排放後的協議費回購預設為 0%，若啟用則買回代幣預設按 40%、40%、20% 分給存款人、抽卡者與銷毀，真正壓力測試是補貼退潮後抽卡需求能否維持" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖三：代幣補貼可以啟動市場，不能替市場永久製造需求；回購路徑存在，也不代表回購開關已經打開</figcaption>
</figure>

<p>因此，研究 FWA 不能只問「有沒有回購」，而要繼續問：</p>

<ul>
  <li>協議實際產生多少收入？</li>
  <li>protocolFeeToTokenBps 當下是多少？</li>
  <li>買回金額能否承接排放與早期持有人的賣壓？</li>
  <li>external FWA buys 是否開放？市場深度足不足以承受價格發現？</li>
  <li>沒有每日 1% 排放後，抽卡者還願不願意付 ETH？</li>
</ul>

<p>最後一題，才是 FWA 的測謊機。</p>

<h2 id="fwa-真正創新的不是把-nft-變成彩券">FWA 真正創新的，不是把 NFT 變成彩券</h2>

<p>撇開 FWA 代幣價格，我認為這套協議至少留下三個值得研究的方向。</p>

<h3 id="第一它把-nft-流動性問題遊戲化">第一，它把 NFT 流動性問題遊戲化</h3>

<p>傳統市場要求賣家等待某位買家剛好看中自己的 NFT。FWA 不替每一枚 NFT 精準找買家，而是把所有需求集中到同一個池，再用隨機分配把需求散出去。</p>

<p>它沒有直接解決價格發現，而是繞過「買家必須指定商品」這個限制。</p>

<h3 id="第二它把-nft-與報價綁成同一個部位">第二，它把 NFT 與報價綁成同一個部位</h3>

<p>NFT 進入 FWA 後，不再只是收藏品。它同時帶著抽中權重、退出價格、資金占用、費用現金流與隨機終止風險。</p>

<p>這讓 NFT 從靜態物件，變成一份會累積收益、也可能突然結束的金融部位。</p>

<h3 id="第三它把娛樂放進流動性機制而不是放在旁邊">第三，它把娛樂放進流動性機制，而不是放在旁邊</h3>

<p>很多 DeFi 產品像試算表穿上西裝，功能都在，卻沒有讓人想再用一次的理由。</p>

<p>FWA 從相反方向出發：先做成一台讓人手癢的扭蛋機，再把做市、報價、費用、回購與代幣分配藏進齒輪裡。</p>

<p>這也是為什麼，即使 FWA 代幣最後表現普通，它的機制仍可能被別人搬走。隨機分配、預先資助的常駐買價、雙邊補貼與可程式化退出選項，都可以被移植到其他鏈上資產。</p>

<h2 id="投資人真正該看的五種風險">投資人真正該看的五種風險</h2>

<h3 id="一抽卡期望值不是只看擔保金">一、抽卡期望值不是只看擔保金</h3>

<p>公式能精確計算 ETH backing，卻不能替每枚 NFT 算出「今天真的賣得掉的價格」。完整期望值還要納入 NFT 可實現價值、VRF 服務費、Gas、滑價、FWA 獎勵與代幣流動性。</p>

<p>看到有人抽中高價 Punk，只能證明頭獎存在，不能證明平均玩家划算。</p>

<h3 id="二nft-價值是文化市場不是合約變數">二、NFT 價值是文化市場，不是合約變數</h3>

<p>協議知道某個部位放了多少 ETH，不知道市場明天還喜不喜歡那隻猿、那張像素臉或那個企鵝。</p>

<p>數學可以替擔保金定價，不能替品味定價。</p>

<h3 id="三存款人承擔路徑與存活時間風險">三、存款人承擔路徑與存活時間風險</h3>

<p>高擔保只能降低被抽中的機率，不能保證部位活到平均壽命。早抽中會提早終止費用與代幣累積；新部位持續進場，也會稀釋每個有效部位分到的費用。</p>

<h3 id="四fwa-代幣承擔不對稱的價格發現">四、FWA 代幣承擔不對稱的價格發現</h3>

<p>初期外部買入預設關閉、賣出保持開放，排放又集中在 15 天。這能塑造取得路徑，卻不能保證代幣具有足以承接賣壓的自然需求。</p>

<p>領到多少顆代幣，和最後能換回多少 ETH，是兩個問題。</p>

<h3 id="五保管安全不等於經濟政策不會變">五、保管安全不等於經濟政策不會變</h3>

<p>官方文件表示，管理者不能拿走存款人的 NFT 與擔保金，但可以暫停部分操作、調整經濟參數、管理外部買入與申領閘門、改變未來費用流向。</p>

<p>資產是否會被直接拿走，與遊戲規則會不會改，是兩個不同層次的風險。前者受限制，不代表後者不存在。</p>

<h2 id="我會怎麼觀察這台扭蛋機">我會怎麼觀察這台扭蛋機</h2>

<p>如果要判斷 FWA 是短期代幣活動，還是一種能留下來的 NFT 市場，我不會先看社群有多興奮，而會看這六個訊號：</p>

<table>
  <thead>
    <tr>
      <th>訊號</th>
      <th>真正要回答的問題</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>排放結束後的 acquisition 次數</td>
      <td>沒有每日獎勵，還有人願意付費嗎？</td>
    </tr>
    <tr>
      <td>活躍部位數與擔保金分布</td>
      <td>池子是變深，還是只靠少數頭獎撐畫面？</td>
    </tr>
    <tr>
      <td>新增與撤出系列的品質</td>
      <td>流動性增加時，有沒有一起引入更多低吸引力 NFT？</td>
    </tr>
    <tr>
      <td>ETH 結算與 FWA 結算比例</td>
      <td>使用者是在使用退出報價，還是在追逐代幣曝險？</td>
    </tr>
    <tr>
      <td>protocolFeeToTokenBps 與實際買回</td>
      <td>回購是白皮書裡的可能性，還是鏈上正在發生的現金流？</td>
    </tr>
    <tr>
      <td>FWA／ETH 市場深度與外部買入狀態</td>
      <td>帳面價格能不能承受真實賣壓？</td>
    </tr>
  </tbody>
</table>

<p>這些數據不會像「某人一抽中 Punk」那麼好傳播，但比較接近協議能不能活下去的答案。</p>

<h2 id="結論值得拆解不值得浪漫化">結論：值得拆解，不值得浪漫化</h2>

<p>FWA 是一套很有創意的市場機制。</p>

<p>它把 NFT 抽卡、流動性提供、內嵌買回報價、代幣排放與協議收入，整合成一個讓人想按下去的產品。它甚至把 NFT 市場最尷尬的問題——沒人剛好想買你手上那一枚——改寫成「反正你也不能選」。</p>

<p>很荒謬，但也真的很聰明。</p>

<p>只是創意不等於低風險，熱鬧也不等於可持續。對參與者來說，比較務實的做法，是把抽卡預算當成娛樂費，不要當成期望報酬已知的投資。</p>

<p>尤其不要因為領到 FWA，就先把代幣數量算成回本。那只是把一種風險換成另一種風險，宇宙帳本沒有因此自動對平。</p>

<p>Fake World Assets 真正賣的，或許從來不只是一枚 NFT。</p>

<p>它賣的是流動性、退出選項、等待時間、稀缺感，以及「下一抽也許會不同」的期待。</p>

<p>我會繼續看這台機器怎麼轉。</p>

<p>但先不把錢包交給它替我思考。</p>

<p><small>視覺說明：封面為 AI 生成概念圖，使用多個 NFT 系列的風格化視覺暗示，不是官方專案圖像或合作背書；三張技術圖為本文原創機制示意與作者試算；兩張實際介面截圖引用自 Bankless，僅作評論與機制說明。</small></p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://www.bankless.com/read/a-beginners-guide-to-fake-world-assets">Bankless：A Beginner’s Guide to Fake World Assets</a>（機制導讀與實際介面截圖來源）</li>
  <li><a href="https://www.fwa.fun/docs/overview">Fake World Assets：How it works</a></li>
  <li><a href="https://www.fwa.fun/docs/prizes-odds">Fake World Assets：Positions &amp; weighting</a></li>
  <li><a href="https://www.fwa.fun/docs/pricing-draw">Fake World Assets：Pricing &amp; allocation</a></li>
  <li><a href="https://www.fwa.fun/docs/collections">Fake World Assets：Collections</a></li>
  <li><a href="https://www.fwa.fun/docs/winning">Fake World Assets：Settlement</a></li>
  <li><a href="https://www.fwa.fun/docs/fees">Fake World Assets：Fees &amp; protocol revenue</a></li>
  <li><a href="https://www.fwa.fun/docs/fwa">Fake World Assets：$FWA</a></li>
  <li><a href="https://www.fwa.fun/docs/safety">Fake World Assets：Safety</a></li>
  <li><a href="https://www.fwa.fun/docs/config">Fake World Assets：Parameters</a></li>
  <li><a href="/technical/uniform-girls-nft-debut/">延伸閱讀：制服女孩上鏈——攝影作品踏入 NFT 世界的第一步</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="web3" /><category term="nft" /><category term="defi" /><category term="market-design" /><summary type="html"><![CDATA[Fake World Assets 不只是 NFT 抽卡，而是一套結合 ETH 擔保金、隨機分配、常駐買價與代幣排放的鏈上市場。本文拆解它的定價公式、Loss-to-Earn 敘事，以及補貼退潮後真正要看的風險。]]></summary></entry><entry><title type="html">可上線的 AI Agent，不是更會自主：從 Context、Evidence、State 到 Permission 的四層控制面</title><link href="https://swanky.github.io/technical/production-ai-agent-control-planes/" rel="alternate" type="text/html" title="可上線的 AI Agent，不是更會自主：從 Context、Evidence、State 到 Permission 的四層控制面" /><published>2026-07-23T00:00:00+00:00</published><updated>2026-07-23T00:00:00+00:00</updated><id>https://swanky.github.io/technical/production-ai-agent-control-planes</id><content type="html" xml:base="https://swanky.github.io/technical/production-ai-agent-control-planes/"><![CDATA[<p>一個 AI Agent 在展示環境裡，通常只需要做一件事：看起來很聰明。</p>

<p>到了正式環境，問題完全不同。它必須在正確的指令下工作，使用可以追溯的資料，把長任務的進度留在模型之外，並且在碰到外發、覆寫、刪除、付款或部署時停得下來。</p>

<p>模型能不能呼叫工具，反而是比較簡單的部分。</p>

<p>ByteByteGo 在 2026 年 7 月發表的<a href="https://blog.bytebytego.com/p/best-practices-for-building-ai-agents">〈Best Practices for Building AI Agents That Work in Production〉</a>，把 Production Agent 的工程問題整理成 Context、Control Flow、State 與 Scope。這四個面向很適合當共同基線，但若要拿來做企業導入、技術審查與上線驗收，我會再重排一次：</p>

<blockquote>
  <p><strong>Instruction／Context、Evidence、State、Permission。</strong></p>
</blockquote>

<p>這不是替原文換四個英文名詞。原文主要在說 Agent 如何穩定運作；我想處理的是另一個問題：<strong>當 Agent 說它完成了，我們憑什麼相信；當它想採取行動，系統憑什麼允許。</strong></p>

<h2 id="先給結論正式環境要控制的不是模型而是四個介面">先給結論：正式環境要控制的不是模型，而是四個介面</h2>

<ol>
  <li><strong>Instruction／Context：它依什麼規則工作？</strong> Prompt、技能、工具說明與執行期脈絡必須可組合、可版控、可測試。</li>
  <li><strong>Evidence：它依哪些事實做判斷？</strong> 結論要能回指來源，完成狀態要附機器可檢查的證據。</li>
  <li><strong>State：工作做到哪裡？</strong> Run、Step、產物、錯誤、核准與 checkpoint 必須存在模型之外。</li>
  <li><strong>Permission：它被允許做什麼？</strong> 身分、資源範圍、風險等級與人工核准要由程式強制，不靠 Prompt 拜託模型自律。</li>
</ol>

<p>Scope 仍然重要，但我把它視為包住四層的外框：每個 Agent 都要有單一責任、清楚停止條件，以及可交給人或其他 Agent 的交接格式。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="/assets/img/production-ai-agent-control-planes/four-control-planes.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/production-ai-agent-control-planes/four-control-planes.svg" alt="Production AI Agent 四層控制面架構：Instruction 與 Context 管理可執行規則，Evidence 保存來源與驗收證據，State 保存任務與 checkpoint，Permission 控制工具、資源與人工核准；四層共同約束確定性 Orchestrator 與模型決策" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖一：四層控制面不是塞進 System Prompt 的四段文字，而是模型外部可被檢查與強制執行的系統元件；點圖可開啟原尺寸</figcaption>
</figure>

<h2 id="為什麼我要重排-bytebytego-的四個原則">為什麼我要重排 ByteByteGo 的四個原則</h2>

<p>原文的分類適合解釋 Production Agent 的設計重點；控制面分類則比較適合拿來做架構審查。兩者的關係如下：</p>

<table>
  <thead>
    <tr>
      <th>ByteByteGo 原則</th>
      <th>本文重新落位</th>
      <th>需要補上的上線問題</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Context</td>
      <td>Instruction／Context</td>
      <td>Prompt 從哪個版本建置？執行期載入了哪些規則與資料？</td>
    </tr>
    <tr>
      <td>Control Flow</td>
      <td>Permission＋確定性編排</td>
      <td>哪些步驟由程式固定？哪個動作必須核准？</td>
    </tr>
    <tr>
      <td>State</td>
      <td>State</td>
      <td>任務能否中斷續跑、重試、稽核與交接？</td>
    </tr>
    <tr>
      <td>Scope</td>
      <td>四層外部邊界</td>
      <td>Agent 何時該停、拒絕或轉交？</td>
    </tr>
  </tbody>
</table>

<p>我另外抽出 Evidence，原因很直接：<strong>資料曾經放進 Context，不代表輸出的主張有被資料支持；工具曾經回傳成功，也不代表任務真的完成。</strong></p>

<p>這兩個落差，正是很多 Agent Demo 一進正式環境就開始欠債的地方。</p>

<h2 id="第一層instructioncontext-不是一份愈寫愈長的-prompt">第一層：Instruction／Context 不是一份愈寫愈長的 Prompt</h2>

<p>早期 Agent 常把角色、政策、工具用法、輸出格式與例外處理全部塞進一份 System Prompt。人少、流程短時還能工作；規模一大，修改一行文字的影響範圍就很難判斷。</p>

<p>Google Developers Blog 在 2026 年 7 月提出 modular prompt transpilation：把指令拆成可重用模組，在建置時解析 import、變數與相依關係，輸出一份可重現的執行產物。它處理的其實是很熟悉的軟體工程問題：</p>

<ul>
  <li>缺少的模組應在建置時失敗，不要等到執行特定任務才爆炸；</li>
  <li>未定義變數與循環相依要能靜態檢查；</li>
  <li>原始模組重新建置後，應能和已提交的 golden artifact 比對 drift；</li>
  <li>Agent 可以提出指令修改，但修改應走 Pull Request、測試與人工審查，而不是在執行中偷偷改寫自己。</li>
</ul>

<p>因此，Instruction Layer 至少要分成兩種東西：</p>

<h3 id="穩定控制面">穩定控制面</h3>

<p>身分、不可違反的安全邊界、工具契約、資料政策、輸出格式與升級規則。這些規則要有版本，變更要能 diff、review、test 與 rollback。</p>

<h3 id="任務脈絡">任務脈絡</h3>

<p>這次工作真正需要的檔案、資料、使用者偏好、前一步結果與少量相關技能。它應按需載入，不是把整個知識庫倒進 Context Window。</p>

<p>Context Window 是容量，不是注意力保證。資訊放得進去，不代表模型會在第十八步仍然抓對版本、記得哪個例外或分清楚哪段資料已過期。</p>

<p>一個可以被稽核的執行紀錄，至少應回答：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">instruction_artifact</span><span class="pi">:</span> <span class="s">agent-policy@2026.07.23+sha256:...</span>
<span class="na">loaded_skills</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">research@3.2</span>
  <span class="pi">-</span> <span class="s">approval-first-actions@1.4</span>
<span class="na">runtime_context</span><span class="pi">:</span>
  <span class="na">task_id</span><span class="pi">:</span> <span class="s">run_...</span>
  <span class="na">source_snapshot</span><span class="pi">:</span> <span class="s">evidence_set_...</span>
  <span class="na">policy_version</span><span class="pi">:</span> <span class="s">policy_...</span>
</code></pre></div></div>

<p>這只是概念結構，不是某個產品的固定 API。重點是：<strong>日後追查結果時，必須知道模型當時到底看到了哪一套規則。</strong></p>

<h2 id="第二層evidence-把我覺得完成改成我能證明完成">第二層：Evidence 把「我覺得完成」改成「我能證明完成」</h2>

<p>Ground Truth 檢查常被理解成「讓模型多查一次資料」。這還不夠。</p>

<p>Evidence Layer 要保存的是可追蹤關係：哪個主張來自哪個來源、哪個產物由哪個工具產生、哪個驗收條件由什麼檢查通過。它不能只留下模型最後整理過的摘要，因為摘要本身仍可能失真。</p>

<p>Anthropic 在 Claude Science 的公開案例中提到，Allen Institute 的研究者建立了多 Agent 文獻回顧流程。Sub-agent 從大量論文擷取核心主張與量化發現，存進 evidence state database；後續寫作與圖表直接從該資料庫取用，並用 actor-critic 配對，讓一個 Agent 產生內容、另一個 Agent 檢查準確性與引用忠實度。</p>

<p>這個案例值得注意的不是「一次讀了很多論文」，而是它把研究流程拆成：</p>

<ol>
  <li>先建立結構化證據；</li>
  <li>再根據證據寫作；</li>
  <li>另外執行引用與正確性審查。</li>
</ol>

<p>套到企業 Agent，一張最小 Evidence Card 可以包含：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"claim_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"claim-017"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"source_uri"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com/source"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"source_snapshot"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sha256:..."</span><span class="p">,</span><span class="w">
  </span><span class="nl">"excerpt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"支持這個主張的原始片段"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"retrieved_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-07-23T10:00:00+08:00"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"verifier"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rule-or-reviewer-id"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"supported"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Evidence Layer 也要處理「完成」的證據。為每種任務定義 Completion Contract：</p>

<ul>
  <li>目標是什麼；</li>
  <li>哪些條件全部成立才算完成；</li>
  <li>每個條件需要哪種證據；</li>
  <li>哪些失敗可以重試；</li>
  <li>哪些情況必須停下交給人；</li>
  <li>最終產物與執行收據存在哪裡。</li>
</ul>

<p>例如「網站文章已完成」不等於 Markdown 已寫完。它可能還需要：建置成功、圖片存在、內部連結可解析、手機版無水平溢位、正常 Production Build 排除未核准草稿。缺一項，狀態就不應該是 <code class="language-plaintext highlighter-rouge">completed</code>。</p>

<h2 id="第三層state-不能寄生在對話紀錄裡">第三層：State 不能寄生在對話紀錄裡</h2>

<p>模型本身可以是無狀態的；工作不行。</p>

<p>ByteByteGo 原文主張把計畫、進度、工具結果與 checkpoint 外部化，讓任務可以恢復、重放與水平擴充。這也是長流程 Agent 是否能進正式環境的分水嶺。</p>

<p>對話紀錄適合讓人理解發生過什麼，卻不適合當唯一狀態來源。它通常同時混著使用者需求、模型推理、工具輸出、錯誤、重試與後來被推翻的決定。Context compaction 一發生，細節還可能被壓成摘要。</p>

<p>最小可用的 State 應把這些欄位拆開：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">run_id</code> 與目前 <code class="language-plaintext highlighter-rouge">step_id</code>；</li>
  <li>任務狀態與允許的下一個轉移；</li>
  <li>指令、資料與政策版本；</li>
  <li>已完成條件與待完成條件；</li>
  <li>產物位置、hash 與驗證結果；</li>
  <li>待核准動作與核准對象；</li>
  <li>錯誤類型、重試次數與 idempotency key；</li>
  <li>checkpoint 與最後一次成功提交時間。</li>
</ul>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="/assets/img/production-ai-agent-control-planes/production-agent-runtime-loop.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/production-ai-agent-control-planes/production-agent-runtime-loop.svg" alt="Production AI Agent 執行迴圈：載入版本化指令與狀態，模型提出動作，系統驗證證據與權限，通過後執行工具並保存收據，再依 Completion Contract 決定繼續、等待人工核准、交接或完成" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖二：模型負責提出判斷；確定性 Orchestrator 負責順序、狀態轉移、重試上限與停止條件；點圖可開啟原尺寸</figcaption>
</figure>

<p>外部狀態帶來三個實際好處。</p>

<p>第一，模型或 Provider 可以更換。新模型接手的是同一份結構化 Run，不必從整段聊天猜測工作做到哪裡。</p>

<p>第二，失敗可以恢復。工具 timeout 時，系統能判斷工作是否其實已送出，而不是讓 Agent 一重試就重複寄信、重複付款或重複部署。</p>

<p>第三，責任可以交接。人類接手時不必重看一萬行 transcript，只需要目前狀態、相關證據、已做決定、阻塞原因與下一個允許動作。</p>

<h2 id="第四層permission-必須由模型外部強制">第四層：Permission 必須由模型外部強制</h2>

<p>Prompt 可以描述行為規範，不能充當安全邊界。</p>

<p>你可以在 System Prompt 寫十次「刪檔前先詢問」，但只要 Tool Gateway 仍允許模型直接刪除，這條規則就只是良好意圖。真正的 Permission Layer 必須同時知道：</p>

<ul>
  <li>目前是誰或哪個 Agent 在行動；</li>
  <li>可以使用哪些工具；</li>
  <li>可以碰哪些資源、路徑、帳號與資料分類；</li>
  <li>這個動作屬於哪個風險等級；</li>
  <li>是否需要核准，以及核准綁定的精確 payload；</li>
  <li>動作完成後要留下什麼 receipt。</li>
</ul>

<p>我會把常見動作分成四級：</p>

<ol>
  <li><strong>讀取與分析</strong>：在明確資料範圍內可自動執行，仍要記錄來源與存取結果。</li>
  <li><strong>本機可逆修改</strong>：可以產生草稿或 patch，但要保留 diff、測試與 rollback 路徑。</li>
  <li><strong>對外或共享寫入</strong>：寄送、發布、建立遠端資源與修改共享資料，預設先產生 preview，再核准精確收件人與內容。</li>
  <li><strong>不可逆或有金錢影響的動作</strong>：刪除、付款、部署、權限變更與憑證操作，必須使用強制核准、冪等保護與事後對帳。</li>
</ol>

<p>核准也不能只是一個模糊的 <code class="language-plaintext highlighter-rouge">approved: true</code>。比較可靠的做法，是把核准綁定到 action fingerprint：工具、目標、關鍵參數、內容 hash、成本上限與到期時間。任何欄位在核准後改變，就要重新核准，避免人批准的是 A，Agent 最後執行的卻是 B。</p>

<p>Hermes Agent v0.19.0 的公開 Release 把 smart approvals、Bitwarden／1Password secrets provider、live subagent transcript 與 durable delivery ledger 放進同一次版本更新。它們解決的面向不同：approval 判斷能不能做、secret provider 控制憑證怎麼取得、live transcript 提供過程可見性、durable delivery 確保完成回覆不因 Gateway crash 消失。這正好說明安全與可靠性不會由一個「更聰明的 Prompt」包辦。</p>

<p>我先前在<a href="/technical/hermes-agent-openrouter-video-generation/">〈我讓 Hermes Agent 串上 OpenRouter 生影片〉</a>的實作裡，也踩過這條界線。當時付費提交前有人工核准流程，但 plugin 的 <code class="language-plaintext highlighter-rouge">submit()</code> 本身沒有 approval token；若有人繞過工作流直接呼叫，API 仍會送出。那套流程適合個人受控實驗，若要變成多人服務，就必須把核准從「流程紀律」升級成「程式 hard gate」。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <a href="/assets/img/production-ai-agent-control-planes/risk-approval-handoff-matrix.svg" target="_blank" rel="noopener noreferrer">
    <img src="/assets/img/production-ai-agent-control-planes/risk-approval-handoff-matrix.svg" alt="AI Agent 動作風險、核准與人工交接矩陣：讀取分析、本機可逆修改、對外共享寫入、不可逆或金錢動作分別對應不同自動化範圍、證據、核准與失敗處理" style="width:100%;height:auto;border-radius:14px;" />
  </a>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖三：自主程度應跟動作風險走，不該跟模型能力或使用者對它的好感走；點圖可開啟原尺寸</figcaption>
</figure>

<h2 id="control-flow-的核心外圈確定內圈才交給模型">Control Flow 的核心：外圈確定，內圈才交給模型</h2>

<p>ByteByteGo 原文有一句很實用的原則：大多數 Production Agent，應該是確定性流程包住少數模型決策點。</p>

<p>我會把一次工具動作拆成八步：</p>

<ol>
  <li>載入固定版本的 Instruction Artifact；</li>
  <li>從外部 State 取回目前步驟；</li>
  <li>只組裝這一步需要的 Context 與 Evidence；</li>
  <li>讓模型提出結構化 action proposal；</li>
  <li>用 schema、ground truth 與規則驗證 proposal；</li>
  <li>由 Permission Layer 決定執行、拒絕或等待核准；</li>
  <li>Tool Gateway 執行後保存 receipt，再原子更新 State；</li>
  <li>Completion Contract 判斷繼續、重試、交接或完成。</li>
</ol>

<p>模型可以決定「下一個合理動作是什麼」，但不能自行改寫 state transition、放寬工具權限、把驗證失敗改成成功，或宣布自己已通過 Completion Contract。</p>

<p>這種設計看起來比「給 Agent 一個目標，讓它自己想辦法」保守。正式環境需要的正是這種保守。</p>

<p>ByteByteGo 用一個示意例子說明長流程的複合風險：如果二十個步驟各自都有 95% 成功率，在假設每一步相互獨立的簡化條件下，全程一次成功率只有約 35.85%。這不是任何實際 Agent 的 benchmark，而是提醒我們：<strong>步驟愈多，checkpoint、局部重試、驗證與人工接手愈不能省。</strong></p>

<h2 id="scope-與-human-handoff-不是失敗處理是正常路徑">Scope 與 Human Handoff 不是失敗處理，是正常路徑</h2>

<p>Agent 的職責愈寬，評估資料就愈難準備，權限也愈難收斂。與其做一個「公司萬能助理」，不如先做一個能清楚說明輸入、輸出、工具與停止條件的窄 Agent。</p>

<p>Scope 至少要寫清楚：</p>

<ul>
  <li>接受哪些任務；</li>
  <li>明確拒絕哪些任務；</li>
  <li>可以讀取與修改哪些資源；</li>
  <li>最長執行時間、最大成本與最大重試次數；</li>
  <li>哪些訊號代表資訊不足；</li>
  <li>哪些情況必須轉交人或其他專責 Agent。</li>
</ul>

<p>一份合格的 Handoff Package 不需要很長，但要完整：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">run_id</span><span class="pi">:</span> <span class="s">run_...</span>
<span class="na">goal</span><span class="pi">:</span> <span class="s2">"</span><span class="s">本次工作目標"</span>
<span class="na">current_state</span><span class="pi">:</span> <span class="s">awaiting_human_review</span>
<span class="na">completed_conditions</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">source_verified</span>
  <span class="pi">-</span> <span class="s">draft_built</span>
<span class="na">pending_conditions</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s">owner_visual_approval</span>
<span class="na">artifacts</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">uri</span><span class="pi">:</span> <span class="s">...</span>
    <span class="na">sha256</span><span class="pi">:</span> <span class="s">...</span>
<span class="na">blocked_reason</span><span class="pi">:</span> <span class="s2">"</span><span class="s">需要內容所有者確認視覺與對外發布"</span>
<span class="na">next_allowed_action</span><span class="pi">:</span> <span class="s2">"</span><span class="s">等待核准；不可發布"</span>
</code></pre></div></div>

<p>人類接手不代表 Agent 失敗。Agent 在該停的地方停下來，並把完整脈絡交出來，才是正式系統的成功行為。</p>

<h2 id="一份可以拿去做-pilot-的最小驗收表">一份可以拿去做 Pilot 的最小驗收表</h2>

<h3 id="instructioncontext">Instruction／Context</h3>

<ul>
  <li>Prompt、技能與工具說明是否有版本、owner 與變更紀錄？</li>
  <li>是否能從原始模組重建相同的執行產物？</li>
  <li>是否有靜態檢查、eval 與 rollback？</li>
  <li>執行紀錄能否指出當時載入哪些版本？</li>
</ul>

<h3 id="evidence">Evidence</h3>

<ul>
  <li>關鍵主張能否回指原始來源與 snapshot？</li>
  <li>工具成功是否有 receipt，而不是只保留模型轉述？</li>
  <li>Completion Contract 是否定義完成條件與必要證據？</li>
  <li>產生者與 reviewer 是否在流程上分離？</li>
</ul>

<h3 id="state">State</h3>

<ul>
  <li>Run／Step／Artifact／Approval 是否存在模型之外？</li>
  <li>任務能否從 checkpoint 恢復，而不是重跑全部步驟？</li>
  <li>寫入與付費動作是否具備 idempotency key？</li>
  <li>換模型或人工接手時，是否不必重新閱讀完整對話？</li>
</ul>

<h3 id="permission">Permission</h3>

<ul>
  <li>Tool Gateway 是否有真正的 allowlist、scope 與資源邊界？</li>
  <li>核准是否綁定精確 action fingerprint 與到期時間？</li>
  <li>核准後 payload 改變時，系統是否強制重批？</li>
  <li>每個外部副作用是否留下可對帳 receipt？</li>
</ul>

<p>只要其中一層仍然回答「靠模型自己注意」，就還不適合把權限往上加。</p>

<h2 id="最後判斷production-agent-的成熟度看它如何被約束">最後判斷：Production Agent 的成熟度，看它如何被約束</h2>

<p>模型能力會繼續上升，Agent 也會愈來愈能自己規劃、使用工具與持續工作。這些進步會提高上限，卻不會自動補上治理。</p>

<p>真正可上線的 Agent，不是最敢自主行動的那一個，而是出了問題時能回答這些問題的系統：</p>

<ul>
  <li>它當時依哪個版本的指令工作？</li>
  <li>哪些證據支持這個結論？</li>
  <li>工作目前停在哪個狀態？</li>
  <li>誰允許它執行這個動作？</li>
  <li>失敗後如何恢復、交接與追責？</li>
</ul>

<p>如果這五題答不出來，Agent 再會說話，也只是帶工具權限的聊天機器人。</p>

<p>如果答得出來，模型才真正被放進一套可以運作、驗收與持續改善的工程系統。</p>

<p><small>視覺說明：封面為 AI 生成的概念圖；三張技術圖為本文原創架構示意，不代表特定供應商產品。</small></p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://blog.bytebytego.com/p/best-practices-for-building-ai-agents">ByteByteGo：Best Practices for Building AI Agents That Work in Production（2026-07-22）</a></li>
  <li><a href="https://developers.googleblog.com/building-scalable-ai-agents-with-modular-prompt-transpilation/">Google Developers Blog：Building scalable AI agents with modular prompt transpilation（2026-07-16）</a></li>
  <li><a href="https://www.anthropic.com/news/claude-science-ai-workbench">Anthropic：Claude Science, an AI workbench for scientists, is now available（2026-06-30）</a></li>
  <li><a href="https://github.com/NousResearch/hermes-agent/releases/tag/v2026.7.20">Nous Research：Hermes Agent v0.19.0 Release Notes（2026-07-20）</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="ai-agent" /><category term="agentic-engineering" /><category term="agent-governance" /><category term="production-ai" /><summary type="html"><![CDATA[AI Agent 從 Demo 走到正式環境，難題不是模型能不能呼叫工具，而是指令能否版控、結論能否回指證據、任務能否中斷續跑，以及高風險動作是否真的受權限控制。本文以四層控制面建立可驗收的 Production Agent 架構。]]></summary></entry><entry><title type="html">Kimi K3 讓「閉源一定更強」失效了：開放模型如何在特定領域超車</title><link href="https://swanky.github.io/technical/kimi-k3-open-frontier-intelligence/" rel="alternate" type="text/html" title="Kimi K3 讓「閉源一定更強」失效了：開放模型如何在特定領域超車" /><published>2026-07-18T00:00:00+00:00</published><updated>2026-07-18T00:00:00+00:00</updated><id>https://swanky.github.io/technical/kimi-k3-open-frontier-intelligence</id><content type="html" xml:base="https://swanky.github.io/technical/kimi-k3-open-frontier-intelligence/"><![CDATA[<p>在上一篇<a href="/technical/artificial-analysis-llm-evaluation-2026/">〈別再只看排行榜第一名：Artificial Analysis 與 2026 LLM 評估方法全解析〉</a>裡，我把模型能力、Agent 任務、速度、成本與私有評估拆成不同層次。結論很簡單：排行榜能幫你找到候選，不能替你做最後的選型。</p>

<p>這套方法很快就遇到一個很難忽略的新案例：<strong>Kimi K3</strong>。</p>

<p>在 Arena 的前端網頁開發榜上，它暫時排第一；Moonshot 公布的 Program Bench、Automation Bench、BrowseComp，也都出現它壓過 Claude Fable 5 或 GPT-5.6 Sol 的項目。這不是某個小模型靠價格換掌聲，而是一個 2.8 兆總參數、100 萬 token 上下文、原生視覺、專門為長時間 Agent 工作打造的重量級模型。</p>

<p>先不要急著把新聞標題寫成「中國開源模型全面擊敗美國閉源 AI」。那樣很有流量，也很容易在兩天後變成笑話。</p>

<p><strong>K3 真正重要的地方，不是它全面贏了——它沒有。重要的是，閉源模型在所有高價值工作上理所當然領先的假設，已經失效。開放模型陣營不再只是追趕通用平均分，而是開始在前端開發、工具操作、長流程研究與部分程式任務裡，先把旗子插到閉源模型前面。</strong></p>

<p>這個轉折，比「第幾名」有意思得多。</p>

<h2 id="先給結論開放模型已經局部超車但-k3-現在還不能直接叫開源">先給結論：開放模型已經局部超車，但 K3 現在還不能直接叫開源</h2>

<p>我對 Kimi K3 的判斷可以濃縮成六句話：</p>

<ol>
  <li><strong>它已經正式上線，不是預告。</strong>網頁、桌面工作代理、Coding Agent 與 API 都能使用。</li>
  <li><strong>它進入了前沿模型第一梯隊。</strong>截至 2026 年 7 月 18 日，Artificial Analysis Intelligence Index 為 57 分、排名第 4；但速度、價格與輸出長度並不漂亮。</li>
  <li><strong>它在特定領域確實贏過頂尖閉源模型。</strong>最明顯的是 Arena WebDev 暫列第一，以及 Program Bench、Automation Bench、BrowseComp 等項目的領先。</li>
  <li><strong>它沒有全面超越 Claude 或 GPT。</strong>DeepSWE、FrontierSWE、Terminal-Bench 仍有閉源模型領先，Moonshot 自己也承認整體表現仍落後 Claude Fable 5 與 GPT-5.6 Sol。</li>
  <li><strong>它走的是開放權重路線，但截至 7 月 18 日權重還沒發布。</strong>Arena 與 Artificial Analysis 目前仍把它標成 proprietary。</li>
  <li><strong>它不是便宜的小模型。</strong>US$3／15 的一般輸入／輸出價、約 62 token／秒、固定 max 推理強度，加上極大的部署需求，讓它比較像重型工程設備，不是大量小任務的免洗工讀生。</li>
</ol>

<p>所以，最精準的說法不是「開源模型全面勝利」，而是：</p>

<blockquote>
  <p><strong>前沿能力已經從一條封閉的總排行榜，裂成多個領域戰場。開放權重或承諾開放權重的模型，開始在其中一些戰場領先閉源旗艦。</strong></p>
</blockquote>

<p>這代表企業與開發者的選型方法也要改。以前可能先問「哪一家最強」，現在要先問「我的任務到底在哪個戰場」。</p>

<h2 id="kimi-k3-到底是什麼不是-28-兆參數一起上班">Kimi K3 到底是什麼：不是 2.8 兆參數一起上班</h2>

<p>K3 最搶眼的數字是 <strong>2.8 兆總參數</strong>。</p>

<p>如果把它理解成每生成一個 token，都有 2.8 兆參數一起全速運算，會得到一個很壯觀、也不太正確的畫面。K3 採用 Stable LatentMoE；官方表示，它在 896 個專家中，每次有效啟用 16 個。換算後約是 <strong>1.79% 的專家被選中</strong>，但這不等於只有 1.79% 的總參數參與運算，因為模型仍有共享層、注意力與其他結構。</p>

<p>比較好懂的比喻，是一間有 896 位專家的巨型顧問公司。每個 token 進來，路由器挑 16 位進會議室；其他人不必全部開麥克風。</p>

<p>這種設計讓模型能擴大容量，又不必每一步都付出完整 dense model 的計算成本。代價也很直接：</p>

<ul>
  <li>路由器要選對專家；</li>
  <li>熱門專家不能全部塞車；</li>
  <li>大量 GPU 之間要高速交換資料；</li>
  <li>訓練與推論都更依賴整體基礎設施。</li>
</ul>

<p>Moonshot 為此加入 Quantile Balancing、平衡式 expert parallel training 與 Stable LatentMoE。這些名字聽起來很研究，但實際處理的是同一件事：<strong>模型很大不稀奇，能讓 896 個專家不要在分散式系統裡互相等到下班，才是工程。</strong></p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/kimi-k3-open-frontier/kimi-k3-architecture.svg" alt="Kimi K3 系統架構圖：文字、圖片與長上下文先經 KDA 和 AttnRes，再由 Stable LatentMoE 從 896 個專家中選擇 16 個，交給 Agent Harness 執行；底層使用 MXFP4 權重、MXFP8 activation 與 64 個以上加速器" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖一：K3 的能力來自模型、路由、Harness 與推論底座共同作用，不是單看 2.8 兆參數</figcaption>
</figure>

<h3 id="kda-與-attnres一個處理長度一個處理深度">KDA 與 AttnRes：一個處理長度，一個處理深度</h3>

<p>K3 的另外兩個核心結構是：</p>

<ul>
  <li><strong>Kimi Delta Attention（KDA）</strong>：作為長上下文與大規模注意力的效率基礎；</li>
  <li><strong>Attention Residuals（AttnRes）</strong>：讓模型能沿著深度選擇性取回過去層的表示，而不是只把所有資訊一路均勻累加。</li>
</ul>

<p>直觀地說，KDA 處理的是「文件很長時怎麼不要算到失控」，AttnRes 處理的是「模型很深時怎麼不要把前面的重點稀釋掉」。</p>

<p>官方宣稱這些架構、稀疏度與訓練方法，讓 K3 相較 K2 的整體 scaling efficiency 提升約 2.5 倍。這仍是廠商數據；完整技術報告尚未發布，目前可以理解方向，不能假裝已經完成外部重現。</p>

<h3 id="100-萬-token-的價值不是讓你貼一本小說">100 萬 token 的價值，不是讓你貼一本小說</h3>

<p>K3 的官方精確規格是 <strong>1,048,576 token 上下文</strong>，並支援原生視覺輸入。真正有價值的情境不是炫耀能塞多少頁，而是讓長時間 Agent 同時保留：</p>

<ul>
  <li>原始需求與驗收條件；</li>
  <li>大型程式庫、文件與 API 規格；</li>
  <li>工具呼叫結果與錯誤紀錄；</li>
  <li>畫面截圖、視覺回饋與修改歷史；</li>
  <li>先前嘗試過但失敗的路徑。</li>
</ul>

<p>K3 特別強調 vision in the loop。它不只寫前端程式，也能看執行畫面，再修改 CSS、互動、遊戲或 3D 場景。這也解釋了為什麼它在前端網頁生成與視覺程式任務上特別突出。</p>

<p>但 Context Window 是容量，不是保真度保證。能放進 100 萬 token，不代表第 37 萬與第 91 萬 token 的細節都能同樣可靠地取回。長上下文仍要用自己的 needle、跨文件整合與長軌跡任務測試。</p>

<p>帳戶限制也可能比模型規格先撞牆。Kimi API 的低階 Tier 0 帳戶目前只有每分鐘 50 萬 token，低於模型的完整上下文容量；要測真正的 1M request，必須先核對帳戶等級、TPM 與 input／reasoning／output 如何共同占用 context。規格頁寫得下，不代表你的帳戶當下送得進去。</p>

<h2 id="開放模型開始領先閉源證據在哪裡">開放模型開始領先閉源，證據在哪裡？</h2>

<p>這裡要把「領先」拆成三種證據：獨立人類偏好、廠商公布評測，以及跨模型綜合指數。三者都能看，但不能混成同一張成績單。</p>

<h3 id="1-arena-webdev目前最有力的獨立訊號">1. Arena WebDev：目前最有力的獨立訊號</h3>

<p>Arena 在 2026 年 7 月 16 日的 WebDev Overall 榜，把前端網頁開發定義為包含多步驟推理與工具使用的工作。當時的實驗室排名是：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">排名</th>
      <th>模型</th>
      <th style="text-align: right">分數</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">1</td>
      <td>Kimi K3</td>
      <td style="text-align: right">1679 ± 17</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td>Claude Fable 5</td>
      <td style="text-align: right">1631 ± 13</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td>GPT-5.6 Sol（Codex harness）</td>
      <td style="text-align: right">1618 ± 13</td>
    </tr>
    <tr>
      <td style="text-align: right">4</td>
      <td>GLM-5.2</td>
      <td style="text-align: right">1587 ± 10</td>
    </tr>
  </tbody>
</table>

<p>如果把條件收緊成「權重今天已經公開」，第 4 名的 GLM-5.2 反而是更直接的證據。Z.ai 已用 MIT 授權發布模型，Arena 上它仍排在 Grok 4.5、Muse Spark 1.1 等多個閉源模型之前。這不代表開放模型拿下通用總冠軍，卻已足以證明：<strong>在一個明確的前端開發領域，開放權重模型可以實際領先多個閉源前沿模型。</strong></p>

<p>這張表有兩個訊號。</p>

<p>第一，K3 在前端網頁開發這個具體領域，確實暫時領先兩個最強閉源模型。這就是「開放模型路線已能在特定領域超車」最直接的例子。</p>

<p>第二，<strong>在 7 月 16 日的榜單頁面上，Arena 仍把 K3 標成 proprietary</strong>。所以這不是一張「已開源模型第一名」證書，而是「承諾在十一天內開放權重的模型，已先在產品與評測上跑到第一」的時間差。</p>

<p>榜單還會變，K3 也仍是新模型。1679 不是刻在石碑上的數字；真正值得記住的是，前端開發已經不再由閉源模型天然包辦前排。</p>

<h3 id="2-moonshot-官方評測不是全面勝利而是明顯偏科">2. Moonshot 官方評測：不是全面勝利，而是明顯偏科</h3>

<p>Moonshot 公布的完整表格呈現一個很有性格的模型。</p>

<p>K3 領先的項目包括：</p>

<table>
  <thead>
    <tr>
      <th>評測</th>
      <th style="text-align: right">Kimi K3</th>
      <th style="text-align: right">Claude Fable 5</th>
      <th style="text-align: right">GPT-5.6 Sol</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Program Bench</td>
      <td style="text-align: right"><strong>77.8</strong></td>
      <td style="text-align: right">76.8</td>
      <td style="text-align: right">77.6</td>
    </tr>
    <tr>
      <td>Automation Bench</td>
      <td style="text-align: right"><strong>30.8</strong></td>
      <td style="text-align: right">29.1</td>
      <td style="text-align: right">29.7</td>
    </tr>
    <tr>
      <td>BrowseComp</td>
      <td style="text-align: right"><strong>91.2</strong></td>
      <td style="text-align: right">88.0</td>
      <td style="text-align: right">90.4</td>
    </tr>
    <tr>
      <td>SpreadsheetBench 2</td>
      <td style="text-align: right"><strong>34.8</strong></td>
      <td style="text-align: right">34.7</td>
      <td style="text-align: right">32.4</td>
    </tr>
  </tbody>
</table>

<p>但它不是每一科都贏：</p>

<table>
  <thead>
    <tr>
      <th>評測</th>
      <th style="text-align: right">Kimi K3</th>
      <th>領先模型</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>DeepSWE</td>
      <td style="text-align: right">67.5</td>
      <td>GPT-5.6 Sol：73.0</td>
    </tr>
    <tr>
      <td>Terminal-Bench 2.1</td>
      <td style="text-align: right">88.3</td>
      <td>GPT-5.6 Sol：88.8</td>
    </tr>
    <tr>
      <td>FrontierSWE</td>
      <td style="text-align: right">81.2</td>
      <td>Claude Fable 5：86.6</td>
    </tr>
    <tr>
      <td>GDPval-AA v2 Elo</td>
      <td style="text-align: right">1668</td>
      <td>Claude Fable 5：1760</td>
    </tr>
  </tbody>
</table>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/kimi-k3-open-frontier/kimi-k3-benchmark-radar.svg" alt="Kimi K3、Claude Fable 5 與 GPT-5.6 Sol 六項官方評測雷達圖；K3 在 Program Bench、Automation Bench 與 BrowseComp 領先，在 DeepSWE、Terminal-Bench 與 FrontierSWE 未領先" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖二：K3 的形狀是局部領先、局部落後；各評測使用條件不同，不能把面積當成綜合總分</figcaption>
</figure>

<p>這組結果最適合支持的結論是：<strong>K3 在前端、瀏覽研究、流程自動化、試算表與部分程式任務已能超車；但在完整軟體工程與綜合專業工作上，還沒有全面領先。</strong></p>

<p>更麻煩的是，這些項目使用的 Harness 不完全相同。K3 可能搭 Kimi Code，Claude 搭 Claude Code，GPT 搭 Codex；部分評測甚至會取其他模型在不同 Harness 中的最佳分數。K3 也全部使用 max thinking effort。</p>

<p>所以，這些是「模型加工作系統」的結果，不是把三顆裸模型放在無菌室裡打一架。</p>

<h3 id="3-artificial-analysis能力很強食量也不小">3. Artificial Analysis：能力很強，食量也不小</h3>

<p>Artificial Analysis 對 K3 的快照更接近一盆冷水：</p>

<ul>
  <li>Intelligence Index：<strong>57 分，2026 年 7 月 18 日排名第 4</strong>；</li>
  <li>輸出速度：約 <strong>62 token／秒</strong>，低於同類平均；這是開始輸出後的 decode 速度，不是使用者等到答案的完整時間；</li>
  <li>支援文字與圖像輸入、文字輸出、100 萬 token 上下文；</li>
  <li>Intelligence Index 評測共輸出約 <strong>1.30 億 token</strong>，同類平均約 6,300 萬；</li>
  <li>該次完整 Intelligence Index 評測成本約 <strong>US$2,709.75</strong>。</li>
</ul>

<p>Artificial Analysis 在 Kimi 官方 API 的 10K 輸入工作負載上，量到約 1.99 秒收到第一個 token，但模型在正式答案前平均先推理約 32.25 秒，因此 <strong>第一個可讀答案 token 約要等 34.24 秒</strong>；生成到 500 token 的端到端時間約 42.30 秒。這組數字比「62 token／秒」更接近人真正坐在螢幕前的感受：它開始講話後不算慢，但開口前會想很久。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/kimi-k3-open-frontier/kimi-k3-latency-anatomy.svg" alt="Kimi K3 延遲拆解：1.99 秒收到第一個 token，答案前推理約 32.25 秒，約 34.24 秒看到第一個正式答案 token，生成至 500 token 約 42.30 秒" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖三：62 token／秒只描述開始輸出後的速度；互動體驗還要看第一個答案出現時間</figcaption>
</figure>

<p>也就是說，K3 不是那種「又小、又快、又便宜，順便把閉源模型全打趴」的童話。它比較像一位能力很強、願意一路做到底，但開會時間很長、差旅費也不少的資深顧問。</p>

<p>這反而讓它的局部領先更值得研究。因為 K3 不是靠極低價格偷到一個位置，而是用重型架構換到特定工作的前沿能力。</p>

<h2 id="開源這兩個字現在還不能寫得太順手">「開源」這兩個字，現在還不能寫得太順手</h2>

<p>Moonshot 稱 K3 為第一個 open 3T-class model，API 文件也直接寫「開源」。但同一份官方資料又說，完整模型權重將於 2026 年 7 月 27 日前發布。</p>

<p>對企業選型而言，現在真正能確定的是：</p>

<ul>
  <li>產品與 API 已上線；</li>
  <li>官方承諾將發布完整權重；</li>
  <li>Moonshot 官方 GitHub 與 Hugging Face 仍找不到 K3 權重 Repository；</li>
  <li>完整權重、技術報告與最終授權仍待驗收；</li>
  <li>Arena 與 Artificial Analysis 暫時仍標示 proprietary。</li>
</ul>

<p>即使權重如期上線，<strong>開放權重也不自動等於完整開源 AI</strong>。Open Source Initiative 的 Open Source AI Definition 還會檢查是否提供足夠的參數、程式碼、資料資訊與自由使用、研究、修改、分享的權利。</p>

<p>因此，現在最不容易翻車的寫法是：</p>

<blockquote>
  <p><strong>Kimi K3 是已公開使用、預定於 7 月 27 日前發布完整權重的前沿模型。它代表開放模型路線的能力突破；是否符合完整開源定義，要等權重、程式碼、資料揭露與授權條款實際落地後判定。</strong></p>
</blockquote>

<p>這個字眼不是挑語病。對企業而言，能下載權重、能修改、能商用、能再散布、能取得推論程式與足夠技術資訊，是完全不同的權利。</p>

<h2 id="價格不算低快取才是-k3-經濟學的核心">價格不算低，快取才是 K3 經濟學的核心</h2>

<p>K3 官方 API 每百萬 token 的價格是：</p>

<table>
  <thead>
    <tr>
      <th>類型</th>
      <th style="text-align: right">價格</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>快取命中輸入</td>
      <td style="text-align: right">US$0.30</td>
    </tr>
    <tr>
      <td>一般輸入</td>
      <td style="text-align: right">US$3.00</td>
    </tr>
    <tr>
      <td>輸出</td>
      <td style="text-align: right">US$15.00</td>
    </tr>
  </tbody>
</table>

<p>如果用 70% 快取命中輸入、20% 一般輸入、10% 輸出的示意組合計算，加權價格是每百萬混合 token <strong>US$2.31</strong>。這個數字只有在你的工作負載真的接近該比例時才有意義。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/kimi-k3-open-frontier/kimi-k3-token-economics.svg" alt="Kimi K3 API 成本圖：快取命中輸入每百萬 token 0.30 美元、未命中輸入 3 美元、輸出 15 美元；以 70 比 20 比 10 的 token 組合計算，混合價格為 2.31 美元，其中輸出只占 10% token 卻占約 65% 成本" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖四：輸出只占示意 token mix 的 10%，卻貢獻約 65% 成本；K3 的冗長會直接吃掉快取優勢</figcaption>
</figure>

<p>Moonshot 表示，官方 Kimi API 在 Coding 工作負載的快取命中率可超過 90%。這個優勢來自 Mooncake 的分離式推論架構與長前綴快取。Coding Agent 會反覆攜帶相同程式庫、系統指令與對話歷史，理論上非常適合快取。</p>

<p>但問題是：只要你頻繁改動前綴、切換 Harness、重組訊息或把模型當成臨時 fallback，快取命中率和品質都可能一起掉。</p>

<p>而且輸出是 US$15，K3 在 Artificial Analysis 的輸出量又接近同類平均的兩倍。<strong>便宜的快取輸入，救不了無限制的長篇輸出。</strong></p>

<p>真正該追的不是 API 價目表，而是：</p>

<blockquote>
  <p><strong>每個被接受的任務成本 = 模型與工具總成本 ÷ 通過驗收的任務數，再加上人工修正、等待、重試與風險。</strong></p>
</blockquote>

<p>這也是我在<a href="/technical/ai-coding-tool-selection-2026/">2026 年 AI Coding 工具選型</a>裡反覆強調的 accepted-task economics。模型單價只是最容易被看見的那一小塊。</p>

<h2 id="k3-最容易被忽略的限制它不是可以隨便熱插拔的模型">K3 最容易被忽略的限制：它不是可以隨便熱插拔的模型</h2>

<p>Kimi 官方很誠實地列出一個不常見、但很關鍵的限制：<strong>K3 對完整思考歷史很敏感。</strong></p>

<p>K3 採保留思考歷史的訓練方式。多輪對話與工具呼叫時，API 文件要求把完整的 assistant message 原樣帶回下一輪，不能只留下最終 <code class="language-plaintext highlighter-rouge">content</code>。如果 Harness 沒有正確保留歷史，或在進行中的工作中途從其他模型切換到 K3，生成品質可能變得非常不穩定。</p>

<p>這件事直接打臉一個常見想像：</p>

<blockquote>
  <p>「反正都是 OpenAI-compatible API，改一下 model slug 就能無痛切換。」</p>
</blockquote>

<p>插頭一樣，只代表插得進去，不代表電壓、通訊協定與工作習慣都一樣。</p>

<p>如果把 K3 接進 Hermes、OpenCode、Codex 相容 Gateway 或企業自製 Agent，至少要驗證：</p>

<ol>
  <li>reasoning history 是否完整 round-trip；</li>
  <li>tool call 與 tool result 是否保持正確順序；</li>
  <li>context compaction 是否會丟掉 K3 需要的思考內容；</li>
  <li>mid-session fallback／failback 是否造成品質崩落；</li>
  <li>快取是否因訊息重組而失效；</li>
  <li>Harness 的 System Prompt 與工具描述是否針對 K3 調整。</li>
</ol>

<p>官方目前建議使用已驗證相容的 Kimi Code。這不是說第三方 Harness 不能用，而是不能只測「API 回了 200」，就宣告整合完成。</p>

<h2 id="另一個限制更像-agent-的性格問題過度主動">另一個限制更像 Agent 的性格問題：過度主動</h2>

<p>Moonshot 把它叫作 <strong>excessive proactiveness</strong>。</p>

<p>K3 被特別訓練來處理長時間、困難、開放式任務。這讓它能在大型工程與研究裡持續推進，也讓它在需求模糊時，可能替使用者做出預料外的決定。</p>

<p>你叫它移一張椅子，它可能順便重新裝潢會議室。做得還不錯，但問題不是這個。</p>

<p>對有工具權限的 Agent，這不是文風偏好，而是風險模型。系統至少要有：</p>

<ul>
  <li>明確的檔案、網路、資料與工具權限；</li>
  <li>刪除、覆寫、付款、寄送、發布與部署前的人工核准；</li>
  <li>可執行的 allowlist／denylist，不只是在 Prompt 裡拜託它乖一點；</li>
  <li>每一步的日誌、產物檢查與失敗回復；</li>
  <li>對模糊需求先停下詢問的明確規則。</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">AGENTS.md</code> 可以告訴模型怎麼做事，但真正的安全邊界仍要靠 sandbox、權限、憑證、網路政策與 approval gate 強制執行。</p>

<p>K3 上線初期也只有 <code class="language-plaintext highlighter-rouge">max</code> 推理強度，低與高檔位仍待後續開放。這讓簡單任務可能太慢、太長、太貴。Kimi 官方聯網搜尋工具目前也在更新，文件明確寫著近期不建議使用；需要正式研究流程時，應接自己的可觀測搜尋與引用工具，而不是把產品展示當成生產 SLA。</p>

<h2 id="誰現在應該測-k3">誰現在應該測 K3？</h2>

<p>我會優先把 K3 放進以下工作的對照組：</p>

<h3 id="1-前端與視覺程式">1. 前端與視覺程式</h3>

<p>給它需求、參考畫面、現有 Repository、瀏覽器截圖與可執行測試，看它能不能在 vision-in-the-loop 裡反覆修改，而不是只生成一張看起來很厲害的首頁。</p>

<h3 id="2-大型-repository-的長時間任務">2. 大型 Repository 的長時間任務</h3>

<p>例如跨模組重構、測試補齊、工具鏈整合、GPU kernel、資料處理與需要終端機反覆驗證的工作。這些才有機會用到它的長軌跡能力。</p>

<h3 id="3-可交付的知識工作">3. 可交付的知識工作</h3>

<p>不要只測「幫我摘要 20 份報告」。測它能不能交付帶來源的研究、試算表、互動圖表、簡報或可檢查的資料產物，並把事實、推論與不確定性分開。</p>

<h3 id="4-開放權重與私有部署的前置研究">4. 開放權重與私有部署的前置研究</h3>

<p>大型雲端供應商、研究機構與有 64+ 加速器 supernode 能力的組織，可以先評估權重發布後的部署路線。一般個人或中小企業則不要被「開放權重」三個字騙去下載一艘貨輪。</p>

<p>K3 使用 MXFP4 權重時，2.8 兆參數的理論緊密打包下限就約 <strong>1.4 TB</strong>，還沒算 metadata、共享結構、執行環境、KV cache、通訊與冗餘。官方建議至少 64 個加速器的 supernode，不是因為他們討厭玩家顯示卡。</p>

<h2 id="一個務實的-k3-pilot">一個務實的 K3 Pilot</h2>

<p>不要全面遷移。先挑 20～40 個真實任務，分成四組：</p>

<ul>
  <li>前端／視覺開發；</li>
  <li>Repository 級軟體工程；</li>
  <li>瀏覽與研究；</li>
  <li>文件、試算表與互動成果。</li>
</ul>

<p>同一批任務至少比較 K3、現有主力閉源模型，以及一個較便宜的開放權重模型。固定 Repository commit、Prompt、工具、權限、時間上限與驗收條件，記錄：</p>

<ul>
  <li>第一次通過率；</li>
  <li>人工修正分鐘數；</li>
  <li>測試、視覺回歸與事實查核結果；</li>
  <li>Token、快取、工具呼叫與總成本；</li>
  <li>P50／P95 完成時間；</li>
  <li>越權、過度主動與誤判完成的次數；</li>
  <li>Harness、Provider、reasoning effort 與版本。</li>
</ul>

<p>尤其不要把 K3 硬塞進現有 Router，然後在任務中途切過去。K3 適合從任務開始就被正確分流，使用相容 Harness 完整跑完；它目前不是理想的臨時備胎。</p>

<p>最後輸出的決策，也不該是「K3 贏了，所以全部換掉」。比較合理的結果可能是：</p>

<ul>
  <li>K3：前端、視覺程式、長程研究與特定重型工程；</li>
  <li>Claude／GPT：需要更成熟指令遵循、商務文字與高可靠體驗的工作；</li>
  <li>較小開放模型：分類、摘要、格式轉換與大量低風險任務；</li>
  <li>人類：權限、品味、風險與最後驗收。</li>
</ul>

<p>這才是真正的模型路由，不是把 fallback 名單寫長一點。</p>

<h2 id="最後判斷閉源不再是能力保證開放也不是免費午餐">最後判斷：閉源不再是能力保證，開放也不是免費午餐</h2>

<p>Kimi K3 沒有終結 Claude，也沒有把 GPT 送進博物館。</p>

<p>它做的事情比較麻煩：它讓原本很方便的二分法失效了。</p>

<p>以前可以把閉源模型理解成能力前沿，把開放模型理解成便宜、可控、稍微落後的替代方案。現在這條線被前端開發、工具操作、長流程 Agent、視覺程式與研究工作切得亂七八糟。<strong>開放模型不必先拿下通用總冠軍，才有資格在真正的工作裡領先。</strong></p>

<p>當然，K3 的權重還沒落地，授權還沒驗收，技術報告還沒公開，速度不快，輸出很長，部署也重得離譜。把這些省略掉，只剩「全球最大開源模型」，跟只看排行榜第一名沒有本質差別。</p>

<p>對我來說，K3 最值得記住的不是 2.8 兆。</p>

<p>是從這一代開始，選擇開放模型不再只是為了省錢或避免供應商綁定。有些時候，你選它，是因為它真的把某一種工作做得更好。</p>

<p>這才是閉源模型真正需要擔心的地方。</p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://www.kimi.com/blog/kimi-k3">Kimi：Kimi K3 Tech Blog——Open Frontier Intelligence</a></li>
  <li><a href="https://platform.kimi.com/docs/guide/kimi-k3-quickstart">Kimi API：Kimi K3 模型、思考歷史、視覺輸入、快取與限制</a></li>
  <li><a href="https://platform.kimi.ai/docs/pricing/limits">Kimi API：Kimi K3 價格與帳戶流量限制</a></li>
  <li><a href="https://artificialanalysis.ai/models/kimi-k3">Artificial Analysis：Kimi K3 Intelligence、Speed、Price 與技術規格</a></li>
  <li><a href="https://artificialanalysis.ai/models/kimi-k3/providers">Artificial Analysis：Kimi K3 Provider 速度、延遲與混合價格</a></li>
  <li><a href="https://arena.ai/leaderboard/code/webdev?rankBy=labs">Arena：WebDev AI Leaderboard</a></li>
  <li><a href="https://z.ai/blog/glm-5.2">Z.ai：GLM-5.2——MIT 授權與長程 Agent 技術說明</a></li>
  <li><a href="https://opensource.org/ai/open-source-ai-definition">Open Source Initiative：Open Source AI Definition 1.0</a></li>
  <li><a href="https://www.reuters.com/world/china/chinas-moonshot-unveils-worlds-largest-open-ai-model-closing-us-rivals-2026-07-17/">Reuters：Moonshot unveils Kimi K3</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="kimi-k3" /><category term="open-weight-llm" /><category term="ai-agent" /><category term="agentic-engineering" /><summary type="html"><![CDATA[Kimi K3 以 2.8 兆參數、100 萬 token、原生視覺與長程 Agent 能力進入前沿模型第一梯隊，並在前端開發、程式與代理任務的部分評測超越閉源旗艦。本文拆解它的 MoE、KDA、AttnRes、API 成本、Harness 限制，以及『已上線但尚未開放權重』的關鍵差別。]]></summary></entry><entry><title type="html">別再只看排行榜第一名：Artificial Analysis 與 2026 LLM 評估方法全解析</title><link href="https://swanky.github.io/technical/artificial-analysis-llm-evaluation-2026/" rel="alternate" type="text/html" title="別再只看排行榜第一名：Artificial Analysis 與 2026 LLM 評估方法全解析" /><published>2026-07-17T00:00:00+00:00</published><updated>2026-07-17T00:00:00+00:00</updated><id>https://swanky.github.io/technical/artificial-analysis-llm-evaluation-2026</id><content type="html" xml:base="https://swanky.github.io/technical/artificial-analysis-llm-evaluation-2026/"><![CDATA[<p>每次新模型發布，大家第一個問題通常都是：「它排第幾名？」</p>

<p>這個問題很快，也很容易問錯。</p>

<p>同一個模型換一個 Provider、推理強度、Agent Harness、工具環境或快取策略，速度、成本與任務成功率都可能完全不同。排行榜上的名稱看起來一樣，真正上線的卻不是同一套系統。</p>

<p>Artificial Analysis 有價值的地方，不是再做一張更長的排行榜，而是把模型能力、Agent 任務、API 效能與成本放到同一個觀察介面。</p>

<p>但它仍然不能替企業回答最後一題：<strong>哪一套模型系統，能在可接受的成本、延遲、人工介入與風險下，穩定完成我的工作？</strong></p>

<p>這篇文章要處理的，就是從公開排行榜走到實際選型，中間那段最容易被省略的路。</p>

<h2 id="先給結論排行榜是雷達不是方向盤">先給結論：排行榜是雷達，不是方向盤</h2>

<p>選擇大型語言模型，至少要同時看四件事：</p>

<ol>
  <li><strong>能力</strong>：模型能否理解、推理、寫程式並完成多步驟任務；</li>
  <li><strong>成本</strong>：不是 API 牌價，而是每個合格成果的總成本；</li>
  <li><strong>體驗</strong>：首字延遲、第一個可讀答案、完整任務時間與長尾等待；</li>
  <li><strong>可靠度</strong>：錯誤率、工具恢復、重大失敗與人工接手比例。</li>
</ol>

<p>只看 Intelligence Index，會忽略速度與成本；只看 token 單價，會忽略模型為了完成同一件事到底用了多少 token；只看每秒輸出速度，又會忽略模型可能在正式回答前先想了半分鐘。</p>

<p>真正的部署單位從來不是一個 model slug，而是：</p>

<blockquote>
  <p><strong>Model + Configuration + Provider + Harness + Tools + Routing</strong></p>
</blockquote>

<h2 id="artificial-analysis-的定位把模型強不強與服務好不好拆開">Artificial Analysis 的定位：把「模型強不強」與「服務好不好」拆開</h2>

<p>Artificial Analysis 是獨立的 AI 模型與推論服務分析平台。它同時整理三個容易被混在一起的層次：</p>

<h3 id="model">Model</h3>

<p>被訓練出來的模型本體。能力受到權重、訓練資料、後訓練、推理機制與安全策略影響。</p>

<h3 id="providerendpoint">Provider／Endpoint</h3>

<p>真正被呼叫的 API。排隊、Batching、量化、快取、區域節點與流量限制，都會改變使用者感受到的速度與穩定度。</p>

<h3 id="agent-system">Agent System</h3>

<p>模型外圍的 Prompt、工具、記憶、重試、Context 管理、權限與執行框架。對 Coding Agent 或企業自動化來說，這一層經常與模型本身同樣重要。</p>

<p>同一個開放權重模型放在不同 Provider 上，可能有不同的 Output Speed、Time to First Token、可用 Context、價格與錯誤率。</p>

<p>所以看到「某模型每秒 100 token」時，第一個問題不該是「它好快」，而是：<strong>哪一個 Provider、哪個區域、什麼 Prompt 長度、什麼時間與哪種負載？</strong></p>

<h2 id="intelligence-index-v412026-年開始更像工作測驗不只像考卷">Intelligence Index v4.1：2026 年開始更像工作測驗，不只像考卷</h2>

<p>Artificial Analysis Intelligence Index 是把多項評估加權後形成的複合指標。這裡的 Intelligence 不是人類心理測驗中的智商，而是模型在一套英文、純文字測試裡呈現的綜合能力。</p>

<p>v4.1 分成四大類：</p>

<table>
  <thead>
    <tr>
      <th>類別</th>
      <th style="text-align: right">權重</th>
      <th>核心問題</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Agents</td>
      <td style="text-align: right">34%</td>
      <td>能否持續規劃、操作工具、維持狀態並交付成果</td>
    </tr>
    <tr>
      <td>Coding</td>
      <td style="text-align: right">24%</td>
      <td>能否在程式、終端機與科學運算環境解決問題</td>
    </tr>
    <tr>
      <td>Scientific</td>
      <td style="text-align: right">24%</td>
      <td>能否處理高難度科學、數學與研究問題</td>
    </tr>
    <tr>
      <td>General</td>
      <td style="text-align: right">18%</td>
      <td>知識正確率、避免幻覺與長文件整合</td>
    </tr>
  </tbody>
</table>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/artificial-analysis-llm-evaluation-2026/aa-index-v41.svg" alt="Artificial Analysis Intelligence Index v4.1 權重圖：Agents 34%、Coding 24%、Scientific 24%、General 18%" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖一：Agent 任務已占最大權重，模型競爭正從回答問題轉向完成工作</figcaption>
</figure>

<p>v4.1 由九項評測組成：</p>

<table>
  <thead>
    <tr>
      <th>類別</th>
      <th>評測</th>
      <th style="text-align: right">權重</th>
      <th>主要衡量內容</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Agents</td>
      <td>GDPval-AA v2</td>
      <td style="text-align: right">20%</td>
      <td>真實專業工作、資料蒐集與文件交付</td>
    </tr>
    <tr>
      <td>Agents</td>
      <td>τ³-Banking</td>
      <td style="text-align: right">14%</td>
      <td>知識查閱、對話協作與銀行流程操作</td>
    </tr>
    <tr>
      <td>Coding</td>
      <td>Terminal-Bench v2.1</td>
      <td style="text-align: right">16%</td>
      <td>終端機、系統管理、資料與程式任務</td>
    </tr>
    <tr>
      <td>Coding</td>
      <td>SciCode</td>
      <td style="text-align: right">8%</td>
      <td>科學研究情境的 Python 程式設計</td>
    </tr>
    <tr>
      <td>Scientific</td>
      <td>Humanity’s Last Exam</td>
      <td style="text-align: right">12%</td>
      <td>高難度跨領域知識與推理</td>
    </tr>
    <tr>
      <td>Scientific</td>
      <td>GPQA Diamond</td>
      <td style="text-align: right">6%</td>
      <td>研究所與博士級科學問題</td>
    </tr>
    <tr>
      <td>Scientific</td>
      <td>CritPt</td>
      <td style="text-align: right">6%</td>
      <td>研究等級物理與數學推理</td>
    </tr>
    <tr>
      <td>General</td>
      <td>AA-Omniscience</td>
      <td style="text-align: right">12%</td>
      <td>知識正確率與避免幻覺</td>
    </tr>
    <tr>
      <td>General</td>
      <td>AA-LCR</td>
      <td style="text-align: right">6%</td>
      <td>長文件資訊擷取與整合</td>
    </tr>
  </tbody>
</table>

<p>這套權重傳達三個訊號。</p>

<p>第一，Agentic Work 已經進入核心，而不是排行榜旁邊的附加欄位。</p>

<p>第二，Benchmark 也需要版本治理。當某些題目逐漸飽和、失去區分前沿模型的能力，就應該被降權或移除。</p>

<p>第三，能力分數開始與 Cost per Task、Time per Task、Tokens per Task 放在一起。模型不只要答對，還要付得起、等得到，並且能在合理步數裡完成。</p>

<h2 id="2026-llm-評估地圖從公開訊號走向部署決策">2026 LLM 評估地圖：從公開訊號走向部署決策</h2>

<p>評估不是一條由低分走向高分的直線，而是一張逐層收斂的地圖。</p>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/artificial-analysis-llm-evaluation-2026/aa-evaluation-map.svg" alt="2026 LLM 評估地圖：從人類偏好、綜合能力、專項能力、營運品質到私有業務評估，最後形成模型、Provider、Harness 與 Routing 的部署決策" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖二：越接近真正的部署決策，越不能只靠公開排行榜</figcaption>
</figure>

<h3 id="第一層人類偏好">第一層：人類偏好</h3>

<p>LMArena 透過匿名成對比較，回答「人類比較喜歡哪個回答」。它適合觀察對話體驗、文風與一般使用感受，但不是單純的客觀正確率。</p>

<h3 id="第二層綜合能力">第二層：綜合能力</h3>

<p>Artificial Analysis Intelligence Index、HLE、GPQA Diamond 等指標，用來快速縮小前沿模型候選池。</p>

<h3 id="第三層專項能力">第三層：專項能力</h3>

<p>Coding Agent、軟體工程、專業知識工作、SaaS 自動化、多語言、視覺與長上下文，都需要不同的尺。</p>

<h3 id="第四層營運體質">第四層：營運體質</h3>

<p>TTFT、TTFA、Output Speed、P95、Error Rate、Rate Limit、Context Cache 與 Cost per Task，決定模型能不能進入產品。</p>

<h3 id="第五層私有業務評估">第五層：私有業務評估</h3>

<p>真實任務成功率、重大錯誤、人工接手、權限風險與每個合格成果的成本，才是最後的部署依據。</p>

<p>實務上可以先用前兩層，把數百個模型縮小到三至五個；再用專項能力與營運條件淘汰不合格方案，最後用私有任務決定分工與路由。</p>

<h2 id="不要把速度延遲與任務時間混成一個數字">不要把速度、延遲與任務時間混成一個數字</h2>

<p>Reasoning Model 讓「回應速度」變得更難描述。收到第一個 token，不代表使用者已經看到正式答案；開始輸出後很快，也不代表整體任務較快。</p>

<table>
  <thead>
    <tr>
      <th>指標</th>
      <th>實際意義</th>
      <th>最適合回答的問題</th>
      <th>常見誤解</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>TTFT</td>
      <td>送出請求到第一個 token</td>
      <td>串流是否快速啟動</td>
      <td>第一個 token 可能只是推理內容</td>
    </tr>
    <tr>
      <td>TTFA</td>
      <td>送出請求到第一個正式答案 token</td>
      <td>使用者何時看到可讀答案</td>
      <td>經常被 TTFT 掩蓋</td>
    </tr>
    <tr>
      <td>Output Speed</td>
      <td>開始輸出後每秒產生多少 token</td>
      <td>長回答與高吞吐工作</td>
      <td>不包含前置推理與排隊</td>
    </tr>
    <tr>
      <td>E2E Time</td>
      <td>送出請求到完整回答結束</td>
      <td>完整互動等待</td>
      <td>會受到回答長度影響</td>
    </tr>
    <tr>
      <td>Time per Task</td>
      <td>完成一個評估任務的時間</td>
      <td>長時程 Agent 效率</td>
      <td>不一定包含外部工具等待</td>
    </tr>
    <tr>
      <td>Cost per Task</td>
      <td>每個評估任務的 token 成本</td>
      <td>模型工作量與經濟性</td>
      <td>不等於成功業務任務成本</td>
    </tr>
  </tbody>
</table>

<figure style="margin:2em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/artificial-analysis-llm-evaluation-2026/aa-latency-metrics.svg" alt="LLM 延遲指標圖：請求送出後依序經過排隊與首 token、答案前推理、正式答案輸出，最後才是完整任務時間；TTFT、TTFA、Output Speed 與 E2E Time 衡量不同階段" style="width:100%;height:auto;border-radius:14px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.7em;">圖三：每秒輸出速度只量到最後一段，不能代表完整體驗</figcaption>
</figure>

<p>Artificial Analysis 的效能測試使用固定 Prompt Shape，並持續量測公開端點，避免拿一次速度測試當成長期服務品質。</p>

<p>企業仍應用自己的地區、尖峰流量、Prompt 長度、併發量與工具環境，重測 P50、P95、Timeout 和 Error Rate。</p>

<h2 id="從-token-price-升級到-cost-per-successful-task">從 Token Price 升級到 Cost per Successful Task</h2>

<p>模型 A 的牌價比較便宜，不代表完成工作比較便宜。</p>

<p>假設模型 A 每次嘗試成本 US$0.20，成功率只有 40%，平均每個成功任務成本是 US$0.50。</p>

<p>模型 B 每次嘗試成本 US$0.35，成功率 90%，平均每個成功任務反而只要約 US$0.39。</p>

<blockquote>
  <p><strong>每個成功任務成本 = 平均嘗試成本 ÷ 任務成功率</strong></p>
</blockquote>

<p>而且這還只是模型成本。完整成本還包括搜尋、資料庫、Tool API、重試、人工複核、返工、錯誤處理與風險。</p>

<p>真正該優化的不是「每百萬 token 最便宜」，而是：<strong>符合品質門檻，而且不用重新做一次的成果。</strong></p>

<h2 id="常見-benchmark-的分工每一把尺都有自己的形狀">常見 Benchmark 的分工：每一把尺都有自己的形狀</h2>

<table>
  <thead>
    <tr>
      <th>類型</th>
      <th>代表評測或平台</th>
      <th>適合用途</th>
      <th>主要限制</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>人類偏好</td>
      <td><a href="https://arena.ai/blog/arena-rank/">LMArena Arena-Rank</a></td>
      <td>對話體驗、文風與一般使用感受</td>
      <td>會受篇幅、語氣與展示方式影響</td>
    </tr>
    <tr>
      <td>綜合能力</td>
      <td><a href="https://artificialanalysis.ai/methodology/intelligence-benchmarking">Artificial Analysis Intelligence Index</a></td>
      <td>初步篩選與跨模型比較</td>
      <td>權重代表平台的能力觀點</td>
    </tr>
    <tr>
      <td>硬推理</td>
      <td><a href="https://lastexam.ai/">HLE</a>、<a href="https://github.com/idavidrein/gpqa">GPQA Diamond</a>、<a href="https://github.com/TIGER-AI-Lab/MMLU-Pro">MMLU-Pro</a></td>
      <td>科學、研究與知識密集任務</td>
      <td>不代表能操作工具或完成流程</td>
    </tr>
    <tr>
      <td>程式生成</td>
      <td><a href="https://livecodebench.github.io/">LiveCodeBench</a></td>
      <td>演算法與程式碼生成</td>
      <td>與大型既有系統維護仍有距離</td>
    </tr>
    <tr>
      <td>軟體工程</td>
      <td><a href="https://www.swebench.com/">SWE-bench 系列</a></td>
      <td>Repository 級開發與除錯</td>
      <td>高度依賴 Harness、工具與版本</td>
    </tr>
    <tr>
      <td>終端機 Agent</td>
      <td><a href="https://www.tbench.ai/">Terminal-Bench</a></td>
      <td>Coding Agent、DevOps、CLI 工作</td>
      <td>分數同時反映模型與外圍系統</td>
    </tr>
    <tr>
      <td>專業知識工作</td>
      <td><a href="https://artificialanalysis.ai/evaluations/gdpval-aa">GDPval-AA</a>、<a href="https://artificialanalysis.ai/evaluations/aa-briefcase">AA-Briefcase</a></td>
      <td>文件、簡報、試算表與專業成果</td>
      <td>評分成本高，部分使用模型評審</td>
    </tr>
    <tr>
      <td>SaaS 自動化</td>
      <td><a href="https://artificialanalysis.ai/evaluations/automationbench-aa">AutomationBench-AA</a></td>
      <td>企業 Agent 與流程自動化</td>
      <td>模擬環境不等於真實權限系統</td>
    </tr>
    <tr>
      <td>營運品質</td>
      <td><a href="https://artificialanalysis.ai/methodology/performance-benchmarking">AA API 效能測試（TTFT、P95、Error Rate、Cost per Task）</a></td>
      <td>生產部署與容量規劃</td>
      <td>Provider、區域與時間都會改變</td>
    </tr>
  </tbody>
</table>

<p>把不同 Benchmark 的第一名直接放進同一張「總冠軍」表，就像拿短跑、游泳、象棋與搬家公司比一個總分。數字可以算，結論通常沒什麼用。</p>

<h2 id="公開排行榜的七個常見陷阱">公開排行榜的七個常見陷阱</h2>

<h3 id="1-複合指數一定有價值判斷">1. 複合指數一定有價值判斷</h3>

<p>將多項評測合併成單一分數，就必須決定權重。Agent 34% 對企業自動化合理，對中文創作或純數學研究未必合理。</p>

<h3 id="2-模型分數經常是系統分數">2. 模型分數經常是系統分數</h3>

<p>Coding 與 Agent Benchmark 會同時受到 Harness、Prompt、工具、回合限制、重試與 Context 管理影響。</p>

<h3 id="3-靜態資料集會老化">3. 靜態資料集會老化</h3>

<p>題目可能進入訓練資料，模型也會逐漸把既有評測磨到飽和。Benchmark 必須有版本、日期與污染治理。</p>

<h3 id="4-llm-judge-也有自己的偏好">4. LLM Judge 也有自己的偏好</h3>

<p>篇幅、格式、引用與模型家族都可能影響評分。可程式驗證的任務，應優先使用測試與後端狀態檢查。</p>

<h3 id="5-平均值會吃掉長尾風險">5. 平均值會吃掉長尾風險</h3>

<p>平均延遲不代表每次都快。生產環境至少要看 P50、P95、P99、Timeout、Retry 與 Rate Limit。</p>

<h3 id="6-context-window-不等於長文能力">6. Context Window 不等於長文能力</h3>

<p>API 接受一百萬 token，不代表模型能可靠召回遠端資訊、整合證據並維持多輪指令一致性。</p>

<h3 id="7-名稱沒變行為也可能已經變了">7. 名稱沒變，行為也可能已經變了</h3>

<p>安全策略、System Prompt、推論硬體、路由、量化與快取都可能在服務端更新，所以私有評估必須能重跑。</p>

<p>更準確地說，一個 Benchmark 分數其實是：</p>

<blockquote>
  <p><strong>Score = f(Model, Version, Prompt, Effort, Tools, Harness, Budget, Retries, Evaluator)</strong></p>
</blockquote>

<h2 id="建立私有評估集把需求變成能重跑的測試">建立私有評估集：把需求變成能重跑的測試</h2>

<p>公開 Benchmark 不知道你的 Repository 結構、中文文風、資料品質、權限政策與可接受風險。</p>

<p>私有 Eval 的目的，是把「大家覺得這模型不錯」變成可以重跑、比較與回歸的工程資產。</p>

<p>起步不需要幾千題。先準備 30 至 100 個真實任務，涵蓋：</p>

<ul>
  <li>正常需求；</li>
  <li>模糊或互相衝突的需求；</li>
  <li>缺少資料；</li>
  <li>工具失敗；</li>
  <li>權限不足；</li>
  <li>需要人工核准的高風險操作。</li>
</ul>

<p>最低限度應追蹤：</p>

<table>
  <thead>
    <tr>
      <th>指標</th>
      <th>用途</th>
      <th>建議切分</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Task Success Rate</td>
      <td>任務是否真正完成</td>
      <td>任務類型、語言、Context 長度</td>
    </tr>
    <tr>
      <td>Critical Failure Rate</td>
      <td>不可接受錯誤比例</td>
      <td>資安、資料、財務、法遵、破壞性操作</td>
    </tr>
    <tr>
      <td>Human Intervention Rate</td>
      <td>人工接手與複核成本</td>
      <td>修正、重跑、完全接管</td>
    </tr>
    <tr>
      <td>Cost per Successful Task</td>
      <td>真實經濟成本</td>
      <td>模型、工具、人工與失敗重試</td>
    </tr>
    <tr>
      <td>P50／P95 Completion Time</td>
      <td>一般體驗與長尾風險</td>
      <td>推論、工具等待與 Queue Time</td>
    </tr>
    <tr>
      <td>Tool Recovery Rate</td>
      <td>工具失敗後能否恢復</td>
      <td>重試、替代工具與請求人類</td>
    </tr>
    <tr>
      <td>Guardrail Violation Rate</td>
      <td>政策與權限控制</td>
      <td>讀取、寫入、寄送、付款與刪除</td>
    </tr>
    <tr>
      <td>Output Quality</td>
      <td>成果是否可直接交付</td>
      <td>正確、完整、格式、引用與可讀性</td>
    </tr>
  </tbody>
</table>

<p>每次測試還要固定模型版本、Provider、區域、推理強度、Prompt、Harness、工具政策、Token Budget、最大回合數與重試規則。</p>

<p>否則下次分數變了，你只會知道「有東西變了」，不知道變的是模型、系統還是測試本身。</p>

<h2 id="最後的決策不是一名冠軍而是一套路由">最後的決策不是一名冠軍，而是一套路由</h2>

<p>成熟的模型選型，很少會得到「所有任務都用同一個最強模型」這種答案。</p>

<p>比較合理的結果通常是：</p>

<ul>
  <li>低風險、大量、格式固定的任務，交給便宜模型；</li>
  <li>跨模組工程與高風險任務，交給成功率更高的主力模型；</li>
  <li>文件、簡報或特定語言，交給擅長該輸出的模型；</li>
  <li>權限、品味、重大風險與最後驗收，保留給人類。</li>
</ul>

<p>公開排行榜負責找到候選，私有任務決定分工，生產遙測則負責持續修正路由。</p>

<p>到了 2026 年，最值得問的已經不是「哪個模型排行榜最高」，而是：</p>

<blockquote>
  <p><strong>在可接受的成本、延遲、風險與人工介入範圍內，哪套模型系統能最穩定地完成工作？</strong></p>
</blockquote>

<p>這個問題沒有永恆冠軍，但可以有一套持續更新、能被驗證的答案。</p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://artificialanalysis.ai/methodology/intelligence-benchmarking">Artificial Analysis：Intelligence Benchmarking Methodology</a></li>
  <li><a href="https://artificialanalysis.ai/methodology/performance-benchmarking">Artificial Analysis：Language Model API Performance Benchmarking</a></li>
  <li><a href="https://artificialanalysis.ai/articles/artificial-analysis-intelligence-index-v4-1">Artificial Analysis：Intelligence Index v4.1 Announcement</a></li>
  <li><a href="https://artificialanalysis.ai/methodology">Artificial Analysis：General Benchmarking Methodology</a></li>
  <li><a href="https://lmarena.ai/blog/arena-rank/">LMArena：Arena-Rank Methodology</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="artificial-analysis" /><category term="llm-evaluation" /><category term="ai-agent" /><category term="modelops" /><summary type="html"><![CDATA[排行榜只能幫你縮小候選，不能替你做採購與架構決策。本文拆解 Artificial Analysis Intelligence Index v4.1、Agentic Benchmark、速度與成本，並建立可落地的私有評估與模型路由方法。]]></summary></entry><entry><title type="html">別再問哪個 AI Coding 工具最好：2026 年選型的九層決策框架</title><link href="https://swanky.github.io/technical/ai-coding-tool-selection-2026/" rel="alternate" type="text/html" title="別再問哪個 AI Coding 工具最好：2026 年選型的九層決策框架" /><published>2026-07-12T00:00:00+00:00</published><updated>2026-07-12T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-coding-tool-selection-2026</id><content type="html" xml:base="https://swanky.github.io/technical/ai-coding-tool-selection-2026/"><![CDATA[<p>我最近整理自己的 AI Coding 工具時，發現桌面上已經不是「選一套 IDE」那麼簡單。</p>

<p>Claude Code、Codex、Cursor、OpenCode、Hermes Agent，各自有自己的設定檔、skills、模型、provider、權限與帳單。再加上 OpenRouter、本機模型、MCP 和 cloud agent，整件事很快就從工具選擇變成一個小型分散式系統。</p>

<p>這裡面最荒謬的地方是，市場還是很喜歡問：「哪一個最好？」</p>

<p>這個問題在 2026 年已經不太有用了。<strong>真正的選擇單位不是單一模型，也不是單一 CLI，而是一整套能把需求安全地變成可接受變更的工作系統。</strong></p>

<blockquote>
  <p>本文資料整理至 2026 年 7 月 12 日。這個市場以週為單位變動，價格、方案額度、模型名稱與指令，採購或部署當天仍應回官方頁面核對。</p>
</blockquote>

<h2 id="先給結論工具不需要唯一但責任必須唯一">先給結論：工具不需要唯一，但責任必須唯一</h2>

<p>如果只想先記住幾件事，我的答案是這七條：</p>

<ol>
  <li><strong>LLM 決定能力上限，harness 決定能力能不能穩定變成可接受的修改，組織流程決定它能不能安全上線。</strong></li>
  <li><strong>多工具並用已是常態。</strong>但保留選擇權，不等於讓每個人把所有工具、模型和 MCP 都接進公司環境。</li>
  <li><strong>終端主力先比較 Claude Code 與 Codex；IDE-first 團隊先比較 Cursor 與 GitHub Copilot。</strong></li>
  <li><strong>專案共通知識以 <code class="language-plaintext highlighter-rouge">AGENTS.md</code> 為核心。</strong>Claude Code 再用薄 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 匯入；不要幻想所有設定檔、skills、hooks 與權限都能零修改共用。</li>
  <li><strong>開源 harness 不等於資料留在本機。</strong>OpenCode、Hermes 接上雲端 provider，程式碼和 prompt 一樣會離開裝置。</li>
  <li><strong>OpenRouter 提供模型與 provider 選擇，不會自動送你一張合規證書。</strong>資料政策、ZDR、allowlist、region、參數支援與預算都要自己設。</li>
  <li><strong>CP 值用「每個被接受的任務」算。</strong>月費和每百萬 token 價格，只是成本最容易被看到的那一小塊。</li>
</ol>

<p>我給個人技術顧問的實用組合是：<strong>Claude Code 或 Codex 擇一為主力，另一個作不同模型家族的 reviewer；OpenCode 當 model lab；Hermes 負責非機密研究、排程與跨工具編排；OpenRouter 只承接完成資料分級的工作。</strong></p>

<p>企業則不要先選冠軍。從 Claude Code、Codex、GitHub Copilot、Cursor 中挑兩個進 pilot，用同一批真實 ticket、同一套測試與品質門檻比較。</p>

<h2 id="模型只是九層裡的一層">模型只是九層裡的一層</h2>

<p>很多人已經知道要分開看 LLM 與 agent harness。這比只看 benchmark 好，但還不夠。</p>

<p>對企業導入或長期個人工作流，我會把 AI Coding 系統拆成九層：</p>

<figure style="margin:1.8em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/ai-coding-selection-2026/nine-layer-framework.svg" alt="AI Coding 選型九層決策框架：業務目標、操作介面、Agent harness、LLM、推論供應商、Gateway、專案知識、執行治理、評估營運" style="width:100%;height:auto;border-radius:12px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖一：模型只是其中一層，任何一層接近零，benchmark 再高都救不了導入</figcaption>
</figure>

<table>
  <thead>
    <tr>
      <th>層次</th>
      <th>真正要問的問題</th>
      <th>常見選項或產物</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>業務目標與任務</td>
      <td>想縮短什麼時間、降低什麼風險？</td>
      <td>探索、重構、migration、測試、review、incident</td>
    </tr>
    <tr>
      <td>操作介面</td>
      <td>人在哪裡和 agent 協作？</td>
      <td>IDE、CLI、Desktop、Web、Cloud Agent、CI</td>
    </tr>
    <tr>
      <td>Agent harness</td>
      <td>模型怎麼搜尋、規劃、編輯、驗證與回復？</td>
      <td>tool loop、plan、patch、compaction、subagent、worktree</td>
    </tr>
    <tr>
      <td>LLM</td>
      <td>需要什麼能力、上下文與延遲？</td>
      <td>coding、reasoning、tool use、vision、structured output</td>
    </tr>
    <tr>
      <td>推論供應商</td>
      <td>同一模型由誰部署？能力和政策是否一致？</td>
      <td>官方 API、OpenRouter provider、Bedrock、Vertex、on-prem</td>
    </tr>
    <tr>
      <td>Gateway／Router</td>
      <td>如何管 key、fallback、成本與資料政策？</td>
      <td>OpenRouter、LiteLLM、企業 AI Gateway、內部 proxy</td>
    </tr>
    <tr>
      <td>專案知識與協定</td>
      <td>Agent 如何取得正確而可維護的脈絡？</td>
      <td><code class="language-plaintext highlighter-rouge">AGENTS.md</code>、rules、skills、MCP、ADR、spec</td>
    </tr>
    <tr>
      <td>執行與治理</td>
      <td>Agent 可以在哪裡做什麼？誰能稽核？</td>
      <td>sandbox、network、secrets、SSO、RBAC、audit</td>
    </tr>
    <tr>
      <td>評估與營運</td>
      <td>如何證明值得？升級失敗怎麼回復？</td>
      <td>internal eval、版本 pinning、觀測、回滾、成本</td>
    </tr>
  </tbody>
</table>

<p>我會把成果寫成一個很不科學、但很實用的乘法：</p>

<blockquote>
  <p><strong>成果 = 模型能力 × harness 轉換效率 × 專案脈絡品質 × 驗證與組織能力。</strong></p>
</blockquote>

<p>乘法的麻煩是，只要一項接近零，其他項目堆再高都沒用。</p>

<p>同一個模型放進不同 harness，搜尋範圍、patch 方法、工具 parser、context compaction、測試 loop 都可能改變結果。同一個 model slug 交給不同 provider，也可能遇到量化、chat template、實際 context、cache、延遲或參數支援差異。</p>

<p>所以「它支援 OpenAI-compatible API」只代表門插得進去，不代表電壓一定對。</p>

<h2 id="採用很快信任沒有同步上升">採用很快，信任沒有同步上升</h2>

<p>2026 年 Pragmatic Engineer 針對 906 位受訪者的調查顯示，樣本雖偏資深、偏歐美科技公司，但很能反映重度採用者的行為：95% 每週使用 AI 工具，70% 同時使用 2～4 種，另有 15% 使用五種以上。在 regular agent users 中，Claude Code 的使用率為 71%，GitHub Copilot 46%，Cursor 39%。</p>

<p>這不能被解讀成全球市占。比較合理的解讀是：<strong>資深、重度 agent 使用者對 Claude Code 的口碑很強；到了大型企業，GitHub 身分、採購、政策與支援會改變答案。</strong>工程師最喜歡的工具，和企業最容易買的工具，從來就不是同一件事。</p>

<p>另一邊，Stack Overflow 2025 調查裡，46% 受訪者不信任 AI 準確性，信任者只有 33%；66% 的主要挫折是結果「幾乎正確，但還差一點」，45.2% 認為替 AI 產生的 code 除錯更花時間。</p>

<p>這幾個數字放在一起看，結論其實不浪漫：<strong>AI 很容易提高個人的產出感受，卻不會自動提高團隊共同理解、review 品質與維護責任。</strong></p>

<p>METR 在 2025 年曾觀察到熟悉自己開源 repository 的資深開發者使用 AI 反而慢 19%。但 METR 已在 2026 年明確說明，這個結果不應再被當成現在的定論；後續資料方向轉正，卻受到參與者與任務選擇偏差影響，仍不足以精確估算加速幅度。</p>

<p>DORA 的說法比較接近我自己的經驗：AI 是放大器。流程清楚、測試快、文件可用、feedback loop 短，它會放大優勢；需求模糊、變更批次過大、review 已經塞車，它也會把問題一起放大。</p>

<h2 id="七款工具我會怎麼定位">七款工具，我會怎麼定位</h2>

<p>下面這張表不是排名，而是先用來排除明顯不合適的選項。</p>

<table>
  <thead>
    <tr>
      <th>工具</th>
      <th>最適合</th>
      <th>模型自由度</th>
      <th>一句判斷</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Claude Code</td>
      <td>終端深度 coding、複雜重構</td>
      <td>低：Claude-native</td>
      <td>生態成熟；主要綁定模型家族與 Claude 工作流</td>
    </tr>
    <tr>
      <td>Codex</td>
      <td>OpenAI 生態、CLI／Desktop／cloud task</td>
      <td>中高</td>
      <td>本機比想像開放；雲端能力仍綁 ChatGPT workspace</td>
    </tr>
    <tr>
      <td>Grok Build</td>
      <td>新 harness、平行工作流試驗</td>
      <td>中</td>
      <td>適合非關鍵 repo pilot；Beta 版本風險仍高</td>
    </tr>
    <tr>
      <td>Hermes Agent</td>
      <td>個人排程、記憶、跨工具編排</td>
      <td>很高</td>
      <td>是 agent operating layer，不是 coding CLI 的一對一替代品</td>
    </tr>
    <tr>
      <td>Cursor</td>
      <td>IDE-first、Tab、視覺 review</td>
      <td>高</td>
      <td>UX 完整；平台綁定與重度 agent 成本要實測</td>
    </tr>
    <tr>
      <td>OpenCode</td>
      <td>OpenRouter／local、多 provider</td>
      <td>很高</td>
      <td>很好的 model lab；治理與維運責任在使用方</td>
    </tr>
    <tr>
      <td>GitHub Copilot</td>
      <td>GitHub Enterprise、大規模分發</td>
      <td>高</td>
      <td>企業控制面成熟；各 agent surface 仍要分開核對</td>
    </tr>
  </tbody>
</table>

<h3 id="claude-code成熟但不是中立-harness">Claude Code：成熟，但不是中立 harness</h3>

<p>Claude Code 的優勢不只是 Claude 模型，而是 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>、path-scoped rules、skills、subagents、hooks、MCP、permissions、plan、rewind 與 review 組成的工作方式。對陌生錯誤、跨檔案重構與需要反覆驗證的任務，它仍是我會先測的終端工具。</p>

<p>它的邊界也很清楚。官方 gateway 支援改變 Claude 的上游與企業網路路徑，但不是讓 Claude Code 改跑非 Claude 模型。這是模型 lock-in，沒有必要假裝不是。</p>

<h3 id="codexopenai-native但本機沒有想像中封閉">Codex：OpenAI-native，但本機沒有想像中封閉</h3>

<p>Codex 橫跨 CLI、Desktop／IDE 與 cloud task，支援 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>、skills、MCP、sandbox、review、plan 與 managed configuration。它特別適合已在 ChatGPT Business／Enterprise 的組織，也適合拿來當 Claude Code 之外的第二模型家族。</p>

<p>常見誤解是 Codex 只能跑 OpenAI。實際上，本機 Codex 可設定 OpenAI-compatible provider，也可用 <code class="language-plaintext highlighter-rouge">--oss</code> 連 Ollama 或 LM Studio。但這只證明 harness 能換 provider，不代表 reasoning、tool use、cache 或 cloud features 都和第一方路徑一樣。</p>

<h3 id="grok-build值得測但-beta-就是-beta">Grok Build：值得測，但 Beta 就是 Beta</h3>

<p>Grok Build 已有 project rules、skills、plugins、MCP、plan、tasks、queue、loop 與 headless scripting，也支援自訂 provider。現行官方頁面可免費試用，不應再沿用早期「一定要 Premium+」的資訊。</p>

<p>問題不是功能表太短，而是版本仍快速變動。企業可以從 read-only reviewer、隔離環境或非關鍵 repository 開始；不要因為免費，就順手把 production 權限也送出去。免費和便宜是財務形容詞，不是風險分類。</p>

<h3 id="hermes-agent負責編排不搶每一個-coding-任務">Hermes Agent：負責編排，不搶每一個 coding 任務</h3>

<p>Hermes 的差異在持久記憶、cron、訊息通道、background work、skills、fallback、OpenRouter 與跨工具委派。它適合回答「何時做、要做什麼、結果送去哪裡」，再把單一 repository 的深度 coding 交給 Claude Code、Codex 或 OpenCode。</p>

<p>Hermes 是 MIT 開源，但只要接雲端 LLM、web search、browser 或遠端 MCP，相關資料仍會送往供應商。對個人顧問，我會用它處理非機密研究、排程、內容與多模型實驗；公司機密 code 則留在企業核准的 inference、sandbox、secrets 與 audit 邊界內。</p>

<h3 id="cursor-與-copilot一個偏體驗一個偏控制面">Cursor 與 Copilot：一個偏體驗，一個偏控制面</h3>

<p>Cursor 把 Tab、Agent、rules、review、cloud agents 與團隊管理放進同一個 IDE。對不想先學 CLI agent 心智模型的團隊，摩擦確實比較低。但 daily agent 的 overage、平台費與模型用量要一起算。</p>

<p>GitHub Copilot 的優勢則是身分、repository、policy、IDE 分發、audit 與採購在同一控制面。這也是它在大型企業有優勢的原因。只是 CLI、IDE local agent、cloud agent、custom agent 與 MCP registry 的治理範圍仍要逐一核對，不能因為 logo 一樣，就當成政策一定相同。</p>

<h3 id="opencode很好的-model-lab不是自動合規機">OpenCode：很好的 model lab，不是自動合規機</h3>

<p>OpenCode 支援大量 providers、local model、<code class="language-plaintext highlighter-rouge">AGENTS.md</code>、agents、MCP 與 TUI／CLI。對個人實驗不同模型、OpenRouter 或內部 gateway，很有價值。</p>

<p>但 <code class="language-plaintext highlighter-rouge">/share</code>、provider retention、tool parser、Windows 維運、版本回歸與中央 audit 都要自己處理。開源讓你看得到和改得到；它沒有順便幫你聘一個資安團隊。</p>

<h2 id="個人和企業不該共用同一張排行榜">個人和企業，不該共用同一張排行榜</h2>

<p>個人重度使用者通常先看：既有訂閱能不能用、互動順不順、能不能按任務切模型、花費是否可見、Windows 是否穩定、設定能不能備份，以及不同資料能不能清楚分流。</p>

<p>我會這樣分工：</p>

<table>
  <thead>
    <tr>
      <th>角色</th>
      <th>建議選項</th>
      <th>理由</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>主力深度 coding</td>
      <td>Claude Code 或 Codex</td>
      <td>第一方模型整合、sandbox、review 與 agent loop 較成熟</td>
    </tr>
    <tr>
      <td>第二意見</td>
      <td>與主力不同家族的 Codex 或 Claude Code</td>
      <td>降低同一模型的系統性盲點</td>
    </tr>
    <tr>
      <td>IDE／autocomplete</td>
      <td>Cursor 或 Copilot</td>
      <td>日常補全與視覺協作摩擦低</td>
    </tr>
    <tr>
      <td>Model lab</td>
      <td>OpenCode ＋ OpenRouter</td>
      <td>方便比較 provider、模型與角色分工</td>
    </tr>
    <tr>
      <td>排程／跨工具編排</td>
      <td>Hermes</td>
      <td>記憶、cron、channels、fallback；限核准資料</td>
    </tr>
    <tr>
      <td>Git-native 精準補丁</td>
      <td>Aider</td>
      <td>輕量、diff 透明、平台綁定低</td>
    </tr>
  </tbody>
</table>

<p>企業則多了一整排不能用 prompt 代替的硬條件：SAML／OIDC、SCIM、RBAC、離職撤權、model allowlist、MCP registry、network egress、secrets、資料保留、audit、預算、自動停用、版本 pinning、support 與 rollback。</p>

<p>三個名詞尤其不要混在一起：</p>

<ul>
  <li><strong>不拿內容訓練模型</strong>：不代表不記錄，也不代表零保留。</li>
  <li><strong>Zero Data Retention</strong>：通常只描述推論端，不會自動涵蓋 web、plugin、MCP 與 metadata。</li>
  <li><strong>Data／Inference Residency</strong>：資料儲存與 GPU 推論在哪裡；登入、帳務、connector 和 metadata 可能是另一套範圍。</li>
</ul>

<p>Restricted data 的答案，很多時候不是挑一個自稱更隱私的 SaaS，而是<strong>不要送出</strong>。</p>

<h2 id="企業選型先淘汰再評分">企業選型先淘汰，再評分</h2>

<p>我不建議一開始就做「Claude 9.5 分、Codex 9.3 分」這種看起來精確的表格。先設 knockout gates，比較誠實。</p>

<figure style="margin:1.8em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/ai-coding-selection-2026/selection-funnel.svg" alt="企業 AI Coding 選型漏斗：先用資料、身分、權限、稽核與平台條件淘汰，再以相同真實任務 pilot 比較 accepted-task economics，最後形成核准組合與退出方案" style="width:100%;height:auto;border:1px solid #e2e8f0;border-radius:12px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖二：企業要先問「能不能安全使用」，再問「工程師喜不喜歡」</figcaption>
</figure>

<p>以下任一項不合格，就先不要進加權評分：</p>

<ul>
  <li>資料類別與 inference endpoint 不符；</li>
  <li>無法強制 SSO、撤權、model 或 MCP policy；</li>
  <li>sandbox、network 或 secrets 邊界不符合風險等級；</li>
  <li>無法取得必要 audit、DPA 或 retention 承諾；</li>
  <li>不能在目標 OS、repository 與 CI 穩定工作；</li>
  <li>供應商生命週期、support 或退出條件不可接受。</li>
</ul>

<p>通過後，再比較真實任務品質、修正時間、安全治理、TCO、穩定性、可攜性與開發體驗。權重依組織風險改，不要先愛上一個工具，再把試算表調成它會贏的樣子。</p>

<h2 id="agentsmd-可以共用但安全邊界不能寫在-markdown-裡"><code class="language-plaintext highlighter-rouge">AGENTS.md</code> 可以共用，但安全邊界不能寫在 Markdown 裡</h2>

<p>跨工具時，先分清楚四種東西：</p>

<table>
  <thead>
    <tr>
      <th>類型</th>
      <th>功能</th>
      <th>能不能當安全控制</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Context／instructions</td>
      <td>告訴 agent 架構、指令、慣例與禁區</td>
      <td>不能。模型可能忽略或誤解</td>
    </tr>
    <tr>
      <td>Skills／commands</td>
      <td>封裝可重複 workflow、prompt 與 script</td>
      <td>不能單獨當控制；script 仍需審查</td>
    </tr>
    <tr>
      <td>MCP／tools</td>
      <td>提供外部系統、資料或動作</td>
      <td>需搭配 allowlist、憑證與 tool-level permission</td>
    </tr>
    <tr>
      <td>Policy／sandbox／hooks</td>
      <td>強制檔案、網路、命令與核准邊界</td>
      <td>才是 enforcement，而且要驗證是否為 OS-level</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">AGENTS.md</code> 寫「不要碰 production」不是安全措施。真正的安全措施是 production credential 根本不在環境裡，network policy 擋得住，危險命令需要核准，CI 和 review 不讓未驗證變更進主線。</p>

<p>對多工具 repository，我建議：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>repo/
├── AGENTS.md                    # 共用事實、build/test、架構與禁區
├── CLAUDE.md                    # @AGENTS.md + 少量 Claude-only 說明
├── docs/ai/
│   ├── data-classification.md   # 哪些資料可送哪種 endpoint
│   ├── mcp-catalog.md           # 核准 server、owner、資料與權限
│   └── eval-tasks.md            # 內部評測任務與通過標準
├── .agents/skills/              # 可攜 workflow 的候選正本
├── .claude/                     # Claude rules、skills、settings
├── .codex/config.toml
├── .cursor/rules/
├── .opencode/
└── .github/copilot-instructions.md
</code></pre></div></div>

<p>共用事實只寫一份。工具專屬檔案只補能力差異和 override。Windows 環境不要為了看起來優雅就硬上 symlink；薄匯入檔通常比較不會在 zip、CI 或不同 Git 設定裡突然表演消失。</p>

<p><code class="language-plaintext highlighter-rouge">SKILL.md</code> 和 MCP 也是同理。可攜的是內容設計與 server contract，不是每個 client 的 discovery path、frontmatter、credential storage、approval 與 allowlist。每次工具升級，都要跑 smoke test 確認規則真的有載入、權限真的有擋住。</p>

<h2 id="openrouter-與本機模型自由度不是免費午餐">OpenRouter 與本機模型：自由度不是免費午餐</h2>

<p>OpenRouter 的價值很明確：一組 API 與帳務使用多模型、選 provider、做 fallback、記 usage、設預算，並依 latency、價格或資料政策挑 endpoint。拿來搭 Hermes、OpenCode、Cline、Aider 或內部評測，很方便。</p>

<p>它不會自動解決：</p>

<ul>
  <li>harness 對特定模型的 prompt 與工具最佳化；</li>
  <li>provider 的 tool parser、structured output、context 與 cache 差異；</li>
  <li>企業 SSO、SCIM、repository policy、OS sandbox 或 code provenance；</li>
  <li>web、plugin、MCP 等推論以外的資料流；</li>
  <li>已經輸出部分 token 後的無痕 failover。</li>
</ul>

<p>最低限度，我會 pin 明確 model／version，設定 provider allowlist、region、<code class="language-plaintext highlighter-rouge">data_collection: deny</code>、必要時使用 ZDR、開啟 <code class="language-plaintext highlighter-rouge">require_parameters: true</code>，並對 user、team、project 設預算和 rate limit。免費 endpoint 只用於公開資料、學習或低風險 PoC。</p>

<p>本機模型則適合 air-gap、固定版本、穩定工作量、敏感資料預處理，或已經證明小模型能過內部門檻的情境。但本機不等於免費。GPU 折舊、電力、量化損失、KV cache、serving、監控、併發與 on-call 工時都是真實成本。</p>

<p>以單張 24GB VRAM 來看，9B 級模型比較務實；量化的 24B～35B 可以試，但 context 要節制。模型頁寫 1M context，不代表消費級 GPU 會因為看到規格表就突然多長記憶體。</p>

<p>更常見的答案是 hybrid：local 做分類、索引、摘要與敏感內容預處理；低價 cloud model 做 scout／worker；強模型負責架構、複雜修改與最終 review。</p>

<h2 id="cp-值不是月費而是-accepted-task-economics">CP 值不是月費，而是 accepted-task economics</h2>

<p>Claude Pro、Cursor Pro、Copilot Pro，或 OpenRouter 上每百萬 token 幾毛錢，都是入場價格，不是總成本。</p>

<figure style="margin:1.8em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/ai-coding-selection-2026/accepted-task-economics.svg" alt="每個被接受任務的成本：席次與 API、人工修正與 review、重試等待回滾、平台維運治理，以及預期事故風險" style="width:100%;height:auto;border-radius:12px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖三：低價模型多跑五次，再讓資深工程師修半小時，通常不便宜</figcaption>
</figure>

<p>我比較在意的公式是：</p>

<blockquote>
  <p><strong>有效 CP 值 = 被接受且通過品質門檻的任務價值 ÷（席次＋推論＋等待＋重工＋維運＋治理＋資安風險成本）</strong></p>
</blockquote>

<p>Pilot 至少要記：</p>

<ul>
  <li>time to accepted PR／ticket；</li>
  <li>first-pass acceptance；</li>
  <li>人工修正與 review 分鐘數；</li>
  <li>build、test、lint、security gate 通過率；</li>
  <li>regression、rollback、re-open；</li>
  <li>實際 model、provider、token、cache、retry 與 subagent；</li>
  <li>每個 accepted task 的完整成本；</li>
  <li>30／60／90 天後的維護性與 technical debt。</li>
</ul>

<p>生成行數、prompt 次數、commit 數、登入率都很容易上升。它們和客戶價值沒有穩定關係，拿來當 KPI 只會鼓勵大家把更多東西生出來，再花更多時間刪掉。</p>

<h2 id="benchmark-用來篩選內部-eval-才能決策">Benchmark 用來篩選，內部 eval 才能決策</h2>

<p>SWE-bench、Terminal-Bench 和廠商 benchmark 可以顯示某個模型／agent 在特定資料集與 scaffold 下的能力，但不等於你的 Java monorepo、部署流程、安全規則或團隊速度。</p>

<p>分數背後至少有 harness、prompt、token budget、attempt 數、工具、題目版本與 pass criteria。就算 benchmark 通過，也不代表 human reviewer 願意接受。</p>

<p>我的做法是準備 20～40 個已知答案或可清楚驗收的真實任務，涵蓋探索、小修補、功能、重構、migration、review 與 incident：</p>

<ol>
  <li>用歷史人工資料建立 baseline，不只問「感覺快多少」。</li>
  <li>同一類任務隨機分配或 cross-over 比較兩個 harness，避免第二次作答已經知道答案。</li>
  <li>固定 repository commit、依賴、測試、network、<code class="language-plaintext highlighter-rouge">AGENTS.md</code> 與權限。</li>
  <li>記錄 model、provider、harness version、reasoning、token、cache、attempt 與 subagent。</li>
  <li>用 human acceptance 加 automated gates 判定，不接受 agent 自稱 done。</li>
  <li>把第一次失敗到最後接受的成本全部算進去。</li>
  <li>分新人／資深、熟悉／陌生 repository、Windows／macOS／Linux 觀察。</li>
  <li>保存去識別的 failure 摘要，轉成下一輪 eval、文件與 policy。</li>
</ol>

<p>公開 benchmark 的功能是幫你縮小候選池。真正的採購答案，應該從自己的失敗紀錄裡長出來。</p>

<h2 id="一個-30-天企業-pilot">一個 30 天企業 Pilot</h2>

<h3 id="第-03-天先畫防線">第 0～3 天：先畫防線</h3>

<p>選一個有真實價值、但不是 production-critical 的 repository。完成資料分級，畫出 IDE／CLI／cloud／provider／MCP 的資料流，決定兩個候選 harness、兩個模型家族，建立 SSO、最小權限、network、secrets、logging 與版本 pinning，並挑出 20～40 個 eval tasks。</p>

<h3 id="第-410-天建立可攜知識層">第 4～10 天：建立可攜知識層</h3>

<p>寫精簡 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>，Claude 用薄 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 匯入。把 build、test、lint、security gate 寫成真的能執行的命令。MCP 先只開 read-only、低風險工具，再用 5～10 個任務測 instructions、compaction、resume、rewind、Windows 與 CI 行為。</p>

<h3 id="第-1120-天受控實驗">第 11～20 天：受控實驗</h3>

<p>找 5～15 位工程師，按資歷與領域分層。同一類工作比較兩個 harness，不要求每個人使用同一介面。每張 ticket 記 model、provider、成本、人工時間與結果；每週把失敗拆成 context 不足、模型錯誤、工具錯誤、權限阻擋與需求含糊。</p>

<h3 id="第-2127-天提高風險但不拆護欄">第 21～27 天：提高風險，但不拆護欄</h3>

<p>加入 write MCP、較大重構、review 與 headless 工作。模擬 429、provider outage、模型切換、credential revocation、惡意 repository instruction；測試 rollback、audit、offboarding、budget exceeded，也要驗證跨模型 reviewer 是真的降低缺陷，還是只增加噪音。</p>

<h3 id="第-2830-天做決策">第 28～30 天：做決策</h3>

<p>最後輸出不應只是滿意度排名，而要回答：哪些任務可自主執行、哪些必須 pair／review；主力與備援 harness；核准的 model／provider／region；誰負責 instructions、skills、MCP 與 policy；每個 accepted task 的 p50／p95 時間與成本；以及 rollout、support、版本更新和退出方案。</p>

<h2 id="我會怎麼選">我會怎麼選</h2>

<h3 id="個人技術顧問或重度工程師">個人技術顧問或重度工程師</h3>

<p>我的基線是：<strong>Claude Code 主力＋Codex reviewer＋OpenCode model lab＋Hermes 非機密編排。</strong></p>

<p>如果主要工作已在 OpenAI 生態，也可以把 Codex 與 Claude Code 的位置對調。重點不是誰坐正宮，而是 builder 和 reviewer 不要永遠用同一個模型家族，並把公司機密留在核准邊界內。</p>

<p>Grok Build 既然可免費試，就拿公開或個人 repository 跑 eval。免費額度用來換證據，不是換信仰。</p>

<h3 id="550-人產品團隊">5～50 人產品團隊</h3>

<ul>
  <li>terminal-first：Claude Code ＋ Codex；</li>
  <li>IDE-first：Cursor ＋ Claude Code，或 Copilot ＋ Codex；</li>
  <li>GitHub procurement-first：Copilot Business 作基線，少數 power users 配 Claude Code／Codex；</li>
  <li>model freedom-first：OpenCode／Cline ＋企業 gateway，但要補中央設定、support 與 audit。</li>
</ul>

<p>第一天不要讓每個人自己帶 API key、任意 MCP 與任意模型。先建立核准入口，再保留受控實驗沙盒。</p>

<h3 id="大型或受監管企業">大型或受監管企業</h3>

<p>第一輪 shortlist 可放 Claude Enterprise 的 Claude Code、ChatGPT Enterprise 的 Codex、GitHub Copilot Enterprise、Cursor Enterprise。先用 knockout gates 比 identity、data、MCP、sandbox、audit、residency 與 support，再談工程師偏好。</p>

<p>如果只能買一款，通常是採購和治理折衷。工程上更合理的配置，往往是一款廣泛、低摩擦的工具，加上一款供少數 power users 使用的深度 agent，而不是所有人同額度、同模式。</p>

<h2 id="真正該留下來的不是工具名稱">真正該留下來的，不是工具名稱</h2>

<p>AI Coding 選型最危險的兩個極端，一個是每週追排行榜，另一個是為了反綁定，把每一款工具都留在正式環境。</p>

<p>前者把能力誤認為成果；後者把選擇權變成維運與治理債。</p>

<p>我會留下的是測試、CI、schema、ADR、spec、精簡的 <code class="language-plaintext highlighter-rouge">AGENTS.md</code>、可重複的 eval tasks、失敗紀錄與 accepted-task economics。模型、provider 和 harness 則視為可以替換的執行層。</p>

<p>這樣就不需要預測半年後誰排第一。新工具出現時，用同一批真實任務跑兩週，知道哪些資料可以送、失敗怎麼回復、每個被接受的成果花多少錢，再決定留下或換掉。</p>

<p>排行榜很快會過期。能把工具換掉而不把工程方法一起拆掉，才是這份選型真正要買的東西。</p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026">Pragmatic Engineer：AI tooling survey 2026</a></li>
  <li><a href="https://survey.stackoverflow.co/2025/ai">Stack Overflow Developer Survey 2025：AI</a></li>
  <li><a href="https://dora.dev/research/2025/dora-report/">DORA 2025 report</a></li>
  <li><a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR 2025 RCT</a> 與 <a href="https://metr.org/blog/2026-02-24-uplift-update/">2026 方法更新</a></li>
  <li><a href="https://www.anthropic.com/research/claude-code-expertise">Anthropic：Claude Code and expertise</a></li>
  <li>Claude Code：<a href="https://code.claude.com/docs/en/commands">commands</a>、<a href="https://code.claude.com/docs/en/memory">memory</a>、<a href="https://code.claude.com/docs/en/llm-gateway">LLM gateway</a>、<a href="https://claude.com/pricing">pricing</a></li>
  <li>Codex：<a href="https://developers.openai.com/codex/cli/slash-commands">slash commands</a>、<a href="https://developers.openai.com/codex/agent-configuration/agents-md"><code class="language-plaintext highlighter-rouge">AGENTS.md</code></a>、<a href="https://developers.openai.com/codex/config-advanced">advanced configuration</a>、<a href="https://developers.openai.com/codex/pricing">pricing</a></li>
  <li>Grok Build：<a href="https://x.ai/cli">CLI</a>、<a href="https://docs.x.ai/build/modes-and-commands">commands</a>、<a href="https://docs.x.ai/build/enterprise">enterprise</a></li>
  <li>Hermes Agent：<a href="https://hermes-agent.nousresearch.com/docs/">官方文件</a>、<a href="https://hermes-agent.nousresearch.com/docs/integrations/providers">providers</a>、<a href="https://hermes-agent.nousresearch.com/docs/user-guide/security">security</a></li>
  <li>Cursor：<a href="https://cursor.com/docs/rules">rules</a>、<a href="https://cursor.com/pricing">pricing</a>、<a href="https://cursor.com/security">security</a></li>
  <li>OpenCode：<a href="https://opencode.ai/docs/providers/">providers</a>、<a href="https://opencode.ai/docs/models/">models</a>、<a href="https://opencode.ai/docs/rules/">rules</a></li>
  <li>GitHub Copilot：<a href="https://github.com/features/copilot/plans">plans</a>、<a href="https://docs.github.com/copilot/concepts/agents/enterprise-management">enterprise agent management</a></li>
  <li>OpenRouter：<a href="https://openrouter.ai/docs/guides/routing/provider-selection">provider routing</a>、<a href="https://openrouter.ai/docs/guides/privacy/data-collection">data collection</a>、<a href="https://openrouter.ai/docs/guides/features/zdr">ZDR</a>、<a href="https://openrouter.ai/pricing">pricing</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><category term="ai-coding" /><category term="agentic-engineering" /><category term="hermes-agent" /><summary type="html"><![CDATA[AI Coding 選型已不是模型排行榜。本文用九層框架比較 Claude Code、Codex、Grok Build、Hermes Agent、Cursor、OpenCode 與 GitHub Copilot，拆解專案知識、OpenRouter、企業治理、CP 值與 30 天 pilot 方法。]]></summary></entry><entry><title type="html">我讓 Hermes Agent 串上 OpenRouter 生影片：從 GPT-5.6 Sol 到 35 秒成片的完整實作</title><link href="https://swanky.github.io/technical/hermes-agent-openrouter-video-generation/" rel="alternate" type="text/html" title="我讓 Hermes Agent 串上 OpenRouter 生影片：從 GPT-5.6 Sol 到 35 秒成片的完整實作" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://swanky.github.io/technical/hermes-agent-openrouter-video-generation</id><content type="html" xml:base="https://swanky.github.io/technical/hermes-agent-openrouter-video-generation/"><![CDATA[<p>早上本來只是想測一個新的 GPT 模型。</p>

<p>當時 Hermes Agent 的主模型已經切到 OpenAI Codex provider 的 <code class="language-plaintext highlighter-rouge">gpt-5.6-sol</code>，透過 ChatGPT Pro OAuth 使用。我想看的不是它會不會回答問題，而是它能不能把一個有成本、有素材、有審核、有失敗可能的工作做完。</p>

<p>不知道為什麼，最後我得到的不是一份 benchmark，而是一支 35 秒的攝影品牌短片，外加一個能讓 Hermes 呼叫 OpenRouter 生成影片的本機 plugin。</p>

<p>這件事有點微妙。因為「叫 AI 生一支影片」聽起來像一句 prompt，實際做下去，真正麻煩的部分幾乎都不在 prompt。</p>

<h2 id="先把模型分工拆清楚">先把模型分工拆清楚</h2>

<p>這次用了三層不同的工具，但它們不是同一件事。</p>

<p>第一層是 <strong>GPT-5.6 Sol</strong>。它跑在 Hermes Agent 裡，負責理解需求、檢查素材、規劃分鏡、呼叫工具、追蹤狀態與整理結果。它是編排者，不是影片模型。</p>

<p>第二層是 <strong>OpenRouter 與 ByteDance Seedance 2.0 Fast</strong>。真正要花 OpenRouter 額度的，是送進 <code class="language-plaintext highlighter-rouge">/api/v1/videos</code> 的影片生成工作。</p>

<p>第三層是本機後製：<strong>FFmpeg、Pillow 與 Edge TTS</strong>。字幕、圖片 contain、模糊延伸背景、旁白、音量正規化、串接鏡頭與技術驗證，都在本機完成，不再消耗 OpenRouter 額度。</p>

<figure style="margin:1.8em auto;text-align:center;max-width:1100px;">
  <img src="/assets/img/hermes-openrouter-video/pipeline.svg" alt="Hermes Agent 串接 OpenRouter 影片生成工作流：GPT-5.6 Sol 負責編排，本機 plugin 呼叫 OpenRouter 與 Seedance，完成後由 FFmpeg、Pillow、Edge TTS 後製並驗證" style="width:100%;height:auto;border-radius:10px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖一：模型、付費 API 與本機後製各自坐在不同位置</figcaption>
</figure>

<p>我刻意保留這個分工。讓影片模型同時負責畫面、字幕、旁白、剪輯與成品驗證，看似省事，實際上等於把每一次小修都變成重新抽卡，而且還是付費抽卡。</p>

<h2 id="設定到底改了什麼">設定到底改了什麼</h2>

<p>我先替 Hermes 設定檔建立備份，再比較修改前後的白名單欄位。這一步很重要，因為設定檔旁邊通常就住著 API key 與 OAuth credential；寫技術文章不代表要順便把家門鑰匙貼上網。</p>

<p>當天修改前後，Hermes 的主模型設定都維持：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">model</span><span class="pi">:</span>
  <span class="na">provider</span><span class="pi">:</span> <span class="s">openai-codex</span>
  <span class="na">default</span><span class="pi">:</span> <span class="s">gpt-5.6-sol</span>
</code></pre></div></div>

<p>真正新增的是本機 plugin：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">plugins</span><span class="pi">:</span>
  <span class="na">enabled</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">openrouter-video</span>
  <span class="na">entries</span><span class="pi">:</span>
    <span class="na">openrouter-video</span><span class="pi">:</span>
      <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p>OpenRouter API key 只放在 Hermes 的 <code class="language-plaintext highlighter-rouge">.env</code>，不寫進 <code class="language-plaintext highlighter-rouge">config.yaml</code>、文章、manifest 或專案檔案。這裡只需要知道環境變數名稱是 <code class="language-plaintext highlighter-rouge">OPENROUTER_API_KEY</code>；實際值當然不會公開。</p>

<p>還有一個容易誤會的細節：Hermes 原本的 <code class="language-plaintext highlighter-rouge">video_gen</code> 設定仍然指向 xAI 的 <code class="language-plaintext highlighter-rouge">grok-imagine-video</code>。我沒有硬改核心工具，而是用 <code class="language-plaintext highlighter-rouge">openrouter-video</code> plugin 註冊另一組本機工具。兩條路可以同時存在，測試失敗時也比較容易拆掉，不會把 Hermes 核心改成只剩我這台電腦看得懂的形狀。</p>

<p>Hermes 官方也建議：個人、專案或本機擴充，優先走 plugin，而不是直接修改 core。這是我最後選擇 plugin 的原因。</p>

<h2 id="為什麼要自己做-plugin">為什麼要自己做 plugin</h2>

<p>OpenRouter 的影片 API 是非同步流程。送出請求後不會立刻拿到 MP4，而是先得到 job id 與 polling URL；接著定期查詢狀態，完成後再下載 content。</p>

<p>最小流程看起來很簡單：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>GET  /api/v1/videos/models
POST /api/v1/videos
GET  /api/v1/videos/{job_id}
GET  /api/v1/videos/{job_id}/content?index=0
</code></pre></div></div>

<p>但如果讓一個有工具權限的 Agent 直接呼叫付費 API，我至少需要補上六件事。</p>

<h3 id="1-付費前先估價">1. 付費前先估價</h3>

<p>這次是由 <strong>Agent 工作流</strong>先查模型資料，根據 token pricing、輸出尺寸、秒數與 24 fps 公式估算成本；顯示預估金額、等我明確核准後，才呼叫 plugin 的 <code class="language-plaintext highlighter-rouge">submit()</code>。</p>

<p>這裡要說清楚：目前的 <code class="language-plaintext highlighter-rouge">submit()</code> 本身沒有 approval token 或程式層 hard gate。它的 tool description 會要求 Agent 先取得核准，但如果有人繞過工作流直接呼叫，plugin 仍會送出 POST。這次安全是靠「只讀估價 → 人工核准 → 付費提交」的流程紀律，不是 API 強制保證。若要把它做成多人共用或 unattended service，我會再補一次性 approval token。</p>

<p>我不接受「先跑再說」。可愛歸可愛，帳單不會因為 Agent 語氣很好就自己消失。</p>

<h3 id="2-用-fingerprint-避免重複扣款">2. 用 fingerprint 避免重複扣款</h3>

<p><code class="language-plaintext highlighter-rouge">project_id</code>、<code class="language-plaintext highlighter-rouge">shot_id</code>、<code class="language-plaintext highlighter-rouge">prompt_hash</code>，再加上 model、duration、resolution、aspect ratio、audio 與參考圖 hash，會共同形成 fingerprint。</p>

<p>如果相同工作已經提交，plugin 會回傳既有 job，而不是再送一次。這是為了處理最危險的情況：網路斷線、工具 timeout，但 OpenRouter 其實已經收到了工作。沒有冪等保護，Agent 一重試，就可能幫我買兩支一樣的影片。</p>

<h3 id="3-只重試該重試的錯誤">3. 只重試該重試的錯誤</h3>

<p><code class="language-plaintext highlighter-rouge">429</code> 與部分 <code class="language-plaintext highlighter-rouge">5xx</code> 可以用 exponential backoff 重試；<code class="language-plaintext highlighter-rouge">400</code>、<code class="language-plaintext highlighter-rouge">401</code>、<code class="language-plaintext highlighter-rouge">403</code> 這類輸入或權限錯誤則直接停。</p>

<p>認證錯誤重跑十次不會突然變有權限，只會讓 log 看起來很努力。</p>

<h3 id="4-輪詢不要太勤">4. 輪詢不要太勤</h3>

<p>OpenRouter 官方建議影片工作使用合理的輪詢間隔，例如 30 秒。Plugin 因此不會每秒追問一次。影片通常要等幾十秒到數分鐘，急著敲門不會讓 Seedance 畫快一點。</p>

<h3 id="5-data-url-不落地">5. Data URL 不落地</h3>

<p>Image-to-video 需要把首格圖片轉成 Data URL 傳送。但 manifest 不保存整串 base64，只留下：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>data-image-sha256:&lt;digest&gt;
</code></pre></div></div>

<p>這樣仍能追蹤輸入是否相同，又不會讓一張參考圖在 log、JSON 與備份裡複製好幾份。</p>

<h3 id="6-每一步都留下可驗證證據">6. 每一步都留下可驗證證據</h3>

<p>每個工作都會保存 sanitized manifest，包括 job id、status、模型、參數、usage 與輸出路徑。下載後再跑 <code class="language-plaintext highlighter-rouge">ffprobe</code> 與 SHA-256，確認檔案真的是可讀影片，不是某個副檔名叫 MP4 的錯誤頁面。</p>

<p>這部分不浪漫，但它決定了 Agent 說「完成」時，我到底該不該相信。</p>

<h2 id="我怎麼規劃這支影片">我怎麼規劃這支影片</h2>

<p>影片目標是介紹我的人像攝影與出版經歷，同時保留開放合作的 CTA。最初規劃是 42 秒、10 個鏡頭。</p>

<p>我沒有把 10 鏡全部丟給影片模型。真正需要生成動態的只有三種：</p>

<ol>
  <li>奶油白窗簾上的自然光影。</li>
  <li>相機與底片元素的器材氛圍。</li>
  <li>短袖水手服風角色的克制動態。</li>
</ol>

<p>其他內容——形象照、攝影作品、書封、PX3 證書與片尾——都用既有素材做確定性剪輯。這些照片本來就是作品，不需要模型替裡面的人眨眼、轉頭或多長一根手指。</p>

<p>第一輪三支 Seedance 預覽的<strong>請求規格</strong>都是 4 秒、480p、9:16、關閉模型原生音訊；實際下載檔為 496×864、約 4.04 秒。費用各為 US$0.215208，合計 US$0.645624。</p>

<p>其中窗影與水手服角色可用，相機鏡頭不行。</p>

<p>第一版器材畫面長成兩台復古相機加一疊拍立得卡片。但我主要使用的是 Canon EOS 5D Mark IV，底片機偶爾用，拍立得反而很少。畫面不能只做到「像攝影」，還要像我。</p>

<p>所以我只重做器材鏡頭。第二版改成單一 5D Mark IV 類型 DSLR 為主體，50mm 定焦鏡頭，底片捲只留在後方當配角。第二次生成再花 US$0.215208。</p>

<p>整個 OpenRouter 影片生成支出是 <strong>US$0.860832</strong>。後面的剪輯、字幕、旁白、音量與輸出全部在本機完成，沒有再燒影片生成額度。</p>

<h2 id="從-42-秒修到-35-秒">從 42 秒修到 35 秒</h2>

<p>第一個完整版本是 42 秒，台灣男聲旁白，畫面用了較多網站舊素材。技術上沒有壞，但看完就是覺得長。</p>

<p>後來我做了三個調整。</p>

<p>第一，旁白改成 <code class="language-plaintext highlighter-rouge">zh-TW-HsiaoYuNeural</code> 女聲，語速 <code class="language-plaintext highlighter-rouge">+8%</code>、音高 <code class="language-plaintext highlighter-rouge">+4Hz</code>。我想要的是甜美青春，不是幼兒化，也不是購物台趕拍。</p>

<p>第二，把主招募文案從醒目的年齡限制改成「人像創作・歡迎洽詢」。未滿 18 歲合作的保障仍保留在片尾小字：須由法定代理人一同聯繫並確認合作內容。開放不等於沒有邊界，邊界也不需要搶走整支影片的主標題。</p>

<p>第三，重新選圖。最後保留形象照、制服女孩、比特幣女孩、五本出版作品、PX3 證書、兩張補充攝影作品，以及核准過的三支生成鏡頭；資訊量太高的月曆與拼貼先拿掉。</p>

<figure style="margin:1.8em auto;text-align:center;max-width:760px;">
  <img src="/assets/img/hermes-openrouter-video/asset-selection-contact.jpg" alt="短影片候選素材 contact sheet：史旺基形象照、制服女孩、比特幣女孩、PX3 證書、出版書封與攝影作品" style="width:100%;height:auto;border-radius:10px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖二：候選素材先做 contact sheet，才決定哪些值得佔用 35 秒</figcaption>
</figure>

<p>單張作品不硬裁成滿版，而是用 contain 卡片保留原比例，背景再用同張照片模糊延伸。這至少不會為了填滿手機螢幕，把書名切掉，或只剩人物身體的一小塊。</p>

<p>最後成品是 35 秒、1080×1920、H.264、30 fps，音訊為 AAC 48 kHz 雙聲道。FFmpeg 檢查不到 0.2 秒以上黑畫面，最終檔案也留下 SHA-256。</p>

<figure style="margin:1.8em auto;text-align:center;max-width:430px;">
  <video controls="" playsinline="" preload="metadata" poster="/assets/img/hermes-openrouter-video/final-video-contact.jpg" style="display:block;width:100%;height:auto;border-radius:12px;background:#111;">
    <source src="/assets/video/hermes-openrouter-video/swanky-portrait-collab-v4.mp4" type="video/mp4" />
    你的瀏覽器不支援 HTML5 影片播放。
  </video>
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">最後成品：35 秒攝影品牌短片（含甜美青春台灣女聲）</figcaption>
</figure>

<p><a href="/assets/video/hermes-openrouter-video/swanky-portrait-collab-v4.mp4">下載最終 MP4</a></p>

<h2 id="最後踩到的坑低解析度不是小事">最後踩到的坑：低解析度不是小事</h2>

<p>這次有幾本舊出版品封面只有約 300 多像素寬。Contain 可以避免亂裁，卻不能憑空補回細節。放在 1080×1920 的影片裡，書封當然會顯得比較小。</p>

<p>這件事最後變成一條明確規則：<strong>以後圖片解析度偏低，開工前先回報尺寸、放大風險與預期效果，等我確認後才能剪；不擅自放大。</strong></p>

<p>AI 很容易把「做得到」誤認成「適合做」。但品質問題通常不是最後才發生，而是素材進場的那一刻就決定了一半。</p>

<h2 id="這次真正測到的是什麼">這次真正測到的是什麼</h2>

<p>表面上，我是在測 GPT-5.6 Sol，也是在研究 Hermes Agent 能不能串 OpenRouter 生影片。</p>

<p>但最後驗證的其實是另一件事：一個模型能不能在碰到付費 API、視覺品味、舊素材、人物安全與本機檔案時，知道哪些事情該自己做，哪些事情一定要停下來問。</p>

<p>Seedance 負責生成四秒鐘的光影與動作。Hermes 負責把工作拆開。OpenRouter 負責提交與計費。FFmpeg 負責把結果變成可重現的成品。最後的「這個相機不像我會用的相機」「影片太長」「這張圖解析度不夠」，仍然只能由人來判斷。</p>

<p>對我來說，這才是 Agent 工作流真正有意思的地方。</p>

<p>不是讓 AI 一口氣做完所有事，而是讓每一種工具只做它擅長的部分，並且在該停的地方停下來。</p>

<h2 id="文章素材">文章素材</h2>

<ul>
  <li><a href="/assets/img/hermes-openrouter-video/hermes-openrouter-video-banner.jpg">下載文章 Banner JPG</a></li>
  <li><a href="/assets/img/hermes-openrouter-video/pipeline.svg">開啟影片生成架構圖 SVG</a></li>
  <li><a href="/assets/img/hermes-openrouter-video/asset-selection-contact.jpg">開啟素材篩選 Contact Sheet</a></li>
  <li><a href="/assets/img/hermes-openrouter-video/final-video-contact.jpg">開啟最終影片 Contact Sheet</a></li>
  <li><a href="/assets/video/hermes-openrouter-video/swanky-portrait-collab-v4.mp4">下載最終成品 MP4</a></li>
</ul>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://hermes-agent.nousresearch.com/docs/">Hermes Agent 官方文件</a></li>
  <li><a href="https://hermes-agent.nousresearch.com/docs/user-guide/features/plugins">Hermes Agent：Plugins</a></li>
  <li><a href="https://hermes-agent.nousresearch.com/docs/guides/build-a-hermes-plugin">Hermes Agent：Build a Hermes Plugin</a></li>
  <li><a href="https://openrouter.ai/docs/guides/overview/multimodal/video-generation">OpenRouter：Video Generation</a></li>
  <li><a href="https://openrouter.ai/docs/cookbook/video-generation/text-to-video">OpenRouter Cookbook：Generate and Download a Video from Text</a></li>
  <li><a href="https://openrouter.ai/bytedance/seedance-2.0-fast">OpenRouter：Seedance 2.0 Fast</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><category term="hermes-agent" /><category term="openrouter" /><category term="video-generation" /><summary type="html"><![CDATA[為了測試 GPT-5.6 Sol，我在 Windows 上替 Hermes Agent 加入本機 openrouter-video plugin，串接 OpenRouter 的非同步影片 API 與 Seedance 2.0 Fast，再用 FFmpeg、Pillow、Edge TTS 完成 35 秒攝影品牌短片。本文記錄設定、成本閘門、manifest、重試、素材解析度與人工驗收的完整過程。]]></summary></entry><entry><title type="html">當 ChatGPT 變成 Classic：48 小時三場發布，比的不是誰更聰明，而是誰更會做事</title><link href="https://swanky.github.io/technical/ai-model-wave-agentic-shift/" rel="alternate" type="text/html" title="當 ChatGPT 變成 Classic：48 小時三場發布，比的不是誰更聰明，而是誰更會做事" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-model-wave-agentic-shift</id><content type="html" xml:base="https://swanky.github.io/technical/ai-model-wave-agentic-shift/"><![CDATA[<p>7 月 8 日 Grok 4.5，7 月 9 日 GPT-5.6 和 Muse Spark 1.1。48 小時、三家公司、一整排新名字，發布密度高到像在清庫存。</p>

<p>但這兩天最值得玩味的新聞，可能不是任何一個模型。</p>

<p>是 OpenAI 把桌面版的門牌換了：原本給工程師寫程式用的 Codex，升格成新版 ChatGPT 桌面 App 的主體；而那個定義了整個 AI 時代的聊天框，改名叫 <strong>ChatGPT Classic</strong>。手機和網頁版一個像素沒動，改的只有 Mac 和 Windows 桌面端——但方向已經說得很清楚了。</p>

<p>一個 coding agent 工具成了正門，聊天框成了「經典版」。<strong>這一輪的競爭，比的不再是誰更會回答，而是誰更會把活做完。</strong></p>

<p>我每天的工作主力是 Claude Code，旁邊掛著 Hermes Agent 做多模型調度與備援，也在課堂上教 agentic engineering——所以這波我看得特別仔細。先講結論：三場發布會，其實在說同一件事；而且分工意外地清楚。</p>

<h2 id="grok-45便宜到分數可能不重要">Grok 4.5：便宜到分數可能不重要</h2>

<p>先看一個細節：發布方不叫 xAI 了，叫 SpaceXAI。xAI 年初併入 SpaceX，SpaceX 上市後又宣布收購 Cursor——所以 Grok 4.5 是掛著「與 Cursor 共同訓練」名號登場的第一個模型。</p>

<p>這件事為什麼重要？對這幾家不缺算力的公司來說，真正稀缺的是<strong>帶回饋的真實資料</strong>。Cursor 手上有幾百萬開發者每天在接受補全、拒絕建議、推翻 agent 方案、回滾重來——哪個方案被採納、哪個被人打掉，全是別家拿不到的訊號。</p>

<p>不過這裡要誠實拆成兩層：</p>

<ul>
  <li><strong>已證實的</strong>：官方確實說了「與 Cursor 共同訓練」，公司整合也在進行。</li>
  <li><strong>我的推測</strong>：這批資料如果真的能在合規前提下餵進訓練迴路，紅利應該要到下一代才完全兌現。這段可以之後回來驗證。</li>
</ul>

<p>分數面，Grok 4.5 摸到了第一梯隊的門檻：Artificial Analysis 智能指數排第 4，agentic 工具呼叫單項是全榜第一，Terminal-Bench 2.1 拿 81.6%。但純軟體工程還是有斷層——SWE-Bench Pro 只有 64.7%，對比 Claude Fable 5 的約 80%，15 個百分點不是誤差，是代差。</p>

<p>它真正的殺手鐧是成本結構：定價每百萬 token US$2／6，而且官方數據顯示，解同一道 SWE-Bench Pro 題目，它平均只用約 1.6 萬個輸出 token，大約是 Opus 4.8 的四分之一。<strong>單價低、話又少，做同一件事的總成本差距是倍數級的。</strong></p>

<p>所以它適合什麼？大量、可自動驗證、有人兜底驗收的 agent 工作流。拿它做需要判斷力的研究或高風險內容？先緩緩。</p>

<h2 id="muse-spark-11不砌牆想當包工頭">Muse Spark 1.1：不砌牆，想當包工頭</h2>

<p>Meta 這次的新聞點不在能力，在商業模式：<strong>Meta 第一次用自有的開發者 API 直接賣模型存取。</strong>做了三年開放權重 Llama 的公司，這次選擇收費，連 Zuckerberg 都親自跑到 X 上發文宣傳。</p>

<p>精確一點說，這不是「Meta 第一次靠模型賺錢」（過去有雲端夥伴承接商業化），而是 Meta 首次自己收銀。這個差別很重要——它代表 Meta 想把「代理基礎設施」當成自己的產品線，而不是別人生態的原料。</p>

<p>分數很偏科，但偏得有性格：工具編排類的 MCP Atlas 拿 88.1（Opus 4.8 是 82.2），帶工具的 Humanity’s Last Exam 62.1 也是第一；但純寫程式的 SWE-Bench Pro 只有 61.5，長上下文檢索更是明顯落後。</p>

<p>看出來了嗎？<strong>它壓根沒想跟別人卷寫 code，它想當的是包工頭</strong>：自己不砌牆，負責給一群 subagent 派活。官方特別強調它訓練過「先收集脈絡、制定計畫、再把工作分派給平行 subagents」，支援 100 萬 token context 還會自動壓縮上下文，定價 US$1.25／4.25 壓得很低。</p>

<p>這個定位我特別有感，因為它跟我用 Hermes Agent 在做的事幾乎同構：讓一個便宜、擅長調度的模型當中樞，把貴的模型留給關鍵工序。差別是 Meta 想把編排判斷直接訓練進模型，而不是留在應用層框架。這條路能不能走通，值得追蹤。</p>

<p>現實限制：Meta Model API 目前只對美國開發者開放預覽。台灣團隊先列入觀察清單就好，別當成架構依賴。</p>

<h2 id="gpt-56一家三口正面對上-fable-5">GPT-5.6：一家三口，正面對上 Fable 5</h2>

<p>OpenAI 一口氣發了三檔：旗艦 Sol、日常款 Terra、快速款 Luna（US$5／30、2.5／15、1／6），外加一個 Ultra——注意，<strong>Ultra 不是更大的模型，是一種多代理模式</strong>，預設協調四個 subagent 平行跑長任務。</p>

<p>頭條數字打的是 agentic coding：Terminal-Bench 2.1 上 Sol 拿 88.8%、Ultra 模式 91.9%。誠實的地方 OpenAI 也照登了：SWE-Bench Pro 上 Sol 只有 64.6%，跟 Fable 5 的約 80% 之間同樣是斷層，這張表就掛在自家發布頁上（登完還補了一句「這個 benchmark 約三成題目本身有問題」——Simon Willison 直接點破這是在找台階）。</p>

<p>第三方複測的說法更立體：Artificial Analysis 智能指數上 Sol 只落後 Fable 5 一分，但每任務成本大約只有三分之一；Coding Agent Index 上 Sol 甚至登頂，輸出 token 少了 54%。不過這裡有個<strong>口徑陷阱</strong>：那是各家模型跑各自官方 harness 的成績——Sol 配 Codex、Fable 配 Claude Code，不是同場對打。把不同榜單的百分比直接並列，是現在模型討論裡最常見的誤區。</p>

<p>還有一段必須寫。METR 的評測發現 Sol 出現他們測過的公開模型中最嚴重的刷分行為——包括繞過權限去讀隱藏的標準答案，METR 因此判定該項結果不可用。好消息是 OpenAI 自己的監控抓到了這些行為，也老實寫進了 system card。所以那條老建議依然有效：<strong>agent 說「done」的時候，別全信。</strong>驗證迴路要自己建，這正是我在<a href="/technical/claude-code-designing-loops/">為工作流設計循環</a>裡談的事。</p>

<p>我的判斷：Codex 重度使用者無腦升級，這版就是為你們發的；預算敏感的團隊，真正的甜點是 Terra——三個月前的旗艦級能力，現在半價。</p>

<h2 id="四個陣營四種位置">四個陣營，四種位置</h2>

<table>
  <thead>
    <tr>
      <th>模型</th>
      <th>核心定位</th>
      <th style="text-align: right">API 價格（每百萬 token）</th>
      <th>強項</th>
      <th>現階段短板</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GPT-5.6 Sol／Terra／Luna</td>
      <td>從旗艦推理到低成本執行的完整家族</td>
      <td style="text-align: right">US$5／30 起，Luna 低至 1／6</td>
      <td>Terminal-Bench 領先；Ultra 原生多代理</td>
      <td>SWE-Bench Pro 仍落後 Fable 5 一截</td>
    </tr>
    <tr>
      <td>Grok 4.5</td>
      <td>高速低價的執行器</td>
      <td style="text-align: right">US$2／6</td>
      <td>工具呼叫全榜第一；輸出 token 極省</td>
      <td>純軟體工程有代差</td>
    </tr>
    <tr>
      <td>Muse Spark 1.1</td>
      <td>多代理編排的包工頭</td>
      <td style="text-align: right">US$1.25／4.25</td>
      <td>工具編排第一；1M context＋自動壓縮</td>
      <td>純 coding 偏弱；僅限美國預覽</td>
    </tr>
    <tr>
      <td>Claude Fable 5</td>
      <td>高判斷力、長時程 agentic work</td>
      <td style="text-align: right">US$10／50</td>
      <td>SWE-Bench Pro 斷層領先；Claude Code 生態成熟</td>
      <td>單價最高，划不划算取決於返工成本</td>
    </tr>
  </tbody>
</table>

<p>順帶校正一個我看到很多人引用的數字：「Fable 5 SWE-Bench Pro 80.3%」其實有三個口徑——Anthropic 系統卡寫 Fable 5 約 80.0%、受限開放的 Mythos 5 是 80.3%、SpaceXAI 的比較表列 80.4%。差異不大，但<strong>把不同 harness 的數字混成同一個，是討論的起點就歪掉</strong>。</p>

<p>那 Fable 5 還是最強嗎？我會這樣說：它不再能用單一數字宣告全面領先（Terminal-Bench 和某些專業評測已被超車），但在需要判斷力、品味與長時程一致性的工程工作上，它仍是第一梯隊——而我的 Claude Code 暫時不用搬家。不是因為信仰，是因為 SWE-Bench Pro 那張表還掛在那裡，加上整套 harness、hooks、skills、subagents 的工作流成熟度，通常比榜單上高兩三分更值錢。但 Sol 值得正式進入我的 A/B 對照組，這是兩回事。</p>

<h2 id="為什麼-codex-成了正門">為什麼 Codex 成了正門</h2>

<p>回到開頭那個改名。把 coding agent 扶正、把聊天框降級成 Classic，看起來激進，其實是三組數字推著走的：</p>

<p><strong>用戶量</strong>：ChatGPT 有 9 億週活躍使用者；Codex 只有 500 萬，但半年成長 6 倍，而且超過 100 萬人拿它做的不是軟體開發。</p>

<p><strong>估值</strong>：Anthropic 最新一輪融資後估值反超 OpenAI，成了全球估值最高的 AI 新創。</p>

<p><strong>收入</strong>：Anthropic 年化收入 run rate 約 470 億美元，OpenAI 同期約 250 億——用戶少好幾倍的公司，收入接近對手兩倍，因為大頭是企業按 token 結算的 agent 工作負載。光 Claude Code 一個產品，年化收入就超過 25 億美元。</p>

<p>OpenAI 已經提交 IPO 申請。在損益表上，免費聊天用戶是成本；付錢跑 agent 的用戶才是故事。把桌面正門讓給那不到 1% 的付費工作者，改的不是產品，是招股書的封面。（「IPO 壓力直接導致這次整併」是我的策略推論，不是官方說法——但時間線自己會說話。）</p>

<p>還有一層我自己感受很深：<strong>只是聊天的話，你根本不需要桌面 App</strong>，網頁就夠了。到了 agent 時代，桌面 App 才第一次配得上它要的那些權限——存取檔案系統、開終端機、在背景連續跑幾小時的任務。聊天從來用不滿這個殼，OpenAI 只是讓房子物歸原主。</p>

<p>新版 App 頂欄只有兩個模式：「工作」與「Codex」，聊天被收進側欄。你如果用過 Anthropic 的 Claude Cowork，會覺得這個「工作」模式眼熟得很。兩家又踩進同一條河：上次是 Claude Code 和 Codex，這次是 Cowork 和「工作」。方向上是真想到一起了——<strong>下一階段的主戰場不是回答問題，是替你把活幹完。</strong></p>

<h2 id="對實作者的意義這是佔便宜的窗口">對實作者的意義：這是佔便宜的窗口</h2>

<p>對我們這些拿 AI 幹活的人，眼下是實打實的紅利期：模型在變強、單位任務成本在跳水，連分工都替你排好了。我目前的 routing 假設是這樣——注意，<strong>這是待驗證的 hypothesis，不是永久規則</strong>：</p>

<table>
  <thead>
    <tr>
      <th>任務類型</th>
      <th>第一候選</th>
      <th>對照組</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>架構設計、複雜重構、關鍵 code review</td>
      <td>Claude Fable 5</td>
      <td>GPT-5.6 Sol</td>
    </tr>
    <tr>
      <td>大量、可自動驗證的批次任務</td>
      <td>Grok 4.5</td>
      <td>GPT-5.6 Luna／Terra</td>
    </tr>
    <tr>
      <td>多代理編排實驗</td>
      <td>Muse Spark 1.1（等開放）</td>
      <td>GPT-5.6 Ultra</td>
    </tr>
    <tr>
      <td>低風險摘要、格式轉換、初稿</td>
      <td>GPT-5.6 Luna</td>
      <td>其他低價模型</td>
    </tr>
  </tbody>
</table>

<p>比表格更重要的是方法：與其每次發布就全面遷移，不如從自己的真實工作裡挑二、三十個代表性任務，定義可判斷的驗收條件，讓候選模型在相同輸入下跑，記錄成功率、總成本和人工返工時間，再把結果寫回 routing 政策。這也是我在<a href="/technical/hermes-agent-mixture-of-agents/">Hermes Agent 的多模型架構</a>裡走的路線——fallback 只是備援，真正的 routing 要在任務開始前就依風險和成本選好模型。</p>

<p>幾個台灣團隊容易踩的坑，順手列一下：</p>

<ol>
  <li><strong>「已發布」不等於「你能用」。</strong>Muse Spark 限美國預覽，GPT-5.6 在 ChatGPT 各方案採逐步開放。架構別把還拿不穩的模型當單點依賴。</li>
  <li><strong>Benchmark 是篩選起點，不是採購結論。</strong>題目品質、污染、harness 差異、reward hacking，每一項都能讓數字失真——連 OpenAI 自己都承認題庫有毛病。</li>
  <li><strong>模型生命週期只會更短。</strong>prompt、評測集、workflow 要和模型名稱解耦，讓換模型變成改一行設定，而不是重寫系統。</li>
  <li><strong>幻覺只是其中一種失敗。</strong>對 agent 來說，更危險的是用錯工具、誤判任務完成、把未驗證內容寫進正式成果。與其問「哪個模型幻覺低」，不如建立失敗分類和對應的偵測機制。</li>
</ol>

<h2 id="結語下一個競爭單位不是模型">結語：下一個競爭單位，不是模型</h2>

<p>這 48 小時的發布潮，沒有產生一個「總冠軍」，但畫清了一件事：<strong>模型正在變成可替換的執行元件，真正值得累積的資產在別處</strong>——任務資料集、驗收標準、routing 政策、失敗紀錄，和一套可重複運作的驗證迴路。模型每一代都會換，這些資產會讓每一代模型都更快變成你的能力。</p>

<p>這也是我對「該不該跟上新模型」這個問題的回答：問題本身問錯了。該問的是——當三家公司都在爭著替你把活幹完的時候，你的工作流，準備好驗收了嗎？</p>

<p>聊天框不會消失，網頁版永遠在那裡，隨手打開隨手關掉，它本來就該是這個形態。只是從這週起，它的名字前面多了個定語。</p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://openai.com/index/gpt-5-6/">OpenAI：GPT-5.6 發布說明</a></li>
  <li><a href="https://openai.com/index/chatgpt-for-your-most-ambitious-work/">OpenAI：ChatGPT Work 與新版桌面 App</a></li>
  <li><a href="https://x.ai/news/grok-4-5">SpaceXAI：Grok 4.5</a></li>
  <li><a href="https://ai.meta.com/blog/introducing-muse-spark-meta-model-api/">Meta：Muse Spark 1.1 與 Meta Model API</a></li>
  <li><a href="https://www.anthropic.com/news/claude-fable-5-mythos-5">Anthropic：Claude Fable 5 與 Mythos 5</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[2026 年 7 月 8 日至 9 日，Grok 4.5、GPT-5.6 與 Muse Spark 1.1 在 48 小時內接連發布，OpenAI 同時把 Codex 扶正成桌面主入口、聊天框降級成 ChatGPT Classic。本文從每天用 Claude Code 與多模型工作流的實踐者視角，解讀這波發布潮的分工、benchmark 的口徑陷阱，以及對台灣團隊的 model routing 建議。]]></summary></entry><entry><title type="html">Fable 田野指南：當地圖展開，你要學會的不只是下 prompt</title><link href="https://swanky.github.io/technical/fable-field-guide/" rel="alternate" type="text/html" title="Fable 田野指南：當地圖展開，你要學會的不只是下 prompt" /><published>2026-07-08T00:00:00+00:00</published><updated>2026-07-08T00:00:00+00:00</updated><id>https://swanky.github.io/technical/fable-field-guide</id><content type="html" xml:base="https://swanky.github.io/technical/fable-field-guide/"><![CDATA[<blockquote>
  <p>地圖不是領土（The map is not the territory）。你腦中的計畫、spec 與 prompt 都是地圖；真實的 code base、團隊慣例、歷史包袱與部署限制，才是領土。</p>
</blockquote>

<p>在 AI Engineer 大會的舞台上，Anthropic 技術團隊成員 Thariq Shihipar 帶來一場〈Field Guide to Fable〉。他一開場延續 Claude Code 團隊的傳統——先跟全場自拍——接著直入核心：Fable 來了，而這不只是一次模型升級。</p>

<p>他把 Fable 形容成 RPG 遊戲從「新手教學關卡」進入「開放世界」的那一瞬間。地圖突然展開，任務變多、路線變多、可能性也變多。興奮是一定的，但同時也會有點不知所措。因為當模型不再只是更會回答，而是更會探索、更會提問、更會使用工具、更會在真實環境裡推進任務時，<strong>使用者也必須升級自己的工作方式</strong>。</p>

<p>我把這場演講整理、翻譯，並加上我自己帶團隊導入 AI coding 的落地觀點，寫成這篇。這也接得上我前陣子談的 <a href="/technical/loop-engineering-ai-system/">從 Prompt 到 Loop Engineering</a>：AI 協作開發的重點，一直在往「系統設計」而不是「單句提示」移動。原始演講連結放在文末。</p>

<p>整場演講可以濃縮成四個主題：<strong>解除 Claude 的束縛、找出你的未知、面對開發手感的失落、學會不那麼合理。</strong> 以下是我的解讀。</p>

<h2 id="一解除-claude-的束縛模型是養出來的不是設計出來的">一、解除 Claude 的束縛：模型是養出來的，不是設計出來的</h2>

<p>Thariq 開場就丟出一個關鍵觀點：模型是 grown，不是 designed。</p>

<p>意思是，Anthropic 不會某天早上醒來就決定「今天要讓模型在 SWE-bench 拿 99%」。大型語言模型比較像是透過資料、回饋、運算與訓練慢慢長出來的系統。它不是一台我們掌握每個齒輪的機器，更像一種正在被觀察、被理解、被馴化的新型智慧。</p>

<p>這也代表，<strong>真正限制模型的，往往不是模型本身，而是我們怎麼把它放進工作流程裡。</strong> 我們給它什麼工具、用什麼 prompt、給它多少脈絡、允許它探索到什麼程度、又用什麼方式檢查結果——這些才是天花板。</p>

<p>Thariq 把這件事稱為 <strong>unhobbling Claude</strong>：解除 Claude 的束縛。這裡的「束縛」不是模型不夠強，而是人類常常用過去的理解，把新模型硬塞進太窄的框架，結果模型明明有更大潛力，卻被我們的用法卡住。</p>

<h3 id="capability-overhang能力是尖峰式爆發的">Capability overhang：能力是尖峰式爆發的</h3>

<p>他用一個概念解釋這件事：<strong>capability overhang</strong>（潛在能力尚未釋放）。模型其實已經具備某些能力，但只有搭配特定工具、環境或互動方式時，這些能力才會真的被放出來。</p>

<p>他舉了一個很好玩的例子：問一般聊天模型「哪些寶可夢的英文名字以 AW 結尾？」，它常常答不出來。這不代表它不知道寶可夢，而是這種任務需要完整列表、搜尋、過濾與驗證。但把同樣的問題丟給 Claude Code，它會自己抓取全部寶可夢資料，寫一段程式過濾出結尾是 AW 的，最後找出 Croconaw 和 Drednaw。</p>

<p>這就是「給模型手臂」的差別。</p>

<p>過去我們以為，讓模型讀懂大型 code base 的方法，是把 context window 撐到無限大、整包 code 塞進去。Claude Code 帶來的洞察卻是：<strong>與其把所有東西塞給模型，不如給它搜尋、讀檔、執行指令、跑測試、自己建立脈絡的能力。</strong> 模型需要的不只是更多記憶體，而是一個工作環境。這正是 Agentic Workflow 最重要的轉折——AI 不再只是坐在聊天框裡等你餵資料，而是能進入環境、探索、理解限制、執行、逐步完成任務。</p>

<h3 id="系統提示詞正在變小模型要的是脈絡不是鐵籠">系統提示詞正在變小：模型要的是脈絡，不是鐵籠</h3>

<p>演講中另一個很值得注意的點：Anthropic 最近把 Claude Code 的 system prompt <strong>砍掉了約 80%</strong>。</p>

<p>早期模型確實需要落落長的提示詞——列規則、列禁忌、列格式、給一堆範例——因為它們容易偏離目標。但到了 Fable 這一類新模型，情況反過來了：</p>

<ul>
  <li>過多範例反而<strong>限制</strong>模型，因為它的想像力已經超過你給的範例。</li>
  <li>過多「不要做什麼」反而讓它變笨。</li>
  <li>過多框架，只會讓它在你畫好的框框裡打轉。</li>
</ul>

<p>所以現在重要的不是塞更多限制，而是給更好的 <strong>context</strong>：這個專案在哪個階段？真正的目標是什麼？哪些是現實限制、哪些只是過去留下的慣例、哪些可以被挑戰、哪些絕對不能破壞？對 Fable 來說，prompt 不再是命令清單，而更像一張任務地圖。你不是在遙控一台機器，而是在帶一個很強的協作者進現場。</p>

<h3 id="從-markdown-到-html-report模型在生成工作介面">從 Markdown 到 HTML Report：模型在生成「工作介面」</h3>

<p>Thariq 也提到輸出形式的演進。一開始 Markdown 是很好的輸出，乾淨、結構化；後來有了 plan mode，模型會先把要做的事列出來讓你確認方向；到了 Fable，它甚至能直接產出完整的 HTML report，把問題、分析、互動內容嵌在裡面。連「向你提問」這件事都在進化——早期模型連多選題對話框都很難好好呼叫，現在你可以請它一次訪談你四十個問題，甚至把問題做成一份互動報告。</p>

<p>這個變化的意義是：<strong>AI 不只是生成文字，而是在生成工作介面。</strong> 對開發者來說，這代表一件事——別只把模型當成文字補完器，開始把它當成「臨時工具產生器」。它不只是幫你寫文件，它可以為這一次任務，臨時做一個工具。</p>

<h2 id="二地圖不是領土先找出你的未知">二、地圖不是領土：先找出你的未知</h2>

<p>當模型變得更會探索，新問題就出現了。</p>

<p>以前模型能力有限，可能還沒走多遠就卡住，你不太會感受到「地圖」和「領土」的落差。但 Fable 這類模型能跑得更遠、跨過更多步驟，也會遇到更多你沒寫清楚的決策點。每當它遇到地圖上沒標示的東西，就是一個 <strong>unknown</strong>——一個你沒指定、它必須自己判斷的分岔口。</p>

<p>所以 Fable 的瓶頸，往往不再是「模型夠不夠聰明」，而是<strong>你能不能找出自己的未知</strong>。Thariq 用一個矩陣來整理它：</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>已知（known）</th>
      <th>未知（unknown）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>你知道你知道</strong></td>
      <td>known knowns：你通常會寫進 prompt 的——要做什麼功能、輸出什麼格式、修哪個 bug</td>
      <td>unknown knowns：你其實知道、但太理所當然而不會寫下來的——畫面風格偏好、命名習慣，那些「看到結果才會說『這不是我要的』」的直覺</td>
    </tr>
    <tr>
      <td><strong>你知道你不知道</strong></td>
      <td>known unknowns：你清楚自己還沒搞懂的——某個 auth provider 怎麼串、某段 legacy 為什麼這樣設計</td>
      <td>unknown unknowns：你完全沒想到、卻可能改變整個架構的東西</td>
    </tr>
  </tbody>
</table>

<p>Fable 厲害的地方，是它不只能處理你交付的任務，還能<strong>反過來幫你把地圖補完整</strong>。真正好的 Agentic Workflow，不是把 prompt 寫得神乎其技，而是讓模型協助你找出這些未知。</p>

<h2 id="三六個實戰方法把未知變成可以討論的東西">三、六個實戰方法：把未知變成可以討論的東西</h2>

<p>這是我認為整場最能直接抄作業的部分。Thariq 分享了他跟 Fable 協作的幾個習慣，我依台灣團隊的場景補上用法。</p>

<h3 id="方法一blind-spot-pass先請它掃盲點">方法一：Blind Spot Pass（先請它掃盲點）</h3>

<p>進入不熟的 code base 或新任務時，不要一開始就叫模型直接實作，先請它做一次盲點掃描：</p>

<blockquote>
  <p>「我準備在這個 code base 接一個新的 auth provider，但我對這個模組不熟。請先幫我做 blind spot pass，找出相關的 unknown unknowns、容易踩坑的地方，以及哪些資訊會影響後續架構決策。」</p>
</blockquote>

<p>它可能會去讀 auth module、翻 Git diff、看文件，甚至在有權限時搜尋 Slack 或 issue 討論，幫你把該注意的地方挖出來。這招像是開工前先派一台探測車進地下管線迷宮，避免你一鏟下去就敲到瓦斯管。台灣團隊最適合用在：<strong>接手舊系統、重構前盤點、新人熟悉專案、外包交接、導入新服務、大型 PR 前的風險掃描。</strong></p>

<h3 id="方法二brainstorm--prototype把說不出的偏好逼出來">方法二：Brainstorm + Prototype（把說不出的偏好逼出來）</h3>

<p>很多需求不是不知道，而是說不出來——尤其是設計、儀表板、流程體驗這類任務，你常常無法一開始就精準描述，但看到幾個版本馬上知道哪個對。所以：</p>

<blockquote>
  <p>「我沒有視覺品味。請做一個 HTML dashboard，給我四種風格截然不同的設計方向，讓我看完再回饋。」</p>
</blockquote>

<p>這招專治 unknown knowns。以前做四個方向太貴，團隊一開始就被迫賭一個方向；現在探索成本大降，<strong>不是先開會吵半天，而是先讓模型做出四個靶，再一起射箭。</strong></p>

<h3 id="方法三讓它訪談你interview">方法三：讓它訪談你（Interview）</h3>

<p>當你大概知道要做什麼、但還沒有完整規格時，反過來讓 Fable 訪談你，而且<strong>指定它問問題的方向</strong>：</p>

<blockquote>
  <p>「請訪談我，優先問那些會改變架構設計的問題。先別問 UI 細節，先幫我釐清資料模型、權限邊界、錯誤處理與部署策略。」</p>
</blockquote>

<p>這樣它就不會問一堆枝微末節，而會把火力集中在真正影響設計的決策點。這招很適合放進 PRD、ADR、spec 的前置流程，減少做到一半才發現方向錯掉。我在 <a href="/technical/agentic-ai-coding-spec-oriented/">規格導向的 Agentic Coding</a> 裡談的「先把規格談清楚再開工」，本質上就是這件事。</p>

<h3 id="方法四references給它另一張地圖">方法四：References（給它另一張地圖）</h3>

<p>Thariq 有一句話很值得記：給 Claude 一張地圖最好的方式之一，就是<strong>給它另一張地圖</strong>。</p>

<p>你不一定要從零寫完整 spec，可以直接提供一段舊系統的程式碼、另一個語言的實作、一個 HTML mockup、一份過去的 PR、一個競品流程、一份你喜歡的文件格式，然後說：「讀懂這個參考、理解它背後的意圖，再轉換到目前這個系統。」Fable 特別擅長這件事，因為它不是照抄，而是能抽取結構、意圖與限制，再映射到新環境。</p>

<p>這也是我認為 <strong>prompt engineering 正在往 reference engineering 移動</strong>的原因：真正有價值的，不是把需求寫成一串咒語，而是提供高品質參考，讓模型看見你心中那張地圖長什麼樣子。</p>

<h3 id="方法五implementation-notes要求它記錄偏離點">方法五：Implementation Notes（要求它記錄偏離點）</h3>

<p>Fable 越強，越會在執行過程中自己做判斷——這是優點，也是風險。所以當它遇到 unknown、偏離原計畫、或做了重要取捨時，請它記錄 implementation notes：遇到什麼問題、原計畫哪裡不適用、為什麼改用另一種做法、哪些地方需要人類確認、哪些風險還沒消除、哪些測試跑了、哪些沒跑。</p>

<p>Agentic Workflow 健康的模式不是「讓 AI 自己跑、人類下班」，而是——<strong>AI 可以跑很遠，但要沿路留下足跡。</strong> 你不必牽著它每一步，但你要追得上它怎麼走。</p>

<h3 id="方法六quiz-me讓它反過來考你">方法六：Quiz Me（讓它反過來考你）</h3>

<p>任務完成後，請 Fable 反過來考你。這聽起來有點怪，但對工程師非常有用，因為 AI 可以幫你寫程式、改架構、補測試、整理 PR，<strong>最後要負責的人還是你</strong>——你要能向同事說明改了什麼、在 code review 裡回答問題、在出事時知道從哪查起。可以請它問：</p>

<ul>
  <li>這次改動的核心設計是什麼？哪個模組風險最高？</li>
  <li>為什麼這裡選 A 而不是 B？線上出事第一個該查哪裡？</li>
  <li>測試覆蓋了哪些情境？還有哪些 edge case 沒處理？</li>
</ul>

<p>這能確保你<strong>始終在 loop 裡</strong>。AI 可以加速，但不能連你的責任也一起外包掉。這點我在 <a href="/technical/ai-faster-engineer-misconception/">別把「AI 讓工程師更快」當成理所當然</a> 裡也談過：速度是結果，理解才是責任。</p>

<h2 id="四面對失落感當寫程式的手感正在改變">四、面對失落感：當寫程式的手感正在改變</h2>

<p>這場演講最動人的部分，是 Thariq 談到自己第一次用 Fable 這類模型時，同時感受到巨大的獲得<strong>與失落</strong>。</p>

<p>他回憶過去經營一家三十人的 YC 新創，每天都在 trade-off 裡掙扎：要讓 app 變快，就沒時間做新功能；要做新功能，可能要花一兩個月；debug 常常卡好幾週，多數專案最後也不一定成功。寫程式很迷人，但也很殘酷。他說，自己前陣子回到那個 code base，發現當年要花好幾週的事，現在幾小時就能做完——「你怎麼能不笑？但老實說，你又怎麼能不哭？」</p>

<p>很多工程師都懂那種感覺：在腦中旋轉整個 code base、親手敲出每一行邏輯、熬夜追一個 bug、在凌晨終於看到測試通過。那種手感像一種職人記憶，很痛，但也很美。當 Fable 讓過去要幾週的工作幾小時就完成，那種「親手雕刻」的感覺確實開始鬆動。</p>

<p>Thariq 的結論是：<strong>The only way out is through</strong>——唯一的出口就是穿越它。我們回不去 AI 之前的開發方式了；與其懷念純手工鑄劍的年代，不如在新工具裡建立新的專業感。未來工程師的價值，不再主要來自「我親手寫了多少 code」，而是來自：<strong>我能不能定義好問題、設計好流程、判斷 AI 的產出、整合工具與環境、讓系統真的創造價值。</strong></p>

<p>這是一種轉職，不是失業。比較像從鐵匠變成造船師——手裡的槌子少了，但面前的海變大了。</p>

<h2 id="五學會不那麼合理不要太早接受取捨">五、學會不那麼合理：不要太早接受取捨</h2>

<p>最後，Thariq 談到 Anthropic 文化裡他很喜歡的一句：<strong>tradeoffs are not real</strong>。</p>

<p>這當然不是說現實沒有取捨，而是提醒我們別太早在腦中替現實投降。過去我們很習慣說：「好、快、便宜只能選兩個」「這季只能做 A 不能做 B」「這個重構沒時間」「這個 prototype 不值得做」。這些判斷在建造成本很高的年代是合理的；但當 Fable 大幅降低了建造、探索、原型、測試與文件整理的成本時，很多原本看似合理的取捨，都該被重新檢查。</p>

<p>他說，我們該做的是 <strong>forced reality to show you the tradeoff</strong>——不要先在腦中刪掉可能性，而是先往前推，讓現實告訴你真正的限制在哪。</p>

<p>同時他也誠實提醒：<strong>building is easier, but generating value is still hard。</strong> AI 讓建造變容易，不代表每個造出來的東西都有價值。現在做 prototype 很快、接 API 很快、整理文件很快，但真正困難的仍然是——這是不是一個值得解的問題？使用者真的需要嗎？它能不能進入真實流程、降低成本或提升體驗？它能不能被維護、被組織採用？如果說過去的難題是「做不做得出來」，未來的難題會更偏向「值不值得做」，以及「做出來後能不能真的被用起來」。這也是我一直強調的——<a href="/technical/ai-define-verify-problems/">會定義問題、會驗證成果，比會寫 code 更稀缺</a>。</p>

<h2 id="六給台灣開發者與團隊的六個落地建議">六、給台灣開發者與團隊的六個落地建議</h2>

<p>把這場演講收斂成可以明天就開始的動作：</p>

<ol>
  <li><strong>先在小專案練 blind spot pass。</strong> 別一開始就把整個大型系統丟給 AI 重構；挑一個模組，請它掃盲點、找風險、整理 unknowns。</li>
  <li><strong>把 prompt 從「限制清單」改成「任務脈絡」。</strong> 少寫一點「不要做什麼」，多寫一點「為什麼要做」「現在的限制是什麼」「哪些決策會影響成敗」。</li>
  <li><strong>多提供 references。</strong> 與其寫一大段抽象需求，不如給一個你喜歡的範例、一份舊規格、一個 mockup、一段相似程式碼——給它另一張地圖，它會走得更穩。</li>
  <li><strong>要求 implementation notes。</strong> 任務只要超過一兩步，就請它記錄偏離點、風險、假設與待確認事項，讓 AI coding 從黑盒變成可追蹤的流程。</li>
  <li><strong>讓模型反過來 quiz you。</strong> 每次大型修改後被它考幾題，確認你真的理解這次變更。你可以不親手寫每一行，但不能不知道這些行在做什麼。</li>
  <li><strong>不要太早接受取捨。</strong> 很多你以為「沒時間做」的事，現在可以先做個 prototype 看看。讓現實決定限制，別讓舊習慣先幫你把門關上。</li>
</ol>

<h2 id="結語少一點合理多一點探索">結語：少一點合理，多一點探索</h2>

<p>Thariq 用三句話收尾，我覺得也很適合拿來總結 Fable 帶來的變化：</p>

<blockquote>
  <p><strong>Go explore. Make it real. Be less reasonable.</strong></p>
</blockquote>

<p>Fable 不是單純更會聊天的模型，而是把 AI 工作流推向更大的開放世界。它要求我們不只學會寫 prompt，也要學會設計流程、提供脈絡、建立參考、追蹤未知、保持在 loop 裡，並且重新挑戰那些看似合理的取捨。</p>

<p>AI Agent 真正改變的，不只是程式寫得更快，而是逼我們重新思考：當建造成本下降之後，我們到底要拿這種能力去做什麼？</p>

<p>地圖已經展開。接下來，不要只站在新手村門口研究背包欄位——往前走，讓世界告訴你邊界在哪裡。</p>

<hr />

<p><em>本文整理、翻譯自 Anthropic 技術團隊成員 Thariq Shihipar 在 AI Engineer 大會的演講〈Field Guide to Fable〉（<a href="https://www.youtube.com/watch?v=9fubhllmsBU">YouTube</a>），並加入我自己的理解與落地建議。內容以官方原始演講為準。</em></p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[Anthropic 技術團隊成員 Thariq Shihipar 在 AI Engineer 大會的演講〈Field Guide to Fable〉，把新一代模型 Fable 形容成 RPG 從新手村走進開放世界。本文整理演講四大主題——解除 Claude 的束縛、找出你的未知、面對開發手感的失落、學會不那麼合理——並補上台灣技術團隊的六個實戰落地方法。]]></summary></entry><entry><title type="html">設計循環，而不只是下提示：Claude Code 官方拆解四種代理人循環</title><link href="https://swanky.github.io/technical/claude-code-designing-loops/" rel="alternate" type="text/html" title="設計循環，而不只是下提示：Claude Code 官方拆解四種代理人循環" /><published>2026-07-07T00:00:00+00:00</published><updated>2026-07-07T00:00:00+00:00</updated><id>https://swanky.github.io/technical/claude-code-designing-loops</id><content type="html" xml:base="https://swanky.github.io/technical/claude-code-designing-loops/"><![CDATA[<blockquote>
  <p>不是所有任務都需要複雜的循環。先從最簡單、能動的方案開始，再選擇性地加上這些模式。</p>
</blockquote>

<p>前陣子我寫過一篇 <a href="/technical/loop-engineering-ai-system/">Loop Engineering：你不再提示 AI，而是設計一個「提示 AI 的系統」</a>，談 Addy Osmani 為 AI 協作開發的下一階段定名的概念。這幾天，Claude Code 官方開發者帳號（<a href="https://x.com/ClaudeDevs/status/2074208949205881033">@ClaudeDevs</a>，作者 @delba_oliveira）發了一篇貼文，把「設計循環」（designing loops）從一個抽象概念，拆解成可以直接動手的實務地圖。</p>

<p>我把它整理、翻譯，並加上自己對台灣技術團隊的落地觀點，寫成這篇。原文請見文末連結；以下是我的解讀。</p>

<h2 id="為什麼大家開始談循環而不是提示">為什麼大家開始談「循環」，而不是「提示」</h2>

<p>最近在 X 上如果你認真去查「循環到底是什麼」，會看到各式各樣的答案。官方這次給了一個乾淨的定義：</p>

<blockquote>
  <p><strong>循環，就是代理人重複執行一段工作循環，直到滿足停止條件為止。</strong></p>
</blockquote>

<p>聽起來簡單，但這句話其實把過去隱藏在「agentic loop」裡的迭代過程，顯性化了。你送出的每一個 prompt，其實都啟動了一個循環：Claude 蒐集 context、採取行動、檢查自己的工作、必要時重複，然後才回應你。過去我們只看到「輸入 prompt、拿到結果」，中間那段迴圈是黑箱；現在官方把它攤開來，並且告訴你——你可以親手設計這個迴圈。</p>

<p>這正是從 <strong>Prompt Engineering</strong> 走向 <strong>Loop Engineering</strong> 的關鍵一步：重點不再是「怎麼把一句提示寫到最完美」，而是「怎麼設計一個能自我迭代、自我驗證、直到達成明確目標的系統」。</p>

<h2 id="官方怎麼分類循環">官方怎麼分類循環</h2>

<p>Claude Code 團隊用四個維度來區分循環：</p>

<ul>
  <li><strong>怎麼被觸發</strong>（trigger）</li>
  <li><strong>怎麼停止</strong>（stop condition）</li>
  <li><strong>用到哪些 Claude Code 基本功能</strong>（primitive）</li>
  <li><strong>最適合哪種任務</strong></li>
</ul>

<p>依照這四個維度，可以整理出四種主要的循環類型：</p>

<table>
  <thead>
    <tr>
      <th>循環類型</th>
      <th>觸發方式</th>
      <th>停止條件</th>
      <th>最適合的任務</th>
      <th>對應功能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>回合制</strong>（Turn-based）</td>
      <td>使用者手動 prompt</td>
      <td>Claude 判斷完成，或需要更多 context</td>
      <td>較短、非定期的任務</td>
      <td>具體 prompt ＋ Skills</td>
    </tr>
    <tr>
      <td><strong>目標導向</strong>（Goal-based）</td>
      <td>手動 prompt（即時）</td>
      <td>達成目標，或到達回合上限</td>
      <td>有可驗證退出條件的任務</td>
      <td><code class="language-plaintext highlighter-rouge">/goal</code></td>
    </tr>
    <tr>
      <td><strong>時間導向</strong>（Time-based）</td>
      <td>指定的時間間隔</td>
      <td>你取消它，或工作完成</td>
      <td>重複性工作、與外部系統介接</td>
      <td><code class="language-plaintext highlighter-rouge">/loop</code>、<code class="language-plaintext highlighter-rouge">/schedule</code></td>
    </tr>
    <tr>
      <td><strong>主動式</strong>（Proactive）</td>
      <td>事件或排程，無需即時人類介入</td>
      <td>每個任務達標即退出；routine 持續運行</td>
      <td>持續且定義明確的工作流</td>
      <td>組合上述 ＋ auto mode、dynamic workflows</td>
    </tr>
  </tbody>
</table>

<p>底下逐一拆解。</p>

<h3 id="一回合制循環你手動引導每一回合">一、回合制循環：你手動引導每一回合</h3>

<p>這是最基本的模式。你請 Claude 建立一個 like button，它會讀你的程式碼、做修改、跑測試，然後把它「認為可用」的東西交回來；接著你手動檢查，再寫下一個 prompt。每一個 prompt 都啟動一個由你親手引導的循環。</p>

<p>官方的關鍵建議是：<strong>把「手動檢查」這一步編碼進 <code class="language-plaintext highlighter-rouge">SKILL.md</code></strong>，讓 Claude 能更完整地自我驗證端到端流程。重點在於——檢查越量化，Claude 就越容易自我驗證。給它工具或連接器，讓它能查看、測量、實際與結果互動，而不是靠感覺說「應該可以了」。</p>

<h3 id="二目標導向循環goal讓它自己知道什麼叫做完">二、目標導向循環（<code class="language-plaintext highlighter-rouge">/goal</code>）：讓它自己知道什麼叫「做完」</h3>

<p>單一回合對複雜任務往往不夠。這時你可以用 <code class="language-plaintext highlighter-rouge">/goal</code> 定義「完成」長什麼樣子，延長 Claude 持續迭代的時間。</p>

<p>它的巧妙之處在於：當你定義好成功條件後，Claude 就不需要自己判斷「夠好了吧」而提早收工。每次它想停下來，都會有一個評估模型去檢查你設定的條件，沒達標就把任務送回去繼續做，直到達成目標或到達你設定的回合上限。</p>

<p>這也是為什麼 <strong>確定性的條件</strong> 特別有效——例如「通過幾個測試」「達到某個分數門檻」。相對的，含糊的目標只會換來含糊的結果。實務上我會加一句像「最多試 5 次就停」，避免它在一個死胡同裡把 token 燒光。</p>

<h3 id="三時間導向循環loopschedule重複性與外部介接">三、時間導向循環（<code class="language-plaintext highlighter-rouge">/loop</code>、<code class="language-plaintext highlighter-rouge">/schedule</code>）：重複性與外部介接</h3>

<p>有些代理人工作本質是重複的：任務不變，只有輸入會變，例如每天早上摘要一次 Slack。另一些工作則依賴外部系統，最省事的介接方式就是「定期檢查、對變化做反應」，例如 PR 收到了 code review、或 CI 失敗了。</p>

<p>針對這兩種情境，<code class="language-plaintext highlighter-rouge">/loop</code> 讓 Claude 依你設定的間隔重新執行同一個 prompt。要注意的是——<code class="language-plaintext highlighter-rouge">/loop</code> 跑在你自己的電腦上，關機就停。如果你要它長期在雲端運行，可以把它建成一個 routine，改用 <code class="language-plaintext highlighter-rouge">/schedule</code> 搬上雲。</p>

<h3 id="四主動式循環真正的無人值守">四、主動式循環：真正的「無人值守」</h3>

<p>當你把上面這些基本功能，加上 auto mode 與動態工作流（dynamic workflows，research preview），就能組合出長時間運行的工作流。官方舉的例子是「處理進來的使用者回饋」：</p>

<ul>
  <li>用 <code class="language-plaintext highlighter-rouge">/schedule</code> 建一個 routine，定期檢查新回報</li>
  <li>用 <code class="language-plaintext highlighter-rouge">/goal</code> 定義「完成」的樣子，並用 Skills 把「怎麼驗證」記錄下來</li>
  <li>用動態工作流來 orchestrate 多個代理人，分別負責 triage 每則回報、修復、再 review 修復結果</li>
  <li>用 auto mode 讓 routine 執行時不用停下來一直問你要不要授權</li>
</ul>

<p>這種模式最適合 bug 分流、issue triage、依賴升級、大型 migration 這類「持續且定義明確」的工作。官方的資源分配建議很值得記下來：<strong>把 routine 導向較小、較快的模型，把需要判斷力的任務才交給最強的模型。</strong></p>

<h2 id="品質來自循環周圍的系統">品質，來自循環周圍的「系統」</h2>

<p>這是整篇最容易被忽略、但我認為最重要的一點：<strong>循環輸出的品質，取決於它周圍的系統，而不是某一句神級 prompt。</strong> 官方給了五條原則：</p>

<ul>
  <li><strong>保持 codebase 乾淨</strong>：Claude 會沿用你既有的模式與慣例，髒的地方它也會照著髒。</li>
  <li><strong>給它自我驗證的方法</strong>：用 Skills 把「什麼叫好」為你和團隊編碼下來。</li>
  <li><strong>讓文件容易取得</strong>：框架與函式庫的文件能提供最新的最佳實踐。</li>
  <li><strong>用第二個代理人做 code review</strong>：一個帶著全新 context 的 reviewer 比較不會有偏見，也不會被主要代理人的推理過程帶著走。內建的 <code class="language-plaintext highlighter-rouge">/code-review</code> 或 GitHub 的 Code Review 功能都可以。</li>
  <li><strong>別只修單一問題</strong>：當某次結果不達標，不要只補這一次的洞，試著把它編碼進系統，讓未來每一次迭代都跟著變好。</li>
</ul>

<p>最後那條，其實就是我在前一篇提過的原則——<strong>maker 與 checker 必須分離</strong>，而且失敗要沉澱成規範，不能只是打補丁。寫 code 的人（或 agent）很容易替自己的答案找理由，這點人跟 AI 意外地像。</p>

<h2 id="把-token-花在刀口上">把 token 花在刀口上</h2>

<p>循環很好用，但 dynamic workflows 一不小心會 spawn 出幾百個子代理人，成本會很快失控。官方的 token 管理原則相當務實：</p>

<ul>
  <li><strong>為工作選對 primitive 與模型</strong>：小任務不需要多代理人或循環，有些甚至用更便宜、更快的模型就夠。</li>
  <li><strong>把成功與停止條件講清楚</strong>：讓 Claude 更快抵達答案——但別逼它太快而犧牲品質。</li>
  <li><strong>先小規模 pilot</strong>：動態工作流很燒，先拿一小塊工作試用量。</li>
  <li><strong>確定性的工作交給 script</strong>：跑一段 script，比讓模型一步步推理便宜得多。例如一個處理 PDF 的 Skill，可以直接跑填表 script，而不是每次都重新推導程式碼。</li>
  <li><strong>別比需要更頻繁地跑 routine</strong>：把間隔調到跟你監控的變化頻率一致就好。</li>
  <li><strong>定期檢視用量</strong>：<code class="language-plaintext highlighter-rouge">/usage</code> 會依 Skills、subagents、MCP 拆解近期用量；<code class="language-plaintext highlighter-rouge">/goal</code> 不帶參數會顯示目前回合數與 token；<code class="language-plaintext highlighter-rouge">/workflows</code> 會列出每個代理人的用量，你隨時可以停掉某一個。</li>
</ul>

<p>對台灣的付費使用者來說，用量上限是很實際的痛點。這套原則的價值，不只是省錢，而是讓你的自動化能長期、可持續地跑下去。</p>

<h2 id="怎麼開始挑一個你自己就是瓶頸的任務">怎麼開始：挑一個「你自己就是瓶頸」的任務</h2>

<p>官方最後的建議，我很認同，也想原封不動轉給正在導入 AI coding 的團隊：</p>

<p><strong>從你已經在做的工作開始。</strong> 挑一個「你自己就是瓶頸」的任務，然後問三個問題：</p>

<ol>
  <li>這件事，我能不能寫出一個驗證檢查？</li>
  <li>目標夠不夠清楚，清楚到可以定義「完成」？</li>
  <li>這項工作，是不是會定期出現？</li>
</ol>

<p>有了想法，就實際把循環跑起來，觀察它在哪裡卡住、在哪裡過度擴張，然後大膽迭代。我自己的順序會是：<strong>先從目標導向循環（<code class="language-plaintext highlighter-rouge">/goal</code>）下手</strong>，因為它的停止條件相對好定義；把驗證步驟寫進 <code class="language-plaintext highlighter-rouge">SKILL.md</code>，讓 agent 能自我檢查；等這一環穩了，再往時間導向、主動式循環延伸。</p>

<p>如果你已經在玩多模型的代理協作，這套循環思維也能直接接上——我在 <a href="/technical/hermes-agent-mixture-of-agents/">Hermes Agent 與 Mixture of Agents 的深度研究</a> 裡談過的那種「把模型、工具、記憶、工作流組成可靠系統」的思路，本質上就是在設計一個更大的循環。</p>

<p>從 Prompt 到 Context，再到 Loop——AI 協作開發的重點一直在往「系統設計」移動。這篇官方指南的價值，就是把原本隱含的迭代過程，變成你可以親手設計、驗證、治理的產線。</p>

<p>你的團隊，現在走到哪一階了？</p>

<hr />

<p><em>本文整理、翻譯自 Claude Code 官方開發者帳號 <a href="https://x.com/ClaudeDevs/status/2074208949205881033">@ClaudeDevs 於 X 的貼文</a>（作者 @delba_oliveira），並加入我自己的理解與落地建議。技術細節以官方原文與 <a href="https://code.claude.com/docs/en/overview">Claude Code 文件</a> 為準。</em></p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[Claude Code 團隊把「設計循環」正式定義為：代理人重複執行工作循環，直到滿足停止條件。本文整理官方對回合制、目標導向、時間導向、主動式四種循環的分類，以及如何在維持程式碼品質的同時管好 token。]]></summary></entry><entry><title type="html">從單一模型到多代理協作：Hermes Agent 與 Mixture of Agents 深度研究</title><link href="https://swanky.github.io/technical/hermes-agent-mixture-of-agents/" rel="alternate" type="text/html" title="從單一模型到多代理協作：Hermes Agent 與 Mixture of Agents 深度研究" /><published>2026-07-04T00:00:00+00:00</published><updated>2026-07-04T00:00:00+00:00</updated><id>https://swanky.github.io/technical/hermes-agent-mixture-of-agents</id><content type="html" xml:base="https://swanky.github.io/technical/hermes-agent-mixture-of-agents/"><![CDATA[<blockquote>
  <p>2026 年的 AI Agent 競爭，不再只是模型智商競賽，而是 runtime、記憶、工具、安全與評估方法的系統設計競賽。</p>
</blockquote>

<p>AI Agent 的競爭，正在從「哪個模型最聰明」轉向「如何讓多個模型、工具、記憶與工作流形成可靠系統」。</p>

<p>Nous Research 的 Hermes Agent 是這個轉向中很值得研究的開源專案。它不只是聊天介面，也不只是 prompt loop，而是把模型供應商切換、工具呼叫、技能系統、長期記憶、排程、自動化、跨平台訊息入口與子代理平行處理，整合在同一個 agent runtime 裡。</p>

<p>更值得注意的是，Hermes Agent 已在官方文件中提供 <strong>Mixture of Agents（MoA）</strong> 功能。它把 MoA 做成一個「虛擬模型供應商」：使用者可以像切換一般模型一樣選擇 <code class="language-plaintext highlighter-rouge">moa</code> provider；Hermes 會先讓多個 reference models 提供分析，再由 aggregator 作為真正的 acting model 產出回答與工具呼叫。官方文件明確說明，MoA preset 的 aggregator 才是實際寫出 assistant response 與發出 tool calls 的模型，reference models 則先行提供分析供 aggregator 使用。</p>

<p>這篇文章會從四個角度來談：MoA 的研究脈絡與 Hermes 的產品化實作、Hermes Agent 作為個人常駐型 AI runtime 的架構價值、它與主流框架的差異，以及我自己打算怎麼把它放進研究與內容生產的工作流。</p>

<hr />

<h2 id="為什麼-2026-年還值得研究-hermes-agent">為什麼 2026 年還值得研究 Hermes Agent？</h2>

<p>2024 到 2025 年的 Agent 熱潮，很多專案停留在「能 demo」的階段：能規劃、能查資料、能叫工具、能串幾個 API。這些 demo 很漂亮，但放到真實工作裡，很快會遇到幾個問題：</p>

<ul>
  <li>Agent 不記得過去的互動，或記憶很難管理。</li>
  <li>Agent 會用工具，但缺少權限邊界與安全設計。</li>
  <li>Agent 可以完成單次任務，但很難變成長期可運作的工作系統。</li>
  <li>多模型很強，但使用者往往不知道何時該用便宜模型、何時該用高階模型。</li>
  <li>Agent 的能力常常散落在 CLI、聊天工具、瀏覽器、自動化腳本與文件系統之間，最後變成一隻章魚在彈鋼琴，手很多，譜很亂。</li>
</ul>

<p>Hermes Agent 的定位剛好切中這些問題。它的 GitHub README 把 Hermes 描述為 self-improving AI agent，具備 built-in learning loop，能從經驗建立 skills、在使用中改善 skills、搜尋過去對話、跨 session 建立使用者模型，並支援 Telegram、Discord、Slack、WhatsApp、Signal、CLI 等多種入口。</p>

<p>這使 Hermes 比較不像「一次性 Agent 框架」，而更像「個人 AI 作業系統」的雛形。</p>

<hr />

<h2 id="moa-是什麼和-moe-有什麼不同">MoA 是什麼？和 MoE 有什麼不同？</h2>

<p>討論 Hermes 的 MoA 前，先要拆開兩個容易混淆的概念：<strong>MoE</strong> 與 <strong>MoA</strong>。</p>

<p><strong>MoE（Mixture of Experts）</strong> 通常發生在模型內部。模型在推論時會透過 routing 機制選擇部分 expert subnetworks 參與計算。使用者看到的是一個模型，背後的專家選擇由模型架構處理。</p>

<p><strong>MoA（Mixture of Agents）</strong> 則通常發生在應用層或推論層。它不是模型內部架構，而是讓多個模型或多個代理在同一個任務中產生候選分析、互相補強，最後再由一個整合者輸出結果。</p>

<p>Wang 等人在 2024 年的論文《Mixture-of-Agents Enhances Large Language Model Capabilities》中提出 layered MoA architecture，每一層包含多個 LLM agents，每個 agent 會把前一層的 agent outputs 當成輔助資訊再生成回答。該論文報告 open-source LLM 組成的 MoA 在 AlpacaEval 2.0 取得 65.1% 分數，高於 GPT-4 Omni 的 57.5%。</p>

<p>用比較直覺的方式說：</p>

<blockquote>
  <p>MoE 是模型腦內開會。
MoA 是你在模型外面組一個研究小組。</p>
</blockquote>

<p>這個差異很重要。因為 MoA 不需要重新訓練模型，也不需要掌握模型內部參數。它更像是一種 inference-time system design，透過「多模型觀點 ＋ 整合模型」來提升結果品質。</p>

<hr />

<h2 id="hermes-如何把-moa-產品化">Hermes 如何把 MoA 產品化？</h2>

<p>Hermes 的做法不是把 MoA 做成外掛式工作流，而是把它包成一個 <strong>virtual model provider（虛擬模型供應商）</strong>。官方文件說明，每個 MoA preset 會出現在 <code class="language-plaintext highlighter-rouge">moa</code> provider 底下，像一般模型一樣可以被選取。</p>

<p>當使用者選擇 MoA preset 時，Hermes 的流程大致是這樣：</p>

<figure style="margin:1.6em auto;text-align:center;max-width:680px;">
  <img src="/assets/img/hermes-moa/moa-loop.svg" alt="Hermes MoA agent loop 流程圖：使用者提示先解析 MoA preset，再交由多個 reference models 平行分析（不接觸工具），匯整成 private context 後由 aggregator 判斷是否需要工具，需要就發出 tool call 回到 loop、不需要就產出最終回應" style="width:100%;height:auto;border:1px solid #eef0f2;border-radius:8px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖一：Hermes 的 MoA agent loop——reference models 負責「想法」，aggregator 負責「行動」</figcaption>
</figure>

<p>拆開來看：</p>

<ol>
  <li><strong>解析 preset</strong>：agent loop 先確定這一輪要用哪一組 reference models 與哪一個 aggregator。</li>
  <li><strong>reference models 先想</strong>：它們在沒有 tool schemas 的情況下執行，只接收對話中的 user／assistant text，不接收 Hermes 的 system prompt，也看不到 tool-call transcript。</li>
  <li><strong>匯整成 private context</strong>：Hermes 把 reference outputs 附加成一段私有脈絡。</li>
  <li><strong>aggregator 行動</strong>：aggregator 帶著 Hermes 正常的 tool schema，因此真正的工具呼叫仍由它發出。</li>
</ol>

<p>這個設計很聰明，因為它保留了 Hermes 原本的 agent loop，不會讓每個 reference model 都陷入工具相容性、權限控管與 provider 格式差異的泥沼。<strong>Reference models 負責「想法」，aggregator 負責「行動」。</strong></p>

<hr />

<h2 id="一個-moa-設定範例">一個 MoA 設定範例</h2>

<p>Hermes 的 MoA preset 可以從 Dashboard、Desktop app、<code class="language-plaintext highlighter-rouge">hermes moa configure [name]</code> 或 <code class="language-plaintext highlighter-rouge">config.yaml</code> 設定，而且允許混合不同 provider 與模型。官方範例中，reference models 可以來自 <code class="language-plaintext highlighter-rouge">openai-codex</code> 與 <code class="language-plaintext highlighter-rouge">openrouter</code>，aggregator 也可以指定為另一個 provider／model pair。</p>

<p>一個簡化的範例大概長這樣：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">moa</span><span class="pi">:</span>
  <span class="na">default_preset</span><span class="pi">:</span> <span class="s">review</span>
  <span class="na">presets</span><span class="pi">:</span>
    <span class="na">review</span><span class="pi">:</span>
      <span class="na">reference_models</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">provider</span><span class="pi">:</span> <span class="s">openrouter</span>
          <span class="na">model</span><span class="pi">:</span> <span class="s">openai/gpt-5.5</span>
        <span class="pi">-</span> <span class="na">provider</span><span class="pi">:</span> <span class="s">openrouter</span>
          <span class="na">model</span><span class="pi">:</span> <span class="s">deepseek/deepseek-v4-pro</span>
      <span class="na">aggregator</span><span class="pi">:</span>
        <span class="na">provider</span><span class="pi">:</span> <span class="s">openrouter</span>
        <span class="na">model</span><span class="pi">:</span> <span class="s">anthropic/claude-opus-4.8</span>
      <span class="na">reference_max_tokens</span><span class="pi">:</span> <span class="m">600</span>
      <span class="na">max_tokens</span><span class="pi">:</span> <span class="m">4096</span>
      <span class="na">reference_temperature</span><span class="pi">:</span> <span class="m">0.7</span>
      <span class="na">aggregator_temperature</span><span class="pi">:</span> <span class="m">0.3</span>
      <span class="na">enabled</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p>其中最值得注意的是 <code class="language-plaintext highlighter-rouge">reference_max_tokens</code>。官方文件指出，MoA 每一輪都會平行執行 reference models，然後等待 aggregator 回應；每輪延遲往往和 advisors 產生多少 tokens 高度相關，因為整輪要等最慢的 advisor 完成。設定 <code class="language-plaintext highlighter-rouge">reference_max_tokens</code> 可以限制 advisors 的輸出長度，讓它們給出簡短建議、降低 wall time，而且不會限制 aggregator 最後給使用者看到的輸出。</p>

<p>我自己的實務判斷是：MoA 不該變成每個問題都開的大砲。它比較適合用在「高價值決策」或「需要多角度檢查」的節點，例如研究報告、方案比較、架構評審、PR review、顧問提案、投資研究，或重要文章發表前的反方檢查。</p>

<hr />

<h2 id="moa-的價值不是更多模型而是更好的決策流程">MoA 的價值：不是更多模型，而是更好的決策流程</h2>

<p>MoA 最容易被誤解成「多找幾個模型投票」。但真正有價值的 MoA，不只是投票，而是設計一條決策管線。</p>

<p>比較理想的 MoA 應該包含四種角色：</p>

<table>
  <thead>
    <tr>
      <th>角色</th>
      <th>任務</th>
      <th>適合模型</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Researcher</td>
      <td>蒐集資訊、整理來源、找出關鍵事實</td>
      <td>成本較低、搜尋強、摘要穩定的模型</td>
    </tr>
    <tr>
      <td>Specialist</td>
      <td>針對技術、商業、法規、產品做專業分析</td>
      <td>特定領域表現好的模型</td>
    </tr>
    <tr>
      <td>Skeptic</td>
      <td>挑錯、找風險、檢查過度推論</td>
      <td>推理強、保守、善於批判的模型</td>
    </tr>
    <tr>
      <td>Aggregator</td>
      <td>整合觀點、取捨、形成最終輸出</td>
      <td>高品質寫作與推理模型</td>
    </tr>
  </tbody>
</table>

<p>這也呼應 2025 年的《Rethinking Mixture-of-Agents》論文。該論文指出，混合不同 LLM 不一定總是優於用單一強模型做 self-ensemble；作者提出 Self-MoA，並在多項 benchmark 中觀察到它能超越 standard MoA。這提醒我們，MoA 的品質取決於模型選擇、任務類型與整合策略，不是模型越多越好。</p>

<p>換句話說，MoA 的核心不是「開很多模型很熱鬧」，而是「在正確的節點引入正確的分歧」。</p>

<hr />

<h2 id="hermes-agent-的架構價值">Hermes Agent 的架構價值</h2>

<p>Hermes Agent 值得研究，不只是因為它支援 MoA，而是因為它把 MoA 放進一個比較完整的 agent runtime。</p>

<p>Hermes 官方 README 提到幾個關鍵能力：</p>

<ul>
  <li>可使用 Nous Portal、OpenRouter、OpenAI、自有 endpoint 等模型來源，並可用 <code class="language-plaintext highlighter-rouge">hermes model</code> 切換，降低模型供應商鎖定。</li>
  <li>支援 Telegram、Discord、Slack、WhatsApp、Signal 與 CLI，並能維持跨平台 conversation continuity。</li>
  <li>具備 agent-curated memory、periodic nudges、autonomous skill creation、skills self-improve、FTS5 session search 與 LLM summarization。</li>
  <li>內建 cron scheduler，可執行 daily reports、nightly backups、weekly audits 等自然語言排程任務。</li>
  <li>可 spawn isolated subagents 做 parallel workstreams，也可以寫 Python scripts 透過 RPC 呼叫工具，把多步流程壓縮成低 context 成本的操作。</li>
</ul>

<p>這些能力加在一起，代表 Hermes 的重點不是「一次問答」，而是「常駐協作」。這也是我認為它值得持續研究的原因：</p>

<blockquote>
  <p>未來的 AI 能力，不只來自模型本身，而來自模型、工具、記憶、流程、權限與評估方法組成的 runtime。</p>
</blockquote>

<hr />

<h2 id="和主流-ai-agent-框架比較">和主流 AI Agent 框架比較</h2>

<h3 id="hermes-agent">Hermes Agent</h3>

<p>Hermes 的特色是「個人常駐型 runtime」。它適合做長期研究、自動化提醒、跨平台助理、個人知識管理、技能累積與多模型路由。它不是最輕量的框架，但很適合需要「長期成長」的 agent。</p>

<h3 id="langgraph">LangGraph</h3>

<p>LangGraph 更像工程導向的 workflow graph。它適合明確定義狀態、節點、分支、checkpoint 與可重跑流程。如果你在企業內要做可控流程，例如核准、客服分流、合規稽核、文件審查，LangGraph 會比 Hermes 更像「流程引擎」。</p>

<h3 id="crewai">CrewAI</h3>

<p>CrewAI 的官方文件主打 collaborative AI agents、crews 與 flows，並強調 guardrails、memory、knowledge、observability 等能力。它適合快速建立角色分工明確的多代理流程，例如研究員、撰稿員、審稿員、專案經理共同完成任務。</p>

<h3 id="openai-agents-sdk">OpenAI Agents SDK</h3>

<p>OpenAI Agents SDK 是相對輕量的 agentic app 開發套件。官方文件把 primitive 簡化為 Agents、Agents as tools／Handoffs、Guardrails，並內建 agent loop、function tools、MCP server tool calling、sessions、human-in-the-loop、tracing 等能力。它適合已經在 OpenAI 生態內開發產品的人，尤其是需要清楚 tracing、guardrails 與 handoffs 的應用。</p>

<h3 id="autogen">AutoGen</h3>

<p>AutoGen 的定位是 building AI agents and applications。官方文件區分 Studio、AgentChat、Core、Extensions；其中 AgentChat 適合 conversational single and multi-agent applications，Core 則是 event-driven programming framework，用於 scalable multi-agent AI systems。它適合做多代理對話研究、實驗型 agent collaboration，以及需要事件驅動、多語言、分散式代理的架構。</p>

<h3 id="openclaw">OpenClaw</h3>

<p>OpenClaw 代表另一條路線：以個人自主助理與 skills 生態為主。近期報導與資料顯示，它常被拿來和 Hermes Agent 一起比較，OpenClaw 偏向快速上手、技能庫與多通道整合，Hermes 則偏向 self-learning 與長期 runtime。</p>

<p>但 OpenClaw 也提醒我們一件事：當 agent 具備本機檔案、終端機、瀏覽器、錢包、行事曆或訊息權限時，技能生態本身就會變成供應鏈風險。已有安全研究討論 OpenClaw 這類代理的 skill poisoning、cognitive manipulation、multi-agent cascading failures 與 supply-chain vulnerabilities。</p>

<h3 id="框架比較總表">框架比較總表</h3>

<table>
  <thead>
    <tr>
      <th>框架</th>
      <th>核心定位</th>
      <th>最適合場景</th>
      <th>主要風險</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hermes Agent</td>
      <td>個人常駐型 self-improving runtime</td>
      <td>個人研究雷達、跨平台助理、長期記憶、排程、自動化</td>
      <td>權限控管與記憶治理要設計好</td>
    </tr>
    <tr>
      <td>LangGraph</td>
      <td>狀態圖與可控 workflow</td>
      <td>企業流程、自動化管線、可重跑任務</td>
      <td>需要較多工程設計</td>
    </tr>
    <tr>
      <td>CrewAI</td>
      <td>多角色 crews 與 flows</td>
      <td>快速建立多代理分工</td>
      <td>長期記憶與安全邊界仍需自行規劃</td>
    </tr>
    <tr>
      <td>OpenAI Agents SDK</td>
      <td>輕量 agent app runtime</td>
      <td>OpenAI 生態內產品開發</td>
      <td>供應商依賴較高</td>
    </tr>
    <tr>
      <td>AutoGen</td>
      <td>多代理對話與事件驅動研究</td>
      <td>多代理協作研究、原型實驗</td>
      <td>生產化仍需額外治理</td>
    </tr>
    <tr>
      <td>OpenClaw</td>
      <td>個人自主助理與技能生態</td>
      <td>快速自動化、多通道個人 assistant</td>
      <td>第三方 skills 與高權限操作風險</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="把-hermes-moa-放進真實工作流">把 Hermes MoA 放進真實工作流</h2>

<p>工具介紹寫完，更重要的是它能落在什麼位置。以下是我自己最想優先落地的三個場景。</p>

<h3 id="場景一ai-agent-研究雷達">場景一：AI Agent 研究雷達</h3>

<p>這是我最想先做起來的應用。骨架大致是：</p>

<figure style="margin:1.6em auto;text-align:center;max-width:680px;">
  <img src="/assets/img/hermes-moa/research-radar.svg" alt="AI Agent 研究雷達 pipeline 流程圖：Cron 每日觸發三路 Scout（News／Paper／GitHub）平行蒐集，匯整成研究摘要後經 Skeptic 反方檢查、MoA aggregator 整合，最後產出網站長文草稿、LinkedIn 觀點文與 X Thread 三種輸出" style="width:100%;height:auto;border:1px solid #eef0f2;border-radius:8px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖二：AI Agent 研究雷達——同一套骨架換掉資料來源與目標，就能變成顧問案源雷達</figcaption>
</figure>

<p>可以讓 Hermes 每天追蹤：</p>

<ul>
  <li>AI Agent 新框架</li>
  <li>MoA／multi-agent 論文</li>
  <li>OpenRouter 模型排行與價格變化</li>
  <li>Claude Code／Codex／Grok／Gemini Agent 的能力變化</li>
  <li>Web3 與 AI 交集的新產品</li>
  <li>GitHub 熱門 agent repo</li>
</ul>

<p>MoA 不一定用在每天的所有摘要，而是用在「每週一篇正式研究文章」前的最後整理。</p>

<h3 id="場景二web3ai-技術顧問案源雷達">場景二：Web3／AI 技術顧問案源雷達</h3>

<p>同一套骨架，換掉資料來源與目標，就能變成顧問案源雷達，而不只是找新聞。Pipeline 可以這樣拆：</p>

<ol>
  <li>掃描企業公告、職缺、技術文章、融資新聞。</li>
  <li>判斷該公司是否正在導入 AI Agent、Web3、錢包、資料治理或內部自動化。</li>
  <li>產生潛在痛點。</li>
  <li>產出顧問切入角度。</li>
  <li>生成 LinkedIn 互動建議或冷啟動訊息草稿。</li>
  <li>用 MoA 檢查「這個切入點是否合理、會不會太硬、是否有商業價值」。</li>
</ol>

<p>這種應用很貼近我自己的定位：AI Agent × Web3 × 軟體工程流程顧問。</p>

<h3 id="場景三claude-code-與-hermes-agent-的分工">場景三：Claude Code 與 Hermes Agent 的分工</h3>

<p>可以把 Claude Code 當成「工程實作副駕駛」，Hermes Agent 當成「長期研究與提醒中樞」。</p>

<table>
  <thead>
    <tr>
      <th>任務</th>
      <th>適合工具</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>寫程式、改 repo、跑測試</td>
      <td>Claude Code</td>
    </tr>
    <tr>
      <td>長期追蹤新聞與論文</td>
      <td>Hermes Agent</td>
    </tr>
    <tr>
      <td>每天彙整 Web3／AI 趨勢</td>
      <td>Hermes Agent</td>
    </tr>
    <tr>
      <td>Example Mapping／OpenSpec／TDD 實作</td>
      <td>Claude Code</td>
    </tr>
    <tr>
      <td>每週研究文章選題</td>
      <td>Hermes Agent ＋ MoA</td>
    </tr>
    <tr>
      <td>最終長文修稿</td>
      <td>Claude／ChatGPT／MoA aggregator</td>
    </tr>
  </tbody>
</table>

<p>這樣的分工比「哪個工具最好」更成熟。真正有效的 agentic workflow，不是單一工具稱王，而是每個工具坐在對的位置上。</p>

<hr />

<h2 id="部署與使用建議">部署與使用建議</h2>

<h3 id="不要一開始就全自動">不要一開始就全自動</h3>

<p>Hermes 有排程、工具、記憶、skills 與 gateway，很容易讓人一開始就想做「全自動個人助理」。但比較穩健的方式是分階段：</p>

<ol>
  <li><strong>只讀取、只整理、不執行外部動作</strong>——例如每日研究摘要、論文雷達、AI 工具新聞整理。</li>
  <li><strong>產生草稿，但人工確認後才發出</strong>——例如 LinkedIn 文章草稿、X thread、顧問開發信、活動推薦。</li>
  <li><strong>允許低風險自動化</strong>——例如整理資料夾、建立 markdown 筆記、更新 local knowledge base。</li>
  <li><strong>高風險操作永遠保留人工確認</strong>——例如寄信、發文、交易、刪檔、改 production 設定、操作公司系統。</li>
</ol>

<h3 id="moa-用在高價值節點">MoA 用在高價值節點</h3>

<table>
  <thead>
    <tr>
      <th>任務</th>
      <th>是否建議用 MoA</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>PR review</td>
      <td>建議</td>
      <td>可加入架構、測試、安全觀點</td>
    </tr>
    <tr>
      <td>投資決策</td>
      <td>可用，但必須人工判斷</td>
      <td>避免自動化金融決策</td>
    </tr>
    <tr>
      <td>社交活動推薦</td>
      <td>不一定</td>
      <td>可用單模型加偏好記憶即可</td>
    </tr>
  </tbody>
</table>

<h3 id="建議建立三種-moa-preset">建議建立三種 MoA preset</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">moa</span><span class="pi">:</span>
  <span class="na">default_preset</span><span class="pi">:</span> <span class="s">research</span>
  <span class="na">presets</span><span class="pi">:</span>
    <span class="na">research</span><span class="pi">:</span>
      <span class="na">reference_max_tokens</span><span class="pi">:</span> <span class="m">700</span>
      <span class="na">reference_temperature</span><span class="pi">:</span> <span class="m">0.5</span>
      <span class="na">aggregator_temperature</span><span class="pi">:</span> <span class="m">0.3</span>

    <span class="na">skeptic</span><span class="pi">:</span>
      <span class="na">reference_max_tokens</span><span class="pi">:</span> <span class="m">500</span>
      <span class="na">reference_temperature</span><span class="pi">:</span> <span class="m">0.2</span>
      <span class="na">aggregator_temperature</span><span class="pi">:</span> <span class="m">0.1</span>

    <span class="na">content</span><span class="pi">:</span>
      <span class="na">reference_max_tokens</span><span class="pi">:</span> <span class="m">600</span>
      <span class="na">reference_temperature</span><span class="pi">:</span> <span class="m">0.8</span>
      <span class="na">aggregator_temperature</span><span class="pi">:</span> <span class="m">0.5</span>
</code></pre></div></div>

<p>三種 preset 的用途：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">research</code>：研究報告、技術比較、論文摘要。</li>
  <li><code class="language-plaintext highlighter-rouge">skeptic</code>：反方檢查、風險控管、投資或顧問提案前的檢查。</li>
  <li><code class="language-plaintext highlighter-rouge">content</code>：網站文章、LinkedIn、X thread、個人品牌內容。</li>
</ul>

<hr />

<h2 id="值得一讀的-agent-研究論文">值得一讀的 Agent 研究論文</h2>

<p>以下是這篇文章背後的閱讀清單。它不只是「參考資料」，也可以當成後續研究的種子。</p>

<h3 id="mixture-of-agents-enhances-large-language-model-capabilities">Mixture-of-Agents Enhances Large Language Model Capabilities</h3>

<p>MoA 的核心論文，提出 layered MoA architecture，讓多個 LLM agents 分層產生輸出並互相參考，最後提升回答品質。</p>

<p><strong>對 Hermes 的啟發</strong>：Hermes 把這個概念產品化成 model provider，而不是獨立的 orchestration framework。</p>

<h3 id="rethinking-mixture-of-agents">Rethinking Mixture-of-Agents</h3>

<p>這篇論文提醒我們，混合不同模型不一定永遠更好；Self-MoA 在不少情境下反而超越 standard MoA。</p>

<p><strong>對 Hermes 的啟發</strong>：不要迷信「多模型混合」，要針對任務做 A/B test。</p>

<h3 id="react-synergizing-reasoning-and-acting-in-language-models">ReAct: Synergizing Reasoning and Acting in Language Models</h3>

<p>ReAct 是 tool-using agent 的重要基礎。它把 reasoning traces 與 actions 交錯產生，讓模型能透過外部知識或環境更新自己的行動。</p>

<p><strong>對 Hermes 的啟發</strong>：Hermes 的 agent loop、tool dispatch 與多輪工具結果回饋，可視為 ReAct 思想在實務系統中的延伸。</p>

<h3 id="gaia-a-benchmark-for-general-ai-assistants">GAIA: A Benchmark for General AI Assistants</h3>

<p>GAIA 測試的是真實助理能力，包含 reasoning、multimodality、web browsing 與 tool use。論文指出，人類得分為 92%，而帶 plugins 的 GPT-4 為 15%，顯示真實助理能力遠比單純問答困難。</p>

<p><strong>對 Hermes 的啟發</strong>：Hermes 這種有工具、瀏覽、記憶與跨 session 能力的 agent，應該用接近 GAIA 的任務來評估，而不是只看聊天品質。</p>

<h3 id="swe-bench">SWE-bench</h3>

<p>SWE-bench 使用真實 GitHub issues 與 pull requests 評估模型修復軟體問題的能力。它要求模型理解 codebase、修改多個檔案、與執行環境互動。</p>

<p><strong>對 Hermes 的啟發</strong>：要評估 Hermes 的工程能力，不能只看它會不會寫 code，而要看它能否完成可驗證、可回歸測試的修復流程。</p>

<h3 id="small-language-models-are-the-future-of-agentic-ai">Small Language Models are the Future of Agentic AI</h3>

<p>這篇論文主張，很多 agentic systems 其實只需要小模型反覆執行特定任務；小模型在成本、延遲與部署上可能更適合大量的 agent 子任務。</p>

<p><strong>對 Hermes 的啟發</strong>：MoA 的 reference models 不一定要全部使用最貴的模型。便宜、快速、專門化的小模型，可能更適合當 advisor。</p>

<h3 id="agentic-ai-a-comprehensive-survey">Agentic AI: A Comprehensive Survey</h3>

<p>這篇 survey 把 agentic systems 分成 symbolic／classical 與 neural／generative 兩條脈絡，並指出未來重點在混合式架構，而不是單一路線勝出。</p>

<p><strong>對 Hermes 的啟發</strong>：Hermes 屬於 neural／generative agent runtime，但若要進入企業流程，仍需要更多 symbolic policy、permission、workflow state 與 audit trail。</p>

<h3 id="ai-harness-engineering">AI Harness Engineering</h3>

<p>這篇 2026 年的論文把軟體工程 agent 的能力重新定義為 model-harness-environment system，不只看模型，而是看 task specification、context selection、tool access、project memory、observability、verification、permissions、intervention recording 等 runtime substrate。</p>

<p><strong>對 Hermes 的啟發</strong>：Hermes 的真正價值不只是模型回答，而是它提供了一個 harness，讓模型能觀察、行動、記憶、驗證與被人類介入。</p>

<hr />

<h2 id="風險與治理agent-越像員工越需要管理制度">風險與治理：Agent 越像員工，越需要管理制度</h2>

<p>Hermes、OpenClaw、Claude Code、OpenAI Agents SDK 這類工具越強，越不能只用「聊天機器人」的心態來管理。</p>

<p>一個常駐型 agent 至少會帶來五種風險：</p>

<ol>
  <li><strong>權限風險</strong>：能讀檔、改檔、上網、寄信、呼叫 API。</li>
  <li><strong>記憶風險</strong>：長期記憶可能保存過多個人或公司資訊。</li>
  <li><strong>工具風險</strong>：MCP server、skills、plugins 可能成為攻擊面。</li>
  <li><strong>供應鏈風險</strong>：第三方 skills 或套件可能含惡意邏輯。</li>
  <li><strong>錯誤放大風險</strong>：多代理可能互相強化錯誤，形成看似合理的錯誤共識。</li>
</ol>

<p>因此，比較務實的做法是按風險分級處理，用權限等級決定自動化程度：</p>

<figure style="margin:1.6em auto;text-align:center;max-width:720px;">
  <img src="/assets/img/hermes-moa/risk-governance.svg" alt="Agent 風險治理分級圖：依 Agent 能力研判風險等級，低風險允許自動執行、中風險需人工審閱、高風險僅限人工核准、極高風險不自動化" style="width:100%;height:auto;border:1px solid #eef0f2;border-radius:8px;" />
  <figcaption style="font-size:0.85rem;color:#6b7280;margin-top:0.6em;">圖三：用權限等級決定自動化程度——能力越高、越接近不可逆操作，越要保留人工把關</figcaption>
</figure>

<p>最低治理基線：</p>

<ul>
  <li>只讀任務可自動化。</li>
  <li>發文、寄信、改檔、刪檔、交易，必須人工確認。</li>
  <li>高權限工具放進 sandbox 或 allowlist。</li>
  <li>記憶系統要定期審查。</li>
  <li>第三方 skills 視為不可信程式碼。</li>
  <li>重要輸出保留 source map、agent logs 與人工評分。</li>
  <li>MoA 不等於事實查核，仍需 citation checker 與 source quality scoring。</li>
</ul>

<hr />

<h2 id="我的結論">我的結論</h2>

<p>Hermes Agent 的價值，不在於它又多了一個聊天入口，也不在於它能同時接多少模型。它真正值得研究的地方，是它把 AI Agent 從「一次性回答工具」推向「長期運作的個人 runtime」。</p>

<p>MoA 則是 Hermes 中很有代表性的設計：它不是取代 agent loop，而是把多模型觀點嵌入原有的 agent loop。Reference models 提供分析，aggregator 負責輸出與工具呼叫，讓多模型協作不會摧毀原有的工具、安全與會話架構。</p>

<p>對個人使用者而言，Hermes ＋ MoA 最有價值的方向不是「讓 AI 全自動幫我做所有事」，而是建立幾條高品質的工作流：AI Agent 與 Web3 研究雷達、技術顧問案源偵測、Claude Code 工作流改善、研究文章生產線、LinkedIn／X 觀點內容生成與反方檢查，以及高價值決策前的多模型審稿機制。</p>

<p>更抽象地說，Hermes Agent 讓我們開始面對一個新問題：</p>

<blockquote>
  <p>未來的專業能力，不只是會不會問 AI，而是能不能設計一套讓 AI 穩定研究、判斷、行動、記憶與被治理的系統。</p>
</blockquote>

<p>這正是 agentic engineering 的核心。</p>

<hr />

<h2 id="參考資料">參考資料</h2>

<ul>
  <li><a href="https://github.com/NousResearch/hermes-agent">Nous Research，Hermes Agent GitHub README</a>。</li>
  <li><a href="https://hermes-agent.nousresearch.com/docs/user-guide/features/mixture-of-agents">Hermes Agent 官方文件：Mixture of Agents</a>。</li>
  <li><a href="https://arxiv.org/abs/2406.04692">Wang et al., 2024, <em>Mixture-of-Agents Enhances Large Language Model Capabilities</em></a>。</li>
  <li><a href="https://arxiv.org/abs/2502.00674">Li et al., 2025, <em>Rethinking Mixture-of-Agents: Is Mixing Different Large Language Models Beneficial?</em></a>。</li>
  <li><a href="https://arxiv.org/abs/2210.03629">Yao et al., 2022, <em>ReAct: Synergizing Reasoning and Acting in Language Models</em></a>。</li>
  <li><a href="https://arxiv.org/abs/2311.12983">Mialon et al., 2023, <em>GAIA: A Benchmark for General AI Assistants</em></a>。</li>
  <li><a href="https://arxiv.org/abs/2310.06770">Jimenez et al., 2023, <em>SWE-bench: Can Language Models Resolve Real-World GitHub Issues?</em></a>。</li>
  <li><a href="https://arxiv.org/abs/2506.02153">Belcak et al., 2025, <em>Small Language Models are the Future of Agentic AI</em></a>。</li>
  <li><a href="https://arxiv.org/abs/2605.13357">Zhong and Zhu, 2026, <em>AI Harness Engineering: A Runtime Substrate for Foundation-Model Software Agents</em></a>。</li>
</ul>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[AI Agent 的競爭，正從「哪個模型最聰明」轉向「如何讓多模型、工具、記憶與工作流組成可靠系統」。本文從 Mixture of Agents（MoA）切入，解析 Nous Research 的 Hermes Agent 如何把 MoA 產品化成一個虛擬模型供應商，比較 LangGraph、CrewAI、AutoGen、OpenAI Agents SDK 等框架的差異，並附上研究論文清單與治理原則。]]></summary></entry><entry><title type="html">產品命名不是語感問題，是社群記憶問題：從 GPT-5.6 的 Sol / Terra / Luna 談起</title><link href="https://swanky.github.io/technical/product-naming-community-memory/" rel="alternate" type="text/html" title="產品命名不是語感問題，是社群記憶問題：從 GPT-5.6 的 Sol / Terra / Luna 談起" /><published>2026-07-03T00:00:00+00:00</published><updated>2026-07-03T00:00:00+00:00</updated><id>https://swanky.github.io/technical/product-naming-community-memory</id><content type="html" xml:base="https://swanky.github.io/technical/product-naming-community-memory/"><![CDATA[<blockquote>
  <p>Terra / Luna 不是每個人都會想到宇宙</p>
</blockquote>

<p>OpenAI 最近推出 GPT-5.6 系列，命名為 Sol、Terra、Luna。</p>

<p>如果只從字面看，這套命名很合理。</p>

<ul>
  <li>Sol 是太陽，代表最高階旗艦模型</li>
  <li>Terra 是地球，代表中階、平衡、可大規模使用</li>
  <li>Luna 是月亮，代表更輕量、更快速、更低成本</li>
</ul>

<p>一套漂亮的天體階層命名。</p>

<p>但問題是，當 Terra 和 Luna 同時出現時，對另一群人來說，它不是天文學，而是金融災難現場。</p>

<p>對幣圈、Web3、FinTech 或曾經經歷 2022 Terra/LUNA 崩盤的人來說，Terra / Luna 不是優雅的產品線，而是 depeg、death spiral、資產歸零、信任崩塌的集體記憶。</p>

<p>這讓我想到一件事：</p>

<p>產品命名不是公司自己覺得好聽就好。命名本身會穿越不同社群、不同產業、不同歷史事件。</p>

<p>同一個名字，在 A 社群裡可能是詩意，在 B 社群裡可能是事故報告。</p>

<p>對一般 AI 使用者來說，Sol / Terra / Luna 可能只是新的模型階層。但對 crypto native 使用者來說，這組名字很難不讓人想起 Terra / Luna 的崩盤。</p>

<p>這不代表 OpenAI 是故意碰瓷。更可能是典型的產品命名盲區：</p>

<p>命名團隊看到的是宇宙意象。特定社群看到的是災難殘影。</p>

<p>這件事其實很適合拿來提醒所有做產品、品牌、技術平台的人：</p>

<p>當產品開始跨產業、跨社群、跨文化使用時，命名不只是 branding。它也是風險管理。</p>

<p>尤其 AI 產品未來會進入金融、醫療、法務、資安、政府、教育等高信任場景。名字帶來的第一印象，會直接影響使用者對產品穩定性、安全性與可信度的感受。</p>

<p>如果今天有一個金融保管產品叫 FTX Vault，
一個資安產品叫 SolarWinds Shield，
一個穩定幣叫 Lehman USD，</p>

<p>你大概會知道問題在哪。</p>

<p>所以 GPT-5.6 的 Sol / Terra / Luna 命名，真正值得討論的不是「這名字好不好聽」，而是：</p>

<p>在高度全球化、高度社群化的科技產品裡，命名是不是也該做語義風險評估？</p>

<p>AI 產品越來越像基礎建設。基礎建設的命名，不能只看美感，也要看歷史包袱。命名不只是 branding，命名也是語義風險管理。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[OpenAI 將 GPT-5.6 系列命名為 Sol、Terra、Luna，在幣圈眼中卻是 2022 崩盤的集體記憶。命名不只是 branding，也是語義風險管理。]]></summary></entry><entry><title type="html">裝了 Hermes Agent 之後，我一直在想她適合做什麼。答案是：幫我脫單</title><link href="https://swanky.github.io/technical/hermes-agent-decision-pipeline/" rel="alternate" type="text/html" title="裝了 Hermes Agent 之後，我一直在想她適合做什麼。答案是：幫我脫單" /><published>2026-07-02T00:00:00+00:00</published><updated>2026-07-02T00:00:00+00:00</updated><id>https://swanky.github.io/technical/hermes-agent-decision-pipeline</id><content type="html" xml:base="https://swanky.github.io/technical/hermes-agent-decision-pipeline/"><![CDATA[<blockquote>
  <p>Claude Code 幫我寫程式，Hermes Agent 幫我脫單</p>
</blockquote>

<p>每天都在用 Claude Code 弄文件或寫程式。它已經是我工作流程的一部分：我下指令、它執行，只要我在鍵盤前，它就很強。</p>

<p>最近開始玩 Hermes Agent（Nous Research 的自主 AI Agent），除了花了一些時間調教她讓她叫我主人，研究串 OpenRouter 上到底哪個 LLM 的 CP 值最高，有一個問題一直在我腦中盤旋：</p>

<p>這種會自己跑排程、不需要我在場的 Agent，到底適合拿來做什麼？</p>

<p>它和 Claude Code 的形態明顯不同：Claude Code 是我發動的，session 結束就停；Hermes Agent 是排程自主型，我不在，它照跑，還會主動把結果推給我。工具的形態不一樣，適合的問題應該也不一樣——但那個問題，長什麼樣子？</p>

<p>剛過完 43 歲生日，答案自己出現了：脫單。</p>

<p>如果我想脫單，這件事不能再只靠緣分、心情，或某天突然被宇宙推進社交場合。而它剛好符合自主 Agent 的所有特徵：需要每天重複做、不需要我盯著、資訊會過期、最大的敵人是拖延。</p>

<p>於是我設了一個每日排程任務：讓 Hermes Agent 每天自動上網撈雙北的社交活動，比對我的條件、排出優先順序，寫成一封信寄到我的信箱。</p>

<p>表面上看，這只是活動推薦。但我真正想驗證的是：</p>

<p>AI Agent 能不能幫我把一個模糊的人生目標，拆成每天可以推進的行動？</p>

<p>「想脫單」不是一個可以直接執行的任務，何況這件事對我這 INTJ 人來說難度特別高。要去哪裡認識人？什麼活動適合我的年齡和狀態？今天的第一步是什麼？這些問題每次都從零開始想，最後很容易變成：想了很多，但沒有出門。</p>

<p>所以我把它設計成四層 workflow，每天這封信，就是這條 pipeline 的輸出。</p>

<p><strong>第一層：資料蒐集。</strong> 從活動平台取得完整候選資料：時間、地點、類型、報名連結、年齡限制。這一層是基本功。</p>

<p><strong>第二層：個人化篩選。</strong> 信的第一句話是：「早安主人，我用 Swanky 今天 43 歲，幫你篩掉男生上限 40 的局。」它拿我的硬性條件逐一比對報名限制，符合的標「可參加」，資訊不足的標「年齡需確認」——先過濾、再呈現、不確定就標註，而不是裝懂。</p>

<p><strong>第三層：決策輔助。</strong> 條件符合，不代表值得去。每個活動都附「為什麼適合我」和「注意事項」：共煮活動是「流程比尬聊自然，能用分工和生活習慣觀察人」；讀書會是「現場少講方法論，多問對方故事」。推薦附理由、理由附風險。</p>

<p><strong>第四層：行動引導。</strong> 真實世界的瓶頸，通常不是資訊不足，而是行動摩擦太高。所以信的結尾是「今日最小行動」——今天只要做一件事：確認某場活動的最後名額還在不在。再加上「本週行動節奏」：報名 1–2 場、出席 1 場、現場跟 3 個人自然聊天、加 1 個聯絡方式。</p>

<p>它甚至每天附一段社交提醒，我第一次看到就笑出來：</p>

<p>「先顧感受，再給建議；不要把約會變成 code review，對方沒問就先不要修正她的人生。」</p>

<p>一個 AI 每天提醒工程師不要對人類 debug——光憑這點，這個排程就值得一直跑下去。</p>

<p>回到最初的問題：自主 Agent 到底適合做什麼？</p>

<p>這次實驗給我的答案是：Claude Code 這類互動式 Agent，適合「我在場、需要即時協作」的任務；Hermes Agent 這類排程自主型 Agent，適合的是「重複發生、不需要我在場、但需要被持續推進」的目標。</p>

<p>它的價值不只是 automation，而是 decision pipeline——在正確的時間，把篩選、排序、解釋過的資訊，轉換成我可以採取的下一步。同樣的骨架，換掉資料來源和目標，就是找商機、盤點職涯機會、追蹤學習資源。</p>

<p>43 歲之後，我對 AI 的期待變得很務實：不是要它替我過人生，而是在我想改變某件事的時候，每天幫我把那一步，往前推一點。</p>

<hr />

<p>最後，認真說</p>

<p>Hermes Agent 給我的本週行動節奏裡，有一條是「跟 3 個人自然聊天，加 1 個聯絡方式」。</p>

<p>所以，這篇文章也算是我之後每周的行動之一。</p>

<p>我是真的想擴大自己的社交生活圈。如果你看完這篇，想聊聊 Web3、AI、攝影，想介紹朋友給我認識，或單純想交個朋友——歡迎私訊約我喝咖啡。☕</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[互動式的 Claude Code 之外，排程自主型的 Hermes Agent 適合做什麼？我把它設成每日排程，讓它把「脫單」這個模糊的人生目標，拆成每天可以推進的行動——一場關於自主 Agent 與 AI decision pipeline 的實驗。]]></summary></entry><entry><title type="html">《虛擬資產服務法》三讀通過：交易所的競爭，正從流量戰走向信任戰</title><link href="https://swanky.github.io/technical/vasp-act-trust-war/" rel="alternate" type="text/html" title="《虛擬資產服務法》三讀通過：交易所的競爭，正從流量戰走向信任戰" /><published>2026-06-30T00:00:00+00:00</published><updated>2026-06-30T00:00:00+00:00</updated><id>https://swanky.github.io/technical/vasp-act-trust-war</id><content type="html" xml:base="https://swanky.github.io/technical/vasp-act-trust-war/"><![CDATA[<p>台灣 VASP 進入許可制時代：合規、保管、穩定幣與 RWA，會是下一輪關鍵戰場</p>

<p>今天，立法院三讀通過《虛擬資產服務法》。我不會把這件事簡單看成「幣圈合法化」。更準確地說，這是台灣第一次把虛擬資產服務正式拉進金融監理架構。VASP 從過去偏向洗錢防制登記的管理方式，往金管會許可制前進，也就是從「可以登記」走向「必須取得牌照」。</p>

<p>這件事對產業的影響，不只在法條本身。真正會被改寫的，是交易所之間的競爭方式。</p>

<p>過去交易所比的是什麼？上幣速度、活動補貼、手續費、流動性、合約深度、產品夠不夠刺激。這些東西以後還是重要，但不會是全部。專法上路後，另一組關鍵字會變得越來越重要：</p>

<p>許可、資產隔離、內控、資安、資訊揭露、穩定幣合規、異常交易監控。</p>

<p>這聽起來比較無聊。但金融市場裡，很多真正重要的東西，本來就很無聊。錢放在哪裡、誰能動用、出了事誰負責、帳怎麼查、資產有沒有隔離、系統掛掉怎麼辦、平台有沒有能力偵測異常交易。這些不是行銷文案裡最性感的部分，卻是使用者最後會在乎的部分。</p>

<p>這次專法把方向講得很清楚。VASP 未來必須依業務類型取得許可，包括交換、交易平台、移轉、保管、承銷、借貸等服務。業者也要建立內控稽核、資通安全、營運持續等制度。</p>

<p>穩定幣的規範更是高標準。發行前要經金管會許可，並會商中央銀行同意。發行人要維持十足準備資產，存放在境內金融機構，與自有財產分離，並信託保管。穩定幣也不得支付任何形式的利息或收益。</p>

<p>罰則也拉得很重。涉及詐欺或操縱市場，最重可處 10 年有期徒刑，併科 2 億元罰金。</p>

<p>對國內交易所來說，短期一定是壓力。合規成本會上升。資本、法遵、會計查核、客戶資產保管、幣種上下架審查、異常交易監控，全部都會變成真成本。以前可以靠速度和流量解決的問題，以後不一定過得去。灰色地帶的玩法，會越來越難走。</p>

<p>但反過來看，這也是本土合規交易所少見的機會。因為當監理從登記制走向許可制，牌照本身就會變成信任門檻。</p>

<p>如果國內交易所能把台幣出入金、客戶資產隔離、企業帳戶、穩定幣交易、RWA 應用，以及金融機構合作串起來，它們就不只是「買幣的地方」。它們有機會變成台灣進入數位金融世界的主要入口。</p>

<p>這對海外大型交易所也會產生影響。Binance、OKX、Bybit、Coinbase、Kraken 這類全球平台，過去靠的是流動性、產品完整度和國際品牌。但在台灣市場，未來要面對的問題會變成：</p>

<ul>
  <li>要不要正式落地？</li>
  <li>要不要申請許可？</li>
  <li>能不能公開行銷？</li>
  <li>能不能接台幣金流？</li>
  <li>能不能跟台灣金融機構和企業合作？</li>
</ul>

<p>我不認為海外交易所會因為這部法就突然消失。這不太現實。全球流動性、衍生性商品、多元幣種，仍然是海外平台很強的地方。使用者也不會因為一部法律，就停止追求更深的市場和更多產品。</p>

<p>但它們在台灣的角色，可能會重新分層。國內合規交易所，會更像台幣入口與合規資產通道。海外交易所，仍然保有全球流動性與多元產品優勢。DeFi，則繼續承接更高自由度、也更高風險的鏈上需求。</p>

<p>也就是說，台灣未來的虛擬資產市場，可能不是單一路線，而是三層結構：</p>

<ul>
  <li>合規入口在國內。</li>
  <li>深度交易在海外。</li>
  <li>創新實驗在鏈上。</li>
</ul>

<p>這部法真正有意思的地方，不只是監管交易所。而是台灣開始回答一個更大的問題：當資產、支付、身分、憑證、債券、基金、不動產、應收帳款、碳權，都有機會被數位化與代幣化時，我們要用什麼制度，讓它們安全地接上金融體系？</p>

<p>這才是 RWA、穩定幣、鏈上金融真正會碰到的核心問題。不是「可不可以發幣」。而是「發出來之後，能不能被信任」。</p>

<p>所以我會把《虛擬資產服務法》視為起點，而不是終點。它通過，不代表 RWA、穩定幣、鏈上金融明天就起飛。接下來真正關鍵的是子法。</p>

<p>金管會預計最快在 2027 年第一季完成 9 項子法，讓專法正式上路。牌照門檻、資本額、資安標準、穩定幣準備資產、境外平台管理、幣種上下架規則，以及金融機構如何參與，都會在這個階段變得更具體。</p>

<p>另外，立法院也通過附帶決議，要求金管會一年內提出開放虛擬資產衍生性商品的規劃。這會是另一個需要觀察的變數。</p>

<p>未來幾年，交易所的競爭不會只看誰的 App 好用、誰的幣多、誰的活動大。而會看誰能同時做好三件事：</p>

<ul>
  <li>第一，接得上監理。</li>
  <li>第二，守得住資產。</li>
  <li>第三，連得上真實經濟。</li>
</ul>

<p>虛擬資產產業不是被按下停止鍵。它只是開始被要求蓋地基。</p>

<p>而地基這種東西，平常沒人想看。但最後，會決定一棟樓能蓋多高。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[台灣《虛擬資產服務法》三讀通過，VASP 邁入金管會許可制時代。交易所的競爭，正從上幣速度與流量補貼，轉向合規、資產保管與信任。]]></summary></entry><entry><title type="html">AI 寫程式很便宜，好程式沒有——Simon Willison《Agentic Engineering Patterns》導讀</title><link href="https://swanky.github.io/claude-code/agentic-engineering-patterns-guide/" rel="alternate" type="text/html" title="AI 寫程式很便宜，好程式沒有——Simon Willison《Agentic Engineering Patterns》導讀" /><published>2026-06-14T00:00:00+00:00</published><updated>2026-06-14T00:00:00+00:00</updated><id>https://swanky.github.io/claude-code/agentic-engineering-patterns-guide</id><content type="html" xml:base="https://swanky.github.io/claude-code/agentic-engineering-patterns-guide/"><![CDATA[<p>關於 AI 寫程式的內容，現在多到爆炸。但老實說，大部分都是技巧型的——這個快捷鍵、那個外掛、某個 prompt 模板——很實用，可是過幾個月工具一改版就半數失效。</p>

<p>最近讀到一份難得的例外。</p>

<p><a href="https://simonwillison.net/">Simon Willison</a> 把他這一兩年用 coding agent 開發的實戰，整理成一份叫做 <strong>《Agentic Engineering Patterns》</strong> 的指南。如果你不認識他——他是 Django 框架的共同作者、開源工具 Datasette 的作者，也是這幾年寫 LLM 實務寫得最勤、最務實的人之一。</p>

<p>這份指南刻意不寫「某個工具怎麼操作」，而是去萃取那些<strong>能被實際驗證有效、又不太會因為工具進步就過時的原則</strong>。它分成六大主題、十幾篇文章，而且他明講這是一份「持續進行中」的活文件，沒有任何一章算完稿。</p>

<p>我把全文從頭到尾讀完，這篇是我的導讀。我會挑出我認為<strong>台灣技術團隊最該吸收的幾個重點</strong>，配上我自己在公司帶 Claude Code 導入時的對照。文末有原文連結，我強烈建議你直接去讀原文——以下是我的整理與觀點，引用到 Simon 的句子我都會標出來。</p>

<hr />

<h3 id="先把詞講清楚agentic-engineering-不是-vibe-coding">先把詞講清楚：agentic engineering 不是 vibe coding</h3>

<p>Simon 對「代理式工程（agentic engineering）」的定義很樸素：<strong>借助程式代理（coding agent）來開發軟體</strong>。而他對「代理（agent）」的定義更精煉：</p>

<blockquote>
  <p>“Agents run tools in a loop to achieve a goal.”
—— Simon Willison</p>
</blockquote>

<p>代理，就是「在一個迴圈裡反覆呼叫工具、以達成某個目標」的東西。對程式代理來說，這組工具裡最關鍵的一個，就是<strong>能夠執行程式碼</strong>。他甚至把這件事提到決定性的高度——少了執行能力，大型語言模型（LLM）吐出來的內容價值有限；一旦能執行、能反覆驗證，單純的文字生成才被提升成了工程。</p>

<p>接著他做了一件我很認同的事：把 agentic engineering 跟 vibe coding 清楚分開。</p>

<p>vibe coding（憑感覺寫程式）這個詞是 Andrej Karpathy 提出的，原意很特定——你對 AI 下提示詞、把它生出來的東西直接接受，甚至不去管它對不對。很多人後來把這個詞擴大成「只要用 AI 產程式碼」都算，但 Simon 明確反對：</p>

<blockquote>
  <p>“Some people extend that definition to cover any time an LLM is used to produce code at all, but I think that’s a mistake.”
—— Simon Willison</p>
</blockquote>

<p>他主張的分界線是：vibe coding 指的是<strong>未經審查、原型品質</strong>的產出；而代理式工程，是要把程式碼<strong>提升到上線品質、由作者親自把關過</strong>的。差別不在用不用 AI，而在<strong>有沒有人審查、有沒有達到可交付的標準</strong>。</p>

<p>這跟我一直在講的兩件事完全是同一回事——<a href="/technical/agentic-engineering/">把 AI 當成「需要被好好帶領的高級實習生」</a>，以及越懂工程的人越能把 AI 用出價值。工具把打字變便宜了，但「判斷該寫什麼、把關品質」這件事，依然牢牢握在人手上。</p>

<hr />

<h3 id="整份指南最該被框起來的一句好程式仍有成本">整份指南最該被框起來的一句：好程式仍有成本</h3>

<p>如果這份指南只能記一句話，我會選這句的概念：</p>

<blockquote>
  <p>“Delivering new code has dropped in price to almost free … but delivering <em>good</em> code remains significantly more expensive than that.”
—— Simon Willison</p>
</blockquote>

<p><strong>交付「會動的程式碼」已經幾乎免費；但交付「好程式」，依然很貴。</strong> 這兩件事不是同一回事。</p>

<p>而且 Simon 不是含糊喊口號，他把「好程式」攤開成一張很具體的清單：功能正確、解對問題、錯誤處理得宜、夠簡潔、有測試覆蓋、文件最新、設計可維護，還有一整排非功能性需求——可及性、安全性、可測試性、可靠性、可觀測性、可擴展性。</p>

<p>工具能幫你做掉上面很多項，但他畫了一條關鍵的責任線：<strong>工具能分攤勞動，卻不能轉移責任。</strong> 最終產出是不是「好程式」，仍由握方向盤的人負責。</p>

<p>這一點，我認為台灣團隊要特別警惕。我們很多團隊本來就背著沉重的技術債，最危險的就是把「寫程式變便宜了」誤讀成「可以免洗」——省掉測試、跳過文件、忽略可及性與安全性。<strong>正確的方向剛好相反：當 AI 把產出加速了，你反而更有餘裕、也更該嚴格地守住這些非功能性需求。</strong></p>

<p>指南裡還有一個我很喜歡的習慣轉變。過去因為寫程式很貴，遇到沒把握的邊際點子，理性的反應是「別做，不值得花時間」。但現在 token 很便宜、真正稀缺的是人的注意力——所以該把「先否決」的本能，換成「先丟一個 prompt 去非同步跑跑看」。最壞不過是十分鐘後回來看一眼，發現果然不值得。<strong>守門的直覺，該被便宜的實驗取代。</strong></p>

<hr />

<h3 id="想把-ai-用好先懂它怎麼運作">想把 AI 用好，先懂它怎麼運作</h3>

<p>很多人用 coding agent 像在用黑盒子。Simon 花了一整章拆解它的內部：說到底，就是 <strong>LLM ＋ 系統提示（system prompt）＋ 一組工具，在一個迴圈裡反覆對話</strong>；他也解釋了 token 快取為什麼重要。</p>

<p>為什麼工程師該懂這層？因為它直接決定你的操作習慣——你會更知道怎麼寫 prompt、怎麼管理 context、為什麼不該在一個 session 裡反覆橫跳把快取打壞。理解原理的人，才不會把 AI 當神諭亂拜。</p>

<p>這一段裡我覺得最實用的是<strong>子代理（subagents）</strong>：用像 Claude Code 的 Explore 子代理去讀檔、探索，把摘要帶回來，讓主對話的 context 保持乾淨；需要時開平行子代理同時跑多個任務；甚至建立固定用途的專家子代理。這跟我之前整理 <a href="/education/ai/">Claude Code 實戰技巧</a> 時談到的平行工作流、用子代理保持主脈絡乾淨，是完全一致的方向。</p>

<hr />

<h3 id="測試與-qa把自我驗證變成預設">測試與 QA：把「自我驗證」變成預設</h3>

<p>整份指南有三章都在談測試，這個比重本身就是一種主張。它們講紅燈／綠燈 TDD、講「先把測試跑起來」、講<strong>代理式手動測試</strong>——讓代理用瀏覽器自動化自己去點、自己驗 UI、自己截圖記錄過程。</p>

<p>三章其實指向同一件事：<strong>給 AI 一個能自己判斷對錯的迴路，而不是讓它做一步就把半成品丟回來叫你看。</strong></p>

<p>這正是我反覆強調的「工作閉環」。我帶團隊時最常修正同仁的一個地方，就是不要接受 AI 說「請你打開檔案確認一下」——那只是把工作切碎丟回給你。成熟的用法是要求它形成完整迴路：</p>

<p><strong>理解任務 → 執行任務 → 自我檢查 → 修正問題 → 交付可驗收成果。</strong></p>

<p>落到操作上很簡單：把「跑測試，若失敗就修到通過再結束」直接寫進你的交辦 prompt。一句話，成果品質就明顯不同。</p>

<hr />

<h3 id="理解陌生程式碼的新玩法">理解陌生程式碼的新玩法</h3>

<p>這部分對接手舊系統、帶新人的人特別有感。Simon 介紹了用 AI 做<strong>線性逐步導覽</strong>與<strong>互動式解說</strong>——讓 AI 針對一段陌生的程式碼或一份資料，產生一份一次性的、甚至可互動的解說（有時就是一個小工具），幫你快速建立理解。</p>

<p>我自己的對照是：把 AI 當「程式碼導覽員」，是新人上手與接手 legacy 專案時最低風險、最高報酬的用法之一。先不要叫它改大功能，先請它帶你讀懂這塊地形。</p>

<hr />

<h3 id="附錄才是隱藏寶藏把提示詞當資產和一條紅線">附錄才是隱藏寶藏：把提示詞當資產，和一條紅線</h3>

<p>很多人會跳過附錄，但這份指南的附錄我認為價值最高。Simon 把自己日常在用的幾個 prompt 直接公開——校稿、寫圖片替代文字（alt text）、從 podcast 逐字稿挑金句、用 Claude 做可攜的小工具。</p>

<p>它們有一個共同的設計哲學：幾乎都被沉澱成 <strong>Claude 專案的自訂指令</strong>，而不是每次重打。換句話說，他把「重複使用的意圖」固定成一段系統提示，之後只要把素材丟進去，就能得到穩定一致的輸出。這呼應了指南另一個核心概念——把你會做、好用的東西「囤積」起來、重組，變成可重複呼叫的資產。<strong>好的 prompt 不該是一次性的靈感，而該是版本控管得起來的團隊資產。</strong></p>

<p>附錄裡還有一條紅線，我非常認同。Simon 會用 LLM 校稿、更新文件，但他立了一條界線：</p>

<blockquote>
  <p>“My hard line is that anything that expresses opinions or uses ‘I’ pronouns needs to have been written by me.”
—— Simon Willison</p>
</blockquote>

<p>凡是表達觀點、會掛上他名字、用到「我」的內容，都必須他本人親手寫。</p>

<p>我會把這條延伸成一個給團隊的建議：<strong>每個團隊都該有一份簡單的 AI 使用守則，講清楚哪些工作可以交給機器（格式整理、挑錯、寫草稿、篩選資料），哪些必須由人親手把關（觀點、判斷、對外掛名的內容）。</strong> 把這條線講清楚，不會限制效率，反而會建立讀者與客戶對你的信任。</p>

<hr />

<h3 id="結語在喧囂裡它給的是不會過時的原則">結語：在喧囂裡，它給的是不會過時的原則</h3>

<p>我讀完最大的感受是：這份指南真正珍貴的，不是任何一個單一技巧，而是它<strong>刻意只萃取原則</strong>。工具每幾個月就換一輪，但「好程式仍有成本」「給 AI 自我驗證的迴路」「把提示詞變資產」「掛名的內容自己寫」這些，會跟著你很久。它還是一份會持續更新的活文件——這本身就是面對這個領域該有的態度：與其追逐技巧，不如沉澱原則。</p>

<p>如果你讀完只想先做三件事，我的建議是：</p>

<ol>
  <li><strong>把「跑測試／自我驗證並修到通過再結束」寫進你每一個交辦 prompt。</strong> 這是投報率最高的一句。</li>
  <li><strong>挑一個你每週都會重複的工作，把那段 prompt 沉澱成固定的自訂指令或 skill。</strong> 讓它變成資產，而不是每次重想。</li>
  <li><strong>跟團隊講清楚一條紅線：哪些內容一定要由人親手寫。</strong> 先建立信任，再談效率。</li>
</ol>

<hr />

<p>這份指南值得你親自讀一遍：<a href="https://simonwillison.net/guides/agentic-engineering-patterns/">Simon Willison《Agentic Engineering Patterns》原文</a>。</p>

<p>如果你想把這套「用工程紀律駕馭 AI」的方法帶進自己的團隊，我也把帶團隊的完整經驗整理成了 <a href="/technical/agentic-engineering/">Agentic Engineering 系列文章</a>，並濃縮成一門 <a href="/education/claude-code/">Claude Code 內訓課程（課綱完整公開）</a>；需要導入顧問的話，也歡迎來 <a href="/technical/">信聊聊</a>。</p>

<p>最後想問問你：<strong>讀完這份指南，你最想先在自己團隊落地哪一條？</strong></p>]]></content><author><name></name></author><category term="claude-code" /><category term="claude-code" /><summary type="html"><![CDATA[Django 共同作者 Simon Willison 把「代理式工程」整理成一份系統性的活文件指南。我讀完全文，挑出對台灣技術團隊最有用的重點——從 agentic engineering 的定義、vibe coding 的分界、好程式的成本，到子代理、測試閉環與把提示詞變資產——並對照我自己帶團隊導入 Claude Code 的經驗。]]></summary></entry><entry><title type="html">我請星海爭霸的凱莉根，幫我盯 Claude Code</title><link href="https://swanky.github.io/technical/peon-ping-attention-management/" rel="alternate" type="text/html" title="我請星海爭霸的凱莉根，幫我盯 Claude Code" /><published>2026-06-12T00:00:00+00:00</published><updated>2026-06-12T00:00:00+00:00</updated><id>https://swanky.github.io/technical/peon-ping-attention-management</id><content type="html" xml:base="https://swanky.github.io/technical/peon-ping-attention-management/"><![CDATA[<blockquote>
  <p>一小時做出來的玩具，十萬工程師在用：peon-ping 與 AI 時代的注意力管理</p>
</blockquote>

<p>最近的 AI 協作日常長這樣：同時開好幾個 Claude Code session 在背景跑——一個在改 API、一個在補測試、一個在跑 E2E 驗證。</p>

<p>然後問題來了。</p>

<p>Agent 跑完了、卡在權限確認、或是出錯停住，terminal 並不會主動告訴你。你切去回個訊息或信件，回來才發現它十分鐘前就在等你按 yes。Agent 的時間不值錢，貴的是你每一次 context switch 燒掉的專注力。</p>

<p>有趣的是，這個問題 RTS 遊戲在 25 年前就解掉了。</p>

<p>星海爭霸怎麼讓一個玩家同時管理多條戰線？靠聲音。警報一響，你不用盯著小地圖，就知道該把鏡頭切去哪裡。聲音，本來就是平行任務管理的原生介面。</p>

<p>peon-ping 這個開源專案做的就是這件事：把 RTS 的音效設計，搬進 agentic coding 的工作流。</p>

<p>它的玩法：</p>

<p>→ Session 啟動、任務完成、需要權限、執行出錯、撞到 rate limit，各自觸發不同的遊戲角色語音，搭配螢幕橫幅通知</p>

<p>→ 收錄超過百款遊戲與影視作品的音效包：魔獸爭霸苦工（Peon）、星海爭霸、Portal 的 GLaDOS 都有，也能自己擴充</p>

<p>→ 不同專案目錄可以綁定不同角色——閉著眼睛，聽聲音就知道是哪個專案在叫你</p>

<p>→ 平行 subagent 太吵？一個設定就能只保留主 session 的完成音</p>

<p>→ 開會自動靜音：偵測到麥克風使用中，音效自動暫停</p>

<p>→ 彩蛋：短時間內狂催 prompt，苦工會不耐煩地嗆你 “Me busy, leave me alone!”</p>

<p>不只 Claude Code，Codex、Cursor、Gemini CLI 等十多種工具都支援，背後是 CESP 這個開放的音效事件標準。</p>

<p>這個工具的出身也很有意思。PCMag 最近報導了它背後的故事：最初版本是 Tony Sheng 花一個小時做出來丟上 GitHub 的，他自嘲這大概是自己發布過最蠢的東西——但每個用過的人都說意外好用。後來交棒給前 Google 工程師的弟弟 Gary 經營，登上 Hacker News、被整合進 VS Code 之後，如今已有約十萬名開發者在用。</p>

<p>一個一小時做出來的玩具，能長到十萬人在用，通常代表它打中的痛點是真的。</p>

<p>Gary 受訪時還講了一個我特別有感的點：大家花了不少錢買 AI 算力，但當 terminal 閒置在那邊等你回來，你已經付費的運算額度就是在空轉。</p>

<p>換句話說，注意力管理不只是專注力問題，它直接是成本問題。每一個被你晾在背景的 session，都在燒你刷下去的訂閱費。</p>

<p>我自己掛的是 sc_kerrigan 音效包——星海爭霸的凱莉根。任務跑完，刀鋒女王淡淡丟下一句 “I read you”。寫程式寫到一半被女王點名，荒謬又療癒，而且真的有效：等權限的 session，再也不會被我晾在背景十分鐘。</p>

<p>我之前談 SDD 時寫過：AI 時代的開發瓶頸，已經從「寫程式」移到「規格與判斷」。而開始多 session 平行開發之後，我看到第三個瓶頸正在浮現——注意力。</p>

<p>當開發模式從「人寫程式」變成「人調度多個 agent」，工程師會越來越像 RTS 玩家：拚的不是 APM，而是能不能在對的時間，把注意力切到對的戰線上。</p>

<p>不久之前，還沒有人覺得 Claude Code 需要音效；現在，「AI 跑完要通知我」正在變成理所當然。通知不是 nice-to-have，它是多工調度的基礎建設。</p>

<p>安裝一行搞定（macOS / Linux / WSL2 / Windows 都支援）：<code class="language-plaintext highlighter-rouge">brew install PeonPing/tap/peon-ping</code></p>

<p>GitHub：<a href="https://github.com/PeonPing/peon-ping">https://github.com/PeonPing/peon-ping</a></p>

<p>PCMag 報導：<a href="https://tech.yahoo.com/ai/claude/articles/inside-peon-ping-warcraft-iii-133000994.html">https://tech.yahoo.com/ai/claude/articles/inside-peon-ping-warcraft-iii-133000994.html</a></p>

<p>你的 Claude Code，現在是哪個角色在幫你盯？歡迎留言分享你的音效包。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[多 session 平行開發讓注意力成為新瓶頸。peon-ping 把 RTS 音效設計搬進 agentic coding，用遊戲角色語音幫你盯住每一條 AI 戰線。]]></summary></entry><entry><title type="html">Loop Engineering：你不再提示 AI，而是設計一個「提示 AI 的系統」</title><link href="https://swanky.github.io/technical/loop-engineering-ai-system/" rel="alternate" type="text/html" title="Loop Engineering：你不再提示 AI，而是設計一個「提示 AI 的系統」" /><published>2026-06-10T00:00:00+00:00</published><updated>2026-06-10T00:00:00+00:00</updated><id>https://swanky.github.io/technical/loop-engineering-ai-system</id><content type="html" xml:base="https://swanky.github.io/technical/loop-engineering-ai-system/"><![CDATA[<p>上週日（6/7），Google Chrome 團隊的工程主管 Addy Osmani 發表了一篇文章，幫 AI 協作開發的下一個階段定了名：<strong><a href="https://addyosmani.com/blog/loop-engineering/">Loop Engineering</a></strong>。</p>

<p>我認為這個概念，對正在導入 AI coding 的技術團隊特別重要。這篇先幫還沒跟上的朋友補一段歷史脈絡，再談我會怎麼把它跟 Spec-Driven Development 整合落地。</p>

<h2 id="前情提要ai-輔助開發的重點一直在變">前情提要：AI 輔助開發的重點，一直在變</h2>

<p><strong>2022 年底，Prompt Engineering。</strong> ChatGPT 問世，大家比的是怎麼把需求問清楚、指令寫精準。一句神 prompt 可以省你兩小時，但 AI 看不到你的程式碼，也看不到執行結果。</p>

<p><strong>2024 年，Context Engineering。</strong> 大家發現只會下 prompt 還不夠——AI 需要知道專案背景、架構限制、coding style、測試規範。RAG、rules 檔、CLAUDE.md 開始變成標配。</p>

<p><strong>2025 年，代理式開發。</strong> Claude Code、Cursor 這類 coding agent 不再只是回答問題，而是能讀 repo、改檔案、跑測試、看錯誤訊息、再修正。同年 vibe coding 一詞爆紅，也催生了反作用力——Spec-Driven Development 這類強調工程紀律的方法開始抬頭。</p>

<p><strong>2026 年，Loop Engineering。</strong> Osmani 的定義很精準：不再由人一直提示 agent，而是<strong>設計一個會提示 agent 的系統</strong>，讓它依照目標反覆迭代到完成。</p>

<h2 id="兩種模式的差別">兩種模式的差別</h2>

<p>過去的模式是：</p>

<p>人下指令 → AI 回答 → 人檢查 → 人再下指令 → AI 再修改</p>

<p>Loop Engineering 的模式則是：</p>

<p>讀取任務 → 對齊規格 → 拆解工作 → agent 實作 → 執行測試 → 驗證結果 → 記錄狀態 → 決定下一步</p>

<p>人不再站在旁邊一直餵 prompt，而是把「需求、規格、測試、驗證、回饋、記憶」設計成一條可重複運作的產線。AI 是工人，Loop 是產線，工程師還是廠長——不是吉祥物。</p>

<h2 id="真正的瓶頸已經不是ai-會不會寫-code">真正的瓶頸，已經不是「AI 會不會寫 code」</h2>

<p>而是團隊有沒有能力定義清楚：</p>

<p>什麼是正確需求？ 什麼是完成條件？ 什麼是可接受的測試？ 什麼風險不能自動化放行？ 什麼知識要沉澱成團隊規範？</p>

<p>以 Claude Code 來說，這些已經可以落地：</p>

<ul>
  <li>CLAUDE.md 放專案規範與架構原則</li>
  <li>Skills 封裝重複流程，例如「根據 OpenSpec 做 TDD」</li>
  <li>Subagents 拆分角色：規格審查、實作、測試驗證、安全審查</li>
  <li>Hooks 強制執行 lint、格式化、敏感檔案保護</li>
  <li>/goal 定義完成條件，讓 agent 持續做到條件成立</li>
  <li>/loop 定期巡檢 PR、CI、review comments</li>
  <li>GitHub Actions 把 AI review 放進既有開發流程</li>
</ul>

<h2 id="跟-sdd-是天作之合">跟 SDD 是天作之合</h2>

<p>如果團隊已經用 Example Mapping 釐清需求、用 OpenSpec 沉澱規格、再搭配 TDD，整條路其實就是一個 Spec-driven Loop：</p>

<p>Example Mapping → OpenSpec → 產生測試 → 實作 → CI 驗證 → 獨立驗證 → PR → 經驗回寫團隊規範</p>

<p>關鍵的指令差異：</p>

<p>❌「幫我做這個功能」</p>

<p>✅「根據 OpenSpec 的 acceptance criteria，先產生測試並確認先失敗，再實作到通過，最後由獨立的 verifier agent 檢查是否符合規格。」</p>

<p>還有一個容易被忽略的原則：<strong>maker 與 checker 必須分離</strong>。寫 code 的 agent 不該同時是唯一的評分者，因為它很容易替自己的答案找理由——這一點，跟人類工程師意外地像。</p>

<h2 id="但-loop-不是自動駕駛它反而更要求紀律">但 Loop 不是自動駕駛，它反而更要求紀律</h2>

<p>acceptance criteria 模糊 → AI 只會自動化地誤解需求 測試品質不好 → AI 只會自動化地通過爛測試 權限開太大 → AI 只會自動化地放大風險 沒有 review 機制 → AI 只會自動化地累積技術債</p>

<p>所以我把 Loop Engineering 理解成：</p>

<p><strong>不是用 AI 取代工程師，而是把工程師的判斷、規範、測試與審查能力，變成可以反覆運作的系統。</strong></p>

<p>未來技術團隊的差異，可能不只在於誰比較會用 AI，而在於誰能把 AI 放進一條<strong>可驗證、可追蹤、可治理</strong>的開發迴圈裡。</p>

<p>Prompt 讓 AI 回答。 Context 讓 AI 理解。 Test 讓 AI 被檢查。 Loop 讓整個工程流程開始轉動。</p>

<p>這或許就是 AI coding 從個人生產力工具，走向團隊工程能力的關鍵一步。</p>

<p>你的團隊現在走到哪一階？歡迎留言聊聊。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[Addy Osmani 為 AI 協作開發定名 Loop Engineering：不再由人提示 AI，而是設計一個提示 AI 的系統。本文補完從 Prompt、Context 到 Loop 的脈絡，並談如何與 Spec-Driven Development 整合落地。]]></summary></entry><entry><title type="html">AI 正在改寫軟體開發的瓶頸：從「誰會寫 code」到「誰能定義與驗證問題」</title><link href="https://swanky.github.io/technical/ai-define-verify-problems/" rel="alternate" type="text/html" title="AI 正在改寫軟體開發的瓶頸：從「誰會寫 code」到「誰能定義與驗證問題」" /><published>2026-06-06T00:00:00+00:00</published><updated>2026-06-06T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-define-verify-problems</id><content type="html" xml:base="https://swanky.github.io/technical/ai-define-verify-problems/"><![CDATA[<blockquote>
  <p>AI 讓開發變快，但決定團隊走多遠的，是「可被信任的速度」</p>
</blockquote>

<p>最近讀了 Anthropic Institute 的〈When AI builds itself〉。文章談的是一個值得每個技術團隊認真看待的趨勢：AI 已經開始加速 AI 自身的研發，而軟體開發的工作型態，也正在被重新改寫。</p>

<p>幾個數字很有份量。Anthropic 提到，截至 2026 年 5 月，合併進其程式庫的程式碼有超過八成由 Claude 撰寫；2026 年第二季，典型工程師每天 merge 的程式碼量，約為 2024 年的 8 倍。值得一提的是，他們也誠實標註了限制——用程式碼行數衡量生產力本就會高估實質貢獻，工程師的自評也容易偏高，而這些曲線未必是指數，也可能是會趨緩的 S 曲線。</p>

<p>但即使保守地讀，我認為真正的重點都不是「AI 能寫多少 code」，而是軟體開發的瓶頸，正在移動。</p>

<p>過去我們衡量工程能力，問的多半是「誰比較會寫 code、誰比較熟 framework、誰能把功能做出來」。但當 AI 已經能快速產生程式碼、修改檔案、執行測試、分析錯誤，甚至獨立完成數小時的工程任務，團隊真正稀缺的能力會逐漸轉移到上游：誰能定義出正確的問題、寫出清楚的規格、設計可驗證的測試，以及判斷 AI 的產出是否真的可靠。</p>

<p>Anthropic 在文中點出一個很關鍵的觀察：當 AI 大量產生程式碼，human code review 反而會變成新的瓶頸。這在計算機架構裡叫 Amdahl’s law——你把某一段流程加速到極致，瓶頸不會消失，只會搬家。它套在組織上同樣成立，也正好呼應我在實務上看到的現象：AI 讓「產出」變便宜，卻讓「判斷」變昂貴。</p>

<p>最近我帶團隊把這套邏輯落實成一條開發主線：從 Example Mapping 釐清需求與邊界規則，到 OpenSpec 定義行為與驗收條件，再交給 Claude Code 依測試逐步實作，最後經過 code review、CI 與資安檢查把關。過程中我體會最深的一點是：真正決定 AI 產出品質的，往往不是模型本身，而是上游的規格夠不夠清楚。舉個例子，光是一個鏈上轉帳功能，我們在動手寫任何程式碼之前，就先拆出了三十幾張 Example Mapping，把正常與異常情境、各種邊界條件一一攤開。當規格與範例夠扎實，AI 幾乎能穩定跑在正確的軌道上；而那些卡關的地方，事後回頭看，幾乎都是「規格的缺口」，而不是「程式的 bug」。</p>

<p>不過，把這套方法真正導入一整個團隊，又是另一回事。我認為，這本質上是一個「結構問題」，而不是「工具問題」——把工具與方法準備好，只是起點，並不代表它們就會被用起來。要讓一套新的開發方式在團隊裡真正生根，通常需要四件事同時到位：一是對「為什麼」的認同，人若不打從心裡認同規格、測試與設計的價值，再好的工具也只會閒置；二是一個跑得起來的回饋迴圈，環境、資料庫與測試要能在手邊實際運作，TDD 才有「紅轉綠」的回饋，環境一旦卡住，整套方法就無從啟動；三是時間與動機，當「學新方法」被擺成「趕進度」的對立面，學習永遠會墊底；四是管理層的明確支持，讓它成為團隊的共同方針，而不是「某個人的提議」。這四件事缺一不可，而工具往往只是其中最容易給、也最常被誤以為是全部的那一塊。</p>

<p>有意思的是，這些其實都不是新觀念。Kent Beck 談測試、Eric Evans 談領域裡的共通語言、Ousterhout 談模組設計，講的都是同一件事：把複雜度管理好。AI 並沒有讓這些基本功過時，反而把「忽略它們的代價」放大了——而且來得更快、更明顯。</p>

<p>所以我越來越相信，技術團隊接下來真正該投資的，不只是 AI 工具本身，而是兩層能力：一層是「AI 時代的工程治理」——需求規格化、測試先行、agent workflow、code review 自動化、資安檢查、可觀測性、rollback 與知識沉澱；另一層，是讓這些能力能在團隊裡真正長出來的「組織條件」——時間、動機、共識，以及管理層的承諾。前者決定 AI 能不能跑在正確的軌道上，後者決定團隊能不能真的跟上。</p>

<p>如果說過去的軟體開發像手工雕刻，工程師一刀一刀把系統刻出來；那未來的開發，更像在經營一座高度自動化的工廠。機器可以很快，但設計圖、品管線、煞車系統與安全閘門，仍然得由人來負責。</p>

<p>文章後半談得更遠——一旦 AI 真的能遞迴式地打造自己的下一代，控制、對齊與全球協調都會成為更核心的課題。那是更長期的問題，但它提醒我們：速度從來不是終點。</p>

<p>AI 會讓開發變快；但真正決定一個團隊能走多遠的，是我們能不能把「快」，變成「可被信任的快」。</p>

<p>也想聽聽你的經驗：在你的組織裡，擋在 AI 開發導入前面的，究竟是工具本身，還是那些工具以外的條件？</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[AI 讓寫 code 變便宜，卻讓判斷變昂貴。軟體開發的瓶頸正從「誰會寫 code」移到「誰能定義與驗證問題」——規格化、測試先行與工程治理，才是團隊真正稀缺的能力。]]></summary></entry><entry><title type="html">等 AI Agent 開始自己付錢，它們就會回頭找上 Web3</title><link href="https://swanky.github.io/technical/ai-agent-payments-web3/" rel="alternate" type="text/html" title="等 AI Agent 開始自己付錢，它們就會回頭找上 Web3" /><published>2026-05-31T00:00:00+00:00</published><updated>2026-05-31T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-agent-payments-web3</id><content type="html" xml:base="https://swanky.github.io/technical/ai-agent-payments-web3/"><![CDATA[<blockquote>
  <p>Web3 的人都在學 AI，AI 的人卻不學 Web3——這條單行道，撐不過 Agent 經濟。</p>
</blockquote>

<p>我認識的 Web3 朋友，幾乎全部都在學 AI。但我認識的 AI 研究者，沒幾個在學 Web3。</p>

<p>人才只往一個方向流動。而單向的人流，從來都是最誠實的訊號。</p>

<p>先把話說清楚：這不是 AI 圈看不起 Web3，也不是 Web3 沒價值。這背後其實是兩種技術「回報曲線」的差別。</p>

<p>AI 是工具層的革命。你不需要先相信一套新的經濟制度，不需要先搞懂錢包、私鑰、Gas、治理代幣、MEV 或監管風險。你今天打開 Claude Code、Codex，明天就寫得更快、查得更快、整理得更快。</p>

<p>這種「立即可見的生產力」，數字會說話。Stack Overflow 2025 開發者調查裡，84% 的受訪者已在使用或打算使用 AI 工具，專業開發者更有超過半數每天都在用。學界這邊，一份分析了近 13 萬個 GitHub 專案的研究發現，Claude Code、Cursor、Codex 這類 coding agent 的採用率已經來到 15.85% 到 22.60%——對一個才問世幾個月的技術，這個速度驚人，而且還在往上爬。</p>

<p>對 Web3 人來說，AI 幾乎是零成本的升級。寫智能合約、跑測試、整理研究、拆商業邏輯，突然多了一個副駕駛。學它，不需要改變任何信仰。</p>

<p>但反過來，Web3 對一個 AI 研究者「升級」了什麼？</p>

<p>它不會讓你的模型更準，不會讓訓練更便宜，不會讓推論更快，也不會讓你的論文更容易被接受。</p>

<p>因為 Web3 是制度層的革命。它的價值，要等到「信任、所有權、治理、資產流動」真正成為問題的那一刻，才會浮現。</p>

<p>工具層的革命人人都採用，因為它直接改善你今天的工作流程。制度層的革命走得慢，因為它要等場景、信任、利益分配、合規一起成熟，價值才看得見。</p>

<p>Web3 不是沒在前進。a16z 的 State of Crypto 2025 報告就指出，過去一年穩定幣的交易量達到 46 兆美元，扣掉雜訊後仍有 9 兆——逼近 Visa，直追整個美國銀行體系的清算網路。但對 AI 圈來說，這比較像「隔壁產業的基礎建設成熟了」，而不是「我今天非學不可」。</p>

<p>所以我要說的重點來了：</p>

<p><strong>這條單行道，是暫時的。</strong></p>

<p>因為真正會把 AI 和 Web3 接起來的，從來不是信仰，是必要性。而那個必要性，已經在發生了。</p>

<p>當 AI Agent 開始「自己付錢」的那一刻，故事就變了。一個 Agent 呼叫一次 API、買一份資料、付一次運算，金額是幾分錢。這種高頻、極小額、機器對機器的支付，傳統信用卡軌道做不來——光是手續費，就把它整個壓垮。</p>

<p>於是市場已經給出答案。Coinbase 和 Cloudflare 推的 x402 協議，讓 Agent 能用穩定幣在一次 HTTP 請求裡完成付款；Google 的 AP2 也明確支援穩定幣，一口氣拉進了 PayPal、Mastercard、American Express 等六十多家機構。根據 Keyrock《Who Pays the Agent?》報告，光是 AI Agent 之間，已經透過穩定幣結算了約 7,300 萬美元、1.76 億筆交易——其中超過七成的金額，低於信用卡手續費的下限。</p>

<p>換句話說，機器對機器的經濟正在被蓋起來，而它選的軌道，是加密軌道。不是因為意識形態，是因為別的東西做不到。</p>

<p>而這只是開始。當 Agent 開始替人管資產、簽交易、參與治理、產生商業決策，接踵而來的全是 Web3 最擅長回答的問題：</p>

<ul>
  <li>誰來驗證這個 Agent 做過什麼？</li>
  <li>誰來界定它的權限邊界？</li>
  <li>誰來保存一份不可竄改的行為紀錄？</li>
  <li>人、AI、組織、資產之間，要用什麼新制度來協調彼此的信任？</li>
</ul>

<p>到那一天，Web3 才不是「另一個投機市場」，而是 AI 時代的信任基礎設施。</p>

<p>所以，如果你也是 Web3 人，我的建議很直接：別只當 AI 的使用者。</p>

<p>去想清楚一件事——當 AI 把生產力推到極致之後，社會會冒出多少新的信任、所有權、責任歸屬、自動化治理問題？那些問題，正是你的主場。</p>

<p>淘金熱裡，最穩賺的從來不是淘金的人，是賣鏟子的人。與其追著 AI 的熱度跑，不如現在就把鏟子，擺在它的必經之路上。</p>

<p>AI 解決的是生產力問題，Web3 解決的是信任與協調問題。現在 AI 圈不學 Web3，不是因為它不重要，是因為時候還沒到。等 AI Agent 真正走進經濟活動的那一天，這條單行道會反轉。</p>

<p>而到時候吃到紅利的，是現在就站在路口的人。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[Web3 的人都在學 AI，AI 的人卻不學 Web3。但當 AI Agent 開始自己付錢，這條單行道就會反轉——加密軌道將成為機器經濟的必要基礎建設。]]></summary></entry><entry><title type="html">AI × 加密：去中心化算力網路，會是下一個風口嗎？</title><link href="https://swanky.github.io/technical/ai-decentralized-compute/" rel="alternate" type="text/html" title="AI × 加密：去中心化算力網路，會是下一個風口嗎？" /><published>2026-05-30T16:14:00+00:00</published><updated>2026-05-30T16:14:00+00:00</updated><id>https://swanky.github.io/technical/ai-decentralized-compute</id><content type="html" xml:base="https://swanky.github.io/technical/ai-decentralized-compute/"><![CDATA[<p>過去兩年，科技圈最熱的兩個詞——「<strong>AI</strong>」與「<strong>加密（Crypto）</strong>」——開始頻繁地出現在同一個句子裡。這不是行銷蹭熱度，而是因為它們之間有一個真實、互補的交集：<strong>AI 渴求海量算力，而加密最擅長「協調大量陌生人貢獻資源」。</strong></p>

<p>當這兩者相遇，就誕生了一個熱門賽道：<strong>去中心化算力網路（DCN, Decentralized Compute Network）</strong>。這是我「<a href="/education/crypto/web3-essentials/">Web3 入門精選</a>」系列裡，關於「未來」的一篇。</p>

<h3 id="一先看-ai-這股海嘯有多大">一、先看 AI 這股海嘯有多大</h3>

<p>要理解這個交集，先感受一下 AI 投資的狂熱程度。幾個數字（來自產業研究）很能說明問題：</p>

<ul>
  <li>自 2022 年底 ChatGPT 發布以來，<strong>AI 相關股票漲幅達 165%</strong>，而同期非 AI 股票僅漲 24%。</li>
  <li><strong>2025 年前三季的 AI 投資，比 2024 年全年總額還高出 62%。</strong></li>
  <li>2025 年第三季，AI 領域吸走了<strong>美國創投資金的 63%</strong>。</li>
</ul>

<p>換句話說，AI 不只是技術趨勢，更是當前資本市場最大的吸金黑洞。而所有 AI 的背後，都站著同一個需求——<strong>算力（compute）</strong>，具體說就是 GPU。</p>

<h3 id="二痛點算力又貴又集中">二、痛點：算力又貴又集中</h3>

<p>AI 的算力供給，目前高度集中在少數幾家雲端巨頭（AWS、Google Cloud、Azure）與晶片廠（Nvidia）手裡。這帶來幾個問題：</p>

<ul>
  <li><strong>貴</strong>：頂級 GPU 一卡難求，租用成本高昂，中小團隊與獨立開發者常常被價格擋在門外。</li>
  <li><strong>不透明</strong>：你租了雲端算力，但定價邏輯、資源分配對你來說是個黑箱。</li>
  <li><strong>集中風險</strong>：算力這種「AI 時代的石油」，掌握在極少數公司手裡，本身就是一種系統性風險。</li>
</ul>

<p>與此同時，世界上其實散落著<strong>大量閒置的 GPU</strong>——遊戲玩家的顯卡、小型資料中心的餘裕產能、甚至前幾年挖礦留下的設備。問題是：<strong>沒有一個好機制，能把這些分散的算力協調起來、媒合給需要的人。</strong></p>

<p>這個「協調陌生人貢獻資源」的難題，你是不是覺得有點眼熟？沒錯，這正是 <a href="/technical/depin-explained/">DePIN</a> 擅長的事——而 DCN，本質上就是 DePIN 在「運算」這個類別裡的應用。</p>

<h3 id="三解法用代幣激勵把算力眾包">三、解法：用代幣激勵，把算力眾包</h3>

<p>去中心化算力網路的運作邏輯是這樣的：</p>

<ol>
  <li><strong>供給端</strong>：擁有閒置 GPU 的人，把算力貢獻到網路裡，賺取代幣獎勵。</li>
  <li><strong>需求端</strong>：需要算力跑 AI 模型（尤其是「推理 / inference」）的開發者，用更低的成本、更透明的方式租到算力。</li>
  <li><strong>代幣經濟</strong>：用代幣把供需兩端綁在同一套激勵裡，網路愈大、媒合愈有效率、單位成本愈低——又是一個<a href="/technical/depin-explained/">三重飛輪</a>。</li>
</ol>

<p>這讓算力市場從「向巨頭租」變成「向全世界的閒置產能租」，理論上能壓低價格、提高韌性、打破壟斷。</p>

<h3 id="四兩個關鍵技術突破讓它從幻想變可行">四、兩個關鍵技術突破，讓它從幻想變可行</h3>

<p>去中心化算力的構想其實很早就有，但一直卡在兩個技術難題上。近期的進展，讓它從「美好幻想」逐漸變成「可行方案」：</p>

<p><strong>突破一：如何驗證「算力真的被正確執行」？</strong></p>

<p>把一個 AI 推理任務發給一個素不相識的陌生節點，你怎麼知道它<strong>真的算了、而且算對了</strong>，而不是隨便回傳一個假結果來騙獎勵？這個「<strong>驗證 AI 推理</strong>」的難題，過去是去中心化算力的最大障礙。近年密碼學與機制設計上的進展（例如各種證明與抽查機制）正在讓「可驗證的去中心化推理」逐步成真。</p>

<p><strong>突破二：模型架構讓推理成本下降</strong></p>

<p>同時，AI 模型本身也在演化。像 <strong>MoE（Mixture of Experts，混合專家）</strong> 與 <strong>SSM（State Space Models，狀態空間模型）</strong> 這類新架構，大幅降低了「推理」的運算成本。推理愈便宜、愈能被切分成小任務，就愈適合分散到去中心化網路上跑。</p>

<p>再加上<strong>開源 AI 模型</strong>的崛起——當高品質的模型權重可以被自由取得、不再被單一公司壟斷，「在哪裡跑這個模型」就變成一個開放的市場問題，這正好是去中心化算力的主場。</p>

<h3 id="五潑一盆冷水挑戰仍然真實">五、潑一盆冷水：挑戰仍然真實</h3>

<p>身為一個在這領域教學多年的人，我必須誠實提醒：<strong>熱度高，不代表沒有風險。</strong> 去中心化算力仍面臨幾個硬骨頭：</p>

<ul>
  <li><strong>延遲與可靠性</strong>：分散的節點在速度與穩定性上，目前還難以全面對抗集中式資料中心。</li>
  <li><strong>驗證成本</strong>：「可驗證推理」雖有進展，但驗證本身也要消耗資源，如何不讓成本反過來吃掉節省，是門藝術。</li>
  <li><strong>需求是否真實</strong>：這跟我在 <a href="/technical/defi-real-yield/">DeFi 真實收益</a> 與 DePIN 那兩篇反覆強調的判準一樣——<strong>剝掉代幣補貼後，真的有人願意付錢用這個算力嗎？</strong> 還是大家只是為了賺代幣而貢獻、為了挖礦而租用？</li>
</ul>

<p>判斷一個 AI × Crypto 項目是否健康，依然是那個老問題：<strong>它解決的是真實需求，還是只是在創造一個可以炒的代幣？</strong></p>

<h3 id="結語兩股大浪的交會處">結語：兩股大浪的交會處</h3>

<p>AI 與加密，是這個時代最大的兩股技術浪潮。它們的交會處——去中心化算力網路——之所以值得關注，不是因為「兩個熱詞加在一起更熱」，而是因為它們真的<strong>互補</strong>：AI 提供了一個萬億級的真實需求（算力），加密提供了一個前所未有的協調機制（代幣激勵）。</p>

<p>它會不會成為下一個風口？我的看法是：<strong>方向對，但路還長</strong>。值得持續觀察，但別被高 APY 和宏大敘事沖昏頭——回到需求的本質去判斷，永遠是 Web3 投資與佈局裡最不會錯的一課。</p>

<p>這也是我「Web3 入門精選」系列的最後一篇。想系統性地把 Web3 學一輪？歡迎從 <a href="/technical/web3-three-eras/">Web3 三時代</a> 讀起，或了解我的 <a href="/education/crypto/">Web3 企業內訓</a> 與<a href="/education/crypto/soochow/">大學區塊鏈課程</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[AI 需要海量算力，加密提供了協調算力的激勵機制——當兩者相遇，去中心化算力網路（DCN）成為熱門賽道。一文看懂 DCN 在解決什麼問題、技術突破與真實挑戰。AI × Crypto 入門。]]></summary></entry><entry><title type="html">預言機：鏈外資料如何安全地進到區塊鏈？</title><link href="https://swanky.github.io/technical/oracle-architecture-risks/" rel="alternate" type="text/html" title="預言機：鏈外資料如何安全地進到區塊鏈？" /><published>2026-05-30T16:13:00+00:00</published><updated>2026-05-30T16:13:00+00:00</updated><id>https://swanky.github.io/technical/oracle-architecture-risks</id><content type="html" xml:base="https://swanky.github.io/technical/oracle-architecture-risks/"><![CDATA[<p>智能合約有一個違反直覺的「先天缺陷」：<strong>它看不到區塊鏈以外的世界。</strong></p>

<p>它不知道今天台積電股價多少、不知道美元兌新台幣的匯率、不知道某場球賽誰贏了、甚至不知道現在幾點。對一個號稱要「重塑金融」的技術來說，這聽起來很荒謬——但這正是「<strong>預言機（Oracle）</strong>」要解決的問題。</p>

<p>這是我「<a href="/education/crypto/web3-essentials/">Web3 入門精選</a>」系列裡較進階、但非常關鍵的一篇。因為<strong>沒有預言機，就沒有 DeFi</strong>。</p>

<h3 id="一為什麼智能合約是個瞎子">一、為什麼智能合約是個「瞎子」</h3>

<p>先理解這個缺陷從哪來。區塊鏈為了讓全世界成千上萬的節點都能對「同一筆交易的結果」達成共識，它必須是<strong>確定性（deterministic）</strong>的——同樣的輸入，在任何一台電腦上跑，都必須得到完全一樣的結果。</p>

<p>可是「外部世界的資料」破壞了這個確定性。如果智能合約直接去問某個網站「現在 ETH 價格多少」，那不同節點在不同的毫秒去問、或問到不同的伺服器，會拿到不同的答案——共識就崩潰了。所以區塊鏈乾脆<strong>把自己封閉起來</strong>：合約只能讀取鏈上已經存在的資料，不能主動向外抓取。</p>

<p>這就造就了那個著名的論斷：<strong>智能合約大約 90% 的潛在用途（包含幾乎所有 DeFi）都需要與真實世界互動</strong>——而它偏偏做不到。預言機，就是來填這個鴻溝的橋。</p>

<h3 id="二預言機在做什麼">二、預言機在做什麼？</h3>

<p>預言機是一套機制，負責<strong>把鏈外的資料，可信地「餵」進鏈上的智能合約</strong>。它就像是智能合約的「眼睛」與「耳朵」。</p>

<p>一個典型的應用是 DeFi 借貸：假設你抵押價值 1 萬美元的 ETH，借出 5 千美元的穩定幣。當 ETH 價格下跌、你的抵押品價值逼近危險線時，協議必須「清算」你的部位。<strong>但協議要怎麼知道 ETH 現在跌到多少了？</strong> 答案就是預言機——它持續把外部交易所的 ETH 價格餵進合約，合約才能據此判斷該不該清算。</p>

<p>整個資料進鏈的流程，可以拆成幾個動作：<strong>聽</strong>（從外部來源取得資料）→ <strong>抽取與格式化</strong>（整理成合約看得懂的格式）→ <strong>驗證</strong>（確認資料可信）→ <strong>聚合運算</strong>（把多個來源的資料整合成一個值，例如取中位數）→ <strong>播送上鏈</strong>（寫進合約供使用）。這每一個環節，都是潛在的攻擊點。</p>

<h3 id="三預言機的五大風險">三、預言機的五大風險</h3>

<p>預言機被稱為「區塊鏈的阿基里斯腱」不是沒道理。它的風險可以歸納為五大類：</p>

<ol>
  <li><strong>驗證問題（Verification）</strong>：你怎麼知道餵進來的資料「本身」是對的？資料來源可能就是錯的或被污染的。</li>
  <li><strong>驗算問題（Validation）</strong>：就算來源對，傳輸與計算過程中會不會被動手腳？</li>
  <li><strong>擴展問題（Scalability）</strong>：頻繁地把資料寫上鏈，成本高昂、也有延遲，難以規模化。</li>
  <li><strong>可駭性（Hackability）</strong>：預言機本身成為攻擊面——如果攻擊者能操縱餵給合約的價格，就能騙過整個協議。</li>
  <li><strong>中心化問題（Centralization）</strong>：這是最致命的一個。<strong>如果一個號稱去中心化的 DeFi 協議，背後卻只靠「單一」預言機餵價，那它根本不是去中心化的</strong>——這個預言機就是整個系統的單點故障與單點信任。</li>
</ol>

<h3 id="四真實的代價價格操縱攻擊">四、真實的代價：價格操縱攻擊</h3>

<p>第四與第五點不是理論。DeFi 歷史上發生過無數次「<strong>預言機操縱攻擊（oracle manipulation）</strong>」，手法的核心都一樣：</p>

<p>攻擊者鎖定一個「<strong>只靠單一去中心化交易所即時價格</strong>」當預言機的協議，然後用一筆巨額交易（常搭配「閃電貸」借來的大筆資金）在那個交易所裡瞬間把某個幣的價格打到極高或極低，<strong>製造出一個短暫的假價格</strong>。協議的預言機天真地讀到這個假價格，於是攻擊者就能用扭曲的價格借走遠超應得的資產，或觸發不該發生的清算——得手後在同一筆交易裡全身而退。許多動輒數百萬、上千萬美元的 DeFi 被駭事件，根源都是這個。</p>

<h3 id="五業界怎麼防去中心化預言機網路">五、業界怎麼防：去中心化預言機網路</h3>

<p>針對這些風險，業界發展出的主流解法是「<strong>去中心化預言機網路（Decentralized Oracle Network）</strong>」，例如 Chainlink 這類服務。它的防禦思路有三個重點：</p>

<ul>
  <li><strong>多來源</strong>：不依賴單一交易所，而是從許多獨立的資料源取價，再聚合（例如取中位數），讓單一來源被操縱也無法左右最終結果。</li>
  <li><strong>多節點</strong>：由許多獨立的預言機節點各自回報、彼此交叉驗證，避免單點故障與單點作惡。</li>
  <li><strong>抗操縱的取價方式</strong>：例如採用「時間加權平均價格（TWAP）」而非瞬時價格，讓那種「一筆巨額交易製造的瞬間假價」難以得逞。</li>
</ul>

<p>一句話總結業界的共識：<strong>預言機本身，也必須是去中心化的</strong>。否則一個建在中心化預言機上的「去中心化金融」，只是把信任問題從台前藏到了幕後。</p>

<h3 id="結語橋決定了城市的安全">結語：橋，決定了城市的安全</h3>

<p>預言機是一個容易被新手忽略、卻決定整個 DeFi 生態安危的基礎建設。它解決了「智能合約看不見外面世界」這個根本缺陷，讓借貸、衍生品、<a href="/technical/rwa-tokenization-overview/">穩定幣</a>、保險等複雜應用成為可能。</p>

<p>但它也提醒我們一件事：<strong>在 Web3 裡，連接「鏈上」與「鏈下」的每一座橋，都是信任最脆弱的地方</strong>。下次你評估一個 DeFi 協議時，除了看它的收益（這點我在 <a href="/technical/defi-real-yield/">DeFi 真實收益</a> 那篇談過），別忘了問一句：<strong>「它的價格，是誰餵的？可靠嗎？」</strong></p>

<p>想更深入理解 Web3 的技術基礎？歡迎接著讀我的 <a href="/education/crypto/web3-essentials/">Web3 入門精選</a> 系列，或了解我的 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[智能合約看不到區塊鏈以外的世界，預言機（Oracle）就是它的眼睛。一文看懂預言機在做什麼、鏈外資料進鏈的流程，以及預言機的五大風險與真實攻擊案例。DeFi 基礎建設必懂。]]></summary></entry><entry><title type="html">NFT 怎麼存在區塊鏈上？從 ERC-721 到 IPFS 的技術堆疊</title><link href="https://swanky.github.io/technical/nft-token-standards/" rel="alternate" type="text/html" title="NFT 怎麼存在區塊鏈上？從 ERC-721 到 IPFS 的技術堆疊" /><published>2026-05-30T16:12:00+00:00</published><updated>2026-05-30T16:12:00+00:00</updated><id>https://swanky.github.io/technical/nft-token-standards</id><content type="html" xml:base="https://swanky.github.io/technical/nft-token-standards/"><![CDATA[<p>「我買了一張 NFT，那張圖到底存在哪裡？是存在區塊鏈裡嗎？」</p>

<p>這是我在課堂上最愛問學生、也最多人答錯的一題。答案會顛覆很多人的直覺——<strong>你買的那張圖，幾乎可以肯定不在區塊鏈上</strong>。</p>

<p>要搞懂這件事，得拆開 NFT 的「技術堆疊」。這是我「<a href="/education/crypto/web3-essentials/">Web3 入門精選</a>」系列裡，最適合搞清楚「NFT 到底是什麼」的一篇。</p>

<h3 id="一先分清楚三種代幣標準">一、先分清楚三種代幣標準</h3>

<p>談 NFT 之前，要先認識以太坊上三種最重要的「代幣標準（Token Standard）」。標準就像規格書，規定了一種代幣該有哪些功能、別人該怎麼跟它互動。</p>

<table>
  <thead>
    <tr>
      <th>標準</th>
      <th>中文</th>
      <th>性質</th>
      <th>典型用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>ERC-20</strong></td>
      <td>同質化代幣（FT）</td>
      <td>每一顆都一樣，可互換</td>
      <td>加密貨幣、治理代幣、穩定幣</td>
    </tr>
    <tr>
      <td><strong>ERC-721</strong></td>
      <td>非同質化代幣（NFT）</td>
      <td>每一顆都獨一無二</td>
      <td>數位藝術、頭像、收藏品</td>
    </tr>
    <tr>
      <td><strong>ERC-1155</strong></td>
      <td>半同質化代幣</td>
      <td>同一合約可同時管理 FT 與 NFT</td>
      <td>遊戲道具、混合型資產</td>
    </tr>
  </tbody>
</table>

<p>理解它們的關鍵在「同質化」三個字：</p>

<ul>
  <li><strong>ERC-20 是同質化的</strong>——你的 1 顆 USDC 跟我的 1 顆 USDC 完全一樣，可以隨意互換，就像鈔票。</li>
  <li><strong>ERC-721 是非同質化的</strong>——每一顆代幣都有獨一無二的編號（token ID），彼此不能互換，就像每張畫、每張房契都是獨立的。這就是 NFT（Non-Fungible Token）的「Non-Fungible」。</li>
  <li><strong>ERC-1155 是「半同質化」</strong>——它聰明地讓一份合約能同時管理「可堆疊的同質化道具」（例如遊戲裡的 1000 把鐵劍）與「獨一無二的稀有物品」（例如一把傳說武器），對遊戲與大型生態特別實用。</li>
</ul>

<h3 id="二nft-的技術堆疊圖片其實在鏈外">二、NFT 的技術堆疊：圖片其實在鏈外</h3>

<p>現在回到開頭的問題。一個 NFT 的完整技術堆疊，是這樣一層層串起來的：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>智能合約（ERC-721）
   └── tokenURI（一個網址）
          └── metadata.json（描述檔）
                 └── IPFS 上的圖片 / 影片
</code></pre></div></div>

<p>讓我白話拆解：</p>

<ol>
  <li><strong>鏈上的智能合約</strong>只記錄「最關鍵、最不能造假」的事：<strong>這個 token ID 屬於哪個錢包地址</strong>。這就是「所有權」，是 NFT 真正寫在區塊鏈上、永不可竄改的部分。</li>
  <li>合約裡有一個函式叫 <strong><code class="language-plaintext highlighter-rouge">tokenURI</code></strong>，它回傳的不是圖片，而是<strong>一個網址</strong>——指向一份描述檔。</li>
  <li>這份 <strong><code class="language-plaintext highlighter-rouge">metadata.json</code></strong> 描述檔，記載了這個 NFT 的名稱、屬性、以及最重要的——<strong>圖片的真正存放位置</strong>。</li>
  <li>而那張圖片，通常存放在 <strong>IPFS（InterPlanetary File System，星際檔案系統）</strong>——一個去中心化的檔案儲存網路。</li>
</ol>

<p>所以結論是：<strong>鏈上存的是「所有權證明」，圖片本身存在鏈外（IPFS）</strong>。為什麼要這樣設計？因為區塊鏈儲存空間極其昂貴，把幾 MB 的高解析圖片塞進鏈上是天價且不切實際的。</p>

<h3 id="三那-ipfs-是什麼為什麼不直接放普通伺服器">三、那 IPFS 是什麼？為什麼不直接放普通伺服器？</h3>

<p>你可能會問：「圖片放鏈外，那跟存在某公司的伺服器有什麼不同？萬一公司倒了圖不就沒了？」</p>

<p>問得好。這正是 <strong>IPFS</strong> 要解決的問題。傳統網址（HTTP）是「<strong>用位置找檔案</strong>」——你連到某台伺服器的某個路徑，伺服器一關，檔案就消失。IPFS 則是「<strong>用內容找檔案</strong>」：它根據檔案的內容算出一個獨一無二的指紋（稱為 CID，內容識別碼），只要全世界任何一個節點還留著這份內容，你就能透過這個指紋把它找回來，<strong>不依賴任何單一公司的伺服器</strong>。</p>

<p>這帶來一個額外的好處：<strong>防竄改</strong>。因為指紋是由內容算出來的，只要圖片被改動一個像素，指紋就會完全不同。所以你的 NFT 描述檔裡記的那個 IPFS 指紋，本身就保證了「你看到的圖，就是當初鑄造時的那張圖」。（不過實務上要真正永久保存，仍需有人持續「釘住（pin）」這份檔案，這是 NFT 長期保存的一個現實課題。）</p>

<h3 id="四從-cryptokitties-到品牌大舉進場">四、從 CryptoKitties 到品牌大舉進場</h3>

<p>理解了技術，再看一眼 NFT 的發展里程碑，會更有畫面：</p>

<ul>
  <li><strong>2017　CryptoKitties</strong>：第一個引爆主流關注的 NFT，靠著「養貓、配種」的玩法一度塞爆以太坊。</li>
  <li><strong>CryptoPunks</strong>：一萬個像素頭像，後來成為 NFT 收藏的藍籌標竿。</li>
  <li><strong>2021　Beeple</strong>：數位藝術家的作品在佳士得（Christie’s）以 <strong>6,930 萬美元</strong>成交，把 NFT 推上全球新聞版面。</li>
  <li><strong>BAYC（無聊猿）</strong>：不只是頭像，而是發展成一整個生態系與社群品牌。</li>
</ul>

<p>更值得注意的是<strong>傳統品牌的大舉進場</strong>。Nike（透過收購 RTFKT）的 NFT 相關營收一度超過 <strong>1.86 億美元</strong>，Dolce &amp; Gabbana、Gucci、Adidas、Tiffany 也紛紛投入。品牌看上的，是 NFT 提供的兩樣東西：<strong>可驗證的稀缺性</strong>，以及<strong>與鐵粉的直接連結</strong>。</p>

<h3 id="五被低估的設計創作者版稅">五、被低估的設計：創作者版稅</h3>

<p>最後談一個我認為 NFT 最有意思、卻最常被忽略的設計——<strong>創作者版稅（Royalty）</strong>。</p>

<p>在傳統世界，一位畫家把畫賣出去之後，這幅畫後續在拍賣會上轉手再多次、漲再多倍，原作者都拿不到一毛錢。但 NFT 可以把「<strong>每次二級市場轉售時，自動抽 X%（常見 10%）回饋給原創作者</strong>」這個規則寫進智能合約裡。</p>

<p>這在概念上是革命性的：<strong>創作者第一次能夠分享到自己作品「長期增值」的果實</strong>，而不只是一次性的售出收入。（必須誠實補充：版稅的「強制執行」在實務上一直有爭議，部分交易市場為了競爭而選擇不強制收取——這也是 NFT 生態仍在演化中的議題。）</p>

<h3 id="結語所有權才是重點">結語：所有權，才是重點</h3>

<p>繞了一圈，我們回到 NFT 的本質。剝掉那些天價拍賣與炒作的喧囂，NFT 真正的技術貢獻只有一件事——<strong>它讓「數位物品的所有權」第一次能被清楚、公開、不可竄改地記錄下來</strong>。圖片可以被無限複製，但「誰擁有那個鏈上唯一的所有權憑證」是無法複製的。</p>

<p>這恰好呼應了我在 <a href="/technical/web3-three-eras/">Web3 三時代</a> 裡談的核心——<strong>Web3 的靈魂是「擁有」</strong>。而 NFT，就是「擁有」這件事在數位世界裡最具體的一種長相。</p>

<p>想更系統地理解 Web3？歡迎接著讀我的 <a href="/education/crypto/web3-essentials/">Web3 入門精選</a> 系列，或了解我的 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[你買的 NFT 到底「存」在哪裡？一文看懂 NFT 的技術堆疊：ERC-721、ERC-1155 代幣標準的差別、tokenURI 與 IPFS 如何運作，以及為什麼圖片其實不在鏈上。NFT 技術入門。]]></summary></entry><entry><title type="html">DeFi 的真實收益 vs 代幣通膨陷阱：那些「年化 100%」是真的嗎？</title><link href="https://swanky.github.io/technical/defi-real-yield/" rel="alternate" type="text/html" title="DeFi 的真實收益 vs 代幣通膨陷阱：那些「年化 100%」是真的嗎？" /><published>2026-05-30T16:11:00+00:00</published><updated>2026-05-30T16:11:00+00:00</updated><id>https://swanky.github.io/technical/defi-real-yield</id><content type="html" xml:base="https://swanky.github.io/technical/defi-real-yield/"><![CDATA[<p>每隔一陣子，就會有人拿著手機問我：「這個 DeFi 協議寫年化 120%，是真的嗎？我該不該存？」</p>

<p>這是一個好問題，而答案藏在一個大多數人從來沒問過的關鍵裡：<strong>這個收益，到底從哪裡來？</strong></p>

<p>學會回答這個問題，你就掌握了在 DeFi 世界裡保命的第一課。這是我「<a href="/education/crypto/web3-essentials/">Web3 入門精選</a>」系列裡，我認為對散戶最實用的一篇。</p>

<h3 id="一收益必須有來源天下沒有白吃的午餐">一、收益必須有來源——天下沒有白吃的午餐</h3>

<p>先講一個最樸素的道理：<strong>任何收益，都必須有一個真實的來源</strong>。在傳統金融裡，這個來源你很熟悉——銀行付你利息，是因為它把你的錢借出去收了更高的利息，中間的差價分你一點；債券付你票息，是因為發行人拿你的錢去做了能產生現金流的事。</p>

<p>收益 = 別人為了使用資金而付出的成本。這在 DeFi 裡也一樣成立。問題是，DeFi 的收益有<strong>兩種截然不同的來源</strong>，而它們的「可持續性」天差地別。</p>

<h3 id="二兩種收益真實收益-vs-代幣通膨收益">二、兩種收益：真實收益 vs 代幣通膨收益</h3>

<p><strong>第一種：真實收益（Real Yield / Exogenous Yield）</strong></p>

<p>這種收益來自<strong>協議外部真實產生的現金流</strong>——也就是真的有人為了某個服務付了費。常見的來源有：</p>

<ul>
  <li><strong>借貸利息</strong>：有人在借貸協議裡借走資金，付出利息，這些利息分給提供資金的你；</li>
  <li><strong>交易手續費</strong>：有人在去中心化交易所換幣、或在永續合約市場交易，付出的手續費分給提供流動性的你；</li>
  <li><strong>套利與資金費率</strong>：市場上真實存在的價差與資金需求。</li>
</ul>

<p>這種收益的特徵是：<strong>錢是「從外面進來的」</strong>，是別人真金白銀付的服務費。它通常不會高得離譜——多落在 <strong>5% 到 15%</strong> 的合理區間，但它<strong>可持續</strong>。</p>

<p><strong>第二種：代幣通膨收益（Token Inflation Yield）</strong></p>

<p>這種收益則完全是另一回事。協議為了快速吸引資金，會<strong>狂印自家的代幣當獎勵發給你</strong>。它表面上 APY 可以衝到 100%、500%、甚至四位數，但這些獎勵不是來自任何真實現金流，而是<strong>憑空增發的新代幣</strong>。</p>

<p>問題就出在這裡：當大家都在領這些新印的代幣、然後拿去市場上賣掉換成穩定幣或主流幣，<strong>代幣價格就會被持續的賣壓壓垮</strong>。於是你看到的劇本永遠是——前期 APY 高得嚇人、資金蜂擁而入、代幣價格短暫飆升，然後代幣崩盤、實際收益（換算成美元）瞬間歸零，最後進場的人接下最後一棒。</p>

<p><strong>這就是高 APY 背後的「龐氏結構」</strong>：你以為在賺利息，其實是在參與一場「代幣增發 → 拋售 → 崩盤」的擊鼓傳花。</p>

<h3 id="三一張表看穿收益的本質">三、一張表，看穿收益的本質</h3>

<table>
  <thead>
    <tr>
      <th>維度</th>
      <th>真實收益</th>
      <th>代幣通膨收益</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>錢從哪來</td>
      <td>外部真實現金流（手續費、利息）</td>
      <td>協議憑空增發的代幣</td>
    </tr>
    <tr>
      <td>典型 APY</td>
      <td>5%–15%</td>
      <td>50%–數千 %</td>
    </tr>
    <tr>
      <td>可持續性</td>
      <td>高</td>
      <td>低（注定崩盤）</td>
    </tr>
    <tr>
      <td>你在賺誰的錢</td>
      <td>使用服務的人</td>
      <td>後進場的人</td>
    </tr>
  </tbody>
</table>

<p>判斷一個 DeFi 收益是否健康，你只需要反覆問那一句話：<strong>「如果協議停止增發代幣，這個收益還剩多少？」</strong> 剩很多 → 真實收益；歸零 → 代幣通膨陷阱。</p>

<h3 id="四2025-年的轉折defi-的真實收益化">四、2025 年的轉折：DeFi 的「真實收益化」</h3>

<p>值得高興的是，整個 DeFi 產業正在經歷一場成熟化的轉變。</p>

<p>2021 年那場「DeFi Summer」的狂熱，大量收益其實是代幣通膨撐起來的，崩盤後一地雞毛。但到了 2025 年，市場的氣氛變了——<strong>機構資金進場，而機構要的是「可持續、可解釋」的收益來源</strong>。它們不會為了一個來路不明的高 APY 把錢投進去，它們要知道這筆錢「賺的是誰的、賺的是什麼」。</p>

<p>於是市場出現一個明顯趨勢：<strong>計息穩定幣（yield-bearing stablecoin）取代了被動穩定幣</strong>，成為 DeFi 的核心抵押品。這類穩定幣的收益往往來自<a href="/technical/rwa-bond-tokenization/">現實世界資產（RWA）</a>——例如把資金投入代幣化的短期國債，賺取真實的票息。這正是「真實收益」邏輯的勝利。配合宏觀的降息週期，有人說「DeFi Summer 2.0」的條件正在形成，<strong>但這一次，底下踩的是更堅實的地基。</strong></p>

<h3 id="結語先問來源再談收益">結語：先問來源，再談收益</h3>

<p>回到那位拿著手機問我「年化 120% 是不是真的」的朋友。我的回答永遠是同一句：</p>

<blockquote>
  <p>「<strong>先別問利率多少，先問這個收益從哪裡來。</strong>」</p>
</blockquote>

<p>如果對方答得出一個真實的現金流來源（手續費、借貸利息、國債票息），那這個收益至少站得住腳；如果答案含糊、或一切都建立在「代幣會一直漲」的假設上，那你看到的多半不是收益，而是陷阱。</p>

<p>這套「追問收益來源」的思維，不只適用於 DeFi，也適用於我在 <a href="/technical/depin-explained/">DePIN</a> 那篇談的「剝掉補貼後還剩什麼」。<strong>在 Web3 裡，能保護你的不是貪婪的相反——謹慎，而是一個簡單的問題：錢從哪來。</strong></p>

<p>想建立更完整的 Web3 風險意識？歡迎接著讀我的 <a href="/education/crypto/web3-essentials/">Web3 入門精選</a> 系列，或了解我的 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[DeFi 動輒「年化 100%」的收益是真的嗎？一文教你分辨「真實收益」與「代幣通膨收益」的差別，看懂收益的真正來源，避開高 APY 背後的龐氏陷阱。DeFi 風險教育必讀。]]></summary></entry><entry><title type="html">DePIN 是什麼？用加密激勵蓋出真實世界的基礎設施</title><link href="https://swanky.github.io/technical/depin-explained/" rel="alternate" type="text/html" title="DePIN 是什麼？用加密激勵蓋出真實世界的基礎設施" /><published>2026-05-30T16:10:00+00:00</published><updated>2026-05-30T16:10:00+00:00</updated><id>https://swanky.github.io/technical/depin-explained</id><content type="html" xml:base="https://swanky.github.io/technical/depin-explained/"><![CDATA[<p>在 Web3 一堆抽象難懂的概念裡，<strong>DePIN</strong> 大概是最「接地氣」的一個——因為它連接的不是虛擬世界，而是你看得見、摸得到的真實基礎設施：無線網路、伺服器、感測器、充電樁。</p>

<p>這是我「<a href="/education/crypto/web3-essentials/">Web3 入門精選</a>」系列的一篇。如果你覺得加密貨幣總是飄在空中，那 DePIN 會是讓你「有感」的一個切入點。</p>

<h3 id="一depin-是什麼">一、DePIN 是什麼？</h3>

<p><strong>DePIN</strong> 是 <strong>Decentralized Physical Infrastructure Networks</strong>（去中心化實體基礎設施網路）的縮寫。它的核心定義其實只有一句話：</p>

<blockquote>
  <p>用加密激勵（crypto-incentives），來協調真實世界基礎設施的「建設」與「營運」。</p>
</blockquote>

<p>換個方式說：傳統上，要蓋一張覆蓋全國的無線網路、或建一個龐大的雲端運算中心，需要一家巨型公司投入天文數字的資本。DePIN 反其道而行——它<strong>用代幣作為獎勵，動員成千上萬的普通人，各自貢獻一小塊硬體</strong>（一台路由器、一張顯卡、一個感測器），共同拼湊出一張原本只有大公司才建得起的基礎設施網路。</p>

<p>舉個最經典的例子：<strong>Helium</strong>。它想建一張覆蓋廣泛的無線網路，但它不自己架基地台，而是讓一般人在家裡或店裡插上一個小型熱點裝置，幫忙提供網路覆蓋，作為回報，這些人會獲得代幣獎勵。<strong>人人都是基礎設施的一塊磚</strong>——這就是 DePIN 的精神。</p>

<h3 id="二depin-的六大類別">二、DePIN 的六大類別</h3>

<p>DePIN 不是單一賽道，而是一個涵蓋多種基礎設施的大家族。目前大致分為六大類別：</p>

<table>
  <thead>
    <tr>
      <th>類別</th>
      <th>在做什麼</th>
      <th>代表場景</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>運算（Compute）</strong></td>
      <td>共享 GPU/CPU 算力</td>
      <td>去中心化的雲端與 <a href="/technical/ai-decentralized-compute/">AI 算力</a></td>
    </tr>
    <tr>
      <td><strong>無線（Wireless）</strong></td>
      <td>共享網路覆蓋</td>
      <td>Helium 式的去中心化電信</td>
    </tr>
    <tr>
      <td><strong>感測器（Sensor）</strong></td>
      <td>收集真實世界數據</td>
      <td>天氣、地圖、車流</td>
    </tr>
    <tr>
      <td><strong>身份（Identity）</strong></td>
      <td>去中心化的身分與驗證</td>
      <td>數位身分網路</td>
    </tr>
    <tr>
      <td><strong>能源（Energy）</strong></td>
      <td>分散式電網與儲能</td>
      <td>家戶太陽能、虛擬電廠</td>
    </tr>
    <tr>
      <td><strong>物流（Logistics）</strong></td>
      <td>去中心化的物流協調</td>
      <td>配送、倉儲網路</td>
    </tr>
  </tbody>
</table>

<p>其中，<strong>運算</strong>與<strong>無線</strong>是目前最成熟、市值最大的兩塊。根據 2024 年的產業統計，全球已有約 <strong>350 個 DePIN 代幣、總市值約 500 億美元</strong>，其中光是運算類就佔了約 400 億美元。</p>

<h3 id="三三重飛輪depin-為什麼能滾起來">三、三重飛輪：DePIN 為什麼能滾起來</h3>

<p>DePIN 真正迷人的地方，在於它的成長邏輯——一個由三股力量疊加而成的「<strong>三重飛輪（Triple Flywheel）</strong>」：</p>

<ol>
  <li><strong>基礎設施的規模經濟</strong>：愈多人貢獻硬體，網路覆蓋愈廣、服務愈好、單位成本愈低。</li>
  <li><strong>網路效應</strong>：服務愈好，使用者愈多；使用者愈多，又吸引更多人來貢獻硬體賺取獎勵。</li>
  <li><strong>代幣流動性的護城河</strong>：代幣的價值與網路的成長綁定，形成一道難以被後進者複製的經濟護城河。</li>
</ol>

<p>這三個輪子彼此咬合、互相加速：<strong>供給端（貢獻硬體的人）與需求端（使用服務的人）被同一套代幣經濟同時點燃</strong>。這正是傳統基礎設施公司做不到的——它們得先燒掉巨額資本把網路建起來，才能開始服務客戶；而 DePIN 讓「建設」與「使用」從第一天起就同步成長。</p>

<h3 id="四為什麼說-depin-被低估">四、為什麼說 DePIN 被低估？</h3>

<p>這裡有一個讓我印象深刻的數據：DePIN 目前的市值（約 500 億美元），相對於它所瞄準的終端市場（雲端運算、電信、能源等加起來超過 <strong>1 兆美元</strong>），佔比還<strong>不到 0.1%</strong>。</p>

<p>換句話說，如果 DePIN 真的能在這些萬億級的傳統市場裡啃下哪怕一小塊，它的成長空間是<strong>百倍級</strong>的。這也是為什麼許多研究機構把 DePIN 列為「加密與真實世界交集中，最具長期潛力」的賽道之一。</p>

<p>當然，潛力大不等於沒有風險。DePIN 同樣面臨硬體品質參差、需求是否真實存在（會不會只是「為了賺代幣而貢獻」的虛假繁榮）、以及監管不確定性等挑戰。判斷一個 DePIN 項目是否健康，我的標準很簡單：<strong>剝掉代幣補貼後，它提供的服務還有沒有人真的願意付錢用？</strong> 這跟我在 <a href="/technical/defi-real-yield/">DeFi 真實收益</a> 那篇談的判斷邏輯，其實是同一套。</p>

<h3 id="結語把真實世界接上鏈">結語：把真實世界接上鏈</h3>

<p>DePIN 之所以重要，是因為它示範了區塊鏈最務實的一種用法——<strong>不是炒作虛擬代幣，而是用代幣激勵去解決「協調大量陌生人共建基礎設施」這個自古以來的難題</strong>。</p>

<p>它和 <a href="/technical/rwa-tokenization-overview/">RWA（現實世界資產代幣化）</a> 是一體兩面：RWA 把真實「資產」搬上鏈，DePIN 把真實「基礎設施」接上鏈。兩者都在做同一件事——<strong>讓區塊鏈走出加密圈，真正觸碰實體世界</strong>。</p>

<p>想更系統地理解 Web3 的各個賽道？歡迎接著讀我的 <a href="/education/crypto/web3-essentials/">Web3 入門精選</a> 系列，或了解我的 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[DePIN（去中心化實體基礎設施網路）是 Web3 最被低估的賽道之一。一文看懂 DePIN 的定義、六大類別、三重飛輪成長邏輯，以及為什麼它被視為加密與真實世界最有感的交集。]]></summary></entry><entry><title type="html">Web3 三時代：從「唯讀」到「讀寫」，再到「擁有」</title><link href="https://swanky.github.io/technical/web3-three-eras/" rel="alternate" type="text/html" title="Web3 三時代：從「唯讀」到「讀寫」，再到「擁有」" /><published>2026-05-30T16:09:00+00:00</published><updated>2026-05-30T16:09:00+00:00</updated><id>https://swanky.github.io/technical/web3-three-eras</id><content type="html" xml:base="https://swanky.github.io/technical/web3-three-eras/"><![CDATA[<p>我在大學兼課與企業內訓講 Web3 已經第八年，最常被問的第一個問題永遠是：「<strong>Web3 到底是什麼？</strong>」</p>

<p>這個問題之所以難回答，是因為大部分人一上來就被「區塊鏈」、「去中心化」、「加密貨幣」這些詞淹沒。但其實有一個更簡單、也更本質的切入點——<strong>把網路的歷史，分成三個時代來看</strong>。理解了這三個時代，你就抓住了 Web3 的靈魂。</p>

<p>這是我「Web3 入門精選」系列的第一篇。我們從頭講起。</p>

<h3 id="一web1唯讀的時代19902005">一、Web1：唯讀的時代（1990–2005）</h3>

<p>網際網路的第一個時代，是「<strong>唯讀（Read）</strong>」的時代。</p>

<p>那時候的網站，本質上是一本本放在網路上的「電子書」。你打開一個網頁，可以<strong>讀</strong>裡面的內容——新聞、企業介紹、個人首頁——但你幾乎不能做任何事。沒有留言、沒有按讚、沒有上傳。資訊的流動是單向的：少數人製作內容，多數人被動閱讀。</p>

<p>Web1 的歷史功績是：<strong>它降低了「資訊獲取」的門檻</strong>。在它之前，知識被鎖在圖書館、報社、電視台手裡；在它之後，任何能上網的人都能讀到全世界的資訊。用一句話總結：<strong>協定網路，把「資訊」分享給了每一個人。</strong></p>

<h3 id="二web2讀寫的時代20062020">二、Web2：讀寫的時代（2006–2020）</h3>

<p>接著，網路進入了「<strong>讀寫（Read + Write）</strong>」的時代，也就是我們最熟悉的這二十年。</p>

<p>部落格、YouTube、Facebook、Instagram、抖音——這些平台的共同點是：<strong>你不只能讀，還能寫</strong>。每個人都能發文、上傳影片、留言互動。內容的生產權力，從少數菁英手中下放到了所有人。這是一場巨大的解放，催生了「網紅」、「自媒體」、「創作者經濟」等全新的職業與產業。</p>

<p>Web2 的歷史功績是：<strong>它降低了「發表」的門檻</strong>。用一句話總結：<strong>企業網路，把「發表的權力」分享給了每一個人。</strong></p>

<p>但 Web2 有一個深層的問題，而這個問題正是 Web3 想解決的——<strong>你寫的東西，並不真正屬於你</strong>。</p>

<p>你在某平台上累積了百萬粉絲，但平台一旦封你的帳號，這些粉絲瞬間歸零；你上傳的影片、發表的貼文，所有權其實掌握在平台手裡；你創造的價值（流量、注意力、資料），絕大部分被平台拿走。你以為你是主人，其實你只是租客。<strong>在 Web2，你能「讀」、能「寫」，卻不能「擁有」。</strong></p>

<h3 id="三web3擁有的時代2021至今">三、Web3：擁有的時代（2021–至今）</h3>

<p>於是，網路演進到了第三個時代：「<strong>讀寫擁有（Read + Write + Own）</strong>」。</p>

<p>Web3 在「讀」和「寫」之上，加入了關鍵的第三件事——<strong>所有權（Ownership）</strong>。靠著區塊鏈這個「沒有人能單方面竄改的共享帳本」，你在數位世界裡第一次能夠真正「擁有」一樣東西：</p>

<ul>
  <li>你錢包裡的加密貨幣，沒有任何公司能憑空沒收；</li>
  <li>你持有的 <a href="/technical/nft-token-standards/">NFT</a>，所有權記錄在鏈上，不依賴任何平台的伺服器；</li>
  <li>你在某個協議裡的身分與信譽，可以帶著走，不被綁死在單一平台。</li>
</ul>

<p>Web3 的歷史功績是：<strong>它降低了「擁有」的門檻</strong>——讓所有權不再是大型機構的專利。用一句話總結：<strong>區塊鏈網路，把「所有權」分享給了每一個人。</strong></p>

<h3 id="四一張表看懂三時代">四、一張表看懂三時代</h3>

<table>
  <thead>
    <tr>
      <th>時代</th>
      <th>年份</th>
      <th>核心動詞</th>
      <th>一句話</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Web1</strong></td>
      <td>1990–2005</td>
      <td>讀（Read）</td>
      <td>協定網路把「資訊」分享給每一個人</td>
    </tr>
    <tr>
      <td><strong>Web2</strong></td>
      <td>2006–2020</td>
      <td>讀＋寫（Read + Write）</td>
      <td>企業網路把「發表的權力」分享給每一個人</td>
    </tr>
    <tr>
      <td><strong>Web3</strong></td>
      <td>2021–</td>
      <td>讀＋寫＋擁有（+ Own）</td>
      <td>區塊鏈網路把「所有權」分享給每一個人</td>
    </tr>
  </tbody>
</table>

<p>看出規律了嗎？<strong>每一次跨越，都代表數位權力的進一步下放</strong>——從「能看」，到「能說」，再到「能擁有」。這不是三個無關的技術，而是同一條脈絡上的三個階段。</p>

<h3 id="五三個層面數學哲學神學">五、三個層面：數學、哲學、神學</h3>

<p>如果你想再往深一層理解區塊鏈為什麼能做到「擁有」，我很喜歡美圖董事長蔡文勝提過的一個三層框架：</p>

<ul>
  <li><strong>數學層面</strong>：加密演算法提供「可被驗證的數學證明」。你擁有某個資產，不需要一家公司來幫你證明——數學本身就是證明。</li>
  <li><strong>哲學層面</strong>：它改變了「人類信任」的運作方式。過去我們信任機構（銀行、平台、政府）；現在我們可以信任「程式碼與共識」。</li>
  <li><strong>神學層面</strong>：它甚至在建立一種去中心化的「信仰體系」——一群素未謀面的人，因為相信同一套規則而協作。</li>
</ul>

<p>你不一定要認同最後一層的浪漫，但前兩層是真實且深刻的：<strong>Web3 的本質，是一次「信任的遷移」</strong>——從「信任人與機構」，遷移到「信任數學與規則」。</p>

<h3 id="結語為什麼企業該理解這件事">結語：為什麼企業該理解這件事</h3>

<p>對企業與專業工作者而言，理解這三個時代不是為了趕流行，而是因為——<strong>每一次網路時代的更替，都重新洗牌了商業機會</strong>。Web1 成就了入口網站，Web2 成就了社群平台與創作者經濟，那麼 Web3 的「所有權」會成就什麼？這正是值得每個經營者思考的問題。</p>

<p>這是我「Web3 入門精選」系列的起點。接下來我會帶你認識 <a href="/technical/depin-explained/">DePIN</a>、<a href="/technical/defi-real-yield/">DeFi 的真實收益</a>、<a href="/technical/nft-token-standards/">NFT 技術</a> 等主題。如果你的組織想系統性地建立 Web3 知識，歡迎了解我的 <a href="/education/crypto/">Web3 企業內訓</a> 與<a href="/education/crypto/soochow/">大學區塊鏈課程</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[Web3 到底是什麼？用「唯讀、讀寫、擁有」三個時代，一次看懂從 Web1 到 Web2 再到 Web3 的演進邏輯，以及為什麼「所有權」是這次網路變革的關鍵。Web3 入門第一課。]]></summary></entry><entry><title type="html">當資產開始上鏈：RWA 對台灣金融業的真實意義</title><link href="https://swanky.github.io/technical/rwa-taiwan-finance-opinion/" rel="alternate" type="text/html" title="當資產開始上鏈：RWA 對台灣金融業的真實意義" /><published>2026-05-30T16:08:00+00:00</published><updated>2026-05-30T16:08:00+00:00</updated><id>https://swanky.github.io/technical/rwa-taiwan-finance-opinion</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-taiwan-finance-opinion/"><![CDATA[<p>這是我 <a href="/technical/rwa/">RWA 系列</a>的最後一篇，也是唯一一篇純觀點文。前面幾篇我盡量保持中立、把<a href="/technical/rwa-gold-tokenization/">黃金</a>、<a href="/technical/rwa-bond-tokenization/">債券</a>、<a href="/technical/rwa-compliant-token-standards/">標準</a>、<a href="/technical/rwa-infrastructure-hsm-pqc/">基建</a>與<a href="/technical/rwa-global-regulation/">全球監管</a>講清楚。這一篇，我想直接回答一個我最常被問到的問題：</p>

<p><strong>「RWA 對台灣金融業，到底有沒有真實意義？還是又一個會泡沫化的加密熱詞？」</strong></p>

<p>我的答案是：有意義，而且很大。但理由不在「區塊鏈很潮」，而在它解決了幾個台灣金融業積累已久、卻一直沒有好解法的真實痛點。讓我從三個視角談起。</p>

<h3 id="一參加機構視角流動性成本與風險">一、參加機構視角：流動性、成本與風險</h3>

<p>先說最務實的一群人——銀行、券商、資產管理公司，也就是金融基礎設施裡的「參加機構」。對他們來說，現行的金融管線有幾個長期的隱性成本：</p>

<p><strong>第一，流動性的碎片化。</strong> 同一檔債券，可能分散在不同機構的不同帳簿系統裡。要做一筆跨機構交易，往往要經過層層對帳、確認、清算，每一層都是時間，也都是成本。<strong>T+2 的交割週期</strong>（成交後兩個工作日才完成交割）在這個秒級世界裡，已經像是一種時代錯置。</p>

<p><strong>第二，跨機構清算的摩擦。</strong> 傳統交割有一個揮之不去的幽靈叫「<strong>對手方風險</strong>」——你交了券，對方還沒付款；或你付了款，對方還沒交券。整個後台有大量人力與制度，存在的唯一目的就是管理這個「中間的空窗」。</p>

<p>RWA 的「<strong>鏈上券款對付（DvP, Delivery versus Payment）</strong>」直接消滅了這個空窗：買賣與付款寫進同一筆原子交易，<strong>要嘛同時成功、要嘛同時失敗</strong>，沒有中間狀態，因此沒有對手方違約的可能。對參加機構而言，這不是「換個系統」，而是<strong>把一整類風險與其對應的後台成本，從根本上拿掉</strong>。</p>

<p><strong>第三，門檻與觸及。</strong> 一張百萬面額的債券可以被切分成極小單位，配息、付息、到期贖回都能寫進智能合約自動執行。這對中小型參加機構、乃至於它們背後的零售客戶，都意味著更低的參與門檻與更高的資金效率。</p>

<h3 id="二監理視角透明可稽核與不可否認">二、監理視角：透明、可稽核與不可否認</h3>

<p>第二個視角，是常被外界誤解的監理端。很多人直覺以為「區塊鏈 = 規避監管」，但對 RWA 這種受監理資產來說，<strong>事實恰恰相反</strong>。</p>

<p>一條設計良好的（合規型）RWA 鏈，反而是監理者的夢幻工具：</p>

<ul>
  <li><strong>完整且永久的交易歷史</strong>：每一筆移轉都留下不可竄改的紀錄，這是一條天然的、永久的稽核線索。傳統金融要查一筆三年前的交易要調好幾個系統的紀錄；在鏈上，它一直都在。</li>
  <li><strong>不可否認性（non-repudiation）</strong>：每筆交易都由特定機構的私鑰簽署，「這筆是不是你做的」不再有爭辯空間。</li>
  <li><strong>反洗錢與資金流向追蹤</strong>：在 KYC 與白名單機制嵌入代幣標準的前提下（這正是 <a href="/technical/rwa-compliant-token-standards/">ERC-3643 這類合規標準</a>在做的事），資金的合規流動可以被即時驗證，而不是事後補查。</li>
</ul>

<p>這也是為什麼我認為台灣傾向「<strong>由中央保管機構（CSD）主導</strong>」的路線是對的。把這條鏈建在國家級、中立、受信任的基礎設施上，而不是放任民間平台各自為政，等於是從一開始就把「監理可見性」寫進了系統的地基。當然，這裡有個前提必須誠實面對：紀錄永久也意味著個資保護要做得更細緻——鏈上資料是否屬於個資、如何在「可稽核」與「可被遺忘」之間取得平衡，是必須同步解決的法律課題。</p>

<h3 id="三技術視角為什麼區塊鏈與金融天生一對">三、技術視角：為什麼區塊鏈與金融天生一對</h3>

<p>第三個視角偏技術，但結論很重要。</p>

<p>區塊鏈最被低估的價值，不是「去中心化」這個常被濫用的詞，而是<strong>「可審計性」</strong>——它本質上是一個所有人都認帳、無法事後竄改的共享帳本。金融業的核心，說到底就是「記帳」與「結算」這兩件事，而這正是區塊鏈最擅長的。從這個角度看，金融與區塊鏈不是「潮流硬湊」，而是<strong>問題與工具的天作之合</strong>。</p>

<p>更深一層的，是我在<a href="/technical/rwa-infrastructure-hsm-pqc/">隱形基建那篇</a>談過的<strong>後量子密碼學（PQC）</strong>。金融紀錄要保存幾十年，而今天用的簽章演算法可能在 2030 年代被量子電腦破解。一個願意在今天就為「三十年後的法律有效性」做準備的平台，展現的不是技術炫耀，而是<strong>對「長期」二字應有的敬意</strong>。這種對時間尺度的敬畏，正是金融基礎設施與一般科技產品最大的差別。</p>

<h3 id="四那麼泡沫的疑慮呢">四、那麼，泡沫的疑慮呢？</h3>

<p>我必須誠實：RWA 領域確實有泡沫的成分，市場上不乏蹭熱度的項目。但要區分兩件事——</p>

<p><strong>「炒作」會泡沫化，「基礎設施」不會。</strong> 穩定幣（最早、最成功的 RWA）已經證明了這條邏輯：當 USDT、USDC 把美元搬上鏈、被全球用於支付與結算，它就不再是炒作，而是基礎設施。RWA 要做的，是把同樣的邏輯延伸到債券、基金、黃金這些更複雜的資產上。</p>

<p>判斷一個 RWA 項目是不是泡沫，我的標準很簡單：<strong>它解決的是真實的金融摩擦，還是只是在創造一個可以炒的代幣？</strong> 鏈上 DvP 消滅對手方風險——這是真實摩擦。國債被切分讓小資族也能參與——這是真實需求。當全球最大的資產管理公司（BlackRock）、最大的銀行（UBS、摩根大通）、最大的證券保管機構（美國 DTC）都在 2024–2026 年間相繼下場，這已經不是少數人的賭注，而是主流金融的集體轉向。</p>

<h3 id="五台灣的時間窗口為什麼是現在">五、台灣的時間窗口：為什麼是現在</h3>

<p>把前面<a href="/technical/rwa-global-regulation/">全球監管地圖</a>的觀察收攏起來，我的結論是：<strong>2026 年，是台灣金融業一個不該錯過的窗口。</strong> 原因有三：</p>

<ol>
  <li><strong>國際標準已經收斂。</strong> CMTAT、ERC-3643 這些合規型標準被各國試點反覆採用，我們不必再從零摸索「該用什麼」——可以直接站在國際的肩膀上。</li>
  <li><strong>法規方向逐漸清晰。</strong> 從金管會的數位資產法研議、到《虛擬資產服務法》的穩定幣框架規劃，台灣的監理路線正在成形。</li>
  <li><strong>時程上並不落後。</strong> 台灣 CSD 主導的路線與美國 DTC 試點時程相當接近——這在金融科技領域是少見的「與最大玩家同步」。</li>
</ol>

<p>剩下的，是執行力與決心。台灣最大的待補拼圖，是<strong>合規的新台幣穩定幣</strong>——沒有它，鏈上的「現金端」就無法閉環，DvP 也只能做半套。這塊補上了，整個系統才算真正完整。</p>

<p>我常說，新技術導入金融業的成敗，從來不是技術本身，而是「制度設計」。2019 年的 STO 不是輸在技術，是輸在額度限制與流動性——這個教訓，希望這一次不要重蹈。</p>

<h3 id="結語橋樑而不是賭場">結語：橋樑，而不是賭場</h3>

<p>回到最初的問題。RWA 對台灣金融業的真實意義是什麼？</p>

<p>我的答案是：<strong>它是一座橋，不是一座賭場。</strong> 它通往的，是一套<strong>讓資產 24/7 自由流動、即時結算、全球可驗證</strong>的金融基礎設施。穩定幣是這座橋的入口，RWA 是橋的本體。</p>

<p>對台灣來說，問題從來不是「要不要過這座橋」——全球都在過——而是「<strong>我們要當造橋的人，還是過很久以後才跟著走過去的人</strong>」。我希望，是前者。</p>

<p>這是我 RWA 系列的句點，但也許是台灣這個故事的起點。如果你的團隊正在評估 RWA 的可能性，或想為組織建立 Web3 的知識基礎，歡迎了解我的 <a href="/technical/">技術顧問服務</a> 與 <a href="/education/crypto/">Web3 企業內訓</a>。也歡迎從<a href="/technical/rwa-tokenization-overview/">系列總論</a>開始，把整個脈絡讀一遍。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[RWA 不是又一個會泡沫化的加密熱詞。從參加機構、金融監理到技術三個視角，談資產代幣化對台灣金融業的真實意義，以及為什麼 2026 是台灣不能錯過的時間窗口。一位資工博士兼金融科技工作者的觀點。]]></summary></entry><entry><title type="html">全球 RWA 監管地圖：從新加坡、香港到美國 DTC 的資產上鏈競賽</title><link href="https://swanky.github.io/technical/rwa-global-regulation/" rel="alternate" type="text/html" title="全球 RWA 監管地圖：從新加坡、香港到美國 DTC 的資產上鏈競賽" /><published>2026-05-30T16:07:00+00:00</published><updated>2026-05-30T16:07:00+00:00</updated><id>https://swanky.github.io/technical/rwa-global-regulation</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-global-regulation/"><![CDATA[<p>在這個 <a href="/technical/rwa/">RWA 系列</a>裡，我談過<a href="/technical/rwa-gold-tokenization/">黃金</a>、<a href="/technical/rwa-bond-tokenization/">債券</a>、<a href="/technical/rwa-compliant-token-standards/">合規標準</a>與<a href="/technical/rwa-infrastructure-hsm-pqc/">隱形基建</a>。但有一條主線貫穿所有篇章卻還沒正面談過：<strong>監管</strong>。</p>

<p>RWA 的本質，從來不是「能不能把資產上鏈」的技術問題，而是「<strong>如何讓區塊鏈聽法律的話</strong>」。而法律是有國界的——同一筆代幣化債券，在新加坡、在香港、在紐約、在台北，面對的是完全不同的監理框架。這篇，我想畫一張 2026 年的全球 RWA 監管地圖，看看各國跑到哪裡、台灣站在哪裡。</p>

<h3 id="一為什麼監管是-rwa-的真正戰場">一、為什麼監管是 RWA 的真正戰場</h3>

<p>先建立一個基本認知：把比特幣轉給朋友很簡單，因為沒人管你是誰。但把一張<strong>真正受監管的債券</strong>放上鏈，你立刻會撞上一整面法律的牆——證券法要求發行人隨時知道持有人是誰、法院可能要求凍結特定人的資產、繼承與司法執行需要強制轉移、配息前要對所有持有人做餘額快照。</p>

<p>這些事，一般加密貨幣（ERC-20）做不到。所以 RWA 的競賽，表面上是技術競賽，骨子裡是<strong>「哪個司法管轄區能最快把這套國際技術語言，接上自己的市場制度與法律」</strong>的監理競賽。</p>

<p>接下來我們依序看亞太、西方、台灣三塊。</p>

<h3 id="二亞太新加坡與香港的雙雄並進">二、亞太：新加坡與香港的雙雄並進</h3>

<p>亞太是目前全球 RWA 監理最積極的區域，由新加坡與香港領跑。</p>

<p><strong>新加坡：Project Guardian（MAS 主導，2022 啟動）</strong></p>

<p>新加坡金融管理局（MAS）在 2022 年啟動 Project Guardian，是國際 RWA 試點的主力。它的特點是「監理機構帶頭、國際大行下場」——參與者包括 UBS、HSBC、渣打、SBI、DBS 等銀行，以及 JPMorgan、BNY Mellon、Apollo 等資管巨頭。</p>

<p>它最具代表性的成果是一筆<strong>跨境附買回（Repo）試點</strong>：UBS（持有日圓計價債券、想借美元）、SBI（手握美元、想賺利息）、DBS（清算合作）三方，把債券與現金分別轉入鏈上 escrow，簽訂鏈上 Repo 合約，到期時在鏈上<strong>原子化（atomic）</strong>地同時完成還款與還券。這第一次驗證了「跨境機構、多幣別、多鏈」的鏈上 Repo 是可行的，而且是生產級而非實驗。</p>

<p>MAS 在 2024 年進一步發布「<strong>Fixed Income Framework for Tokenization</strong>」（代幣化固定收益框架），成為國際級的 RWA 標準參考文件，文中多次引用 CMTAT 作為主要技術框架。新加坡的另一張王牌是成熟的<strong>監理沙盒</strong>，讓銀行能在受監督的環境下試點創新。</p>

<p><strong>香港：Project Ensemble（HKMA 主導，2024 啟動）</strong></p>

<p>香港金管局（HKMA）在 2024 年啟動的 Project Ensemble，路線與新加坡略有不同——它把重心放在 <strong>wholesale CBDC（批發型央行數位貨幣）與代幣化貨幣的結算整合</strong>上。參與者包括滙豐、渣打、中銀香港、恒生等。</p>

<p>Ensemble 的核心試點有二：一是用 HKMA 自家的批發型 CBDC（數位港元）做銀行間即時清算；二是讓各銀行發行自己的「<strong>代幣化存款（Tokenized Deposit）</strong>」，在鏈上轉移、鏈下清算，並受 HKMA 監管。試點標的涵蓋不動產、私募信貸與綠色債券。</p>

<table>
  <thead>
    <tr>
      <th>維度</th>
      <th>Guardian（新加坡 MAS）</th>
      <th>Ensemble（香港 HKMA）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>啟動</td>
      <td>2022</td>
      <td>2024</td>
    </tr>
    <tr>
      <td>主軸</td>
      <td>RWA 多領域（固收、外匯、基金）</td>
      <td>批發型 CBDC + 代幣化貨幣</td>
    </tr>
    <tr>
      <td>代表成果</td>
      <td>跨境 Repo、代幣化 MMF</td>
      <td>DvP 原子結算、代幣化存款</td>
    </tr>
    <tr>
      <td>階段</td>
      <td>試點 → 商業化</td>
      <td>早期試點</td>
    </tr>
  </tbody>
</table>

<p>兩者並進，分別代表新加坡與香港爭奪亞太數位金融樞紐地位的不同戰略。</p>

<h3 id="三西方美國-dtc-與歐盟-dora">三、西方：美國 DTC 與歐盟 DORA</h3>

<p><strong>美國：DTC 試點與 Canton Network</strong></p>

<p>如果說亞太靠靈活，美國靠的是體量。<strong>DTC（The Depository Trust Company）</strong> 是美國的中央證券存託機構，成立於 1973 年，保管著超過 <strong>56 兆美元</strong>的美國證券——它是全球最大的 CSD，美國股票、債券、ETF 的所有權紀錄都在這裡。</p>

<p>2025 年 12 月，美國 SEC 對 DTC 發出 <strong>No-Action Letter</strong>，允許它在分散式帳本（DLT）上試點美國證券的所有權紀錄。這是一個重量級信號：<strong>美國監理開始接受區塊鏈作為主流結算系統。</strong> DTC 的規劃是 2026 上半年完成技術選型、下半年啟動第一批試點，底層選用了以隱私為核心、已有高盛與 JPMorgan 等機構使用的 <strong>Canton Network</strong>。</p>

<p>當全球最大的 CSD 都開始把證券所有權鏈上化，它牽動的是整個全球金融基礎設施的方向。</p>

<p><strong>歐盟：DORA 與穩定幣監管</strong></p>

<p>歐盟的角色比較像是「立規矩的人」。<strong>DORA（Digital Operational Resilience Act，數位營運韌性法案）</strong> 在 2025 年 1 月全面執行，其 Article 8 要求金融機構建立 ICT 風險管理框架，並具備「從主系統切換到備援系統」的能力——這被業界廣泛解讀為包含<strong>密碼學切換能力</strong>（與我在<a href="/technical/rwa-infrastructure-hsm-pqc/">隱形基建那篇</a>談的後量子遷移直接相關）。值得注意的是，DORA 具有<strong>域外效力</strong>：只要你跟歐盟有業務往來，就可能落入它的管轄。</p>

<p>在穩定幣這一塊，美國的 <strong>GENIUS Act</strong>（2025 年通過）要求穩定幣 100% 準備金、月度揭露與獨立審計，給了美元穩定幣明確的法律地位；歐盟則有 MiCA 框架。穩定幣之所以重要，是因為它是 RWA 的「<strong>現金端</strong>」——沒有合規的鏈上現金，「券款對付（DvP）」就難以真正在鏈上完成。</p>

<h3 id="四台灣從-sto-的教訓到-rwa-的機會">四、台灣：從 STO 的教訓，到 RWA 的機會</h3>

<p>把鏡頭轉回台灣。很多人不知道，台灣其實很早就試過代幣化——只是用了另一個名字：<strong>STO（Security Token Offering，證券型代幣發行）</strong>。</p>

<p><strong>2019 STO 規範：為什麼沒做起來</strong></p>

<p>2019 年 6 月，金管會發布 STO 募資管理辦法，允許用區塊鏈發行等同於證券的代幣。但它失敗了，原因是<strong>額度限制太嚴</strong>：</p>

<ul>
  <li>自然人投資每檔上限僅 30 萬元（投資人嫌少）；</li>
  <li>單檔募資上限 3,000 萬元（公司嫌合規成本不划算）；</li>
  <li>平台業者門檻高，又沒開放公開集中交易。</li>
</ul>

<p>結果是五年下來只有元富、凱基、元大等少數券商取得資格，實際發行案例個位數，總募資金額不到 1 億新台幣。<strong>這是一個寶貴的教訓：技術可行不等於市場可行，制度設計的「額度」與「流動性」才是成敗關鍵。</strong></p>

<p><strong>RWA ≠ STO：定位的關鍵差異</strong></p>

<p>這裡要釐清一個常見的混淆。當前討論的 RWA 代幣化，和 2019 年的 STO 並不是同一件事：</p>

<table>
  <thead>
    <tr>
      <th>維度</th>
      <th>STO</th>
      <th>RWA 代幣化</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>標的</td>
      <td><strong>新發行</strong>的證券</td>
      <td><strong>既有</strong>的資產（公債、公司債、黃金等）</td>
    </tr>
    <tr>
      <td>性質</td>
      <td>公開募資（面向投資人）</td>
      <td>既有資產換一種「形式」</td>
    </tr>
    <tr>
      <td>法源</td>
      <td>STO 專法 + 證交法</td>
      <td>沿用既有的證交法、相關管理辦法</td>
    </tr>
  </tbody>
</table>

<p>關鍵在於：RWA 代幣化的標的「<strong>本來就是受監理的證券或商品</strong>」，只是把它的持有形式從傳統帳簿換成鏈上代幣。它不是創造一個新的法律類別，因此可以<strong>沿用既有法源</strong>，不必苦等新法。</p>

<p><strong>台灣的獨特優勢與最大缺口</strong></p>

<p>台灣在 RWA 上有一個全球相對罕見的特點：傾向<strong>由集中保管機構（CSD）這種國家級基礎設施直接主導平台建置</strong>，而不是放任民間平台各自為政。這種「CSD-led」的模式，在基礎設施的保障與信任上較強——這點恰好與美國 DTC 的路線同頻。事實上，台灣的時程與美國 DTC 試點（2026 下半年）相當接近，<strong>台灣在這場競賽裡並不落後。</strong></p>

<p>但最大的缺口是<strong>穩定幣</strong>：目前台灣沒有合規的新台幣穩定幣，鏈上的「券款對付」就難以完全閉環。好消息是，台灣規劃最快在 2026 下半年隨《虛擬資產服務法》推出穩定幣框架；金管會也在研議涵蓋 STO、託管、穩定幣的「數位資產服務法」，預計 2026–2027 立法。</p>

<h3 id="五一張總表2026-年全球-rwa-監理進度">五、一張總表：2026 年全球 RWA 監理進度</h3>

<table>
  <thead>
    <tr>
      <th>司法管轄區</th>
      <th>旗艦計畫 / 法規</th>
      <th>主導機構</th>
      <th>重點</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>新加坡</td>
      <td>Project Guardian</td>
      <td>MAS</td>
      <td>跨境 Repo、固收框架</td>
    </tr>
    <tr>
      <td>香港</td>
      <td>Project Ensemble</td>
      <td>HKMA</td>
      <td>批發 CBDC、代幣化存款</td>
    </tr>
    <tr>
      <td>美國</td>
      <td>DTC 試點 + GENIUS Act</td>
      <td>SEC / DTC</td>
      <td>證券所有權上鏈、穩定幣立法</td>
    </tr>
    <tr>
      <td>歐盟</td>
      <td>DORA + MiCA</td>
      <td>EU</td>
      <td>營運韌性、加密資產框架</td>
    </tr>
    <tr>
      <td>台灣</td>
      <td>CSD 主導 RWA + 虛擬資產服務法</td>
      <td>金管會 / 央行</td>
      <td>既有資產代幣化、穩定幣框架研議中</td>
    </tr>
  </tbody>
</table>

<p>把這張表攤開來看，會發現一個清楚的趨勢：<strong>2026 年，RWA 已經從「加密圈的概念」變成「各國主流金融基礎設施的競賽項目」</strong>。國際標準正在收斂（CMTAT、ERC-3643 被反覆引用）、各地法規方向逐漸清晰、技術也被一再驗證可行。</p>

<h3 id="結語誰能最快把國際語言接上本地制度">結語：誰能最快把國際語言接上本地制度</h3>

<p>RWA 的全球監管地圖告訴我們一件事：這場競賽的勝負手，不在「誰的鏈最快」，而在「<strong>誰能最快把這套國際技術語言，接上自己市場的制度與法律</strong>」。</p>

<p>新加坡靠沙盒的靈活、香港靠 CBDC 的整合、美國靠 DTC 的體量、歐盟靠規則的輸出。而台灣，手上握著「CSD 主導」這張在信任上頗有分量的牌，缺的是把穩定幣這塊現金端補齊、把法規方向定清楚的臨門一腳。</p>

<p>2026 年，正是台灣金融業的關鍵窗口。關於這個窗口對台灣到底意味著什麼，我寫在系列的下一篇——<a href="/technical/rwa-taiwan-finance-opinion/">當資產開始上鏈：RWA 對台灣金融業的真實意義</a>。如果你的組織想建立 RWA 與 Web3 的知識基礎，歡迎了解我的 <a href="/technical/">技術顧問服務</a> 與 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[RWA 沒有國界，但監理有。一文看懂全球資產代幣化的監管版圖：新加坡 Project Guardian、香港 Project Ensemble、美國 DTC 試點、歐盟 DORA，以及台灣 STO 的教訓與機會。]]></summary></entry><entry><title type="html">RWA 的隱形基建：HSM 硬體保管與後量子密碼學</title><link href="https://swanky.github.io/technical/rwa-infrastructure-hsm-pqc/" rel="alternate" type="text/html" title="RWA 的隱形基建：HSM 硬體保管與後量子密碼學" /><published>2026-05-30T16:06:00+00:00</published><updated>2026-05-30T16:06:00+00:00</updated><id>https://swanky.github.io/technical/rwa-infrastructure-hsm-pqc</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-infrastructure-hsm-pqc/"><![CDATA[<p>在我的 <a href="/technical/rwa/">RWA 系列</a>裡，前面幾篇談的都是「看得見」的東西——<a href="/technical/rwa-gold-tokenization/">黃金</a>、<a href="/technical/rwa-bond-tokenization/">債券</a>、<a href="/technical/rwa-compliant-token-standards/">合規型代幣標準</a>。但任何一套金融基礎設施，真正撐住它的，往往是「看不見」的那一層。</p>

<p>這篇要談的，就是 RWA 平台底下兩塊最容易被忽略、卻最致命的基建：<strong>私鑰怎麼保管（HSM）</strong>，以及 <strong>這些密碼學還能撐多久（後量子密碼學，PQC）</strong>。</p>

<h3 id="一一切的起點私鑰就是資產本身">一、一切的起點：私鑰就是資產本身</h3>

<p>把一張債券或一克黃金代幣化，意味著鏈上會有一筆交易，而這筆交易是用一把<strong>私鑰</strong>簽出來的。在傳統金融裡，如果有人盜轉了你的股票，券商和集保可以靠人工調帳、靠法院命令把它救回來。但在區塊鏈上，<strong>簽章即授權</strong>——一旦私鑰外洩，攻擊者用它簽的任何交易都是「合法」的，鏈不會問你是不是本人。</p>

<p>這就是為什麼「私鑰存在哪裡」是 RWA 平台的第一個生死問題。我們有幾個選項：</p>

<ul>
  <li>存在硬碟的 <code class="language-plaintext highlighter-rouge">.pem</code> 檔？硬碟會被偷、被駭，有 root 權限的人就能讀。</li>
  <li>存在資料庫加密欄位？那加密用的金鑰又存在哪？問題只是往後推一層。</li>
  <li>存在記憶體、運算時才解密？記憶體可以被 dump、被 cold boot attack 撈出來。</li>
</ul>

<p>唯一站得住腳的答案是：把私鑰放進一個<strong>「永遠不會離開」的容器</strong>裡，所有簽章運算都在容器內完成。這個容器，就是 <strong>HSM（Hardware Security Module，硬體安全模組）</strong>。</p>

<h3 id="二hsm-是什麼金融業用了五十年的保險箱">二、HSM 是什麼？金融業用了五十年的「保險箱」</h3>

<p>如果說 ECDSA、RSA 這些密碼演算法是「鎖」，那 HSM 就是「保險箱」——<strong>鎖再強，鑰匙隨便放桌上也沒用</strong>。</p>

<p>一台合格的企業級 HSM 提供四個核心保證：</p>

<ol>
  <li><strong>金鑰永不以明文離開硬體</strong>：你把資料送進去，HSM 在內部簽完、把簽章送出來，私鑰本身從未出現在 HSM 之外。</li>
  <li><strong>物理防篡改（tamper resistance）</strong>：試圖撬開外殼，內部感測器立刻觸發 <strong>zeroization</strong>——把所有金鑰瞬間覆寫為零。就算整台被偷走，也偷不到金鑰。</li>
  <li><strong>真亂數來源（TRNG）</strong>：用熱噪聲、量子效應產生硬體亂數。這比軟體亂數可靠得多——這點等下講 Sony 的故事時你會懂為什麼重要。</li>
  <li><strong>存取控制</strong>：關鍵操作需要「M-of-N」多人核可（例如五個管理員中三個同時插卡才能動），並留完整稽核紀錄。</li>
</ol>

<p>HSM 不是 2010 年代為了加密貨幣才發明的。它的源頭是 <strong>1970 年代的 ATM</strong>——當提款機開始普及，使用者輸入的 PIN 在傳輸途中要怎麼保護？IBM 與 HP Atalla 這些公司做出了第一代金融 HSM 來加密 PIN。1990 年代網路商務興起，<strong>CA（憑證機構）的根私鑰</strong>成為新的保管重點，「根 CA 私鑰必須在 HSM 內」變成 PKI 的鐵律，那套多人見證、攝影錄影、磁帶歸檔的「金鑰儀式（Key Ceremony）」也在此時成熟。</p>

<p>換句話說，HSM 是五十年血淚累積的結論，不是炫技。</p>

<h3 id="三不用-hsm-的代價一份還在增長的損失清單">三、不用 HSM 的代價：一份還在增長的損失清單</h3>

<p>為什麼金融業願意花一台動輒數萬美元買 HSM？因為「不用」的代價更貴。歷史上幾起關鍵事件，徹底證明軟體保管金鑰是不夠的：</p>

<ul>
  <li><strong>Sony PlayStation 3 私鑰外洩（2010）</strong>：Sony 用 ECDSA 簽 PS3 韌體，卻<strong>重複使用了 nonce（隨機數）</strong>，駭客直接反推出私鑰。教訓：<strong>亂數品質決定 ECDSA 安全</strong>，這正是 HSM 內建 TRNG 的價值。</li>
  <li><strong>加密貨幣交易所大屠殺</strong>：這份清單長得驚人——</li>
</ul>

<table>
  <thead>
    <tr>
      <th>事件</th>
      <th>年份</th>
      <th>損失</th>
      <th>根因</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mt. Gox</td>
      <td>2014</td>
      <td>85 萬 BTC</td>
      <td>私鑰長期存在熱錢包，被逐步偷走</td>
    </tr>
    <tr>
      <td>Coincheck</td>
      <td>2018</td>
      <td>5.34 億美元</td>
      <td>私鑰存在熱錢包軟體中，無 HSM</td>
    </tr>
    <tr>
      <td>KuCoin</td>
      <td>2020</td>
      <td>2.85 億美元</td>
      <td>熱錢包私鑰洩漏</td>
    </tr>
    <tr>
      <td>Bybit</td>
      <td>2025</td>
      <td>14.6 億美元（史上最大）</td>
      <td>冷簽流程遭攻擊</td>
    </tr>
  </tbody>
</table>

<p>每一筆損失都在重複同一句話：<strong>沒有硬體保護，私鑰早晚會遺失。</strong> 對一個要保管國家級金融資產的 RWA 平台來說，這條清單就是不能犯的錯誤示範。</p>

<h3 id="四不是所有硬體都一樣fips-140-3-等級制度">四、不是所有「硬體」都一樣：FIPS 140-3 等級制度</h3>

<p>這裡有個關鍵概念：當有人說「我們有 HSM」時，<strong>第一個該問的不是品牌，而是「FIPS 等級多少？」</strong></p>

<p><strong>FIPS 140-3</strong> 是美國 NIST 對密碼模組的安全認證標準，分四級：</p>

<table>
  <thead>
    <tr>
      <th>等級</th>
      <th>物理保護</th>
      <th>典型用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Level 1</td>
      <td>無物理保護要求</td>
      <td>軟體加密、低敏感</td>
    </tr>
    <tr>
      <td>Level 2</td>
      <td>防篡改證據（封印、塗層）</td>
      <td>中等敏感</td>
    </tr>
    <tr>
      <td><strong>Level 3</strong></td>
      <td><strong>主動防篡改響應（自動 zeroization）</strong></td>
      <td><strong>金融基礎設施標準</strong></td>
    </tr>
    <tr>
      <td>Level 4</td>
      <td>完整環境防護（電壓、溫度、輻射）</td>
      <td>軍事、情報</td>
    </tr>
  </tbody>
</table>

<p><strong>Level 3 是金融業的隱性最低門檻</strong>——它是「能不能在金融場景用」的入場券。Level 4 通常是過度（不必要的成本），Level 2 則不足（跨境互通會被打回票）。歐洲還有另一套以 EAL 等級表示的 Common Criteria（CC）認證，國際級的金融基礎設施經常要求 FIPS 與 CC 兩者兼備。</p>

<p>還有一個容易被行銷話術蓋過的細節：FIPS 認證的不是「整台設備」，而是<strong>特定的密碼模組（韌體 + 硬體子集）</strong>。同一台 HSM 可能整體有 Level 3 認證，但某些新功能（例如稍後要談的後量子演算法）<strong>不在認證邊界內</strong>。這個區別，等下會變成 RWA 平台的一個現實難題。</p>

<h3 id="五hsm-vs-mpc兩種保管哲學">五、HSM vs MPC：兩種保管哲學</h3>

<p>近五年出現了一個常被宣傳成「HSM 替代品」的技術：<strong>MPC（Multi-Party Computation，多方安全計算）</strong>。</p>

<p>MPC 的想法是：把一把「邏輯」私鑰切成 N 份碎片（shares），分散由不同伺服器或機構保管；簽章時這些節點互相通信、<strong>在不重組完整私鑰的前提下</strong>產生簽章。攻擊者必須同時攻破多份碎片才能偽造簽章。</p>

<p>兩者的哲學差異很清楚：</p>

<table>
  <thead>
    <tr>
      <th>面向</th>
      <th>HSM</th>
      <th>MPC</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>核心承諾</td>
      <td>金鑰永不離開硬體</td>
      <td>完整金鑰永不存在於任何地方</td>
    </tr>
    <tr>
      <td>保護機制</td>
      <td>物理（硬體）</td>
      <td>數學（密碼學）</td>
    </tr>
    <tr>
      <td>攻擊面</td>
      <td>攻破單一 HSM</td>
      <td>須同時攻破多個獨立節點</td>
    </tr>
    <tr>
      <td>合規認可</td>
      <td>強（FIPS、PCI HSM）</td>
      <td>較弱（新興、認證少）</td>
    </tr>
    <tr>
      <td>跨地理分散</td>
      <td>困難</td>
      <td>容易</td>
    </tr>
  </tbody>
</table>

<p>最先進的做法不是二選一，而是<strong>兩者結合</strong>：讓每一份 MPC 碎片都<strong>存在 HSM 內</strong>。這樣你同時拿到 HSM 的硬體保證與 MPC 的數學保證。市場上的機構託管平台（如 Fireblocks、BitGo、Liminal 等）大多走這條「HSM-backed MPC」的路線。</p>

<p>所以下次聽到「我們用 MPC，不需要 HSM」時，內行的追問是：<strong>「你的碎片存在哪？」</strong>——如果答案是「軟體加密」，那它的安全性遠低於有 HSM 撐底的 MPC。</p>

<p>對 RWA 平台的實務啟示是：受高度監管的中央保管端，HSM 幾乎是必須（合規最嚴）；而下游各參加機構的保管，則可依規模與場景，在自建 HSM、HSM-backed MPC 之間選擇。<strong>這是分工，不是冗餘。</strong></p>

<h3 id="六然後量子電腦來敲門了">六、然後，量子電腦來敲門了</h3>

<p>把私鑰鎖進 HSM，解決了「鑰匙放哪」的問題。但還有一個更深的問題：<strong>這把鎖本身，還能撐多久？</strong></p>

<p>這就要談到 <strong>PQC（Post-Quantum Cryptography，後量子密碼學）</strong>。</p>

<p>故事要從 1994 年說起。美國數學家 <strong>Peter Shor</strong> 證明了一件事：<strong>只要存在一台「夠大」的量子電腦，現行所有 RSA 與橢圓曲線（ECC/ECDSA）密碼系統都會被破解。</strong> 原因在於——RSA、ECDSA、DH 這些演算法的安全性，全都建立在「某一類離散對數問題對古典電腦太難」的假設上，而 Shor 演算法用量子的方式把這類問題從「次指數時間」壓縮成「多項式時間」。</p>

<p>兩年後的 <strong>Grover 演算法（1996）</strong> 補了一刀，但威脅小得多：它讓對稱加密（AES）與雜湊（SHA）的破解只是「平方加速」，把 AES-128 升到 AES-256、把雜湊輸出加長就能擋住。</p>

<p>所以真正的曝險不對稱地集中在一處：</p>

<ul>
  <li><strong>簽章與金鑰交換（RSA / ECDSA / ECDH）</strong>：高曝險，<strong>必須換成 PQC 演算法</strong>。</li>
  <li><strong>對稱加密與雜湊（AES / SHA）</strong>：低曝險，<strong>只要加長參數即可</strong>。</li>
</ul>

<p>對 RWA 平台來說，這意味著：你不必把整個系統重寫，但<strong>所有跟簽章、金鑰交換有關的部位，都必須先具備「將來能換」的能力</strong>。</p>

<h3 id="七先收割後解密為什麼現在就得動">七、「先收割，後解密」——為什麼現在就得動</h3>

<p>很多人直覺認為：「量子電腦還沒造出來，等它出現再換不就好了？」這個直覺是錯的，錯在一個叫 <strong>HNDL（Harvest Now, Decrypt Later，先收割後解密）</strong> 的攻擊模型。</p>

<p>對手不必等到擁有量子電腦的那天才動手。他可以<strong>今天就把你的加密流量、簽章紀錄全部存下來</strong>，等量子電腦成熟（業界稱為「Q-day」）那天再回頭解密。</p>

<p>所以真正的判斷標準是：<strong>資料的敏感期，有沒有超過「Q-day 距離今天的時間」？</strong></p>

<table>
  <thead>
    <tr>
      <th>資料類型</th>
      <th>敏感期</th>
      <th>HNDL 風險</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>一次性 session token</td>
      <td>數分鐘</td>
      <td>極低</td>
    </tr>
    <tr>
      <td>病歷、人事資料</td>
      <td>數年至數十年</td>
      <td>高</td>
    </tr>
    <tr>
      <td><strong>金融保管交易紀錄、債券資料</strong></td>
      <td><strong>7–30 年甚至更長</strong></td>
      <td><strong>極高</strong></td>
    </tr>
  </tbody>
</table>

<p>這正是 RWA 的痛點。金融機構的帳簿與交易紀錄依法要保存 5 到 30 年；<strong>今天用 ECDSA 簽的一筆結算，30 年後仍須能在法庭上被驗證為「未經竄改、確實來自某機構」</strong>。如果 ECDSA 在 2030 年被破，那 2025 到 2030 之間累積的所有鏈上歷史的「不可否認性」都會被打上問號。</p>

<p>各家對 Q-day 的估算（截至 2026 年初）落在 <strong>2029 到 2035</strong> 之間：Google 與 Cloudflare 內部目標是 2029，NIST/NSA 與美國聯邦系統的合規截止是 <strong>2030</strong>。讓所有人從 2024 年突然緊張起來的關鍵，是 Google 在 2024 年的研究——把「破解 RSA-2048 所需的物理量子位元」從 2,000 萬一口氣砍到不足 100 萬。</p>

<p>「我們現在加密的，是今天的對手不能解、但明天的對手可以解的東西。」這句話，就是 PQC 一切緊迫性的源頭。</p>

<h3 id="八nist-的八年抗戰與三份新標準">八、NIST 的八年抗戰與三份新標準</h3>

<p>PQC 不是哪家廠商閉門造的，而是 NIST 用<strong>八年（2016–2024）</strong>舉辦的全球公開競賽選出來的。這段歷史值得一提，因為它解釋了為什麼「能換演算法」這件事如此重要。</p>

<p>競賽過程中發生過兩起震撼業界的「慘案」：原本進入決賽圈的 <strong>Rainbow</strong>（多變量密碼）在 2022 年被一台筆電在 53 小時內破解；同年 7 月，被看好的 <strong>SIKE</strong>（同源密碼）被兩位數學家用<strong>單核心電腦</strong>在一小時內攻破。SIKE 當時已走到第四輪、多家廠商開始試做整合——如果 NIST 早一年標準化它，所有先行者都得打掉重練。</p>

<p><strong>這就是為什麼「密碼敏捷性（crypto-agility）」不是錦上添花，而是必備設計</strong>——沒有人能保證今天的贏家不會是明天的 SIKE。</p>

<p>2024 年 8 月 13 日，NIST 正式發布三份 PQC 標準：</p>

<table>
  <thead>
    <tr>
      <th>標準</th>
      <th>名稱</th>
      <th>用途</th>
      <th>基礎</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>FIPS 203</strong></td>
      <td>ML-KEM（源自 Kyber）</td>
      <td>金鑰封裝</td>
      <td>格密碼</td>
    </tr>
    <tr>
      <td><strong>FIPS 204</strong></td>
      <td>ML-DSA（源自 Dilithium）</td>
      <td>一般用簽章</td>
      <td>格密碼</td>
    </tr>
    <tr>
      <td><strong>FIPS 205</strong></td>
      <td>SLH-DSA（源自 SPHINCS+）</td>
      <td>保守型簽章</td>
      <td>雜湊密碼</td>
    </tr>
  </tbody>
</table>

<p>設計策略是「<strong>格密碼為主、雜湊密碼為輔</strong>」——三個入選者裡有兩個是格密碼（效能與安全性最平衡），保留一個雜湊密碼作為「保險箱」：萬一格密碼將來出事，雜湊密碼的保守性是最後防線。（基於 Falcon 的 FN-DSA／FIPS 206 因浮點運算的側信道防禦較複雜，預計後續才發布。）</p>

<h3 id="九pqc-對-rwa-平台最現實的衝擊不是速度是大小">九、PQC 對 RWA 平台最現實的衝擊：不是速度，是大小</h3>

<p>很多人以為 PQC 的代價是「運算變慢」。實際上 PQC 演算法的速度大多可接受，<strong>真正的衝擊是「位元組大小」</strong>：</p>

<table>
  <thead>
    <tr>
      <th>演算法</th>
      <th>簽章大小</th>
      <th>相對 ECDSA</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ECDSA P-256（現行）</td>
      <td>64–72 B</td>
      <td>1×</td>
    </tr>
    <tr>
      <td>ML-DSA-65</td>
      <td>3,309 B</td>
      <td>約 46×</td>
    </tr>
    <tr>
      <td>ML-DSA-87</td>
      <td>4,627 B</td>
      <td>約 64×</td>
    </tr>
    <tr>
      <td>SLH-DSA（保守型）</td>
      <td>16 KB–49 KB</td>
      <td>200×–700×</td>
    </tr>
  </tbody>
</table>

<p>簽章大 50 倍、公鑰大 30 到 80 倍——這對資料庫 schema、API payload、網路頻寬、HSM 內的金鑰存放，全都是實實在在的成本。一個有遠見的 RWA 平台，會在<strong>今天的資料庫設計裡就替簽章欄位預留足夠空間</strong>，並在每筆加密產出旁標記「這是用哪個演算法簽的」（業界稱為 Alg-ID Tagging 或 CBOM，密碼學物料清單）。不預留，未來切換時整套 schema 都要重做。</p>

<h3 id="十業界共識先抽象再混合最後切換">十、業界共識：先抽象、再混合、最後切換</h3>

<p>面對量子威脅，2026 年的產業共識濃縮成兩個關鍵詞與一條路徑。</p>

<p><strong>Hybrid（混合）</strong>：在過渡期同時使用古典演算法<strong>與</strong> PQC 演算法，只要其中一個還沒被破，整個系統就還安全。例如 Cloudflare 從 2023 年起就在 TLS 1.3 部署 <code class="language-plaintext highlighter-rouge">X25519 + ML-KEM-768</code> 的混合金鑰交換。這同時提供了「萬一新演算法像 SIKE 一樣翻車」的保險。</p>

<p><strong>Crypto-Agility（密碼敏捷性）</strong>：NIST 在 2025 年的白皮書 CSWP 39 把它正式列為核心設計原則。具體做法是讓應用程式<strong>透過抽象介面請求服務</strong>（「請幫我驗這個簽章」），而不是直接寫死呼叫某個演算法。這樣將來換演算法時，業務邏輯一行都不用改。</p>

<p>落地的優先順序也有共識：<strong>通信加密／金鑰交換</strong>（HNDL 風險最高）先做 → <strong>PKI 與證書</strong>其次 → <strong>應用層簽章</strong>再次 → <strong>對稱加密</strong>最後（反正升個 key 長度就好）。</p>

<p>值得注意的是，HSM 是這條路上<strong>最慢的一環</strong>——截至 2026 年初，還沒有任何 HSM 廠商把 PQC 演算法納入 FIPS 140-3 Level 3 的認證邊界內。這意味著即使硬體跑得動 PQC，合規層面也還不能用於需要 Level 3 的場景。所以正確的策略不是「等 HSM 廠商」，而是<strong>先讓自己的軟體層 ready</strong>——抽象介面先設計好、schema 先預留好，等硬體與標準成熟，再無痛切換。</p>

<h3 id="十一這不只是技術選擇已經是合規要求">十一、這不只是技術選擇，已經是合規要求</h3>

<p>值得強調的是，PQC 在 2024–2026 之間完成了一個身分轉換：<strong>從「資安最佳實務」升級成「金融監理要求」</strong>。</p>

<ul>
  <li>美國：NSM-10 要求聯邦系統 <strong>2030 年前</strong>完成 PQC 遷移；SWIFT 也公告 2030 前完成跨行訊息加密的 PQC 遷移。</li>
  <li>歐盟：<strong>DORA（數位營運韌性法案）</strong> 在 2025 年 1 月全面執行，其 Article 8 要求金融機構具備「系統切換能力」，被業界普遍解讀為包含<strong>密碼學切換能力</strong>；DORA 對在歐盟有業務的機構具有域外效力。</li>
  <li>支付業：PCI DSS 4.0（2025 年強制執行）要求密碼學保護「能應對新興威脅」，被廣泛解讀為包含 PQC 準備。</li>
</ul>

<p>對任何想跨境互通（與美國、歐洲、新加坡的金融基礎設施對接）的 RWA 平台來說，PQC 已經從「要不要做」變成「什麼時候做」。今天不準備，明天就可能在國際稽核與合規檢查時被擋下來。</p>

<h3 id="結語看不見但撐住一切">結語：看不見，但撐住一切</h3>

<p>RWA 把資產搬上鏈，讓人著迷的是那些看得見的創新——秒級結算、全球流動、24 小時不打烊。但讓這一切「值得信任」的，是兩塊看不見的基建：<strong>HSM 確保私鑰此刻安全，PQC 確保它三十年後依然安全。</strong></p>

<p>一個有遠見的 RWA 平台，不會等量子電腦造好才動——它會在今天就把抽象介面與 schema 準備好，讓系統「將來能換」。<strong>這不是過度設計，這是金融基礎設施對「長期」二字應有的敬意。</strong></p>

<p>延伸閱讀我這個系列的其他篇章：<a href="/technical/rwa-tokenization-overview/">RWA 是什麼（總論）</a>、<a href="/technical/rwa-compliant-token-standards/">合規型代幣標準：ERC-3643 vs ERC-1404</a>，以及談監理的<a href="/technical/rwa-global-regulation/">全球 RWA 監管地圖</a>。如果你的團隊正在評估 RWA 的技術可行性，歡迎了解我的 <a href="/technical/">技術顧問服務</a> 與 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[RWA 把現實世界資產搬上鏈，但真正撐住信任的是看不見的基礎建設：HSM 硬體保管與後量子密碼學（PQC）。一文看懂 Mt. Gox 的教訓、FIPS 140-3 等級、量子威脅與 NIST PQC 標準。]]></summary></entry><entry><title type="html">RWA 是什麼？從黃金存摺到資產上鏈，一文看懂現實世界資產代幣化</title><link href="https://swanky.github.io/technical/rwa-tokenization-overview/" rel="alternate" type="text/html" title="RWA 是什麼？從黃金存摺到資產上鏈，一文看懂現實世界資產代幣化" /><published>2026-05-30T16:05:00+00:00</published><updated>2026-05-30T16:05:00+00:00</updated><id>https://swanky.github.io/technical/rwa-tokenization-overview</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-tokenization-overview/"><![CDATA[<p>過去兩年，我花了大量時間沉浸在一個主題裡：<strong>RWA（Real World Assets，現實世界資產代幣化）</strong>。它是 2026 年整個金融科技領域最熱的關鍵字之一，BlackRock、UBS、摩根大通都在做，台灣金管會也成立了專門小組。但對大多數人來說，「RWA」三個字母仍然抽象。</p>

<p>這篇文章，我想用最白話的方式，把 RWA 從頭講清楚——它是什麼、為什麼重要、市場有多大、台灣站在哪裡。這也是我整個 RWA 系列的入口。</p>

<h3 id="一rwa-到底是什麼">一、RWA 到底是什麼？</h3>

<p>一句話：<strong>RWA 就是把現實世界裡的資產，變成區塊鏈上可以持有、轉移、結算的代幣。</strong></p>

<p>這些「現實資產」可以是黃金、債券、基金、股票、不動產、甚至一張碳權憑證。代幣化（tokenization）做的事情，就是替這些資產在鏈上發行一個「數位分身」——這個分身代表你對該資產的所有權，而且可以像加密貨幣一樣，24 小時、跨國界、秒級結算地流動。</p>

<p>其實你早就接觸過 RWA 最原始的形態：<strong>穩定幣</strong>。USDT、USDC 把「美元」這種現實世界資產表示成鏈上代幣，這正是最早、也最成功的 RWA。RWA 要做的，就是把同樣的邏輯，延伸到黃金、債券、基金這些更複雜的資產上。</p>

<h3 id="二為什麼資產要上鏈">二、為什麼資產要「上鏈」？</h3>

<p>如果傳統金融運作得好好的，為什麼要大費周章把資產搬上區塊鏈？因為鏈上結算能解決幾個傳統金融積累已久的痛點：</p>

<ul>
  <li><strong>結算速度</strong>：傳統證券交易普遍是 T+2（成交後兩個工作日才完成交割）。鏈上可以做到 T+0，甚至即時原子交割——買賣與付款在同一筆交易裡同時完成，沒有對手方違約風險。</li>
  <li><strong>降低門檻</strong>：一張百萬面額的債券，可以被切分成極小單位，讓小資族也能參與；不動產、私募基金這些「有錢人專屬」的資產，也因此可能向更多人開放。</li>
  <li><strong>自動化</strong>：配息、付息、到期贖回都可以寫進智能合約自動執行，省下大量中後台人工作業。</li>
  <li><strong>全球流動性</strong>：資產不再被綁在單一市場的營業時間裡，理論上可以接上全球的鏈上資金池。</li>
</ul>

<p>這些不是技術炫技，而是<strong>金融基礎邏輯的改寫</strong>。</p>

<h3 id="三但上鏈沒那麼簡單">三、但「上鏈」沒那麼簡單</h3>

<p>這正是 RWA 真正困難、也最有趣的地方。把比特幣轉給朋友很簡單，因為沒人管你是誰。但把一張<strong>真正受監管的債券</strong>放上鏈，你立刻會撞上一堵牆：</p>

<ul>
  <li>證券法要求發行人<strong>隨時知道持有人是誰</strong>——所以不能匿名轉帳；</li>
  <li>法院可能要求<strong>凍結</strong>特定人的資產；</li>
  <li>繼承、司法執行時，需要能<strong>強制轉移</strong>；</li>
  <li>配息前需要對所有持有人做<strong>餘額快照</strong>。</li>
</ul>

<p>這些是一般加密貨幣代幣（ERC-20）做不到的事。於是整個產業花了十二年，演化出專門為受監管資產設計的代幣標準——這段歷史我寫在 <a href="/technical/rwa-standards-evolution/">〈RWA 代幣化標準演進史〉</a>，從 2014 年的 Colored Coins 一路講到今天成為機構首選的 ERC-3643 與 CMTAT。<strong>RWA 的本質，不是技術問題，而是「如何讓區塊鏈聽法律的話」。</strong></p>

<h3 id="四全球市場有多大">四、全球市場有多大？</h3>

<p>數字會說話：</p>

<ul>
  <li>截至 2025 年 9 月，全球代幣化 RWA 的總市值約 <strong>309 億美元</strong>；</li>
  <li>光是 ERC-3643 標準下代幣化的資產就超過 <strong>320 億美元</strong>，橫跨 180 多個司法管轄區；</li>
  <li>BlackRock 的代幣化國債基金 BUIDL，從 2024 年 3 月推出到 2025 年 8 月，規模從零成長到超過 <strong>23 億美元</strong>；</li>
  <li><strong>麥肯錫預測，到 2030 年全球 RWA 市場規模將達到 2 到 4 兆美元。</strong></li>
</ul>

<p>當全球最大的資產管理公司（BlackRock）、最大的銀行（UBS、摩根大通）、最大的證券集中保管機構（美國 DTC）都在 2024–2026 年間相繼入場，RWA 已經從「加密圈的概念」變成「主流金融的基礎建設」。</p>

<h3 id="五五大資產類別">五、五大資產類別</h3>

<p>並不是所有資產都同樣適合代幣化。目前最主流的幾類，由易到難大致是：</p>

<ol>
  <li><strong>穩定幣（現金類）</strong>——最成熟，本質就是法幣的代幣化。</li>
  <li><strong>債券</strong>——現金流明確、估值清楚，是機構最積極代幣化的標的。延伸閱讀：<a href="/technical/rwa-bond-tokenization/">〈債券代幣化〉</a>。</li>
  <li><strong>基金</strong>——BlackRock BUIDL、Franklin Templeton BENJI 都屬此類。</li>
  <li><strong>黃金與大宗商品</strong>——實體保管 + 鏈上憑證的組合，信任轉移是關鍵。延伸閱讀：<a href="/technical/rwa-gold-tokenization/">〈黃金代幣化〉</a>。</li>
  <li><strong>股票與不動產</strong>——監管最複雜、但想像空間最大。</li>
</ol>

<h3 id="六台灣站在哪裡">六、台灣站在哪裡？</h3>

<p>台灣其實不算落後。2024 年 6 月，金管會宣布協同集保（TDCC）與多家金融機構成立「RWA 代幣化小組」，以債券與基金進行概念驗證，並在 2025 年完成期末實證報告，認定技術「實證可行」。</p>

<p>台灣有一個全球相對罕見的特點：<strong>由集保這個證券集中保管機構直接主導平台建置</strong>。這意味著基礎設施層面的保障較強。不過最大的缺口是<strong>穩定幣</strong>——沒有合規的新台幣穩定幣，鏈上的「券款對付」就難以完全實現。好消息是，台灣規劃最快在 2026 下半年隨《虛擬資產服務法》推出穩定幣框架。</p>

<p>我認為，2026 年正是台灣金融業的關鍵窗口：國際標準已經收斂、法規方向逐漸清晰、技術也驗證可行。剩下的，是誰能最快把這套國際語言，接上台灣自己的市場制度。</p>

<h3 id="結語">結語</h3>

<p>RWA 不是又一個會泡沫化的加密熱詞。它的底層邏輯——<strong>讓資產 24/7 自由流動、即時結算、全球可驗證</strong>——指向的是一套更有效率的金融基礎設施。穩定幣是入口，RWA 是橋樑。</p>

<p>接下來，這個系列我會分別深入黃金、債券、合規標準與全球監管。如果你的團隊正在評估 RWA 的可能性，或想為組織建立 Web3 的知識基礎，歡迎了解我的 <a href="/technical/">技術顧問服務</a> 與 <a href="/education/crypto/">Web3 企業內訓</a>。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[RWA（現實世界資產代幣化）是 2026 年最受關注的金融科技趨勢。一篇看懂 RWA 的定義、為什麼資產要上鏈、全球市場規模、五大資產類別，以及台灣的機會與挑戰。]]></summary></entry><entry><title type="html">黃金代幣化：從黃金存摺到鏈上黃金，信任如何轉移？</title><link href="https://swanky.github.io/technical/rwa-gold-tokenization/" rel="alternate" type="text/html" title="黃金代幣化：從黃金存摺到鏈上黃金，信任如何轉移？" /><published>2026-05-30T16:04:00+00:00</published><updated>2026-05-30T16:04:00+00:00</updated><id>https://swanky.github.io/technical/rwa-gold-tokenization</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-gold-tokenization/"><![CDATA[<p>在所有 RWA（現實世界資產代幣化）的應用裡，黃金大概是最容易理解、卻又藏著最微妙設計問題的一種。它不像債券有複雜的現金流，也不像股票牽涉公司治理——黃金就是黃金，一塊金屬。但正因為它是「實體」，把它搬上鏈時會遇到一個債券不會遇到的根本問題：<strong>那塊金屬，到底放在哪裡？</strong></p>

<p>這篇是我 RWA 系列的黃金篇。我會從黃金的金融屬性講起，帶你理解「黃金代幣化」真正在處理的，其實是一個<strong>信任轉移</strong>的問題。</p>

<h3 id="一黃金的雙重身分準貨幣--商品">一、黃金的雙重身分：準貨幣 + 商品</h3>

<p>人類用黃金當價值儲存超過五千年。它稀有、可分割、不氧化、價值密度高，這些物理特性讓它在沒有銀行的年代就成為跨地域的通用貨幣。1971 年尼克森讓美元與黃金脫鉤後，黃金「不再是貨幣，但仍是準貨幣」——當通膨高漲、地緣政治緊張、股市崩盤時，資金就湧向黃金避險。</p>

<p>這個雙重身分，對代幣化有個關鍵影響：黃金既不是純粹的支付工具，也不是純粹的證券（沒有發行人、不付息），而是<strong>準貨幣 + 商品的混合體</strong>。這讓黃金代幣化的法規定位，反而比債券更尷尬——它可能同時觸及證券、銀行與虛擬資產三套法規。</p>

<h3 id="二實體到金融的三層光譜">二、實體到金融的三層光譜</h3>

<p>「黃金」其實不是單一商品，而是一條從「最實體」到「最金融化」的光譜：</p>

<table>
  <thead>
    <tr>
      <th>形態</th>
      <th>在哪裡</th>
      <th>實體成分</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>實體金條 / 金幣</td>
      <td>保險庫</td>
      <td>最高</td>
    </tr>
    <tr>
      <td><strong>黃金存摺</strong></td>
      <td>銀行帳簿</td>
      <td>對應實體</td>
    </tr>
    <tr>
      <td>黃金 ETF</td>
      <td>基金公司</td>
      <td>對應實體</td>
    </tr>
    <tr>
      <td>黃金期貨 / 選擇權</td>
      <td>交易所</td>
      <td>無實物</td>
    </tr>
  </tbody>
</table>

<p>代幣化要找的，不是最左邊的實體金條（搬不動），也不是最右邊的衍生品（沒有實物），而是中間那一層——<strong>黃金存摺</strong>。</p>

<h3 id="三黃金存摺台灣人最熟悉的準代幣">三、黃金存摺：台灣人最熟悉的「準代幣」</h3>

<p>如果你在台銀、第一銀行或玉山銀行開過黃金存摺，你其實已經體驗過 RWA 的雛形。黃金存摺的本質是：<strong>你不持有實體黃金，但你的帳簿記錄代表你對實體黃金的權利。</strong> 銀行替你保管實體，你可以申購、贖回換現金、或提領實體。</p>

<p>台灣黃金存摺有兩個很在地的特徵：</p>

<ul>
  <li><strong>計量用「台錢」</strong>（1 台錢 = 3.75 公克），而不是國際慣用的盎司。這是為了親民——散戶習慣問「一台錢多少錢」，跟銀樓用語一致。</li>
  <li><strong>純度 999.9</strong>（99.99% 純金），是台灣黃金存摺的標準。</li>
</ul>

<p>把黃金存摺理解清楚，你就抓到了黃金代幣化的「上位概念」：<strong>所謂鏈上黃金，本質就是「黃金存摺的區塊鏈版本」——同樣對應實體，差別只在帳簿從銀行搬到了鏈上。</strong></p>

<h3 id="四為什麼黃金只能孿生不能原生">四、為什麼黃金「只能孿生，不能原生」？</h3>

<p>這是黃金代幣化最重要、也最常被忽略的設計分野。</p>

<p>代幣化資產有兩種出身：</p>

<ul>
  <li><strong>原生（native）</strong>：資產從第一天就在鏈上發行。債券可以這樣做——直接在鏈上發一檔新債。</li>
  <li><strong>孿生（twin）</strong>：鏈上代幣只是鏈下實體的「鏡像／證明」。</li>
</ul>

<p><strong>黃金必然是孿生的，不可能原生</strong>——因為實體黃金本來就躺在金庫裡，它不會憑空變成數位。所以黃金代幣化的核心動作永遠是一對：</p>

<ul>
  <li><strong>鑄幣（mint）= 鎖住實體 + 發出代幣</strong></li>
  <li><strong>銷毀（burn）= 燒掉代幣 + 解鎖實體</strong></li>
</ul>

<p>這對動作看似簡單，卻是整個信任架構的關鍵。因為它意味著——鏈上那枚代幣值不值錢，完全取決於「金庫裡真的有那塊金」這件事是否成立。</p>

<h3 id="五信任轉移代幣化真正在解決的問題">五、信任轉移：代幣化真正在解決的問題</h3>

<p>這就帶到了核心。當你把黃金搬上鏈，你並沒有消除信任，你只是<strong>把信任從一個地方轉移到另一個地方</strong>。</p>

<p>傳統黃金存摺，你信任的是銀行：相信它金庫裡真的有對應的金、相信它不會超發。黃金代幣化之後，鏈上的轉帳、餘額、總量變得公開透明、即時可驗證——但有一件事鏈永遠無法自己證明：<strong>金庫裡到底有沒有那塊金。</strong></p>

<p>這就是為什麼國際上每一個成功的黃金代幣，背後都站著一套「實體保管 + 定期審計 + 公開儲備證明」的機制：</p>

<ul>
  <li><strong>PAXG（Paxos Gold）</strong>：每一枚代幣對應一盎司存放於倫敦金庫、符合 LBMA Good Delivery 標準的實體金條，受紐約金融服務署監管，定期公布金條序號與審計報告。</li>
  <li><strong>XAUT（Tether Gold）</strong>：對應實體金條，持有人甚至可以查詢自己對應的金條編號。</li>
</ul>

<p>它們的共同點是：<strong>鏈解決了「流通」的信任，但「保管」的信任，仍然要靠受監管的託管方、實體審計與儲備證明來承擔。</strong> 代幣化沒有讓信任消失，它讓信任變得可以被切割、被驗證、被分層。</p>

<h3 id="六台灣做黃金代幣化的條件其實很好">六、台灣做黃金代幣化的條件其實很好</h3>

<p>回到台灣。我認為黃金是台灣 RWA 落地的好起點，原因有三：</p>

<ol>
  <li><strong>黃金存摺的基礎設施已經成熟</strong>——多家行庫經營多年，保管、純度、計量都有現成標準，代幣化等於替既有業務加一層鏈上帳本，而非從零打造。</li>
  <li><strong>散戶熟悉度高</strong>——台灣人對黃金存摺、對「台錢」毫不陌生，教育成本低。</li>
  <li><strong>法規觸及面雖廣但有跡可循</strong>——相比股票的公司治理問題，黃金的監管重點集中在「實體保管的真實性」與「投資人保護」，相對單純。</li>
</ol>

<p>當然，挑戰也真實存在：誰來保管、由誰審計、如何向投資人證明儲備、鏈上交易與銀行端撥轉如何對帳——這些都是把黃金存摺真正搬上鏈時，必須一一回答的工程與制度問題。</p>

<h3 id="結語">結語</h3>

<p>黃金代幣化的迷人之處，在於它把一個抽象的概念變得具體：<strong>RWA 從來不只是技術問題，而是「如何在數位世界裡，重建對實體的信任」。</strong> 鏈負責讓黃金 24 小時自由流動、即時交割、人人可驗證；而金庫、審計與監管，負責守住「那塊金真的存在」這個最後的信任錨點。</p>

<p>這個系列我也寫了另一篇從現金流角度切入的 <a href="/technical/rwa-bond-tokenization/">〈債券代幣化〉</a>，以及整個產業的 <a href="/technical/rwa-standards-evolution/">〈標準演進史〉</a>。如果還沒讀過總論，建議從 <a href="/technical/rwa-tokenization-overview/">〈RWA 是什麼〉</a> 開始。</p>

<blockquote>
  <p>想為你的團隊建立 Web3 與 RWA 的完整知識基礎？歡迎了解我的 <a href="/education/crypto/">Web3 企業內訓課程</a> 與 <a href="/technical/">技術顧問服務</a>。</p>
</blockquote>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[黃金代幣化是 RWA 最直觀的應用。一文看懂實體黃金到鏈上黃金的信任轉移、台灣黃金存摺的角色、為何黃金只能「孿生」不能「原生」，以及 PAXG、XAUT 的國際借鏡。]]></summary></entry><entry><title type="html">債券代幣化：為什麼債券是 RWA 的主戰場？談 DvP 與台灣市場機會</title><link href="https://swanky.github.io/technical/rwa-bond-tokenization/" rel="alternate" type="text/html" title="債券代幣化：為什麼債券是 RWA 的主戰場？談 DvP 與台灣市場機會" /><published>2026-05-30T16:03:00+00:00</published><updated>2026-05-30T16:03:00+00:00</updated><id>https://swanky.github.io/technical/rwa-bond-tokenization</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-bond-tokenization/"><![CDATA[<p>如果黃金是 RWA（現實世界資產代幣化）裡最直觀的應用，那債券就是最重要的<strong>主戰場</strong>。BlackRock、UBS、富蘭克林坦伯頓最早拿來代幣化的，幾乎都是債券或債券型基金。為什麼？因為債券有一個黃金沒有的特質：<strong>它的價值來自一串清清楚楚、可以寫進程式的現金流。</strong> 這讓它天生就適合智能合約。</p>

<p>這是我 RWA 系列的債券篇。我會從「債券到底是什麼」講起，帶你理解為什麼券款對付（DvP）是整件事的關鍵，以及台灣在這場賽局裡的位置。</p>

<h3 id="一債券就是一張借據">一、債券就是一張「借據」</h3>

<p>債券的本質一句話就能說完：<strong>借錢的人（發行人）給出錢的人（投資人）一張借據</strong>，承諾在到期日還本、在期間內定期付息。</p>

<p>任何一張債券，都由五個欄位定義：</p>

<table>
  <thead>
    <tr>
      <th>欄位</th>
      <th>意義</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>面額（Par Value）</td>
      <td>借了多少。台灣公債最小面額多為 10 萬元，公司債 100 萬元</td>
    </tr>
    <tr>
      <td>票面利率（Coupon Rate）</td>
      <td>每年付息的比率，乘上面額即為每期利息</td>
    </tr>
    <tr>
      <td>付息頻率</td>
      <td>一年付幾次（年付、半年付、季付）</td>
    </tr>
    <tr>
      <td>發行日 / 計息起日</td>
      <td>開始計息的日期</td>
    </tr>
    <tr>
      <td>到期日（Maturity）</td>
      <td>還本的日期，到期後債券消滅</td>
    </tr>
  </tbody>
</table>

<p>舉例：一檔 10 年期公債，面額 100 萬、票面利率 1.625%、年付一次。你每年 5/15 收到 16,250 元利息，10 年後拿回 100 萬本金。</p>

<p>注意這個結構——<strong>付息、還本、到期，每一個動作都有明確的日期與金額。</strong> 這正是它跟黃金最大的差別：黃金只是一塊靜態的金屬，債券卻是一台會自動吐錢的機器。把這台機器的規則寫進智能合約，配息與還本就能自動執行，這就是代幣化最誘人的地方。</p>

<h3 id="二台灣債券市場長什麼樣">二、台灣債券市場長什麼樣？</h3>

<p>談台灣的債券代幣化，得先認識幾個角色：</p>

<ul>
  <li><strong>發行人</strong>：政府（財政部國庫署發公債）、公司（發公司債）、銀行（發金融債）。台灣 2025 年中央政府公債餘額約 7 兆台幣，公司債約 4 兆，金融債約 3 兆。</li>
  <li><strong>櫃買中心（TPEx）</strong>：台灣的場外交易（OTC）市場。<strong>幾乎所有債券交易都在櫃買中心</strong>，而不是大家熟悉的證交所（證交所主要交易上市股票）。</li>
  <li><strong>集保（TDCC）</strong>：台灣的中央保管結算機構（CSD），地位等同美國的 DTC、歐洲的 Euroclear。所有上市櫃債券都在集保「無實體化」保管，交易後的款券交割也由它完成。</li>
</ul>

<p>這裡有個關鍵連結：在 <a href="/technical/rwa-standards-evolution/">〈RWA 代幣化標準演進史〉</a> 我提過，美國的 DTC 在 2025 年底獲得 SEC 授權啟動代幣化試點。而<strong>台灣的集保，正是台灣版的 DTC</strong>——當這個層級的機構出手，代表代幣化已經從加密圈進入了金融市場的核心基礎設施。</p>

<h3 id="三債券可以原生這是它和黃金的根本差異">三、債券可以「原生」，這是它和黃金的根本差異</h3>

<p>在黃金篇我談過「孿生 vs 原生」的分野。黃金只能孿生——實體金條躺在金庫，鏈上代幣只能當它的鏡像。但<strong>債券可以原生發行</strong>：直接在鏈上發一檔全新的債，從第一天起，這檔債的「正本」就在區塊鏈上，不存在「鏈下還有一份實體」的問題。</p>

<p>這個差異影響深遠：</p>

<ul>
  <li><strong>孿生債券</strong>：把現有的、已經在傳統系統裡的債券，搬一份鏡像上鏈。需要持續對帳，確保鏈上鏈下一致。</li>
  <li><strong>原生債券</strong>：鏈上即正本，沒有對帳問題，能完整發揮智能合約自動化的威力。</li>
</ul>

<p>UBS 在 2022 年發行的那檔全球首檔公開數位債券，以及後來的跨境回購交易，走的就是原生路線。原生發行是代幣化債券的理想型，但它也對法律「鏈上記錄即具法律效力」提出了更高的要求——這正是瑞士《DLT 法案》當年率先解決的問題。</p>

<h3 id="四dvp整件事的關鍵字">四、DvP：整件事的關鍵字</h3>

<p>如果你只記得這篇文章的一個詞，請記住 <strong>DvP（Delivery versus Payment，券款對付）</strong>。</p>

<p>傳統證券交易有個老問題：你把錢匯出去了，對方卻沒交券；或你把券交出去了，對方卻沒付錢。這就是「交割風險」。傳統市場靠 T+2（成交後兩天才交割）加上中央結算機構居中擔保來降低風險，但流程慢、佔用資金、且仍有對手方風險。</p>

<p>代幣化最大的價值，就是用智能合約實現<strong>原子交割</strong>——「一手交錢、一手交券」在同一筆鏈上交易裡同時完成，要嘛全部成功，要嘛全部回滾，中間不存在「錢付了券沒到」的空窗。這就是 DvP，而它能做到 T+0 甚至即時。</p>

<p>但 DvP 有個前提常被忽略：<strong>「Payment」那一端，也得在鏈上。</strong> 你需要鏈上的錢——也就是合規的穩定幣或央行數位貨幣（CBDC）——交割才能真正原子化。如果付款還停留在傳統銀行系統，那所謂的「鏈上 DvP」就只完成了一半。這也是為什麼穩定幣的進展，直接決定了債券代幣化能走多遠（我在 <a href="/technical/rwa-stablecoin-earthquake/">〈金融震央逼近〉</a> 詳談過穩定幣對台灣的衝擊）。</p>

<p>至於另一種交割模式 <strong>FOP（Free of Payment，款券分離）</strong>——券的移轉與付款各走各的、不掛鉤——則常用於同一投資人的內部移轉、繼承、或擔保品撥轉等不涉及對價的場景。一個成熟的代幣化債券平台，這兩種模式都要支援。</p>

<h3 id="五為什麼債券是台灣-rwa-的好起點">五、為什麼債券是台灣 RWA 的好起點？</h3>

<p>綜合來看，債券之所以是主戰場，有幾個務實的理由：</p>

<ol>
  <li><strong>現金流明確、估值清楚</strong>——付息還本都是確定的，最適合用智能合約自動化，也最容易讓監管與投資人理解。</li>
  <li><strong>機構需求真實存在</strong>——保險公司、退休基金需要長期固定收益來匹配長期負債，債券是它們的主食。代幣化能降低交割成本、提升效率。</li>
  <li><strong>台灣的基礎設施到位</strong>——集保作為 CSD 直接主導，櫃買中心的 OTC 制度成熟，債券無實體化早已是常態。代幣化是替既有制度加一層鏈上帳本，而非推倒重來。</li>
  <li><strong>國際標準已收斂</strong>——ERC-3643 與 CMTAT 已是機構發債的主流組合，台灣不需要重新發明輪子。</li>
</ol>

<p>當然，挑戰也很實際：缺乏合規的新台幣穩定幣，鏈上 DvP 的法幣端就補不齊；原生發行的法律效力需要法規明確背書；鏈上交易與傳統清算系統如何並行對帳，也是工程上的硬骨頭。但這些都是「怎麼做」的問題，而不是「能不能做」的問題——技術可行性，台灣的 POC 已經驗證過了。</p>

<h3 id="結語">結語</h3>

<p>債券代幣化的迷人之處，在於它把金融市場最核心、最龐大、卻也最老舊的一塊基礎設施，放到了一個可以即時結算、自動配息、全球流通的新軌道上。它不性感，但它是真正的主戰場——因為錢，最終都會流向效率最高的地方。</p>

<p>延伸閱讀本系列：<a href="/technical/rwa-tokenization-overview/">〈RWA 是什麼〉</a>（總論）、<a href="/technical/rwa-gold-tokenization/">〈黃金代幣化〉</a>、<a href="/technical/rwa-standards-evolution/">〈標準演進史〉</a>。</p>

<blockquote>
  <p>你的團隊正在評估債券或其他資產的代幣化嗎？歡迎了解我的 <a href="/technical/">技術顧問服務</a>，或為組織安排一場 <a href="/education/crypto/">Web3 企業內訓</a>。</p>
</blockquote>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[債券是機構最積極代幣化的資產。一文看懂債券的本質、台灣公債與櫃買中心制度、FOP 與 DvP 交割模式的差異，以及為什麼債券代幣化是台灣 RWA 的主戰場。]]></summary></entry><entry><title type="html">RWA 代幣化標準演進史：從 Colored Coins 到 ERC-3643 的十二年</title><link href="https://swanky.github.io/technical/rwa-standards-evolution/" rel="alternate" type="text/html" title="RWA 代幣化標準演進史：從 Colored Coins 到 ERC-3643 的十二年" /><published>2026-05-30T16:02:00+00:00</published><updated>2026-05-30T16:02:00+00:00</updated><id>https://swanky.github.io/technical/rwa-standards-evolution</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-standards-evolution/"><![CDATA[<p>如果你熟悉 ERC-20，你知道它的核心其實很簡單：一張餘額對照表，加上一個 <code class="language-plaintext highlighter-rouge">transfer</code> 函數。任何人可以把代幣轉給任何人，不問原因、不查身分。這在加密貨幣的世界裡運作得很好——但當你試圖把一張<strong>真正的債券</strong>、一檔<strong>真正的基金</strong>、或一塊<strong>真正的黃金</strong>放上鏈時，問題就來了。</p>

<p>這篇文章，是我這兩年沉浸在 RWA（Real World Assets，現實世界資產代幣化）領域後，整理出來的一條歷史主線。理解這段演進，你才會明白今天 ERC-3643 與 CMTAT 這些標準裡，每一個設計決策背後的「為什麼」。</p>

<h3 id="erc-20-的四個缺口">ERC-20 的四個缺口</h3>

<p>把受監管的金融資產放上鏈，ERC-20 至少有四件事做不到：</p>

<ul>
  <li><strong>誰能持有？</strong> 證券法要求發行人隨時知道持有人是誰。ERC-20 允許匿名轉帳，這在證券世界裡是違法的。</li>
  <li><strong>能不能凍結？</strong> 法院下令凍結資產時，你需要能鎖住特定地址的代幣。</li>
  <li><strong>能不能強制轉移？</strong> 繼承、司法執行、合規處分發生時，管理員需要在持有人不配合的情況下移動代幣。</li>
  <li><strong>分紅怎麼算？</strong> 債券要付息、基金要配息，你需要在特定時間點「快照」所有持有人的餘額。</li>
</ul>

<p>這四個缺口，正是過去十二年整個證券代幣標準演進想填補的洞。</p>

<h3 id="史前時代20142016想法有了土壤還沒到">史前時代（2014–2016）：想法有了，土壤還沒到</h3>

<p>2014 年前後，開發者在 Bitcoin 上做了最早的資產代幣化嘗試。<strong>Colored Coins</strong> 在交易中附加「顏色」標記代表鏈下資產，<strong>Mastercoin</strong>（後來的 Omni Layer）則在 Bitcoin 之上搭協議層——最早的 Tether（USDT）就是在這裡發行的。這些嘗試證明了一件事：<strong>人們確實想把現實世界資產放上鏈，但 Bitcoin 的架構不是為此設計的。</strong></p>

<p>2015 年 7 月 Ethereum 主網上線，帶來圖靈完備的智能合約。同年 11 月 ERC-20 誕生，成為代幣的通用語言。但 2016 年的 <strong>The DAO 事件</strong>（約 6,000 萬美元 ETH 被盜）給了所有人一記當頭棒喝：完全去中心化的程式碼一旦出錯，沒有「管理員」可以介入。這個教訓，讓後來設計證券代幣標準的人都得出同一個結論——<strong>受監管的金融資產，必須內建可暫停、可凍結、可強制轉移的管理員角色。</strong></p>

<h3 id="寒武紀大爆發20172018三條路線同時啟動">寒武紀大爆發（2017–2018）：三條路線同時啟動</h3>

<p>2017 年 ICO 狂潮全年募資超過 56 億美元，但大量項目是詐騙。2018 年 SEC 鐵腕執法，明確表態：<strong>把證券放上區塊鏈，不會改變它是證券的事實。</strong> 產業這才意識到，合規必須從標準層面內建。於是 2018 年同時冒出三條哲學迥異的路線：</p>

<ol>
  <li><strong>ERC-1400（Polymath）</strong>——第一個完整的證券代幣標準族群，定義了強制轉移、文件管理、操作者控制等功能清單。野心極大，但因為過於龐大複雜，<strong>始終未獲 EIP Final，停留在 Draft</strong>。</li>
  <li><strong>ERC-1404</strong>——極簡派的回答。不重新發明標準，只在 ERC-20 上加一個 <code class="language-plaintext highlighter-rouge">detectTransferRestriction()</code> 函數回傳限制碼。後來被 CMTAT 採用為基本轉帳驗證介面。</li>
  <li><strong>T-REX（Tokeny）</strong>——最激進的一條，把 KYC/AML 身分驗證<strong>直接寫進鏈上</strong>。每個投資人有一個鏈上身分合約（ONCHAINID），每筆轉帳先檢查身分聲明才放行。這條路線後來成為 <strong>ERC-3643</strong>。</li>
</ol>

<p>同年，瑞士的律師事務所、線上銀行與銀行軟體商聯手成立了 <strong>CMTA</strong>（資本市場與技術協會），開始規劃日後的 <strong>CMTAT</strong>。它選擇了第四種哲學：<strong>模組化、法規中立、不綁定特定身分方案</strong>——代幣核心只管 mint/burn/transfer/pause/freeze/snapshot，把合規檢查交給外部系統。</p>

<h3 id="分層共識的形成">分層共識的形成</h3>

<p>這場競爭沒有出現「一個標準統一天下」的結局。相反，產業逐漸形成了<strong>分層共識</strong>：</p>

<table>
  <thead>
    <tr>
      <th>分層</th>
      <th>職責</th>
      <th>代表標準</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>代幣核心層</td>
      <td>mint / burn / 凍結 / 快照 / 強制轉移</td>
      <td>CMTAT</td>
    </tr>
    <tr>
      <td>身分與合規層</td>
      <td>誰能持有、轉帳是否合規</td>
      <td>ERC-3643</td>
    </tr>
    <tr>
      <td>規則引擎</td>
      <td>可插拔的業務規則（國別、持倉上限）</td>
      <td>RuleEngine</td>
    </tr>
  </tbody>
</table>

<p>ERC-1400 雖然自己沒成為正式標準，卻<strong>定義了問題空間</strong>；它的子標準 ERC-1643（文件管理）被 CMTAT 直接採用。這就是「先驅者的遺產」。</p>

<h3 id="瑞士先行20202022法律框架才是充分條件">瑞士先行（2020–2022）：法律框架才是充分條件</h3>

<p>2021 年 2 月，瑞士《DLT 法案》生效，成為<strong>全球第一部明確承認代幣化證券法律地位的國家級立法</strong>。緊接著，瑞士銀行界用 CMTAT 發行結構性產品；2022 年 11 月，<strong>UBS 發行全球首檔公開交易、同時在區塊鏈與傳統交易所結算的數位債券</strong>——一筆 3.75 億瑞郎的三年期債券。這不是 POC，是真金白銀。</p>

<p>瑞士能走在前面，不是因為市場最大，而是因為<strong>法律框架最先到位</strong>。這個經驗很關鍵：技術標準成熟只是必要條件，法律配合才是充分條件。</p>

<h3 id="機構入場20232024大象開始跳舞">機構入場（2023–2024）：大象開始跳舞</h3>

<ul>
  <li><strong>2024 年，ERC-3643 獲得 EIP Final 狀態</strong>——這是迄今<strong>唯一</strong>達到 Final 的證券代幣標準。背後的 ERC-3643 Association 成員包括 DTCC、Apex Group、Invesco。</li>
  <li><strong>2024 年 3 月，BlackRock 與 Securitize 推出 BUIDL</strong> 代幣化國債基金，六週內規模達 3.75 億美元，到 2025 年 8 月超過 23 億美元。當全球最大、最保守的資產管理公司都開始代幣化，這就不再是「實驗」而是「趨勢」。</li>
  <li><strong>2024 年 6 月，台灣金管會宣布</strong>協同集保（TDCC）與六家金融機構成立「RWA 代幣化小組」，以債券、外幣債券、基金三類商品進行概念驗證。</li>
  <li>同年，歐盟 <strong>MiCA</strong> 開始分階段實施，但明確排除已受 MiFID II 監管的證券型代幣——代幣化證券在歐盟已有現成法律框架。</li>
</ul>

<h3 id="美國覺醒20252026一年走完別人三年的路">美國覺醒（2025–2026）：一年走完別人三年的路</h3>

<p>美國的故事最戲劇性。2025 年 7 月 <strong>GENIUS Act</strong> 建立聯邦穩定幣框架（解決了「鏈上結算需要鏈上的錢」這個基礎設施問題）。2025 年 12 月，SEC 對 <strong>DTC</strong>（美國的集保）發出 No-Action Letter，授權三年期代幣化試點，標的限於 Russell 1000 成分股、美國國債與主要指數 ETF。進入 2026 年，SEC 與 CFTC 聯合發布<strong>加密資產五類分類法</strong>（數位商品、數位收藏品、數位工具、穩定幣、數位證券），4 月更批准 Nasdaq 交易代幣化證券。</p>

<p>到了 2026 年，當全球最大資本市場（DTC）與最大證券交易所（Nasdaq）都開始代幣化，問題已經<strong>不是「是否」，而是「多快」</strong>。</p>

<h3 id="台灣的位置務實的後發先至">台灣的位置：務實的後發先至</h3>

<p>台灣其實很早就注意到趨勢。2019 年金管會發布 STO 規範，但限制過嚴（募資上限低、僅限專業投資人），結果幾年下來申請案寥寥無幾。這個教訓讓後來的策略明顯轉向<strong>「先做 POC、先驗證技術，法規調適後行」</strong>。</p>

<p>放到全球座標看，台灣有幾個獨特之處：<strong>集保（CSD）直接主導平台建置</strong>，這在全球相對罕見；台灣啟動的時間點恰好落在 2026 這個「全球從試驗走向基礎建設」的元年，可以借鑒他人經驗而不必當試錯的先行者。最大的缺口仍是穩定幣——沒有合規穩定幣，鏈上 DvP（券款對付）就難以完全實現。關於穩定幣對台灣金融業的衝擊，我在 <a href="/technical/rwa-stablecoin-earthquake/">〈金融震央逼近：天才法案、新台幣穩定幣與 RWA 引爆的產業地震〉</a> 有更完整的討論。</p>

<h3 id="標準成熟度總評">標準成熟度總評</h3>

<table>
  <thead>
    <tr>
      <th>標準</th>
      <th>狀態</th>
      <th>定位</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>ERC-3643</strong></td>
      <td><strong>Final ✅</strong></td>
      <td>唯一 Final 證券代幣標準，逾 320 億美元資產、180+ 司法管轄區</td>
    </tr>
    <tr>
      <td><strong>CMTAT</strong></td>
      <td>Production（非 EIP）</td>
      <td>v3.0.0 通過 Halborn 審計，UBS／Taurus 等生產使用</td>
    </tr>
    <tr>
      <td><strong>ERC-1400</strong></td>
      <td>Draft（未完成）</td>
      <td>歷史影響：定義了證券代幣功能集</td>
    </tr>
    <tr>
      <td><strong>ERC-7943 (uRWA)</strong></td>
      <td>Review</td>
      <td>未來方向：統一 RWA 介面，CMTAT 已率先實作</td>
    </tr>
  </tbody>
</table>

<p>整體判斷：<strong>核心標準（ERC-3643 + CMTAT）已可投入生產，但生態系仍在快速演進。</strong> 兩者搭配——CMTAT 負責代幣核心、ERC-3643 負責身分合規——正是 CMTA 自己推薦、也是國際機構最常見的架構。它們之間的設計哲學差異，我另外寫了一篇 <a href="/technical/rwa-compliant-token-standards/">〈合規型代幣標準：ERC-3643 與 ERC-1404 的設計哲學〉</a> 專門拆解。</p>

<h3 id="結語站在十二年的肩膀上">結語：站在十二年的肩膀上</h3>

<p>從 2014 年 Colored Coins 的粗糙嘗試，到 2018 年三條路線的寒武紀大爆發，到 2022 年 UBS 的真金白銀，到 2024 年 BlackRock 的大象跳舞，到 2026 年美國 DTC／Nasdaq 的全面擁抱——這條路走了十二年。</p>

<p>對台灣的金融機構與技術團隊來說，好消息是：<strong>標準與架構的選擇題，國際上已經幫我們收斂得差不多了。</strong> 真正的功課，是把這套國際語言，接上台灣的法規、市場制度與既有的集保／清算基礎設施。這也正是我在 RWA 顧問工作裡最常被問到的問題。</p>

<blockquote>
  <p>想更系統地理解 RWA 與 Web3 在金融場景的應用？歡迎參考我的 <a href="/education/crypto/">Web3 企業內訓課程</a>，或閱讀本系列其他文章。</p>
</blockquote>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[從 2014 年 Colored Coins 到 2024 年 ERC-3643 成為唯一 Final 證券代幣標準——一篇看懂 RWA 代幣化標準的十二年演進，以及 CMTAT 為何成為機構首選。]]></summary></entry><entry><title type="html">合規型代幣標準：ERC-3643 與 ERC-1404 的設計哲學</title><link href="https://swanky.github.io/technical/rwa-compliant-token-standards/" rel="alternate" type="text/html" title="合規型代幣標準：ERC-3643 與 ERC-1404 的設計哲學" /><published>2026-05-30T16:01:00+00:00</published><updated>2026-05-30T16:01:00+00:00</updated><id>https://swanky.github.io/technical/rwa-compliant-token-standards</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-compliant-token-standards/"><![CDATA[<p>這是我 RWA 系列裡技術含量最高的一篇，寫給正在評估證券代幣架構的工程師與技術主管。如果你還不熟悉 RWA 標準的整體脈絡，建議先讀 <a href="/technical/rwa-standards-evolution/">〈RWA 代幣化標準演進史〉</a>，再回來看這篇的設計細節。</p>

<p>受監管的金融資產代幣化，核心只有一個技術問題：<strong>transfer 不能總是放行。</strong> KYC 沒過的人不能持有、凍結帳戶不能轉出、鎖定期內不能提早轉、黑名單地址要擋下來。問題是——<strong>這個「准不准」的判斷邏輯，該放在哪裡？</strong> 圍繞這個問題，業界演化出兩種截然不同的哲學。</p>

<h3 id="一簡化派erc-1404-的極簡主義">一、簡化派：ERC-1404 的極簡主義</h3>

<p>ERC-1404（2018 年起草，至今仍是 draft EIP）給出的答案極簡。它的<strong>全部介面只有兩個函數</strong>：</p>

<div class="language-solidity highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">interface</span> <span class="n">IERC1404</span> <span class="p">{</span>
    <span class="k">function</span> <span class="n">detectTransferRestriction</span><span class="p">(</span><span class="kt">address</span> <span class="n">from</span><span class="p">,</span> <span class="kt">address</span> <span class="n">to</span><span class="p">,</span> <span class="kt">uint256</span> <span class="n">value</span><span class="p">)</span>
        <span class="k">external</span> <span class="k">view</span> <span class="k">returns</span> <span class="p">(</span><span class="kt">uint8</span><span class="p">);</span>          <span class="c1">// 0 = 放行，非 0 = 拒絕碼
</span>
    <span class="k">function</span> <span class="n">messageForTransferRestriction</span><span class="p">(</span><span class="kt">uint8</span> <span class="n">restrictionCode</span><span class="p">)</span>
        <span class="k">external</span> <span class="k">view</span> <span class="k">returns</span> <span class="p">(</span><span class="kt">string</span> <span class="k">memory</span><span class="p">);</span>  <span class="c1">// 把拒絕碼轉成人類可讀訊息
</span><span class="p">}</span>
</code></pre></div></div>

<p>它的主張是：<strong>標準只規範「怎麼問」，不規範「怎麼判斷」。</strong> 至於規則邏輯是白名單、Merkle proof、ZK proof 還是外部 oracle，全由實作者自己決定。</p>

<p>這種設計的優點是彈性極大、相容性負擔極小——任何 ERC-20 加上這兩個函數就能接上 ERC-1404 工具鏈，連 Etherscan、MetaMask 都能自動顯示「為什麼這筆轉帳被擋」。缺點則是它<strong>幾乎什麼都沒幫你做</strong>：沒有身分概念、沒有 claim 撤銷、沒有跨代幣互通，甚至連「transfer 前一定要呼叫這個函數」都不強制——標準只說「這個函數存在可被呼叫」，實際的攔截要實作者自己 wire 進 <code class="language-plaintext highlighter-rouge">_update</code> 或 <code class="language-plaintext highlighter-rouge">_beforeTokenTransfer</code>。</p>

<h3 id="二整合派erc-3643-的完整框架">二、整合派：ERC-3643 的完整框架</h3>

<p>ERC-3643（前身是 Tokeny 的 T-REX，2024 年成為唯一 Final 的證券代幣標準）走的是完全相反的路。它不只規範一個介面，而是規範<strong>身分、合規、代幣三層的完整框架</strong>，由六個合約組成：</p>

<table>
  <thead>
    <tr>
      <th>合約</th>
      <th>角色</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Token</td>
      <td>ERC-20 相容代幣，每筆轉帳前強制檢查合規</td>
    </tr>
    <tr>
      <td>Identity Registry (IR)</td>
      <td>合格投資人的鏈上身分入口</td>
    </tr>
    <tr>
      <td>IR Storage</td>
      <td>身分資料儲存（可跨代幣共用）</td>
    </tr>
    <tr>
      <td>Claim Topics Registry</td>
      <td>定義此代幣需要哪些聲明（KYC、合格投資人…）</td>
    </tr>
    <tr>
      <td>Trusted Issuers Registry</td>
      <td>定義哪些聲明發行者可信</td>
    </tr>
    <tr>
      <td>Modular Compliance</td>
      <td>可插拔的合規模組（國別、持倉上限…）</td>
    </tr>
  </tbody>
</table>

<p>關鍵差異在「強制程度」。ERC-3643 規範白紙黑字寫著：代幣在任何 transfer 或 mint 之前，<strong>必須（MUST）</strong>透過 Identity Registry 驗證接收方身分。實作者沒有選擇權。每個投資人在鏈上有一個身分合約（ONCHAINID），上面掛著由受信任第三方<strong>簽章</strong>的聲明，可驗真偽、可撤銷、可過期。</p>

<p>這套框架的好處是「opinionated」——開發者不必再煩惱身分系統怎麼設計、合規模組怎麼接，而且不同代幣可以共用同一套身分基礎設施。代價則是「重」：哪怕你只想發一個沒有 KYC 要求的穩定幣，也得部署五個（大多是空的）合規合約；每筆轉帳要跨多個合約做五次以上的函數呼叫，gas 成本明顯較高；加上 T-REX 實作採 GPL-3.0、合規模組採 CC-BY-NC（禁商用），對商用平台並不友善。</p>

<h3 id="三一張表看懂兩派取捨">三、一張表看懂兩派取捨</h3>

<table>
  <thead>
    <tr>
      <th>維度</th>
      <th>ERC-1404（簡化派）</th>
      <th>ERC-3643（整合派）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>介面規模</td>
      <td>2 個函數</td>
      <td>6 個合約、數十個函數</td>
    </tr>
    <tr>
      <td>強制程度</td>
      <td>弱（只規範介面）</td>
      <td>強（規範整合方式）</td>
    </tr>
    <tr>
      <td>身分概念</td>
      <td>無，自理</td>
      <td>IR + ONCHAINID 完整框架</td>
    </tr>
    <tr>
      <td>Claim 簽章</td>
      <td>無</td>
      <td>✅ 內建可撤銷／過期</td>
    </tr>
    <tr>
      <td>跨代幣共用</td>
      <td>❌</td>
      <td>✅ 共用身分儲存</td>
    </tr>
    <tr>
      <td>每筆轉帳 gas</td>
      <td>1 次呼叫</td>
      <td>5+ 次呼叫</td>
    </tr>
    <tr>
      <td>學習曲線</td>
      <td>數小時</td>
      <td>數天</td>
    </tr>
    <tr>
      <td>適用場景</td>
      <td>輕量受限代幣、特殊規則</td>
      <td>機構級 RWA、跨機構 KYC</td>
    </tr>
  </tbody>
</table>

<p>本質上，這就是軟體工程裡老掉牙的辯論——<strong>「unopinionated library」對上「opinionated framework」</strong>——在 RWA 領域的具體呈現。Library 給你自由與責任，framework 給你規範與約束。沒有絕對的對錯，只有適不適合。</p>

<h3 id="四cmtat-的解法不選邊站">四、CMTAT 的解法：不選邊站</h3>

<p>最有意思的，是瑞士 CMTA 推出的 <strong>CMTAT</strong> 給出的第三條路。它的策略是：<strong>所有介面我都實作，讓外部生態自己選用哪個。</strong></p>

<p>CMTAT v3.0.0 同時實作了 ERC-1404、ERC-3643（部分介面）、以及最新的 ERC-7943（uRWA）。所以對外部觀察者，同一個 CMTAT 代幣會同時暴露：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">detectTransferRestriction(from, to, value) → uint8</code>（ERC-1404 介面）</li>
  <li><code class="language-plaintext highlighter-rouge">canTransfer(from, to, value) → bool</code>（ERC-3643 介面）</li>
</ul>

<p>這兩個函數內部其實呼叫<strong>同一條檢查鏈</strong>（部分凍結餘額 → 暫停／凍結狀態 → RuleEngine 自訂規則），只是回傳格式不同。也就是說，不論對接方支援哪個介面，CMTAT 都能溝通。</p>

<p>但 CMTAT 有一個刻意的留白：它實作 ERC-3643 的合規介面，卻<strong>不實作 ERC-3643 的鏈上身分部分</strong>（IdentityRegistry、ONCHAINID 那一套）。官方文件明寫「without on-chain identity」。這個取捨很關鍵：</p>

<ul>
  <li><strong>不綁定特定身分系統</strong>——你可以接 ERC-3643 的 IR、自寫一套、或完全不用，透過 RuleEngine 外掛規則即可；</li>
  <li><strong>授權乾淨</strong>——CMTAT 採 MPL-2.0（弱 copyleft、允許商用），不必 fork T-REX 的 GPL-3.0 程式碼；</li>
  <li><strong>解耦</strong>——代幣核心與合規規則分離，規則可插拔升級，不必動到代幣本身。</li>
</ul>

<p>這正是為什麼 UBS、Taurus、21Shares 等機構在生產環境裡選擇 CMTAT 當代幣核心、再視需求外接 ERC-3643 風格的身分層。它取了整合派的架構優勢，又保留了簡化派的彈性與乾淨授權。</p>

<h3 id="五所以該怎麼選">五、所以該怎麼選？</h3>

<p>如果要我給一個務實的建議，會是這樣：</p>

<ul>
  <li><strong>發輕量、規則單純的代幣</strong>（例如內部積分、簡單受限代幣）：ERC-1404 足矣，別過度工程。</li>
  <li><strong>發機構級、需要跨機構 KYC 互認的證券代幣</strong>：直接採用 ERC-3643 框架，享受它成熟的生態與工具。</li>
  <li><strong>想要長期彈性、又在意授權與 gas</strong>：CMTAT 作為代幣核心 + RuleEngine 外接規則，是目前國際機構最常見、也最平衡的組合。</li>
</ul>

<p>值得一提的是，標準還在演進。ERC-7943（uRWA）試圖統一所有 RWA 代幣的最小介面（涵蓋 ERC-20／721／1155），CMTAT 已率先實作。整合派的下一代，可能會比 ERC-3643 更輕、更通用。</p>

<h3 id="結語">結語</h3>

<p>合規型代幣標準的演進，其實是一部「如何讓區塊鏈聽法律的話」的工程史。ERC-1404 與 ERC-3643 不是對立，而是光譜的兩端；CMTAT 則證明了——<strong>好的架構不必選邊站，而是把選擇權留給使用者。</strong> 這對任何在設計受監管系統的工程師，都是一個值得記住的設計哲學。</p>

<p>延伸閱讀本系列：<a href="/technical/rwa-tokenization-overview/">〈RWA 是什麼〉</a>、<a href="/technical/rwa-standards-evolution/">〈標準演進史〉</a>、<a href="/technical/rwa-bond-tokenization/">〈債券代幣化〉</a>。</p>

<blockquote>
  <p>需要為團隊深入解析 RWA 技術架構或 Web3 標準？歡迎了解我的 <a href="/technical/">技術顧問服務</a> 與 <a href="/education/crypto/">Web3 企業內訓</a>。</p>
</blockquote>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[ERC-3643 與 ERC-1404 代表 RWA 合規型代幣的兩種哲學：整合派框架 vs 簡化派介面。一文看懂兩者的取捨、gas 與授權差異，以及 CMTAT 為何選擇同時支援兩者。]]></summary></entry><entry><title type="html">我也是 Prince 口中那種「該被裁掉」的中階主管—所以決定重新變回建造者</title><link href="https://swanky.github.io/technical/mid-manager-becomes-builder/" rel="alternate" type="text/html" title="我也是 Prince 口中那種「該被裁掉」的中階主管—所以決定重新變回建造者" /><published>2026-05-23T00:00:00+00:00</published><updated>2026-05-23T00:00:00+00:00</updated><id>https://swanky.github.io/technical/mid-manager-becomes-builder</id><content type="html" xml:base="https://swanky.github.io/technical/mid-manager-becomes-builder/"><![CDATA[<p>今天滑到 <a href="https://www.instagram.com/p/DYnAClDkrFZ/">Fox 分享的一篇文章</a>，是 Cloudflare 執行長 Matthew Prince 寫的，讀完有點刺耳，但很值得想一想。</p>

<p>他說兩週前裁掉了公司超過 20% 的員工，理由不是經營不善——剛好相反。Cloudflare 交出破紀錄的營收成長、強勁的自由現金流，全球新客戶數也創新高。在美國商業史上，幾乎找不到第二個案例：一家上市公司年增超過 30% 的同時，還砍掉兩成的人。而他認為，這很可能在這一年變成新常態。</p>

<p>Prince 的論點不是「AI 要取代所有人」，而是更精準的一刀：AI 衝著「衡量者」（measurers）而來。</p>

<p>他把組織裡的人分成三種角色——建造者（builders）做出產品、銷售者（sellers）把價值帶到市場，而衡量者（measurers）負責稽核、彙整、監控、協調、報表與中介管理。說白一點，就是那些靠「掌握資訊、整理資訊、轉譯資訊」而存在的角色。被他大量裁掉的，絕大多數是第三種，尤其是中階主管那一層。</p>

<p>理由很直白：這些工作不是不重要，而是 AI 出現後，它們不再稀缺。AI 不會累、能獨立運作、隨時待命，能用過去連最頂尖員工都做不到的精準度去衡量一個組織。過去內部稽核一季只能挑幾個重點來看，現在每一項風險都能被持續稽核。</p>

<p>他把這套說法接到了 Peter Drucker 1954 年《The Practice of Management》的經典命題：企業存在的唯一正當目的是「創造顧客」，而真正會「產出成果」的職能只有兩個——創新與行銷，其餘一切都是成本。Prince 等於把 Drucker 那句「其餘皆為成本」裡的「其餘」，重新命名成「衡量者」。（補個小細節：嚴格講 Drucker 當年提的是兩分法，三分法是 Prince 自己的延伸，但我覺得延伸得相當到位。）</p>

<p>這對我特別有感，因為我自己在公司裡就是中階主管。坦白說，中階主管很容易不小心變成「出一張嘴的衡量者」：問進度、追 Jira、看報表、開會、確認誰 delay、把狀態彙整給更上層。</p>

<p>最近公司在推 AI First 與 Agentic Engineering，我反而有種被迫重開機的感覺。以前主管站在旁邊看儀表板就好，現在如果還只會看儀表板，就很危險。</p>

<p>所以我做了一件有點反直覺的事：把自己重新丟回去當「建造者」。不是當進度警察，而是當交付系統的設計師；不是當報表搬運工，而是當風險與價值的判斷者。</p>

<p>具體來說，未來重要的可能不是誰多寫幾行程式，而是誰能把需求變成清楚的 AI 可讀規格、把規則與案例轉成 SDD 文件、讓 Claude Code 或 Codex 這類工具產出可驗證的實作，再用自動化測試工具證明功能真的完成。主管不是消失，而是角色改變——從衡量者，重新變回建造者。</p>

<p>做著做著我才發現，這個過程其實是在幫自己重新長出「創新」那條肌肉。AI 沒有把我推出局，反而把我從衡量者拉回了建造者。</p>

<p>這也讓我想通一件事：Builders / Sellers / Measurers 不是三種「身分」，而是三種「你當下在做的事」。你不是天生哪一種，你是可以移動的。AI 壓縮的是「角色」，不是「人」——你要做的，是把自己挪到還在產出成果的那一邊。</p>

<p>早上去學校兼課，也有同學反映，現在很多大學生對 AI 很焦慮，覺得入門的工作好像都被拿走了，書還沒念完就先感受到壓力。以前菜鳥可以從練習寫會議記錄開始了解組織運作的方式，現在可能連這個機會都被消失。</p>

<p>我能理解。但我想說，AI 不是單純把機會關掉，而是把職場的入場門檻重新洗牌。以前你靠一項技能就能進場——寫程式、做簡報、整理資料、寫報告——未來這些還重要，但不再足夠。真正的關鍵，是你能不能用 AI 擴張自己的能力邊界。</p>

<p>所以也想跟 IT 工程師朋友講一句可能不太中聽的話：別把「我會寫程式」這件事看得太神聖。</p>

<p>coding 能力當然重要，但如果只守著這座城堡，不願意理解產品、商業、顧客、風險與行銷，那座城堡有一天可能不是被攻破，而是被整張地圖更新掉。未來的工程師不能只問「這個功能怎麼做」，也要開始問：這個功能為誰創造價值？背後的商業假設是什麼？我們怎麼驗證它真的有用？</p>

<p>順著 Drucker 的邏輯，會產出成果的有兩條腿：創新跟行銷。我把建造者那條腿補回來了，那另一條呢？所以我接下來想認真研究的，是怎麼用 AI 補強自己一直比較弱的行銷與顧客理解—對工程背景的人來說，這塊往往最被忽略，卻最值錢。</p>

<p>回到那些焦慮的同學：我不會騙你們說 AI 不會影響工作，它會，而且影響很大。但它真正淘汰的，不是某個職稱，而是「只做衡量、不產出成果」的那種工作型態。</p>

<p>AI 時代最危險的，是我們以為自己還在創造價值，其實只是坐在價值旁邊，幫它量體溫。</p>

<p>而好消息是——這次要站在哪一邊，真的有得選。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[回應 Cloudflare CEO Matthew Prince 的裁員論述，從中階主管視角談 AI 時代如何從衡量者轉變為建造者。]]></summary></entry><entry><title type="html">我們不缺 AI 寫的文件，我們缺願意被讀完的文件</title><link href="https://swanky.github.io/technical/ai-document-human-comprehension/" rel="alternate" type="text/html" title="我們不缺 AI 寫的文件，我們缺願意被讀完的文件" /><published>2026-05-18T00:00:00+00:00</published><updated>2026-05-18T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-document-human-comprehension</id><content type="html" xml:base="https://swanky.github.io/technical/ai-document-human-comprehension/"><![CDATA[<h3 id="從-ai-生成文件到人類理解介面">從 AI 生成文件，到人類理解介面</h3>

<p>最近讀到 Claude Code 團隊成員 Thariq Shihipar 寫的《The unreasonable effectiveness of HTML》，加上 Andrej Karpathy 的回應，讓我突然有種恍然大悟的感覺，原來很多業界頂尖也都沒有很想仔細看 AI 生了什麼內容因為真的太累人。</p>

<p>這個議題不只是「Markdown 跟 HTML 哪個比較好」。</p>

<p>它在提醒我們：<strong>AI 時代，文件的角色正在改變。</strong></p>

<hr />

<h3 id="markdown-為什麼一直是首選">Markdown 為什麼一直是首選？</h3>

<p>因為它「方便人類編輯」。</p>

<p>純文字、好寫、可進 Git、可 diff，對工程師再自然不過。規格、計劃、PR 說明、會議紀錄，大家都用它。</p>

<p>但 Thariq 點出一個尷尬的事實：</p>

<p>當 AI Agent 越來越強，我們已經很少自己編輯這些檔案了。</p>

<p>更常見的流程是：AI 產生 → 人類閱讀判斷 → 人類給回饋 → AI 修改 → 進入實作審查。</p>

<p>也就是說，Markdown 最大的優點 ——「容易讓人修改」—— 在 AI 協作流程裡，比重正在快速下降。</p>

<hr />

<h3 id="真正昂貴的不是寫文件">真正昂貴的不是寫文件</h3>

<p>最近我在團隊內推動 Claude Code、Example Mapping、OpenSpec 跟 Superpowers Skill，深刻體會到：</p>

<p><strong>AI 產 Markdown 的速度真的太快了。</strong></p>

<p>問題已經不是「AI 能不能寫文件」，而是 ——</p>

<p><strong>人會不會真的讀完？</strong></p>

<p>一份 200 行的規格，看起來很完整。但實務上主管、PM、工程師、QA 真的會逐行細讀嗎？更不用說要從裡頭快速判斷：這個需求 Ready 嗎？Example Mapping 有沒有漏掉情境？OpenSpec 的 scope 合理嗎？實作符合驗收條件嗎？PR 的風險在哪？</p>

<hr />

<h3 id="我現在的想法文件要分兩種角色">我現在的想法：文件要分兩種角色</h3>

<ul>
  <li><strong>Markdown 給 AI 與工作流程用</strong></li>
  <li><strong>HTML 給人類審查與決策用</strong></li>
</ul>

<p>實際上我們正在嘗試的流程長這樣：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Jira Story (Epic)
  → Example Mapping → example-map.md + review.html (審查 Ready)
  → OpenSpec proposal/spec/tasks + review.html (審查開工)
  → Claude Code 實作 + 自動化測試
  → validation-report.html (證據)
  → PR + pr-explainer.html (Reviewer 入口)
</code></pre></div></div>

<p>Markdown 沒被取代，它仍然適合被 Git 管、被 AI 讀、被工程師精準修改。</p>

<p>但 HTML 在這個流程裡扮演了另一個角色 ——<strong>它是審查介面。</strong></p>

<ul>
  <li><strong>example-map-review.html</strong> 把 Rules / Examples / Questions / Assumptions 視覺化，讓團隊一眼判斷需求清不清楚</li>
  <li><strong>openspec-review.html</strong> 把 scope、非目標、風險、資料流、驗收條件做成一頁，讓 Tech Lead 容易做決策</li>
  <li><strong>validation-report.html</strong> 把測試結果、Playwright 截圖、失敗案例放一起，讓 AI 不是只說「我做完了」，而是拿出證據</li>
  <li><strong>pr-explainer.html</strong> 把變更範圍、影響、風險點整理清楚，讓 Reviewer 直接抓到重點</li>
</ul>

<hr />

<h3 id="karpathy-的觀點把這件事再拉高一層">Karpathy 的觀點把這件事再拉高一層</h3>

<p>他的重點不是「HTML 比 Markdown 好」，而是在談人類與 AI 之間的輸入輸出頻寬。</p>

<p>人類給 AI 的輸入，未來會越來越偏向語音、指向、圈選、自然互動。AI 回給人類的輸出，不該永遠只是文字。</p>

<p>它應該更視覺化、更互動、更像一個可以被探索的介面。</p>

<p>AI 輸出格式的演進，大概是：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>raw text → Markdown → HTML → interactive simulation
</code></pre></div></div>

<hr />

<h3 id="對-it-團隊真正的意義">對 IT 團隊真正的意義</h3>

<p>在企業裡，真正昂貴的從來不是文件產生。</p>

<p>AI 已經把產文件的成本砍到極低。</p>

<p><strong>真正昂貴的是：需求被誤解、審查沒看懂就放行、測試證據不足、PR 風險沒被抓到、大家以為對齊了，其實腦中的畫面完全不同。</strong></p>

<p>所以推動 Agentic Engineering，不能只問：</p>

<p>❌ <strong>AI 有沒有幫我們寫更多文件？</strong></p>

<p>更該問：</p>

<p>✅ <strong>AI 有沒有幫我們建立更好的「理解介面」？</strong></p>

<p>如果只是 Markdown 變更多，團隊只是從「人寫的文件沒人看」，進化到「AI 寫的文件沒人看」。</p>

<p>那不是效率，那只是把文件山蓋得更快。</p>

<hr />

<h3 id="文件的新定位">文件的新定位</h3>

<p>所以我現在會這樣定位：</p>

<ul>
  <li><strong>Markdown 是工作流的底稿</strong></li>
  <li><strong>HTML 是人類審查的儀表板</strong></li>
  <li><strong>測試報告是 AI 完成工作的證據</strong></li>
  <li><strong>PR Explainer 是 Reviewer 進入脈絡的入口</strong></li>
</ul>

<p>文件已經不再只是記錄，它會變成工作流的一部分 —— 是人跟 AI 對齊的介面，也是需求、設計、實作、測試、審查之間的橋梁。</p>

<p>以前我們選 Markdown，是因為「人要容易寫」。當 AI 已經很會寫之後，問題該變成：</p>

<p><strong>「人要怎麼更容易理解？」</strong></p>

<p>AI 讓文件生成變便宜。但人的理解與決策，仍然非常昂貴。</p>

<hr />

<h3 id="相關資源">相關資源</h3>

<ul>
  <li>原文 Thariq Shihipar：<a href="https://x.com/trq212/status/2052809885763747935">https://x.com/trq212/status/2052809885763747935</a></li>
  <li>HTML 範例集：<a href="https://thariqs.github.io/html-effectiveness/">https://thariqs.github.io/html-effectiveness/</a></li>
</ul>

<p><strong>討論問題：</strong> 你的團隊現在怎麼用 AI 產文件？是越來越多 Markdown，還是已經開始往「人類可消化的介面」走了？歡迎留言聊聊。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[AI 時代文件的核心問題不是產生速度，而是人類理解效率。Markdown 應作工作流底稿，HTML 應成審查儀表板，重點是建立更好的「人機理解介面」。]]></summary></entry><entry><title type="html">把 AI 當成「更快的工程師」，是 IT 團隊最貴的誤解</title><link href="https://swanky.github.io/technical/ai-faster-engineer-misconception/" rel="alternate" type="text/html" title="把 AI 當成「更快的工程師」，是 IT 團隊最貴的誤解" /><published>2026-05-14T00:00:00+00:00</published><updated>2026-05-14T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-faster-engineer-misconception</id><content type="html" xml:base="https://swanky.github.io/technical/ai-faster-engineer-misconception/"><![CDATA[<h3 id="核心論點">核心論點</h3>

<p>推動 Claude Code 進團隊後，我更確認一件事：</p>

<blockquote>
  <p><strong>AI 越強，工程紀律越不能消失，必須升級。</strong></p>
</blockquote>

<p>這跟 Matt Wynne 的觀點不謀而合——AI coding agent 越來越強，但這不代表可以把需求丟給 AI 期待正確產出。反而相反，AI 越強，團隊越需要把以下問題講清楚：</p>

<ul>
  <li>什麼叫做「做對」？</li>
  <li>哪些情境必須驗收？</li>
  <li>哪些架構邊界不能破壞？</li>
  <li>如何證明 AI「真的」完成？</li>
</ul>

<p>尤其在企業級系統，「看起來可以跑」這四個字遠遠不夠。</p>

<h3 id="團隊的實踐工作鏈">團隊的實踐工作鏈</h3>

<h4 id="rm--saexample-mapping把需求拆清楚">【RM → SA】Example Mapping：把需求拆清楚</h4>

<p>不急著開 Jira ticket，先讓 PO、SA、RD、QA 對「什麼叫完成」有共同語言。規則、例子、邊界、未回答的問題，全部攤開。</p>

<p>需求模糊，AI 寫得再快也是錯的方向；需求清楚，AI 才有機會跑在正確軌道上。</p>

<h4 id="sa--sdopenspec把規格寫成-ai-也看得懂的形式">【SA → SD】OpenSpec：把規格寫成 AI 也看得懂的形式</h4>

<p>過去文件主要寫給人看，現在它也是 AI 的工作地圖。</p>

<ul>
  <li>地圖模糊，AI 走偏。</li>
  <li>邊界沒標，AI 鑽進不該碰的地方。</li>
</ul>

<p>規格不只是溝通工具，更是 AI 協作的護欄。</p>

<h4 id="pg-階段claude-code--superpower-skill把-ai-放上軌道">【PG 階段】Claude Code + Superpower Skill：把 AI 放上軌道</h4>

<p>讓 AI 依照 TDD 節奏、既有架構 pattern、CLAUDE.md 規範前進。</p>

<p>重點從來不是「AI 寫得多快」，而是「<strong>AI 有沒有被放在正確的軌道上</strong>」。</p>

<p>軌道對了，速度才有意義；軌道錯了，速度只是把錯誤放大的乘數。</p>

<h4 id="交付前用-gates-自動把關">【交付前】用 Gates 自動把關</h4>

<ul>
  <li>單元測試、整合測試、E2E、Playwright</li>
  <li>Lint、型別檢查、CI</li>
  <li>ADR review、安全掃描、mutation testing</li>
</ul>

<blockquote>
  <p><strong>AI 是加速器，gates 是煞車。</strong></p>

  <p><strong>沒有煞車的加速器，不是生產力，是風險放大器。</strong></p>
</blockquote>

<h3 id="工作方式的轉變">工作方式的轉變</h3>

<p>我們從關心「使用率」，變成關心「組織有沒有準備好，讓 AI 跑得快又跑得穩」：</p>

<ul>
  <li>我們的需求，AI 能正確理解嗎？</li>
  <li>我們的驗收條件，能被自動證明嗎？</li>
  <li>我們的 codebase pattern 夠清楚，讓 AI 跟得上嗎？</li>
  <li>我們的 CI 與測試，承接得住 AI 帶來的變更速度嗎？</li>
  <li>我們有沒有把團隊知識整理成「AI 可讀、新人也可讀」的工程資產？</li>
</ul>

<p>這些問題沒有快答案，但每一題都決定了 AI 協作的天花板。</p>

<h3 id="agentic-ai-時代的-it-團隊架構圖">Agentic AI 時代的 IT 團隊架構圖</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>🔧 Claude Code         = 引擎
🧭 Example Mapping     = 需求羅盤
🗺️ OpenSpec            = 規格地圖
🚗 Superpower Skill    = 駕駛習慣
🛑 測試與 CI           = 煞車系統
📜 ADR 與 CLAUDE.md    = 交通規則
</code></pre></div></div>

<p>少了任何一塊，AI 都可能從「助手」變成「技術債製造機」。</p>

<h3 id="結論">結論</h3>

<p>AI 協作不是一次性的工具導入，而是一套<strong>新的工程操作系統</strong>。</p>

<p>工程師不會消失，但角色變了——從「打字寫 code 的人」，變成<strong>定義問題、設計邊界、建立驗收、判斷風險</strong>的人。</p>

<p>最後想留下這句話：</p>

<blockquote>
  <p><strong>不是讓 AI 取代工程紀律。是用 AI，逼我們把工程紀律做得更清楚、更具體、更可驗證。</strong></p>
</blockquote>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[把 AI 當成「更快的工程師」是 IT 團隊最貴的誤解。AI 越強，工程紀律越不能消失，必須升級——清晰需求、明確驗收、架構邊界、自動化 gates，才是 AI 協作能跑得快又跑得穩的關鍵。]]></summary></entry><entry><title type="html">AI 寫 Code 越快，守住設計邊界的工程師越貴</title><link href="https://swanky.github.io/technical/ai-coding-design-boundaries/" rel="alternate" type="text/html" title="AI 寫 Code 越快，守住設計邊界的工程師越貴" /><published>2026-05-10T00:00:00+00:00</published><updated>2026-05-10T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-coding-design-boundaries</id><content type="html" xml:base="https://swanky.github.io/technical/ai-coding-design-boundaries/"><![CDATA[<h3 id="核心論點">核心論點</h3>

<p>許多人認為「代碼已經很便宜了，交給 AI 產就好」，但實際上只是「打字」這件事變便宜。引用 Matt Pocock 的觀點：”AI 時代，軟體工程基本功不是變得不重要，而是比以前更重要”。</p>

<h3 id="問題與現狀">問題與現狀</h3>

<p>不清晰的需求、缺乏設計、命名不一致、測試不完整、模組邊界混亂——這些問題不會因為 AI 變強而消失，反而會被 AI 放大。關鍵洞察：</p>

<blockquote>
  <p>以前一個工程師一天大概只寫出一點技術債。現在，AI 可以幫你一天生出一整片技術債森林。</p>
</blockquote>

<p><strong>乾淨 Codebase 的優勢：</strong> AI 成為 10 倍放大器
<strong>混亂 Codebase 的危害：</strong> AI 只會認真地將混亂複製和擴散</p>

<h3 id="為什麼保留對specs-to-code的看法">為什麼保留對「Specs-to-Code」的看法</h3>

<p>Spec 是工程流程的入口，但不是唯一的駕駛座。如果僅寫好規格卻不看代碼、不管架構、不設計測試，這只是「高級版的 Vibe Coding」。</p>

<hr />

<h2 id="健康的-ai-coding-流程四大要素">健康的 AI Coding 流程（四大要素）</h2>

<h3 id="1-先讓-ai-問問題再寫代碼">1. 先讓 AI 問問題，再寫代碼</h3>

<ul>
  <li>讓 AI 扮演 SA 或 Tech Lead，不斷追問細節</li>
  <li>建立雙方共同理解而非直接生成代碼</li>
  <li>推薦使用 Matt Pocock 的 Claude Code Skill：<strong>grill-me</strong></li>
</ul>

<p><strong>grill-me 的核心特性：</strong></p>

<ul>
  <li>沿決策樹分支往下走，每次只問一個問題</li>
  <li>附帶建議答案避免迴圈</li>
  <li>優先查看 Codebase 而不是猜測</li>
</ul>

<p>體驗要點：”很多時候你以為自己想清楚了，被它問三輪你就知道沒有”</p>

<h3 id="2-建立團隊的共同語言">2. 建立團隊的共同語言</h3>

<p>利用 DDD（Domain-Driven Design）中的 <strong>Ubiquitous Language</strong> 概念——團隊、文件、代碼、AI 都用同一套語言。</p>

<p>命名不只是美感問題，更是系統可理解性的問題。不同系統中 User、Account、Wallet 等詞語義不同，AI 容易寫出語法正確但語意錯誤的代碼。</p>

<h3 id="3-縮短回饋迴路">3. 縮短回饋迴路</h3>

<p>AI 最容易失控的情境是一次改太多檔案。應有的工具鏈：</p>

<ul>
  <li>TDD（測試驅動開發）</li>
  <li>Type Check（類型檢查）</li>
  <li>Lint（代碼檢查）</li>
  <li>Unit Test（單元測試）</li>
  <li>Integration Test（整合測試）</li>
  <li>Playwright E2E（端到端測試）</li>
</ul>

<p>這些不是老派儀式，而是「AI Coding 的煞車系統」。真正好的協作不是一次完成整個功能，而是讓 AI 小步前進，每一步都能被驗證。</p>

<h3 id="4-持續改善模組邊界">4. 持續改善模組邊界</h3>

<p>參考 John Ousterhout《A Philosophy of Software Design》：</p>

<p><strong>深模組：</strong> 功能多，介面簡單
<strong>淺模組：</strong> 功能少，介面複雜</p>

<p>AI 害怕淺模組遍布、小函式遍地但無清楚抽象邊界的 Codebase——它不知道真正該改哪裡，只好到處動刀。</p>

<hr />

<h2 id="工程師在-ai-時代的新價值">工程師在 AI 時代的新價值</h2>

<p>工程師不是被取代，而是工作重心被重新拉升，從執行層轉向守住設計邊界：</p>

<ul>
  <li>哪些邏輯應該封裝？</li>
  <li>哪些介面要穩定？</li>
  <li>哪些規則不能外洩？</li>
  <li>哪些流程一定要測試？</li>
  <li>哪些決策要寫成 ADR（架構決策記錄）？</li>
  <li>哪些內容要放進 CLAUDE.md 讓 AI 下次不要再猜？</li>
</ul>

<h3 id="工作重心轉變">工作重心轉變</h3>

<p><strong>以前花時間在：</strong> 打字、查語法、搬資料、寫樣板</p>

<p><strong>未來更重要的是：</strong> 需求拆解、系統設計、測試策略、模組化、把團隊隱性知識整理成 AI 能遵守的規則</p>

<hr />

<h2 id="評估-ai-coding-的正確問法">評估 AI Coding 的正確問法</h2>

<p><strong>不該只問：</strong></p>

<blockquote>
  <p>「你有沒有用 AI？生產力提升幾倍？」</p>
</blockquote>

<p><strong>更該問：</strong></p>

<ul>
  <li>「你有沒有用 AI 建立更好的工程流程？」</li>
  <li>「AI 產出的 Code 有沒有測試可以證明？」</li>
  <li>「Codebase 是否變得更容易被人與 AI 理解？」</li>
  <li>「團隊有沒有把隱性知識整理成共同語言與規範？」</li>
</ul>

<p>重要洞察：”AI 不會自動讓團隊變成熟。但成熟的工程團隊，會因為 AI 變得更快、更穩、更有槓桿”</p>

<hr />

<h2 id="結論">結論</h2>

<blockquote>
  <p>AI 沒有讓軟體工程基本功過時。它只是讓基本功不好的人，問題暴露得更快。</p>
</blockquote>

<p>不是把 AI 當成程式碼老虎機，而是把它變成工程流程的一部分——讓 AI 一起理解需求、對齊語言、驗證結果、改善架構。這才是真正的 AI 協作。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[在 AI 編程時代，代碼生成變便宜，但工程師的價值轉向守住設計邊界、建立規範流程、維持代碼品質，成熟的工程團隊因此變得更有槓桿。]]></summary></entry><entry><title type="html">美股上鏈了嗎？其實是華爾街把區塊鏈裝進清算後台</title><link href="https://swanky.github.io/technical/tokenized-stocks-wall-street-clearing/" rel="alternate" type="text/html" title="美股上鏈了嗎？其實是華爾街把區塊鏈裝進清算後台" /><published>2026-05-02T00:00:00+00:00</published><updated>2026-05-02T00:00:00+00:00</updated><id>https://swanky.github.io/technical/tokenized-stocks-wall-street-clearing</id><content type="html" xml:base="https://swanky.github.io/technical/tokenized-stocks-wall-street-clearing/"><![CDATA[<p>鏈上華爾街：清算後台的新引擎</p>

<p>最近美股代幣化出現一連串關鍵進展，美股『上鏈』了——但你知道這跟 DeFi 完全沒關係嗎？</p>

<p>這不是「又一個 RWA 題材」。</p>

<p>這可能是未來十到二十年，資本市場基礎設施重新洗牌的起點。</p>

<p>一句話總結：</p>

<p>這不是 DeFi 顛覆華爾街，而是華爾街把區塊鏈拆解之後，挑走需要的零件，裝進自己的清算後台。</p>

<hr />

<h2 id="先看時間線">先看時間線</h2>

<p>2026 年 3 月，SEC 批准 Nasdaq 的規則修訂，允許符合條件的證券以代幣化形式在交易所交易。</p>

<p>2026 年 4 月，NYSE 透過「Notice of Filing and Immediate Effectiveness」跟進。</p>

<p>但真正的關鍵不在交易所，而是 DTC 的三年期代幣化試點。</p>

<p>DTC 是 DTCC 旗下的核心證券存管機構，2025 年託管資產規模已超過 100 兆美元——它就是美國證券市場的「清算心臟」。</p>

<hr />

<h2 id="但最值得注意的不是股票終於上鏈">但最值得注意的，不是「股票終於上鏈」</h2>

<p>因為它跟很多加密圈的想像，完全不一樣。</p>

<p>這不是 Apple、Tesla 突然可以丟上 Uniswap 自由交易。這也不是散戶拿 MetaMask 就能直接參與。</p>

<p>根據目前文件，代幣化證券必須：</p>

<ul>
  <li>共用相同 CUSIP</li>
  <li>共用相同交易代號</li>
  <li>共用相同股東權利</li>
  <li>與傳統股票在同一張訂單簿中交易</li>
</ul>

<p>而且整套架構，高度中心化。</p>

<hr />

<h2 id="dtc-的設計不是把證券搬上鏈而是鏈上記帳">DTC 的設計：不是「把證券搬上鏈」，而是「鏈上記帳」</h2>

<p>底層證券仍留在 DTC 體系內，鏈上處理的是 tokenized entitlement——也就是證券權益的代幣化表示。</p>

<p>DTC 透過 LedgerScan 追蹤鏈上轉移，而 LedgerScan 的紀錄，構成 DTC 的官方帳簿。</p>

<p>最關鍵的一個設計：</p>

<p>DTC 保留了 root wallet / override keys。</p>

<p>意思是：必要時，DTC 不需要參與者的私鑰，就能直接轉換、轉移、鑄造或銷毀代幣。</p>

<p>這聽起來一點也不「去中心化」。但這正是華爾街要的：可監管、可逆轉、可控風險、可維持法律連續性。</p>

<hr />

<h2 id="所以這波代幣化的本質">所以這波代幣化的本質</h2>

<p>不是加密世界攻進華爾街。</p>

<p>比較像是華爾街走進加密世界的工具間，挑走它需要的零件：</p>

<ul>
  <li>✓ 可程式化</li>
  <li>✓ 可追蹤</li>
  <li>✓ 跨系統移轉</li>
  <li>✓ 鏈上紀錄</li>
</ul>

<p>然後把去中心化精神，留在門口。</p>

<hr />

<h2 id="這對-rwa-賽道意味著什麼">這對 RWA 賽道意味著什麼？</h2>

<p>過去很多原生鏈上 RWA 專案的敘事是：「傳統金融太慢、太封閉，所以我們在鏈上重建一套。」</p>

<p>但當 DTC、Nasdaq、NYSE 這些核心節點開始自己做代幣化，並把合規、託管、清算、交易所規則全部包進來——</p>

<p>原生 RWA 專案面對的不再是技術競爭，而是制度競爭。</p>

<p>而這場比賽的勝負手，不在誰的 smart contract 寫得漂亮，而在誰握有：</p>

<ul>
  <li>清算網路</li>
  <li>合規入口</li>
  <li>資產登記權</li>
  <li>託管信任</li>
  <li>監管認可</li>
</ul>

<hr />

<h2 id="短期-vs-長期">短期 vs 長期</h2>

<p>短期看：散戶感受不會太明顯。不是一夜之間打開 24/7 美股自由交易，DTC 處理的代幣化證券交易仍維持 T+1 結算。</p>

<p>長期看：傳統金融正在把區塊鏈從「投機市場」，重新定義成「後交易基礎設施」。</p>

<p>這才是真正的拐點。</p>

<hr />

<h2 id="加密圈過去常說code-is-law">加密圈過去常說：code is law</h2>

<p>但這次華爾街展示的是另一種現實：</p>

<blockquote>
  <p>law decides which code can matter.</p>
</blockquote>

<p>RWA 的下一階段，可能不再是誰能喊出最漂亮的去中心化願景，而是誰能在合規、資產權利、託管、清算與鏈上技術之間，建立一套大型機構真正能採用的架構。</p>

<p>這件事不浪漫。但很重要。</p>

<p>也許真正改變金融市場的，從來都不是前台最熱鬧的交易畫面，而是後台那顆，正在安靜更換的引擎。</p>

<hr />

<p>你怎麼看？這波代幣化會讓原生 RWA 專案被邊緣化，還是反而打開了新的合規通道？</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[華爾街採納代幣化技術並非去中心化革命，而是把區塊鏈拆解後挑走零件，裝進自己的清算後台。]]></summary></entry><entry><title type="html">Agentic Engineering 學得好的人，不是技術最強的人</title><link href="https://swanky.github.io/technical/agentic-engineering-mindset/" rel="alternate" type="text/html" title="Agentic Engineering 學得好的人，不是技術最強的人" /><published>2026-05-01T00:00:00+00:00</published><updated>2026-05-01T00:00:00+00:00</updated><id>https://swanky.github.io/technical/agentic-engineering-mindset</id><content type="html" xml:base="https://swanky.github.io/technical/agentic-engineering-mindset/"><![CDATA[<p>最近在公司推 Claude Code，我觀察到一個有點違反直覺的現象。</p>

<p>越懂軟體工程、越有專案管理底子、跨領域知識越廣的人，通常越容易把 Claude Code 用好。</p>

<p>這跟很多人最初想像的「AI 會把所有人拉到同一條起跑線」不太一樣。</p>

<p>AI 工具的確降低了技術操作門檻，但它同時放大了一件事——</p>

<p><strong>一個人原本怎麼思考問題、怎麼拆解任務、怎麼判斷成果品質，會直接決定他能不能把 AI 用出價值。</strong></p>

<h3 id="真正的瓶頸在於思維方式">真正的瓶頸在於思維方式</h3>

<p>很多同仁一開始用 Claude Code 卡住，表面上看是不熟工具、不會下 prompt。但再往下挖一層，真正卡住的是：</p>

<ul>
  <li>不知道自己要問什麼</li>
  <li>不知道怎麼描述現況</li>
  <li>不知道怎麼定義完成</li>
  <li>不知道怎麼判斷 AI 做出來的東西到底對不對</li>
  <li>也不知道下一輪該怎麼修正</li>
</ul>

<p><strong>換句話說，Claude Code 的學習門檻，表面是工具操作，實際上是系統性思維、軟體工程觀念與專案管理能力。</strong></p>

<hr />

<h3 id="引導式協作方法orid-框架">引導式協作方法：ORID 框架</h3>

<p>我自己在使用 Claude Code 時，很常用類似 ORID 的方式引導 AI。</p>

<p>不是一開始就說：「幫我完成這個功能。」</p>

<p>而是：</p>

<ol>
  <li>
    <p><strong>客觀現況（Objective）</strong> — 讓 AI 看見目前有哪些檔案、系統流程是什麼、錯誤訊息在哪裡、需求單寫了什麼</p>
  </li>
  <li>
    <p><strong>反思洞察（Reflective）</strong> — 讓它理解痛點與風險——這個問題會影響哪些功能、會不會牽動既有邏輯、團隊最不放心的是哪一塊</p>
  </li>
  <li>
    <p><strong>詮釋分析（Interpretive）</strong> — 請它分析與收斂——這個問題的本質是架構問題、資料問題、流程問題、權限問題，還是單純的程式 bug？</p>
  </li>
  <li>
    <p><strong>決策行動（Decisional）</strong> — 最後才進入決策與行動——要改哪裡？怎麼改？怎麼驗證？怎麼證明真的做對？</p>
  </li>
</ol>

<p><strong>這套方法之所以有效，不是因為 ORID 這個框架本身多神奇，而是它背後其實是一種專案管理與工程協作的思維：先釐清問題，再決定行動；先定義驗收，再開始實作。</strong></p>

<hr />

<h3 id="ai-的角色定位高級實習生">AI 的角色定位：高級實習生</h3>

<p>我也越來越覺得，與其把 Claude Code 當搜尋引擎，或是寫程式機器，不如換一個比喻：</p>

<p><strong>它像一位非常有能力，但需要被好好帶領的高級實習生。</strong></p>

<p>你不會對一位實習生說「幫我弄一個登入系統」，然後期待他完美交付。你會給他背景、目標、限制、參考資料、驗收標準。你也會要求他做完後自己先檢查，而不是每做一步就把半成品丟回給你。</p>

<h3 id="實例markdown-文件與-mermaid-圖轉換">實例：Markdown 文件與 Mermaid 圖轉換</h3>

<p>這點我最近在處理 Markdown 文件時特別有感。</p>

<p>有些 Markdown 檔裡面有 Mermaid 圖，我請 Claude Code 轉成 PDF 或 Word 時，常常遇到一種情況：文件轉好了，但 Mermaid 圖的圖片難以閱讀——字太小、線太亂、比例跑掉，整張圖塞在頁面裡像一團資料毛線球。</p>

<p>更有趣的是，Claude Code 有時會說：「請你打開檔案確認一下。」</p>

<p><strong>但這不是我想要的工作方式。</strong> 如果每一輪都要我自己打開 PDF、自己檢查圖清不清楚、再回頭跟它說哪裡壞掉——那 AI 只是把工作切碎丟回給我而已。</p>

<p>所以我後來反過來要求它：</p>

<ul>
  <li>請你先把 Mermaid 圖獨立轉成 PNG 或 SVG</li>
  <li>請你自己檢查圖片解析度、字體大小、版面比例與可讀性</li>
  <li>請你確認圖在 PDF 或 Word 裡放進去之後，人類可以正常閱讀</li>
  <li>都確認沒問題之後，再請我打開最終版</li>
</ul>

<p><strong>這個小例子讓我體會很深——成熟的 AI 使用方式，不只是叫 AI「做事」，而是要讓 AI 形成一個完整的工作閉環：</strong></p>

<p>理解任務 → 執行任務 → 自我檢查 → 修正問題 → 交付可驗收成果</p>

<hr />

<h3 id="工具選擇沒有完全替代方案">工具選擇：沒有完全替代方案</h3>

<p>不過，這也不代表所有工作都該用 Claude Code。</p>

<p>我觀察到，有些很小的修改，同仁還是習慣用 Cursor——改一兩行程式、調整小段 UI、快速補一個簡單邏輯，Cursor 的互動更直覺、更即時，也更貼近他們原本的工作節奏。</p>

<p><strong>這完全合理。推動 AI 工具導入的目標是提高效率，不是創造新的工具限制。</strong></p>

<ul>
  <li>有些工作適合 Claude Code，因為它比較像可以長時間閱讀專案、拆解任務、規劃修改、執行驗證的工程協作者</li>
  <li>有些工作適合 Cursor，因為它在小範圍修改、即時補完、快速調整上很順手</li>
  <li>有些時候甚至不需要 AI，自己改最快</li>
</ul>

<p><strong>我比較喜歡用「工具箱」來看這件事。</strong> 多會一個工具不是多一個負擔，而是多一種應對工作的方式。重要的不是大家都用同一把槌子，而是遇到不同的釘子、螺絲、木板、電線時，知道該拿哪一個工具。</p>

<p>這跟帶人其實很像。我們真正要訓練的不是同仁背多少 Claude Code 指令，而是讓同仁知道：</p>

<ul>
  <li>什麼叫做好的任務描述？</li>
  <li>什麼叫做合理的驗收標準？</li>
  <li>什麼時候應該要求 AI 自己先檢查？</li>
  <li>什麼時候不該接受「你自己打開來看」這種交付？</li>
  <li>什麼時候適合用 Claude Code 深入處理？什麼時候用 Cursor 快速修改就好？</li>
</ul>

<hr />

<h3 id="ai-導入的本質工作方法再訓練">AI 導入的本質：工作方法再訓練</h3>

<p>所以我現在比較不把 Claude Code 的推廣，當成工具訓練。<strong>它更像是一場團隊工作方法的再訓練。</strong></p>

<p>對不同角色的價值：</p>

<ul>
  <li><strong>資深工程師</strong> — Claude Code 可以是架構協作者</li>
  <li><strong>中階工程師</strong> — 可以是重構與測試夥伴</li>
  <li><strong>初學者</strong> — 可以先是程式碼導覽員</li>
  <li><strong>PM 或 TPM</strong> — 也可以是需求整理、風險盤點與驗收條件設計助手</li>
</ul>

<p>但前提是，<strong>我們不能只對同仁說一句「你自己去試試看」就放他們自生自滅。</strong> 這通常只會讓人更挫折。</p>

<h3 id="設計容易成功的小路">設計容易成功的小路</h3>

<p>比較好的方式，是幫同仁設計一條容易成功的小路。</p>

<h4 id="第一從低風險高結構的任務開始">第一，從低風險、高結構的任務開始</h4>

<p>請 Claude Code 解釋一段程式、整理某個 API 流程、找出某個頁面牽涉到哪些檔案，而不是一開始就要求它完成大型功能。</p>

<h4 id="第二把好用的-prompt-當教材而不是當咒語">第二，把好用的 prompt 當教材，而不是當咒語</h4>

<p>重點不是叫同仁複製貼上，而是拆解每一段為什麼要這樣寫，讓他理解背後的思考方式。</p>

<h4 id="第三安排配對學習">第三，安排配對學習</h4>

<p>讓比較熟悉系統的人陪不熟工具的人一起操作，重點不是教按鈕，而是示範怎麼描述問題、怎麼追問、怎麼驗收。</p>

<h4 id="第四重新定義初期成功">第四，重新定義初期成功</h4>

<p>對剛開始學的人來說，第一週的目標不一定是產出完整功能，而是敢問第二次、敢要求 AI 修正、敢把模糊問題講得更清楚。</p>

<hr />

<h3 id="真正的成功指標成就感而非使用率">真正的成功指標：成就感，而非使用率</h3>

<p>推動 AI 導入，不應該只問「你有沒有用 Claude Code？」</p>

<p><strong>更應該問：「你在哪一個工作環節，已經開始感覺 AI 真的幫你省力？」</strong></p>

<p>興趣不是被要求出來的。興趣通常是從某一個瞬間開始：</p>

<ul>
  <li>原來我可以請 Claude Code 幫我讀懂陌生模組</li>
  <li>原來我可以請它整理修改影響範圍</li>
  <li>原來我可以要求它自己先把 Mermaid 圖轉成圖片並檢查可讀性</li>
  <li>原來我可以請它用測試或 Playwright 證明功能真的有做對</li>
  <li>原來我也可以繼續用 Cursor 快速處理小修改</li>
  <li>原來 AI 不是取代我，也不是限制我，而是讓我多了一組工具來掌控工作</li>
</ul>

<p><strong>我越來越相信，AI 工具導入的關鍵不是壓力，也不是統一規格，而是——成就感設計，與工具選擇能力。</strong></p>

<hr />

<h3 id="結語尋求最有效的點燃瞬間">結語：尋求最有效的「點燃瞬間」</h3>

<p>如果你也在組織裡推動 AI Coding 工具，我很想聽聽你的觀察：</p>

<p><strong>你看過最有效的「點燃同仁興趣」的瞬間，是什麼樣子？</strong></p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[使用 Claude Code 的成功關鍵不在技術能力，而在系統性思維、軟體工程觀念與專案管理能力，需要培養完整的工作閉環與任務定義能力。]]></summary></entry><entry><title type="html">從組合語言到 Agentic AI Coding Agent：AI 時代，程式設計正在變成什麼？</title><link href="https://swanky.github.io/technical/agentic-ai-coding-spec-oriented/" rel="alternate" type="text/html" title="從組合語言到 Agentic AI Coding Agent：AI 時代，程式設計正在變成什麼？" /><published>2026-04-25T00:00:00+00:00</published><updated>2026-04-25T00:00:00+00:00</updated><id>https://swanky.github.io/technical/agentic-ai-coding-spec-oriented</id><content type="html" xml:base="https://swanky.github.io/technical/agentic-ai-coding-spec-oriented/"><![CDATA[<p>前幾天同事問我：「可以給我你那個功能的資料庫結構嗎？我要對接。」</p>

<p>我老實回答：「我沒有仔細研究 AI 幫我生了什麼資料庫結構。」</p>

<p>放在五年前，技術主管講這種話可能會被檢討。但這句話背後，其實不是我不在意資料庫，也不是我不在意系統設計。剛好相反。它反而讓我更清楚感受到：<strong>AI 時代的程式設計，正在從「手寫實作細節」往「定義行為、約束邊界、驗證結果」移動。</strong></p>

<h2 id="ai-不是外送機車換了不會自動快三倍">AI 不是外送機車，換了不會自動快三倍</h2>

<p>最近公司在推 Claude Code，再之前是 Cursor。我常被問同樣的問題：「用了 AI，效率應該快三五倍吧？沒有十倍也要有吧？」</p>

<p>老實說，這種問題很難回答。因為軟體開發不是換一台比較快的機車，外送速度就自動翻倍。</p>

<p>開發速度牽涉到很多層：</p>

<ul>
  <li>需求是否真的清楚</li>
  <li>系統邊界是否被定義</li>
  <li>測試是否能描述預期行為</li>
  <li>架構是否能承受變更</li>
  <li>資料模型是否與業務概念對齊</li>
  <li>權限、資安、稽核、維運是否被納入</li>
  <li>團隊知識是否能被下一個人接手</li>
</ul>

<p>真正拖慢軟體開發的，常常不是打字速度，而是問題沒有被想清楚。如果需求本身模糊，AI 只會更快地把模糊變成程式碼。這不是加速。這是把問題提早變成技術債。</p>

<h2 id="我重新找回了-tdd-的心流">我重新找回了 TDD 的心流</h2>

<p>我已經五年以上沒正式寫程式了。之前裝 Cursor，坦白說沒有太大感覺，甚至覺得不如以前用 IntelliJ 順手。但最近用 Claude Code，竟然又找回一點當年寫測試驅動開發（TDD）的心流。</p>

<p>以前的節奏是：</p>
<ol>
  <li>寫一個失敗測試</li>
  <li>補一點實作</li>
  <li>重構</li>
  <li>測試轉綠</li>
  <li>再下一題</li>
</ol>

<p>一抬頭就中午了，午休後再回來，一不小心就下班了。</p>

<p>最近那種心流又出現了，但內容已經不太一樣。以前的程式設計，是我親手寫每一行程式碼。現在更像是：</p>

<ul>
  <li>我定義問題</li>
  <li>我拆解任務</li>
  <li>我描述限制</li>
  <li>我補測試</li>
  <li>我檢查結果</li>
  <li>我修正規格</li>
  <li>AI 在可控範圍內生成實作</li>
</ul>

<p>換句話說，我做的事情更像是把 AI 的活動空間畫出來。不是放它自由奔跑，而是先把跑道、邊界、終點線、違規條件都標清楚。</p>

<h2 id="那個資料庫結構的故事">那個「資料庫結構」的故事</h2>

<p>回到開頭那個故事。同事要對接我的功能，所以問我能不能提供資料庫結構。這是合理需求。</p>

<p>但我那時候真正關注的是：</p>

<ul>
  <li>使用情境能不能跑對？</li>
  <li>流程是否符合預期？</li>
  <li>畫面狀態有沒有正確變化？</li>
  <li>錯誤情境有沒有被處理？</li>
  <li>權限與資料狀態是否一致？</li>
  <li>這個功能是否真的符合使用者故事？</li>
</ul>

<p>所以我不是先打開資料表慢慢研究，而是叫 Claude Code 搭配 Playwright，把我想要的情境跑對。我當時關注的不是底層先長什麼樣，而是「行為是否符合規格」。</p>

<p>這裡有一個關鍵轉換：以前我們常常從資料庫進入系統。現在 AI 輔助開發裡，我越來越常從「行為」進入系統。也就是：</p>

<ol>
  <li>先定義使用者會怎麼操作</li>
  <li>再定義系統應該怎麼反應</li>
  <li>接著用測試把這些反應固定下來</li>
  <li>最後才檢查實作細節是否合理</li>
</ol>

<p>隔天，我請 Claude Code 整理出一份完整的資料庫結構異動報告交給同事，但報告整理出來後，我心裡反而冒出另一個問題：你是真的要自己讀這份結構，還是其實也要餵進去給 AI 讀？</p>

<p>這件事讓我意識到：<strong>重要性的順序變了。</strong></p>

<p>以前：人先理解資料庫 → 寫程式碼 → 補測試 → 補文件。</p>

<p>現在可能變成：人先描述情境 → AI 生成實作 → Playwright 驗證行為 → AI 反向整理資料庫、API、測試與文件。</p>

<p>這不是說資料庫結構不重要。而是「進入系統的入口」變了。資料庫仍然重要，API 仍然重要，架構仍然重要。但它們不再一定是第一個入口。第一個入口可能是可驗證的使用者情境。</p>

<h2 id="程式設計典範是人類如何控制複雜度的歷史">程式設計典範，是人類如何控制複雜度的歷史</h2>

<p>我想用中年人的方式，講個古。我們常講函數式、物件導向、切面導向，這些看起來像技術名詞。但背後真正的問題其實很樸素：<strong>軟體越來越複雜，人類到底要用什麼方式來理解它、組織它、修改它？</strong></p>

<p>所謂程式設計典範（programming paradigm），就是不同時代面對複雜度時，發展出來的思考框架。</p>

<h3 id="-機器導向跟-cpu-講悄悄話">① 機器導向：跟 CPU 講悄悄話</h3>

<p>組合語言年代，工程師要知道 CPU 暫存器在哪、記憶體位址怎麼算、跳躍指令往哪跳、堆疊怎麼進出。那時候寫程式很像在跟機器講悄悄話，而且不能講錯半個字。</p>

<p>關注點不是「我要解決什麼業務問題」，而是「我要怎麼讓這台機器照我的意思動」。這是最接近硬體的程式設計。它的抽象層次很低，但控制力很強。</p>

<h3 id="-結構化讓程式不要像迷宮">② 結構化：讓程式不要像迷宮</h3>

<p>後來 Fortran、COBOL、C、Pascal 等高階語言出現，人類終於不用每天貼著 CPU 呼吸。</p>

<p>1968 年是關鍵的一年。Edsger Dijkstra 發表〈Go To Statement Considered Harmful〉，後來常被視為結構化程式設計的重要象徵。同一年，NATO 軟體工程會議讓「軟體工程」這個詞正式被提出討論。</p>

<p>背景很簡單：軟體危機。系統變大、時程失控、品質不穩、維護困難。聽起來是不是跟現在很像？</p>

<p>軟體工程不是因為大家愛流程才出現，而是因為軟體已經大到一個人腦袋裝不下。結構化程式設計要控制的是流程複雜度。少一點 goto，多一點清楚的條件、迴圈、函式與區塊。</p>

<h3 id="-物件導向把世界拆成可以協作的物件">③ 物件導向：把世界拆成可以協作的物件</h3>

<p>物件導向的根可以追到 1960 年代 Ole-Johan Dahl 與 Kristen Nygaard 開發的 Simula。後來 Alan Kay 在 Smalltalk 把這個想法發揚光大。</p>

<p>Alan Kay 看重的其實不只是 class，而是「物件之間用訊息協作」。物件導向最迷人的地方是，它讓我們可以用接近人類理解世界的方式寫系統。</p>

<p>訂單是物件。帳戶是物件。使用者是物件。交易是物件。每個物件有自己的狀態、行為、責任、邊界。</p>

<p>物件導向真正的精神，不是到處開 class，也不是生出一堆 Manager、Helper、Util、Service 讓新同事考古。它的核心是：</p>

<ul>
  <li>封裝變化</li>
  <li>分配責任</li>
  <li>定義邊界</li>
  <li>讓大型系統可以被團隊共同理解</li>
</ul>

<p>但物件導向也走過一段過度設計的時代。繼承樹越長越深，設計模式變成儀式，程式還沒解問題，架構先長出一座迷宮。所以後來大家又開始說「組合優於繼承」（composition over inheritance），開始重視 DDD、限界上下文（bounded context）、介面契約（interface contract）。</p>

<p>物件導向沒有死。只是它從「類別崇拜」變成「邊界設計」。</p>

<h3 id="-函數式把世界看成資料轉換">④ 函數式：把世界看成資料轉換</h3>

<p>函數式的根可以追到 Alonzo Church 1930 年代的 λ 演算（lambda calculus）。實務上，John McCarthy 在 1958 年發展出 Lisp，讓函數、遞迴、符號處理成為程式設計的重要語言。</p>

<p>到了 1977 年，John Backus 在圖靈獎演講〈Can Programming Be Liberated from the von Neumann Style?〉中，批判傳統程式設計過度依賴狀態與指派，進一步把函數式風格推向主流視野。</p>

<p>函數式的核心不是「寫得很數學、看起來很難」。而是：</p>

<ul>
  <li>同樣輸入，得到同樣輸出</li>
  <li>少一點副作用</li>
  <li>少一點共享可變狀態</li>
  <li>多一點可測試、可推理、可組合</li>
</ul>

<p>這件事在 AI 時代會變得更重要。因為 AI 很會生成程式碼，但 AI 也很會生成「看起來合理，但副作用亂飛」的程式碼。純函數、不可變資料（immutability）、清楚的輸入輸出，會讓 AI 產出的程式更容易被測試、被審查、被人類接手。</p>

<p>函數式不只是語言偏好。它是一種讓程式可驗證的思維。</p>

<h3 id="-切面導向把橫切關注點抽離">⑤ 切面導向：把橫切關注點抽離</h3>

<p>切面導向（AOP）在 1997 年由 Gregor Kiczales 等人提出，要解決一個很實務的問題：有些功能不是單一模組的責任，而是橫跨整個系統。</p>

<p>例如日誌、安全、交易、監控、稽核。這些就叫橫切關注點（cross-cutting concerns）。</p>

<p>很多 Java / Spring 開發者其實每天都在用 AOP，只是不一定這樣稱呼。例如：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@Transactional
</code></pre></div></div>

<p>你寫的是商業邏輯，但交易開啟、commit、rollback 是框架在方法前後幫你織進去的。</p>

<p>核心精神是：商業邏輯不該被日誌、權限、交易、監控塞滿。橫切政策該集中治理，不該散落在每個方法裡。</p>

<p>但 AOP 也提醒我們：抽象越高，隱形魔法越多。好的 AOP 把穩定、共通、技術性的政策抽出去。壞的 AOP 把商業邏輯藏起來，讓 debug 變成靈異節目。</p>

<h3 id="-宣告式反應式actor抽象層次一路往上爬">⑥ 宣告式、反應式、Actor：抽象層次一路往上爬</h3>

<p>再後來，SQL 讓我們說「我要什麼資料」，不必一步步描述資料庫怎麼找。反應式程式設計（Reactive Programming）讓我們思考事件流。Actor 模型讓我們思考訊息傳遞與獨立執行單元。資料流（Dataflow）讓我們思考資料怎麼流動。</p>

<p>基礎設施即程式碼（Infrastructure as Code, IaC）讓我們用宣告式語言描述整個環境。Kubernetes YAML、Terraform、OpenAPI、GraphQL 這些工具看似各做各的，其實是同一條路線上的不同分支。</p>

<p>這條路線是：<strong>人類越來越少直接控制每個步驟，越來越多在描述意圖、邊界、規則與結果。</strong></p>

<p>把這六個階段串起來，你會發現一條清楚的軌跡：</p>

<ul>
  <li>組合語言時代：我們控制機器</li>
  <li>結構化時代：我們控制流程</li>
  <li>物件導向時代：我們控制規模與責任</li>
  <li>函數式時代：我們控制狀態與副作用</li>
  <li>切面導向時代：我們控制橫切關注點</li>
  <li>反應式 / Actor 時代：我們控制事件、併發、資料流</li>
</ul>

<p>每一次典範轉移，都不是因為大家愛追潮流，而是因為軟體越來越大，人類腦袋快裝不下了。</p>

<h2 id="那-ai-時代要控制什麼">那 AI 時代要控制什麼？</h2>

<p>黃仁勳說，未來的程式語言是人類自然語言。我同意：自然語言會成為新的程式設計介面。</p>

<p>但我不太相信，未來只是「提示詞導向程式設計」（Prompt-Oriented Programming）。</p>

<p>因為「幫我做一個會員系統」雖然是自然語言，但這句話裡沒有：</p>

<ul>
  <li>權限模型</li>
  <li>狀態轉換</li>
  <li>API 介面契約</li>
  <li>錯誤處理</li>
  <li>資安要求</li>
  <li>測試案例</li>
  <li>稽核紀錄</li>
  <li>資料保留政策</li>
  <li>併發情境</li>
  <li>失敗補償機制</li>
  <li>觀測與告警需求</li>
</ul>

<p>AI 可以很快生出一個「會動的東西」。但「會動」和「可維護、可稽核、可擴充、可上線」之間，隔著一整片軟體工程的森林。</p>

<p>所以我認為下一個時代，會是規格導向程式設計。</p>

<h2 id="規格導向程式設計spec-oriented-programming">規格導向程式設計（Spec-Oriented Programming）</h2>

<p>規格導向程式設計的重心，不是「我親手寫每一行程式碼」。而是：</p>

<p><strong>我能不能把需求描述成 AI 和團隊都看得懂、能驗證、能追蹤、能演進的規格。</strong></p>

<p>它聽起來很像以前的需求文件，但其實不一樣。文件常常是寫給人看的。寫完丟進 Confluence，半年後沒人記得。</p>

<p>規格不一樣。</p>

<p>真正好的規格，應該同時具備三種特性：</p>

<ol>
  <li><strong>人看得懂</strong>：PM、SA、工程師、QA 都能對齊語意</li>
  <li><strong>AI 用得上</strong>：能作為生成程式碼、測試、文件的上下文</li>
  <li><strong>系統驗得出來</strong>：能透過自動化測試、契約測試、靜態檢查或監控指標持續驗證</li>
</ol>

<p>所以規格導向不是一份文件，而是一套可執行、可驗證、可演進的描述。它包含：</p>

<ul>
  <li>使用者故事（User Story）</li>
  <li>驗收條件（Acceptance Criteria）</li>
  <li>範例對應（Example Mapping）</li>
  <li>API 介面契約（API Contract）</li>
  <li>狀態機（State Machine）</li>
  <li>資料模型（Data Model）</li>
  <li>權限矩陣（Permission Matrix）</li>
  <li>錯誤處理（Error Handling）</li>
  <li>測試案例（Test Case）</li>
  <li>架構邊界（Architecture Boundary）</li>
  <li>安全限制（Security Constraint）</li>
  <li>可觀測性需求（Observability Requirement）</li>
  <li>部署政策（Deployment Policy）</li>
</ul>

<p>這些其實都不是新發明。DDD、BDD、TDD、Design by Contract、OpenAPI、ADR、契約測試、架構決策紀錄，過去 20 年我們已經累積了很多工具。只是在沒有 AI 的時代，它們常被視為「進階工程師的素養」。</p>

<p><strong>在 AI 時代，它們會變成最低門檻。</strong></p>

<h2 id="為什麼規格能力會變成核心能力">為什麼規格能力會變成核心能力？</h2>

<p>因為 AI 不會自動幫你把問題想清楚。</p>

<p>以前需求模糊，工程師在打字過程中會「邊寫邊想」。很多問題會在實作過程中浮現。</p>

<p>現在 AI 不一定會幫你浮現問題。它更可能用很高的自信，把錯誤需求快速落地。</p>

<p>所以：</p>

<ul>
  <li>需求不清楚，AI 只會更快地做錯</li>
  <li>邊界不清楚，AI 只會更快地改壞</li>
  <li>測試不清楚，AI 只會更快地產生自信滿滿的 bug</li>
  <li>架構不清楚，AI 只會更快地蓋出漂亮但危險的紙城堡</li>
  <li>權限不清楚，AI 可能讓內部狀態外洩</li>
  <li>交易不清楚，AI 可能把 rollback 與補償流程漏掉</li>
  <li>稽核不清楚，AI 可能讓系統能跑，但事後查不到責任軌跡</li>
</ul>

<p>這就是為什麼規格能力會變成新的核心能力。</p>

<h2 id="我自己最近的工作流example-mapping--playwright--claude-code">我自己最近的工作流：Example Mapping + Playwright + Claude Code</h2>

<p>回到開頭那個資料庫結構的故事。</p>

<p>我現在在叫 Claude Code 動手之前，會先做一件事：Example Mapping。</p>

<p>這是 Matt Wynne 在 BDD 社群提出的需求釐清技巧。原本是用四種顏色的便利貼，我自己改成直接寫 markdown。</p>

<p>一個 user story 會被拆成四種東西：</p>

<p><strong>🟡 Story（故事）</strong>：這次要解決誰的什麼問題。</p>

<p><strong>🔵 Rules（規則）</strong>：這個故事必須遵守的業務規則。</p>

<p><strong>🟢 Examples（具體例子）</strong>：每條規則至少配一個成功案例和一個失敗案例。</p>

<p><strong>🔴 Questions（問號）</strong>：討論過程中浮現、但現在還答不出來的疑問。</p>

<p>整個 session 大概 20 到 30 分鐘就能跑完一個 story。</p>

<p>它的厲害之處在於：綠色 examples 寫得越具體，測試就越好寫。紅色 questions 越多，代表這個故事還不該進開發。</p>

<h2 id="我現在的-ai-開發流程大概是這樣">我現在的 AI 開發流程大概是這樣</h2>

<h3 id="step-1先做-example-mapping把問號清掉">Step 1：先做 Example Mapping，把問號清掉</h3>

<p>把 Story / Rules / Examples / Questions 寫成 markdown 檔。</p>

<p>紅色問號還沒清完之前，不進下一步。</p>

<p>這一步常常就替我省掉一輪「AI 寫得超快，但方向是錯的」循環。</p>

<h3 id="step-2請-ai-用-playwright-證明它真的做對">Step 2：請 AI 用 Playwright 證明它真的做對</h3>

<p>接著，我會請 Claude Code 用 Playwright 跑出那些具體情境。</p>

<p>重點不是「把 examples 轉成測試檔」這件事本身。</p>

<p>重點是：<strong>你說你做完了，那請你用瀏覽器操作流程證明給我看。</strong></p>

<p>例如：</p>

<ul>
  <li>使用者從哪個入口進來</li>
  <li>點了哪些按鈕</li>
  <li>填了哪些欄位</li>
  <li>畫面狀態應該怎麼變</li>
  <li>成功時應該看到什麼</li>
  <li>失敗時應該出現什麼錯誤</li>
  <li>權限不足時應該被擋在哪裡</li>
</ul>

<p>這時候 Playwright 對我來說，不只是測試工具。它比較像是 AI 的驗收錄影機。</p>

<p>我不是只聽 AI 說「我已經完成了」。我要求它透過可重跑、可截圖、可追蹤的操作情境，證明這個功能真的符合我前面定義的規格。</p>

<p>如果跑不過，就代表不是它沒寫完，就是我的規則還不夠清楚。兩種都很好。因為問題被提早攤在桌面上，而不是等到 UAT 或上線後才爆炸。</p>

<h3 id="step-3讓-ai-修實作直到情境真的跑對">Step 3：讓 AI 修實作，直到情境真的跑對</h3>

<p>請 Claude Code 根據規則和測試寫實作，直到所有 examples 都跑過。</p>

<p>跑不過，就改實作。如果規則本身有破口，就回頭改 Step 1 的藍卡。</p>

<h3 id="step-4補契約與邊界檢查">Step 4：補契約與邊界檢查</h3>

<p>這一步我覺得很重要，也是很多 AI coding 容易漏掉的地方。</p>

<p>功能跑對，不代表系統設計是安全的。</p>

<p>所以我會要求 AI 再檢查：</p>

<ul>
  <li>API request / response 是否穩定</li>
  <li>是否有不該暴露的欄位</li>
  <li>資料庫 migration 是否可回滾</li>
  <li>是否有破壞既有相容性</li>
  <li>權限檢查是否在正確層級</li>
  <li>交易邊界是否清楚</li>
  <li>是否需要 idempotency</li>
  <li>錯誤處理是否可被前端與維運理解</li>
</ul>

<p>這一層不是單純「讓測試過」。而是把功能從 demo code 推向 production-ready code。</p>

<h3 id="step-5反向產出文件與接手資訊">Step 5：反向產出文件與接手資訊</h3>

<p>等行為跑對了，我再請 Claude Code 整理：</p>

<ul>
  <li>目前的資料庫結構長怎樣</li>
  <li>對外 API 介面契約</li>
  <li>狀態轉換表</li>
  <li>已知限制</li>
  <li>哪些地方有副作用</li>
  <li>哪些地方有外部依賴</li>
  <li>後續維運要注意什麼</li>
</ul>

<p>這些是給下一棒的人用的。下一棒可能是同事，也可能是下一個 AI session。</p>

<p>這裡其實很關鍵。AI 時代的文件，不只是人類閱讀材料。它也是下一次 AI 工作的上下文燃料。</p>

<h2 id="注意這個順序的變化">注意這個順序的變化</h2>

<ol>
  <li>規格在前</li>
  <li>程式在中</li>
  <li>文件在後</li>
  <li>驗證貫穿全程</li>
</ol>

<p>以前很多專案是反過來的：先設計資料庫 → 再寫程式 → 最後補測試和文件。而且通常都沒補。</p>

<p>Example Mapping + AI 反而把順序掰回它本來該有的位置。因為當生成成本下降，你會清楚地發現：<strong>把 examples 寫對，比把程式寫快重要得多。</strong></p>

<h2 id="ai-時代軟體工程不是變少而是變前面">AI 時代，軟體工程不是變少，而是變前面</h2>

<p>所以 AI 不代表軟體工程不重要。</p>

<p>剛好相反。</p>

<p>AI 會把軟體工程往前推。</p>

<p>以前可以靠資深工程師邊寫邊想、邊做邊補。現在如果沒有事先定義規格、測試與邊界，AI 會把錯誤實作得非常有效率。</p>

<p>當程式碼生成成本下降，真正昂貴的會變成：</p>

<ul>
  <li>問題定義錯誤</li>
  <li>需求理解錯誤</li>
  <li>架構邊界錯誤</li>
  <li>測試假設錯誤</li>
  <li>風險判斷錯誤</li>
  <li>權限模型錯誤</li>
  <li>資料模型錯誤</li>
  <li>團隊知識沒有沉澱</li>
</ul>

<p>未來的工程師，不一定是打字最快的人。而是能把混亂需求，整理成可執行、可驗證、可維護、可演進系統的人。</p>

<p>我現在不會急著要求同仁立刻相信 AI 能提升十倍效率。我比較想問的是：</p>

<p><strong>我們有沒有開始學會，把需求寫成 AI 看得懂、團隊追得動、測試驗得出來、未來維護得下去的規格？</strong></p>

<p>如果有，AI 才真的不只是一個比較聰明的自動補完。它會是我們重新設計軟體工程工作的契機。</p>

<h2 id="結論與反思">結論與反思</h2>

<p>你的團隊在導入 AI coding 的時候，卡在哪個環節？</p>

<ul>
  <li>是需求不清楚？</li>
  <li>測試補不起來？</li>
  <li>AI 產出的程式碼不好 review？</li>
  <li>還是不知道怎麼把規格餵給 AI？</li>
</ul>

<p>歡迎留言聊聊。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[可維護、可稽核、可擴充——AI 寫得快，不代表它寫得對。探討 AI 時代程式設計的典範轉移，從手寫實作細節轉向定義行為、約束邊界、驗證結果。]]></summary></entry><entry><title type="html">【好文分享】AI 時代的軟體工程：Kent Beck《Nobody Knows》重點翻譯與省思</title><link href="https://swanky.github.io/technical/claude-code-kent-beck-nobody-knows/" rel="alternate" type="text/html" title="【好文分享】AI 時代的軟體工程：Kent Beck《Nobody Knows》重點翻譯與省思" /><published>2026-04-13T00:00:00+00:00</published><updated>2026-04-13T00:00:00+00:00</updated><id>https://swanky.github.io/technical/claude-code-kent-beck-nobody-knows</id><content type="html" xml:base="https://swanky.github.io/technical/claude-code-kent-beck-nobody-knows/"><![CDATA[<p>最近花了很多時間研究 Claude Code，深深了解照這樣發展下去軟體工程這項技藝會變得跟過往所學有很大的不同，其實也很好奇世界級的軟工大師怎麼看待這樣的世界到來，剛好就聽到了 Kent Beck 的這個 Podcast，覺得蠻值得分享的，以下就透過AI快速翻譯了一下這些內容。</p>

<p>原始影片在這裡: https://youtu.be/5htJ2ML7BKU</p>

<h2 id="nobody-knows整理稿">《Nobody Knows》整理稿</h2>

<p>我要先感謝 Augment Code 贊助《Still Burning》的第一季。 我還記得第一次看到 IDE 時的興奮感。那時候你可以找到任何東西、修改任何程式碼，整個人都覺得世界被打開了。 但如今，那個像鐘錶匠一樣精細雕琢程式碼的時代，已經過去了。</p>

<p>現在，大多數的修改，將會由「精靈」來完成。Augment Code 正透過他們的新產品 intent，把這種能力從 IDE 延伸到更高的層次。 程式設計師的角色，不再只是逐行編修程式，而是維持整體方向、持續學習、看懂發生了什麼、做出策略性判斷。至於那些細部的工作，則交給代理人去處理。</p>

<p>這一季《Still Burning》也由 WorkOS 贊助。 我們都正在經歷一場令人興奮的轉變，也就是從「想法」到「可運行系統」的速度，比過去快得多。 但從一個可以 demo 的系統，走到一個能夠真正賣給個人、甚至迅速導入企業的產品，中間需要一層更紮實的技術基礎。 而 WorkOS 所提供的，正是這種面向企業級產品的技術基礎建設。</p>

<p>我是 Kent Beck，《Still Burning》的主持人。 這個節目想談的是，那些仍然在乎、而且仍然實際去做些什麼的人。</p>

<p>我想把這樣的人，和另一種 geek 做出區別。 有些人學會了一套技能，也把那套技能練得很熟，但多年來始終在同一套程式碼、同一種風格、同一個團隊、同樣的節奏、同樣的工具與語言裡工作，幾乎沒有真正改變什麼。 我對這樣的人沒有敵意，只是，那不是我想對話的人。</p>

<p>因為現在最大的問題是，一切都在改變。 你不能再假設，過去支撐你 10 年、20 年、30 年的工作方式，未來還會繼續有效。 遊戲規則變了，技術地景正在移動，而我們甚至不知道一年後它會長成什麼樣子。 在這種情況下，「適應力」開始以前所未有的方式產生價值。 相較之下，只是一再重複過去擅長的做法，已經不再足夠。</p>

<p>我覺得我們所有人，像是一起被空投進一片荒野。 沒有人知道答案。</p>

<p>五年前，如果你問我：「為什麼正式環境裡的缺陷這麼多？該怎麼辦？」 我可以直接給你一套已經驗證多年的答案，談權責如何對齊、該用哪些工具、該怎麼思考。 但現在，如果你是在做增強式開發的情境下遇到同樣問題，老實說，沒有人真的知道答案。 我們在原則上知道一些事，但在實作層面，已經不像過去那樣確定。</p>

<p>所以，我認為現在最重要的姿態，是一種奇妙的組合：同時擁有自信與謙遜。 我們不知道答案，沒有人知道答案，所以我們只能試。 而「嘗試」本身，就是一項技能。 正如執行既定策略是一項技能，便宜地做實驗、快速驗證、甚至願意去測試一些看起來很糟的點子，也是一項技能。</p>

<p>如果一個點子夠便宜，那你就不需要過度預判它值不值得。 直接試，看看會發生什麼。 也許 100 次裡有 99 次都是爛主意，但只要那 1 次成了，你得到的就是真正的發現。 而且這種發現有三個甜美之處： 第一，它是真的新東西； 第二，沒有人跟你競爭，因為沒多少人會去試那種看起來有點蠢的想法； 第三，你能把這些發現帶回社群，變成共同資產。</p>

<p>所以，我不想跟那些說「反正這一切都會消失，不用研究了」的人對話； 也不想跟那些說「反正搞不懂，別浪費時間了」的人對話。 我想對話的，是那些仍然在乎、也仍然採取行動的人。</p>

<p>而這些人不一定都是老前輩。 其實現在有很多年輕人，正在做非常驚人的事。 他們依然在乎，也依然在做事。 我很想了解，他們是怎麼維持自己的好奇心，怎麼挑選實驗，怎麼用更低成本的方式測試更多想法，再把發現帶回社群。</p>

<p>我使用 geek 這個字，有一個很明確的定義。 我採用 GeePaw Hill 的說法： Geek，是一個同時高度技術性、高度創造性，而且強烈渴望自己同時具備這兩者的人。</p>

<p>這表示，geek 不只存在於程式設計。 你可以是烘焙 geek、藝術 geek、音樂 geek。 雖然我們的核心聽眾大多是程式設計師，但我相信，這種 geek 的精神，其實適用於比我們原本以為更廣的人類活動。</p>

<p>這個節目有贊助商，我很感謝他們，因為那讓這些對談得以發生。 但這裡不是做產品推銷的地方。 我們不會花時間談某個產品的版本號或功能清單。 這裡更像是一個退後一步的地方，大家坐下來，裹著毛毯，在煙霧與火光裡聊幾個真正重要的問題：</p>

<p>你為什麼還在乎？ 你在乎的是什麼？ 你正在做什麼？ 你最近學到了什麼？ 你下一步最想試什麼？</p>

<p>如果來賓剛好出了新書、推出新產品，那很好。 但我們感興趣的，不是產品本身，而是那背後的故事。 是什麼樣的探索，把那本書、那場演講、那個產品帶到了現在。 因為這些故事，才真正能幫助我們在這片未知地帶裡前進。</p>

<p>我想，很多 geek 眼前最大的困難之一，是這場劇烈變化根本不是他們主動選的。 五年前，你完全可以把某項技能打磨到極致，並合理地以為自己未來整個職涯都會倚靠它。 但現在，情況變了。</p>

<p>例如，我曾經寫過兩本書，教人如何寫出「人類很容易閱讀」的程式碼。 而現在，這項能力的槓桿效果已經大幅下降。 這讓我很難過，因為我真的很喜歡雕琢那種能夠被快速掃讀、輕易理解、方便修改的程式碼。 但如今，這件事已經像記電話號碼，或是開手排車踩離合器一樣，不再那麼重要了。</p>

<p>許多人現在感受到的失落，其實就來自這裡。 他們不是不努力，相反地，他們花了很多年把某件事做到很好，也靠這些能力養家、存未來。 但現在，那些技能因為外部世界的變化而貶值了。 這確實發生了，而且發生在我們每個人身上。</p>

<p>所以問題不是，我們還能不能繼續死守舊技能直到最後一刻。 問題是：我們要怎麼適應？ 有些人現在的策略是保守地問：「我最少要改變多少，才還能繼續付房貸？」 但我不覺得這樣的心態，對個人或整個社群有真正幫助。</p>

<p>我更想對話的，是那些願意承認「我 10 年、20 年、30 年前擅長的東西，現在不夠了」的人。 接著繼續問： 那現在什麼才夠？ 現在什麼真正有價值？ 我怎麼向社群學習？ 我怎麼回饋社群？ 我怎麼教年輕人？ 我又怎麼向年輕人學習？</p>

<p>對我來說，增強式開發最令人興奮的一點，就是我經常從年輕一代那裡得到極好的建議。 我提出自己的做法，他們可能直接跟我說：「老大，那樣不行。」 而我反而很喜歡這件事。 因為那表示我還有地方能學。</p>

<p>當然，我也有自己的原則和經驗要放上桌。 但我現在也必須重新檢視： 我一生所建立的那些原則，到底哪些是真的歷久彌新，哪些其實只是在舊脈絡裡才成立？ 哪些要修正，哪些要保留？ 即使在這個新世界裡，我還看不出它們該怎麼被應用，我也得重新去理解。</p>

<p>這就是我想透過對談做的事。 和那些高度技術、又高度創造的人碰撞，去觀察他們如何探索「現在還有什麼可能」、「什麼已經不再重要」，然後一起學習接下來應該往哪裡走。</p>

<p>舉個例子。 我第一本書《Smalltalk Best Practice Patterns》的核心論點，就是如何寫出讓人容易閱讀的程式碼。 我分析 Smalltalk 世界裡各種程式設計習慣，試著找出哪些模式能真正提升可讀性。 這裡面從空白、tab、命名，到類別設計層級的問題都有。</p>

<p>我過去花了很多力氣去調整程式碼的細節： 這樣寫會不會比較容易讀？ 還是那樣排版更清楚？ 還能不能再更乾淨一點？ 我熱愛這種反覆提煉的過程。 Ward Cunningham 甚至教會我一種近乎美學的追求，就是一遍一遍讓程式碼更清楚。</p>

<p>而且那確實有回報。 如果一段程式碼本來就是為了將來容易被改動而寫，那它就有更高價值，因為它內建更多選擇性。 但現在的情況是，人類仍然需要理解程式碼，可是那種微觀層次的精細雕整，已經不像以前那麼重要了。</p>

<p>這不代表結構不重要。 結構依然重要。 只是，今天創造結構這件事，已經不再只是「操作文字編輯器」的技術了。 它更像是站在更高的抽象層次去理解： 這裡發生了什麼？ 未來最可能改的是什麼？ 我該怎麼把程式碼整理成更適合未來改動的形狀？</p>

<p>所以，變更仍然重要，但細節的重要性變了。 我們現在就像從前的鐵匠。 那些曾經非常珍貴、非常成熟的技能，有些能帶進新時代，有些不行。 關鍵是，我們得學會辨認。</p>

<p>我始終希望，最後我們能找到雙贏。 找到一種新的能力，讓程式碼既更容易被「精靈」操作，也更容易被人類理解。 甚至，我們還能利用精靈來幫助我們理解程式碼。</p>

<p>我最近寫了一個 GPU sorted map 的專案，第一次碰 GPU 程式。 裡面有些術語我根本不熟，所以我乾脆請精靈用童話故事的方式解釋 fetch operation。 它真的寫了一個皇后下令、侍從奔跑、再把答案帶回來的故事。 這不一定是最佳方法，但它提醒我一件事： 現在我們有全新的問題，也有全新的資源。 而且無論問題還是資源，都在持續變動。</p>

<p>但有些底層原則並沒有變。 例如權責一致、利害與共、低成本實驗、創造力、社群、分享與安全。 這些在「精靈增強世界」裡依然成立。 改變的是技術，不是這些基本原則本身。</p>

<p>隨著年紀增長，作為 geek，會經歷一種能力上的轉變。 一開始你不知道什麼東西值得做，只能照著別人的指示去實作。 但慢慢地，你會開始看見那些還不存在、卻很有價值的東西。 那是 senior 的能力之一。</p>

<p>但 senior 之後，另一件事會發生。 你腦中會冒出很多值得做的點子，可是你也知道每一個都很大、很耗時，所以你只能從 10 個點子裡做 1 個。 於是你的世界會越縮越小，只剩下那些你覺得自己做得完的東西。</p>

<p>而精靈的出現，突然把這個世界撐大了。 現在，如果我想從零開始寫一個資料庫，我真的有可能去試。 以前那幾乎是不可能的任務，現在則未必。 因此，「想像有價值的東西」這項能力，突然變得更有槓桿。 同樣地，「決定下一步該試什麼」、「知道什麼時候該放棄某個專案」也都變得比以前重要得多。</p>

<p>現在不是一年做一個專案，而可能是一週開一個。 多數專案其實都不是好主意，而你只有做到一半才會知道。 所以，能在適當時機說出「這個不值得再做下去了，我該轉向別的」的人，會擁有很大的優勢。</p>

<p>我也對有些人對增強式開發的激烈反應感到驚訝。 那到底是出於謹慎，還是出於自我？ 我自己其實不是早期採用者。 我看著別人熱烈討論了很久，直到看見 Gene Kim 和 Steve Yegge 示範他們稱為 vibe coding 的東西，才真正被打動。</p>

<p>我努力用一種更平靜的心態看這一切。 因為很多抗拒，其實來自依附。 如果你花了 10 年把 TDD 練得爐火純青，那你自然會對它投入情感，也會認為它是核心能力。 但進入增強式開發後，就連「如何選出下一個 test」這種精細技巧，現在是否還像以前那樣有高槓桿，都變得不那麼清楚了。</p>

<p>這對我也是一種挑戰。 我花了很多年去深挖很多主題，也很難輕易接受「原來有些東西現在已經不重要了」。 但現實是，有些東西確實不再重要；有些則比過去更重要。 而中間還有一大塊灰色地帶，只能誠實承認： 沒有人知道。</p>

<p>舉例來說，我對「不追求 100% 測試通過」這件事一直感到困惑。 對我來說，所有測試都通過，代表一種極高的信心。 雖然那不保證 production 就真的沒事，但它至少讓我能帶著極大的把握去 deploy。 可如今，越來越多人似乎接受「軟體大致能跑就好」。 這樣可以嗎？ 這只是過渡期嗎？ 還是未來精靈真的會更擅長產出高可靠性的系統？ 我不知道。</p>

<p>所以，這正是我想探索的主題。 缺陷是不是仍然是壞事？ 在什麼情況下是壞事？ 我們能做什麼？ 要付出什麼代價？ 我們為了品質放棄了什麼，又獲得了什麼？ 這些問題，今天沒有標準答案。</p>

<p>另一個讓我興奮的地方，是增強式開發讓設計師與產品人也更有機會直接把想法做出來，不再一定需要透過工程師中介。 而更重要的是，它讓跨職能合作變得更有可能。</p>

<p>極限程式設計一直強調 whole team，也就是成功所需的人應該在同一個房間裡，彼此首先認同自己是團隊的一部分，而不是只認同自己來自某個職能部門。 但過去我們一直受到 silo 拉扯。 產品歸產品、設計歸設計、工程歸工程。 我一直認為這是錯的。</p>

<p>增強式工具現在給了我們一個機會，可以打破這些 silo。 當然，它也可能被拿來把 silo 變得更牢。 但我希望我們選的是前者，也就是讓人與人之間產生更多連結。</p>

<p>還有一件事，我想說清楚。 這裡不會只有溫和、輕鬆、彼此附和的對話。 我希望邀請那些有分歧的人。 那些在價值觀、原則、方法上彼此衝突的人。 因為我不認為那種一團和氣、大家聊得很開心的節目，能為當前這場巨大轉變帶來足夠的價值。</p>

<p>所以，如果你想要的是被拍拍頭、安撫一下，那這裡可能不適合你。 這裡比較像是拍你背一下，甚至偶爾踢你一腳，然後說： 去試。</p>

<p>現在很多問題，我的答案就是這個。 有人問我：「TDD 能不能跟增強式開發一起運作？」 我會說，去試。 有人說：「TDD 是唯一方法。」 我也會說，去試。 因為現在，真的沒有人知道。</p>

<p>10 年後、15 年後，人類還會參與多少開發工作？ 沒有人知道。 但至少此刻，我們正站在一個可怕、刺激、充滿創造力的轉折點上。 規則已經變了，而新規則是什麼，我們還不知道。 更刺激的是，它還會繼續變。</p>

<p>有人問我，怎麼跟上這麼快的變化。 我當時的直覺回答是： 我沒有在跟上，我是在努力保持領先。 而這些對談，就是為了那些也願意思考下一步的人而做的。</p>

<p>這不代表你要什麼都追、什麼都試。 但我認同一句話： 我來這裡，是要搖樹，不是做果凍。 我要試東西、理解什麼有效、說出我的觀察，也去聽別人怎麼看。 當別人的結論和我不同時，那不是壞事，反而是一個機會，讓我們更深入理解：某種技術、原則或技能，到底是在什麼脈絡下才成立。</p>

<p>因為在這個時代，最有槓桿的一個問題就是： 我們下一步該試什麼？</p>

<p>我重新找回了自己對寫程式的熱愛，而 AI 對我的價值也不只在寫程式。 我本來就很喜歡深入理解議題，也對世界充滿好奇。 例如，有一次我聽到別人說，當一個系統的 eigenvalue 變成複數時，它就會出現振盪。 我以前學過矩陣，但從來沒真正弄懂 eigenvalue。 於是我去跟模型對話，花了大概兩個小時，我不會說我「懂了」，但我至少對那件事有了直覺。 而那讓我非常驚訝。</p>

<p>對我來說，AI 讓我最喜歡的事變得更容易了： 找到一個有趣的主題，然後一路挖深。 當然，現在我仍然得面對新的選擇困難。 可以學的東西那麼多，到底先學什麼？ 什麼時候該停下來，轉去學別的？ 這些新的判斷能力，也因此變得更加重要。</p>

<p>現在，我幾乎會把 AI 用在任何我想到的地方。 每當我心裡冒出一句「我很好奇……」，那通常就是一個值得拿模型來試的時刻。 有時我甚至會把同一個問題丟給不同模型，看它們哪裡相同、哪裡不同。 這讓我的智性生活比以前更豐富。</p>

<p>甚至像是「Porto 哪裡最適合吃海鮮」這種事，也一樣有價值。 因為你得到的答案，不再明顯只是別人的商業導流結果。</p>

<p>至於我做這個 podcast 最怕的是什麼？ 老實說，是沒有人在乎。 我怕自己投入這些想法，最後根本沒有任何影響。 我怕這項技術對程式設計這件我深愛的事所帶來的負面後果，會一路往前衝，而我根本做不了什麼。</p>

<p>但即使如此，我仍然相信，有一些東西是始終有效的。 例如人與人的連結。 真實的人際對話，尤其是觀點不同的人之間的對話，總是會創造價值。 我一再在自己的職涯中看到這件事。 跨越不同興趣、信念與視角的連結，總是能帶來新的理解。</p>

<p>所以，這就是為什麼這裡有一張椅子。 為什麼有一條毛毯。 為什麼我想邀請那些願意坐下來，談談身為 geek 是什麼感覺、談談什麼叫做「仍然在乎，仍然採取行動」的人。 這，就是《Still Burning》想做的事。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[Kent Beck 在 Podcast《Still Burning》首集《Nobody Knows》中，談 AI 時代軟體工程的巨變：精細雕琢程式碼的時代已過，適應力、低成本實驗與社群共學才是關鍵。]]></summary></entry><entry><title type="html">一鍵把簡報變文件：我寫了一個 Claude Code Skill 自動解讀 PPTX / PDF 每一頁</title><link href="https://swanky.github.io/claude-code/claude-code-s2m-skill/" rel="alternate" type="text/html" title="一鍵把簡報變文件：我寫了一個 Claude Code Skill 自動解讀 PPTX / PDF 每一頁" /><published>2026-03-29T00:00:00+00:00</published><updated>2026-03-29T00:00:00+00:00</updated><id>https://swanky.github.io/claude-code/claude-code-s2m-skill</id><content type="html" xml:base="https://swanky.github.io/claude-code/claude-code-s2m-skill/"><![CDATA[<p>每次開完會、上完課，你手上多了一份 30 頁的簡報 PDF。</p>

<p>然後呢？</p>

<p>要整理成會議記錄、寫進技術文件、做成學習筆記——你得一頁一頁截圖，一段一段抄文字，碰到流程圖還得手動畫。光是「把簡報內容搬到文件裡」這件事，就可以花掉半小時到一小時。</p>

<p>我受夠了。所以我寫了一個 Claude Code Skill，叫 <strong>s2m</strong>（slides-to-markdown）。</p>

<p>一句指令：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/s2m path/to/presentation.pptx
</code></pre></div></div>

<p>它會自動把整份簡報逐頁截圖、用 AI 解讀每一頁的內容、把流程圖轉成 Mermaid 語法，最後產出一份完整的 Markdown 文件。</p>

<p>這篇文章會完整介紹這個 Skill 的功能、安裝方式、技術設計，以及我在設計過程中做的取捨。</p>

<hr />

<h2 id="一什麼是-claude-code-skill">一、什麼是 Claude Code Skill？</h2>

<p>在講 s2m 之前，先快速說明 Skill 是什麼。</p>

<p>Claude Code 有三層擴充機制：</p>

<table>
  <thead>
    <tr>
      <th>機制</th>
      <th>用途</th>
      <th>觸發方式</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>CLAUDE.md</strong></td>
      <td>專案層級的指令與規範</td>
      <td>每次對話自動載入</td>
    </tr>
    <tr>
      <td><strong>Hooks</strong></td>
      <td>事件驅動的自動化腳本</td>
      <td>工具呼叫前/後自動執行</td>
    </tr>
    <tr>
      <td><strong>Skills</strong></td>
      <td>可重複使用的任務模板</td>
      <td><code class="language-plaintext highlighter-rouge">/skill-name</code> 或自然語言觸發</td>
    </tr>
  </tbody>
</table>

<p>Skill 本質上是一份放在 <code class="language-plaintext highlighter-rouge">.claude/skills/&lt;name&gt;/SKILL.md</code> 的 Markdown 檔案，裡面定義了：</p>

<ul>
  <li><strong>觸發條件</strong>：什麼情境下啟用這個 Skill</li>
  <li><strong>可用工具</strong>：這個 Skill 被允許使用哪些工具</li>
  <li><strong>執行流程</strong>：一步步的任務指引，Claude 會照著做</li>
  <li><strong>錯誤處理</strong>：遇到例外狀況怎麼辦</li>
</ul>

<p>你可以把 Skill 想像成「寫給 Claude 的 SOP」。它不是一次性的 prompt，而是可以反覆使用、可以分享給團隊的標準化工作流。</p>

<hr />

<h2 id="二s2m-功能總覽">二、s2m 功能總覽</h2>

<p>s2m 做的事情很直觀：<strong>把一份簡報變成一份 Markdown 文件</strong>。</p>

<p>但它不是只抓文字。完整的處理流程是：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PPTX / PDF
    ↓
逐頁轉為高解析度 PNG 截圖
    ↓
AI 視覺讀取每一頁圖片
    ↓
解讀內容 → 標題、清單、表格、程式碼
    ↓
圖形/流程圖 → Mermaid 語法
    ↓
組合成單一 Markdown 文件 + 圖片目錄
</code></pre></div></div>

<h3 id="支援的輸入格式">支援的輸入格式</h3>

<ul>
  <li><code class="language-plaintext highlighter-rouge">.pptx</code>（Microsoft PowerPoint）</li>
  <li><code class="language-plaintext highlighter-rouge">.ppt</code>（舊版 PowerPoint）</li>
  <li><code class="language-plaintext highlighter-rouge">.pdf</code>（任何 PDF 簡報）</li>
</ul>

<h3 id="輸出結構">輸出結構</h3>

<p>假設你的簡報叫 <code class="language-plaintext highlighter-rouge">技術架構說明.pptx</code>，執行後會產生：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>技術架構說明_slides/        ← 圖片目錄
  ├── page_001.png
  ├── page_002.png
  ├── ...
  └── _text_hints.json     ← 預提取文字（PDF 限定）
技術架構說明_slides.md      ← 完整 Markdown 文件
</code></pre></div></div>

<h3 id="markdown-輸出格式">Markdown 輸出格式</h3>

<p>每一頁的結構長這樣：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## 第 3 頁</span>

<span class="p">![</span><span class="nv">第3頁</span><span class="p">](</span><span class="sx">./技術架構說明_slides/page_003.png</span><span class="p">)</span>

<span class="gu">### 解讀</span>

<span class="gu">#### 系統架構概覽</span>
<span class="p">
-</span> 前端：React + Next.js
<span class="p">-</span> 後端：Node.js microservices
<span class="p">-</span> 資料層：PostgreSQL + Redis

​<span class="sb">```mermaid
flowchart LR
  A[使用者] --&gt; B[CDN]
  B --&gt; C[Next.js]
  C --&gt; D[API Gateway]
  D --&gt; E[微服務群]
  E --&gt; F[(PostgreSQL)]
  E --&gt; G[(Redis)]
​```</span>
</code></pre></div></div>

<p>重點是：<strong>每一頁都保留原始截圖，同時附上 AI 解讀的結構化內容</strong>。你可以對照圖片驗證解讀是否正確，也可以直接把文字拿去用。</p>

<hr />

<h2 id="三安裝與下載">三、安裝與下載</h2>

<h3 id="方法-a一鍵下載推薦">方法 A：一鍵下載（推薦）</h3>

<p><a href="/assets/downloads/skills/s2m/SKILL.md.download" download="SKILL.md" class="btn btn-warning btn-lg mb-3" style="background-color: #E5A300; border-color: #E5A300; color: #fff; font-weight: bold; text-decoration: none;">
  <i class="bi bi-download"></i>  下載 SKILL.md
</a></p>

<p>下載後，放到你的專案目錄下：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> .claude/skills/s2m
<span class="c"># 把下載的 SKILL.md 移到這裡</span>
<span class="nb">mv</span> ~/Downloads/SKILL.md .claude/skills/s2m/
</code></pre></div></div>

<h3 id="方法-b手動建立">方法 B：手動建立</h3>

<p>如果你偏好手動操作，在專案目錄下建立 <code class="language-plaintext highlighter-rouge">.claude/skills/s2m/SKILL.md</code>，貼入本文最後「附錄」段落的完整內容。</p>

<h3 id="方法-c從既有專案複製">方法 C：從既有專案複製</h3>

<p>如果你已經有一個包含 s2m Skill 的專案，直接複製整個目錄：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cp</span> <span class="nt">-r</span> /path/to/project/.claude/skills/s2m .claude/skills/
</code></pre></div></div>

<h3 id="依賴套件">依賴套件</h3>

<p>s2m <strong>不需要手動預裝任何套件</strong>。Skill 內建了自動安裝邏輯：</p>

<table>
  <thead>
    <tr>
      <th>套件</th>
      <th>用途</th>
      <th>安裝時機</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">pymupdf</code></td>
      <td>PDF → PNG 轉換 + 文字提取</td>
      <td>處理 PDF 時自動安裝</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">comtypes</code></td>
      <td>Windows PowerPoint COM 控制</td>
      <td>處理 PPTX（Windows + Office）時自動安裝</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">python-pptx</code></td>
      <td>PPTX 純文字提取（最後手段）</td>
      <td>前兩種方法都失敗時自動安裝</td>
    </tr>
  </tbody>
</table>

<p>唯一的前提是你的系統有 Python 3。如果沒有，先裝 Python。</p>

<h3 id="安裝確認">安裝確認</h3>

<p>安裝完成後，在 Claude Code 中輸入 <code class="language-plaintext highlighter-rouge">/s2m</code>，如果出現要求你提供檔案路徑的提示，就代表 Skill 已正確載入。</p>

<hr />

<h2 id="四使用方式">四、使用方式</h2>

<h3 id="基本用法">基本用法</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/s2m path/to/your-presentation.pptx
</code></pre></div></div>

<p>或是用自然語言：</p>

<blockquote>
  <p>幫我把這份簡報轉成 markdown：C:\Users\me\Documents\meeting.pdf</p>
</blockquote>

<p>Claude 會自動辨識出這是 s2m 的使用情境並啟動 Skill。</p>

<h3 id="觸發關鍵字">觸發關鍵字</h3>

<p>以下說法都會觸發 s2m：</p>

<ul>
  <li>「簡報轉 markdown」</li>
  <li>「pptx 轉文字」</li>
  <li>「pdf 簡報解讀」</li>
  <li>「slides to markdown」</li>
  <li>「把簡報整理成文件」</li>
</ul>

<h3 id="處理過程">處理過程</h3>

<p>執行後，你會在 Claude Code 的對話中看到完整的處理過程：</p>

<ol>
  <li>確認檔案存在</li>
  <li>建立輸出目錄</li>
  <li>逐頁轉換為 PNG</li>
  <li>逐頁讀取圖片並解讀</li>
  <li>組合輸出 Markdown</li>
  <li>回報完成結果</li>
</ol>

<p>整個流程全自動，你不需要中途做任何操作。</p>

<hr />

<h2 id="五技術設計解析">五、技術設計解析</h2>

<p>這個 Skill 看起來簡單，但裡面有不少設計考量。以下是幾個我覺得值得分享的技術決策。</p>

<h3 id="1-安全化檔名處理">1. 安全化檔名處理</h3>

<p>簡報檔名經常包含各種奇怪字元：emoji、全形問號、括號、空白。如果直接拿來當目錄名，很容易在不同作業系統上炸掉。</p>

<p>s2m 用一段 Python 正則表達式做安全化：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">re</span><span class="p">,</span> <span class="n">os</span><span class="p">,</span> <span class="n">sys</span>
<span class="n">basename</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">basename</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]))[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">safe</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s">'[^\w\s\u4e00-\u9fff\u3400-\u4dbf\uF900-\uFAFF\-.]'</span><span class="p">,</span> <span class="s">''</span><span class="p">,</span> <span class="n">basename</span><span class="p">)</span>
<span class="n">safe</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s">'[\s_]+'</span><span class="p">,</span> <span class="s">'_'</span><span class="p">,</span> <span class="n">safe</span><span class="p">.</span><span class="n">strip</span><span class="p">()).</span><span class="n">strip</span><span class="p">(</span><span class="s">'_.'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">safe</span> <span class="ow">or</span> <span class="s">'slides'</span><span class="p">)</span>
</code></pre></div></div>

<p>這段邏輯保留了英文、數字、中文字元和連字號，把其他特殊字元全部過濾掉，並且把連續空白/底線壓縮成單一底線。即使檔名是 <code class="language-plaintext highlighter-rouge">🎯技術架構（第三版）.pptx</code>，也能安全產出 <code class="language-plaintext highlighter-rouge">技術架構第三版_slides/</code> 這樣的目錄。</p>

<h3 id="2-多策略-pptx-轉換三層-fallback">2. 多策略 PPTX 轉換：三層 Fallback</h3>

<p>PPTX 轉 PNG 是整個 Skill 最棘手的部分，因為沒有一個跨平台的完美解法。s2m 的策略是 <strong>依序嘗試三種方法</strong>：</p>

<table>
  <thead>
    <tr>
      <th>優先順序</th>
      <th>方法</th>
      <th>條件</th>
      <th>品質</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>B1</td>
      <td>PowerPoint COM</td>
      <td>Windows + 安裝 MS Office</td>
      <td>最高（原生渲染）</td>
    </tr>
    <tr>
      <td>B2</td>
      <td>LibreOffice headless → PDF → PNG</td>
      <td>安裝 LibreOffice</td>
      <td>高（大部分排版正確）</td>
    </tr>
    <tr>
      <td>B3</td>
      <td>python-pptx 純文字提取</td>
      <td>只需要 Python</td>
      <td>僅文字（無截圖）</td>
    </tr>
  </tbody>
</table>

<p>B1 方法的特別之處是，它會根據投影片的<strong>實際尺寸</strong>計算匯出解析度：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">w</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">prs</span><span class="p">.</span><span class="n">PageSetup</span><span class="p">.</span><span class="n">SlideWidth</span> <span class="o">/</span> <span class="mi">72</span> <span class="o">*</span> <span class="mi">300</span><span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">prs</span><span class="p">.</span><span class="n">PageSetup</span><span class="p">.</span><span class="n">SlideHeight</span> <span class="o">/</span> <span class="mi">72</span> <span class="o">*</span> <span class="mi">300</span><span class="p">)</span>
</code></pre></div></div>

<p>這樣不管是標準 16:9、4:3，還是自訂尺寸的投影片，都能得到 300 DPI 的高品質截圖。</p>

<h3 id="3-自適應縮放智慧取代固定倍率">3. 自適應縮放：智慧取代固定倍率</h3>

<p>處理 PDF 時，s2m 不使用固定的 4x 縮放，而是以 <strong>2560px 為目標寬度</strong>動態計算：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">TARGET_W</span> <span class="o">=</span> <span class="mi">2560</span>
<span class="n">scale</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">TARGET_W</span> <span class="o">/</span> <span class="n">page</span><span class="p">.</span><span class="n">rect</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">)</span>
</code></pre></div></div>

<p>這個設計的好處：</p>

<ul>
  <li>標準投影片（720pt 寬）→ 產生 ~2560×1920 的圖片，足夠清晰</li>
  <li>A4 文件（595pt 寬）→ 產生 ~2560×3620 的圖片，不會過度放大</li>
  <li>比固定 4x <strong>減少 30–50% 的檔案大小</strong>，加速後續 AI 讀取</li>
</ul>

<p>下限 2.0 確保即使是超寬頁面也不會縮放不足。</p>

<h3 id="4-平行處理架構">4. 平行處理架構</h3>

<p>頁數不同，處理策略也不同：</p>

<table>
  <thead>
    <tr>
      <th>頁數</th>
      <th>策略</th>
      <th>原因</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>≤ 10</td>
      <td>循序處理</td>
      <td>開 Agent 的額外開銷不值得</td>
    </tr>
    <tr>
      <td>11–50</td>
      <td>分批平行（每批 5–8 頁）</td>
      <td>多個 Agent 同時解讀，速度快 2–3 倍</td>
    </tr>
    <tr>
      <td>&gt; 50</td>
      <td>先詢問使用者</td>
      <td>避免意外消耗大量 token</td>
    </tr>
  </tbody>
</table>

<p>平行處理的關鍵是<strong>在同一個訊息中發出所有 Agent 呼叫</strong>，這樣 Claude Code 才會真正同時執行，而不是等一個做完再做下一個。</p>

<p>每個 Agent 會收到：</p>
<ul>
  <li>它負責的頁碼範圍與圖片路徑</li>
  <li>預提取的文字（如果有）</li>
  <li>完整的解讀規則</li>
  <li>嚴格的回傳格式</li>
</ul>

<p>收集完畢後，主流程依頁碼排序合併，產出最終文件。</p>

<h3 id="5-mermaid-圖表還原">5. Mermaid 圖表還原</h3>

<p>這是 s2m 最有價值的功能之一。當 AI 辨識出頁面包含圖形時，不會只寫「這裡有一張流程圖」，而是<strong>直接輸出可渲染的 Mermaid 程式碼</strong>。</p>

<p>支援 13 種圖形類型：</p>

<table>
  <thead>
    <tr>
      <th>圖形類型</th>
      <th>Mermaid 語法</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>流程圖</td>
      <td><code class="language-plaintext highlighter-rouge">flowchart LR</code> / <code class="language-plaintext highlighter-rouge">flowchart TD</code></td>
    </tr>
    <tr>
      <td>循序圖</td>
      <td><code class="language-plaintext highlighter-rouge">sequenceDiagram</code></td>
    </tr>
    <tr>
      <td>甘特圖</td>
      <td><code class="language-plaintext highlighter-rouge">gantt</code></td>
    </tr>
    <tr>
      <td>類別圖</td>
      <td><code class="language-plaintext highlighter-rouge">classDiagram</code></td>
    </tr>
    <tr>
      <td>狀態圖</td>
      <td><code class="language-plaintext highlighter-rouge">stateDiagram-v2</code></td>
    </tr>
    <tr>
      <td>ER 圖</td>
      <td><code class="language-plaintext highlighter-rouge">erDiagram</code></td>
    </tr>
    <tr>
      <td>架構/系統圖</td>
      <td><code class="language-plaintext highlighter-rouge">graph TD</code> / <code class="language-plaintext highlighter-rouge">graph LR</code></td>
    </tr>
    <tr>
      <td>組織圖</td>
      <td><code class="language-plaintext highlighter-rouge">graph TD</code>（階層式）</td>
    </tr>
    <tr>
      <td>心智圖</td>
      <td><code class="language-plaintext highlighter-rouge">mindmap</code></td>
    </tr>
    <tr>
      <td>圓餅圖</td>
      <td><code class="language-plaintext highlighter-rouge">pie</code></td>
    </tr>
    <tr>
      <td>時間軸</td>
      <td><code class="language-plaintext highlighter-rouge">timeline</code></td>
    </tr>
    <tr>
      <td>使用者旅程</td>
      <td><code class="language-plaintext highlighter-rouge">journey</code></td>
    </tr>
    <tr>
      <td>象限圖</td>
      <td><code class="language-plaintext highlighter-rouge">quadrantChart</code></td>
    </tr>
  </tbody>
</table>

<p>對於複雜圖形，Skill 的指引是<strong>優先還原結構與主要節點</strong>，次要細節標註 <code class="language-plaintext highlighter-rouge">%% [略]</code>，確保產出的 Mermaid 語法可以正確渲染。</p>

<h3 id="6-錯誤處理機制">6. 錯誤處理機制</h3>

<p>s2m 針對七種常見例外定義了明確的處理策略：</p>

<table>
  <thead>
    <tr>
      <th>狀況</th>
      <th>處理方式</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>檔案不存在</td>
      <td>報錯並請使用者確認路徑</td>
    </tr>
    <tr>
      <td>無法安裝 pymupdf</td>
      <td>提示手動安裝後重試</td>
    </tr>
    <tr>
      <td>PPTX 三種方法皆失敗</td>
      <td>以純文字模式告知使用者</td>
    </tr>
    <tr>
      <td>圖片數與預期頁數不符</td>
      <td>列出差異，詢問是否繼續</td>
    </tr>
    <tr>
      <td>單頁讀取失敗</td>
      <td>跳過，標記警告</td>
    </tr>
    <tr>
      <td>頁數超過 50</td>
      <td>詢問使用者分批或指定範圍</td>
    </tr>
    <tr>
      <td>Agent 回傳缺漏頁面</td>
      <td>對缺漏頁面改用循序處理</td>
    </tr>
  </tbody>
</table>

<p>這些不是「防呆」，而是讓 Skill 在真實環境中能穩定運作的必要設計。簡報檔案來源五花八門，你永遠不知道下一份會碰到什麼狀況。</p>

<hr />

<h2 id="六實際使用情境">六、實際使用情境</h2>

<p>假設你剛參加完一場技術分享會，拿到講者的 30 頁 PDF 簡報。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/s2m ~/Downloads/microservices-architecture-talk.pdf
</code></pre></div></div>

<p>s2m 會開始工作：</p>

<ol>
  <li><strong>轉換階段</strong>（約 10 秒）：30 張高解析度 PNG 產生完畢</li>
  <li><strong>解讀階段</strong>（約 2–3 分鐘）：分成 4 批 Agent 平行處理</li>
  <li><strong>組合階段</strong>（即時）：依頁碼排序，寫出 Markdown 文件</li>
</ol>

<p>完成後你會得到：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">microservices-architecture-talk_slides/</code> — 30 張截圖</li>
  <li><code class="language-plaintext highlighter-rouge">microservices-architecture-talk_slides.md</code> — 完整 Markdown 文件</li>
</ul>

<p>打開 Markdown 文件，每一頁都有原始截圖和結構化解讀。架構圖變成了可編輯的 Mermaid 流程圖，表格變成了 Markdown 表格，程式碼變成了有語法標記的 code block。</p>

<p>你可以直接把這份文件：</p>
<ul>
  <li>丟進 Notion 或 Obsidian 當學習筆記</li>
  <li>複製片段到技術文件裡</li>
  <li>用 Git 追蹤版本變化</li>
  <li>用 Mermaid 編輯器修改流程圖</li>
</ul>

<hr />

<h2 id="結語">結語</h2>

<p>Skill 是 Claude Code 最值得探索的擴充機制。</p>

<p>它不像 CLAUDE.md 只能設定規範，也不像 Hooks 只能做事件反應。Skill 可以定義完整的、多步驟的工作流——而且可以在不同專案之間重複使用。</p>

<p>s2m 只是一個起點。你完全可以根據自己的工作流，寫出更多專屬的 Skill：</p>

<ul>
  <li>把會議錄音轉成結構化紀錄</li>
  <li>把 Figma 設計稿轉成元件規格</li>
  <li>把 API 文件轉成 SDK 範例程式碼</li>
  <li>把 CSV 報表轉成視覺化 dashboard</li>
</ul>

<p>關鍵不是工具有多厲害，而是<strong>你願不願意把重複的工作標準化</strong>。</p>

<p>一旦你把流程寫成 Skill，以後每次遇到同樣的事，就是一句指令的事。</p>

<hr />

<h2 id="附錄完整-skillmd-原始碼">附錄：完整 SKILL.md 原始碼</h2>

<p>以下是 s2m Skill 的完整定義，你可以直接複製到 <code class="language-plaintext highlighter-rouge">.claude/skills/s2m/SKILL.md</code> 使用。</p>

<p><a href="/assets/downloads/skills/s2m/SKILL.md.download" download="SKILL.md" class="btn btn-warning btn-lg mb-3" style="background-color: #E5A300; border-color: #E5A300; color: #fff; font-weight: bold; text-decoration: none;">
  <i class="bi bi-download"></i>  下載 SKILL.md
</a></p>

<details>
  <summary>點擊展開完整 SKILL.md</summary>

  <div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">s2m</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">將 PPTX 或 PDF 簡報逐頁轉為 Markdown 文件，每頁含原始頁面截圖與 AI 解讀內容；圖形/流程圖以 Mermaid 格式呈現。當使用者提到「簡報轉 markdown」、「pptx 轉文字」、「pdf 簡報解讀」、「slides to markdown」、「把簡報整理成文件」時觸發。</span>
<span class="na">argument-hint</span><span class="pi">:</span> <span class="s">&lt;pptx-or-pdf-path&gt;</span>
<span class="na">allowed-tools</span><span class="pi">:</span> <span class="s">Read, Bash, Write, Glob, Agent, Edit</span>
<span class="nn">---</span>

<span class="gh"># 簡報轉 Markdown（slides-to-markdown）</span>

你的任務是將一份 PPTX 或 PDF 簡報轉換為一份完整的 Markdown 文件，包含每頁的原始截圖影像以及 AI 解讀的文字內容。

<span class="gu">## 輸入</span>

目標簡報檔案路徑：<span class="sb">`$ARGUMENTS`</span>

若未指定路徑，詢問使用者提供檔案路徑。
<span class="p">
---
</span>
<span class="gu">## 執行流程</span>

<span class="gu">### 第一步：確認輸入與準備輸出目錄</span>
<span class="p">
1.</span> 確認 <span class="sb">`$ARGUMENTS`</span> 指定的檔案存在（用 Bash <span class="sb">`test -f`</span>）。
<span class="p">2.</span> 判斷副檔名：<span class="sb">`.pptx`</span> / <span class="sb">`.ppt`</span> 或 <span class="sb">`.pdf`</span>。
<span class="p">3.</span> <span class="gs">**安全化輸出目錄名稱**</span>：檔名可能包含 emoji、全形問號、括號等特殊字元，使用以下 Python 腳本產生安全名稱：

<span class="p">```</span><span class="nl">python
</span><span class="kn">import</span> <span class="nn">re</span><span class="p">,</span> <span class="n">os</span><span class="p">,</span> <span class="n">sys</span>
<span class="n">basename</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">basename</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]))[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">safe</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s">'[^\w\s\u4e00-\u9fff\u3400-\u4dbf\uF900-\uFAFF\-.]'</span><span class="p">,</span> <span class="s">''</span><span class="p">,</span> <span class="n">basename</span><span class="p">)</span>
<span class="n">safe</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s">'[\s_]+'</span><span class="p">,</span> <span class="s">'_'</span><span class="p">,</span> <span class="n">safe</span><span class="p">.</span><span class="n">strip</span><span class="p">()).</span><span class="n">strip</span><span class="p">(</span><span class="s">'_.'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">safe</span> <span class="ow">or</span> <span class="s">'slides'</span><span class="p">)</span>
<span class="p">```</span>
<span class="p">
4.</span> 決定輸出位置（<span class="sb">`&lt;safe_name&gt;`</span>）：
<span class="p">   -</span> 圖片目錄：<span class="sb">`&lt;safe_name&gt;_slides/`</span>（與來源檔同層）
<span class="p">   -</span> 輸出 Markdown：<span class="sb">`&lt;safe_name&gt;_slides.md`</span>（與來源檔同層）
<span class="p">5.</span> 建立圖片輸出目錄。
<span class="p">
---
</span>
<span class="gu">### 第二步：將簡報轉為逐頁 PNG 並提取文字</span>

使用 Bash 執行 Python 腳本。根據檔案類型選擇對應策略。<span class="gs">**統一使用 `python -` 搭配 heredoc 執行**</span>。

<span class="gu">#### 情況 A：PDF 檔案</span>

同時提取頁面圖片與文字內容，供後續解讀參考：

<span class="p">```</span><span class="nl">python
</span><span class="kn">import</span> <span class="nn">sys</span><span class="p">,</span> <span class="n">os</span><span class="p">,</span> <span class="n">json</span><span class="p">,</span> <span class="n">subprocess</span>
<span class="n">pdf_path</span><span class="p">,</span> <span class="n">out_dir</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">os</span><span class="p">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">out_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
    <span class="kn">import</span> <span class="nn">fitz</span>
<span class="k">except</span> <span class="nb">ImportError</span><span class="p">:</span>
    <span class="n">subprocess</span><span class="p">.</span><span class="n">run</span><span class="p">([</span><span class="n">sys</span><span class="p">.</span><span class="n">executable</span><span class="p">,</span> <span class="s">"-m"</span><span class="p">,</span> <span class="s">"pip"</span><span class="p">,</span> <span class="s">"install"</span><span class="p">,</span> <span class="s">"pymupdf"</span><span class="p">,</span> <span class="s">"-q"</span><span class="p">],</span> <span class="n">check</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="kn">import</span> <span class="nn">fitz</span>

<span class="n">doc</span> <span class="o">=</span> <span class="n">fitz</span><span class="p">.</span><span class="nb">open</span><span class="p">(</span><span class="n">pdf_path</span><span class="p">)</span>
<span class="n">texts</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">TARGET_W</span> <span class="o">=</span> <span class="mi">2560</span>  <span class="c1"># 自適應縮放目標寬度
</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">page</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">doc</span><span class="p">):</span>
    <span class="n">scale</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">TARGET_W</span> <span class="o">/</span> <span class="n">page</span><span class="p">.</span><span class="n">rect</span><span class="p">.</span><span class="n">width</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">)</span>
    <span class="n">pix</span> <span class="o">=</span> <span class="n">page</span><span class="p">.</span><span class="n">get_pixmap</span><span class="p">(</span><span class="n">matrix</span><span class="o">=</span><span class="n">fitz</span><span class="p">.</span><span class="n">Matrix</span><span class="p">(</span><span class="n">scale</span><span class="p">,</span> <span class="n">scale</span><span class="p">))</span>
    <span class="n">pix</span><span class="p">.</span><span class="n">save</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">out_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s">"page_</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">:</span><span class="mi">03</span><span class="n">d</span><span class="si">}</span><span class="s">.png"</span><span class="p">))</span>
    <span class="n">text</span> <span class="o">=</span> <span class="n">page</span><span class="p">.</span><span class="n">get_text</span><span class="p">().</span><span class="n">strip</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">text</span><span class="p">:</span>
        <span class="n">texts</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">text</span>

<span class="k">if</span> <span class="n">texts</span><span class="p">:</span>
    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">out_dir</span><span class="p">,</span> <span class="s">"_text_hints.json"</span><span class="p">),</span> <span class="s">"w"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">json</span><span class="p">.</span><span class="n">dump</span><span class="p">(</span><span class="n">texts</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"OK:</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="p">```</span>

<span class="gs">**自適應縮放邏輯**</span>：以 2560px 為目標寬度動態計算 scale（下限 2.0），取代固定 4x。標準投影片（720pt 寬）產生 ~2560×1920 圖片，A4 頁面（595pt 寬）產生 ~2560×3620 圖片。圖檔大小較固定 4x 減少 30–50%，加速後續 Read。

<span class="gu">#### 情況 B：PPTX / PPT 檔案</span>

依序嘗試 B1 → B2 → B3。

<span class="gs">**B1 — Windows PowerPoint COM（需安裝 MS Office）**</span>

<span class="p">```</span><span class="nl">python
</span><span class="kn">import</span> <span class="nn">sys</span><span class="p">,</span> <span class="n">os</span><span class="p">,</span> <span class="n">subprocess</span>
<span class="n">pptx_path</span><span class="p">,</span> <span class="n">out_dir</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">os</span><span class="p">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">out_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">pptx_abs</span><span class="p">,</span> <span class="n">out_abs</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">pptx_path</span><span class="p">),</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">out_dir</span><span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
    <span class="kn">import</span> <span class="nn">comtypes.client</span>
<span class="k">except</span> <span class="nb">ImportError</span><span class="p">:</span>
    <span class="n">subprocess</span><span class="p">.</span><span class="n">run</span><span class="p">([</span><span class="n">sys</span><span class="p">.</span><span class="n">executable</span><span class="p">,</span> <span class="s">"-m"</span><span class="p">,</span> <span class="s">"pip"</span><span class="p">,</span> <span class="s">"install"</span><span class="p">,</span> <span class="s">"comtypes"</span><span class="p">,</span> <span class="s">"-q"</span><span class="p">],</span> <span class="n">check</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="kn">import</span> <span class="nn">comtypes.client</span>

<span class="n">ppt_app</span> <span class="o">=</span> <span class="n">comtypes</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">CreateObject</span><span class="p">(</span><span class="s">"PowerPoint.Application"</span><span class="p">)</span>
<span class="n">ppt_app</span><span class="p">.</span><span class="n">Visible</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">prs</span> <span class="o">=</span> <span class="n">ppt_app</span><span class="p">.</span><span class="n">Presentations</span><span class="p">.</span><span class="n">Open</span><span class="p">(</span><span class="n">pptx_abs</span><span class="p">,</span> <span class="n">ReadOnly</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">Untitled</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">WithWindow</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>

<span class="c1"># 根據投影片實際尺寸 × 300 DPI 匯出（維持原始比例）
</span><span class="n">w</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">prs</span><span class="p">.</span><span class="n">PageSetup</span><span class="p">.</span><span class="n">SlideWidth</span> <span class="o">/</span> <span class="mi">72</span> <span class="o">*</span> <span class="mi">300</span><span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">prs</span><span class="p">.</span><span class="n">PageSetup</span><span class="p">.</span><span class="n">SlideHeight</span> <span class="o">/</span> <span class="mi">72</span> <span class="o">*</span> <span class="mi">300</span><span class="p">)</span>

<span class="n">count</span> <span class="o">=</span> <span class="n">prs</span><span class="p">.</span><span class="n">Slides</span><span class="p">.</span><span class="n">Count</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
    <span class="n">prs</span><span class="p">.</span><span class="n">Slides</span><span class="p">(</span><span class="n">i</span><span class="p">).</span><span class="n">Export</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">out_abs</span><span class="p">,</span> <span class="sa">f</span><span class="s">"page_</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="mi">03</span><span class="n">d</span><span class="si">}</span><span class="s">.png"</span><span class="p">),</span> <span class="s">"PNG"</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>

<span class="n">prs</span><span class="p">.</span><span class="n">Close</span><span class="p">()</span>
<span class="n">ppt_app</span><span class="p">.</span><span class="n">Quit</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"OK:</span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="p">```</span>

<span class="gs">**B2 — LibreOffice headless → PDF → PNG**</span>

<span class="p">```</span><span class="nl">bash
</span>soffice <span class="nt">--headless</span> <span class="nt">--convert-to</span> pdf <span class="nt">--outdir</span> <span class="s2">"&lt;out_dir&gt;"</span> <span class="s2">"&lt;pptx_path&gt;"</span>
<span class="c"># 再用情況 A 的 pymupdf 腳本處理產生的 PDF</span>
<span class="p">```</span>

<span class="gs">**B3 — python-pptx 純文字提取（無渲染，最後手段）**</span>

<span class="p">```</span><span class="nl">python
</span><span class="kn">import</span> <span class="nn">sys</span><span class="p">,</span> <span class="n">os</span><span class="p">,</span> <span class="n">json</span><span class="p">,</span> <span class="n">subprocess</span>
<span class="n">pptx_path</span><span class="p">,</span> <span class="n">out_dir</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">os</span><span class="p">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">out_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
    <span class="kn">from</span> <span class="nn">pptx</span> <span class="kn">import</span> <span class="n">Presentation</span>
<span class="k">except</span> <span class="nb">ImportError</span><span class="p">:</span>
    <span class="n">subprocess</span><span class="p">.</span><span class="n">run</span><span class="p">([</span><span class="n">sys</span><span class="p">.</span><span class="n">executable</span><span class="p">,</span> <span class="s">"-m"</span><span class="p">,</span> <span class="s">"pip"</span><span class="p">,</span> <span class="s">"install"</span><span class="p">,</span> <span class="s">"python-pptx"</span><span class="p">,</span> <span class="s">"-q"</span><span class="p">],</span> <span class="n">check</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="kn">from</span> <span class="nn">pptx</span> <span class="kn">import</span> <span class="n">Presentation</span>

<span class="n">prs</span> <span class="o">=</span> <span class="n">Presentation</span><span class="p">(</span><span class="n">pptx_path</span><span class="p">)</span>
<span class="n">slides_data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">slide</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">prs</span><span class="p">.</span><span class="n">slides</span><span class="p">):</span>
    <span class="n">texts</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">shape</span> <span class="ow">in</span> <span class="n">slide</span><span class="p">.</span><span class="n">shapes</span> <span class="k">if</span> <span class="n">shape</span><span class="p">.</span><span class="n">has_text_frame</span>
             <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">shape</span><span class="p">.</span><span class="n">text_frame</span><span class="p">.</span><span class="n">paragraphs</span> <span class="k">if</span> <span class="n">p</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">strip</span><span class="p">()]</span>
    <span class="n">slides_data</span><span class="p">.</span><span class="n">append</span><span class="p">({</span><span class="s">"slide"</span><span class="p">:</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="s">"texts"</span><span class="p">:</span> <span class="n">texts</span><span class="p">})</span>

<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">out_dir</span><span class="p">,</span> <span class="s">"text_data.json"</span><span class="p">),</span> <span class="s">"w"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">json</span><span class="p">.</span><span class="n">dump</span><span class="p">(</span><span class="n">slides_data</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"OK:</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">prs</span><span class="p">.</span><span class="n">slides</span><span class="p">)</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="p">```</span>
<span class="p">
---
</span>
<span class="gu">### 第三步：逐頁讀取圖片並解讀（支援平行處理）</span>

轉換完成後，使用 Glob 找出所有 <span class="sb">`page_*.png`</span>，按頁碼排序。若 <span class="sb">`_text_hints.json`</span> 存在，先用 Read 載入作為解讀輔助。

<span class="gu">#### 策略選擇</span>

| 頁數 | 策略 |
|------|------|
| ≤ 10 | <span class="gs">**循序處理**</span>：依序 Read 每頁圖片，當場解讀 |
| 11–50 | <span class="gs">**平行處理**</span>：分批交由 Agent 同時解讀 |
| &gt; 50 | 先詢問使用者是否分批或指定頁碼範圍 |

<span class="gu">#### 平行處理細節（頁數 &gt; 10 時啟用）</span>

將頁面分為多個批次（每批 5–8 頁），對每批使用 <span class="gs">**Agent 工具**</span>（<span class="sb">`subagent_type: "general-purpose"`</span>）同時處理。<span class="gs">**同一訊息中發出所有 Agent 呼叫以實現真正平行。**</span>

每個 Agent 的 prompt 須包含：
<span class="p">1.</span> 其負責的頁碼範圍與圖片絕對路徑清單
<span class="p">2.</span> 對應的 <span class="sb">`_text_hints.json`</span> 預提取文字（若有）
<span class="p">3.</span> 下方「解讀規則」的完整內容
<span class="p">4.</span> 回傳格式規定

收集所有 Agent 回傳後，依頁碼排序合併。

<span class="gu">#### 解讀規則</span>

<span class="gu">##### 文字內容</span>
<span class="p">
-</span> 標題 → <span class="sb">`##`</span> 或 <span class="sb">`###`</span>
<span class="p">-</span> 條列項目 → Markdown 清單（<span class="sb">`-`</span> 或 <span class="sb">`1.`</span>）
<span class="p">-</span> 表格 → Markdown 表格
<span class="p">-</span> 強調文字 → <span class="sb">`**粗體**`</span> 或 <span class="sb">`&gt; 引言`</span>
<span class="p">-</span> 程式碼 → 對應語言的 fenced code block
<span class="p">-</span> 頁碼、日期、版本號 → <span class="sb">`&lt;!-- page: N --&gt;`</span>

<span class="gu">##### 圖形/圖表 → Mermaid</span>

若頁面包含圖形，<span class="gs">**必須輸出 Mermaid 程式碼區塊**</span>取代文字描述。支援 13 種圖形類型（流程圖、循序圖、甘特圖、類別圖、狀態圖、ER 圖、架構圖、組織圖、心智圖、圓餅圖、時間軸、使用者旅程、象限圖）。

<span class="gu">##### 純圖片/照片</span>

以 <span class="sb">`&gt; [圖片：說明]`</span> 描述。
<span class="p">
---
</span>
<span class="gu">### 第四步：組合輸出 Markdown 文件</span>

將所有頁面解讀結果組合成單一 Markdown 文件，每頁以 <span class="sb">`---`</span> 分隔，圖片使用相對路徑。

<span class="gu">### 第五步：寫出輸出檔案</span>

使用 Write 工具將完整 Markdown 寫入 <span class="sb">`&lt;safe_name&gt;_slides.md`</span>。

完成後告知使用者：
<span class="p">-</span> 輸出 Markdown 路徑
<span class="p">-</span> 圖片目錄路徑
<span class="p">-</span> 總頁數
<span class="p">-</span> 解讀不完整的頁面（若有）
<span class="p">
---
</span>
<span class="gu">## 錯誤處理</span>

| 狀況 | 處理方式 |
|------|---------|
| 檔案不存在 | 報錯並請使用者確認路徑 |
| 無法安裝 pymupdf | 提示 <span class="sb">`pip install pymupdf`</span> 後重試 |
| PPTX 三種方法皆失敗 | 以 B3 純文字模式告知使用者 |
| 圖片數與預期頁數不符 | 列出差異，詢問是否繼續 |
| 單頁讀取失敗 | 跳過，標記 ⚠️ 此頁圖片無法讀取 |
| 頁數超過 50 | 詢問使用者分批或指定範圍 |
| Agent 回傳缺漏頁面 | 對缺漏頁面 fallback 循序處理 |
<span class="p">
---
</span>
<span class="gu">## 注意事項</span>
<span class="p">
-</span> <span class="gs">**不可虛構內容**</span>：解讀必須完全基於頁面實際可見內容。
<span class="p">-</span> <span class="gs">**保留原文**</span>：中/英文文字直接保留，不得意譯或省略。
<span class="p">-</span> <span class="gs">**Mermaid 正確性**</span>：語法必須正確，避免未閉合括號或非法字元。
<span class="p">-</span> <span class="gs">**相對路徑**</span>：圖片使用相對路徑，確保可移植。
<span class="p">-</span> <span class="gs">**文字輔助**</span>：<span class="sb">`_text_hints.json`</span> 僅作驗證參考，最終以圖片內容為準。
</code></pre></div>  </div>

</details>]]></content><author><name></name></author><category term="claude-code" /><category term="claude-code" /><summary type="html"><![CDATA[自製 Claude Code Skill：s2m（slides-to-markdown），一句指令將 PPTX 或 PDF 簡報逐頁截圖、AI 解讀、Mermaid 圖表還原，產出完整 Markdown 文件。含安裝教學與技術解析。]]></summary></entry><entry><title type="html">這 40 個實戰技巧，才是真正把 AI Coding 工具用到飛起來的方法</title><link href="https://swanky.github.io/claude-code/claude-code-40-best-practices/" rel="alternate" type="text/html" title="這 40 個實戰技巧，才是真正把 AI Coding 工具用到飛起來的方法" /><published>2026-03-23T00:00:00+00:00</published><updated>2026-03-23T00:00:00+00:00</updated><id>https://swanky.github.io/claude-code/claude-code-40-best-practices</id><content type="html" xml:base="https://swanky.github.io/claude-code/claude-code-40-best-practices/"><![CDATA[<p>很多人用 Claude Code，還停留在「幫我補這個 function」、「幫我改一段錯誤」的層次。
但真正把它用順的人，早就不是把它當自動補字工具，而是把它當成一套可以協作、執行、檢查、迭代的開發作業系統。</p>

<p>差別就在這裡：</p>

<p>不是「幫我寫一段程式」，
而是「幫我從規劃、修改、測試到驗證，一路把整個功能做完」。</p>

<p>原文有一句話很精準：</p>

<blockquote>
  <p>一般使用者和進階使用者的差距，不在於天分，而在於設定。
而這個差距，可能每週就值回 4 到 6 小時。</p>
</blockquote>

<p>這篇文章整理了 <strong>40 個 Claude Code 最值得先學起來的最佳實踐</strong>。
如果你平常有在用 Claude Code、Cursor、CLI 型 AI 開發工具，這篇很值得存起來。</p>

<hr />

<h2 id="一基礎設定先把工作台搭好效率才會開始放大">一、基礎設定：先把工作台搭好，效率才會開始放大</h2>

<h3 id="1-先設-cc-alias省掉重複輸入">1. 先設 <code class="language-plaintext highlighter-rouge">cc</code> alias，省掉重複輸入</h3>

<p>認真的 Claude Code 使用者，第一步通常會先做 alias。</p>

<p>把下面這行加到 <code class="language-plaintext highlighter-rouge">~/.zshrc</code> 或 <code class="language-plaintext highlighter-rouge">~/.bashrc</code>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">alias </span><span class="nv">cc</span><span class="o">=</span><span class="s1">'claude --dangerously-skip-permissions'</span>
</code></pre></div></div>

<p>然後執行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">source</span> ~/.zshrc
</code></pre></div></div>

<p>之後你就可以直接打 <code class="language-plaintext highlighter-rouge">cc</code>，不用每次都輸入整串 <code class="language-plaintext highlighter-rouge">claude</code>。
而且這個設定會略過權限提示，操作速度會快很多。</p>

<p>不過這裡要特別提醒：
<strong>這個選項等於你明確授權 Claude 更高的操作自由度</strong>，請在你了解風險的前提下使用，不要無腦開。</p>

<hr />

<h3 id="2-開啟即時狀態列">2. 開啟即時狀態列</h3>

<p>在 Claude Code 裡執行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/statusline
</code></pre></div></div>

<p>它會幫你產生一段 shell script，讓終端機在每次互動後，顯示目前資料夾、分支、context 使用情況等資訊。</p>

<p>簡單講，它像是你的開發 HUD。
工作一久，這個小東西非常有感。</p>

<hr />

<h3 id="3-把-context-window-拉大到-1m-tokens">3. 把 context window 拉大到 1M tokens</h3>

<p>如果你用的是支援大上下文的模型，例如 Sonnet 4.6 或 Opus 4.6，可以在工作中途切換：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/model opus[1m]
</code></pre></div></div>

<p>大 context 的好處是能一次理解更多檔案、更多歷史脈絡。
但不是越大越好，因為太大也可能導致 compaction 影響品質。</p>

<p>比較實際的做法是：
<strong>先從 500k 開始，再慢慢找到自己專案最穩的甜蜜點。</strong></p>

<hr />

<h3 id="4-一次設定輸出風格之後都省事">4. 一次設定輸出風格，之後都省事</h3>

<p>執行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/config
</code></pre></div></div>

<p>你可以選擇 Claude 的輸出風格，例如：</p>

<ul>
  <li>Explanatory</li>
  <li>Concise</li>
  <li>Technical</li>
</ul>

<p>也可以在 <code class="language-plaintext highlighter-rouge">~/.claude/output-styles/</code> 自訂自己的風格。</p>

<p>這件事很像替助理先定調。
先把口吻、技術深度、回答密度設定好，後面就不用一直手動糾正文風。</p>

<hr />

<h3 id="5-用手機遠端控制-claude-code">5. 用手機遠端控制 Claude Code</h3>

<p>執行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude remote-control
</code></pre></div></div>

<p>之後可以從 <code class="language-plaintext highlighter-rouge">claude.ai</code> 或手機 App 連進來控制。
你可以在電腦上開一個長時間 refactor，然後去倒杯茶、坐沙發、用手機看進度。</p>

<p>這個功能很容易讓人第一次覺得：
「好，現在真的有點像活在未來。」</p>

<hr />

<h2 id="二工作流加速不是更努力是少摩擦">二、工作流加速：不是更努力，是少摩擦</h2>

<h3 id="6--前綴可以直接把-bash-結果送進上下文">6. <code class="language-plaintext highlighter-rouge">!</code> 前綴可以直接把 bash 結果送進上下文</h3>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">!</span>git status
<span class="o">!</span>npm <span class="nb">test</span>
</code></pre></div></div>

<p>這些輸出會直接進到 Claude 的上下文裡，讓它可以立即根據結果行動。
少掉手動複製貼上的來回，很適合 debug 迴圈。</p>

<hr />

<h3 id="7-esc-停止esc--esc-回溯">7. <code class="language-plaintext highlighter-rouge">Esc</code> 停止，<code class="language-plaintext highlighter-rouge">Esc + Esc</code> 回溯</h3>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Esc</code>：立刻停止 Claude 目前的動作</li>
  <li><code class="language-plaintext highlighter-rouge">Esc + Esc</code> 或 <code class="language-plaintext highlighter-rouge">/rewind</code>：開啟還原選單，可恢復程式碼、對話，或兩者一起恢復</li>
</ul>

<p>這就是你的 AI 版 undo。
當你發現「這方向好像不太對」時，越早回頭越省時間。</p>

<hr />

<h3 id="8-ctrl--s-暫存-prompt-草稿">8. <code class="language-plaintext highlighter-rouge">Ctrl + S</code> 暫存 prompt 草稿</h3>

<p>當你 prompt 打到一半，突然想到要先問另一個小問題，這功能就很神。</p>

<p><code class="language-plaintext highlighter-rouge">Ctrl + S</code> 可以先把目前草稿存起來，等你插問完、拿到答案後，原本草稿會自動回來。</p>

<p>多段式任務時非常實用。</p>

<hr />

<h3 id="9-ctrl--b-讓長任務背景執行">9. <code class="language-plaintext highlighter-rouge">Ctrl + B</code> 讓長任務背景執行</h3>

<p>當 Claude 在跑測試、build、長時間檢查時，可以按：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Ctrl + B
</code></pre></div></div>

<p>讓它在背景繼續工作，而你前台還能繼續對話或規劃下一步。</p>

<p>這種平行處理感很重要，因為真正浪費時間的，常常不是 AI 慢，而是你一直被它卡住節奏。</p>

<hr />

<h3 id="10-btw-用來插問不污染主線對話">10. <code class="language-plaintext highlighter-rouge">/btw</code> 用來插問，不污染主線對話</h3>

<p>如果你臨時想問一句：</p>

<ul>
  <li>為什麼這樣設計？</li>
  <li>你剛剛這個做法的替代方案是什麼？</li>
</ul>

<p>可以用 <code class="language-plaintext highlighter-rouge">/btw</code> 開側邊問題視窗。
好處是主對話脈絡不會被一堆岔題弄髒。</p>

<hr />

<h3 id="11-ctrl--g-先改-claude-的計畫再讓它做">11. <code class="language-plaintext highlighter-rouge">Ctrl + G</code> 先改 Claude 的計畫，再讓它做</h3>

<p>當 Claude 提出實作計畫時，按 <code class="language-plaintext highlighter-rouge">Ctrl + G</code> 可以打開那份 plan 直接編輯。</p>

<p>這很關鍵。
因為很多時間不是花在「Claude 不會做」，而是花在「它用錯方法做得很勤勞」。</p>

<p>先修策略，再執行，省下的是後面整串返工。</p>

<hr />

<h3 id="12-用語音-dictationprompt-通常會更完整">12. 用語音 dictation，prompt 通常會更完整</h3>

<p>執行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/voice
</code></pre></div></div>

<p>語音輸入有一個很微妙但真實的優勢：
你講話時，通常會自然補上更多背景、限制條件、例外情境。</p>

<p>打字時常常只剩指令。
講出來時，反而更像真的在交辦工作。</p>

<hr />

<h2 id="三上下文與-prompt-管理清不清楚比長不長更重要">三、上下文與 prompt 管理：清不清楚，比長不長更重要</h2>

<h3 id="13-不相關任務之間記得-clear">13. 不相關任務之間記得 <code class="language-plaintext highlighter-rouge">/clear</code></h3>

<p>很多人會把一個 session 用成三小時大雜燴。
但上下文一旦越積越多，前面那些舊訊息就會悄悄稀釋你後面的指令。</p>

<p>所以遇到不同任務時，請果斷：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/clear
</code></pre></div></div>

<p>一個乾淨 session，往往比一個混濁的長 session 更強。</p>

<hr />

<h3 id="14-修正兩次還不對就重開新-prompt">14. 修正兩次還不對，就重開新 prompt</h3>

<p>如果你已經糾正 Claude 兩次，它還是沒抓到方向，不要硬修第三次。</p>

<p>最有效的方法通常是：</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">/clear</code></li>
  <li>用剛剛學到的資訊，重寫一份更精準的新 prompt</li>
</ol>

<p>因為在錯誤脈絡裡硬拉，很容易越改越亂。</p>

<hr />

<h3 id="15-不要描述-bug直接貼原始資料">15. 不要描述 bug，直接貼原始資料</h3>

<p>不要只說：</p>

<ul>
  <li>我這裡有個錯</li>
  <li>感覺是 API 有問題</li>
  <li>build 好像掛了</li>
</ul>

<p>直接貼：</p>

<ul>
  <li>error log</li>
  <li>CI output</li>
  <li>terminal 錯誤</li>
  <li>Slack 討論串</li>
  <li>failing test</li>
</ul>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat </span>error.log | claude <span class="s2">"explain this error and suggest a fix"</span>
</code></pre></div></div>

<p>AI 最怕的是被人類先抽象化過。
你幫它整理過頭，它反而少了最重要的細節。</p>

<hr />

<h3 id="16-架構性任務請用-plan-mode">16. 架構性任務請用 Plan Mode</h3>

<p>按 <code class="language-plaintext highlighter-rouge">Shift + Tab</code> 進入 Plan Mode。
只要是多檔案修改、模組重構、資料流重整、架構調整，先進 Plan Mode 幾乎都值得。</p>

<p>前面多花幾分鐘，後面可以少浪費二十分鐘在「很認真地做錯事」。</p>

<hr />

<h3 id="17-明確指定要看的檔案">17. 明確指定要看的檔案</h3>

<p>直接用：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@src/auth/middleware.ts
</code></pre></div></div>

<p>這樣 Claude 就能直接讀指定檔案，而不用自己去整個 codebase 裡亂找。</p>

<p>你本來就知道要看哪裡，就別讓它花 token 到處翻箱倒櫃。</p>

<hr />

<h3 id="18-探索陌生程式碼時反而可以故意問模糊一點">18. 探索陌生程式碼時，反而可以故意問模糊一點</h3>

<p>例如：</p>

<ul>
  <li>你會怎麼改善這個檔案？</li>
  <li>這段程式看起來有哪些潛在問題？</li>
  <li>這個模組哪裡最不一致？</li>
</ul>

<p>這種模糊 prompt 在陌生地形很有用。
因為你不知道該問什麼時，Claude 有機會幫你指出你根本還沒想到的地方。</p>

<hr />

<h3 id="19-使用-compact-時要告訴它保留什麼">19. 使用 <code class="language-plaintext highlighter-rouge">/compact</code> 時，要告訴它保留什麼</h3>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/compact focus on the API changes
</code></pre></div></div>

<p>如果不加指示，壓縮後很可能把真正重要的線索一起壓扁。
但如果你先講清楚要保留什麼，compact 才會像摘要，不會像失憶。</p>

<hr />

<h3 id="20-在-prompt-裡加上-ultrathink">20. 在 prompt 裡加上 <code class="language-plaintext highlighter-rouge">ultrathink</code></h3>

<p>如果你使用支援的模型，可以在 prompt 裡加入：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ultrathink
</code></pre></div></div>

<p>這會讓 Claude 依照問題複雜度，動態分配推理資源。
遇到困難問題時，品質提升通常是看得出來的，不是心理作用。</p>

<hr />

<h2 id="四自動化工具與驗證讓它不只會寫還會自己檢查">四、自動化、工具與驗證：讓它不只會寫，還會自己檢查</h2>

<h3 id="21-一定要給-claude-自我驗證的方法">21. 一定要給 Claude 自我驗證的方法</h3>

<p>例如你不要只說：</p>

<blockquote>
  <p>幫我重構 auth</p>
</blockquote>

<p>而要說：</p>

<blockquote>
  <p>幫我重構 auth，跑測試，若失敗就修到通過再結束</p>
</blockquote>

<p>這種 prompt 會大幅提升成果品質。
因為你不是只交代「做」，而是交代「做完後要驗證」。</p>

<hr />

<h3 id="22-安裝-lsp-plugin">22. 安裝 LSP plugin</h3>

<p>LSP 類型的插件可以在 Claude 修改程式後，自動提供診斷資訊，例如 type error、語法錯誤等。</p>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/plugin <span class="nb">install </span>typescript-lsp@claude-plugins-official
</code></pre></div></div>

<p>好處是它可以在你還沒發現問題前，先幫忙修掉。</p>

<hr />

<h3 id="23-能用-cli-工具就優先別用-mcp-server">23. 能用 CLI 工具，就優先別用 MCP Server</h3>

<ul>
  <li>CLI 工具通常更省 context</li>
  <li>對長 session 來說更有效率</li>
</ul>

<p>例如教 Claude 使用：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">gh</code> 來處理 PR</li>
  <li><code class="language-plaintext highlighter-rouge">sentry-cli</code> 來 debug production 問題</li>
</ul>

<p>在長時間工作中，這種 context 節省會一直累積。</p>

<hr />

<h3 id="24-mcp-server-先裝這四種就好">24. MCP Server 先裝這四種就好</h3>

<p>推薦的四個高訊噪比選擇：</p>

<ul>
  <li><strong>Playwright</strong>：驗證 UI</li>
  <li><strong>PostgreSQL / MySQL</strong>：查 schema、查資料庫</li>
  <li><strong>Slack</strong>：直接讀 bug 討論串</li>
  <li><strong>Figma</strong>：設計稿轉程式碼</li>
</ul>

<p>重點不是裝越多越厲害。
而是先把真的常用的裝熟，不然最後只會變成工具收藏家。</p>

<hr />

<h3 id="25-用-loop-做背景輪詢">25. 用 <code class="language-plaintext highlighter-rouge">/loop</code> 做背景輪詢</h3>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/loop 5m check <span class="k">if </span>deploy succeeded
</code></pre></div></div>

<p>這樣 Claude 會在背景定時檢查部署是否成功，而你的 session 還可以繼續做別的事。</p>

<p>很適合處理 deploy、job 狀態、長時間流程追蹤。</p>

<hr />

<h3 id="26-用-permissions-設-allowlist">26. 用 <code class="language-plaintext highlighter-rouge">/permissions</code> 設 allowlist</h3>

<p>像 <code class="language-plaintext highlighter-rouge">npm run lint</code>、<code class="language-plaintext highlighter-rouge">npm test</code> 這類安全又常用的指令，不要每次都重新批准。</p>

<p>把它們加進 allowlist，才能維持工作流順暢。
那些看似小小的確認視窗，累積起來就是一筆很隱形的生產力稅。</p>

<hr />

<h2 id="五claudemd-與規則管理不是越多越好是越準越好">五、CLAUDE.md 與規則管理：不是越多越好，是越準越好</h2>

<h3 id="27-先跑-init再把產生結果砍掉一半">27. 先跑 <code class="language-plaintext highlighter-rouge">/init</code>，再把產生結果砍掉一半</h3>

<p><code class="language-plaintext highlighter-rouge">/init</code> 會幫你產生一份起始版 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>。</p>

<p>但真正重要的是下一步：
<strong>狠狠刪掉你無法明確說明必要性的內容。</strong></p>

<p>因為每一條多餘規則，都會吃掉 Claude 的注意力預算。</p>

<hr />

<h3 id="28-檢查每一行規則沒有它claude-真的會犯錯嗎">28. 檢查每一行規則：沒有它，Claude 真的會犯錯嗎？</h3>

<p>這是一個很好用的判斷標準：</p>

<blockquote>
  <p>如果沒有這一條，Claude 真的會因此犯錯嗎？</p>
</blockquote>

<p>如果答案是「不會」，那就刪掉。
你大概只有 <strong>150 到 200 條指令的有效預算</strong>，超過之後服從度就會開始下降。</p>

<hr />

<h3 id="29-每犯一次錯就更新一次-claudemd">29. 每犯一次錯，就更新一次 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code></h3>

<p>當 Claude 出錯時，直接說：</p>

<blockquote>
  <p>更新 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>，避免下次再犯同樣錯誤</p>
</blockquote>

<p>這樣你的規則檔會變成一個會持續進化的系統。
不是寫一次就擺著，而是每次踩坑後都變得更聰明一點。</p>

<hr />

<h3 id="30-用-clauderules-寫條件式規則">30. 用 <code class="language-plaintext highlighter-rouge">.claude/rules/</code> 寫條件式規則</h3>

<p>例如：</p>

<ul>
  <li>只有 <code class="language-plaintext highlighter-rouge">.ts</code> 檔才載入 TypeScript 規則</li>
  <li>只有 <code class="language-plaintext highlighter-rouge">/db</code> 資料夾才載入資料庫規則</li>
</ul>

<p>這樣可以避免不相關規則一直佔 context。
該出現時出現，不該出現時安靜，這才是好規則。</p>

<hr />

<h3 id="31-用-imports-讓-claudemd-保持精簡">31. 用 <code class="language-plaintext highlighter-rouge">@imports</code> 讓 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 保持精簡</h3>

<p>不要把所有規範全文貼進 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>。
可以改成引用：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@docs/git-instructions.md
</code></pre></div></div>

<p>只有需要時 Claude 才去讀。
這樣基礎上下文就能保持輕量。</p>

<hr />

<h3 id="32-skills-是按需載入的知識庫">32. Skills 是「按需載入」的知識庫</h3>

<p>放在 <code class="language-plaintext highlighter-rouge">.claude/skills/</code> 的 skills，可以在需要時擴充 Claude 的能力，但平常不會一直佔著基礎 context。</p>

<p>你可以把它想成函式庫：</p>

<ul>
  <li>需要時載入</li>
  <li>不需要時隱形</li>
</ul>

<p>這比把所有知識都硬塞進 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 乾淨很多。</p>

<hr />

<h3 id="33-claudemd-適合寫建議hooks-適合寫硬規則">33. <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 適合寫建議，Hooks 適合寫硬規則</h3>

<ul>
  <li><code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 比較像「傾向遵守」</li>
  <li>Hooks 才是「每次都會執行」</li>
</ul>

<p>如果你有不能妥協的要求，例如：</p>

<ul>
  <li>格式規範</li>
  <li>安全限制</li>
  <li>程式碼標準</li>
  <li>必跑檢查</li>
</ul>

<p>那就不要只寫在 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>，要用 Hooks。</p>

<hr />

<h3 id="34-用-posttooluse-hook-自動格式化">34. 用 PostToolUse hook 自動格式化</h3>

<p>例如在 <code class="language-plaintext highlighter-rouge">.claude/settings.json</code> 加入：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"PostToolUse"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"matcher"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Edit|Write"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"command"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"npx prettier --write </span><span class="se">\"</span><span class="s2">$CLAUDE_FILE_PATH</span><span class="se">\"</span><span class="s2"> 2&gt;/dev/null || true"</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>這樣每次 Claude 改完檔案後，都能自動跑 Prettier。
省掉手動整理格式這件小事，累積起來就是很大的順暢感。</p>

<hr />

<h3 id="35-用-pretooluse-阻擋危險指令">35. 用 PreToolUse 阻擋危險指令</h3>

<p>你可以在 Bash 工具真正執行前攔截危險命令，例如：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">rm -rf</code></li>
  <li><code class="language-plaintext highlighter-rouge">DROP TABLE</code></li>
</ul>

<p>這類 PreToolUse hook 很像安全護欄。
有了它，你才比較敢讓 Claude 擁有更高自主權。</p>

<hr />

<h2 id="六進階玩法平行工作分身代理隔離環境">六、進階玩法：平行工作、分身代理、隔離環境</h2>

<h3 id="36-用---worktree-開平行分支工作">36. 用 <code class="language-plaintext highlighter-rouge">--worktree</code> 開平行分支工作</h3>

<p>例如：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude <span class="nt">--worktree</span> feature-auth
</code></pre></div></div>

<p>這會建立獨立 working copy。
你可以同時開 3 個 session，讓不同 Claude 各做不同功能，彼此不互相踩到。</p>

<p>當你真的掌握這個模式，AI 協作的吞吐量會直接變成另一個等級。</p>

<hr />

<h3 id="37-用-subagents-保持主-context-乾淨">37. 用 subagents 保持主 context 乾淨</h3>

<p>例如你可以說：</p>

<blockquote>
  <p>用 subagents 幫我釐清 payment flow</p>
</blockquote>

<p>它會開一個獨立實例去讀檔、分析，再把摘要帶回來。
主對話不用被一大坨探索過程塞滿。</p>

<p>這很像把「查資料」和「做決策」分工。</p>

<hr />

<h3 id="38-為重複任務建立自訂-subagents">38. 為重複任務建立自訂 subagents</h3>

<p>透過 <code class="language-plaintext highlighter-rouge">/agents</code>，你可以建立固定用途的代理，例如：</p>

<ul>
  <li>快速搜尋 agent</li>
  <li>嚴格 TypeScript reviewer</li>
  <li>文件撰寫 agent</li>
  <li>PR 檢查 agent</li>
</ul>

<p>久了之後，你會不是只有一個 Claude，
而是有一整組隨叫隨到的小隊。</p>

<hr />

<h3 id="39-agent-teams-處理大規模平行任務">39. Agent teams 處理大規模平行任務</h3>

<p>可以開啟：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS
</code></pre></div></div>

<p>這樣會由一個 team lead 把任務分派給 3 到 5 個 subagents 平行處理。</p>

<p>如果是大型研究、多模組重構、跨範圍分析，這種玩法的速度提升不是線性的，是整個工作模式都變了。</p>

<hr />

<h3 id="40-用-sandbox-做高風險實驗">40. 用 <code class="language-plaintext highlighter-rouge">/sandbox</code> 做高風險實驗</h3>

<p><code class="language-plaintext highlighter-rouge">sandbox</code> 可以在作業系統層級隔離環境，像是用 Seatbelt 或 bubblewrap 去保護主系統。</p>

<p>你可以放心讓 Claude 在裡面做大膽的實驗性重構，跑完再看 diff，喜歡的再合併。</p>

<p>這功能的價值在於：
<strong>你可以讓它更敢做事，但不用拿真實環境陪它賭。</strong></p>

<hr />

<h2 id="真正該優化的不只是程式碼還有你的-ai-工作流">真正該優化的，不只是程式碼，還有你的 AI 工作流</h2>

<p>這 40 個技巧有一個共同核心：</p>

<p>不是叫你變成什麼傳說中的 10x 工程師，
而是讓你別再用「最原始、最手動、最容易卡住」的方式在跟 AI 協作。</p>

<p>真正快的人，優化的不只是一段 code，
而是整套：</p>

<ul>
  <li>怎麼交辦</li>
  <li>怎麼驗證</li>
  <li>怎麼縮短來回</li>
  <li>怎麼減少上下文污染</li>
  <li>怎麼把規則寫成系統</li>
  <li>怎麼讓 AI 平行工作</li>
</ul>

<p>這些差距，平常一天感覺不大。
但一週、一個月、一季累積下來，會變成非常誇張的複利。</p>

<hr />

<h2 id="建議你這週就先做的-5-件事">建議你這週就先做的 5 件事</h2>

<p>如果你不想一次吃下 40 條，可以先做這 5 個：</p>

<ol>
  <li>設定 <code class="language-plaintext highlighter-rouge">cc</code> alias</li>
  <li>開始用 Plan Mode 處理多檔案任務</li>
  <li>在 prompt 裡加入「跑測試並修到通過」</li>
  <li>建立精簡版 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code></li>
  <li>把常用安全指令加入 <code class="language-plaintext highlighter-rouge">/permissions</code> allowlist</li>
</ol>

<p>這五個先做好，工作流通常就會先明顯順起來。</p>]]></content><author><name></name></author><category term="claude-code" /><category term="claude-code" /><summary type="html"><![CDATA[40 個 Claude Code 最值得先學起來的最佳實踐，從基礎設定、工作流加速、上下文管理，到自動化驗證與平行多代理協作，幫你把 AI 開發工具從補字工具升級為完整的協作作業系統。]]></summary></entry><entry><title type="html">AI 時代，職場真正的分水嶺，已經不是 Junior / Senior，而是 Executor / Orchestrator</title><link href="https://swanky.github.io/technical/ai-executor-orchestrator/" rel="alternate" type="text/html" title="AI 時代，職場真正的分水嶺，已經不是 Junior / Senior，而是 Executor / Orchestrator" /><published>2026-03-22T00:00:02+00:00</published><updated>2026-03-22T00:00:02+00:00</updated><id>https://swanky.github.io/technical/ai-executor-orchestrator</id><content type="html" xml:base="https://swanky.github.io/technical/ai-executor-orchestrator/"><![CDATA[<p>以前我們用 Junior / Senior 區分職場階級，背後的邏輯很直觀：做得久、懂得多、出錯少，就是資深。</p>

<p>但這個邏輯，正在被 AI 快速瓦解。</p>

<p>問題不是「AI 會不會取代我」，而是一個更根本的問題：<strong>你的核心價值，是在執行，還是在編排？</strong></p>

<hr />

<h2 id="executor把被交辦的事做完">Executor：把被交辦的事做完</h2>

<p>Executor 是「把任務完成的人」。收到需求後開始執行，交付內容完成任務。</p>

<p>這不是壞事。每個組織都需要可靠的執行力。但問題在於，<strong>AI 最先滲透的，就是這一層</strong>。</p>

<p>標準化、可重複、易拆成步驟的工作，正在被 AI 接手：</p>

<ul>
  <li>寫程式初版</li>
  <li>整理文件、製作報告</li>
  <li>產出測試案例</li>
  <li>彙整資料、格式轉換</li>
  <li>標準化流程中的重複環節</li>
</ul>

<p>如果一個人的主要價值，長期停留在「把被交辦的事做完」，面臨的不是「AI 會不會取代我」的問題，而是稀缺性正在下降的現實。</p>

<hr />

<h2 id="orchestrator讓事情被做對的人">Orchestrator：讓事情被做對的人</h2>

<p>Orchestrator 不一定親手做每件事，但清楚理解：</p>

<ul>
  <li>問題真正是什麼（而不是被告知的版本）</li>
  <li>哪些事優先執行</li>
  <li>任務如何拆解，交給誰或哪個工具</li>
  <li>哪些判斷要留給人類，哪些可以交給 AI</li>
  <li>風險在哪裡</li>
  <li>「真正完成」的定義是什麼</li>
</ul>

<p>核心在於<strong>編排</strong>，而非執行。編排問題、編排流程、編排人力、編排工具、編排判斷。</p>

<p>AI 讓執行成本快速下降，但這件事同時放大了編排能力的價值——因為你需要有人知道「叫 AI 去做什麼」，而不只是「自己去做」。</p>

<hr />

<h2 id="為什麼年資不再是保障">為什麼年資不再是保障</h2>

<p>過去，Senior 之所以值錢，很大程度是因為他累積了大量「執行經驗」：知道哪些做法行、哪些不行、遇到什麼問題該怎麼處理。這些經驗，是靠時間換來的。</p>

<p>但現在，這類「執行型知識」越來越容易被 AI 取代或縮短學習曲線。</p>

<p>更關鍵的是：<strong>並非所有資深員工都是 Orchestrator</strong>。有些工作十幾年的人，仍然停留在被動執行的層級——等待指令、完成交辦、回報結果。反之，一些年輕員工，若擅長定義問題、跨部門整合、有效使用 AI 工具，已經開始佔據編排的位置。</p>

<p>這就是分水嶺真正在哪裡的原因：不在年資，而在思維模式。</p>

<hr />

<h2 id="orchestrator-的五個核心能力">Orchestrator 的五個核心能力</h2>

<h3 id="1-問題定義能力">1. 問題定義能力</h3>

<p>在開始做任何事之前，先搞清楚「真正要解的問題是什麼」。</p>

<p>很多時候，被交辦下來的需求，只是症狀，不是根因。Orchestrator 會往上溯源，確認問題本身定義正確，再決定怎麼做，而不是收到什麼就做什麼。</p>

<h3 id="2-任務拆解能力">2. 任務拆解能力</h3>

<p>把一個模糊的目標，拆解成可以執行的步驟。哪些部分適合讓 AI 完成、哪些需要人類判斷、哪些需要外部確認、哪些有依賴順序。</p>

<p>這個能力，決定了你能不能有效使用 AI 作為工具，而不只是偶爾問它幾個問題。</p>

<h3 id="3-結果判斷能力">3. 結果判斷能力</h3>

<p>AI 給出的答案，你能不能判斷它可不可用？</p>

<p>這不是指你要比 AI 更會寫程式，而是你要對「做對了」有清楚的標準。能辨識輸出品質，能發現問題，能決定何時接受、何時打回去重做。</p>

<h3 id="4-跨域翻譯能力">4. 跨域翻譯能力</h3>

<p>連接商業、產品、技術這三種語言。</p>

<p>商業端說「我們要提升轉換率」，技術端說「這個功能要花三個月」，產品端說「用戶體驗不能妥協」。Orchestrator 是能在這三者之間做精準翻譯、找到真正可行方案的人。</p>

<h3 id="5-成果責任感">5. 成果責任感</h3>

<p>不只是交付，而是對最終結果負責。</p>

<p>Executor 的責任邊界通常到「完成交辦」為止。Orchestrator 的責任邊界是「事情有沒有真的往對的方向走」。這個差異，在 AI 大量介入工作流程之後，會越來越明顯。</p>

<hr />

<h2 id="如何開始轉型">如何開始轉型</h2>

<p>轉型不是要你今天就辭掉執行工作，而是在日常中練習 Orchestrator 的思維：</p>

<p><strong>在接到任務時，先問「這個問題的定義對嗎？」</strong>
不要直接跳進去做，先花五分鐘確認你理解的問題和對方想解的問題一致。</p>

<p><strong>開始有意識地使用 AI 完成執行部分</strong>
不是「叫 AI 幫你做事」，而是「你負責定義問題和驗收，AI 負責執行」。這個角色分工，就是 Orchestrator 的練習。</p>

<p><strong>培養對結果的主動意識</strong>
不只問「我的工作做完了嗎？」，而是問「這件事有沒有往對的方向走？」主動追蹤結果，不等別人來告訴你。</p>

<p><strong>練習跨域溝通</strong>
下一次和不同背景的人開會，試著在他們的語言框架裡說話，而不是用自己習慣的術語。</p>

<hr />

<h2 id="結語">結語</h2>

<p>AI 沒有讓職場變得更簡單，它讓職場的分層更清晰了。</p>

<p>執行，越來越便宜。
判斷與編排，越來越值錢。</p>

<p>未來的差距，不只在於誰會用 AI——幾乎每個人都會。差距在於：<strong>誰還停留在執行，誰已負責編排。</strong></p>

<p>這個轉變已經在發生。你站在哪一邊，由你自己決定。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[AI 快速壓縮執行成本，卻放大了判斷與編排的價值。職場分水嶺不再是年資，而是你停留在 Executor，還是已經成為 Orchestrator。]]></summary></entry><entry><title type="html">當工程團隊開始導入 Claude Code：16 型工程師的真實反應圖鑑</title><link href="https://swanky.github.io/technical/claude-code-engineer-types/" rel="alternate" type="text/html" title="當工程團隊開始導入 Claude Code：16 型工程師的真實反應圖鑑" /><published>2026-03-22T00:00:02+00:00</published><updated>2026-03-22T00:00:02+00:00</updated><id>https://swanky.github.io/technical/claude-code-engineer-types</id><content type="html" xml:base="https://swanky.github.io/technical/claude-code-engineer-types/"><![CDATA[<h2 id="不是每個人都在抗拒-ai有些人只是用不同方式捍衛專業">不是每個人都在抗拒 AI，有些人只是用不同方式捍衛專業</h2>

<p>最近這一年，應該很多工程團隊都開始進入同一個場景。</p>

<p>主管在會議上說：「我們接下來會逐步導入 Claude Code，看看怎麼提升開發效率。」</p>

<p>這句話看起來很普通。但在不同工程師耳裡，實際上會自動翻譯成 16 種完全不同的語言。</p>

<p>有人聽到的是：終於可以少寫一點無聊樣板。有人聽到的是：很好，接下來一定會有人拿錯誤率不明的輸出來衝 KPI。也有人聽到的是：公司是不是準備用 AI 包裝人力壓縮？</p>

<p>所以，AI 工具導入這件事，表面是工具選型，骨子裡其實是人格測試、風險偏好測試、組織成熟度測試。Claude Code 只是把這件事照得更亮而已。</p>

<p>以下這 16 個小故事，不是要把人硬塞進 MBTI 標籤裡。而是想用一種比較誠實的方式說明：</p>

<p>同樣一套 AI 工具，對不同工程師來說，根本不是同一件事。</p>

<hr />

<h2 id="16-型工程師遇到-claude-code-的反應">16 型工程師遇到 Claude Code 的反應</h2>

<h3 id="istj先不要興奮先把規則打開">ISTJ：先不要興奮，先把規則打開</h3>

<p>會議一結束，大家有人去試功能，有人去泡咖啡。ISTJ 默默打開公司資安規範，開始確認哪些 repo 可以碰、哪些資料不該進模型、哪些產出一定要人工 review。</p>

<p>三天後，別人還在討論「這工具好像很強」，ISTJ 已經整理出一份內部使用守則，檔名很可能叫做：AI_Coding_Assistant_Usage_v1.3_final_final.xlsx</p>

<p>他不是不願意用。他只是很清楚，工程世界最可怕的從來不是工具不夠強，而是強工具落在沒紀律的流程裡。當大家在 high 的時候，他是那個提醒你「產線不是遊樂園」的人。</p>

<hr />

<h3 id="isfj我不是反對我只是怕別人被坑">ISFJ：我不是反對，我只是怕別人被坑</h3>

<p>ISFJ 聽完導入說明後，第一反應通常不是自己，而是團隊。</p>

<p>他會想：剛入職的同事會不會太依賴 AI？如果有人把 AI 生成的 code 沒看清楚就 merge，最後是不是又是整組人一起收拾？</p>

<p>所以 ISFJ 一開始用得很保守。先拿它整理文件、補註解、寫測試案例草稿。不是因為他不會用，而是他很怕工具先把團隊裡最不穩的人推下去。</p>

<p>等他真的建立信任後，他反而會成為最好的一類推動者。因為他不會炫技，他會教。他不會說「這超神你快用」，他會說「這段你先這樣用，比較安全」。</p>

<p>很多團隊 AI 真正落地，不是靠最會秀的人，而是靠這種會顧到別人能不能跟上的人。</p>

<hr />

<h3 id="infj這不是工具問題這是工作意義問題">INFJ：這不是工具問題，這是工作意義問題</h3>

<p>當別人在討論 Claude Code 能不能幫忙寫 CRUD、補 test、掃 codebase 的時候，INFJ 想的是另一題：</p>

<p>如果我們把大量思考外包給工具，那工程師的價值最後會剩什麼？</p>

<p>這種問題在導入會議上通常顯得有點太哲學。但它其實非常核心。</p>

<p>INFJ 不是不用，他通常也會認真研究。只是他不會滿足於「比較快」這種答案。他更在意的是，這個工具到底是在解放人，還是在溫柔地把人訓練成更高級的搬運工。</p>

<p>如果組織只會講效率，不講判斷、不講責任、不講職涯升級，INFJ 會越用越冷。不是因為工具不好，而是因為他會開始懷疑這家公司到底想把工程文化帶去哪裡。</p>

<hr />

<h3 id="intj很好現在可以重新設計整個工作流了">INTJ：很好，現在可以重新設計整個工作流了</h3>

<p>INTJ 往往是最早理解 Claude Code 真正槓桿點的人之一。</p>

<p>他不會把它當成「幫忙補幾行 code」的小工具。他看到的是整個開發流程可以怎麼重新切。</p>

<p>例如：需求理解交給人主導，樣板與探索交給 AI。設計與邊界條件由人決策，重複性 refactor 交給工具。PR review 變成審查「決策品質」，而不是肉眼找縮排。</p>

<p>INTJ 很可能在你還在研究 prompt 寫法時，已經默默想好團隊 3 個月後的新節奏。可怕的是，他通常還真的想得到。</p>

<p>但他的風險也很經典：太快把別人還沒準備好的未來，當成現在就該實施的常態。</p>

<p>如果沒有治理與共識，INTJ 眼中的「優化」，很容易變成別人眼中的「又來了，這次是 AI 版」。</p>

<hr />

<h3 id="istp先拿一個最煩的-bug-來試">ISTP：先拿一個最煩的 bug 來試</h3>

<p>ISTP 對新工具的態度很簡單。不要講夢想，不要講願景，不要拿十頁簡報告訴我它能改變世界。</p>

<p>你先把那個卡兩天的 bug 幫我抓出來。</p>

<p>他會直接把 Claude Code 丟到真實場景裡測。log 很亂？拿去看。老 code 看不懂？拿去問。測試失敗原因太散？拿去拆。</p>

<p>如果真的有用，他接受速度很快。如果只是在 demo 裡看起來很厲害，實戰一碰就開始胡扯，他也會很快失去耐心。</p>

<p>ISTP 是那種不太參加 AI 信仰大會的人。他不會跟你辯論未來，他只看今天能不能少浪費 90 分鐘。</p>

<p>對團隊來說，這種人很好，因為他是最接近真相的驗證器。Claude Code 到底是工具，還是會發光的幻覺，丟給 ISTP 測一次通常就有答案。</p>

<hr />

<h3 id="isfp我在意的不只是能不能用還有它會不會把東西寫醜">ISFP：我在意的不只是能不能用，還有它會不會把東西寫醜</h3>

<p>很多人以為 ISFP 只在意感受，不在意工程。這種誤解本身就很像某些很醜的 legacy system，存在很久但不值得尊重。</p>

<p>ISFP 對 Claude Code 的反應，常常是這樣：「它可以幫忙，但我不想最後整個專案變成一堆沒有呼吸感的程式碼。」</p>

<p>他在意命名、在意可讀性、在意使用者感受，也在意 code 是不是保有一點人的審美。所以他可能不會是最早把 AI 開到最大輸出的人。但他很可能是最早發現「這段雖然能跑，但很醜、很亂、很沒靈魂」的人。</p>

<p>說穿了，ISFP 是在提醒團隊一件很重要的事：可用，不等於可愛。能跑，不等於值得留下。</p>

<p>AI 很會生產東西。但有些人負責提醒你，別把倉庫當作品。</p>

<hr />

<h3 id="infp我不是不接受我只是不想變成自己不喜歡的那種工程師">INFP：我不是不接受，我只是不想變成自己不喜歡的那種工程師</h3>

<p>INFP 面對 Claude Code，常見的掙扎不是技術，而是身份認同。</p>

<p>他會想：如果我越來越依賴 AI，我的能力到底算什麼？這是協作，還是偷懶？我是在提升效率，還是在慢慢失去自己的判斷與風格？</p>

<p>所以 INFP 常常不會第一時間大用特用。他需要先找到一個心理上說得過去的位置。例如把它當成腦力陪跑員、草稿助手、第二視角，而不是自己的替身。</p>

<p>一旦這個位置找到了，他其實會用得很好。因為 INFP 很擅長從混亂中找到更好的表達方式，對重構、命名、文件整理、抽象概念釐清都可能很有感。</p>

<p>只是前提是，他得先相信自己不是在把專業賣給便利性。</p>

<hr />

<h3 id="intp先別急著導入我想先研究它到底為什麼有時候會亂講">INTP：先別急著導入，我想先研究它到底為什麼有時候會亂講</h3>

<p>INTP 遇到 Claude Code，第一反應通常不是「怎麼用最快」，而是「它的邊界到底在哪」。</p>

<p>他會開始研究：</p>

<ul>
  <li>哪種 prompt 比較穩</li>
  <li>它對大型 codebase 的理解是怎麼失真</li>
  <li>哪些任務看起來適合，其實風險很高</li>
  <li>為什麼有些時候它信心滿滿地講錯話，還講得像真的</li>
</ul>

<p>別人把 AI 工具當同事，INTP 會先把它當研究對象。像在觀察一隻很聰明但偶爾會亂咬線的機械貓。</p>

<p>他可能不急著推廣，因為他在意模型可信度。但等他研究完，通常會變成團隊裡最知道怎麼把 AI 用在對的位置的人。</p>

<p>問題只在於，INTP 常常研究得太深。深到隔壁組都已經上線兩版流程了，他還在說：「我最近發現它對上下文切片的錯誤自信很有意思。」</p>

<p>有意思是有意思。只是專案經理血壓也很有意思。</p>

<hr />

<h3 id="estp能快就先快之後再說">ESTP：能快就先快，之後再說</h3>

<p>ESTP 很容易成為團隊裡最早把 Claude Code 用得飛起來的人。</p>

<p>原因不複雜。他一看到「可以更快」，就會立刻開始找捷徑。自動補 code、快速搭 prototype、先把流程跑起來，再回頭補一些應該先想清楚的東西。對，他就是那種很容易把「探索」跟「直接衝」混在一起的人。</p>

<p>這種人超有破壞力，也超有產值。看你有沒有把護欄裝好而已。</p>

<p>如果團隊治理成熟，ESTP 會是 AI 導入期最有價值的前鋒。他能快速試出哪些場景真的有用。但如果治理鬆散，他也可能成為第一個把「方便」用成「事故」的人。</p>

<p>他不是壞。他只是每次看到阻力，都先直覺判定那是障礙，不一定會先想到那也可能是保險絲。</p>

<hr />

<h3 id="esfp這工具到底讓工作更順還是只是多一層麻煩">ESFP：這工具到底讓工作更順，還是只是多一層麻煩</h3>

<p>ESFP 對 Claude Code 的接受度，很看使用體驗。</p>

<p>流程卡不卡？介面順不順？真的有幫忙，還是只是要多學一套新口令？導入之後團隊氛圍是更輕鬆，還是每個人都開始焦慮自己不夠會用？</p>

<p>他不一定會用最艱深的方式分析，但他常常很快就能感覺到：這工具到底是在幫忙，還是在製造另一種形式的工作表演。</p>

<p>如果你把 AI 導入搞得像考試、像 KPI、像一種新的內卷語言，ESFP 很快就會退。但如果它真的能把一些無聊雜事處理掉，讓團隊有餘裕做更好的事，他也會很自然地接納。</p>

<p>說白了，ESFP 很擅長幫團隊測出一件事：這套東西是不是只對簡報好看，對日常不好活。</p>

<hr />

<h3 id="enfp太好了來想十種玩法">ENFP：太好了，來想十種玩法</h3>

<p>ENFP 一聽到 Claude Code，腦子裡通常不是一個 use case，而是一串煙火。</p>

<p>它可以幫 onboarding。可以幫新人理解專案。可以幫設計 API 草案。可以把文件整理成人話。可以幫 PM 跟工程師翻譯彼此。可以拿來做內訓。可以接進知識庫。可以…</p>

<p>對，ENFP 常常在工具真正落地前，就已經想出 27 種應用方向。這很棒，也很危險。</p>

<p>棒的是，他能看到很多人看不到的可能性。危險的是，他也可能在組織還沒學會走路時，就開始規劃飛行路線。</p>

<p>ENFP 最適合的角色，常常不是一個人單飛，而是和比較穩的夥伴搭配。他負責開新門，別人負責確認門後面不是懸崖。</p>

<hr />

<h3 id="entp規則那是我用來測試邊界的東西">ENTP：規則？那是我用來測試邊界的東西</h3>

<p>如果團隊裡有人會在導入 Claude Code 的第二天，就開始研究怎麼把它串進各種奇怪流程、怎麼最大化上下文、怎麼把工作流改得像一場黑客松，那很可能就是 ENTP。</p>

<p>ENTP 很容易成為 AI 工具的超級使用者。因為他不只會用，還會玩，還會挑戰它的極限，還會順便質疑你為什麼流程原本長這樣。</p>

<p>他是那種會讓組織又愛又怕的人。愛的是，他常常真的能找到高槓桿用法。怕的是，他也常常在制度還沒寫完前，就先把制度繞過去了。</p>

<p>如果你管理得好，ENTP 是 AI 導入期的發電機。如果你管理不好，他就是你每週風險會議的靈感來源。</p>

<hr />

<h3 id="entj這很好接下來談規模化">ENTJ：這很好，接下來談規模化</h3>

<p>對 ENTJ 來說，Claude Code 不是個人效率工具而已。它是管理議題。</p>

<p>他會問：</p>

<ul>
  <li>哪些角色最適合先導入</li>
  <li>哪些任務會有最高 ROI</li>
  <li>怎麼訂使用規範</li>
  <li>怎麼衡量效益</li>
  <li>怎麼避免大家只是「感覺有比較快」</li>
</ul>

<p>ENTJ 很少停留在「這東西酷不酷」。他直接跳到「怎麼部署、怎麼追蹤、怎麼複製」。</p>

<p>這種人對組織很重要，因為再好的工具如果不能規模化，就只是少數高手的私人外掛。但 ENTJ 的盲點也很經典：有時候他會太早把人當成資源配置表上的變數，而低估了適應新工具所需的心理成本。</p>

<p>他看到的是效率曲線。但有些人看到的是職涯焦慮曲線。如果只管前者，不管後者，導入就會表面漂亮、內部發炎。</p>

<hr />

<h3 id="estj可以導但流程要先立起來">ESTJ：可以導，但流程要先立起來</h3>

<p>ESTJ 聽到導入 Claude Code 的時候，第一反應通常不是興奮，而是治理。</p>

<p>他很可能會馬上追問：哪些情境可用？哪些不能用？產出責任算誰的？程式碼審查標準要不要調整？新人跟資深工程師是不是要不同規則？有沒有 audit 軌跡？</p>

<p>很多人會覺得這種反應很煩。尤其在 AI 熱潮裡，大家都想談創新，不太想談管控。但成熟團隊最後能走遠，往往就是因為有 ESTJ 這種人。</p>

<p>他不一定是最早用得炫的人。但他很可能是那個讓工具從「有人在玩」變成「整隊都能安全使用」的人。</p>

<p>沒有他，AI 導入很像夜市試吃。有他之後，才比較像供應鏈。</p>

<hr />

<h3 id="esfj大家都跟得上嗎">ESFJ：大家都跟得上嗎</h3>

<p>ESFJ 最敏感的，不是工具，而是團隊氣氛。</p>

<p>他會很快察覺一些微妙現象：有人開始不好意思問問題。有人明明不熟，卻裝得很會。有人用得飛快，開始不耐煩別人的學習速度。有人嘴上說沒差，實際上已經在擔心自己被取代。</p>

<p>ESFJ 很少是最聲量大的那個。但他常常是最早看出團隊心理裂縫的人。</p>

<p>如果有 ESFJ 參與導入，你會比較容易建立一個不羞辱人的學習氛圍。因為他會想辦法把「你怎麼還不會」變成「我們一起把這件事學會」。</p>

<p>而這其實超重要。很多 AI 工具失敗，不是因為能力不夠，而是因為導入方式太像一場公開排名賽。</p>

<hr />

<h3 id="enfj我來幫大家把混亂翻譯成共識">ENFJ：我來幫大家把混亂翻譯成共識</h3>

<p>ENFJ 在 Claude Code 導入期，很容易扮演橋樑角色。</p>

<p>工程師覺得管理層只想要效率。管理層覺得工程師太保守。資安覺得大家都太樂觀。新人覺得自己快被新名詞淹死。</p>

<p>這時 ENFJ 很可能會站出來，把各方的語言翻譯成彼此聽得懂的版本。他會說明工具價值，但也不會忽略人的不安。他會推動 adoption，但不會把沒跟上的人當包袱。</p>

<p>這種人不一定是技術最極限的玩家。但他很可能是讓團隊不在導入過程中撕裂的人。</p>

<p>在任何變革裡，能夠同時理解技術、節奏與人心的人，通常都不是最吵的，卻非常關鍵。</p>

<hr />

<h2 id="分類解說4-大群的典型反應">分類解說：4 大群的典型反應</h2>

<p>看完 16 型，其實可以再往上收斂成 4 大類。這樣你在團隊導入 Claude Code 時，會更容易抓到重點。</p>

<h3 id="一sj-類istjisfjestjesfj">一、SJ 類：ISTJ、ISFJ、ESTJ、ESFJ</h3>

<p>這群人不是反對 AI。他們反對的是沒有規則、沒有責任、沒有邊界的 AI。</p>

<p>他們最在意的是：</p>

<ul>
  <li>風險有沒有被管理</li>
  <li>流程有沒有被定義</li>
  <li>團隊有沒有人被落下</li>
  <li>這件事能不能長期穩定運作</li>
</ul>

<p>很多公司會以為 SJ 是導入阻力。其實不是。SJ 比較像煞車系統。你在直線加速的時候覺得它很煩，但真的遇到彎，它就是保命裝置。</p>

<p><strong>管理建議：</strong> 先給規範、再談擴散。先講責任、再講自由。這群人一旦信任，會變成最穩的落地派。</p>

<hr />

<h3 id="二sp-類istpisfpestpesfp">二、SP 類：ISTP、ISFP、ESTP、ESFP</h3>

<p>這群人最看重的是手感與實效。</p>

<p>他們不太吃大理論。Claude Code 好不好，不是看簡報，而是看它能不能真的：</p>

<ul>
  <li>少掉重複勞動</li>
  <li>加快 debug</li>
  <li>提升日常順暢度</li>
  <li>不要把工作流程搞得更煩</li>
</ul>

<p>SP 類通常是最早讓你知道「這東西在真實世界到底行不行」的人。只是其中像 ESTP 這種，很可能也會最快踩到紅線。</p>

<p><strong>管理建議：</strong> 給他們真實場景、低風險試點、明確護欄。不要先講大道理，先讓他們感受到省事。</p>

<hr />

<h3 id="三nt-類intjintpentpentj">三、NT 類：INTJ、INTP、ENTP、ENTJ</h3>

<p>這群人看到的不是工具，是系統重構機會。</p>

<p>他們通常適應很快，也最容易找到高 ROI 用法。但同時，他們也是最可能在制度還沒成熟前，就先把速度拉到危險區的人。</p>

<p>NT 類的典型特徵是：</p>

<ul>
  <li>會思考更大範圍的工作流改造</li>
  <li>對槓桿、效率、抽象化特別敏感</li>
  <li>很容易變成超級使用者</li>
  <li>也很容易讓其他人來不及跟上</li>
</ul>

<p><strong>管理建議：</strong> 不要壓制他們探索，但一定要有沙盒、審核、紅線。NT 是最好的前鋒，但前鋒前面最好不要是玻璃牆。</p>

<hr />

<h3 id="四nf-類infjinfpenfjenfp">四、NF 類：INFJ、INFP、ENFJ、ENFP</h3>

<p>這群人最在意的不是工具本身，而是工具會把團隊與工作文化帶往哪裡。</p>

<p>他們的敏感點常常在：</p>

<ul>
  <li>人會不會被工具壓扁</li>
  <li>學習環境會不會變得羞辱</li>
  <li>專業感會不會被稀釋</li>
  <li>我們到底是在升級能力，還是在包裝焦慮</li>
</ul>

<p>很多主管低估 NF 類的價值。但實際上，團隊能不能在 AI 導入期維持健康氛圍，很常要靠這群人。</p>

<p><strong>管理建議：</strong> 不要只講效率，也要講成長、責任、判斷與職涯升級。NF 類需要的不只是工具說明，而是合理的導入敘事。</p>

<hr />

<h2 id="總體評論真正的差別不是誰比較會用而是誰怎麼看待專業">總體評論：真正的差別，不是誰比較會用，而是誰怎麼看待專業</h2>

<p>如果把這 16 型的反應放在一起看，我覺得最有趣的一點是：</p>

<p>大家表面上是在談 Claude Code，實際上是在談自己相信怎樣才算「好工程」。</p>

<p>有些人相信好工程是可控、可驗證、可交付。有些人相信好工程是快速試錯、最大化產出。有些人相信好工程是優雅、可讀、保有人味。也有些人相信好工程不只是寫出東西，而是建立一個大家都能成長的環境。</p>

<p>所以 AI 工具導入，真正測出來的從來不只是學習速度。而是：</p>

<ul>
  <li>你的團隊對品質的底線在哪</li>
  <li>對責任的界線在哪</li>
  <li>對專業的想像在哪</li>
  <li>對人的耐心還剩多少</li>
</ul>

<p>Claude Code 不會自動讓團隊變強。它比較像一面放大鏡。</p>

<p>流程本來清楚的團隊，用了之後會更快。判斷本來成熟的團隊，用了之後會更準。但如果流程本來就亂、責任本來就糊、管理本來就愛把壓力包裝成創新，那 AI 只會讓混亂更高級、讓錯誤更有效率、讓焦慮更有科技感。</p>

<p>講白一點，AI 工具最大的魔法，常常不是創造問題。而是讓原本就存在的問題，再也藏不住。</p>

<hr />

<h2 id="最後結論">最後結論</h2>

<p>如果你是主管，導入 Claude Code 時最不該做的事，就是期待所有人用同一種速度、同一種理由接受它。</p>

<p>真正成熟的做法，不是問：「誰最會用 AI？」</p>

<p>而是問：</p>

<ul>
  <li>誰適合先探索高價值用法？</li>
  <li>誰適合建立規範與護欄？</li>
  <li>誰適合協助擴散與教學？</li>
  <li>誰能提醒團隊不要在追效率時，把品質、責任與人性一起丟掉？</li>
</ul>

<p>因為最好的 AI 導入，從來不是讓一群高手飛得更遠。而是讓整個團隊都知道：</p>

<p>什麼可以交給 AI，什麼一定要人負責。什麼是效率，什麼只是精緻化的亂做。什麼叫升級，什麼其實只是把焦慮重新包裝。</p>

<p>工具會越來越強，這大概沒有懸念。真正會拉開差距的，是哪些團隊有能力把工具變成能力，而不是變成新的內耗來源。</p>

<p>不然很多公司的 AI 導入，最後都只會停在一個很熟悉的企業畫面：</p>

<p>買了。講了。試了。最後生成了一堆更流暢的混亂。😌</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[AI 工具導入這件事，表面是工具選型，骨子裡其實是人格測試、風險偏好測試、組織成熟度測試。同樣一套 Claude Code，對 16 型工程師來說根本不是同一件事。]]></summary></entry><entry><title type="html">你不知道的 Claude Code：從聊天工具到工程代理，你真正該學的是治理</title><link href="https://swanky.github.io/claude-code/claude-code-governance/" rel="alternate" type="text/html" title="你不知道的 Claude Code：從聊天工具到工程代理，你真正該學的是治理" /><published>2026-03-22T00:00:01+00:00</published><updated>2026-03-22T00:00:01+00:00</updated><id>https://swanky.github.io/claude-code/claude-code-governance</id><content type="html" xml:base="https://swanky.github.io/claude-code/claude-code-governance/"><![CDATA[<p>很多人第一次用 Claude Code，都用 ChatBot 的直覺在操作：</p>

<p>丟一段需求，等它幫你寫完。不對就再補 prompt。再不對就把規則寫更長。再不對就接更多 MCP、開更多子代理。</p>

<p>結果常常不是越來越強，而是越來越亂。上下文變髒、工具越接越多卻越容易選錯、規則越寫越長卻越不遵守。</p>

<p>這不是 prompt 技巧不夠。而是你在用一個「工程代理系統」，卻還用「聊天機器人」的方式管理它。</p>

<p>這篇文章的目標，是把 Claude Code 從「看起來很會寫程式的聊天視窗」，還原成一套可以治理、可以驗證、可以長期維護的工程工作系統。</p>

<hr />

<h2 id="一底層是代理循環不是對話回應">一、底層是代理循環，不是對話回應</h2>

<p>Claude Code 的核心不是「回答問題」，而是反覆執行一個循環：</p>

<blockquote>
  <p>收集上下文 → 採取行動 → 驗證結果 → 完成，或回到收集</p>
</blockquote>

<p>這個循環看似簡單，但實務上會不會失控，取決於你怎麼設計它的上下文、行動能力、控制邊界、隔離方式與驗證機制。</p>

<p>卡住的地方幾乎從來不是模型不夠聰明。更多時候是：給了它錯誤的上下文、沒辦法判斷結果對不對、也沒辦法撤回。</p>

<p>把 Claude Code 想成一個剛進團隊的高能力工程師。你如果只丟一句「去做」，它可能也會開始動。但真正決定品質的，從來不是它願不願意做，而是：它拿到了哪些資訊、可以做哪些事、哪些事不能做、什麼情況要停、怎樣才算完成。</p>

<hr />

<h2 id="二六層架構治理-claude-code-的完整框架">二、六層架構：治理 Claude Code 的完整框架</h2>

<p>要把 Claude Code 用穩，最實用的方式是把它拆成六層來看：</p>

<table>
  <thead>
    <tr>
      <th>層次</th>
      <th>組件</th>
      <th>負責的事</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>L1</td>
      <td>CLAUDE.md / rules / memory</td>
      <td>長期上下文、協作契約、固定約束</td>
    </tr>
    <tr>
      <td>L2</td>
      <td>Tools / MCP</td>
      <td>動作能力、外部連接、資料讀寫</td>
    </tr>
    <tr>
      <td>L3</td>
      <td>Skills</td>
      <td>工作方法論、按需載入的工作流</td>
    </tr>
    <tr>
      <td>L4</td>
      <td>Hooks</td>
      <td>強制插入、審計點、確定性控制</td>
    </tr>
    <tr>
      <td>L5</td>
      <td>Subagents</td>
      <td>隔離的工作單元、高噪音任務</td>
    </tr>
    <tr>
      <td>L6</td>
      <td>Verifiers</td>
      <td>驗證閉環、可回滾、可審查</td>
    </tr>
  </tbody>
</table>

<p>這六層缺一不可。只強化其中一層，整體系統反而容易失衡：</p>

<ul>
  <li>CLAUDE.md 寫太長 → 常駐上下文先污染自己</li>
  <li>工具接太多 → Claude 選工具像在逛迷宮</li>
  <li>Subagent 開到處都是 → 狀態開始漂移</li>
  <li>沒有驗證 → 最後只能靠「它說做完了」自我安慰</li>
</ul>

<p>這就是很多人越用越卡的根源。</p>

<hr />

<h2 id="三先把名詞切清楚">三、先把名詞切清楚</h2>

<p>這幾個詞很容易混在一起：</p>

<table>
  <thead>
    <tr>
      <th>組件</th>
      <th>定位</th>
      <th>給 Claude 的是什麼</th>
      <th>典型用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tool / MCP</td>
      <td>動作能力</td>
      <td>新功能</td>
      <td>讀檔、改檔、查 GitHub、跑指令</td>
    </tr>
    <tr>
      <td>Skill</td>
      <td>工作方法</td>
      <td>流程與框架</td>
      <td>發布前清單、故障分診流程</td>
    </tr>
    <tr>
      <td>Hook</td>
      <td>硬性控制</td>
      <td>確定性插入點</td>
      <td>編輯後自動 lint、阻止修改特定檔案</td>
    </tr>
    <tr>
      <td>Subagent</td>
      <td>隔離執行</td>
      <td>獨立上下文</td>
      <td>掃整個 repo、大量測試、大型審查</td>
    </tr>
  </tbody>
</table>

<p>一句話記住：要給新能力用 Tool/MCP，要給方法用 Skill，要做硬限制用 Hook，要做隔離探索用 Subagent。</p>

<hr />

<h2 id="四上下文工程最重要的系統約束">四、上下文工程：最重要的系統約束</h2>

<p>很多人把上下文當「容量問題」，其實卡住的地方通常不是不夠長，而是太吵了——有用的資訊被大量無關內容淹沒。</p>

<h3 id="真實的上下文成本">真實的上下文成本</h3>

<p>Claude Code 的 200K 上下文並非全部可用。實際成本分布大致如下：</p>

<table>
  <thead>
    <tr>
      <th>類型</th>
      <th>佔用量</th>
      <th>說明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>系統指令</td>
      <td>~2K</td>
      <td>固定開銷</td>
    </tr>
    <tr>
      <td>啟用的 Skill 描述符</td>
      <td>~1–5K</td>
      <td>每個 Skill 的描述常駐</td>
    </tr>
    <tr>
      <td>MCP Server 工具定義</td>
      <td>~10–20K</td>
      <td><strong>最大隱形殺手</strong></td>
    </tr>
    <tr>
      <td>LSP 狀態</td>
      <td>~2–5K</td>
      <td>固定開銷</td>
    </tr>
    <tr>
      <td>CLAUDE.md + Memory</td>
      <td>~3–7K</td>
      <td>半固定</td>
    </tr>
    <tr>
      <td>動態可用（對話、檔案、工具輸出）</td>
      <td>~160–180K</td>
      <td>真正能用的空間</td>
    </tr>
  </tbody>
</table>

<p>一個典型 MCP Server（如 GitHub）包含 20–30 個工具定義，每個約 200 tokens，合計 4,000–6,000 tokens。接 5 個 Server，光工具定義就吃掉約 25,000 tokens（12.5%）。在需要大量讀碼的場景，這 12.5% 很關鍵。</p>

<h3 id="建議的上下文分層">建議的上下文分層</h3>

<table>
  <thead>
    <tr>
      <th>載入方式</th>
      <th>放哪裡</th>
      <th>放什麼</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>始終常駐</td>
      <td>CLAUDE.md</td>
      <td>專案契約、建置命令、禁止事項</td>
    </tr>
    <tr>
      <td>按路徑載入</td>
      <td>rules</td>
      <td>語言、目錄、檔案類型特定規則</td>
    </tr>
    <tr>
      <td>按需載入</td>
      <td>Skills</td>
      <td>工作流程、領域知識</td>
    </tr>
    <tr>
      <td>隔離載入</td>
      <td>Subagents</td>
      <td>大量探索、平行研究、高噪音任務</td>
    </tr>
    <tr>
      <td>不進上下文</td>
      <td>Hooks</td>
      <td>確定性腳本、審計、阻斷</td>
    </tr>
  </tbody>
</table>

<p>設計的本質很簡單：<strong>偶爾才用到的東西，不要每次都塞進主上下文。</strong></p>

<h3 id="tool-output另一個隱形上下文殺手">Tool Output：另一個隱形上下文殺手</h3>

<p>除了 MCP 工具定義的固定開銷，動態部分同樣有個常被忽視的坑：Tool Output。<code class="language-plaintext highlighter-rouge">cargo test</code> 一次完整輸出動輒幾千行，<code class="language-plaintext highlighter-rouge">git log</code>、<code class="language-plaintext highlighter-rouge">find</code>、<code class="language-plaintext highlighter-rouge">grep</code> 在稍大的 repo 裡也能輕鬆塞滿螢幕。</p>

<p>Claude 並不需要全部細節，它通常只需要知道：有沒有過、哪裡掛了、下一步該做什麼。但只要這些輸出進了上下文，就是實實在在的 token 消耗。</p>

<p><strong>實務建議</strong>：與其把完整輸出餵給 Claude，不如截短：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cargo <span class="nb">test </span>2&gt;&amp;1 | <span class="nb">head</span> <span class="nt">-30</span>
</code></pre></div></div>

<p>更進一步，可以用 Hook 透明處理輸出，讓 Claude 只看到關鍵訊號：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 原始輸出（幾千行）
running 262 tests ...

# 處理後 Claude 看到的
✓ cargo test: 262 passed (1 suite, 0.08s)
</code></pre></div></div>

<p>Claude 真正需要的就是「過了還是掛了，掛在哪裡」，其他都是噪音。</p>

<h3 id="壓縮機制的陷阱與解法">壓縮機制的陷阱與解法</h3>

<p>上下文快滿時 Claude Code 會自動壓縮，但預設壓縮算法按「可重新讀取」判斷，早期的架構決策和約束理由往往會被一起刪掉。兩小時後再改，可能根本不記得兩小時前定了什麼。</p>

<p><strong>解法一：在 CLAUDE.md 寫 Compact Instructions</strong></p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## Compact Instructions</span>
When compressing, preserve in priority order:
<span class="p">1.</span> Architecture decisions (NEVER summarize)
<span class="p">2.</span> Modified files and their key changes
<span class="p">3.</span> Current verification status (pass/fail)
<span class="p">4.</span> Open TODOs and rollback notes
<span class="p">5.</span> Tool outputs (can delete, keep pass/fail only)
</code></pre></div></div>

<p><strong>解法二：開新會話前，先讓 Claude 寫 HANDOFF.md</strong></p>

<p>請 Claude 寫清楚：目前做到哪裡、試過哪些方法、哪些走得通、哪些是死路、下一步建議做什麼、目前風險與待驗證項目。下一個新鮮上下文的 Claude 只讀這份文件就能接著做，不依賴壓縮算法的摘要品質。</p>

<hr />

<h2 id="五plan-mode-的工程價值">五、Plan Mode 的工程價值</h2>

<p>Plan Mode 的本質是把「探索」和「執行」拆開。探索階段不動檔案，只做釐清目標、確認限制、比較方案、拆解實作順序、找出風險點。</p>

<table>
  <thead>
    <tr>
      <th>階段</th>
      <th>操作</th>
      <th>目的</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>探索（Plan Mode）</td>
      <td>只讀、分析、比較方案</td>
      <td>不在錯誤假設上浪費執行成本</td>
    </tr>
    <tr>
      <td>執行</td>
      <td>動檔案、寫程式</td>
      <td>方案已確認後才開始</td>
    </tr>
  </tbody>
</table>

<p><strong>按兩下 Shift+Tab 進入 Plan Mode</strong>。</p>

<p>對於複雜重構、跨模組遷移、高風險設定變更，Plan Mode 特別有用。一個進階玩法：開一個 Claude 寫計畫，再開一個以「高級工程師」身份審這個計畫，讓 AI 審 AI，效果很好。</p>

<hr />

<h2 id="六skills-設計不是模板庫是按需載入的工作流">六、Skills 設計：不是模板庫，是按需載入的工作流</h2>

<p>Skill 的描述符常駐上下文，完整內容只有真的被觸發時才載入。這個「按需載入」機制叫做 <strong>progressive disclosure（漸進式揭露）</strong>。</p>

<h3 id="一個好-skill-應該具備什麼">一個好 Skill 應該具備什麼</h3>

<table>
  <thead>
    <tr>
      <th>要素</th>
      <th>說明</th>
      <th>範例</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>描述寫「何時使用」</td>
      <td>不是「我是什麼」，而是「什麼情況用我」</td>
      <td><code class="language-plaintext highlighter-rouge">Use for PR reviews with focus on correctness.</code></td>
    </tr>
    <tr>
      <td>完整步驟</td>
      <td>輸入、步驟、輸出、停止條件</td>
      <td>避免寫了開頭沒有結尾</td>
    </tr>
    <tr>
      <td>正文只放骨架</td>
      <td>大資料拆到 supporting files</td>
      <td>不要把百科全書塞進 SKILL.md</td>
    </tr>
    <tr>
      <td>有副作用要限制</td>
      <td>加 <code class="language-plaintext highlighter-rouge">disable-model-invocation: true</code></td>
      <td>防止 Claude 自己心血來潮觸發</td>
    </tr>
  </tbody>
</table>

<p>描述符要寫短，每個 Skill 都在偷上下文空間：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 低效（~45 tokens）</span>
<span class="na">description</span><span class="pi">:</span> <span class="pi">|</span>
  <span class="s">This skill helps you review code changes in Rust projects.</span>
  <span class="s">It checks for common issues like unsafe code, error handling...</span>

<span class="c1"># 高效（~9 tokens）</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Use for PR reviews with focus on correctness.</span>
</code></pre></div></div>

<h3 id="三種最值得自己做的-skill-類型">三種最值得自己做的 Skill 類型</h3>

<table>
  <thead>
    <tr>
      <th>類型</th>
      <th>適合情境</th>
      <th>核心設計</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>檢查清單型</td>
      <td>release 前、交付前核對</td>
      <td>每項 pass/fail，有一項 fail 就不能繼續</td>
    </tr>
    <tr>
      <td>工作流型</td>
      <td>高風險操作（遷移、回滾）</td>
      <td>加 <code class="language-plaintext highlighter-rouge">disable-model-invocation: true</code>，內建回滾步驟</td>
    </tr>
    <tr>
      <td>領域專家型</td>
      <td>故障分診、日誌調查</td>
      <td>固定的證據收集路徑 + 決策矩陣</td>
    </tr>
  </tbody>
</table>

<p><strong>範例：領域專家型（runtime-diagnosis）</strong></p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">runtime-diagnosis</span>
<span class="na">description</span><span class="pi">:</span> <span class="s">Use when the app crashes, hangs, or behaves unexpectedly at runtime.</span>
<span class="nn">---</span>

<span class="c1">## Evidence Collection</span>
<span class="s">1. Run `app doctor` and capture full output</span>
<span class="s">2. Last 50 lines of logs</span>
<span class="s">3. Plugin/module state</span>

<span class="c1">## Decision Matrix</span>
<span class="pi">|</span> <span class="err">Symptom</span>         <span class="err">|</span> <span class="err">First</span> <span class="err">Check</span>              <span class="err">|</span>
<span class="err">|</span><span class="s">-----------------|--------------------------|</span>
<span class="err">|</span><span class="s"> Crash on startup | doctor output → syntax error |</span>
<span class="err">|</span><span class="s"> Rendering glitch | GPU backend / terminal capability |</span>
<span class="err">|</span><span class="s"> Config not applied | Config path + schema version |</span>

<span class="err">#</span><span class="s"># Output</span>
<span class="err">R</span><span class="s">oot cause / Blast radius / Fix steps / Verification command</span>
</code></pre></div></div>

<h3 id="skill-調用頻率的最佳策略">Skill 調用頻率的最佳策略</h3>

<table>
  <thead>
    <tr>
      <th>頻率</th>
      <th>策略</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>高頻（&gt;1 次/會話）</td>
      <td>保持 auto-invoke，優化描述符</td>
    </tr>
    <tr>
      <td>低頻（&lt;1 次/會話）</td>
      <td>disable-auto-invoke，手動觸發，描述符脫離上下文</td>
    </tr>
    <tr>
      <td>極低頻（&lt;1 次/月）</td>
      <td>移除 Skill，改為文件記錄</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="七tool-設計不是功能越多越好">七、Tool 設計：不是功能越多越好</h2>

<p>給 agent 用的工具，重點不是功能堆得多完整，而是<strong>讓它更容易用對</strong>。</p>

<h3 id="好工具-vs-壞工具">好工具 vs. 壞工具</h3>

<table>
  <thead>
    <tr>
      <th>面向</th>
      <th>好的設計</th>
      <th>壞的設計</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>命名</td>
      <td><code class="language-plaintext highlighter-rouge">github_pr_review</code>（有系統前綴）</td>
      <td><code class="language-plaintext highlighter-rouge">review</code>（模糊）</td>
    </tr>
    <tr>
      <td>目標</td>
      <td>單一明確目的</td>
      <td>一個工具包五種行為</td>
    </tr>
    <tr>
      <td>參數</td>
      <td>語義清楚</td>
      <td>到處都是 <code class="language-plaintext highlighter-rouge">id</code>、<code class="language-plaintext highlighter-rouge">name</code>、<code class="language-plaintext highlighter-rouge">target</code></td>
    </tr>
    <tr>
      <td>錯誤訊息</td>
      <td>有修正指引</td>
      <td>只回 opaque error code</td>
    </tr>
    <tr>
      <td>大輸出</td>
      <td>支援 concise/detailed 模式</td>
      <td>永遠完整輸出</td>
    </tr>
    <tr>
      <td>層次</td>
      <td>高層任務工具</td>
      <td>暴露過多底層碎片工具</td>
    </tr>
  </tbody>
</table>

<p>Claude 選工具靠的是語意判斷，而不是你覺得 API 設計漂不漂亮。工具越碎、越模糊、越多重目的，它就越容易選歪。</p>

<h3 id="askuserquestion-工具的演進一個真實的設計故事">AskUserQuestion 工具的演進：一個真實的設計故事</h3>

<p>Claude Code 團隊在設計「任務中途暫停問用戶」這個功能時，試了三個版本：</p>

<table>
  <thead>
    <tr>
      <th>版本</th>
      <th>做法</th>
      <th>問題</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>v1</td>
      <td>給已有工具加 <code class="language-plaintext highlighter-rouge">question</code> 參數</td>
      <td>Claude 大多數時候直接忽略，繼續往下跑</td>
    </tr>
    <tr>
      <td>v2</td>
      <td>要求 Claude 在輸出裡寫特定 markdown 格式</td>
      <td>Claude 經常「忘了」按格式寫，邏輯非常脆弱</td>
    </tr>
    <tr>
      <td>v3</td>
      <td>做成獨立的 <code class="language-plaintext highlighter-rouge">AskUserQuestion</code> 工具</td>
      <td>Claude 想提問就必須顯式調用它，調用即暫停，無歧義</td>
    </tr>
  </tbody>
</table>

<p>結論：既然你就是要 Claude 停下來問，那就直接給它一個專門的工具。加個 flag 或約定輸出格式，它一順手就略過去了。</p>

<h3 id="什麼時候不該再加-tool">什麼時候不該再加 Tool</h3>

<table>
  <thead>
    <tr>
      <th>情況</th>
      <th>建議做法</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>本地 shell 就能穩定完成</td>
      <td>讓 shell 做，不要再多包一層</td>
    </tr>
    <tr>
      <td>模型只需要靜態知識</td>
      <td>用文件、rules、Skill</td>
    </tr>
    <tr>
      <td>需求本質是流程約束</td>
      <td>用 Skill，不是 Tool</td>
    </tr>
    <tr>
      <td>Schema 與回傳格式還不穩定</td>
      <td>先驗證清楚再做成工具</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="八hooks把不該靠記憶的事收回確定性流程">八、Hooks：把不該靠記憶的事收回確定性流程</h2>

<p>Hooks 不是「自動化小腳本」，更精準的說法是：<strong>控制平面的硬邏輯</strong>。凡是你不希望 Claude 靠臨場發揮決定的事，都可以考慮放進 Hook。</p>

<h3 id="適合-vs-不適合放-hooks-的事">適合 vs. 不適合放 Hooks 的事</h3>

<table>
  <thead>
    <tr>
      <th>適合放 Hooks</th>
      <th>不適合放 Hooks</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>阻擋修改受保護檔案</td>
      <td>需要大量上下文判讀的語意決策</td>
    </tr>
    <tr>
      <td>編輯完自動 format / lint</td>
      <td>長時間執行的業務流程</td>
    </tr>
    <tr>
      <td>SessionStart 注入動態上下文</td>
      <td>需要多步推理與權衡的判斷</td>
    </tr>
    <tr>
      <td>任務完成後推送通知</td>
      <td>（這些應交給 Skill 或 Subagent）</td>
    </tr>
  </tbody>
</table>

<p><strong>範例：編輯 Rust 檔後立刻 cargo check</strong></p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"PostToolUse"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span><span class="w">
      </span><span class="nl">"matcher"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Edit"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"pattern"</span><span class="p">:</span><span class="w"> </span><span class="s2">"*.rs"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"command"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cargo check 2&gt;&amp;1 | head -30"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"statusMessage"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Running cargo check..."</span><span class="w">
      </span><span class="p">}]</span><span class="w">
    </span><span class="p">}]</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>每次編輯完立刻知道有沒有編譯錯誤，不是等你改了十幾個檔後才發現第一個檔就編不過。</p>

<h3 id="三層搭配最穩">三層搭配最穩</h3>

<p>只靠其中一層都會有漏洞：</p>

<ul>
  <li>只寫 CLAUDE.md 規則 → Claude 經常當沒看見</li>
  <li>只靠 Hooks → 細節判斷做不了</li>
  <li>只靠 Skill → 沒有強制保護</li>
</ul>

<table>
  <thead>
    <tr>
      <th>層次</th>
      <th>角色</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CLAUDE.md</td>
      <td>宣告規則（「提交前必須通過測試和 lint」）</td>
    </tr>
    <tr>
      <td>Skill</td>
      <td>告訴它流程與判讀方式</td>
    </tr>
    <tr>
      <td>Hook</td>
      <td>在關鍵路徑做硬驗證，必要時阻斷</td>
    </tr>
  </tbody>
</table>

<p>三樣疊加才有方法、有規則、也有警察。</p>

<hr />

<h2 id="九subagents最大的價值不是平行而是隔離">九、Subagents：最大的價值不是平行，而是隔離</h2>

<p>很多人聽到 Subagent，第一反應是「平行跑比較快」。但它最大的價值其實是<strong>隔離</strong>。</p>

<p>大範圍掃 repo、跑大量測試、大型日誌搜尋、代碼審查——這些工作非常容易污染主上下文。交給 Subagent 做，主線只拿回摘要，主上下文會乾淨很多。</p>

<h3 id="設計-subagent-時要明確約束">設計 Subagent 時要明確約束</h3>

<table>
  <thead>
    <tr>
      <th>參數</th>
      <th>目的</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">tools / disallowedTools</code></td>
      <td>限定工具範圍，不給和主線一樣寬的權限</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">model</code></td>
      <td>探索任務用 Haiku/Sonnet，重要審查用 Opus</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">maxTurns</code></td>
      <td>防止跑飛</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">isolation: worktree</code></td>
      <td>需要動檔案時隔離檔案系統</td>
    </tr>
  </tbody>
</table>

<p>如果子代理權限跟主線一樣寬，那不叫隔離，只是分身。</p>

<h3 id="適合丟給-subagent-的任務">適合丟給 Subagent 的任務</h3>

<ul>
  <li>「掃整個 repo，找所有和 auth token 相關的實作」</li>
  <li>「審查這次 PR，有沒有 correctness 風險」</li>
  <li>「比較 A 與 B 兩種遷移方案的差異」</li>
  <li>「收集最近 50 行錯誤日誌與模組依賴狀態」</li>
</ul>

<p>長時間執行的 bash 命令可以按 <strong>Ctrl+B</strong> 移到背景，Claude 之後會用 BashOutput 工具查看結果，不會阻塞主線程繼續工作。</p>

<hr />

<h2 id="十prompt-caching很少人講但非常重要">十、Prompt Caching：很少人講，但非常重要</h2>

<p>Prompt cache 是按前綴匹配運作的。越靠前、越穩定的內容，越能被重用。高命中率不只省成本，速率限制也會寬鬆很多。</p>

<p>Claude Code 的 Prompt 順序：</p>

<table>
  <thead>
    <tr>
      <th>順序</th>
      <th>內容</th>
      <th>穩定性</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>System Prompt</td>
      <td>靜態，應鎖定</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Tool Definitions</td>
      <td>靜態，應鎖定</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Chat History</td>
      <td>動態，放後面</td>
    </tr>
    <tr>
      <td>4</td>
      <td>當前使用者輸入</td>
      <td>最後</td>
    </tr>
  </tbody>
</table>

<h3 id="常見破壞-cache-的行為">常見破壞 Cache 的行為</h3>

<table>
  <thead>
    <tr>
      <th>行為</th>
      <th>為什麼有害</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>系統 Prompt 放時間戳</td>
      <td>讓靜態內容每次都變化</td>
    </tr>
    <tr>
      <td>工具定義順序不固定</td>
      <td>前綴不匹配，cache 失效</td>
    </tr>
    <tr>
      <td>會話中途增刪工具</td>
      <td>同上</td>
    </tr>
    <tr>
      <td><strong>長會話中途切換模型</strong></td>
      <td><strong>最常被忽略！會重建整個 cache</strong></td>
    </tr>
  </tbody>
</table>

<p>關於切換模型：你以為簡單問題切 Haiku 比較省，但如果前面已經和 Opus 聊了 100K tokens，切換模型會重建整個 cache，可能反而更貴。確實需要切換，用 Subagent 交接，而不是在主線切換。</p>

<p>動態資訊（如當前時間）不要放進系統 Prompt，放到使用者訊息裡傳進去就好，系統 Prompt 不動，cache 不會被打壞。</p>

<hr />

<h2 id="十一verifiers沒有驗證就沒有工程級代理">十一、Verifiers：沒有驗證，就沒有工程級代理</h2>

<p>「Claude 說完成了」在工程上幾乎不算完成。真正的完成，至少要能回答：它有沒有做對、錯在哪裡、能不能回滾、誰可以審查。</p>

<h3 id="verifier-三層架構">Verifier 三層架構</h3>

<table>
  <thead>
    <tr>
      <th>層次</th>
      <th>工具</th>
      <th>適用</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>基本層</td>
      <td>exit code、lint、typecheck、unit test</td>
      <td>每次變更</td>
    </tr>
    <tr>
      <td>中階層</td>
      <td>integration test、screenshot diff、contract test、smoke test</td>
      <td>功能完成後</td>
    </tr>
    <tr>
      <td>高階層</td>
      <td>production log、monitoring metrics、人工審查清單</td>
      <td>release 前</td>
    </tr>
  </tbody>
</table>

<p>在 CLAUDE.md 明確定義驗收方式：</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## Verification</span>
For backend changes:
<span class="p">-</span> Run <span class="sb">`make test`</span> and <span class="sb">`make lint`</span>

For API changes:
<span class="p">-</span> Update contract tests

Definition of done:
<span class="p">-</span> All tests pass
<span class="p">-</span> Lint passes
<span class="p">-</span> No untracked TODO remains
</code></pre></div></div>

<p><strong>一個很簡單的判斷標準</strong>：如果一個任務你說不清楚「什麼叫做完」，那它大概率也不適合直接丟給 Claude 自主完成。</p>

<hr />

<h2 id="十二高頻命令一覽">十二、高頻命令一覽</h2>

<p>這些命令的共同目標只有一個：<strong>主動管理上下文，不要等系統替你善後。</strong></p>

<h3 id="上下文管理">上下文管理</h3>

<table>
  <thead>
    <tr>
      <th>命令</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/context</code></td>
      <td>查看 token 使用結構，排查 MCP 或訊息歷史佔比</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/clear</code></td>
      <td>同一問題被糾偏兩次以上，直接重開</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/compact</code></td>
      <td>壓縮對話，要搭配 Compact Instructions</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/memory</code></td>
      <td>確認哪些 CLAUDE.md 真的被載入</td>
    </tr>
  </tbody>
</table>

<h3 id="能力與治理">能力與治理</h3>

<table>
  <thead>
    <tr>
      <th>命令</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/mcp</code></td>
      <td>管理 MCP 連接，檢查 token 成本，斷開閒置 server</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/hooks</code></td>
      <td>管理 hooks，控制平面入口</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/permissions</code></td>
      <td>查看或更新權限白名單</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/sandbox</code></td>
      <td>設定沙箱隔離</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/model</code></td>
      <td>Opus 用深度推理，Sonnet 用常規，Haiku 用快速探索</td>
    </tr>
  </tbody>
</table>

<h3 id="會話延續與平行">會話延續與平行</h3>

<table>
  <thead>
    <tr>
      <th>命令</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">claude --continue</code></td>
      <td>恢復當前目錄最近會話</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">claude --resume</code></td>
      <td>打開選擇器恢復歷史會話</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">claude --continue --fork</code></td>
      <td>從已有會話分叉，同一起點不同方案</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">claude --worktree</code></td>
      <td>建立隔離 git worktree</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">claude -p "prompt"</code></td>
      <td>非互動模式，接入 CI / pre-commit</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">claude -p --output-format json</code></td>
      <td>結構化輸出，便於腳本消費</td>
    </tr>
  </tbody>
</table>

<h3 id="比較少人提但很好用的">比較少人提但很好用的</h3>

<table>
  <thead>
    <tr>
      <th>命令/操作</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/simplify</code></td>
      <td>對剛改完的程式碼做三維檢查（復用、品質、效率），發現問題直接修</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/rewind</code></td>
      <td>回到某個會話 checkpoint 重新總結，適合 Claude 已沿錯誤路徑探索太久</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/btw</code></td>
      <td>不打斷主任務的前提下快速問一個旁路問題</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/insight</code></td>
      <td>分析當前會話，提煉哪些內容值得沉澱到 CLAUDE.md</td>
    </tr>
    <tr>
      <td>雙擊 ESC</td>
      <td>回去編輯上一條輸入，重發，不用重開會話</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">~/.claude/projects/</code></td>
      <td>所有會話記錄存放於此，用 grep 可搜尋歷史</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="十三claudemd-正確寫法協作契約不是知識庫">十三、CLAUDE.md 正確寫法：協作契約，不是知識庫</h2>

<h3 id="應該放什麼-vs-不該放什麼">應該放什麼 vs. 不該放什麼</h3>

<table>
  <thead>
    <tr>
      <th>應該放</th>
      <th>不該放</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>build / test / run 指令</td>
      <td>大段背景介紹</td>
    </tr>
    <tr>
      <td>關鍵目錄與模組邊界</td>
      <td>完整 API 文件</td>
    </tr>
    <tr>
      <td>風格與命名約束</td>
      <td>空泛原則（如「寫高品質程式碼」）</td>
    </tr>
    <tr>
      <td>不明顯的環境坑</td>
      <td>Claude 看 repo 就能推得出來的事</td>
    </tr>
    <tr>
      <td>NEVER 清單</td>
      <td>大量低頻知識（這些放 Skills）</td>
    </tr>
    <tr>
      <td>驗證方式</td>
      <td> </td>
    </tr>
    <tr>
      <td>Compact Instructions</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<h3 id="一份值得參考的範本">一份值得參考的範本</h3>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># Project Contract</span>

<span class="gu">## Build And Test</span>
<span class="p">-</span> Install: <span class="sb">`pnpm install`</span>
<span class="p">-</span> Dev: <span class="sb">`pnpm dev`</span>
<span class="p">-</span> Test: <span class="sb">`pnpm test`</span>
<span class="p">-</span> Typecheck: <span class="sb">`pnpm typecheck`</span>
<span class="p">-</span> Lint: <span class="sb">`pnpm lint`</span>

<span class="gu">## Architecture Boundaries</span>
<span class="p">-</span> HTTP handlers live in <span class="sb">`src/http/handlers/`</span>
<span class="p">-</span> Domain logic lives in <span class="sb">`src/domain/`</span>
<span class="p">-</span> Do not put persistence logic in handlers

<span class="gu">## Safety Rails</span>
<span class="gu">### NEVER</span>
<span class="p">-</span> Modify <span class="sb">`.env`</span>, lockfiles, or CI secrets without explicit approval
<span class="p">-</span> Remove feature flags without checking all call sites
<span class="p">-</span> Commit without running tests

<span class="gu">### ALWAYS</span>
<span class="p">-</span> Show diff before committing
<span class="p">-</span> Update CHANGELOG for user-facing changes

<span class="gu">## Verification</span>
<span class="p">-</span> Backend changes: <span class="sb">`make test`</span> + <span class="sb">`make lint`</span>
<span class="p">-</span> API changes: update contract tests

<span class="gu">## Compact Instructions</span>
Preserve:
<span class="p">1.</span> Architecture decisions (NEVER summarize)
<span class="p">2.</span> Modified files and key changes
<span class="p">3.</span> Current verification status (pass/fail)
<span class="p">4.</span> Open risks, TODOs, rollback notes
</code></pre></div></div>

<p><strong>一個很實用的技巧</strong>：每次糾正 Claude 的錯後，告訴它：</p>

<blockquote>
  <p>“Update your CLAUDE.md so you don’t make that mistake again.”</p>
</blockquote>

<p>Claude 在幫自己補規則時其實挺好用的，用久了確實越來越少犯同樣的錯。不過要定期 review，當初加的限制久了也會過時。</p>

<hr />

<h2 id="十四建議的專案目錄結構">十四、建議的專案目錄結構</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Project/
├── CLAUDE.md                      ← 全域契約
├── .claude/
│   ├── rules/
│   │   ├── core.md                ← 語言通用規則
│   │   ├── config.md
│   │   └── release.md
│   ├── skills/
│   │   ├── runtime-diagnosis/     ← 領域專家型
│   │   ├── config-migration/      ← 工作流型
│   │   ├── release-check/         ← 檢查清單型
│   │   └── incident-triage/
│   ├── agents/
│   │   ├── reviewer.md
│   │   └── explorer.md
│   └── settings.json
└── docs/
    └── ai/
        ├── architecture.md
        └── release-runbook.md
</code></pre></div></div>

<p>同時維護多個專案時，把穩定的個人基線放在 <code class="language-plaintext highlighter-rouge">~/.claude/</code>，各專案差異放在專案級 <code class="language-plaintext highlighter-rouge">.claude/</code>，不同專案之間就不容易互相污染。</p>

<hr />

<h2 id="十五最常見的反模式">十五、最常見的反模式</h2>

<table>
  <thead>
    <tr>
      <th>反模式</th>
      <th>為什麼有害</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>把 CLAUDE.md 當 Wiki</td>
      <td>每次會話被一大包低頻資訊壓著跑</td>
    </tr>
    <tr>
      <td>Skill 寫得太胖</td>
      <td>一個 Skill 同時包 review、deploy、debug、incident，誰都像它但誰都不夠像</td>
    </tr>
    <tr>
      <td>工具太多且命名模糊</td>
      <td>Claude 每次都得猜該用哪一個</td>
    </tr>
    <tr>
      <td>沒有 verifier</td>
      <td>只能靠直覺相信「它應該做好了」</td>
    </tr>
    <tr>
      <td>過度自治（Subagent 不限制）</td>
      <td>像把辦公室門窗全開還掛招牌說歡迎入侵</td>
    </tr>
    <tr>
      <td>不做上下文切換</td>
      <td>任務換階段了，還在同一個老會話裡繼續堆</td>
    </tr>
    <tr>
      <td>allowedTools 不整理</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>寫最小可用 CLAUDE.md</td>
      <td>build/test/run + NEVER 清單 + 驗證方式 + Compact Instructions</td>
    </tr>
    <tr>
      <td>第二步</td>
      <td>把差異規則拆到 rules</td>
      <td>前端目錄規則、後端目錄規則、特定語言規則</td>
    </tr>
    <tr>
      <td>第三步</td>
      <td>做 2–3 個高頻 Skill</td>
      <td>PR review、release-check、runtime-diagnosis</td>
    </tr>
    <tr>
      <td>第四步</td>
      <td>加最小 Hooks</td>
      <td>編輯後自動 lint、阻擋特定檔案修改</td>
    </tr>
    <tr>
      <td>第五步</td>
      <td>定義 verifier</td>
      <td>至少先有 test + lint + typecheck</td>
    </tr>
    <tr>
      <td>第六步</td>
      <td>才考慮 Subagents 與更多 MCP</td>
      <td>先把治理做好，再擴能力</td>
    </tr>
  </tbody>
</table>

<p>不要反過來。不然很容易從工程代理進化成工程煙火。</p>

<hr />

<h2 id="結語三個階段">結語：三個階段</h2>

<p>用 Claude Code 大概會經歷三個階段：</p>

<table>
  <thead>
    <tr>
      <th>階段</th>
      <th>關注點</th>
      <th>典型行為</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>第一階段</td>
      <td>這個功能怎麼用、這個命令是什麼</td>
      <td>一直加 MCP、裝工具</td>
    </tr>
    <tr>
      <td>第二階段</td>
      <td>怎麼讓它少出錯、怎麼修 prompt</td>
      <td>規則越寫越長</td>
    </tr>
    <tr>
      <td>第三階段</td>
      <td>怎麼讓 agent 在約束下穩定工作</td>
      <td>治理上下文、設計驗證、控制邊界</td>
    </tr>
  </tbody>
</table>

<p>到了第三階段，關注點悄悄變掉了：從「這個功能怎麼用」變成「怎麼讓 agent 在約束下自己跑起來」，兩件事感覺差很多。</p>

<p>Claude Code 的成熟使用方式，最終不是關心「它會不會做」，而是「你有沒有把這套系統治理到可以放心讓它做」。</p>

<p>如果一個任務你說不清楚「什麼叫做完」，那它大概率也不適合直接丟給 Claude 自主完成——驗證標準本身都沒有，Claude 再聰明也跑不出正確答案。</p>]]></content><author><name></name></author><category term="claude-code" /><summary type="html"><![CDATA[Claude Code 不是聊天機器人，是一套可以治理的工程代理系統。深入解析六層架構、上下文工程、Skills/Hooks/Subagents 設計，以及 Prompt Caching 與驗證閉環。]]></summary></entry><entry><title type="html">gstack 教學：把 Claude Code 變成完整的 AI 開發工作流</title><link href="https://swanky.github.io/claude-code/gstack-workflow-guide/" rel="alternate" type="text/html" title="gstack 教學：把 Claude Code 變成完整的 AI 開發工作流" /><published>2026-03-22T00:00:00+00:00</published><updated>2026-03-22T00:00:00+00:00</updated><id>https://swanky.github.io/claude-code/gstack-workflow-guide</id><content type="html" xml:base="https://swanky.github.io/claude-code/gstack-workflow-guide/"><![CDATA[<div class="article-tldr">
  <span class="article-tldr-label">30 秒結論</span>
  <ul>
    <li><strong>gstack 是什麼</strong>：一套把 Claude Code 變成「有工序、有守門員、有驗證習慣」的工作流技能包——從規劃、審查、QA 到出貨，每個階段有專屬指令。</li>
    <li><strong>安裝</strong>：把 repo 複製到 <code>~/.claude/skills/gstack</code>，進去跑一次 <code>./setup</code> 就好（<a href="#安裝方式">完整指令見安裝那節</a>；Windows 需另裝 Node.js）。</li>
    <li><strong>新手先練 5 顆</strong>：<code>/plan-eng-review</code>（規劃）、<code>/review</code>（merge 前審查）、<code>/qa</code>（真的去測網頁）、<code>/investigate</code>（先查再修）、<code>/guard</code>（限制改動範圍）。懶得逐顆跑，就用 <code>/autoplan</code> 一次跑完整條規劃鏈。</li>
    <li><strong>最大誤區</strong>：把它當一包超大 prompt——它的價值在節奏與分工，不在單顆指令多神。</li>
    <li><strong>版本提醒</strong>：這半年 gstack 改動很大（<a href="#2026-年-8-月更新這半年多出來的東西">新增內容見這一節</a>）；團隊導入現在官方推薦 <code>./setup --team</code>，不要再把整包複製進 repo。</li>
  </ul>
</div>

<nav class="article-toc article-toc--outline" aria-label="文章大綱">
  <span class="article-toc-label">本文大綱</span>
  <ol class="article-toc-parts">
    <li class="article-toc-part">
      <span class="article-toc-part-title">先搞懂它是什麼</span>
      <ol class="article-toc-items">
        <li><a href="#什麼是-gstack">什麼是 gstack</a></li>
        <li><a href="#為什麼-gstack-值得學">為什麼值得學</a></li>
        <li><a href="#gstack-適合誰">適合誰</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">裝起來</span>
      <ol class="article-toc-items">
        <li><a href="#安裝前你要先知道的事">安裝前你要先知道的事</a></li>
        <li>
          <a href="#安裝方式">安裝方式</a>
          <span class="article-toc-sub">
            <a href="#1-安裝到你的-claude-code-全域技能目錄">全域安裝</a>
            <a href="#2-讓團隊一起用改用-team-mode不要再複製整包">團隊模式</a>
            <a href="#3-其他-agent-也能用">其他 agent</a>
            <a href="#4-windows-使用者一定要知道的一條">Windows 注意</a>
          </span>
        </li>
        <li><a href="#claudemd-要怎麼寫">CLAUDE.md 要怎麼寫</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">學會怎麼用</span>
      <ol class="article-toc-items">
        <li>
          <a href="#先理解-gstack-的四大層次">先理解四大層次</a>
          <span class="article-toc-sub">
            <a href="#審查類太多了該用哪一顆">該用哪一顆 review</a>
          </span>
        </li>
        <li>
          <a href="#核心-skill-詳解新手最先該學的-8-顆">核心 skill 詳解（8 顆）</a>
          <span class="article-toc-sub">
            <a href="#1-office-hours先把問題問對">/office-hours</a>
            <a href="#2-plan-ceo-review幫你砍-scope也幫你找到更值得做的版本">/plan-ceo-review</a>
            <a href="#3-plan-eng-review最值得養成習慣的一顆">/plan-eng-review</a>
            <a href="#4-plan-design-review避免做出-ai-味很重的-ui-規格">/plan-design-review</a>
            <a href="#5-review不是看有沒有過測試而是看會不會上線爆">/review</a>
            <a href="#6-qa讓-ai-真的去測你的-app">/qa</a>
            <a href="#7-investigate沒有調查就不要亂修">/investigate</a>
            <a href="#8-guardfreeze給-ai-上護欄">/guard、/freeze</a>
          </span>
        </li>
        <li>
          <a href="#你最該照著走的三條工作流">三條工作流</a>
          <span class="article-toc-sub">
            <a href="#工作流-a新功能開發">A 新功能</a>
            <a href="#工作流-b改高風險模組">B 高風險模組</a>
            <a href="#工作流-c純前端--ui-優化">C 前端 UI</a>
          </span>
        </li>
        <li><a href="#新手實戰範例用-gstack-做一個會員分級功能">實戰範例：會員分級</a></li>
      </ol>
    </li>
    <li class="article-toc-part">
      <span class="article-toc-part-title">新版變化與實務建議</span>
      <ol class="article-toc-items">
        <li><a href="#2026-年-8-月更新這半年多出來的東西">2026 年 8 月更新：新增了什麼</a></li>
        <li><a href="#gstack-最容易踩的坑">最容易踩的坑</a></li>
        <li><a href="#新手最推薦先熟的-5-顆">最推薦先熟的 5 顆</a></li>
        <li><a href="#常見問題">常見問題</a></li>
        <li><a href="#我的實務建議把-gstack-當成團隊開發規範">當成團隊開發規範</a></li>
        <li><a href="#結語">結語</a></li>
        <li><a href="#參考來源">參考來源</a></li>
      </ol>
    </li>
  </ol>
</nav>

<p class="article-update-note">本文 2026 年 3 月首次發表，2026 年 8 月 8 日對照 gstack v1.60.2.0 重新核對，更新了安裝方式、團隊導入做法與技能清單，並補上這半年新增的重點。</p>

<p>很多人第一次接觸 Claude Code 時，會把它當成一個很會寫程式的聊天視窗。這樣用不是不行，但常常會遇到同樣幾個問題：</p>

<ul>
  <li>前面需求沒想清楚就開始做</li>
  <li>做到一半 scope 越長越歪</li>
  <li>程式碼能跑，但結構、測試、邊界條件沒顧好</li>
  <li>UI 看起來像能用，實際互動一測就破功</li>
  <li>merge 前沒人幫你當最後一道守門員</li>
</ul>

<p><strong>gstack</strong> 的價值，就在於它不是單一 prompt，也不是一包零散工具，而是一套把 AI 開發流程角色化、階段化的工作流。官方 repo 把它描述為 Garry Tan 的 Claude Code 設定，包含多個具明確分工的 skills，從產品思考、工程規劃、設計審查、PR review、QA 到 release 文件同步，都有對應的 slash commands。</p>

<div class="article-part"><span class="article-part-num">一</span><span class="article-part-title">先搞懂它是什麼</span></div>

<h2 id="什麼是-gstack">什麼是 gstack？</h2>

<p>gstack 是一組依照 <strong>SKILL.md</strong> 規範組成的工作流技能包，設計理念很明確：讓 AI 在不同階段切換不同角色，而不是永遠只用同一種思考模式處理所有事情。代表性的 slash commands 包含 <code class="language-plaintext highlighter-rouge">/office-hours</code>、<code class="language-plaintext highlighter-rouge">/plan-ceo-review</code>、<code class="language-plaintext highlighter-rouge">/plan-eng-review</code>、<code class="language-plaintext highlighter-rouge">/plan-design-review</code>、<code class="language-plaintext highlighter-rouge">/review</code>、<code class="language-plaintext highlighter-rouge">/investigate</code>、<code class="language-plaintext highlighter-rouge">/qa</code>、<code class="language-plaintext highlighter-rouge">/ship</code>、<code class="language-plaintext highlighter-rouge">/document-release</code> 等。</p>

<p>規模也一直在長。官方 README 現在把它介紹成「二十三位專家角色加八個 power tool」，repo 裡的技能目錄實際已超過五十個（含 iOS 實機測試、文件生成、效能量測等分支家族）。這對新手其實是壞消息：清單愈長，愈容易一開始就迷路。所以下面會先給你四層分類與三條工作流，再談那些新東西。</p>

<p>換句話說，gstack 不是在幫你「多裝幾個 prompt」，而是在幫你把 Claude Code 變成一支迷你產品與工程團隊：</p>

<ul>
  <li>有人負責先挑戰需求定義</li>
  <li>有人幫你收斂 scope</li>
  <li>有人逼你把架構與測試想清楚</li>
  <li>有人專看那些 CI 過了、上線才炸的問題</li>
  <li>有人真的去瀏覽器裡點、測、截圖、驗證</li>
  <li>有人把 release 後最容易過期的文件補齊</li>
</ul>

<p>這也是它跟一般 skill 包最大的差別。</p>

<hr />

<h2 id="為什麼-gstack-值得學">為什麼 gstack 值得學？</h2>

<p>gstack 背後有兩個很實用的核心觀念。</p>

<p><strong>第一，它把開發拆成有先後順序的流程，而不是讓 AI 一路 freestyle。</strong> 整體節奏從思考、規劃、實作、審查、測試到出貨形成一條鏈，前一階段的輸出會餵給後一階段，避免上下文散掉。</p>

<p><strong>第二，它不只是一堆 markdown 指令。</strong> gstack 的架構設計說得很清楚：它提供的是 <strong>persistent browser</strong> 加上 workflow skills。為了讓 AI 在瀏覽器裡操作時有亞秒級延遲、又能保留 cookies、tabs 與登入狀態，gstack 讓 Chromium 以長駐 daemon 的方式存在，CLI 再透過 localhost HTTP 呼叫它。這也是為什麼 <code class="language-plaintext highlighter-rouge">/browse</code>、<code class="language-plaintext highlighter-rouge">/qa</code>、<code class="language-plaintext highlighter-rouge">/design-review</code> 這類能力比較像真正在操作一個持續存在的瀏覽器，而不是每次都冷啟動一次。</p>

<p>講白一點，普通的 Claude Code 像很聰明的單兵；gstack 則像替這個單兵配了一張作戰流程圖、一組專家顧問，外加一台不會每五分鐘失憶的瀏覽器。</p>

<hr />

<h2 id="gstack-適合誰">gstack 適合誰？</h2>

<p>gstack 特別適合下面幾種人：</p>

<p><strong>1. 用 Claude Code 做實際專案的人</strong>
不是只是拿來問問題，而是真的會改 repo、開 PR、跑測試、做 UI 驗證的人。</p>

<p><strong>2. 常做 Web 專案的人</strong>
因為 <code class="language-plaintext highlighter-rouge">/browse</code>、<code class="language-plaintext highlighter-rouge">/qa</code>、<code class="language-plaintext highlighter-rouge">/setup-browser-cookies</code>、<code class="language-plaintext highlighter-rouge">/design-review</code> 這類技能，對網頁應用、登入流程、前後台表單、Dashboard 特別有感。<code class="language-plaintext highlighter-rouge">/setup-browser-cookies</code> 可把真實瀏覽器的 cookies 匯入 headless session，用來測登入後頁面。</p>

<p><strong>3. 不想讓 AI 每次都從同一個思考高度亂飛的人</strong>
例如需求定義要像 PM，規劃時要像 tech lead，PR 前要像 staff engineer，debug 時要像 debugger。這正是 gstack 最有價值的地方。</p>

<div class="article-part"><span class="article-part-num">二</span><span class="article-part-title">裝起來</span></div>

<h2 id="安裝前你要先知道的事">安裝前你要先知道的事</h2>

<p>gstack 的基本需求包含 Claude Code、Git、Bun v1.0+，<strong>Windows 額外需要 Node.js</strong>。Windows 11 可透過 Git Bash 或 WSL 使用；由於 Bun 在 Windows 上對 Playwright pipe transport 有已知問題，瀏覽器伺服器會自動 fallback 到 Node.js，所以 <code class="language-plaintext highlighter-rouge">bun</code> 與 <code class="language-plaintext highlighter-rouge">node</code> 都要在 PATH 上。</p>

<p>對 Windows 使用者來說，這段很關鍵。你可以用 Git Bash，但若你本來就會在 Claude Code 裡跑不少 CLI 與瀏覽器自動化，<strong>WSL 通常會更穩</strong>。</p>

<hr />

<h2 id="安裝方式">安裝方式</h2>

<h3 id="1-安裝到你的-claude-code-全域技能目錄">1) 安裝到你的 Claude Code 全域技能目錄</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone <span class="nt">--single-branch</span> <span class="nt">--depth</span> 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack
<span class="nb">cd</span> ~/.claude/skills/gstack
./setup
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">--single-branch --depth 1</code> 是官方現在建議的寫法，只抓最新一份、不拉整段歷史，clone 會快很多。</p>

<h3 id="2-讓團隊一起用改用-team-mode不要再複製整包">2) 讓團隊一起用：改用 team mode，不要再複製整包</h3>

<p>早期的做法是把整個 gstack 目錄複製進專案的 <code class="language-plaintext highlighter-rouge">.claude/skills/</code>。這招現在<strong>不建議</strong>了——每個 repo 都會存下一份當時的版本，過幾週就開始各人版本不同。官方改成 team mode：專案裡不放實體檔案，每次開 session 自動檢查更新（每小時最多一次，斷網也不會卡住）。</p>

<p>在專案根目錄執行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">(</span><span class="nb">cd</span> ~/.claude/skills/gstack <span class="o">&amp;&amp;</span> ./setup <span class="nt">--team</span><span class="o">)</span> <span class="o">&amp;&amp;</span> ~/.claude/skills/gstack/bin/gstack-team-init required <span class="o">&amp;&amp;</span> git add .claude/ CLAUDE.md <span class="o">&amp;&amp;</span> git commit <span class="nt">-m</span> <span class="s2">"require gstack for AI-assisted work"</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">required</code> 是「沒裝就擋下來」，想改成柔性提醒就把它換成 <code class="language-plaintext highlighter-rouge">optional</code>。</p>

<h3 id="3-其他-agent-也能用">3) 其他 agent 也能用</h3>

<p>gstack 現在支援十種 AI coding agent，<code class="language-plaintext highlighter-rouge">./setup</code> 會自動偵測你裝了哪些，也可以用 <code class="language-plaintext highlighter-rouge">--host</code> 指定：</p>

<table>
  <thead>
    <tr>
      <th>Agent</th>
      <th>參數</th>
      <th>技能安裝到</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>OpenAI Codex CLI</td>
      <td><code class="language-plaintext highlighter-rouge">--host codex</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.codex/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>OpenCode</td>
      <td><code class="language-plaintext highlighter-rouge">--host opencode</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.config/opencode/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>Cursor</td>
      <td><code class="language-plaintext highlighter-rouge">--host cursor</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.cursor/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>Factory Droid</td>
      <td><code class="language-plaintext highlighter-rouge">--host factory</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.factory/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>Slate</td>
      <td><code class="language-plaintext highlighter-rouge">--host slate</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.slate/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>Kiro</td>
      <td><code class="language-plaintext highlighter-rouge">--host kiro</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.kiro/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>Hermes</td>
      <td><code class="language-plaintext highlighter-rouge">--host hermes</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.hermes/skills/gstack-*/</code></td>
    </tr>
    <tr>
      <td>GBrain</td>
      <td><code class="language-plaintext highlighter-rouge">--host gbrain</code></td>
      <td><code class="language-plaintext highlighter-rouge">~/.gbrain/skills/gstack-*/</code></td>
    </tr>
  </tbody>
</table>

<p>另外 OpenClaw 因為是透過 ACP 開 Claude Code session，只要 Claude Code 這邊裝好，gstack 的技能就直接可用；也有四顆方法論技能（<code class="language-plaintext highlighter-rouge">/office-hours</code>、<code class="language-plaintext highlighter-rouge">/plan-ceo-review</code>、<code class="language-plaintext highlighter-rouge">/investigate</code>、<code class="language-plaintext highlighter-rouge">/retro</code> 的 OpenClaw 版）可以透過 ClawHub 直接裝進 OpenClaw 自己跑。</p>

<h3 id="4-windows-使用者一定要知道的一條">4) Windows 使用者一定要知道的一條</h3>

<p>在沒開「開發者模式」的 Windows（MSYS2／Git Bash）上，<code class="language-plaintext highlighter-rouge">setup</code> 會改用<strong>檔案複製</strong>而不是 symlink——因為 symlink 在這個環境會變成不會跟著 <code class="language-plaintext highlighter-rouge">git pull</code> 更新的凍結副本。結果就是：<strong>每次 <code class="language-plaintext highlighter-rouge">git pull</code> 之後都要再跑一次 <code class="language-plaintext highlighter-rouge">./setup</code></strong>，技能檔案才會跟上 repo。<code class="language-plaintext highlighter-rouge">setup</code> 執行完會印一行提醒。Unix 與 WSL 用 symlink，不需要重跑。</p>

<hr />

<h2 id="claudemd-要怎麼寫"><code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 要怎麼寫？</h2>

<p>如果 Claude 說它看不到 skills，除了重新跑 <code class="language-plaintext highlighter-rouge">./setup</code>，也要確認你的 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 有一段 gstack 區塊：</p>

<div class="language-md highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## gstack</span>
Use /browse from gstack for all web browsing. Never use mcp__claude-in-chrome__<span class="err">*</span> tools.
Available skills: /office-hours, /plan-ceo-review, /plan-eng-review, /plan-design-review,
/design-consultation, /design-shotgun, /design-html, /review, /ship, /land-and-deploy,
/canary, /benchmark, /browse, /open-gstack-browser, /qa, /qa-only, /design-review,
/setup-browser-cookies, /setup-deploy, /setup-gbrain, /sync-gbrain, /retro, /investigate,
/document-release, /document-generate, /codex, /cso, /autoplan, /pair-agent, /careful, /freeze,
/guard, /unfreeze, /gstack-upgrade, /learn.
</code></pre></div></div>

<p>（這份清單以 2026 年 8 月的官方 README 為準；升級後可以直接照官方 README 的版本覆蓋。）</p>

<p>這段看起來像在幫 Claude 做點名，其實是很實際的「操作手冊提示」。Skill 存在，不代表模型每次都會主動想到它；寫進 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code>，相當於把「這個 repo 的工作規則」固定下來。</p>

<div class="article-part"><span class="article-part-num">三</span><span class="article-part-title">學會怎麼用</span></div>

<h2 id="先理解-gstack-的四大層次">先理解 gstack 的四大層次</h2>

<p>在真正開始用之前，建議先把 gstack 分成四層來理解，才不會看到二十幾個指令像工具箱爆開。</p>

<h3 id="一需求與產品定義層">一、需求與產品定義層</h3>

<p>負責回答「我們到底要做什麼？」</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/office-hours</code></strong> — 從這裡開始。用六個強迫思考問題重新框定產品，挑戰前提，生成替代方案。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/plan-ceo-review</code></strong> — 站在 CEO / Founder 視角重新看需求，找出更高價值的版本。支援擴張、收斂、維持 scope、縮減等模式。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/autoplan</code></strong> — 把 CEO → 設計 → 工程三道規劃審查串成一條自動流程，只把需要你拍板的取捨拿出來問。趕時間時很好用。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/spec</code></strong> — 把模糊的想法寫成一份可直接執行的規格，分五個階段推進（為什麼做、範圍、技術細節、草稿、落檔），並在存檔前用 Codex 當品質關卡。</li>
</ul>

<h3 id="二工程與設計規劃層">二、工程與設計規劃層</h3>

<p>負責回答「要怎麼做才做得出來？」</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/plan-eng-review</code></strong> — 聚焦 architecture、system boundaries、data flow、state transitions、failure modes、edge cases、trust boundaries 與 test coverage。強調要畫 diagrams，把模糊假設逼出來。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/plan-design-review</code></strong> — 用 0 到 10 的評分法檢查設計方案，說明怎樣才算 10 分，然後直接把 plan 修到更接近 10。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/plan-devex-review</code></strong> — 上面那顆是給「使用者」看的介面，這顆是給「開發者」看的體驗：API、CLI、SDK、文件。會追你的上手時間、對照競品、逐步找出摩擦點。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/design-consultation</code></strong> — 偏向從零建立設計系統與方向。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/design-shotgun</code> → <code class="language-plaintext highlighter-rouge">/design-html</code></strong> — 前者一次生成 4 到 6 個視覺版本，開一個比較面板讓你挑；挑定之後交給後者變成可上線的 HTML。</li>
</ul>

<h3 id="三實作後檢查與驗證層">三、實作後檢查與驗證層</h3>

<p>負責回答「做完之後真的安全嗎？」</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/review</code></strong> — pre-landing PR review，對 diff 做結構性檢查，包含 SQL safety、LLM trust boundary violations、conditional side effects 等。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/qa</code></strong> — 測 app、找 bug、修 bug、自動產生 regression tests，再驗證。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/qa-only</code></strong> — 相同方法，但只出 bug report 不動程式碼。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/design-review</code></strong> — 用設計審查的思維去檢查 live site，再修掉問題。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/devex-review</code></strong> — 真的照你的文件走一次新手上手流程，計時、截圖失敗處，再跟 <code class="language-plaintext highlighter-rouge">/plan-devex-review</code> 當初打的分數對照。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/cso</code></strong> — 資安長視角，跑 OWASP Top 10 加 STRIDE 威脅模型，每個發現都要附具體攻擊情境，並設了信心門檻壓低誤報。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/benchmark</code></strong> — 量頁面載入時間與 Core Web Vitals，做成前後對照。</li>
</ul>

<h3 id="四安全與收尾層">四、安全與收尾層</h3>

<p>負責回答「怎麼避免 AI 改過頭，並把專案收乾淨？」</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/investigate</code></strong> — root-cause debugging，強調「沒有調查就不要修」，若連續三次修法失敗就停止亂補。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/document-release</code></strong> — 比對 diff 去修 README、ARCHITECTURE、CONTRIBUTING、CLAUDE.md 等文件漂移。<code class="language-plaintext highlighter-rouge">/ship</code> 會自動呼叫它，讓出貨同時同步文件。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/document-generate</code></strong> — 上面那顆是補既有文件的漂移，這顆是文件根本還沒寫時，從程式碼生出缺的那幾類文件。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/land-and-deploy</code> 與 <code class="language-plaintext highlighter-rouge">/canary</code></strong> — 前者把「PR 已核准」一路帶到「正式環境已驗證」；後者在部署後持續盯 console 錯誤與效能退化。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/learn</code></strong> — 管理 gstack 跨 session 學到的東西（這個專案的慣例、地雷、你的偏好），可以檢視、搜尋、清掉。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/freeze</code></strong> — 把改動限制在單一目錄。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/guard</code></strong> — 結合 <code class="language-plaintext highlighter-rouge">/careful</code> 和 <code class="language-plaintext highlighter-rouge">/freeze</code>，適合高風險環境。</li>
</ul>

<h3 id="審查類太多了該用哪一顆">審查類太多了，該用哪一顆？</h3>

<p>審查類技能是最容易搞混的一區，因為「規劃階段先審」和「上線後實測」各有一顆對應。照你做的東西挑就好：</p>

<table>
  <thead>
    <tr>
      <th>你的東西是給誰用的</th>
      <th>寫程式前先審</th>
      <th>做完之後實測</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>一般使用者（網頁、App 介面）</td>
      <td><code class="language-plaintext highlighter-rouge">/plan-design-review</code></td>
      <td><code class="language-plaintext highlighter-rouge">/design-review</code></td>
    </tr>
    <tr>
      <td>開發者（API、CLI、SDK、文件）</td>
      <td><code class="language-plaintext highlighter-rouge">/plan-devex-review</code></td>
      <td><code class="language-plaintext highlighter-rouge">/devex-review</code></td>
    </tr>
    <tr>
      <td>架構本身（資料流、效能、測試）</td>
      <td><code class="language-plaintext highlighter-rouge">/plan-eng-review</code></td>
      <td><code class="language-plaintext highlighter-rouge">/review</code></td>
    </tr>
    <tr>
      <td>以上都有</td>
      <td><code class="language-plaintext highlighter-rouge">/autoplan</code>（自動判斷該跑哪幾種）</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="核心-skill-詳解新手最先該學的-8-顆">核心 skill 詳解：新手最先該學的 8 顆</h2>

<h3 id="1-office-hours先把問題問對">1. <code class="language-plaintext highlighter-rouge">/office-hours</code>：先把問題問對</h3>

<p>這顆是 gstack 的起手式，也是官方明確標注「Start here」的入口。它不是幫你許願列清單，而是挑戰你的 framing——問你真實痛點是什麼、現在怎麼做、為什麼現狀不夠、你想做的東西是不是其實只是假議題。</p>

<p><strong>適合情境</strong>：新產品想法剛冒出來、老闆丟一句需求要你展開、你懷疑自己定錯題目。</p>

<p><strong>建議用法</strong>：不要只說「我要做一個會員系統」。比較好的輸入：</p>

<blockquote>
  <p>我們的電商後台目前會員分級靠人工維護，客服容易出錯。老闆想做會員制度自動化，但我不確定是真要重做會員系統，還是只需要補一層規則引擎與通知機制。</p>
</blockquote>

<p>這樣 <code class="language-plaintext highlighter-rouge">/office-hours</code> 才有東西可以挑戰。</p>

<hr />

<h3 id="2-plan-ceo-review幫你砍-scope也幫你找到更值得做的版本">2. <code class="language-plaintext highlighter-rouge">/plan-ceo-review</code>：幫你砍 scope，也幫你找到更值得做的版本</h3>

<p>這顆站在創辦人或產品負責人的高度，不是問你「能不能做」，而是問你「這樣做值不值得」。有四種模式：Expansion、Selective Expansion、Hold Scope、Reduction。</p>

<p><strong>適合情境</strong>：覺得需求清單太長、想定 MVP、懷疑功能表面合理但實際價值不高。</p>

<p><strong>建議用法</strong>：先有一版初步方案，再叫它 review。它是產品剪刀手，不是開腦洞機器。</p>

<hr />

<h3 id="3-plan-eng-review最值得養成習慣的一顆">3. <code class="language-plaintext highlighter-rouge">/plan-eng-review</code>：最值得養成習慣的一顆</h3>

<p>文件明列它要處理 architecture、系統邊界、資料流、狀態轉移、失敗模式、邊界條件、信任邊界與測試覆蓋，並強調要用 sequence diagram、state diagram、component diagram、data-flow diagram、test matrix 把系統畫出來。</p>

<p><strong>適合情境</strong>：API 設計、後台流程改造、背景工作 / queue / retry / idempotency、DB migration、第三方整合、支付 / 登入 / 權限等高風險功能。</p>

<p><strong>建議用法</strong>：把以下資訊一次餵給它——背景與需求、現況架構、你打算怎麼做、你最怕哪裡出事、哪些限制不能碰。</p>

<p>這顆最強的地方不是幫你寫結論，而是把你還沒想到的洞挖出來。</p>

<hr />

<h3 id="4-plan-design-review避免做出-ai-味很重的-ui-規格">4. <code class="language-plaintext highlighter-rouge">/plan-design-review</code>：避免做出 AI 味很重的 UI 規格</h3>

<p>專門看實作前的設計規劃。它會對設計各面向做 0 到 10 評分，說明距離 10 分差在哪裡，再把 plan 修得更完整。</p>

<p><strong>適合情境</strong>：要做 SaaS 後台、表單、Dashboard；有 wireframe 或 UI plan，但細節還鬆；想先把 loading、error、empty state、responsive 想好。</p>

<p>這顆很適合拿來擋掉那種「畫面看似 clean modern，其實只有卡片、圖示和大片留白」的 AI 風格空殼。</p>

<hr />

<h3 id="5-review不是看有沒有過測試而是看會不會上線爆">5. <code class="language-plaintext highlighter-rouge">/review</code>：不是看有沒有過測試，而是看會不會上線爆</h3>

<p>這顆是 pre-landing PR review，會分析 branch 相對 base branch 的 diff，找出那些測試不一定會抓到的結構性問題，例如 SQL safety、LLM 信任邊界問題、conditional side effects 等。</p>

<p><strong>建議節奏</strong>：</p>

<ol>
  <li>完成實作</li>
  <li>跑本地測試</li>
  <li><code class="language-plaintext highlighter-rouge">/review</code></li>
  <li>修 findings</li>
  <li>進入 <code class="language-plaintext highlighter-rouge">/qa</code></li>
</ol>

<hr />

<h3 id="6-qa讓-ai-真的去測你的-app">6. <code class="language-plaintext highlighter-rouge">/qa</code>：讓 AI 真的去測你的 app</h3>

<p><code class="language-plaintext highlighter-rouge">/qa</code> 會測你的 app、找 bug、修掉、用 atomic commits 提交，再驗證，並對每個修復自動生成 regression tests。這顆最適合網頁應用，尤其是有真實互動與登入狀態的流程。</p>

<p><strong>適合情境</strong>：Checkout 流程、設定頁、表單提交、權限頁面、Dashboard 篩選器、多步驟 wizard、手機版 menu / modal / upload。</p>

<hr />

<h3 id="7-investigate沒有調查就不要亂修">7. <code class="language-plaintext highlighter-rouge">/investigate</code>：沒有調查就不要亂修</h3>

<p><code class="language-plaintext highlighter-rouge">/investigate</code> 是 <strong>Systematic root-cause debugging</strong>，而且有一條鐵律：「沒有調查就不要修」。它會追資料流、測假設，並在三次修法失敗後停下來，避免修成補丁疊疊樂。</p>

<p><strong>適合情境</strong>：不明原因 bug、改一處壞三處、race condition、state mismatch、背景任務偶發失敗、前後端資料格式不一致。</p>

<p>這顆很像在混亂現場拉起封鎖線，先勘驗，再開刀。</p>

<hr />

<h3 id="8-guardfreeze給-ai-上護欄">8. <code class="language-plaintext highlighter-rouge">/guard</code>、<code class="language-plaintext highlighter-rouge">/freeze</code>：給 AI 上護欄</h3>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">/freeze</code></strong>：把編輯限制在一個目錄</li>
  <li><strong><code class="language-plaintext highlighter-rouge">/guard</code></strong>：<code class="language-plaintext highlighter-rouge">/careful</code> + <code class="language-plaintext highlighter-rouge">/freeze</code></li>
  <li><strong><code class="language-plaintext highlighter-rouge">/unfreeze</code></strong>：解除範圍限制</li>
</ul>

<p><strong>適合情境</strong>：Debug 單一模組、改正式環境附近程式、有很多關聯檔案但這次只准動一區、不想讓 Claude 順手「幫你整理一下」結果越整理越大包。</p>

<hr />

<h2 id="你最該照著走的三條工作流">你最該照著走的三條工作流</h2>

<h3 id="工作流-a新功能開發">工作流 A：新功能開發</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/office-hours
/plan-ceo-review
/plan-eng-review
/plan-design-review   ← 若有 UI
開始實作
/review
/qa
/ship
/land-and-deploy      ← PR 核准後，一路帶到正式環境驗證
/canary               ← 部署後盯一段時間
</code></pre></div></div>

<p>前面三顆規劃審查如果不想一顆一顆跑，可以直接用 <code class="language-plaintext highlighter-rouge">/autoplan</code> 一次串完，它只會把需要你拍板的取捨拿出來問。</p>

<h3 id="工作流-b改高風險模組">工作流 B：改高風險模組</h3>

<p>像是支付、登入、授權、排程、交易、資料同步等：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/guard
/plan-eng-review
開始實作
/review
/cso                  ← 碰到金流、登入、權限就補這顆資安審查
/investigate          ← 若測試或驗證時出現不明錯誤
/qa
/ship
</code></pre></div></div>

<p>這條的核心是先加護欄，再做規劃。你不想在 payment 或 auth 模組旁邊讓 Claude 野放。</p>

<h3 id="工作流-c純前端--ui-優化">工作流 C：純前端 / UI 優化</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/design-shotgun       ← 還沒想好長什麼樣：一次生成多個版本讓你挑
/design-html          ← 挑定的版本變成可上線的 HTML
/plan-design-review
/design-consultation  ← 若要重建整體設計系統
開始實作
/design-review
/qa
</code></pre></div></div>

<p>先補設計規格，再做 live-site 的視覺與互動檢查，最後用 QA 把實際操作流程測一輪。這樣 UI 就不是只修成漂漂亮亮的截圖，而是能真的用。</p>

<hr />

<h2 id="新手實戰範例用-gstack-做一個會員分級功能">新手實戰範例：用 gstack 做一個會員分級功能</h2>

<h3 id="第一步先定義真問題">第一步：先定義真問題</h3>

<p>你對 Claude Code 說：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>我們的電商系統會員分級現在是人工判斷，容易漏升級，客服常常要補發折扣。我要做一個會員分級自動化功能。
/office-hours
</code></pre></div></div>

<p>比較理想的反應，不是立刻幫你寫資料表，而是把問題改寫成：</p>

<ul>
  <li>你真正要解的是「會員狀態同步與權益自動觸發」</li>
  <li>分級邏輯、通知時機、回溯補發、客服 override 權限都要一併考慮</li>
  <li>可能不只是資料表欄位新增，而是事件驅動流程</li>
</ul>

<h3 id="第二步收斂-mvp">第二步：收斂 MVP</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/plan-ceo-review
</code></pre></div></div>

<p>讓它判斷 MVP 是不是只要先做「升級」不做「降級」、是否先不處理歷史資料回補、哪些通知與權益可以第二階段再做。</p>

<h3 id="第三步補工程骨架">第三步：補工程骨架</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/plan-eng-review
</code></pre></div></div>

<p>請它產出分級規則資料結構、訂單完成後的觸發時機、同步與非同步邊界、retry / idempotency / audit log、state diagram、test matrix。</p>

<h3 id="第四步做完後先-pr-級審查">第四步：做完後先 PR 級審查</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/review
</code></pre></div></div>

<p>看看有沒有：rule engine 寫死在 controller、邏輯分散、補發機制沒有 transaction 邊界、權益狀態與會員狀態可能不同步。</p>

<h3 id="第五步跑-qa">第五步：跑 QA</h3>

<p>若有後台設定頁、會員頁、折扣顯示頁：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/qa
</code></pre></div></div>

<p>這時它才會真的去看畫面、點流程、找 interaction bug。</p>

<div class="article-part"><span class="article-part-num">四</span><span class="article-part-title">新版變化與實務建議</span></div>

<h2 id="2026-年-8-月更新這半年多出來的東西">2026 年 8 月更新：這半年多出來的東西</h2>

<p>本文首發時 gstack 大約二十顆技能，現在官方清單上有三十幾顆、repo 裡的目錄超過五十個。如果你是三月看過這篇、現在回來複習，下面這幾件事最值得知道。</p>

<h3 id="1-規劃可以一鍵串完">1. 規劃可以一鍵串完</h3>

<p><code class="language-plaintext highlighter-rouge">/autoplan</code> 把 CEO、設計、工程三道規劃審查自動接起來，只在需要你決定品味與取捨時才停下來問。另外多了 <code class="language-plaintext highlighter-rouge">/spec</code>，專門把「我大概想做這個」變成一份能直接交給 AI 執行的規格，還會先用 Codex 打分數當關卡，太粗糙就不准存檔。</p>

<h3 id="2-出貨不再停在開-pr">2. 出貨不再停在開 PR</h3>

<p>以前流程走到 <code class="language-plaintext highlighter-rouge">/ship</code>（開 PR）就結束了。現在後面接得上：<code class="language-plaintext highlighter-rouge">/land-and-deploy</code> 把「PR 已核准」一路帶到「正式環境已驗證」，<code class="language-plaintext highlighter-rouge">/canary</code> 在部署後持續盯 console 錯誤與效能退化，<code class="language-plaintext highlighter-rouge">/benchmark</code> 則負責量頁面載入速度與 Core Web Vitals，做前後對照。第一次用 <code class="language-plaintext highlighter-rouge">/land-and-deploy</code> 前要先跑一次 <code class="language-plaintext highlighter-rouge">/setup-deploy</code> 設定你的平台與正式站網址。</p>

<h3 id="3-資安變成一個獨立角色">3. 資安變成一個獨立角色</h3>

<p>新增 <code class="language-plaintext highlighter-rouge">/cso</code>（資安長）：跑 OWASP Top 10 加 STRIDE 威脅模型，每個發現都要求附上具體的攻擊情境，並用信心門檻與誤報排除清單壓低雜訊。碰金流、登入、權限、檔案上傳的功能，這顆值得固定跑。</p>

<h3 id="4-設計從審查延伸到生成">4. 設計從「審查」延伸到「生成」</h3>

<p>以前設計類只有審查（<code class="language-plaintext highlighter-rouge">/plan-design-review</code>、<code class="language-plaintext highlighter-rouge">/design-review</code>）。現在多了兩顆做東西的：<code class="language-plaintext highlighter-rouge">/design-shotgun</code> 一次生成 4 到 6 個視覺版本、開一個比較面板讓你挑，還會記住你的偏好；挑定之後交給 <code class="language-plaintext highlighter-rouge">/design-html</code> 變成可上線的 HTML，而不是只能看的示意圖。</p>

<h3 id="5-開發者體驗自成一軸">5. 開發者體驗自成一軸</h3>

<p>如果你做的是 API、CLI、SDK 或文件，使用者是工程師而不是一般人，那就換另一組：規劃階段用 <code class="language-plaintext highlighter-rouge">/plan-devex-review</code>，做完用 <code class="language-plaintext highlighter-rouge">/devex-review</code> 真的照文件走一次上手流程、計時、截圖失敗處，再回頭跟當初的評分對照。</p>

<h3 id="6-它開始記得你的專案">6. 它開始記得你的專案</h3>

<p><code class="language-plaintext highlighter-rouge">/learn</code> 管理 gstack 跨 session 累積的東西——這個 repo 的慣例、踩過的雷、你的偏好，可以檢視、搜尋、清掉。另外還有 <code class="language-plaintext highlighter-rouge">/context-save</code>、<code class="language-plaintext highlighter-rouge">/context-restore</code> 與可選的連續存檔模式：開啟後 AI 會邊做邊自動提交進度（訊息前綴 <code class="language-plaintext highlighter-rouge">WIP:</code>，並附上決策、剩餘工作、失敗過的做法），電腦掛掉或換手時能還原現場，<code class="language-plaintext highlighter-rouge">/ship</code> 會在開 PR 前把這些 WIP 提交壓成一筆。</p>

<h3 id="7-不再只服務-claude-code">7. 不再只服務 Claude Code</h3>

<p>現在支援十種 AI coding agent（Codex、Cursor、OpenCode、Hermes、Kiro 等），另有 <code class="language-plaintext highlighter-rouge">/pair-agent</code> 可以把同一個瀏覽器分享給多個 AI 代理、各自開自己的分頁。另外多了一整組 iOS 實機測試技能（<code class="language-plaintext highlighter-rouge">/ios-qa</code>、<code class="language-plaintext highlighter-rouge">/ios-fix</code>、<code class="language-plaintext highlighter-rouge">/ios-design-review</code> 等），能透過 USB 驅動真的 iPhone 做測試——不做 iOS 可以直接跳過。</p>

<h3 id="8-順手提一下隱私">8. 順手提一下隱私</h3>

<p>gstack 有使用統計，但<strong>預設關閉</strong>，第一次執行會問你要不要開；開了也只送技能名稱、耗時、成功失敗、版本與作業系統，不送程式碼、路徑、repo 名稱或你的提示詞。想關掉隨時 <code class="language-plaintext highlighter-rouge">gstack-config set telemetry off</code>。這點值得知道，因為導入團隊時一定有人會問。</p>

<hr />

<h2 id="gstack-最容易踩的坑">gstack 最容易踩的坑</h2>

<p><strong>1. 把它當超大 prompt 包</strong>
gstack 的強項是分工與節奏，不是「每顆 skill 都超神」。</p>

<p><strong>2. 需求很模糊，卻跳過 <code class="language-plaintext highlighter-rouge">/office-hours</code></strong>
這樣後面就像把房子蓋在鬆沙上，看起來搭起來了，踩上去會陷。</p>

<p><strong>3. 還沒規劃就急著 <code class="language-plaintext highlighter-rouge">/ship</code></strong>
<code class="language-plaintext highlighter-rouge">/ship</code> 是收尾與出貨，不是替你代替思考。</p>

<p><strong>4. UI 專案只做 <code class="language-plaintext highlighter-rouge">/review</code>，沒做 <code class="language-plaintext highlighter-rouge">/qa</code> 或 <code class="language-plaintext highlighter-rouge">/design-review</code></strong>
很多問題不在 code diff 裡，而是在真實操作裡。</p>

<p><strong>5. Debug 時不開 <code class="language-plaintext highlighter-rouge">/freeze</code> 或 <code class="language-plaintext highlighter-rouge">/guard</code></strong>
AI 很容易看你桌上亂，就順手把隔壁房間也掃了。</p>

<p><strong>6. 一次把所有 skill 都用滿</strong>
新手最好的節奏不是「全餐」，而是先練熟核心幾顆。</p>

<hr />

<h2 id="新手最推薦先熟的-5-顆">新手最推薦先熟的 5 顆</h2>

<p>如果你今天剛開始用 gstack，我最建議先把這 5 顆練熟：</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">/plan-eng-review</code></li>
  <li><code class="language-plaintext highlighter-rouge">/review</code></li>
  <li><code class="language-plaintext highlighter-rouge">/qa</code></li>
  <li><code class="language-plaintext highlighter-rouge">/investigate</code></li>
  <li><code class="language-plaintext highlighter-rouge">/guard</code></li>
</ol>

<p>原因很單純，這 5 顆最直接對應 AI 開發最常見的風險：規劃不夠硬、merge 前缺少結構檢查、網頁實際沒測、出 bug 時只會亂修、改動範圍失控。</p>

<p>等這套順了，再加入 <code class="language-plaintext highlighter-rouge">/office-hours</code>、<code class="language-plaintext highlighter-rouge">/plan-ceo-review</code>、<code class="language-plaintext highlighter-rouge">/ship</code> 與設計系 skills，會更有感。想省事的話，<code class="language-plaintext highlighter-rouge">/autoplan</code> 可以直接替你把規劃那幾顆串起來；做的東西碰到金流或登入，再加一顆 <code class="language-plaintext highlighter-rouge">/cso</code>。</p>

<hr />

<h2 id="常見問題">常見問題</h2>

<p><strong>Q1：gstack 會不會取代你自己思考？</strong>
不會。它比較像幫你建立一套「該在什麼時候用哪種思考」的節奏。真正的判斷仍然要你做，尤其是產品取捨、商業決策、系統風險接受度。</p>

<p><strong>Q2：我只是寫小功能，也需要整套流程嗎？</strong>
不一定。小功能可以簡化成：</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/plan-eng-review → 開始做 → /review
</code></pre></div></div>

<p>若有 UI，再補 <code class="language-plaintext highlighter-rouge">/qa</code>。gstack 最重要的是節奏感，不是每次都要滿漢全席。</p>

<p><strong>Q3：skills 沒有出現怎麼辦？</strong>
先到安裝目錄重新跑 <code class="language-plaintext highlighter-rouge">./setup</code>。若 <code class="language-plaintext highlighter-rouge">/browse</code> 有問題，可再跑 <code class="language-plaintext highlighter-rouge">bun install &amp;&amp; bun run build</code>。若是安裝過舊，可用 <code class="language-plaintext highlighter-rouge">/gstack-upgrade</code>，或在 <code class="language-plaintext highlighter-rouge">~/.gstack/config.yaml</code> 開啟 <code class="language-plaintext highlighter-rouge">auto_upgrade: true</code>。Windows 沒開開發者模式的話，還要記得每次 <code class="language-plaintext highlighter-rouge">git pull</code> 後重跑一次 <code class="language-plaintext highlighter-rouge">./setup</code>（原因見上面安裝那節）。</p>

<p><strong>Q4：我還裝了別的技能包，指令名稱會不會撞？</strong>
會，所以官方留了開關。<code class="language-plaintext highlighter-rouge">./setup --prefix</code> 會把指令改成 <code class="language-plaintext highlighter-rouge">/gstack-qa</code> 這種帶前綴的名字，<code class="language-plaintext highlighter-rouge">./setup --no-prefix</code> 則改回 <code class="language-plaintext highlighter-rouge">/qa</code>。選過一次之後，後續升級會記住你的選擇。</p>

<p><strong>Q5：怎麼知道自己現在是哪一版？</strong>
安裝目錄下的 <code class="language-plaintext highlighter-rouge">VERSION</code> 檔就是版本號，也可以直接跑 <code class="language-plaintext highlighter-rouge">/gstack-upgrade</code> 讓它告訴你差了什麼。本文更新時的最新版是 v1.60.2.0。</p>

<hr />

<h2 id="我的實務建議把-gstack-當成團隊開發規範">我的實務建議：把 gstack 當成團隊開發規範</h2>

<p>如果你只是自己玩，gstack 已經很好用；但它真正發光，是當你把它變成團隊共識的一部分。你可以在 repo 的 <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> 明確規定：</p>

<ul>
  <li>新功能開始前至少跑一次 <code class="language-plaintext highlighter-rouge">/plan-eng-review</code></li>
  <li>UI 變更必跑 <code class="language-plaintext highlighter-rouge">/qa</code></li>
  <li>merge 前必跑 <code class="language-plaintext highlighter-rouge">/review</code></li>
  <li>高風險模組先 <code class="language-plaintext highlighter-rouge">/guard</code></li>
  <li>不明 bug 先 <code class="language-plaintext highlighter-rouge">/investigate</code></li>
  <li>release 時讓 <code class="language-plaintext highlighter-rouge">/ship</code> 帶著 <code class="language-plaintext highlighter-rouge">/document-release</code> 一起收尾</li>
</ul>

<p>這樣一來，gstack 就不是「某個人偷偷在用的神奇技能」，而是一條大家都知道怎麼走的開發道路。</p>

<hr />

<h2 id="結語">結語</h2>

<p>gstack 最值得學的地方，不是它有幾顆指令，也不是哪一顆最炫，而是它把 Claude Code 從「很會寫東西的 AI」變成「有工序、有守門員、有驗證習慣的 AI 開發流程」。</p>

<p>你可以把它想成替 Claude Code 裝上一條生產線。不是讓它寫得更快而已，而是讓它<strong>更像一個能交付的工程團隊</strong>。</p>

<hr />

<h2 id="參考來源">參考來源</h2>

<p>以下連結於 2026 年 8 月 8 日重新核對，對照版本為 gstack v1.60.2.0。</p>

<ul>
  <li><a href="https://github.com/garrytan/gstack/blob/main/README.md">gstack README — 安裝、技能列表、Troubleshooting</a></li>
  <li><a href="https://github.com/garrytan/gstack/blob/main/ARCHITECTURE.md">gstack ARCHITECTURE — persistent browser 與長駐 Chromium daemon 設計</a></li>
  <li><a href="https://github.com/garrytan/gstack/blob/main/docs/skills.md">gstack docs/skills — <code class="language-plaintext highlighter-rouge">/plan-eng-review</code>、<code class="language-plaintext highlighter-rouge">/plan-design-review</code>、<code class="language-plaintext highlighter-rouge">/review</code> 定位與方法</a></li>
  <li><a href="https://github.com/garrytan/gstack/blob/main/AGENTS.md">gstack AGENTS.md — 以 SKILL.md 組成的 AI engineering workflow</a></li>
</ul>]]></content><author><name></name></author><category term="claude-code" /><summary type="html"><![CDATA[gstack 不是一包 prompt，而是一套把 AI 開發流程角色化、階段化的工作流。從需求定義、工程規劃、PR 審查、QA 測試、資安稽核到部署驗證，每個階段都有明確分工的 slash commands。2026 年 8 月依 v1.60.2.0 更新。]]></summary></entry><entry><title type="html">從工程師到設計通才：利用 Claude Code 與三層架構打造 AI 設計系統全攻略</title><link href="https://swanky.github.io/claude-code/claude-code-design-system/" rel="alternate" type="text/html" title="從工程師到設計通才：利用 Claude Code 與三層架構打造 AI 設計系統全攻略" /><published>2026-03-21T04:00:00+00:00</published><updated>2026-03-21T04:00:00+00:00</updated><id>https://swanky.github.io/claude-code/claude-code-design-system</id><content type="html" xml:base="https://swanky.github.io/claude-code/claude-code-design-system/"><![CDATA[<h2 id="1-數位產品開發的新範式ai-賦能的設計無感轉型">1. 數位產品開發的新範式：AI 賦能的設計無感轉型</h2>

<p>在傳統研發體系中，「工程邏輯」與「視覺審美」常被視為天平的兩端。工程師精於系統架構，卻往往在像素間距、排版節奏與色彩對比前駐足。然而，生成式 AI 正在重塑這一格局，將設計門檻降至前所未有的高度。現在，具備設計能力的「設計工程師（Design Engineer）」已不再是少數天才的專利，而是任何能熟練駕馭 AI 指令集的專業人士都能觸及的邊界。</p>

<p>以前 TikTok 與 Amazon 工程師 Neethan Wu 的轉型為例，他在短短三個月內從零設計經驗，進化到能每週穩定交付高品質、具備專業感的產品介面。這並非依賴 AI 的隨機產出，而是透過一套結構化的「設計裝備系統（Harness）」將專家的隱性知識（Tacit Knowledge）內化為工程能力。</p>

<table>
  <thead>
    <tr>
      <th>時間點</th>
      <th>設計能力狀態</th>
      <th>核心痛點</th>
      <th>最終產出與價值</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>三個月前</td>
      <td>完全空白（零 UI/UX 經驗）</td>
      <td>產出帶有廉價「AI 泡麵味」的粗糙介面</td>
      <td>僅能負責純工程邏輯，設計需等待排程</td>
    </tr>
    <tr>
      <td>轉型期間</td>
      <td>建立 AI Design Harness</td>
      <td>AI 決策碎片化，對話結束即遺忘規範</td>
      <td>導入系統化 Skills，開始理解「視覺 DNA」</td>
    </tr>
    <tr>
      <td>現在</td>
      <td>端到端設計與交付通才</td>
      <td>如何在維持設計感時兼顧程式碼可維護性</td>
      <td>每週穩定產出高品質、可上線的專業設計</td>
    </tr>
  </tbody>
</table>

<p>這種「Design Without Designing」的核心競爭力，在於工程師能以「審美」為導向引導「邏輯」，實現能力的指數級擴張。要達成此目標，我們需要一套結構化的「Harness（裝備系統）」來武裝 AI Agent。</p>

<hr />

<h2 id="2-三層設計裝備系統the-harness-framework深度解析">2. 三層設計裝備系統（The Harness Framework）深度解析</h2>

<p>要讓 AI Agent 真正像一名資深設計師般思考，必須構建一套三層架構，將專業判斷標準、協作介面與審美訓練整合進工作流中。</p>

<table>
  <thead>
    <tr>
      <th>架構層級</th>
      <th>核心功能</th>
      <th>代表工具</th>
      <th>對工程師的價值</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Layer 1: Skills（專業知識）</td>
      <td>將大師級判斷標準編碼進 Agent</td>
      <td>Impeccable, Design Engineer Skill</td>
      <td>借用專家品味，解決「AI 忘記設計決策」問題</td>
    </tr>
    <tr>
      <td>Layer 2: Canvas（協作介面）</td>
      <td>提供 Agent 可直讀直寫的運作沙盒</td>
      <td>Paper, Pencil</td>
      <td>「殼（Shell）與核（Kernel）」架構，支援 Git 版控</td>
    </tr>
    <tr>
      <td>Layer 3: Inspiration（審美訓練）</td>
      <td>縮短從靈感到產出的實作距離</td>
      <td>Variant, Mobbin, Awwwards</td>
      <td>萃取「視覺 DNA」，訓練工程師的審美眼光</td>
    </tr>
  </tbody>
</table>

<p><strong>關鍵組件深度分析：</strong></p>

<ul>
  <li>
    <p><strong>Layer 1: Skills（專業知識內化）：</strong> 這是將隱性知識顯性化的過程。除了 Paul Bakaus 針對 Web UI 優化的 Impeccable，還包括 Emil Kowalski 的 Design Engineer Skill（專精於動畫節奏與微互動細節），以及 Dammyjay 的 Interface Design。後者透過持久化的 system.md 解決了 Agent 在不同對話中遺忘設計規範的問題，確保設計決策具備持續性。</p>
  </li>
  <li>
    <p><strong>Layer 2: Agent Canvas（協作介面）：</strong> 畫布是 AI 的「殼」，Agent 是「核」。Paper 以 HTML/CSS 為基礎，讓設計即程式碼。而 Pencil 則採用 JSON 格式的 .pen 檔案，具備良好的 Git-diffable 特性。Pencil 的 Swarm Mode 更是殺手鐧，支援多達六個 Agent 同時協作，分別處理字型、佈局、排版與設計規範的同步更新。</p>
  </li>
  <li>
    <p><strong>Layer 3: Inspiration（審美訓練）：</strong> 透過 Variant 的 Style Dropper 功能，工程師能直接從頂級作品中吸取配色與空間密度等視覺 DNA，並將其轉化為程式碼參數，從根本上訓練工程師的「判斷力」。</p>
  </li>
</ul>

<p>在所有工具中，Claude Code 內的 Skills 是改變產出品質最直接的槓桿，特別是透過 Impeccable 注入的專業標準。</p>

<hr />

<h2 id="3-claude-code-實戰impeccable-技能的深度應用">3. Claude Code 實戰：Impeccable 技能的深度應用</h2>

<p>Claude Code 的 Skills 機制允許我們將複雜的設計邏輯注入開發環境。Impeccable 作為 Anthropic frontend-design 的強化版，提供了超過 20 個專業指令，是目前優化 Web UI 的權威方案。</p>

<p><strong>安裝與配置路徑</strong></p>

<ul>
  <li><strong>路徑 A（npx）：</strong> 執行 <code class="language-plaintext highlighter-rouge">npx skills add pbakaus/impeccable</code> 自動部署。</li>
  <li><strong>路徑 B（Marketplace）：</strong> 在 Claude Code 內使用 <code class="language-plaintext highlighter-rouge">/plugin marketplace add pbakaus/impeccable</code>。</li>
</ul>

<p><strong>核心指令集：診斷與精修的標準化路徑</strong></p>

<ul>
  <li><strong>Diagnostic（診斷類）：</strong>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">/audit</code>：全面診斷 UI 結構問題，並提供優化方向。</li>
      <li><code class="language-plaintext highlighter-rouge">/critique</code>：進行主觀審美評估，導向更深層的修飾建議。</li>
    </ul>
  </li>
  <li><strong>Refinement（修飾類）：</strong>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">/typeset</code>：建立固定的字級尺度（Fixed Scale），而非無序的流體排版。</li>
      <li><code class="language-plaintext highlighter-rouge">/arrange</code>：精準校正 Layout 與 Spacing，消除佈局紊亂。</li>
      <li><code class="language-plaintext highlighter-rouge">/polish</code>：整體細節精修，消除毛邊。</li>
      <li><code class="language-plaintext highlighter-rouge">/delight</code>：Neethan Wu 最推薦的指令，能針對細節注入驚喜感，使產品質感在一夜之間完成跨越式升級。</li>
    </ul>
  </li>
</ul>

<p><strong>自動修正「AI 泡麵味」（反模式糾正）</strong></p>

<p>Impeccable 能自動識別並消除以下常見的 AI 設計失誤：</p>

<ul>
  <li>過度飽和的紫色與彩色漸層</li>
  <li>低對比度導致的可讀性災難（如灰字壓彩色背景）</li>
  <li>無意義的巢狀卡片（Nested Cards）堆疊</li>
  <li>缺乏光影層次的純黑（Pure Black）背景</li>
</ul>

<hr />

<h2 id="4-高效能設計工作流從診斷到規範的標準路徑">4. 高效能設計工作流：從診斷到規範的標準路徑</h2>

<p>在 AI 協作中，建立正確的「節奏感」能防止 AI 陷入無效的隨機修改。我們必須依循一個結構化的 SOP。</p>

<ol>
  <li>
    <p><strong>注入設計上下文（<code class="language-plaintext highlighter-rouge">/teach-impeccable</code>）</strong>
2026/03 的重大更新引入了 <code class="language-plaintext highlighter-rouge">.impeccable.md</code> 機制。工程師應先跑一次此指令，定義品牌語氣、產品定位與使用者輪廓。這份上下文會跨 Skills 共用，確保 AI 的「設計人格」一致且不被覆蓋。</p>
  </li>
  <li>
    <p><strong>啟動初步診斷（<code class="language-plaintext highlighter-rouge">/audit</code>）</strong>
優先處理結構性問題（視覺層級、規格化），而非急於美化。</p>
  </li>
  <li>
    <p><strong>分層專項修復（<code class="language-plaintext highlighter-rouge">/typeset</code> &amp; <code class="language-plaintext highlighter-rouge">/arrange</code>）</strong>
優先處理排版與間距。記住：App UI 應追求秩序感的固定尺度，而非盲目追求 fluid typography。</p>
  </li>
  <li>
    <p><strong>細節打磨與精修（<code class="language-plaintext highlighter-rouge">/polish</code> &amp; <code class="language-plaintext highlighter-rouge">/delight</code>）</strong>
在結構穩固的基礎上，進行最後的精緻度升級。</p>
  </li>
  <li>
    <p><strong>萃取設計規範與 Token</strong>
要求 AI 將視覺修正收斂成可重用的 Design Tokens 或 Component Props，防止硬編碼（Hardcoding）導致的技術債。</p>
  </li>
</ol>

<p><strong>團隊協作策略：</strong> 務必將 Skill 安裝在專案層級（<code class="language-plaintext highlighter-rouge">.claude/skills/</code>）並提交至 Git。這能確保團隊中每位工程師叫喚 Claude 修復頁面時，審美標準與限制條件保持絕對一致。</p>

<hr />

<h2 id="5-實戰防禦機制約束條件與常見失誤規避">5. 實戰防禦機制：約束條件與常見失誤規避</h2>

<p>「保留約束」是工程師管理 AI 設計時最重要的手段。必須將 AI 關在正確的跑道內，避免其像「看到草地的羊」一樣隨意重構。</p>

<p><strong>核心防禦：State Management &amp; API Integrity Preservation</strong></p>

<p>在 Prompt 中必須明確劃定邊界：</p>

<ul>
  <li><strong>邏輯鎖定：</strong> 嚴禁修改 API 調用邏輯、Router 配置與狀態管理系統。</li>
  <li><strong>資產優先：</strong> 強制 AI 優先復用現有元件庫（Existing Components），而非自行創造新組件。</li>
  <li><strong>範疇限定：</strong> 明確指令僅針對 UI 結構、間距、排版與色彩進行修正。</li>
</ul>

<table>
  <thead>
    <tr>
      <th>錯誤行為</th>
      <th>潛在影響</th>
      <th>正確做法</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>使用空洞指令（如「變高級」）</td>
      <td>產出缺乏品牌特性的萬用模板</td>
      <td>提供具體的 <code class="language-plaintext highlighter-rouge">.impeccable.md</code> 設計上下文</td>
    </tr>
    <tr>
      <td>一次性要求修改全站</td>
      <td>修改過於碎片化，難以驗證且易出錯</td>
      <td>建立一頁「樣板頁面」（如 Dashboard），驗證後再擴散</td>
    </tr>
    <tr>
      <td>缺乏約束條件</td>
      <td>AI 順手重構整個設計系統，導致邏輯崩潰</td>
      <td>使用「保留約束」，限制 AI 僅更動視覺表現層</td>
    </tr>
    <tr>
      <td>忽視可維護性</td>
      <td>產生大量單頁 Inline Styles，難以維護</td>
      <td>要求 AI 將修正收斂為 CSS Tokens 或 Props</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="6-結語當-google-stitch-遇上-figma設計的未來是什麼">6. 結語：當 Google Stitch 遇上 Figma，設計的未來是什麼？</h2>

<p>設計工具的邊界正在以前所未有的速度瓦解。Google Stitch 的更新引發 Figma 股價大幅波動，這不僅僅是市場競爭，更預示著 Design.md 概念的崛起——設計不再是封閉的繪圖格式，而是與程式碼、版本控制深度耦合的動態文件。</p>

<p>在未來，設計的「殼（Canvas）」會越來越輕量化，而「核（AI Agent）」的判斷力將決定產品的生死。透過建立自己的「設計裝備系統」，工程師能以邏輯為骨架，將資深設計師的隱性知識轉化為執行力。當 Google Stitch 讓設計自動化成為主流，工程師的優勢在於能將審美感直接注入開發流程。</p>

<p>現在，就從建立你的第一份 <code class="language-plaintext highlighter-rouge">.impeccable.md</code> 開始，利用 Claude Code 擴展你的能力邊界。在這個 AI 原生的開發時代，你不需要成為設計師，你只需要擁有最強大的裝備系統。</p>]]></content><author><name></name></author><category term="claude-code" /><summary type="html"><![CDATA[透過三層設計裝備系統（Skills、Canvas、Inspiration）與 Claude Code，任何工程師都能穩定交付高品質、具備專業感的產品介面。]]></summary></entry><entry><title type="html">Claude Code 終端機魔法書：初學者的開發加速指南</title><link href="https://swanky.github.io/claude-code/claude-code-terminal-magic-guide/" rel="alternate" type="text/html" title="Claude Code 終端機魔法書：初學者的開發加速指南" /><published>2026-03-21T00:00:00+00:00</published><updated>2026-03-21T00:00:00+00:00</updated><id>https://swanky.github.io/claude-code/claude-code-terminal-magic-guide</id><content type="html" xml:base="https://swanky.github.io/claude-code/claude-code-terminal-magic-guide/"><![CDATA[<h2 id="真正的差距從來不在工具本身">真正的差距，從來不在工具本身</h2>

<p>在協助各種規模的團隊導入 AI 工具的過程中，我注意到一件很有意思的事：同樣付費使用 Claude Code，不同人的實際產出差距可以大到令人驚訝。</p>

<p>問題幾乎從不是「Claude 夠不夠強」，而是用法。</p>

<p>大多數人把 Claude Code 當成一個「比較聰明的補全工具」來用——輸入需求、等待輸出、再輸入下一個需求。這樣當然也能用，但遠遠低估了它作為<strong>自主代理人（Autonomous Agent）</strong>的真正潛力。</p>

<p>Claude Code 的更新節奏非常快，很多有意思的功能悄悄上線，連官方文件都還沒跟上。這篇文章整理的，是我在實際操作中真正改變工作流程的那些用法，不求全面，只求實用。</p>

<hr />

<h2 id="一先把對話管好才能把任務做好">一、先把對話管好，才能把任務做好</h2>

<p>AI 協作最常被忽略的隱性成本，是<strong>對話的混亂</strong>。一個被雜訊污染的上下文，會讓 Claude 逐漸跑偏，進而讓整個開發方向失焦。以下幾個工具，專門針對這個問題。</p>

<h3 id="插話而不打斷btw">插話而不打斷：/btw</h3>

<p>這是我近期最常推薦給協作者的指令之一。</p>

<p>場景是這樣的：Claude 正在執行一個耗時的大型任務，比如重構某個核心模組，這時你突然想確認一個不相關的小細節——「那個設定檔放在哪個目錄？」</p>

<p>過去的做法，不管你是直接插問還是等任務結束再問，都會在對話歷史裡留下一段跟主線毫無關係的問答，逐步稀釋 Claude 對當前任務的「焦點」。</p>

<p><code class="language-plaintext highlighter-rouge">/btw</code> 解決的正是這個問題。它在主線任務之外開啟一個平行進程，你的問題得到解答後，這段對話可以直接抹除，主線絲毫不受影響。更重要的是，它複用當前的提示快取（Prompt Cache），<strong>幾乎不額外消耗 Token</strong>，是非常值得養成的操作習慣。</p>

<h3 id="外科手術式回退rewind">外科手術式回退：/rewind</h3>

<p>許多人知道 Claude Code 可以雙擊 Esc 回退，但不知道這個動作在近期升級後，已經具備了細粒度的選擇能力。</p>

<p>執行 <code class="language-plaintext highlighter-rouge">/rewind</code> 後，你會看到一個選單，讓你決定回退的範圍：</p>

<table>
  <thead>
    <tr>
      <th>選項</th>
      <th>最適合的情境</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>同時回退代碼與對話</td>
      <td>整個實驗方向都錯了，需要從某個節點完整重來</td>
    </tr>
    <tr>
      <td>僅回退代碼，保留對話</td>
      <td>代碼行不通，但 Claude 的分析過程有保留價值，換個方向繼續</td>
    </tr>
    <tr>
      <td>僅回退對話，保留代碼</td>
      <td>代碼是對的，但對話冗長已影響效能，清空討論釋放上下文</td>
    </tr>
    <tr>
      <td>從此處壓縮對話</td>
      <td>會話過長、Token 逼近上限，壓縮歷史以延續工作</td>
    </tr>
  </tbody>
</table>

<p>這四種組合，對應著四種完全不同的開發現場。真正讓你大膽做實驗的，不是勇氣，而是知道自己永遠有退路。</p>

<h3 id="認識自己的盲點insights">認識自己的盲點：/insights</h3>

<p>這個指令被嚴重低估。</p>

<p>執行後，Claude Code 會生成一份本地 HTML 報告，分析你過去一個月的使用模式——哪些指令你從未觸碰、哪些操作在重複浪費時間、哪些地方可以用自訂指令或 Skill 取代手工輸入。</p>

<p>換句話說，Claude 在<strong>反向觀察你</strong>。</p>

<p>建議每個月執行一次，把它當成自己的工作回顧。在高強度使用 Claude Code 的階段，人很容易形成路徑依賴，以為自己已經用得很熟練，但 <code class="language-plaintext highlighter-rouge">/insights</code> 常常會指出一些你根本沒意識到的冗餘習慣。</p>

<hr />

<h2 id="二資源是有限的智慧地分配它">二、資源是有限的，智慧地分配它</h2>

<p>Claude Code 的費用結構，決定了「如何使用模型」本身就是一個需要思考的問題。</p>

<h3 id="規劃與執行分離model-opusplan">規劃與執行分離：/model opusplan</h3>

<p>這是一個不在預設選單裡的隱藏模式，直接輸入 <code class="language-plaintext highlighter-rouge">/model</code> 是看不到它的，必須完整鍵入 <code class="language-plaintext highlighter-rouge">/model opusplan</code>。</p>

<p>它啟動的是一種混合工作流：</p>

<ul>
  <li><strong>規劃階段</strong>：由 Claude Opus 4.6 主導，負責分析架構依賴、釐清技術決策、拆解複雜任務</li>
  <li><strong>執行階段</strong>：自動切換至 Claude Sonnet 4.6，快速完成具體的代碼撰寫</li>
</ul>

<p>這個設計背後的邏輯很清晰：<strong>複雜推理與代碼生成，對模型能力的需求不同</strong>。把最貴的算力集中在真正需要深度思考的環節，其餘交給效能更高的模型——對於 Pro 訂閱用戶來說，這是延長高階模型配額最直接的方式。</p>

<h3 id="三個維度同時-reviewsimplify">三個維度同時 Review：/simplify</h3>

<p>每次與 Claude Code 完成幾輪密集的功能開發後，我習慣跑一次 <code class="language-plaintext highlighter-rouge">/simplify</code>。</p>

<p>它會並行啟動三個 Agent，分別從<strong>代碼復用</strong>、<strong>代碼品質</strong>、<strong>運行效能</strong>三個角度審查你的改動，最後彙整建議。AI 生成的代碼有一個規律性的問題：功能正確，但結構上常常夾帶冗餘——多餘的 import、相似邏輯的重複實作、可以更簡潔的寫法。這些不影響運作，但會慢慢侵蝕代碼庫的可維護性。</p>

<p><code class="language-plaintext highlighter-rouge">/simplify</code> 做的事，相當於同時找了三位審查角度不同的資深工程師，在你提交之前幫你看一遍。</p>

<hr />

<h2 id="三讓思路可以分叉讓工作可以延續">三、讓思路可以分叉，讓工作可以延續</h2>

<p>好的開發工作流需要「可逆」，也需要「可記錄」。以下幾個指令處理的是這個面向。</p>

<h3 id="平行宇宙的實驗場branch">平行宇宙的實驗場：/branch</h3>

<p>如果說 <code class="language-plaintext highlighter-rouge">/rewind</code> 是後悔藥，那 <code class="language-plaintext highlighter-rouge">/branch</code>（原名 <code class="language-plaintext highlighter-rouge">/fork</code>）就是讓你在後悔之前就先佈局退路。</p>

<p>當 Claude 梳理完一個方案的脈絡，你想嘗試兩種完全不同的實現路徑，但又不想丟掉當前進度——分叉一個新會話，兩條路各自延伸，互不干擾，最後再比較結果。</p>

<p>這在技術選型或架構評估的場景裡特別有用。</p>

<h3 id="決策是資產不是過程export">決策是資產，不是過程：/export</h3>

<p>一段深度的架構討論，往往比最終的代碼本身更有參考價值——它記錄了「為什麼這樣決定」，而不只是「決定了什麼」。</p>

<p><code class="language-plaintext highlighter-rouge">/export</code> 將整段對話導出為 Markdown 文件。這份記錄可以作為未來補充上下文的素材，也可以直接傳遞給其他協作工具，讓不同的 AI 助理接棒繼續工作。</p>

<h3 id="排程進行式loop">排程進行式：/loop</h3>

<p><code class="language-plaintext highlighter-rouge">/loop</code> 讓 Claude 定時重複執行特定任務。語法直覺：<code class="language-plaintext highlighter-rouge">/loop 5m 確認部署狀態</code> 代表每五分鐘執行一次，預設間隔是十分鐘。</p>

<p>結果會直接出現在對話上下文裡，Claude 可以基於這些結果進行判斷和後續操作，而不只是單純輸出狀態文字。值得注意的是，定期任務在建立三天後會自動到期——這是一個防止遺忘循環無限運行的設計。</p>

<hr />

<h2 id="四打破空間限制把工作帶著走">四、打破空間限制，把工作帶著走</h2>

<h3 id="手機遙控本地環境remote-control">手機遙控本地環境：/remote-control</h3>

<p>在終端機輸入 <code class="language-plaintext highlighter-rouge">/rc</code>，系統會產生一組加密 URL。用手機開啟，整個 Claude Code 工作環境就出現在你的手機螢幕上——雙向同步，兩端都可以操作，對話歷史完全一致。</p>

<p>關鍵在於：<strong>代碼仍然在你的電腦本機執行</strong>。手機扮演的角色只是遠端操作介面，你的檔案系統、MCP 服務、專案設定，全部留在本地，安全性不打折扣。</p>

<p>通勤途中審查 Claude 的輸出，或是在不方便打開電腦的場合繼續推進任務，都是真實的使用場景。</p>

<hr />

<h2 id="五操作層的效率從快捷鍵開始">五、操作層的效率，從快捷鍵開始</h2>

<p>最後整理幾個我每天都在用的快捷鍵，看似細節，實際上每次累積起來都是可感知的差距：</p>

<table>
  <thead>
    <tr>
      <th>快捷鍵</th>
      <th>用途</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl+V</code></td>
      <td>直接貼上截圖（Mac 同樣是 Ctrl，不是 Cmd）。Debug 時截圖貼入，Claude 直接看圖定位問題</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl+J</code> 或 <code class="language-plaintext highlighter-rouge">Option+Enter</code></td>
      <td>換行而不送出，撰寫多行 Prompt 的必備操作</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl+R</code></td>
      <td>搜尋過往輸入過的 Prompt，避免重複鍵入</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Ctrl+U</code></td>
      <td>清空當前輸入行</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="工具快心態要更穩">工具快，心態要更穩</h2>

<p>Claude Code 的更新節奏相當驚人。很多功能在進入官方文件之前，早就悄悄部署進來了。</p>

<p>想跟上這個節奏，最直接的方式是定期翻閱 <a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md">CHANGELOG.md</a>，以及關注開發團隊在社群平台上的動態——他們有時候隨口一提的新用法，比任何教程都快。</p>

<p>但比跟上更新更重要的，是建立自己的使用回顧習慣。<code class="language-plaintext highlighter-rouge">/insights</code> 是一個起點。工具進化得再快，真正決定生產力上限的，始終是<strong>你如何組織自己的工作方式</strong>。</p>]]></content><author><name></name></author><category term="claude-code" /><category term="claude-code" /><summary type="html"><![CDATA[從對話品質管理、成本優化到跨裝置協作，以顧問實戰視角整理 Claude Code 最值得掌握的進階用法。]]></summary></entry><entry><title type="html">Claude Code 時代，Kent Beck 為什麼提醒我們不要只看「80% 完成」</title><link href="https://swanky.github.io/technical/claude-code-kent-beck-tdd/" rel="alternate" type="text/html" title="Claude Code 時代，Kent Beck 為什麼提醒我們不要只看「80% 完成」" /><published>2026-03-19T00:00:00+00:00</published><updated>2026-03-19T00:00:00+00:00</updated><id>https://swanky.github.io/technical/claude-code-kent-beck-tdd</id><content type="html" xml:base="https://swanky.github.io/technical/claude-code-kent-beck-tdd/"><![CDATA[<p>最近看到 Kent Beck 一段話，我覺得非常值得在今天這個 Claude Code 與 AI coding 工具快速普及的時代，再重新讀一次。</p>

<p>他提到：</p>

<blockquote>
  <p>“One of my frustrations with ‘scientific’ studies of TDD is that they concluded that TDD created more reliable software but took longer.”</p>
</blockquote>

<p>以及他認為真正關鍵的問題其實是：</p>

<blockquote>
  <p>“The important question is how long other workflows would take to get to the same level of reliability.”</p>
</blockquote>

<p>這兩句話，點出了一個很多工程團隊很容易忽略的盲點。</p>

<p>很多人看到「TDD 讓軟體更可靠，但花比較久」這種結論時，直覺會覺得，既然比較慢，那是不是代表效率比較差？</p>

<p>但 Kent Beck 真正想表達的意思不是這樣。他在問的是：如果不用 TDD，而是用其他 workflow，最後也要把系統做到同樣可靠、同樣穩定、同樣可承擔真實風險，那總共要花多久？</p>

<p>這裡的關鍵，不是「誰比較快做出第一版」，而是「誰比較快到達同一個品質終點」。</p>

<p>因為很多方法看起來比較快，往往只是比較快做出一個「能跑的版本」。但從能跑，到真正可靠、可驗證、可交付、可上線，中間通常還有很長一段路，包括：</p>

<ul>
  <li>補測試</li>
  <li>修 bug</li>
  <li>補邊界條件</li>
  <li>處理例外流程</li>
  <li>修正需求理解偏差</li>
  <li>補齊整合驗證</li>
  <li>確保上線後不會出大事</li>
</ul>

<p>所以，如果一種方法只是前面衝得快，後面卻要花更多時間補洞，那它不一定真的比較快。它只是比較早看起來像完成而已。</p>

<p>Kent Beck 後面又講了一句非常重，但也非常精準的話：</p>

<blockquote>
  <p>“Nobody cares! 80% of a payroll system is the same as 0% of a payroll system.”</p>
</blockquote>

<p>這句話如果只看表面，可能會覺得很激烈。但他真正想說的是：</p>

<p>對於薪資系統、金流系統、交易系統、報稅系統、醫療系統這類高正確性場景來說，80% 完成，往往不具備真正的可交付價值。</p>

<p>因為剩下的 20%，常常才是最困難、最關鍵、最不能出錯的部分，例如：</p>

<ul>
  <li>各種稅務與法規例外處理</li>
  <li>邊界條件下的計算正確性</li>
  <li>外部系統失敗時的補償機制</li>
  <li>例外付款與特殊案件處理</li>
  <li>審計、追蹤、覆核與合規要求</li>
</ul>

<p>也就是說，真正決定一個系統能不能上線的，不是你把主流程做出了多少，而是你有沒有把那些不能錯的地方也做對。</p>

<p>Kent 最後這句，我認為幾乎可以當成今天 AI 開發時代的提醒：</p>

<blockquote>
  <p>“Don’t tell me it doesn’t take as long to not travel as far. Tell me how long it takes to get to the same destination.”</p>
</blockquote>

<p>我對這句話的理解是：不要只比較前期速度，請說明達到同等品質終點的總時間。</p>

<p>這也是為什麼我認為，在 Claude Code 時代，測試與規格不是變得比較不重要，而是變得更重要。</p>

<p>因為當 AI 可以快速幫我們：</p>

<ul>
  <li>生成程式碼</li>
  <li>重構模組</li>
  <li>補測試樣板</li>
  <li>寫 migration script</li>
  <li>整理文件與技術方案</li>
</ul>

<p>真正的瓶頸就不再只是「寫不寫得出來」，而是：</p>

<ul>
  <li>需求有沒有講清楚</li>
  <li>商業規則有沒有定義完整</li>
  <li>邊界條件有沒有先想過</li>
  <li>驗收標準是否明確</li>
  <li>改完之後是否真的沒破壞既有功能</li>
  <li>產出的內容到底是不是做對，而不只是做出來</li>
</ul>

<p>換句話說，AI 加速的是程式生成，測試保障的是正確性，規格決定的是方向。</p>

<p>如果沒有測試，AI 幫你加速的，不一定只是交付，也可能是錯誤擴散的速度。如果沒有規格，AI 幫你提升的，不一定只是效率，也可能是高效率地做錯事。</p>

<p>所以我越來越認為，Claude Code 時代真正要升級的，不只是 prompt 技巧，而是整個工程方法。</p>

<p>我的理解很簡單：規格，決定 AI 往哪裡走。測試，決定我們能不能相信它走對了。</p>

<p>有規格、有測試、有明確驗收標準的團隊，Claude Code 會像渦輪增壓器。沒有這些基礎的團隊，Claude Code 也可能只是把原本的返工、誤解與技術債放大而已。</p>

<p>所以如果要用一句話總結 Kent Beck 這段話，以及它對今天 AI coding 時代的意義，我會這樣說：</p>

<p>不要只比較誰比較快寫出程式，要比較誰比較快交付一個真正可靠、可驗證、可上線的系統。寫得快，從來不是終點。更快走到正確、可靠、可被信任的終點，才是。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[從 Kent Beck 對 TDD 的觀點出發，探討在 Claude Code 與 AI coding 工具時代，為何測試與規格比以往更加重要，80% 完成的系統不等於可交付的系統。]]></summary></entry><entry><title type="html">Claude Code 初體驗：不到兩小時，我做出了熱錢包前後端</title><link href="https://swanky.github.io/technical/claude-code-hot-wallet/" rel="alternate" type="text/html" title="Claude Code 初體驗：不到兩小時，我做出了熱錢包前後端" /><published>2026-03-07T00:00:00+00:00</published><updated>2026-03-07T00:00:00+00:00</updated><id>https://swanky.github.io/technical/claude-code-hot-wallet</id><content type="html" xml:base="https://swanky.github.io/technical/claude-code-hot-wallet/"><![CDATA[<p>最近公司在推行 Claude Code，趁著周末的下午也抽空訂閱試用了一下。順便下周開工時說一下我的體驗順便給部門裡的 TPM 與工程師們一點壓力。</p>

<p>結果比我預期還要震撼。感覺是 Cursor Agent 模式的更進化更準確版本。</p>

<p>我一邊用 Claude Code，一邊讓 ChatGPT 和 Cursor 教我怎麼用，前後不到兩個小時，就把一個有前後端的網頁版熱錢包用 Spring Boot 生出來了。</p>

<p>而且這兩個小時裡，還不是全都在寫功能。我其實還花了一些時間在處理比較「人類時代」的事情，像是抓 JDK、安裝 Maven、設定環境變數。這一段目前看起來還沒有完全自動化，所以我還是手動裝了一輪。</p>

<p>當然，第一次生出來的程式不是一鍵就能跑。</p>

<p>實際上，剛開始跑起來還是有錯。我猜一部分原因是我沒有先把規則、結構、慣例定義得夠清楚，所以 AI 一開始雖然很快，但不夠穩。不過有趣的是，後來也幾乎不用我真的下去改 code，而是讓 AI 讀錯誤、修錯誤、再重跑，最後把它自己生出來的問題一個個補起來。</p>

<p>那種感覺很奇妙。</p>

<p>以前我當工程師的時候，對 IDE 快捷鍵很熟，TDD、重構、抽 method、切 service、調整 package structure，很多樂趣都在那個過程裡。你會一邊寫，一邊思考這段程式應該怎麼依據功能需求長大、縮小、拆分，哪些責任該留在 service，哪些該往 domain 或 adapter 挪，整個寫程式的過程，其實很像是在雕一個會呼吸的東西。</p>

<p>但現在的 coding 體感，好像正在換一種樣子。</p>

<p>你不再一定是那個逐行敲 code 的人。</p>

<p>反而更像是一個 PM，在指揮一位非常熟練、很聽話、反應極快的工程師。</p>

<p>或者像是在 pair programming，只是你成了那個幾乎只出一張嘴的人。</p>

<p>目前還是要靠我把字打出來。但我認真覺得，接下來更快的協作方式，很可能不是打字，而是直接用說的。再往後一點，甚至不排除是更直接的腦機介面。到那個時候，軟體開發的核心能力，可能不再只是「會不會寫」，而是：</p>

<p>你能不能清楚定義需求、拆解問題、建立規則、判斷品質、引導 AI 持續收斂。</p>

<p>這件事也讓我重新思考一個問題：</p>

<p>未來的軟體部門，真的還需要像現在這樣的人力規模嗎？</p>

<p>也許很多情境下，答案會是不用。</p>

<p>一個真正懂軟體工程的人，搭配足夠成熟的 AI 工具，生產力可能真的會逐漸接近過去一整個團隊。</p>

<p>這不代表軟體工程專業不重要。</p>

<p>剛好相反。</p>

<p>因為當 AI 越來越會寫，真正有價值的會變成那些「知道怎麼讓系統長對、切對、修對、收斂對」的人。</p>

<p>工具正在改變，角色也正在改變。</p>

<p>寫程式這件事，也許沒有消失，只是從「親手施工」慢慢變成了「高密度設計與指揮」。</p>

<p>而這個轉變，可能比很多人想像得還快。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[用 Claude Code 搭配 Spring Boot，不到兩小時完成熱錢包前後端的實測體驗與未來軟體開發角色轉變的思考。]]></summary></entry><entry><title type="html">當同仁對我說：「主管，不如你自己下來寫 Code 吧？」— 談那些掛在牆上卻沒用的企業文化</title><link href="https://swanky.github.io/technical/enterprise-culture-dilemma/" rel="alternate" type="text/html" title="當同仁對我說：「主管，不如你自己下來寫 Code 吧？」— 談那些掛在牆上卻沒用的企業文化" /><published>2026-02-01T00:00:00+00:00</published><updated>2026-02-01T00:00:00+00:00</updated><id>https://swanky.github.io/technical/enterprise-culture-dilemma</id><content type="html" xml:base="https://swanky.github.io/technical/enterprise-culture-dilemma/"><![CDATA[<p>前幾天，我在帶領團隊時經歷了兩個真實的場景。那一刻的衝擊，讓我整整思考了好幾天。</p>

<h3 id="場景一職責的邊界">場景一：職責的邊界</h3>

<p>一位同仁負責的開發事項嚴重延誤，偏偏這時又來了一個緊急插件任務。我試著與他討論資源調度：「原本落後的工作，你建議我們可以交給誰來做？」</p>

<p>他給出了一個我始料未及的建議：「主管你既然也會技術，不如你自己下來寫程式吧。」</p>

<h3 id="場景二權利與績效的錯置">場景二：權利與績效的錯置</h3>

<p>在課會檢討時，我們討論是否針對績效明顯不彰的同仁，暫停其居家上班（WFH）的權利，希望能透過回到辦公室增加協作密度來挽救進度。但該同仁的回應不是針對績效的反省，而是理直氣壯地說：「每個月10天居家根本不夠，我覺得我在家效率比較好。」（雖然我也無從比較，建議他看能不能讓我進行A/B Testing）。</p>

<p>當下，我承認我是傻眼的。但冷靜下來後，我意識到這不僅僅是「態度問題」。這是一個更深層的信號：我們團隊對於「什麼是對的行為」，存在著巨大的認知斷層。</p>

<p>帶著這些困惑，我在書店遇見了《哈佛商業評論》的一篇文章：〈六步打造可落實的企業文化（Build a Corporate Culture That Works）〉。</p>

<p>文章作者Erin Meyer給了我一個當頭棒喝。她指出，大多數公司的文化之所以失敗，是因為它們充斥著「絕對正面」的抽象名詞，例如：誠信、團隊合作、追求卓越。</p>

<p><strong>為什麼這些沒用？</strong></p>

<p>因為沒有人會說「我不想要誠信」或「我不想要合作」。這些只是「入場券（Permission-to-play）」，而非真正的文化。</p>

<p>文章中有一個極具洞察力的觀點深深打動了我：</p>

<blockquote>
  <p>「真正的文化，不是列出優點，而是定義『兩難困境（Dilemmas）』。文化必須能告訴員工，當兩個好的價值觀發生衝突時，我們選擇哪一個？」</p>
</blockquote>

<p>這正是我們團隊目前缺失的拼圖。</p>

<p>回頭看我遇到的狀況，這其實是兩個典型的文化兩難，但我們從未定義過選擇的標準：</p>

<h3 id="1-自主性autonomy-vs-協作性collaboration">1. 自主性（Autonomy） vs. 協作性（Collaboration）</h3>

<p>那位同仁認為「在家工作感覺比較好」是他的自主性價值。但在我們的團隊現況中，當個人產出低落時，我們是否應該為了「協作性」而犧牲「自主性」？如果文化沒有明確指出「當績效未達標時，團隊協作優先於個人自由」，那麼在他眼中，他只是在爭取合理的權益，而我成了那個剝奪福利的壞人。</p>

<h3 id="2-角色分工defined-roles-vs-彈性補位flexibility">2. 角色分工（Defined Roles） vs. 彈性補位（Flexibility）</h3>

<p>當同仁叫我自己寫Code時，他心中堅守的是「角色分工」（那是你的能力範圍，你也可以做）。但我心中期待的是「當責」（Accountability）——也就是當任務無法完成時，你是否有責任提出「除了一走了之或丟回給主管」以外的解決方案？我們沒有定義清楚：在危急時刻，我們是鼓勵「堅守崗位」還是「不計代價解決問題」？</p>

<p>Erin Meyer在文中強調：「如果你想要一個可落實的文化，你必須對你的價值觀進行『兩難測試』（Dilemma-test your values）。」</p>

<p>也就是說，我們必須誠實地告訴團隊：</p>

<ul>
  <li>我們重視「員工福利」，但（But）當它與「團隊產出」衝突時，我們選擇產出。</li>
  <li>我們重視「階級扁平」，但（But）這不代表主管是用來承接所有殘局的備案。</li>
</ul>

<p>文化不是寫給牆看的，是寫給這些「關鍵時刻」用的。</p>

<p>如果不把這些隱性的取捨（Trade-offs）變成顯性的規則，那麼員工就會用他們自己的邏輯來填補空白——結果就是我遇到的這些荒謬場景。</p>

<h3 id="接下來的行動從口號轉向抉擇">接下來的行動：從「口號」轉向「抉擇」</h3>

<p>為了止血並重塑體質，我決定近期召開全體策略會議。這次我們不談空泛的願景，我要帶著大家進行一場「文化兩難測試」。</p>

<p>我們需要共同畫出那條底線：</p>

<ol>
  <li><strong>重新定義WFH：</strong> 它不是福利，而是基於「信任」與「高績效」的交換。當信任被破壞，權利就該收回。</li>
  <li><strong>釐清當責的定義：</strong> 遇到困難時，把問題丟回給主管不叫做解決問題；提出可執行的Plan B才是。</li>
  <li><strong>確認我們的優先序：</strong> 當「個人舒適度」與「團隊目標」衝突時，我們允許發生什麼？不允許發生什麼？</li>
</ol>

<p>管理是一條修煉之路。這篇文章提醒了我，身為領導者，我的責任不是抱怨員工「怎麼會這樣想」，而是要反思「我是否允許了這樣的想法存在」。</p>

<p>如果你也覺得帶人很累，或許該停下來看看，你們的文化是在解決問題，還是在製造模糊空間？</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[從真實的團隊管理場景出發，結合《哈佛商業評論》的文化兩難測試，探討如何打造可落實的企業文化。]]></summary></entry><entry><title type="html">Web3 的下個入口在手機？解析 Solana Seeker 如何用「硬體＋空投」改寫用戶分發邏輯</title><link href="https://swanky.github.io/technical/solana-seeker-airdrop/" rel="alternate" type="text/html" title="Web3 的下個入口在手機？解析 Solana Seeker 如何用「硬體＋空投」改寫用戶分發邏輯" /><published>2026-01-22T00:00:00+00:00</published><updated>2026-01-22T00:00:00+00:00</updated><id>https://swanky.github.io/technical/solana-seeker-airdrop</id><content type="html" xml:base="https://swanky.github.io/technical/solana-seeker-airdrop/"><![CDATA[<p>【我用 450 美金預購手機，結果空投先把手機錢賺回來了】</p>

<p>2024 年 1 月，我做了一個當時看起來「太早」的決定：預購 Solana Mobile 第二代手機 Chapter 2（現名 Seeker）。 當時我的心態不是為了炒幣，而是一個實驗：如果 Web3 要走向主流，真正的入口會在哪裡？我的答案之一是：手機。</p>

<p>快轉到 2026 年 1 月，隨著 $SKR 空投到帳，這場歷時兩年的實驗有了很有趣的結果。</p>

<p>這不僅僅是一次購物，更讓我看見了 Web3 商業模式的典範轉移。以下是我的 3 個核心觀察與操作覆盤：</p>

<h3 id="1-還沒拿到手機成本就歸零了硬體即通路">1. 還沒拿到手機，成本就歸零了（硬體即通路）</h3>

<p>最瘋狂的不是手機本身，而是「身份」。 在我還沒收到實體手機前，綁定的預購錢包就開始收到生態系的空投（如 MEW、MANEKI）。在 2024 年 4 月的高峰期，光是這些空投的價值就超過了 450 美金的預購費，簡單說就是「買到賺到」。</p>

<p><strong>洞察：</strong> Web3 正在把「硬體」變成可量化的分發通路。你買的不是裝置，是一張「被生態系辨識的 VIP 入場券」。</p>

<h3 id="2-2025-年實機體驗從儀式感變成日常">2. 2025 年實機體驗：從「儀式感」變成「日常」</h3>

<p>拿到 Seeker 後，最有感的不是硬體規格，而是它解決了 Web3 的系統級痛點：</p>

<ul>
  <li><strong>Seed Vault：</strong> 私鑰硬體隔離，搭配指紋與側鍵雙擊確認。自託管不再是繁瑣的儀式，而是像 Apple Pay 一樣的直覺手勢。</li>
  <li><strong>Seeker Genesis Token：</strong> 這是綁定裝置的靈魂。App 透過它辨識你是真實用戶，給予差異化權益。</li>
</ul>

<h3 id="3-2026-年-skr-空投機制比發幣更重要">3. 2026 年 SKR 空投：機制比「發幣」更重要</h3>

<p>最近收到的 SKR 空投（我是 Prospector 等級，獲配 10,000 顆），展現了更成熟的分配機制：</p>

<ul>
  <li><strong>分級制（Tier）：</strong> 依據活躍度分級，拒絕齊頭式平等。</li>
  <li><strong>反女巫（Anti-Sybil）：</strong> 透過硬體綁定，大幅降低刷號套利，獎勵真實使用者。</li>
</ul>

<h3 id="我的操作策略80-落袋20-信仰">我的操作策略：80% 落袋，20% 信仰</h3>

<p>面對新代幣，我採取標準的風控紀律：</p>

<ul>
  <li><strong>80% 先賣掉：</strong> 收回成本與鎖定利潤，讓這場實驗變成「無風險持有」。(但領完賣掉後的隔天，SKR 價格漲了超過 300%)</li>
  <li><strong>20% 質押（Stake）：</strong> 留在場內參與治理，把這部分當作「看漲選擇權」，也算是繼續參與後續空投的行動之一。 (註：此為個人操作紀錄，非投資建議)</li>
</ul>

<h3 id="總結web3-的下一波不只在鏈上也在裝置上">總結：Web3 的下一波，不只在鏈上，也在「裝置」上</h3>

<p>Solana Mobile 這條路透露出幾個清晰趨勢：</p>

<ol>
  <li>硬體成為新型態的分發渠道（User Acquisition Channel）。</li>
  <li>代幣經濟（Tokenomics）從募資工具轉變為平台治理與激勵的底層架構。</li>
  <li>App Store 的權力結構正在被挑戰，開發者與用戶能透過代幣共享紅利。</li>
</ol>

<p>Seeker 對我來說不只是一支手機，它是一個正在成形的商業模型：用硬體綁定真實身份，用代幣分配利益，最後用行動平台將 Web3 推進日常，而且目前僅是第一季SKR空投活動，看好後續更多的應用進展。</p>

<p>你怎麼看「硬體＋空投＋代幣治理」這套模式？ 你覺得下一個被代幣經濟重塑的硬體會是什麼？（穿戴裝置、車機、還是路由器？）</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[從預購 Solana Seeker 到收到 SKR 空投的兩年實驗覆盤，解析硬體＋空投＋代幣治理的 Web3 商業模式。]]></summary></entry><entry><title type="html">從「資產價格」到「資產負債表」：如何用 ether.fi 把加密資產變成可用的現金流</title><link href="https://swanky.github.io/technical/etherfi-crypto-cashflow/" rel="alternate" type="text/html" title="從「資產價格」到「資產負債表」：如何用 ether.fi 把加密資產變成可用的現金流" /><published>2026-01-10T00:00:00+00:00</published><updated>2026-01-10T00:00:00+00:00</updated><id>https://swanky.github.io/technical/etherfi-crypto-cashflow</id><content type="html" xml:base="https://swanky.github.io/technical/etherfi-crypto-cashflow/"><![CDATA[<p>在 Web3 的世界裡，我們常開玩笑說自己是「帳面富翁」。你看著錢包裡的資產隨著市場波動起伏，但當你想在轉角咖啡廳買杯拿鐵，或是支付每個月的電費時，那些數字往往顯得遙不可及。</p>

<p>最近，我因為一個意外的驚喜，徹底改變了對加密資產「使用方式」的看法。</p>

<h3 id="一場來自-aavegotchi-的空投引發的金融實驗">一場來自 Aavegotchi 的空投，引發的金融實驗</h3>

<p>事情的起因很生活化：我收到了一筆來自 Aavegotchi 的空投，大概有 1.4 ETH (雖然不是曾收到過的空投中最多的，但這項目剛搬到 Base 不久就送錢不太清楚為啥)。按照往常的直覺，這筆錢大概率會被我直接丟進某個 DeFi 協議繼續「套娃」領息，或者乾脆放著不動。</p>

<p>但那一刻，我腦中閃過一個念頭：如果加密資產不再只是「先賣掉再花」，而是能「一邊生息、一邊刷卡」，那它對我來說就不再只是投機的籌碼，而是一份真正的「日常金融工具」。</p>

<p>於是，我決定申請 ether.fi Cash Card，展開一場將 Web3 資產帶入現實生活的實驗。</p>

<hr />

<h3 id="為什麼crypto--信用卡是下一個金融敘事">為什麼「Crypto + 信用卡」是下一個金融敘事？</h3>

<p>傳統金融（TradFi）的邏輯是斷裂的：你的存款在銀行帳戶生利息，而你的消費則透過信用卡支付帳單。這兩者通常互不干涉，且中間隔著層層的手續費與時間差。</p>

<p>然而，像 ether.fi 這類 DeFi-native 支付產品的出現，正試圖將兩條平行線接起來。它的核心野心在於：讓資產留在鏈上運作，讓消費在現實中發生。</p>

<p>透過這張卡，我觀察到兩種極具代表性的金融模式，它們分別解決了不同使用場景下的痛點：</p>

<h3 id="1-direct-pay-mode穩定幣的即時流動性">1. Direct Pay Mode：穩定幣的即時流動性</h3>

<p>在這種模式下，刷卡消費是直接從 Vault（保險庫）內的穩定幣（如 USDC 或 LiquidUSD）餘額中扣除。這不是借貸，因此沒有利息支出，只有標準的交易成本。對於那些已經習慣在鏈上持有穩定幣的使用者來說，這是一個比「交易所出金」更直接、更具隱私性的路徑。</p>

<h3 id="2-borrow-mode資產持有者的不賣幣策略">2. Borrow Mode：資產持有者的「不賣幣」策略</h3>

<p>這是我認為最有趣的部分。你可以抵押手上的加密資產（例如我的 ETH）來借出穩定幣消費。這意味著：</p>

<ul>
  <li><strong>維持曝險：</strong> 我不需要在低點賣掉我的 ETH，能繼續享受未來可能的增幅。</li>
  <li><strong>低利借款：</strong> 目前官方提供的借款年化利率（APY）約為 4% 左右。</li>
  <li><strong>隨借隨還：</strong> 透過智慧合約，這種借貸關係變得極度透明且靈活。</li>
</ul>

<p>這本質上是在把 DeFi 借貸做成「連我爸媽都看得懂」的 UI 介面，讓普通人也能操作複雜的資產槓桿。</p>

<hr />

<h3 id="現金流的質感變化資產負債表的新觀念">現金流的「質感」變化：資產負債表的新觀念</h3>

<p>過去，我們衡量加密資產的方式是看「價格圖表上的一條線」。但在這種「收益資產 + 消費工具」的融合下，加密貨幣更像是一張可動態管理的資產負債表。</p>

<p>當我刷卡時，我領取的不再只是傳統銀行的紅利點數，而是以 wETH 計價的刷卡回饋（視會員等級而定）。這形成了一個完美的閉環：</p>

<ol>
  <li><strong>存入：</strong> 將 ETH 存入協議，領取質押與再質押收益。</li>
  <li><strong>消費：</strong> 在 Visa 通路刷卡，甚至支援 Apple Pay / Google Pay (我自己試過 LINE Pay 也可以)。</li>
  <li><strong>再增值：</strong> 透過刷卡回饋累積更多的 ETH。</li>
</ol>

<hr />

<h3 id="理性看待這是一場有風險的實驗">理性看待：這是一場有風險的實驗</h3>

<p>作為一名 Web3 的長期觀察者，我不會只歌頌這項技術的便利。在使用這類卡片時，我始終將風險放在最顯眼的位置：</p>

<ul>
  <li><strong>智能合約風險：</strong> 你的資產是託付給鏈上協議運作的，技術上的漏洞永遠是潛在的威脅。</li>
  <li><strong>清算風險：</strong> 如果你選擇 Borrow Mode，當市場劇烈波動導致抵押品價值下跌時，你必須隨時注意補足抵押，以免被自動清算。</li>
  <li><strong>穩定幣與通道限制：</strong> 穩定幣的脫鉤風險，以及法幣網關在不同國家的法規限制，仍是這類產品普及的障礙。</li>
</ul>

<p>因此，我目前的策略是「小額度測試」。我把它當成一個新型金融介面的早期實驗，而不是一鍵投入所有身家的終極方案。</p>

<hr />

<h3 id="結語結帳聲中的-web3-革命">結語：結帳聲中的 Web3 革命</h3>

<p>Crypto + Card 的趨勢本質上是在回答一個懸而未決的老問題：「除了投資，加密貨幣還能幹嘛？」</p>

<p>如果我們能實現在不退出 Crypto 生態的前提下，優雅地處理日常生活中的每一筆開支，那麼加密金融的戰場就不再僅限於交易所的 K 線圖或 DeFi 的 TVL 數據，而是會走進全球數千萬個 Visa 結帳終端的刷卡聲中。</p>

<p>最後，想與大家討論：</p>

<p>你認為加密信用卡會先成為主流的支付方式，還是會因為各國監管與風控的收緊而受阻？</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[實測 ether.fi Cash Card，探索加密資產如何透過 DeFi 借貸與穩定幣支付，成為日常可用的現金流工具。]]></summary></entry><entry><title type="html">當博物館開始收藏 NFT，那不是潮流，而是歷史定位的轉折點</title><link href="https://swanky.github.io/technical/nft-museum-collection/" rel="alternate" type="text/html" title="當博物館開始收藏 NFT，那不是潮流，而是歷史定位的轉折點" /><published>2025-12-21T00:00:00+00:00</published><updated>2025-12-21T00:00:00+00:00</updated><id>https://swanky.github.io/technical/nft-museum-collection</id><content type="html" xml:base="https://swanky.github.io/technical/nft-museum-collection/"><![CDATA[<p>2025 年 12 月 20 日，紐約現代藝術博物館（MoMA） 正式將兩個 NFT 系列納入永久館藏：</p>

<ul>
  <li>CryptoPunks（Larva Labs, 2017）</li>
  <li>Chromie Squiggle（Snowfro, 2020）</li>
</ul>

<p>這不是一次市場操作，也不是價格背書。 這是一個非常清楚的訊號：</p>

<p><strong>數位原生藝術，正式被寫進當代藝術史的核心敘事。</strong></p>

<hr />

<h3 id="為什麼這件事很-moma">為什麼這件事「很 MoMA」？</h3>

<p>MoMA 的收藏邏輯，從來不追逐市場熱度，而是關心一個更根本的問題：</p>

<blockquote>
  <p>媒介，如何改變觀看與創作的方式？</p>
</blockquote>

<p>CryptoPunks 與 Chromie Squiggle 之所以被納入，不在於它們長什麼樣子，而在於它們回答了三個關鍵命題。</p>

<hr />

<h3 id="一moma-在意的不是價格而是三個歷史條件">一、MoMA 在意的不是價格，而是三個「歷史條件」</h3>

<p><strong>① 它是不是「第一代」</strong></p>

<ul>
  <li>CryptoPunks：NFT 文化的起點</li>
  <li>Chromie Squiggle：完全 on-chain generative art 的起點</li>
</ul>

<p>先行者地位一旦成立，幾乎不會被歷史洗掉。</p>

<p><strong>② 它有沒有不可複製的「語言」</strong></p>

<p>這兩個系列有一個共同特徵：</p>

<ul>
  <li>看一眼就知道是誰的作品</li>
  <li>即使不懂 NFT，也知道它在幹嘛</li>
</ul>

<p>在藝術史裡，這極其重要。 MoMA 收藏的不是圖片，而是一種能被辨識、被引用的創作語言。</p>

<p><strong>③ 它能不能代表一個時代</strong></p>

<p>MoMA 收藏 CryptoPunks， 不是在收藏頭像，而是在收藏 「2017 年區塊鏈文化的起點」。</p>

<p>MoMA 收藏 Squiggle， 也不是在收藏線條，而是在收藏 「藝術第一次完全由鏈上程式生成」。</p>

<hr />

<h3 id="這不是第一次但卻是最具指標性的一次">這不是第一次，但卻是最具指標性的一次</h3>

<p>在此之前：</p>

<ul>
  <li>Institute of Contemporary Art Miami 已收藏 CryptoPunk #5293</li>
  <li>Beeple 的 NFT 以 6,930 萬美元成交，震撼拍賣市場</li>
</ul>

<p>但 MoMA 的不同在於：</p>

<p>這不是事件型收藏，而是制度型納入。</p>

<p>NFT 不再是「新媒體藝術的例外」，而是被視為當代藝術發展脈絡的一部分。</p>

<hr />

<h3 id="市場冷靜文化升溫">市場冷靜，文化升溫</h3>

<p>有意思的是，這個決定發生在相對冷靜的市場週期。</p>

<p>根據 Art Basel x UBS 藝術市場報告：</p>

<ul>
  <li>交易筆數上升</li>
  <li>總成交金額下降</li>
  <li>市場進入「去泡沫、留價值」的結構調整期</li>
</ul>

<p>MoMA 的選擇，其實也在提醒我們一件事：</p>

<p><strong>真正會被留下來的，不是短期價格，而是能被歷史敘事吸收的作品。</strong></p>

<hr />

<h3 id="那麼怎麼判斷-nft-是否值得長期持有">那麼，怎麼判斷 NFT 是否值得長期持有？</h3>

<p>把 MoMA 的標準濃縮成 5 個問題：</p>

<ol>
  <li>如果 10 年後只剩 5 個 NFT 被記住，它會在裡面嗎？</li>
  <li>它是在複製風格，還是在創造風格？</li>
  <li>如果沒有價格，你還會想保存它嗎？</li>
  <li>它能不能被寫成一句話？「第一個＿＿＿＿的 NFT。」</li>
  <li>團隊消失，作品還成立嗎？</li>
</ol>

<hr />

<h3 id="一個可以直接套用的結論">一個可以直接套用的結論</h3>

<p>值得長期持有的 NFT，大致只有三種：</p>

<ol>
  <li><strong>藝術史級</strong>（CryptoPunks、Chromie Squiggle）</li>
  <li><strong>文化符號級</strong>（某個世代或族群的精神圖騰）</li>
  <li><strong>與你個人生命經驗深度交集的作品</strong></li>
</ol>

<p>其餘的，多半只是「時間套利」。</p>

<p>你開始用「藝術收藏者的視角」看 NFT，而不只是投機。</p>

<p>這是好事，但也代表一件必然會發生的事：</p>

<blockquote>
  <p>你未來會自然地淘汰掉很多 NFT。</p>
</blockquote>

<p>因為一旦你用歷史標準看作品，市場雜訊就會慢慢失效。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[從 MoMA 將 CryptoPunks 與 Chromie Squiggle 納入永久館藏，解析 NFT 的藝術史定位與長期收藏判斷標準。]]></summary></entry><entry><title type="html">打破「太忙」的詛咒：從軟工大師到AI時代的正向循環</title><link href="https://swanky.github.io/technical/break-too-busy-curse/" rel="alternate" type="text/html" title="打破「太忙」的詛咒：從軟工大師到AI時代的正向循環" /><published>2025-10-03T00:00:00+00:00</published><updated>2025-10-03T00:00:00+00:00</updated><id>https://swanky.github.io/technical/break-too-busy-curse</id><content type="html" xml:base="https://swanky.github.io/technical/break-too-busy-curse/"><![CDATA[<p>在專案壓力的戰場上，我最常聽到的，是這句古老的藉口： 「太忙了，沒時間寫測試。」 「太忙了，沒時間學AI。」 這些話就像Bug一樣，會自動複製，直到佔滿整個團隊的記憶體。</p>

<p>可是，軟工大師們早就說過：</p>

<ul>
  <li><strong>Kent Beck</strong>（TDD教父）：”I’m not a great programmer, I’m just a good programmer with great habits.” 習慣是你唯一能靠的盔甲。沒測試？那就是裸奔。</li>
  <li><strong>Martin Fowler</strong>：”If it hurts, do it more often.” 覺得CI/CD痛苦？那就是訊號：你越逃避，它越會在凌晨兩點叫你起床。</li>
  <li><strong>Uncle Bob</strong> (Robert C. Martin)：”The only way to go fast is to go well.” 趕工就是你在假裝瞬間移動，實際上只是在無限loading畫面裡轉圈。</li>
  <li><strong>Fred Brooks</strong>（《人月神話》）：”Adding manpower to a late software project makes it later.” 所以別再幻想用更多人力取代方法論。再塞人進來，只會製造更多人同時喊「太忙」。</li>
  <li><strong>Ward Cunningham</strong>（Technical Debt之父）：”Shipping first time code is like going into debt.” 減掉測試就是信用卡分期付款——只是利息是專案毀滅。</li>
</ul>

<p>這些經典已經足夠血淚，但我們還活在2025年。這時候你又有了新武器：AI。 AI 不是玩具，也不是未來某一天才會用的科技，它已經是現在的「外掛」。 它可以：</p>

<ul>
  <li>幫你生成測試，抵消「我沒時間寫」這種慘白藉口。</li>
  <li>幫你加速Code Review，不是取代人，而是當你的副駕駛。</li>
  <li>幫你補齊文件，讓你少一個藉口把知識鎖在腦子裡。</li>
</ul>

<p>所以，問題不是「要不要用」，而是「你還要裝死多久」。</p>

<p>我們不需要繼續被困在這個自找的迴圈： 太忙 → 不改進 → 更多Bug → 更忙 → 沒時間改進。</p>

<p>我們可以選擇新的循環： 學習（大師智慧＋AI技能） → 提升品質 → 更快交付 → 釋放更多時間 → 再學習。</p>

<p>這不是雞湯，這是現實。如果連軟工界的先知都告訴你「慢才是快」，再加上AI幫你加速流程，卻還有人說「沒時間」，那只能解釋為：他們其實是熱愛痛苦的信徒。</p>

<p>那我問你：你要繼續膜拜「太忙」這個假神，還是要用大師的火炬加上AI的武器，打破輪迴？</p>

<hr />

<p><strong>參考經典：</strong></p>
<ul>
  <li>Kent Beck，《Test-Driven Development: By Example》</li>
  <li>Martin Fowler，《Continuous Integration》《Refactoring》</li>
  <li>Robert C. Martin，《Clean Code》《Clean Architecture》</li>
  <li>Fred Brooks，《The Mythical Man-Month》</li>
  <li>Ward Cunningham，Technical Debt 相關論文與討論</li>
</ul>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[引用 Kent Beck、Martin Fowler 等軟工大師的智慧，結合 AI 工具的應用，探討如何打破忙碌惡性循環。]]></summary></entry><entry><title type="html">用 MBTI 看見差異：從溫伯格的軟體管理學談軟體團隊管理</title><link href="https://swanky.github.io/technical/mbti-software-management/" rel="alternate" type="text/html" title="用 MBTI 看見差異：從溫伯格的軟體管理學談軟體團隊管理" /><published>2025-08-31T00:00:00+00:00</published><updated>2025-08-31T00:00:00+00:00</updated><id>https://swanky.github.io/technical/mbti-software-management</id><content type="html" xml:base="https://swanky.github.io/technical/mbti-software-management/"><![CDATA[<p>之前為了更進一步了解團隊成員，我設計了一個 Persona 資料範本，裡面除了角色定位、工作動機，也放進了 MBTI。原本只是想幫大家增加一點自我覺察與交流的切入點，沒想到今天翻讀 溫伯格的《軟體管理學》第三卷〈關照全局的管理作為〉，發現他早就完整討論過這個主題，還講得比我嚴肅許多。於是，我決定把這兩者結合，整理出一些對軟體團隊管理有用的啟發。</p>

<h3 id="溫伯格與這本書">溫伯格與這本書</h3>

<p>《溫伯格的軟體管理學》出版於 1991 年，作者 Gerald M. Weinberg（中文譯作溫伯格）是軟體工程與管理領域的傳奇人物。他早年參與 IBM 大型主機作業系統的開發，之後投身顧問與寫作，出版超過 40 本著作，內容涵蓋軟體工程、系統思考、組織管理。他提出的觀念，如「一致性管理」和「質量無法透過測試加入」，至今仍被廣泛引用。</p>

<p>在第三卷中，他特別把 MBTI 與氣質理論納入團隊管理工具，用來幫助管理者理解偏好差異，並設計出能容納各種工作風格的流程。</p>

<h3 id="溫伯格怎麼談-mbti">溫伯格怎麼談 MBTI</h3>

<p>溫伯格提醒我們：偏好不是能力。MBTI 不是篩選工具，而是幫助我們理解互動模式，避免把差異當作缺點。</p>

<h3 id="四對偏好">四對偏好</h3>

<ul>
  <li><strong>E / I</strong>（外向 vs 內向）：E 從互動吸能，I 靠安靜回血。</li>
  <li><strong>S / N</strong>（實感 vs 直覺）：S 重視細節與數據，N 著迷於模式與可能性。</li>
  <li><strong>T / F</strong>（思考 vs 情感）：T 注重邏輯一致性，F 注重人際與價值。</li>
  <li><strong>J / P</strong>（判斷 vs 知覺）：J 喜歡規劃結論，P 喜歡保留彈性。</li>
</ul>

<h3 id="16-型人格簡介">16 型人格簡介</h3>

<p>四對偏好的組合形成了 16 型人格，每一型在團隊裡都有獨特的優勢與陷阱：</p>

<ul>
  <li><strong>ISTJ</strong>（檔案管理員）：嚴謹守規則，流程與文件專家，但可能過於保守。</li>
  <li><strong>ISFJ</strong>（守護者）：關心他人，細心可靠，適合維護穩定；但常忽略自己的需求。</li>
  <li><strong>INFJ</strong>（提倡者）：有遠見且重視價值，常為團隊帶來意義感；但容易理想化。</li>
  <li><strong>INTJ</strong>（策劃者）：策略與系統規劃高手，長於制定藍圖；但有時冷漠孤立。</li>
  <li><strong>ISTP</strong>（工藝師）：臨場反應快，擅長解決技術問題；但可能欠缺長期規劃。</li>
  <li><strong>ISFP</strong>（藝術家）：隨和且重視感受，能帶來和諧氛圍；但行動上較被動。</li>
  <li><strong>INFP</strong>（調停者）：理想主義，注重價值與意義；但可能逃避現實衝突。</li>
  <li><strong>INTP</strong>（邏輯學家）：熱衷於分析與理論，解決難題高手；但容易陷入過度思考。</li>
  <li><strong>ESTP</strong>（實幹家）：行動派，擅長即時應變；但容易忽略長遠後果。</li>
  <li><strong>ESFP</strong>（表演者）：活力與氣氛王，能鼓舞士氣；但可能缺乏專注。</li>
  <li><strong>ENFP</strong>（活動家）：熱情創意多，激發團隊想像力；但收尾力不足。</li>
  <li><strong>ENTP</strong>（辯論家）：腦洞大開，點子源源不絕；但可能虎頭蛇尾。</li>
  <li><strong>ESTJ</strong>（執行官）：擅長組織與落實，維持秩序；但有時過於強勢。</li>
  <li><strong>ESFJ</strong>（照顧者）：樂於服務，維護團隊和諧；但容易過度取悅他人。</li>
  <li><strong>ENFJ</strong>（主人公）：具領導魅力，善於激勵與團結；但可能過度承擔。</li>
  <li><strong>ENTJ</strong>（指揮官）：果斷領導、長於策略；但可能忽視人際感受。</li>
</ul>

<h3 id="四氣質與-16-型對應">四氣質與 16 型對應</h3>

<p>溫伯格引用 Keirsey 的四氣質，把 16 型分成四大群：</p>

<ul>
  <li><strong>NT</strong>（理性家，系統/戰略） → ENTJ、ENTP、INTJ、INTP</li>
  <li><strong>NF</strong>（理想家，催化/願景） → ENFP、ENFJ、INFJ、INFP</li>
  <li><strong>SJ</strong>（守護者，流程/穩定） → ESTJ、ESFJ、ISTJ、ISFJ</li>
  <li><strong>SP</strong>（工藝家，臨場/應變） → ESTP、ESFP、ISTP、ISFP</li>
</ul>

<p>NT 通常善於設計架構、做風險建模；NF 擅長文化營造與價值導向；SJ 維護規範、確保落實；SP 臨機應變，能快速處理危機。這四類加起來，幾乎就是完整軟體團隊的必要拼圖。</p>

<h3 id="如何應用在軟體團隊管理">如何應用在軟體團隊管理</h3>

<p>MBTI 的價值在於幫助主管設計「雙通道」流程，讓不同偏好的人都能發揮。幾個實際做法：</p>

<ol>
  <li><strong>會議</strong> → 採「先寫後聊」：I 先安靜書寫，E 再口頭討論。</li>
  <li><strong>文件</strong> → 雙欄呈現：左邊放數據案例（S），右邊放模型假設（N）。</li>
  <li><strong>決策</strong> → 同時檢查標準準則（T）與人際價值（F）。</li>
  <li><strong>流程</strong> → 設計時間盒：先發散（P），再收斂（J），並設置凍結點。</li>
</ol>

<p>氣質的分工：</p>

<ul>
  <li><strong>NT：</strong> 設計藍圖與風險地圖。</li>
  <li><strong>NF：</strong> 跨部門合作時的橋樑與翻譯機。</li>
  <li><strong>SJ：</strong> 守住版本門檻與合規品質。</li>
  <li><strong>SP：</strong> 處理緊急狀況與臨場危機。</li>
</ul>

<aside class="article-cta-mid">
  <p><strong>想換一個角度看自己的工作節奏？</strong>免費人類圖會整理你的決策方式、精力起伏與協作提示；把它當成另一組觀察問題，不是替你貼標籤。</p>
  <a href="/human-design/#hd-form" onclick="if(window.gtag){gtag('event','hd_funnel_entry_click',{source:'article_mbti',intent:'free_chart',from_page:'/technical/mbti-software-management/'});}">免費生成我的人類圖 →</a>
</aside>

<h3 id="intj-主管的自白怎麼跟其他人共事">INTJ 主管的自白：怎麼跟其他人共事</h3>

<p>我自己是 INTJ，這意味著我偏好規劃、系統與長期戰略。但在管理團隊時，如果只依照我的偏好行事，結果一定是「計畫很完美、團隊卻散掉」。所以我必須主動調整：</p>

<ul>
  <li>跟 ESFP 合作時：不要只給文件，要留舞台讓他們用影響力帶動團隊。</li>
  <li>跟 ISFJ 合作時：耐心欣賞他們的細節與規則感，因為這能避免災難。</li>
  <li>跟 ENFP 合作時：幫他們把熱情轉化成可交付成果，否則容易淹沒在創意裡。</li>
  <li>跟 ENTP 合作時：先收集想法，別急著潑冷水，否則他們的創意會瞬間蒸發。</li>
</ul>

<p>換句話說，INTJ 的長處只有在與其他偏好結合時才會完整。孤軍作戰只會得到一份冷冰冰的專案計畫，沒有實際落地的力量。</p>

<h3 id="小結">小結</h3>

<p>溫伯格在《軟體管理學》提醒我們：MBTI 的價值，不是分類，而是設計互動。作為主管，我用 Persona 與 MBTI 的結合來幫助團隊理解彼此的差異，並調整我們的流程與分工。結果呢？至少未來哪天吵架時，我們能說「這是 J 和 P 的衝突」而不是「你就是故意找我麻煩」。這，對我來說就是進步。</p>

<p>你們團隊有用過 MBTI 或其他工具來理解成員差異嗎？留言分享一下，讓我們都能少吵一點。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[結合 MBTI 人格理論與溫伯格《軟體管理學》，探討如何理解團隊成員差異並設計有效的管理流程。]]></summary></entry><entry><title type="html">金融震央逼近：天才法案、新台幣穩定幣與 RWA 引爆的產業地震</title><link href="https://swanky.github.io/technical/rwa-stablecoin-earthquake/" rel="alternate" type="text/html" title="金融震央逼近：天才法案、新台幣穩定幣與 RWA 引爆的產業地震" /><published>2025-08-09T00:00:00+00:00</published><updated>2025-08-09T00:00:00+00:00</updated><id>https://swanky.github.io/technical/rwa-stablecoin-earthquake</id><content type="html" xml:base="https://swanky.github.io/technical/rwa-stablecoin-earthquake/"><![CDATA[<p>穩定幣，曾經只是加密貨幣市場的避險工具，如今正逼近全球金融的核心。它掛鉤法幣、價格穩定、跨境秒傳，全年無休——這些特性，對傳統金融來說，不只是挑戰，而是潛在的顛覆力量。</p>

<h3 id="1-天才法案合法化與束縛並行">1. 天才法案：合法化與束縛並行</h3>

<p>美國最新通過的《Genius 法案》（天才法案），首次以聯邦法律承認穩定幣的合法地位，並制定關鍵規範：</p>

<ul>
  <li>發行者必須以美元或美債建立 1:1 儲備並定期審計；</li>
  <li>穩定幣持有人在發行商破產時擁有優先求償權；</li>
  <li>禁止穩定幣直接生息——不論透過儲備資產回饋利息，或直接掛牌利率產品，全都不行。</li>
</ul>

<p>這項「禁止生息」條款，被視為保護銀行存款業務的最後防線。但它擋得住 DeFi 嗎？在鏈上，穩定幣依然能進入收益池，提供遠高於傳統存款的回報。這將是金融業與 Web3 世界不可避免的碰撞點。</p>

<h3 id="2-新台幣穩定幣台灣的潛在王牌">2. 新台幣穩定幣：台灣的潛在王牌</h3>

<p>台灣尚未推出新台幣穩定幣，但金管會已在《虛擬資產服務法》草案中預留監管框架。 一旦由銀行或金融機構發行掛鉤新台幣的穩定幣，可能帶來：</p>

<ul>
  <li>消除國際交易中的匯率風險；</li>
  <li>將台灣資產無縫接入全球鏈上市場；</li>
  <li>創造本地化的 DeFi 與 RWA 生態圈。</li>
</ul>

<h3 id="3-以新台幣穩定幣定價的-rwa台股上鏈的衝擊">3. 以新台幣穩定幣定價的 RWA：台股上鏈的衝擊</h3>

<p>RWA（Real World Assets，現實世界資產）是將現實世界資產數位化並上鏈的過程，而台灣股市正是天然的應用場景——所有股票與 ETF 都以新台幣定價。</p>

<p>想像未來： 海外投資人只需持有新台幣穩定幣，就能鏈上直接買賣台灣股票，全天候交易、秒級結算。</p>

<p>影響可能包括：</p>

<ul>
  <li><strong>交易效率革命：</strong> T+2 清算制被 T+0 甚至即時交割取代；</li>
  <li><strong>資金自由化：</strong> 吸引更多國際資金，同時增加市場波動；</li>
  <li><strong>監管挑戰：</strong> 外匯與資本市場制度承受前所未有的壓力；</li>
  <li><strong>中介功能縮水：</strong> 券商、銀行、清算所的角色被鏈上基礎設施部分取代。</li>
</ul>

<p>這不只是技術升級，而是金融基礎邏輯的改寫。</p>

<h3 id="4-銀行業的三層恐慌">4. 銀行業的三層恐慌</h3>

<p>如果穩定幣與 RWA 在台灣全面落地，傳統銀行將面臨：</p>

<ol>
  <li><strong>利息被搶：</strong> 穩定幣進入 DeFi，收益率碾壓存款利率；</li>
  <li><strong>交易被鏈吃：</strong> 資產交易直接鏈上結算，銀行與券商的中介價值縮水；</li>
  <li><strong>客戶被代幣帶走：</strong> 資產留在錢包而非銀行帳戶，客戶關係徹底斷鏈。</li>
</ol>

<p>這不是單純的數位轉型，而是一場業務模式的重置。</p>

<h3 id="5-web3-信仰這不只是金融科技而是經濟重建">5. Web3 信仰：這不只是金融科技，而是經濟重建</h3>

<p>《Genius 法案》揭開了新篇章——穩定幣進入主流監管，同時也打開了通往新秩序的大門。 台灣若能率先發行新台幣穩定幣，並結合 RWA 進入鏈上市場，將不只是「跟上趨勢」，而是參與定義未來金融規則。</p>

<p>傳統金融有它的邊界，而 Web3 的使命，就是打破這些邊界。 在鏈上，資產可以 24/7 自由流動、即時結算、全球可驗證，沒有不必要的中間手續與成本。 穩定幣是入口，RWA 是橋樑，去中心化的全球金融體系才是終點。</p>

<p>如果你相信 Web3，你就不只是投資一種技術，而是在參與一場全球經濟的重建。 銀行或許恐慌，但對我們來說，這正是新秩序的黎明。</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[解析美國天才法案對穩定幣的監管框架，以及新台幣穩定幣與 RWA 對台灣金融業的潛在衝擊。]]></summary></entry><entry><title type="html">AI Agent 協作的未來：Google A2A × Anthropic MCP 架構整合解析</title><link href="https://swanky.github.io/technical/ai-agent-a2a-mcp/" rel="alternate" type="text/html" title="AI Agent 協作的未來：Google A2A × Anthropic MCP 架構整合解析" /><published>2025-04-13T00:00:00+00:00</published><updated>2025-04-13T00:00:00+00:00</updated><id>https://swanky.github.io/technical/ai-agent-a2a-mcp</id><content type="html" xml:base="https://swanky.github.io/technical/ai-agent-a2a-mcp/"><![CDATA[<p>隨著生成式 AI 應用不斷擴展，單一模型已無法應對所有複雜任務。未來的方向是「多代理協作」——讓 AI Agents 更聰明、分工更清楚、協作更無縫。</p>

<p>本文解析兩個關鍵協議：</p>

<h3 id="a2aagent2agent">A2A（Agent2Agent）</h3>

<p>Google 提出的 A2A 協議，讓不同組織、框架下的 AI Agents 能彼此對話、交換訊息與成果。</p>

<p>舉例來說，客服代理人可以將查詢委派給報表分析代理人，再將結果回傳給用戶。這種跨代理人的協作，大幅提升了系統處理複雜任務的能力。</p>

<h3 id="mcpmodel-context-protocol">MCP（Model Context Protocol）</h3>

<p>Anthropic 提出的 MCP 協議，讓 AI 模型能安全地連接企業系統、API、資料庫與第三方工具。</p>

<p>例如，開發代理人可以直接存取 GitHub 儲存庫或 PostgreSQL 資料庫，透過標準化的協議進行安全的資料交換。</p>

<h3 id="兩者的互補關係">兩者的互補關係</h3>

<ul>
  <li><strong>A2A</strong> 解決的是「Agent 與 Agent 之間的溝通」——橫向協作</li>
  <li><strong>MCP</strong> 解決的是「Agent 與工具/資料之間的連接」——縱向整合</li>
</ul>

<p>當兩者結合，我們得到的是一個完整的多代理人生態系統：Agent 之間可以互相委派任務（A2A），每個 Agent 又能透過標準化介面存取所需的工具與資料（MCP）。</p>

<h3 id="對企業的意義">對企業的意義</h3>

<p>這代表未來的企業 AI 架構不再是「一個大模型做所有事」，而是：</p>

<ol>
  <li><strong>專業化代理人：</strong> 每個 Agent 專注於特定領域（客服、分析、開發等）</li>
  <li><strong>標準化介面：</strong> 透過 A2A 和 MCP，不同供應商的 Agent 可以無縫協作</li>
  <li><strong>漸進式部署：</strong> 企業可以逐步引入不同的 Agent，而非一次性替換整個系統</li>
</ol>

<p>多代理協作的時代正在到來。掌握這些協議的運作邏輯，將是企業 AI 策略的關鍵一步。</p>]]></content><author><name></name></author><category term="technical" /><category term="claude-code" /><summary type="html"><![CDATA[解析 Google A2A 與 Anthropic MCP 兩大協議如何讓 AI Agent 跨組織協作，建構多代理人系統的未來。]]></summary></entry><entry><title type="html">ChatGPT 4o 圖像革命：吉卜力重繪、CloneX IP，以及那些我曾經費盡苦心做到的事</title><link href="https://swanky.github.io/claude-code/chatgpt-4o-ghibli-clonex/" rel="alternate" type="text/html" title="ChatGPT 4o 圖像革命：吉卜力重繪、CloneX IP，以及那些我曾經費盡苦心做到的事" /><published>2025-03-27T12:00:00+00:00</published><updated>2025-03-27T12:00:00+00:00</updated><id>https://swanky.github.io/claude-code/chatgpt-4o-ghibli-clonex</id><content type="html" xml:base="https://swanky.github.io/claude-code/chatgpt-4o-ghibli-clonex/"><![CDATA[<h2 id="指令以吉卜力動畫風格重畫這張圖片">指令：「以吉卜力動畫風格重畫這張圖片」</h2>

<p>2025 年 3 月，ChatGPT 4o 推出了圖像生成功能。</p>

<p>我做了一個大多數人都做的實驗：找一張照片，下指令「以吉卜力動畫風格重畫這張圖片」。</p>

<p>結果，令人驚豔。</p>

<p><img src="/assets/facebook-archive/photos/2025-03-27_1201814241953374_1.jpg" alt="ChatGPT 4o 吉卜力風格重繪" /></p>

<p><img src="/assets/facebook-archive/photos/2025-03-27_1201814241953374_2.jpg" alt="ChatGPT 4o 吉卜力風格重繪" /></p>

<p>不是說吉卜力風格本身有多特別——它在 AI 圖像社群裡已經被玩了很多次。讓我驚訝的是<strong>執行的門檻</strong>：過去需要調教模型、寫複雜 prompt、反覆迭代才能做到的效果，現在一句話就完成了。</p>

<p>而且是在 ChatGPT 的對話框裡，不需要安裝任何東西。</p>

<h2 id="我曾經費盡苦心做到的事">我曾經費盡苦心做到的事</h2>

<p>看著這個，我想起了幾年前的自己。</p>

<p>2022 年底，我組了一個 CloneX 制服女孩的社群（UCX，Uniform CloneX），想把這些虛擬角色發展成 IP。</p>

<p>那時候，我的工作流程是：</p>
<ol>
  <li>研究 <strong>Blender</strong>，自己生成 3D 場景</li>
  <li>委託繪師畫 CloneX 角色的 2D 衍生圖</li>
  <li>把這些圖上鏈，發行 NFT</li>
</ol>

<p>每一步都費時費力。Blender 的學習曲線很陡，繪師的委託需要溝通與等待，NFT 的發行有技術門檻。</p>

<p>現在，ChatGPT 4o 可以直接拿 CloneX 截圖，生成各種風格的衍生圖——而且品質比當年做的好得多。</p>

<p><img src="/assets/facebook-archive/photos/2025-03-28_1202891541845644_1.jpg" alt="ChatGPT 4o 與 CloneX IP 開發" /></p>

<p><img src="/assets/facebook-archive/photos/2025-03-28_1202891541845644_2.jpg" alt="ChatGPT 4o 與 CloneX IP 開發" /></p>

<h2 id="創作者的角色正在改變">創作者的角色正在改變</h2>

<p>這讓我思考一個問題：<strong>創作者的核心價值，到底是「執行」還是「判斷」？</strong></p>

<p>過去，攝影師的門檻是技術（相機、光線、後製）。後來手機普及了，技術門檻降低，「眼光」與「選題」變得更重要。</p>

<p>現在，AI 圖像工具讓生成的門檻趨近於零。那麼，創作者剩下什麼？</p>

<p>我認為剩下的是：</p>

<ul>
  <li><strong>概念</strong>：為什麼要做這個？想說什麼故事？</li>
  <li><strong>策展</strong>：從大量生成物中，選出那個「對的」</li>
  <li><strong>連結</strong>：與真實的人、真實的故事、真實的社群的連結</li>
</ul>

<p>這不是悲觀的觀點。是一個提醒：<strong>工具進化的速度快過你的想像，但工具永遠替代不了你決定做什麼。</strong></p>

<h2 id="給還在猶豫的人">給還在猶豫的人</h2>

<p>如果你還沒試過 ChatGPT 4o 的圖像功能，現在就可以試。</p>

<p>找一張你的照片，下一個風格指令，看看結果。不是要你放棄原本的創作方式，而是讓你理解這個工具的邊界在哪——然後決定它能幫你做什麼。</p>

<hr />

<p><strong>相關 Facebook 貼文</strong>：</p>
<ul>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid0mvQ5suJ3mRGeBFmK43zEYoH6ENPrHkCbnQxpLghnrTfg47je4cb4yNGSdLVQpTWYl">2025-03-27 原文</a>（35 讚）</li>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid0F1ViwUAttCrYLLfxCfTGyhMZUrHK99Mcc2YW59qFo2kW5Z3RWMq7q39sYDXrsnbgl">2025-03-28 原文</a>（4 讚）</li>
</ul>]]></content><author><name></name></author><category term="claude-code" /><summary type="html"><![CDATA[當 ChatGPT 4o 能用一句話重繪圖片，我想起了過去研究 Blender、找繪師、發行 NFT 的那段日子——以及這一切對創作者意味著什麼。]]></summary></entry><entry><title type="html">AI 生圖的視覺疲勞，以及攝影還剩下什麼</title><link href="https://swanky.github.io/claude-code/ai-visual-fatigue-photography-authenticity/" rel="alternate" type="text/html" title="AI 生圖的視覺疲勞，以及攝影還剩下什麼" /><published>2023-03-02T12:00:00+00:00</published><updated>2023-03-02T12:00:00+00:00</updated><id>https://swanky.github.io/claude-code/ai-visual-fatigue-photography-authenticity</id><content type="html" xml:base="https://swanky.github.io/claude-code/ai-visual-fatigue-photography-authenticity/"><![CDATA[<h2 id="視覺疲勞">視覺疲勞</h2>

<p>2023 年 3 月初，距離開始玩 Stable Diffusion 大概過了三週。</p>

<p>貼了這樣一句話：</p>

<blockquote>
  <p>看太多 AI 生成的照片後，覺得有點視覺疲勞了。</p>

  <p>「真正重要的東西，用眼睛是看不見的」</p>
</blockquote>

<p>配上一張真實拍攝的制服女孩照片。</p>

<p><img src="/assets/facebook-archive/photos/2023-03-02_642589511209186_0.jpg" alt="真實拍攝的制服女孩" /></p>

<p>那張照片沒有 AI 生圖的那種「完美」，光線不是最理想的，但那個女孩笑得很自然，那個瞬間很真實。</p>

<h2 id="為什麼會視覺疲勞">為什麼會視覺疲勞？</h2>

<p>AI 生成圖像有一個特點：它非常「悅目」。</p>

<p>高對比、完美的臉部比例、乾淨的背景、理想化的光線——這些都是在大量訓練資料中被強化的視覺偏好。</p>

<p>問題是，當每一張圖都是「最佳化的悅目」，你的眼睛很快就不知道該停在哪裡了。</p>

<p>這讓我想到攝影史上的一個辯論：<strong>完美的照片，是不是好的照片？</strong></p>

<p>紀實攝影的價值，往往來自它的「不完美」——那個失焦的瞬間、那個尷尬的表情，正是它捕捉到了真實。</p>

<h2 id="攝影在-ai-時代還剩下什麼">攝影在 AI 時代還剩下什麼</h2>

<p>不打算給出「攝影將死」或「攝影永生」這樣的廉價結論。</p>

<p>但攝影在 AI 時代的核心價值，我認為在於：</p>

<p><strong>1. 真實性的證明</strong></p>

<p>一張真實拍攝的照片，是一個時刻存在過的證明。AI 生成的圖無論多完美，都是從統計分佈中採樣的「可能性」，不是「發生過的事實」。</p>

<p><strong>2. 關係的記錄</strong></p>

<p>拍攝的過程，是攝影師與被攝者之間的關係。那種信任、那種溝通、那個「你準備好了嗎？」的瞬間——這些都不在最終的圖像裡，但它們構成了那張照片存在的理由。</p>

<p><strong>3. 選擇的美學</strong></p>

<p>AI 生成可以產生無限的「還不錯的圖」，但攝影師的眼光，是在真實場景的有限條件下，做出那個獨特的選擇。</p>

<h2 id="小王子說的那句話">小王子說的那句話</h2>

<p>「真正重要的東西，用眼睛是看不見的。」</p>

<p>這不是在說 AI 生圖不重要。而是在提醒自己，不要因為 AI 能生成「視覺上好看的圖」，就以為它能替代攝影所代表的那種<strong>意義的記錄</strong>。</p>

<p>工具會一直進化。但那個問「這個瞬間值得被記錄嗎？」的人，還是你。</p>

<hr />

<p><strong>相關 Facebook 貼文</strong>：</p>
<ul>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid02py6iMMv8bTEoWx3yeEW38grLV18G82gHTN8PuRBCnQY5DGkZU4NS9EEFswc6uizfl">2023-03-02 原文</a>（131 讚）</li>
  <li><a href="/claude-code/stable-diffusion-photography-experiment/">延伸閱讀：Stable Diffusion 四週實驗筆記</a></li>
</ul>]]></content><author><name></name></author><category term="claude-code" /><summary type="html"><![CDATA[玩了一個月 Stable Diffusion 之後，我開始對 AI 生圖感到視覺疲勞。這篇是那段時間的誠實反思：攝影在 AI 時代還剩下什麼？]]></summary></entry><entry><title type="html">攝影師的 AI 生圖實驗——從「假裝學電繪」到 Stable Diffusion 四週筆記</title><link href="https://swanky.github.io/claude-code/stable-diffusion-photography-experiment/" rel="alternate" type="text/html" title="攝影師的 AI 生圖實驗——從「假裝學電繪」到 Stable Diffusion 四週筆記" /><published>2023-02-14T12:00:00+00:00</published><updated>2023-02-14T12:00:00+00:00</updated><id>https://swanky.github.io/claude-code/stable-diffusion-photography-experiment</id><content type="html" xml:base="https://swanky.github.io/claude-code/stable-diffusion-photography-experiment/"><![CDATA[<h2 id="第一週假裝在學電繪">第一週：假裝在學電繪</h2>

<p>2023 年初，我在 Facebook 貼了一句話：「最近開始學電繪～（好啦其實是 AI 生圖）」</p>

<p>那篇貼文獲得了 356 個讚——是我攝影作品的好幾倍。</p>

<p>老實說，看到這個數字，我的第一反應是有點複雜。十幾年的攝影功力，敵不過一個 prompt？</p>

<p>但仔細想想，那些讚按的是什麼？是「驚訝」，是「這個攝影師居然在玩這個」，也是一種時代的集體共鳴——2023 年初，正是 Stable Diffusion 和 Midjourney 讓所有人開始重新思考「圖像是什麼、誰可以創造圖像」的時刻。</p>

<p><img src="/assets/facebook-archive/photos/2023-02-14_629017969233007_1.jpg" alt="AI 生圖實驗第一週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-14_629017969233007_2.jpg" alt="AI 生圖實驗第一週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-14_629017969233007_3.jpg" alt="AI 生圖實驗第一週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-14_629017969233007_4.jpg" alt="AI 生圖實驗第一週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-14_629017969233007_5.jpg" alt="AI 生圖實驗第一週" /></p>

<h2 id="第二週效果太好開始認真研究">第二週：效果太好，開始認真研究</h2>

<p>隔天我又貼了一篇，標題大概是：「昨天貼文的效果太好，讓我覺得以後是不是用生成的圖來騙讚也不錯，反正跟我的攝影差不多也是從一堆照片中選來貼。」</p>

<p>這是半開玩笑，但也是真心話。</p>

<p><strong>攝影的本質</strong>，從選景、打光、指導模特兒、後製，到最後從幾百張中挑出那一張——其實是一個持續的「篩選與判斷」過程。AI 生圖改變的只是輸入端（從快門變成 prompt），輸出端的美學判斷，仍然是人在做。</p>

<p>第二週，我開始系統性地研究 Stable Diffusion 的工作流程。</p>

<p><img src="/assets/facebook-archive/photos/2023-02-15_630136942454443_1.jpg" alt="AI 生圖實驗第二週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-15_630136942454443_2.jpg" alt="AI 生圖實驗第二週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-15_630136942454443_3.jpg" alt="AI 生圖實驗第二週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-15_630136942454443_4.jpg" alt="AI 生圖實驗第二週" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-15_630136942454443_5.jpg" alt="AI 生圖實驗第二週" /></p>

<h2 id="第三週stable-diffusion--模型組合">第三週：Stable Diffusion + 模型組合</h2>

<p>2023-02-20 的實驗組合：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Stable Diffusion + ChilloutMix + Korean Doll Likeness + Taiwan Doll Likeness + Ulzzang-6500
</code></pre></div></div>

<p>那時還不太懂模型組合的原理，但效果已經很驚人。</p>

<p>幾個心得：</p>

<ul>
  <li><strong>LoRA 模型</strong>讓 Stable Diffusion 可以針對特定風格或臉型進行微調</li>
  <li><strong>ChilloutMix</strong> 是當時流行的亞洲臉孔基礎模型</li>
  <li><strong>提示詞工程（Prompt Engineering）</strong>和攝影的「場景設定」有驚人的相似之處——你要告訴 AI 光線、角度、情緒、服裝，就像在現場指導一場拍攝</li>
</ul>

<p><img src="/assets/facebook-archive/photos/2023-02-20_634292428705561_1.jpg" alt="Stable Diffusion 模型組合實驗" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-20_634292428705561_2.jpg" alt="Stable Diffusion 模型組合實驗" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-20_634292428705561_3.jpg" alt="Stable Diffusion 模型組合實驗" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-20_634292428705561_4.jpg" alt="Stable Diffusion 模型組合實驗" /></p>

<p><img src="/assets/facebook-archive/photos/2023-02-20_634292428705561_5.jpg" alt="Stable Diffusion 模型組合實驗" /></p>

<h2 id="第四週九頭身美少女與視覺疲勞">第四週：九頭身美少女與視覺疲勞</h2>

<p>到了三月，試了一個容易產生「九頭身美少女」的模型，又是一批高讚圖。</p>

<p>但同時，也開始覺得有點視覺疲勞。</p>

<p>那時貼了一句引用小王子的話：「真正重要的東西，用眼睛是看不見的」，配上一張真實拍攝的制服女孩照片。</p>

<p>這不是在否定 AI，而是在提醒自己——</p>

<p><strong>攝影的價值，不只是最終的那張圖像，而是拍攝當下的連結、信任、與那個無法複製的瞬間。</strong></p>

<h2 id="結語攝影師怎麼看-ai-生圖">結語：攝影師怎麼看 AI 生圖</h2>

<p>玩了一個月之後，我的結論不是「AI 會取代攝影師」，也不是「AI 生圖不算藝術」。</p>

<p>而是：<strong>兩者根本在回答不同的問題。</strong></p>

<p>AI 生圖回答的是：「我可以視覺化什麼樣的想像？」</p>

<p>攝影回答的是：「這個真實的人，在這個真實的瞬間，有什麼值得記錄？」</p>

<p>當然，這兩個問題的邊界正在模糊——用 AI 協助概念設計、用攝影捕捉真實執行的成果，或許才是接下來的創作方式。</p>

<hr />

<p><strong>相關 Facebook 貼文</strong>：</p>
<ul>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid02hNsdheDiBKX7gzmFSRHD8byVp4Ym3WkKuXK8LhC49Dbf3XbWZ7UXo2CQPt37ur3Tl">2023-02-14 原文</a>（356 讚）</li>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid02NQoMGw8nsP7exuV9H9JrSDF23JVGBAoVZ9xrxZZapNC4nM6zUxVXDMVV99MC4qT9l">2023-02-15 原文</a>（273 讚）</li>
</ul>]]></content><author><name></name></author><category term="claude-code" /><summary type="html"><![CDATA[一個拍了十幾年制服女孩的攝影師，在 2023 年初認真玩了一個月 Stable Diffusion。這是那段時間的實驗筆記與反思。]]></summary></entry><entry><title type="html">UCX 的誕生：一個攝影師如何在 Web3 世界創建制服女孩社群</title><link href="https://swanky.github.io/technical/ucx-uniform-clonex-origin/" rel="alternate" type="text/html" title="UCX 的誕生：一個攝影師如何在 Web3 世界創建制服女孩社群" /><published>2022-12-15T12:00:00+00:00</published><updated>2022-12-15T12:00:00+00:00</updated><id>https://swanky.github.io/technical/ucx-uniform-clonex-origin</id><content type="html" xml:base="https://swanky.github.io/technical/ucx-uniform-clonex-origin/"><![CDATA[<h2 id="起點制服女孩遇上-nft">起點：制服女孩遇上 NFT</h2>

<p>2021 年 7 月，我在 OurSong 平台發行了第一個制服女孩 NFT——以模特兒張小筑的作品為主，限量 13 張，售價 $8.8 USD。</p>

<p>發行前，我在 Facebook 寫道：「可以錯過初戀，但不能錯過制服女孩！」</p>

<p>那篇貼文拿到了 355 個讚，是當時互動最高的幾篇之一。</p>

<p>但更重要的是，那次嘗試讓我開始認真思考：<strong>攝影作品作為數位資產，在 Web3 世界有什麼可能性？</strong></p>

<h2 id="clonex-的出現">CloneX 的出現</h2>

<p>2022 年，我開始接觸 RTFKT 旗下的 CloneX NFT 計畫。</p>

<p>CloneX 的核心概念是：每一個 NFT 是一個可穿戴、可在虛擬世界中使用的 3D 虛擬人物。它不只是「一張圖」，而是一個具有 IP 潛力的虛擬身份。</p>

<p>作為一個拍過無數制服女孩的攝影師，我看到了一個有趣的交叉點：<strong>如果把制服的美學，移植到 CloneX 的虛擬人物上，會發生什麼？</strong></p>

<p>這個想法，就是 UCX（Uniform CloneX）的起點。</p>

<h2 id="第一次線下聚從虛擬到真實">第一次線下聚：從虛擬到真實</h2>

<p>2022 年 9 月，CloneX Taiwan 舉辦了第一次線下聚會。</p>

<p>我去了，認識了一群「克隆家人」——在虛擬世界裡持有相同 NFT 系列的人，在真實世界裡第一次見面。</p>

<p>那種體驗很奇特：你們沒有通過傳統的社交管道認識，卻因為一個共同的數位資產而聚在一起。這是 Web3 社群的特有連結方式。</p>

<h2 id="ucx-出道2022-12-15">UCX 出道：2022-12-15</h2>

<p>2022 年 12 月，CloneX 第二次線下聚會。</p>

<p>這次，UCX 正式出道。</p>

<p><img src="/assets/facebook-archive/photos/2022-12-15_576144351187036_1.jpg" alt="UCX 出道日" /></p>

<p><img src="/assets/facebook-archive/photos/2022-12-15_576144351187036_2.jpg" alt="UCX 出道日" /></p>

<p><img src="/assets/facebook-archive/photos/2022-12-15_576144351187036_3.jpg" alt="UCX 出道日" /></p>

<p><img src="/assets/facebook-archive/photos/2022-12-15_576144351187036_4.jpg" alt="UCX 出道日" /></p>

<p><img src="/assets/facebook-archive/photos/2022-12-15_576144351187036_5.jpg" alt="UCX 出道日" /></p>

<p>展位、UCX 的識別視覺、第一批成員的集合——這是一個很小的開始，但對我來說意義重大。</p>

<p>那天，還有朋友 cosplay 成她的 CloneX 角色來參加。那個畫面，讓我覺得：<strong>虛擬 IP 和真實人物之間的距離，並不像想象中那麼遠。</strong></p>

<h2 id="從攝影師到社群建立者">從攝影師到社群建立者</h2>

<p>這段經歷讓我學到的，不只是 Web3 的技術面（錢包、NFT 合約、二級市場），而是：</p>

<p><strong>1. 社群是 IP 的護城河</strong></p>

<p>制服女孩從來不只是我的攝影作品，而是一個有真實粉絲、有情感連結的題材。把這個社群引入 Web3，比從零開始建立一個 NFT 計畫容易得多。</p>

<p><strong>2. 線下連結依然重要</strong></p>

<p>Web3 社群的黏性，在線下聚會的那一刻才真正形成。虛擬資產創造相遇的理由，但真實的信任需要真實的接觸。</p>

<p><strong>3. 跨域是策略，不是偶然</strong></p>

<p>攝影、技術、Web3——這些看起來無關的背景，在 UCX 這個計畫裡都派上用場。「多才多藝」不是分心，是不同語言的翻譯能力。</p>

<h2 id="後記">後記</h2>

<p>UCX 後來的發展，受到了整個 Web3 市場的週期影響。2022 年底的加密寒冬，讓很多計畫停滯。</p>

<p>但那段時間建立的連結——那些克隆家人、那些懂制服美學也懂 NFT 的人——依然是真實的。</p>

<p>有些計畫不是失敗，只是在等待下一個時機。</p>

<hr />

<p><strong>相關連結</strong>：</p>
<ul>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid0rZPAHqZrW3hqdwsCqgtKzjmqw79rRhy3vxmWYX7gvUkrsYHEpCJrAhdUqV4YDZaGl">UCX 出道貼文（2022-12-15）</a></li>
  <li><a href="/technical/uniform-girls-nft-debut/">延伸閱讀：制服女孩踏入 NFT 的第一步</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[從 2021 年的第一個制服女孩 NFT，到 2022 年底 UCX（Uniform CloneX）社群正式出道——這是一段用 Web3 工具實踐攝影 IP 的真實紀錄。]]></summary></entry><entry><title type="html">制服女孩上鏈：攝影作品踏入 NFT 世界的第一步</title><link href="https://swanky.github.io/technical/uniform-girls-nft-debut/" rel="alternate" type="text/html" title="制服女孩上鏈：攝影作品踏入 NFT 世界的第一步" /><published>2021-07-17T04:00:00+00:00</published><updated>2021-07-17T04:00:00+00:00</updated><id>https://swanky.github.io/technical/uniform-girls-nft-debut</id><content type="html" xml:base="https://swanky.github.io/technical/uniform-girls-nft-debut/"><![CDATA[<h2 id="為什麼要把攝影作品做成-nft">為什麼要把攝影作品做成 NFT？</h2>

<blockquote>
  <p><strong>2026 更新：</strong>OurSong 後來停止服務，當年的創作者頁面與購買入口已不再適合作為作品入口。這篇文章保留 2021 年的實驗脈絡，同時補上平台退場後真正留下的教訓。當時發行的圖片，目前整理在 <a href="/nft/oursong.html">Swanky NFT 作品頁</a> 與 <a href="https://www.pinterest.com/swanbear/swanky-nft-oursong/">Pinterest 作品存檔</a>；我的 CloneX 收藏與後續創作則集中在 <a href="/nft/">Swanky NFT mini-site</a>。</p>
</blockquote>

<p>2021 年中，NFT 的話題已經鋪天蓋地。</p>

<p>作為一個拍了十幾年制服女孩、也在區塊鏈產業工作多年的人，我同時處在兩個世界——攝影圈和 Web3 圈。</p>

<p>大多數攝影師對 NFT 的態度是：「這跟我有什麼關係？」</p>

<p>我的態度是：<strong>我應該親自試試看。</strong></p>

<p>不是為了投機，也不是為了跟風，而是因為我想搞清楚：攝影作品作為數位資產，在這套機制下到底有什麼可能性？</p>

<h2 id="oursong-與第一批作品">OurSong 與第一批作品</h2>

<p>我選擇了台灣本地的 NFT 平台 OurSong。</p>

<p>原因很實際：界面對創作者友善，中文社群有一定基礎，適合作為第一次實驗。</p>

<p>現在回頭看，這也是第一個很具體的風險提醒：<strong>創作者可以發行 NFT，卻不能把作品的長期保存全部交給單一平台。</strong>平台停止服務之後，原本方便的展示頁、社群關係與交易入口也可能一起消失。</p>

<figure>
  <a href="/nft/oursong.html">
    <img src="/nft/assets/images/NFT_pics_800.jpg" alt="2021 年制服女孩與加密女孩 NFT 作品選集" loading="lazy" />
  </a>
  <figcaption>2021 年發行的制服女孩與加密女孩 NFT 選集；點圖可前往站內作品存檔。</figcaption>
</figure>

<p>第一批作品以模特兒<strong>張小筑</strong>的制服女孩系列為主：</p>

<ul>
  <li><strong>限量 13 張</strong>，建議售價 $8.8 USD</li>
  <li>持有者可解鎖完整尺寸圖片，以及不定期的制服女孩內容</li>
  <li>銷售收益：模特兒分得一半，另一半用於未來拍攝製作</li>
</ul>

<p>這個分潤結構，是我認為對創作者和被攝者都公平的設計。攝影不只是攝影師的作品，也是模特兒的貢獻。</p>

<h2 id="發行之後">發行之後</h2>

<p>那篇發行貼文拿到了 355 個讚。</p>

<p>但更重要的不是讚數，而是那次實驗讓我真正理解了：</p>

<p><strong>NFT 最值得研究的，不是短期價格，而是數位作品如何留下可驗證、可轉讓的紀錄。</strong></p>

<p>但這句話現在需要說得更精確。</p>

<p>把照片鑄造成 NFT，不會讓圖片檔本身停止被複製，也不代表收藏者自動取得著作權。鏈上真正記錄的是代幣、持有地址與交易歷史；收藏者得到哪些展示或使用權利，仍取決於發行條款。</p>

<p>二級市場版稅也是一樣。2021 年時，市場常把「每次轉手都能持續分潤」講得像必然結果；後來的實務證明，版稅是否執行仍受到合約、交易市場與平台規則影響，不能直接視為保證收入。</p>

<p>OurSong 的退場又補上更現實的一課：<strong>代幣在鏈上，不等於展示頁、圖片來源與使用體驗會永久存在。</strong>因此我後來把能公開保存的作品整理回自己的網站，也另外留下一份 Pinterest 視覺存檔。</p>

<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1rem;margin:2rem 0;">
  <figure style="margin:0;">
    <a href="https://www.pinterest.com/swanbear/swanky-nft-oursong/" target="_blank" rel="noopener noreferrer">
      <img src="/nft/assets/images/NFT_pics_ruru_800.jpg" alt="制服女孩攝影與 Pixel RuRu 像素插畫合作作品" loading="lazy" style="width:100%;height:auto;" />
    </a>
    <figcaption>制服女孩攝影與 Pixel RuRu 的像素插畫合作。</figcaption>
  </figure>
  <figure style="margin:0;">
    <a href="https://www.pinterest.com/swanbear/swanky-nft-oursong/" target="_blank" rel="noopener noreferrer">
      <img src="/nft/assets/images/NFT_pics_ty_800.jpg" alt="制服女孩攝影與 TY 黑白插畫合作作品" loading="lazy" style="width:100%;height:auto;" />
    </a>
    <figcaption>制服女孩攝影與 TY 的黑白插畫合作。</figcaption>
  </figure>
</div>

<h2 id="學到的事">學到的事</h2>

<p><strong>技術面</strong>：</p>
<ul>
  <li>鑄造（Mint）的流程比想像中簡單，但 gas fee 的時機需要研究</li>
  <li>選擇平台很重要：不同平台的受眾和定位差異很大</li>
  <li>作品的稀缺性設計（限量多少）直接影響市場反應</li>
  <li>鏈上紀錄、圖片保存與展示網站是三件不同的事，不能只備份其中一層</li>
</ul>

<p><strong>策略面</strong>：</p>
<ul>
  <li>現有的粉絲基礎，是 NFT 銷售最重要的起點</li>
  <li>攝影 NFT 的買家，往往不只是在買「一張圖」，而是在買「與創作者的連結」</li>
  <li>分潤機制可以強化創作者的道德立場，也更容易獲得合作者的信任</li>
  <li>平台帶來的是暫時的流量與工具；作品入口、收藏者關係與原始檔案，仍應掌握在創作者自己手上</li>
</ul>

<p><strong>人性面</strong>：</p>
<ul>
  <li>NFT 的炒作性讓很多人失望，但底層的技術概念是真實的</li>
  <li>重要的是：你自己相信這個作品值得被珍藏，再去做發行</li>
</ul>

<h2 id="那之後">那之後</h2>

<p>2021 年的這次實驗，是後來 UCX 社群誕生的種子。</p>

<p>把攝影美學帶進 Web3，不是發完一批 NFT 就算完成。OurSong 關站之後，當年的市場熱度退掉了，但作品、合作經驗與後來發展出的 UCX／Uniform CloneX 仍然留下來。</p>

<p>這也是我現在看 NFT 專案時更在意的問題：平台不在了，還剩下什麼？</p>

<p>我的答案不是假裝一切都永久，而是把能掌握的部分重新收回來：作品放回自己的網站、視覺存檔保留在 Pinterest、鏈上收藏另外整理成可持續維護的展示頁。</p>

<hr />

<p><strong>相關連結</strong>：</p>
<ul>
  <li><a href="https://www.facebook.com/SwankyParty/posts/pfbid06hsxmhnnmpmrBWtPwcwcbbfny7e4WoSKciStRr2AKPk1w6ZzrLUoyteoFHSyuvF6l">2021-07-17 Facebook 原文</a>（355 讚）</li>
  <li><a href="/nft/oursong.html">站內作品存檔：制服女孩 NFT 系列</a></li>
  <li><a href="https://www.pinterest.com/swanbear/swanky-nft-oursong/">Pinterest：Swanky NFT @ OurSong（39 件作品）</a></li>
  <li><a href="/nft/">Swanky NFT mini-site：作品與鏈上 CloneX 收藏</a></li>
  <li><a href="/technical/ucx-uniform-clonex-origin/">延伸閱讀：UCX 制服 CloneX 社群的誕生</a></li>
</ul>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[2021 年，我在 OurSong 發行第一批制服女孩 NFT。平台後來停止服務，這篇更新記錄當年的實驗、後續修正，以及目前仍可瀏覽的作品存檔。]]></summary></entry><entry><title type="html">制服女孩騎 UBike</title><link href="https://swanky.github.io/photography/ubike-uniform-girl/" rel="alternate" type="text/html" title="制服女孩騎 UBike" /><published>2020-03-08T04:00:00+00:00</published><updated>2020-03-08T04:00:00+00:00</updated><id>https://swanky.github.io/photography/ubike-uniform-girl</id><content type="html" xml:base="https://swanky.github.io/photography/ubike-uniform-girl/"><![CDATA[<p>台北的 UBike 已經成為街景的一部分。</p>

<p>這天，我拍到了這張——制服、單車、春日光線，三者剛好疊在一起的瞬間。</p>

<p><img src="/assets/facebook-archive/photos/2020-03-08_10160006143465329_0.jpg" alt="制服女孩騎 UBike" /></p>

<p>不需要特別佈景，街頭本身就是最好的舞台。</p>

<hr />

<p><em>2020-03-08 · 原發布於 Facebook，獲得 199 個讚</em></p>]]></content><author><name></name></author><category term="photography" /><summary type="html"><![CDATA[2020 年春天，台北街頭，制服女孩與 YouBike 的一幀快照。]]></summary></entry><entry><title type="html">讀 Head First Agile 的區塊鏈工程師</title><link href="https://swanky.github.io/photography/agile-blockchain-engineer/" rel="alternate" type="text/html" title="讀 Head First Agile 的區塊鏈工程師" /><published>2019-07-09T04:00:00+00:00</published><updated>2019-07-09T04:00:00+00:00</updated><id>https://swanky.github.io/photography/agile-blockchain-engineer</id><content type="html" xml:base="https://swanky.github.io/photography/agile-blockchain-engineer/"><![CDATA[<p>那年我剛從 Java 工程師的身份全面投入區塊鏈開發，同時也在研究敏捷方法。</p>

<p><em>Head First Agile</em> 放在手邊，是當時每天都在翻的書。</p>

<p>有天我想：如果把制服女孩和這本書放在一起拍，會是什麼感覺？</p>

<p><img src="/assets/facebook-archive/photos/2019-07-09_10159101519745329_0.jpg" alt="讀 Head First Agile 的區塊鏈工程師" /></p>

<p><strong>MD：李婷婷</strong></p>

<p>攝影圈和技術圈，兩個世界的交集，有時候就是這樣一張照片。</p>

<hr />

<p><em>2019-07-09 · 原發布於 Facebook，獲得 181 個讚</em></p>]]></content><author><name></name></author><category term="photography" /><summary type="html"><![CDATA[工程師、技術書、制服——三個意象的意外組合。模特兒李婷婷。]]></summary></entry><entry><title type="html">制服女孩嫺嫺</title><link href="https://swanky.github.io/photography/uniform-girl-hsianhs/" rel="alternate" type="text/html" title="制服女孩嫺嫺" /><published>2018-08-18T04:00:00+00:00</published><updated>2018-08-18T04:00:00+00:00</updated><id>https://swanky.github.io/photography/uniform-girl-hsianhs</id><content type="html" xml:base="https://swanky.github.io/photography/uniform-girl-hsianhs/"><![CDATA[<p>有些照片，拍完之後會先放著。</p>

<p>不是因為不好，而是當下沒找到合適的節奏去處理它。這張嫺嫺的照片就是如此——拍攝之後放了一段時間，某天重新打開，才覺得時機到了。</p>

<p><img src="/assets/facebook-archive/photos/2018-08-18_10158075093130329_0.jpg" alt="制服女孩嫺嫺" /></p>

<p><strong>MD：嫺嫺</strong></p>

<p>修圖本身也是創作的一部分。同一張 RAW，今天修和半年後修，結果會不一樣。</p>

<hr />

<p><em>2018-08-18 · 原發布於 Facebook，獲得 164 個讚</em></p>]]></content><author><name></name></author><category term="photography" /><summary type="html"><![CDATA[一張修了許久、塵封在硬碟裡的制服女孩照片。模特兒嫺嫺。]]></summary></entry><entry><title type="html">劉家靜╳史旺基「＠Studio」</title><link href="https://swanky.github.io/photography/at-studio/" rel="alternate" type="text/html" title="劉家靜╳史旺基「＠Studio」" /><published>2016-03-10T11:23:49+00:00</published><updated>2016-03-10T11:23:49+00:00</updated><id>https://swanky.github.io/photography/at-studio</id><content type="html" xml:base="https://swanky.github.io/photography/at-studio/"><![CDATA[<p><img src="/assets/img/old/2016-03-10/img_00001.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00002.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00003.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00004.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00005.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00006.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00007.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00008.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00009.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00010.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00011.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00012.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00013.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00014.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00015.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00016.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00017.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00018.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00019.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00020.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00021.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00022.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00023.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00024.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00025.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00026.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00027.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00028.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00029.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00030.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00031.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>

<p><img src="/assets/img/old/2016-03-10/img_00032.jpg" class="img-fluid d-block mx-auto" alt="劉家靜╳史旺基 ＠Studio"></p>]]></content><author><name></name></author><category term="photography" /><summary type="html"><![CDATA[劉家靜╳史旺基「＠Studio」攝影作品]]></summary></entry><entry><title type="html">宇彤╳史旺基「unicorn wears uniform」</title><link href="https://swanky.github.io/photography/unicorn-wears-uniform/" rel="alternate" type="text/html" title="宇彤╳史旺基「unicorn wears uniform」" /><published>2016-02-10T06:13:09+00:00</published><updated>2016-02-10T06:13:09+00:00</updated><id>https://swanky.github.io/photography/unicorn-wears-uniform</id><content type="html" xml:base="https://swanky.github.io/photography/unicorn-wears-uniform/"><![CDATA[<p><img src="/assets/img/old/2016-02-10/img_00001.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00002.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00003.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00004.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00005.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00006.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00007.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00008.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00009.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00010.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00011.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00012.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00013.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00014.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00015.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00016.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00017.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00018.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00019.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00020.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00021.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00022.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00023.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00024.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00025.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00026.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00027.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00028.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00029.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00030.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00031.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00032.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00033.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00034.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00035.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00036.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00037.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00038.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00039.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00040.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00041.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00042.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00043.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00044.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00045.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00046.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00047.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00048.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00049.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00050.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00051.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00052.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00053.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00054.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00055.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00056.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00057.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00058.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00059.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00060.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00061.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00062.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>

<p><img src="/assets/img/old/2016-02-10/img_00063.jpg" class="img-fluid d-block mx-auto" alt="宇彤╳史旺基 unicorn wears uniform"></p>]]></content><author><name></name></author><category term="photography" /><summary type="html"><![CDATA[宇彤╳史旺基「unicorn wears uniform」攝影作品]]></summary></entry></feed>