DOCCC-解體-001
REV2026.04
SUBJECTCLAUDE CODE
UNITTOKEN · TURN
SHEETI / I
Kaitai Shinsho · Anatomy Notebook

Claude · Code · 解體新書

a ten-chapter dissection of the CLI harness · from loop to MCP
LOOP CONTEXT TOOLS HOOKS MEMORY .CLAUDE/ SETTINGS SKILLS AGENTS MCP
SURGEONCLAUDE
DRAFTED2026.04.08
FORMATSCROLL-HTML
VERIFIEDCONTEXT7
CHAPTERS10 + 序

西元 1774 年,杉田玄白與前野良澤譯完《解體新書》—— 日本第一部西洋人體解剖圖譜。他們的動機很簡單:若要醫治一具身體,就必須先看清楚它內部的每一條經絡。本卷沿用此意,對象換成 Claude Code —— 由 Anthropic 開發、此刻正在你終端機裡執行的 CLI 型 AI 代理 harness。

Claude Code 的表層是一個對話視窗,底層卻是一整套精密的工程系統:它組裝上下文、路由工具、審核權限、觸發 hook、載入 skill、派遣 subagent、橋接 MCP server、壓縮歷史、持續記憶 —— 全部在每一次你按下 Enter 的瞬間同步運轉。本卷分十回章節,逐器官拆解。

這份解剖圖不是外觀素描,而是功能路徑圖。看懂它,你對 Claude Code 的使用就從「命令對話框」進化成「駕駛艙」。

I.

迴圈之魂

The Agentic Loop · how one turn becomes many
FIG · 01
HERO DIAGRAM

Claude Code 的一次對話並不是一次模型呼叫。當模型決定要用工具(BashEditAgent…),harness 會執行工具、把 tool_result 注回上下文、再呼叫模型一次,直到模型只吐純文字為止。這就是 Claude Code 的 agentic loop — 「自主行動」就是從這個迴圈裡長出來的。六站一環,反覆推進。

HARNESS BOUNDARY ⟵ PROCESS SPACE ⟶ 使 USER prompt final response · 最終回覆 迭 代 迴 圈 ITERATE UNTIL NO MORE TOOL_USE i. 攝入 Ingest user + hooks ii. 編織 Assemble context window iii. 推演 Infer · LLM MODEL CALL iv. 析響 Parse text / tool_use v. 遣器 Dispatch perm · exec vi. 回注 Inject tool_result if text-only no tool_use 終.返答 TERMINATE phase ← one turn · 一迴 → 「模型只負責推演;迴圈由 harness 驅動。」
i攝入 Ingest接收使用者訊息。此時 UserPromptSubmit hook 可注入額外脈絡(例如時刻、專案狀態)。
ii編織 Assemble組裝完整上下文:system prompt、規則、工具清單、歷史、記憶。若逼近 token 上限則先壓縮。
iii推演 Infer實際呼叫 LLM 的唯一時機。串流輸出純文字與 tool_use 區塊。
iv析響 Parse拆分模型輸出:文字給使用者看,tool_use 則交給下一站處理。
v遣器 Dispatch權限審核 → 沙箱執行 → 錯誤捕捉。此為 harness 風險最集中之處。
vi回注 Injecttool_result 塞回對話歷史,然後 — 再次進入 iii 推演,直到模型不再請求工具。
II.

脈絡編織

Context Assembly · what the model actually sees
FIG · 02
LAYERED FUNNEL

在你每次按下 Enter 之前,harness 會在幕後悄悄「重新寫完整份 prompt」— 把七八層東西壓進同一個 context window 再遞給模型。模型看見的從來不是你打的那一行字,而是這整疊紙。

