Claude Code 為什麼有效:模型無狀態,狀態在執行環境

Claude Code 有效,是因為模型無狀態,狀態由 harness 組裝:工具 schema、系統提示、CLAUDE.md、skills 與權限。客製的是執行環境;開發重心轉向意圖表達與驗證審查,而非背誦神奇 prompt。

無狀態模型與組裝上下文的 harness 迴圈抽象示意

很多人把 Claude Code 想成「會寫程式的 Claude」。這不夠準。更精確的說法是:

模型仍然無狀態;Claude Code 是把檔案、對話、設定與權限組裝成請求、並執行工具的 harness(執行環境)。
你真正客製的,不是模型的記憶,而是每一次呼叫被餵進去的狀態與約束。

理解這一點,代理工程才站得住:精通 Claude Code,本質上是精通如何提供狀態、如何限制行動、如何表達意圖、如何驗證結果。本文整理底層迴圈、權限與 Skills,以及「意圖驅動開發」為何把重心從打字搬到審查。

模型無狀態:每次都是從零開始

大型語言模型在 API 意義上沒有跨呼叫的工作階段記憶。每次請求,它只看到這一次被放進上下文的 token。

因此必須由執行環境扛起全部狀態,例如:

  • 工作目錄裡的檔案
  • 對話紀錄
  • 設定(CLAUDE.md、skills、權限、hooks、MCP)
  • 執行環境(OS、shell、git 分支、目前模型)

Claude Code 的工作,就是在你按下 Enter 的瞬間,把這些東西組裝成一個大型請求,送進 Messages API,再根據模型回傳的 tool call 在本機執行,把結果塞回訊息陣列,再組裝、再呼叫——形成代理迴圈。

模型本身不會「記得你上次允許過 git commit」;是 harness 與你的設定檔在記得。

按下 Enter 之後:請求裡有什麼

概念上,一包請求大致包含:

區塊 作用
工具 Schema bash、read、edit、agent、webfetch… 各工具的名稱、描述、輸入結構。模型據此知道「框架能替我做什麼」
系統提示 框架寫死的身分、語氣、規範、安全規則
環境資訊 作業系統、shell、模型、git 分支等 session 快照
訊息陣列 對話史 + CLAUDE.md 全文Skills 清單(多半只有 name/description)+ 你的這句 prompt

兩點容易誤解:

  1. 模型不直接「讀 JSON」——API 端轉成 token;你在 network panel 看到的結構,是協議,不是模型的母語。
  2. 模型不能自己執行 bash——它只回傳 tool use;真正跑 fs.readFile 或 shell 的是 harness。若權限拒絕,工具呼叫可以「到達」但不會執行

一輪最小迴圈

你:幫這個模組加測試
  → harness 組裝 prompt(此時檔案內容可能還沒在上下文裡)
  → 模型:呼叫 read
  → harness:讀檔,tool result 寫回 messages
  → 再次組裝完整上下文
  → 模型:呼叫 edit / 繼續推理
  → …

所以你在 CLI 裡看到的「正在 read…」,是 API 回應之後 harness 的行為,不是模型神秘連線進你的磁碟。

客製化的真正旋鈕

既然狀態在環境,客製化就落在這些旋鈕上(你想得到的幾乎都是在餵狀態或限行動):

旋鈕 在做的事
CLAUDE.md 被動塑造行為與航向(專案大腦)
權限 允許/詢問/拒絕哪些工具與指令
Plan 模式 先別改碼,只規劃——一種強約束的「行為模式」
Skills 把重複多步驟流程寫成可重用程序
Hooks 工具前後自動跑腳本
外掛/MCP 擴充可呼叫的外部能力

權限:被動規則,主動控制