INPUT LAYERS · 輸入層 01 · SYSTEM PROMPT 系統提示 · 核心身份 02 · CLAUDE.MD · RULES 專案規則 · 使用者常規 03 · TOOL SCHEMAS 工具清單 · JSONSchema 04 · HOOK · USERPROMPTSUBMIT 鉤子注入 · 動態脈絡 05 · MEMORY RECALL 記憶調閱 · 長期知識 06 · CONVERSATION HISTORY 對話歷史 · 前 N 回合 07 · CURRENT USER MESSAGE 本次訊息 · 此刻之問 CONTEXT WINDOW 脈 絡 窗 bounded · budgeted ~200K tokens ↯ auto-compress ↯ when near limit LLM 大腦 inference call text + tool_use 「次序即為權重 — 越靠前的層級愈不可覆寫;越後的愈能影響此刻決定。」 NOTE · AH-02
01 System PromptAnthropic 內建、定義 Claude 的身份與基礎行為邊界。harness 通常不可改寫。
02 CLAUDE.md / Rules專案或使用者層級的指令,優先於預設行為。這是 harness 給你最大的可配置性。
03 Tool Schemas本次可用工具的 JSON schema。若採 deferred tools,會先只掛名,待 ToolSearch 才載入全貌。
04 Hook 注入UserPromptSubmit 等事件可執行 shell 指令,將額外資訊塞入此輪 prompt。
05 Memory Recall從永續儲存讀入相關片段(RAG 或 file-based memory)。此層隨提問動態變化。
06 History + 07 User Msg先前所有 turn 與本次訊息。快到 token 上限時,較舊的 turn 會被 harness 摘要替換。
III.

工具之鞘

Tool Dispatch · permission gate & sandbox
FIG · 03
SEQUENCE

當模型說「我想 Write 這個檔案」,Claude Code 並不會馬上照辦 — 它先讀 settings.json 裡的 permissions(含 allow / deny 兩份字串模式清單 + defaultMode)決定走哪條路:命中 allow 直接執行、命中 deny 直接拒絕、兩者皆無則依 defaultMode 提示使用者。執行期在沙箱內、捕捉錯誤。這是 harness 風險最集中的地方,也是它最關鍵的「安全之鞘」。

推演 LLM 機關 HARNESS 權限 PERMISSION 工具 · 沙箱 TOOL · SANDBOX SANDBOXED tool_use 區塊 ① emit ② 查工具表 ③ check policy allow / ask / deny if "ask" prompt user deny → abort ④ dispatch execute ⑤ tool_result · stdout / err / files ⑥ next turn emit lookup check ask? run return inject 「模型提出意圖;harness 決定是否允許 — 兩者的分離即是安全。」
risk · 風險集中處

tool dispatch 是 harness 唯一會產生副作用的環節。檔案寫入、shell 命令、網路請求、對外訊息 — 所有「不可逆」的動作都必須穿過這裡。設計權限模型時寧嚴勿寬。

failure · 失敗回流

執行失敗不等於流程崩潰。錯誤會被包成 tool_result 的 error 形式回注 — 模型在下一 turn 看見錯誤訊息,自行決定是重試、更改參數,或回報給使用者。

IV.

鉤子織時

Hook Timeline · where users can splice in their own code
FIG · 04
TIMELINE

Hook 是 harness 允許你「在特定時間點插入自己程式碼」的接縫。它們不是 Claude 在執行 — 是 harness 在執行。當你說「從現在起每次 X 都要 Y」,那不是模型要記住的事,而是一條 hook 設定。

T₀ T_END SESSION · ONE TURN session start user submit pre tool post tool notification stop HOOK SessionStart 載入狀態 HOOK UserPromptSubmit 注入脈絡 HOOK PreToolUse 可否決工具 HOOK PostToolUse 檢查輸出 HOOK Notification 通知外部 HOOK Stop 終結收尾 每次工具呼叫都會經過 pre / post 一對 「Hook 是外掛的針腳 — harness 保留它們,是為了讓使用者不需改 harness 原始碼即可擴張行為。」 NOTE · AH-04 + 尚有 PermissionRequest · PostToolUseFailure · SubagentStart/Stop · TaskCreated/Completed · StopFailure · TeammateIdle · InstructionsLoaded · ConfigChange 等進階事件(見第柒回)
SessionStart新對話開啟時觸發。常用於載入使用者記憶、專案狀態、啟動訊息。
UserPromptSubmit使用者送出前觸發。可在 prompt 中插入動態脈絡(時刻、git 狀態)。
PreToolUse工具執行之前。可檢查參數、記錄、甚至阻擋 — 是最後一道防線。
PostToolUse工具執行之後。可檢查輸出、觸發格式化、記錄稽核軌跡。另有 PostToolUseFailure 專門捕捉執行失敗。
Notification對外通知事件(如需使用者注意)。多用於跨裝置提醒。
Stop迴圈結束時觸發。可進行清理、摘要寫入、關閉資源。另有 StopFailure 專門捕捉異常結束。
PermissionRequest當 Claude 想用未經核准的工具時觸發。hook 可以代替使用者回答 allow / deny 並改寫參數。
SubagentStart / SubagentStop分身生命週期。監控 subagent 執行、記錄成本。
TaskCreated / TaskCompleted與 TaskCreate 工具搭配 — 追蹤 agent 的 todo 進度。
ConfigChange當 settings.json 或相關檔案被改時觸發 — 可自動重載 / 通知團隊。
V.

記憶二界

Memory Worlds · the context-bound and the persistent
FIG · 05
DUAL HORIZON

Claude Code 的記憶分為兩層:短暫的「context 記憶」活在這次對話的 token 預算裡,會隨 turn 與 auto-compression 消逝;永續的「file 記憶」主要靠 CLAUDE.md 階層(全域 ~/.claude/CLAUDE.md 與專案 ./.claude/CLAUDE.md)每 session 開頭自動注入,其餘狀態則存於 ~/.claude.json~/.claude/projects/ 等位置。harness 的工作是決定 — 何時寫、何時讀、何時忘。

A · WORKING MEMORY · 脈絡內 volatile · within context window · dies on session end 對話歷史 HISTORY last N turns 工具結果 TOOL_RESULTS scratchpad 任務清單 TODO LIST in-turn plan 系統提醒 SYSTEM REMINDER active context 壓縮摘要 COMPRESSED older turns ━ 界 · horizon of the session ━ B · PERSISTENT MEMORY · 永續 durable · on disk or remote · survives across sessions MEMORY.md FILE STORE user · feedback CLAUDE.md RULE STORE global + project 檔案系統 FILESYSTEM cwd · repo 向量庫 VECTOR STORE semantic recall 會話快照 SESSION DUMP replay / resume write read write recall dump 「記憶不是越多越好 — 是越對時機越好。」
budget · 預算紀律

working memory 的容量是固定的(例如 200K token)。harness 會監控使用量 — 一旦接近上限,就會把最舊的若干 turn 換成摘要,以空出位置給新內容。這稱為 auto-compression。

decay · 記憶衰減

永續記憶看似不會忘 — 但會過期。寫入時要記錄 為什麼 存這件事,讀取時要先驗證現況仍然符合。stale memory 比沒有記憶更危險。

VI.

棲所之圖

The .claude Directory · where Claude Code keeps its organs
FIG · 06
FILE TREE

Claude Code 的狀態不是放在某個黑盒資料庫裡 — 它全部都是純文字檔,散落在兩個目錄:~/.claude/(全域,跟著你這個使用者)與專案下的 .claude/(跟著這個 repo)。兩者結構相同但作用範圍不同;專案設定覆蓋全域設定,像兩張透明賽璐珞片疊起來看。