工具呼叫來自模型;是否執行由你的規則決定。常見分層:

  • allow:不詢問(如 npm run、安全的檢查指令)
  • ask:先問(如刪檔)
  • deny:硬擋(如 git push、改 package.json

規則可放在專案或全域設定;企業/管理層設定應優先於個人與專案,避免下層覆寫公司禁令。用過一陣子之後,可用「依歷史對話建議權限規則」這類指令,把你反覆點允許的模式收成設定——但應保持保守,可疑項宁可省略。

這回答了一個實際恐懼:「模型想 rm -rf 怎麼辦?」——在正確設定下,做得成之間,隔著 harness。

Skills:重複流程的產品化

Skill 本質是帶 front matter 的 Markdown 程序:部署、審查、問答循環……那些你不想每次重打的提示詞。

進階控制包括:

  • 某 skill 固定用較便宜的模型
  • 只當斜線指令、禁止模型自行呼叫
  • 或相反:只允許模型呼叫、使用者不直接觸發
  • 帶參數(如 /deploy staging

更重要的是心智轉換:

日常卡點出現時,先問:「這件事能不能變成 skill/已經有自動化?」
而不是預設「我必須親手寫一段腳本」。

這與「漸進式揭露」一致:傳給模型的 skill 清單往往只有名稱與描述;真用到才載入全文,省上下文。

意圖驅動開發:從「怎麼寫」到「要什麼+怎麼驗」

社群與產品方愈來愈常用 intent-driven development(意圖驅動開發) 描述一種用法:

較弱的焦點 較強的焦點
背誦神奇 prompt 句式 精確說出你要打造什麼
逐步當人肉編譯器 表達意圖,讓 harness+模型去拆步驟
只信自己敲的每一行 驗證行為與變更成為主業

實務上有效的輔助包括:

  • 語音輸入:說話往往比打字更快倒出意圖(含「嗯」、改口都沒關係)
  • Plan 模式或明確要求先別寫碼:意圖未清前不燒實作
  • 附圖、跑起來看、測試、CI:意圖必須可被驗證
  • 軟體工程背景仍有用:不是為了手寫每行,而是為了把意圖說清楚、知道哪裡該卡控

Anthropic 側的觀察也對齊:內部與外部重度使用者路徑不同,但回饋都在強調——Claude 需要驗證;產品目標是降低「有想法 → 可部署」的阻力,而不是鼓勵無人看管的自動合主幹。

心態帳本:時間花在哪

過去 現在更健康的分配
大部分時間在「寫」 更多時間在審查與驗證(可部分自動化,不可省略)
只盯 diff 語法 也驗行為:跑應用、測、草稿 PR
把 agent 當程式生成器 把終端機/Code 當連接電腦與數位世界的通用介面

寫 code 的產能上移之後,戰略判斷與驗收變成稀缺——這和「AI 加速軟體熵」「深度模組需要將軍視角」是同一條線:戰術可以外包給 agent,長期健康不能。

Code 與 Cowork:同一 runtime,不同介面

當用途從「寫程式」擴到剪片、研究、清檔、分析、寫作,並不奇怪:底層都是「無狀態模型 + 能碰環境的 harness」。

產品分層可以記成:

  • Claude Code:技術向、repo、CLI、工程工作流
  • Claude Cowork:非技術事務向(郵件、日曆、檔案整理等),更好的連線器與系統提示;底層仍可走類似 Code 的執行能力

選擇介面,是為了意圖類型;狀態與權限紀律兩邊都適用

可執行的最小清單

1. 記住:模型無狀態 → 你養的是 harness 狀態
2. 讀懂一輪:組裝 → tool call → 執行 → 再組裝
3. 設定權限階層:危險 deny、破壞性 ask、重複安全 allow
4. 專案大腦 CLAUDE.md + 重複流程 skills
5. 意圖:語音/Plan/圖;未清前少改碼
6. 驗證:行為 + 測試 + 草稿 PR;加大 review 比重
7. 學 git / gh / CLI,讓 agent 走可審查的交付路徑

結語

Claude Code 有效,不是因為模型突然「住進」你的筆電有了靈魂,而是因為:

無狀態的智力,被包進一個負責組裝世界狀態、執行工具、並可被你權限與程序約束的執行環境。

你客製 md、skills、hooks、MCP 與權限,是在設計這個環境。
你練習意圖驅動與驗證,是在設計自己與環境的介面。

把模型當黑盒神諭,會高估記憶、低估設定。
把 harness 看清楚,你才知道:每一次 Enter,究竟送出了什麼世界——以及,下一次如何把世界組得更對。

延伸閱讀


我是江中喬,專注於 AI Agent Architecture、Memory Governance 與 Cognitive Diversity,持續研究如何打造能夠長期協作、可信任且可治理的 AI 系統。