A · GLOBAL · 全域 follows the user ~/.claude/ root CLAUDE.md global rules settings.json permissions · hooks · env output-styles/ response style overrides projects/ per-workspace state -Users-user-Workspace-demo/ memory/ file-based memory plugins/ installed plugins & cache skills/ SKILL.md files agents/ subagent definitions commands/ slash commands hooks/ hook scripts bin/ plugin executables on PATH B · PROJECT · 專案 follows the repo .claude/ in repo root CLAUDE.md project rules settings.json project overrides settings.local.json gitignored commands/ repo slash commands agents/ repo subagents skills/ repo skills hooks/ repo hooks ../.mcp.json at repo root · MCP servers project overrides global merge at runtime · deepmerge semantics 「同一份 setting 若兩處皆有,靠近專案的勝出 — 就像地方法優先於國法。」
CLAUDE.md純文字規則檔。全域版放 ~/.claude/CLAUDE.md,專案版放 ./.claude/CLAUDE.md。兩份會 疊加進每一次對話的 system prompt — 注意:陣列類設定(如 allow)會合併,scalar 類(如 model)則用最具體值。
settings.jsonJSON 格式的行為設定 — 權限、hooks、env、model、statusLine 等。專案設定會 deep-merge 覆蓋全域設定。建議檔首加 "$schema": "https://json.schemastore.org/claude-code-settings.json" 啟用 IDE 自動補齊與驗證。
.mcp.jsonMCP server 註冊檔 — 位於專案根目錄(不在 .claude/ 內部)。plugin 打包時也用相同檔名放在 plugin 根。
skills/ · agents/ · commands/ · output-styles/四者皆為「擴充物」。skill 為 SKILL.md;agent / command 為 Markdown 附 YAML frontmatter;output-styles 覆寫回覆語氣。plugins 目錄裡包裝的也是這些。
hooks/存 hook 實際會執行的 shell 腳本。settings.json 裡的 hooks.* 欄位以 regex matcher + { type: "command", command, timeout } 形式指向這裡的檔案。
.claude 紅色項目= Claude Code 會在啟動或每 turn 讀取的「活件」,顏色表示載入時機之頻繁。
VII.

設定之書

settings.json · the dissection of a configuration file
FIG · 07
SCHEMA

Claude Code 行為的幾乎一切 — 工具可否執行、hook 何時觸發、用哪個模型、要不要帶 Co-Authored-By — 都寫在 settings.json 這個純文字 JSON 檔裡。它是 harness 的「遺傳密碼」,一改就變體質。本章把它攤開、逐段標註。

▸ settings.json JSON · CC-CONFIG permissions · tool authorization policy allow : string[] · auto-run patterns deny : string[] · block outright (未列入者依 defaultMode 決定是否詢問) defaultMode : "default" | "plan" | "acceptEdits" | "auto" | "dontAsk" | "bypassPermissions" additionalDirectories : string[] hooks · 16+ event types · see /hooks SessionStart UserPromptSubmit PreToolUse PermissionRequest PostToolUse PostToolUseFailure Notification SubagentStart SubagentStop TaskCreated TaskCompleted Stop StopFailure TeammateIdle InstructionsLoaded ConfigChange each: Array<{ matcher: regex, hooks: [{ type: "command", command, timeout }] }> ↯ 紅字為第肆回時間軸未畫出的進階事件 ↯ env · environment vars Record<string, string> model : string | "opusplan" | "default" e.g. "claude-sonnet-4-6" statusLine · bottom bar renderer type : "command" | "static" command : string (shell script path) apiKeyHelper : string · shell script returning an API key enableAllProjectMcpServers : boolean · auto-approve .mcp.json includeCoAuthoredBy : boolean · git co-author trailer cleanupPeriodDays : number · transcript retention RESOLUTION ORDER ① enterprise policy /Library/Application Support/ ② global user settings ~/.claude/settings.json ③ project settings ./.claude/settings.json ④ project local (gitignored) settings.local.json wins MERGE SEMANTICS · objects deep-merged key by key · arrays concatenated (allow / ask / deny) · scalars (model / defaultMode) overridden · deny always wins over allow ⚠ SECURITY NOTE settings.json 可執行任意 shell 指令 (apiKeyHelper, statusLine, hooks, MCP server launch)— 等同於執行該使用者 擁有的所有權限。 check in project settings before trusting them.
default · 預設模式

permissions.defaultMode 決定「沒列在 allow/deny 的工具」怎麼處理。共六值:default(首次使用時提示)· plan(僅允許分析、不允許修改)· acceptEdits(自動接受本次 session 的檔案編輯)· auto(自動通過基礎安全檢查)· dontAsk(未預先核准者一律拒絕)· bypassPermissions(跳過所有審核,除了受保護目錄)。

override · 覆蓋順序

由外而內:enterprise → 全域 → 專案 → 專案 local。每一層都可以只寫自己想改的欄位,上層其他設定保留。這讓團隊可以把 repo 通用設定簽進版控,個人機器的偏好另放 settings.local.json

VIII.

技能之術

Skills · the art of progressive disclosure
FIG · 08
THREE TIERS

Claude Code 的 skill 系統是一套「漸進揭露」(progressive disclosure)機制 — 不把所有 skill 內容塞進 context(那會爆 token),而是分三層揭開:平時只看見 skill 的名字與一行描述;一旦判斷需要,才呼叫 Skill 工具把整份 SKILL.md 載入。每層都有自己的 token 預算,層層加深。

TIER 01 目錄 directory SYSTEM REMINDER · trigger descriptions only skill frontend-design distinctive UIs ~30 tokens skill debugging systematic ~30 tokens skill brainstorming design first ~30 tokens skill TDD test-first ~30 tokens skill structured-gen full docs ~30 tokens N skills total TOTAL ~2K tokens always loaded cost of being "aware" match relevance → decide TIER 02 召喚 invocation SKILL TOOL · model decides to load one Skill({ skill: "brainstorming" }) COST ~50 tokens one tool call expand TIER 03 本體 body ▸ SKILL.md · loaded into context --- YAML frontmatter (11 fields) --- name · description · argument-hint allowed-tools · model · effort · hooks ## Rule "Invoke BEFORE acting, not after" ## Flowchart graphviz digraph decision tree ## Red Flags rationalization patterns to catch ## Examples concrete usage scenarios --- body content --- elaborate prose & structure ## Checklist items converted to TODO ## Anti-patterns what NOT to do ## Tools used which built-in tools to call ## References related skills, docs, links DEPTH 1K–5K tokens per skill only when invoked TOKEN BUDGET cumulative cost 2K · tier 1 +50 · tier 2 +3K · tier 3 200K 100K 0 「描述先至、召喚次之、本體最後 — 像拆禮物一樣節省 token。」
Tier 1 · Directory所有 skill 的 frontmatter 會在 session 開始時注入。Claude 看得見有哪些 skill 與它們的描述,但尚未載入本體。frontmatter 欄位包含:namedescriptionargument-hintallowed-toolsmodeleffortcontext(可設 "fork" 用 subagent 跑)、agentdisable-model-invocationuser-invocablehooks 共 11 個。
Tier 2 · InvocationClaude 依描述判斷任務相關性,主動呼叫 Skill(skill: "name")。這是一次標準的 tool call。
Tier 3 · BodySKILL.md 本體被載入當前 turn,包含完整指示、範例、檢查清單、流程圖 — Claude 依此執行。
Frontmatter每個 skill 的 YAML frontmatter 必須精確描述「何時該用」— 因為這是 Claude 在 Tier 1 唯一看得見的判斷依據。
Plugin Skills來自 plugin 的 skill 會以 plugin:name 形式命名,與全域 / 專案 skill 共存於同一份目錄。
為何有效200K context 裡塞 50 個 skill 本體會瞬間爆掉;只塞描述則僅佔 2K。真正用到的那一兩個才載入 — 這就是「進化來的 context 紀律」。
IX.

分身之法

Subagents · parallel dispatch & context isolation
FIG · 09
HUB & SPOKES

當任務需要大量探索、或包含數個彼此獨立的子問題,Claude Code 可以透過 Agent 工具「分身」— 呼叫一個或多個 subagent 平行工作。每個分身有自己的 system prompt、自己的 context window、自己的工具集;它們彼此看不見,最後只傳回一則文字結果給主 agent。這既是效率手段,也是保護主 context 的手段。

PARENT · MAIN CONVERSATION 主 Agent the hub your conversation Agent({ subagent_type, prompt }) parallel dispatch ISOLATION · OWN CTX Explore subagent_type: "Explore" OWN CONTEXT WINDOW · own system prompt (agent def) · own conversation history TOOLS Read Grep Glob WebFetch 「搜尋 codebase, 找 pattern」 thoroughness: quick · medium · high returns: single text message ISOLATION · OWN CTX general-purpose subagent_type: "general-purpose" OWN CONTEXT WINDOW · full toolset access · multi-step task runner TOOLS · ALL Bash Edit Write +N more 「複雜、多步驟的任務」 isolation: "worktree" · optional returns: single text message ISOLATION · OWN CTX code-reviewer subagent_type: custom OWN CONTEXT WINDOW · role-specific prompt · from .claude/agents/*.md TOOLS · CURATED Read Grep Glob 「獨立視角審查程式碼」 second-opinion pattern returns: single text message each subagent → one text result → main context
isolation · 為何隔離

Subagent 有自己的 context 是為了保護主對話 — 若一個 Explore 要讀 50 個檔案,那些中間結果若全塞主 context 就爆了。主 agent 只收到最後的「摘要報告」。isolation: "worktree" 更進一步,建立獨立 git worktree 讓分身在自己的檔案副本上工作。

parallelism · 何時並行

當子任務彼此無依賴 — 例如「審查三個檔案」或「同時調查三個 repo」— 可以在同一則訊息裡發出多個 Agent 呼叫。harness 會並行執行,所有結果幾乎同時回來。相依的任務則必須序列化。

X.

協議之橋

MCP & Deferred Tools · the open bridge to external tools
FIG · 10
PROTOCOL MAP

Claude Code 的工具不全是內建的。透過 MCP(Model Context Protocol)— 由 Anthropic 提出的開放協議 — 任何外部程序都能向 harness 註冊自己的工具,被 Claude 當作「原生工具」呼叫。但若所有 MCP 工具的 schema 都一次塞進 context 會爆 token — 於是 Claude Code 又引入了 deferred tools:只把工具「名字」掛在清單,用 ToolSearch 才把完整 schema 拉下來。雙層機制,共同維持 token 紀律。

A · MCP TOPOLOGY · 協議拓撲 CLAUDE CODE · HOST 協議主機 BUILT-IN TOOLS Bash · Read · Edit · Write · Grep Glob · Agent · Skill · TaskCreate UNIFIED TOOL REGISTRY · built-in tools · MCP tools (namespaced mcp__*) · deferred tools (name only) → presented to LLM as one flat list MCP SERVER · stdio / sse agent-cards 18 tools · payments MCP SERVER · stdio knowledge-nexus 9 tools · knowledge base MCP SERVER · stdio pal 16 tools · multi-model router MCP SERVER · extension claude-in-chrome 22 tools · browser automation MCP B · DEFERRED TOOL LIFECYCLE · 延載工具生命週期 ① DEFERRED · NAME ONLY in system reminder AskUserQuestion WebFetch WebSearch NotebookEdit mcp__pal__chat mcp__pal__debug mcp__knowledge-nexus__* mcp__agent-cards__* … ~120 tools total cost: ~1 token per name → cheap, always loaded need it ② TOOLSEARCH CALL Claude decides, invokes ToolSearch({ query: "select:WebFetch", max_results: 1 }) query forms: · select:Read,Edit → exact names · "notebook jupyter" → keyword · "+slack send" → require + rank returns: full JSONSchema → now callable schema loaded ③ FULL SCHEMA LOADED tool now callable { "name": "WebFetch", "description": "...", "parameters": { "url": string, "prompt": string, "timeout": number }, "required": [...] } cost: 500~2000 tokens but only for tools you use 「先知其名,後現其形 — MCP 敞開生態,deferred 守住預算。」
MCP · HostClaude Code 本身是 MCP host。它透過 stdio 或 SSE 與子程序溝通,接收對方宣告的工具清單,統一納入自己的 registry。
MCP Server獨立程序,用 Anthropic 發布的 MCP SDK 撰寫。任何語言都可以實作,只要遵守協議規格。
mcp__ 命名空間所有 MCP 工具在 registry 裡都會被加上 mcp__{server}__{tool} 的前綴,避免與內建工具衝突。
Deferred Tool只在 system reminder 出現名字,不帶 schema。對 LLM 而言存在但不可立即呼叫 — 像書架上書名可見但書仍閉合。
ToolSearch模型要用某個 deferred tool 時自己發的「解鎖請求」。可以用精確名稱(select:)或關鍵字搜尋。
設計哲理生態的廣度 vs context 的窄度 — MCP 解決前者、deferred 解決後者。兩者相加才讓「上百個工具同時可用」成為可能。