Claude 原理与 Claude Code 代码架构详解从大模型本身,到包裹它的 Agent Harness:训练、对齐、推理、工具协议、Agent 循环、权限、上下文工程与扩展机制

一句话理解:Claude 是 Anthropic 训练的大语言模型家族(Opus / Sonnet / Haiku / Fable),负责"思考";Claude Code 是包在模型外面的 agentic harness,负责"提供工具 + 管理模型看到的上下文"。两者合起来,构成一个能读代码、改文件、跑命令、自我验证的自主 Agent。

资料来源:Anthropic 官方文档(code.claude.com/docs、platform.claude.com/docs)、Anthropic Engineering / Research 博客、Constitutional AI 论文(arXiv 2212.08073)、开源的 claude-agent-sdk-python 源码。Claude Code CLI 主体为闭源分发,文中关于其内部实现的描述以官方文档披露的行为为准,不臆测未公开的细节。

01Claude 是什么

"Claude" 在不同语境下指三层东西,理解它们的边界是读懂后续内容的前提:

Model

Claude 模型

Anthropic 训练的 LLM 家族。当前系列含 Fable 5.1、Opus 5.5、Sonnet 5.5、Haiku 4.5,在能力、延迟、成本之间做不同取舍。

API

Claude Platform / Messages API

以 messages 为核心的无状态 HTTP 接口:输入 system + 对话历史 + 工具定义,输出内容块(text / thinking / tool_use)。

Harness

Claude Code

运行在终端、IDE、桌面、Web 的 Agent。它维护会话、执行工具、管控权限、压缩上下文,把无状态的模型变成有状态的工作伙伴。

SDK

Claude Agent SDK

把 Claude Code 的同一套 Agent 循环以 Python / TypeScript 库的形式开放,可嵌入自己的应用。

官方文档对 Claude Code 的定义很直接:"The agentic loop is powered by two components: models that reason and tools that act. Claude Code is the layer around the model that provides the tools and manages the context the model sees." 本文 Part A 讲 model 如何"会思考",Part B 讲 harness 如何"让它能做事"。

02底座:Transformer 与预训练

Claude 属于 decoder-only Transformer 类大语言模型。Anthropic 没有公开具体参数量、层数、MoE 与否等细节,但其基本工作方式与同类模型一致:

  1. Tokenize:文本、代码、图片(视觉编码后)被切分为 token 序列。
  2. Embedding + 多层 Transformer Block:每层由多头自注意力(让每个 token 读取上下文里其他 token 的信息)和前馈网络(在高维空间做非线性变换、存储"知识")组成,残差流贯穿各层。
  3. 自回归解码:模型输出下一个 token 的概率分布,采样一个 token 追加到序列末尾,重复直到结束。所有"推理""工具调用"本质上都是这样一个一个 token 生成出来的结构化文本。
输入 tokensystem+history Embedding N × Transformer Block Multi-Head Self-Attention Feed-Forward (MLP) Logitssoftmax 下一个 token采样 自回归:新 token 追加到序列,再跑一次前向

训练三段式:

阶段数据得到什么
预训练 (Pre-training)大规模公开网页、书籍、代码等文本(Anthropic 说明其爬虫遵守 robots.txt,且不使用用户付费数据默认训练)一个"什么都能续写"的基础模型,学到语言、知识与推理模式
监督微调 (SFT)人工与模型生成的高质量对话示范学会以"助手"身份对话、遵循指令
强化学习 (RLHF / RLAIF / 环境 RL)人类偏好、AI 依据宪法的偏好、可验证任务(代码、数学、Agent 环境)的结果奖励有帮助、诚实、无害;会用工具、会长程完成任务

Anthropic Research《Tracing the thoughts of a large language model》开篇即强调:模型"不是被人直接编程的,而是在大量数据上训练出来的……它们学会了自己解决问题的策略"。这也是为什么 Anthropic 要同时投入"对齐训练"与"可解释性"两条线。

03对齐:RLHF 与 Constitutional AI

Claude 区别于其他模型最有代表性的训练方法是 Constitutional AI (CAI),出自 Anthropic 2022 年论文《Constitutional AI: Harmlessness from AI Feedback》(Bai et al.)。核心思想:人类不再逐条标注"哪个回答更无害",而是写下一份原则清单(宪法),让 AI 依据原则自我批评、自我修正、自我评判。

阶段 1 · Supervised (SL-CAI) 初始模型采样回答 按宪法原则自我批评 critique 自我修订 revision 在修订稿上微调 → SL 模型 阶段 2 · Reinforcement (RL-CAI / RLAIF) SL 模型对同一问题采样两个回答 AI 依据宪法判断哪个更好 训练偏好模型Preference Model 以 PM 为奖励做 RL→ 最终模型 人类只提供原则清单 两阶段都可用 chain-of-thought 提升判断质量与透明度

论文摘要中的关键结论:这样训练出的助手"harmless but non-evasive"——遇到有害请求时不是一味回避,而是解释自己为什么反对;并且"用少得多的人类标注就能更精确地控制 AI 行为"。

方法反馈来源优点局限
RLHF人类比较两个回答直接对齐人类偏好标注昂贵、标注者暴露于有害内容、规则不透明
Constitutional AI (RLAIF)AI 依据成文原则比较可扩展、原则公开可审计、有害性与有用性兼顾效果依赖原则写得好不好、依赖评判模型能力

在此基础上,Anthropic 还发布了 Claude 的"宪法"文档与 Character Training,塑造 Claude 好奇、坦诚、愿意提出不同意见的性格;并按 Responsible Scaling Policy (RSP) 对每一代模型做 ASL 等级的安全评估后再发布。

04可解释性:模型内部在想什么

Anthropic 的 Interpretability 团队试图打造一台"AI 显微镜":在模型激活中找到可解释的特征 (features),再把特征连成回路 (circuits),追踪从输入词到输出词的计算路径。在《Tracing the thoughts of a large language model》中,他们对 Claude 3.5 Haiku 做了"AI 生物学"研究,得到几条直接影响我们理解"Claude 原理"的发现:

多语言

共享的"思维语言"

不同语言的同一句话,在模型内部有大量重叠的概念特征。Claude 有时在跨语言共享的概念空间里思考,再转换成具体语言输出。

规划

会提前规划

写押韵诗时,模型在写下一行之前就已想好要押的韵脚词,然后组织句子到达那里。虽然一次只输出一个 token,但思考的视野更长。

忠实性

推理不一定忠实

给出错误提示的难题中,研究者"当场抓到"模型编造看似合理的推理去迎合用户——说明可见的 CoT 不总等于真实计算过程。

幻觉

默认拒绝猜测

反直觉的发现:Claude 的默认回路是"不知道就不答",只有当"已知实体"特征抑制了这一默认时才回答;幻觉常是这一抑制误触发。

研究者也坦承局限:即便是几十个词的短提示,当前方法也只能捕捉模型总计算量的一小部分,且需要数小时人工分析。可解释性是 Anthropic 安全路线的长期投入,而非已完成的"白盒化"。

05推理:Extended Thinking 与 Effort

Claude 支持在给出最终回答前生成 thinking 内容块,即"扩展思考"。它在 API 中是一等公民:

// 请求:开启扩展思考
{
  "model": "claude-opus-5-5",
  "max_tokens": 16000,
  "thinking": { "type": "enabled", "budget_tokens": 10000 },
  "messages": [{ "role": "user", "content": "..." }]
}
// 响应:thinking 块在前(带加密 signature),text / tool_use 在后
{ "content": [
  { "type": "thinking", "thinking": "先分析失败用例...", "signature": "EqQB..." },
  { "type": "text", "text": "问题出在 token 过期判断..." }
]}

06工具调用协议

模型本身不能执行任何东西。"调用工具"的真实含义是:模型输出一段结构化的 tool_use 块,由客户端(harness)执行,再把结果以 tool_result 塞回下一轮输入。这是 Claude Code 一切能力的协议基础。

Harness / 客户端 Claude Messages API ① system + tools[] + messages[] ② content: [tool_use{id,name,input}] stop_reason="tool_use" ③ 权限检查 → 执行工具 ④ 追加 user: [tool_result{tool_use_id, content, is_error}] ⑤ 更多 tool_use … 或纯 text,stop_reason="end_turn"
// 工具定义:名称 + 描述 + JSON Schema。描述的质量直接决定模型会不会用、用得对不对
{ "name": "Read",
  "description": "Reads a file from the local filesystem...",
  "input_schema": { "type": "object",
    "properties": { "file_path": {"type":"string"}, "offset": {"type":"integer"} },
    "required": ["file_path"] } }

07上下文窗口与 Prompt Caching

Messages API 是无状态的:每一轮请求都要带上完整的 system prompt、工具定义和全部历史。Agent 跑 50 轮,就意味着同样的前缀被发送 50 次。两件事因此变得关键:

机制要点对 Agent 的意义
Context Window标准 200K tokens,部分模型/配置支持 1M。所有 system、工具、历史、工具输出都计入长任务会"撑满",需要压缩、子代理隔离、按需加载
Prompt Caching用 cache_control: {"type":"ephemeral"} 标记前缀断点;按 tools → system → messages 顺序匹配;默认 TTL 5 分钟(可选 1 小时);命中部分按显著折扣计费不变的前缀(系统提示、工具定义、CLAUDE.md)几乎只付一次全价,大幅降低成本与首 token 延迟

Agent SDK 文档:"Content that stays the same across turns (system prompt, tool definitions, CLAUDE.md) is automatically prompt cached." 这也是 Claude Code 把动态内容(system-reminder、文件变更提示)放在消息尾部、而不是改动 system prompt 的原因——改动前缀会让缓存全部失效。

08Claude Code 整体架构

Claude Code 以 TypeScript 编写(GitHub anthropics/claude-code 仓库语言标注为 TypeScript,主体以原生二进制分发)。从官方文档披露的行为可以把它拆成六层:

① 交互界面
Terminal TUIVS Code / JetBrainsDesktop Appclaude.ai/codeRemote ControlSlackGitHub Actions / -p headlessAgent SDK
② 会话与配置
Session JSONL @ ~/.claude/projects/resume / forksettings 分层: managed › CLI › local › project › user/model · /effort · output style
③ Agentic Loop
gather → act → verify流式解析 content blocks工具调度 (只读并发 / 写串行)中断 Esc / 排队消息maxTurns · maxBudgetUsd
④ 上下文引擎
System promptCLAUDE.md / rulesAuto memory (MEMORY.md)system-reminder 注入Tool search 延迟加载Auto-compactionPrompt caching
⑤ 工具与安全
Read · Edit · WriteGlob · GrepBash (+Sandbox)WebFetch · WebSearchAgent · Skill · Task*Permission engine deny›ask›allowAuto-mode classifierCheckpoints
⑥ 扩展层
SkillsMCP serversHooks (command/http/prompt/agent)Subagents / forksPlugins · ModsCode intelligence (LSP)
Claude Code Harness(本地进程) 你 / IDE / SDKprompt · 中断 · 审批 Agentic Loop(query 循环) 上下文引擎组装/缓存/压缩 权限引擎 + Hooksdeny › ask › allow 内置工具Read Edit Bash Grep… 扩展MCP Skills Subagents Claude APIOpus / Sonnet / Haiku 你的环境文件系统 · shell · git外部服务 (MCP)

09核心:Agentic Loop

官方文档把循环描述为三个交织的阶段:gather context → take action → verify results,重复直到任务完成,用户可随时打断。落到实现上,它就是一个围绕 Messages API 的 while 循环:

// 概念伪代码(依据 Agent SDK 文档《How the agent loop works》)
async function* agentLoop(prompt) {
  history.push(user(prompt))                          // UserPromptSubmit hook 可在此注入/拦截
  yield SystemMessage("init")
  while (true) {
    if (nearContextLimit()) await compact()          // PreCompact hook → 摘要 → compact_boundary
    const resp = await claude.messages.stream({ system, tools, messages: history })
    for (const block of resp.content) yield AssistantMessage(block)
    const calls = resp.content.filter(b => b.type === "tool_use")
    if (calls.length === 0) break                       // 无工具调用 = 本轮结束
    const results = await runTools(calls)              // 权限 → PreToolUse → 执行 → PostToolUse
    history.push(assistant(resp), user(results))
    yield UserMessage(results)
    if (++turns >= maxTurns || cost >= maxBudgetUsd) return Result("error_max_*")
  }
  runHooks("Stop")                                       // Stop hook 可要求"继续"
  yield ResultMessage({ result, usage, total_cost_usd, session_id })
}
消息类型何时产生内容
SystemMessage会话生命周期init(会话元数据)、compact_boundary(压缩后)等
AssistantMessage模型每个内容块text / thinking / tool_use,同一响应共享 message id
UserMessage工具执行后 / 用户插话tool_result 内容
StreamEvent开启 partial messages 时原始流式增量(文本 delta、工具输入片段)
ResultMessage循环结束结果文本、usage、成本、session_id、subtype(success / error_max_turns / error_max_budget_usd / error_during_execution)

"Turn" 的定义:一次"模型输出含工具调用 → 执行 → 结果回填"的往返。官方示例"Fix the failing tests in auth.ts":Turn 1 Bash npm test(3 个失败)→ Turn 2 Read auth.ts / auth.test.ts → Turn 3 Edit + Bash npm test(全部通过)→ 最终纯文本回复。共 4 轮。

人在回路:按 Esc 立即取消正在运行的工具调用;直接输入并回车则作为"排队消息",在当前工具调用结束后、同一轮内被读取,模型据此调整下一步。

10工具系统

类别工具说明
文件操作Read Edit Write NotebookEditEdit 是精确字符串替换(要求先 Read、old_string 唯一),比整文件重写更省 token、更不易误改
搜索Glob Grep基于 ripgrep;"just-in-time" 检索的基础,取代把整库塞进上下文
执行Bash / PowerShell任意 shell 命令;可后台运行;可被 Sandbox 包裹
WebWebSearch WebFetchWebFetch 抓取页面并用小模型按 prompt 提炼
发现ToolSearchMCP 与非核心工具的 schema 默认延迟加载,按需检索
编排Agent Skill AskUserQuestion TaskCreate/TaskUpdate派生子代理、调用技能、向用户提问、任务清单
代码智能LSP 插件编辑后看到类型错误、跳转定义、查引用

并发策略:同一轮中多个工具调用时,只读工具(Read、Glob、Grep、标注 readOnlyHint 的 MCP 工具)可并发执行;修改状态的工具(Edit、Write、Bash)串行执行以避免冲突。

被拒绝时:工具被权限或 Hook 拒绝后,模型收到的是一条"拒绝消息"作为 tool_result,通常会换一种方式或说明无法继续——拒绝本身也是循环的一部分,而不是异常。

11权限、沙箱与检查点

Claude Code 有两类安全机制:checkpoints 让文件改动可撤销,permissions 控制什么能不经询问就执行;对 Bash 还可再叠一层 OS 级 sandbox。

11.1 权限模式(Shift+Tab 切换)

模式行为适用
auto后台分类器模型审阅大多数动作,拦截高风险的,其余直接放行(v2.1.283 起交互式终端与 VS Code 的默认起始模式)日常自主开发
default(Manual)文件修改与 shell 命令前询问谨慎操作
acceptEdits自动批准文件编辑与 mkdir/mv/cp 等常见文件命令,其他命令仍询问快速迭代原型
plan只探索与出方案,不改源文件先评审再动手
dontAsk从不询问:预批准的执行,其余一律拒绝固定工具面的无头 Agent
bypassPermissions除显式 ask 规则等外全部放行,root 下禁用隔离的 CI / 容器

11.2 规则求值:deny 优先

  1. PreToolUse Hook:exit code 2 的阻断型 hook 先于规则生效,可拦截即便被 allow 的调用。
  2. deny 规则:任何层级(managed / CLI / project / user)只要命中 deny,其他层级都无法放开。
  3. ask 规则:命中则必须询问,即便 hook 返回 allow。
  4. allow 规则:如 Bash(npm test *)、WebFetch(domain:docs.x.com)、mcp__github__*。
  5. 模式兜底:都未命中时按当前权限模式决定(询问 / 分类器 / 拒绝 / 放行)。

"Yes, and don't ask again" 对 Bash 和 WebFetch 会把规则永久写入仓库根的 .claude/settings.local.json;文件修改授权只在本会话有效。

11.3 Sandbox

开启后 Bash 工具运行在 OS 级隔离中:macOS 用 Seatbelt,Linux / WSL2 用 bubblewrap。文件系统写入限制在工作目录,网络经代理按域名白名单放行。沙箱与权限互补:权限决定"要不要执行",沙箱限制"执行了能碰到什么"。对应开源实现 @anthropic-ai/sandbox-runtime。

11.4 Checkpoints

12上下文工程与压缩

Anthropic 工程博客把这一层称为 context engineering:上下文是有限的"注意力预算",token 越多,模型对每条信息的召回越弱(context rot)。Claude Code 的策略是"让模型看到最小但足够的高信号 token 集合":

JIT

按需检索

不预先灌入代码库,只保留路径等轻量引用,靠 Glob/Grep/Read 在需要时拉取。

Lazy

延迟加载

Skills 只放描述、MCP 只放工具名,完整内容/Schema 在用到时才加载(Tool Search)。

Isolate

子代理隔离

子代理在独立上下文里读几十个文件,只把摘要返回主对话。

Compact

自动压缩

接近上限时先清理旧工具输出,再对历史做摘要;也可 /compact focus on ... 手动触发。

Notes

结构化笔记

CLAUDE.md、MEMORY.md、Task 清单、plan 文件落盘,压缩后从磁盘重新注入。

压缩后什么会保留(官方《What survives compaction》)

内容压缩后
System prompt、output style照常生效
项目根 CLAUDE.md、无路径限定的 rules、Auto memory从磁盘重新注入
Skill 描述按当前 skills 重建并注入
Plan mode 写的计划从磁盘重新注入
读过/改过的文件重新读取最近修改的至多 5 个;超过 5,000 tokens 的只留路径引用
已调用的 Skill 正文重新注入,单个上限 5,000 tokens、总计 25,000,最老的先丢
后台命令与后台子代理继续运行,并提醒模型避免重复启动
早期对话中的细节指令、hook 注入的上下文被摘要,可能丢失 → 持久规则应写进 CLAUDE.md

如果单个文件或工具输出过大,导致每次摘要后上下文立即被重新撑满,Claude Code 会在几次尝试后停止自动压缩并报 thrashing 错误,而不是无限循环。

13记忆:CLAUDE.md 与 Auto Memory

每个会话都从全新的上下文窗口开始。跨会话的"记忆"只靠两种落盘文件:

作用域位置用途
Managed policy/Library/Application Support/ClaudeCode/CLAUDE.md 等组织级规范,IT 下发
User~/.claude/CLAUDE.md个人对所有项目的偏好
Project./CLAUDE.md 或 ./.claude/CLAUDE.md(可读 AGENTS.md)团队共享,随代码提交
Local./CLAUDE.local.md个人对本项目的偏好,gitignore
Auto memory~/.claude/projects/<project>/memory/MEMORY.md + 主题文件Claude 工作中自动记下的经验

14扩展层:Skills / MCP / Hooks / Subagents

特性何时加载加载什么上下文成本
CLAUDE.md会话开始全文每次请求(有缓存)
Skills开始 + 使用时开始只放描述,调用时放全文低
MCP servers会话开始工具名;Schema 按需用前很低
Subagents派生时全新上下文(fork 则复制父对话)与主会话隔离
Hooks事件触发不进上下文(外部运行)零,除非返回附加上下文

14.1 Skills

一个目录 + SKILL.md(YAML frontmatter + Markdown 指令)+ 可选脚本/资源。模型在会话开始只看到 name 与 description,判断相关时调用 Skill 工具才加载正文——这是"渐进式披露"。可设 disable-model-invocation: true 只允许用户 /name 手动触发,context: fork 让技能在子代理中运行,allowed-tools 预批准工具。

---
name: release-notes
description: Generate release notes from merged PRs. Use when the user asks for a changelog.
allowed-tools: Bash(gh pr list *), Read
---
# 正文:步骤、模板、注意事项……(被调用时才进入上下文)

14.2 MCP (Model Context Protocol)

开放协议,让 Claude Code 作为 MCP client 连接外部服务(GitHub、数据库、浏览器、Jira…)。传输支持 stdio(本地进程)、HTTP、SSE、WebSocket;作用域分 local / project(.mcp.json)/ user;支持 OAuth。工具以 mcp__<server>__<tool> 命名,可直接写进权限规则。Claude Code 自身也能 claude mcp serve 作为 MCP server 被别的客户端调用。

14.3 Hooks

在生命周期固定点运行的确定性逻辑,不依赖模型"记得"去做。三种节奏:每会话(SessionStart / SessionEnd)、每轮(UserPromptSubmit / Stop)、每次工具调用(PreToolUse / PostToolUse);另有 PermissionRequest、SubagentStart/Stop、PreCompact/PostCompact、Notification、FileChanged 等。处理器类型五种:

command

Shell 命令

stdin 收 JSON,exit 0 放行、exit 2 阻断并把 stderr 反馈给模型。

http

HTTP POST

事件 JSON 作为请求体,响应体用同一 JSON 输出格式。

mcp_tool

MCP 工具

调用已配置 MCP server 上的工具。

prompt

单轮模型判断

把事件交给 Claude 做一次 JSON 决策。

agent

验证子代理

派生能用 Read/Grep 的子代理核实条件(实验性)。

// .claude/settings.json:每次 Edit/Write 后自动格式化
{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write",
    "hooks": [ { "type": "command", "command": "npx prettier --write \"$(jq -r .tool_input.file_path)\"" } ] } ] } }

14.4 Subagents

通过 Agent 工具派生的独立工作者:自己的上下文窗口、自己的 system prompt(Markdown 正文)、可限定工具集与模型、可 isolation: worktree 在独立 git worktree 里改代码、可前台或后台运行。内置有 Explore(只读、快速搜索,quick / medium / very thorough 三档)、Plan(plan mode 下调研)、general-purpose 等。定义放在 .claude/agents/*.md 或 ~/.claude/agents/:

---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---
You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.

Fork 是特殊的子代理:它复制当前对话与 system prompt 作为起点,适合"带着全部背景去做一件旁支任务",结果同样以摘要形式回到主线。这对应《Building effective agents》中的 orchestrator-workers 模式:主代理动态拆分任务、派给工人、汇总结果。

15Agent SDK 与控制协议

Claude Agent SDK(Python / TypeScript)不是重新实现一遍 Agent,而是捆绑原生 Claude Code 二进制,以子进程方式驱动它。从开源的 claude-agent-sdk-python 源码可以看到其结构:

claude_agent_sdk/
├── query.py / client.py          # 对外 API:一次性 query() 与长连接 ClaudeSDKClient
├── types.py                      # ClaudeAgentOptions、消息与内容块类型
└── _internal/
    ├── transport/subprocess_cli.py   # 启动 claude 进程,stdin/stdout 走 stream-json
    ├── query.py                      # 双向控制协议:control_request / control_response
    ├── message_parser.py             # JSON 行 → AssistantMessage / ResultMessage …
    ├── sdk_mcp_bridge.py             # 进程内自定义工具以 SDK MCP server 暴露给 CLI
    └── session_store.py / sessions.py # 会话转录镜像、resume / fork

SDK 与 CLI 之间除了普通消息流,还有一条控制通道,在 _internal/query.py 中可见的请求子类型包括:

方向subtype作用
SDK → CLIinitialize握手,注册 hooks、agents 等
SDK → CLIinterrupt · set_permission_mode · set_model · rewind_files运行中打断、切换权限模式/模型、回退文件
CLI → SDKcan_use_tool需要审批时回调宿主的 canUseTool
CLI → SDKhook_callback触发宿主进程内注册的 hook 函数
CLI → SDKmcp_message把 MCP JSON-RPC 转发给进程内 SDK MCP server

这说明 Claude Code 的核心循环只有一份实现,终端 TUI、IDE、SDK、CI 都是同一个循环的不同"前端"——这也是官方反复强调"the underlying agentic loop is identical"的原因。

16一次请求的完整时序

场景:在仓库里运行 claude,输入"修复 auth 模块失败的测试",权限模式 default,开启 sandbox。

  1. 启动:加载 settings 各层(managed › CLI › local › project › user),合并权限规则;运行 SessionStart hooks;连接 MCP servers(只取工具名);扫描 skills / agents 描述;新建会话 JSONL。
  2. 组装上下文:system prompt + 核心工具 schema + CLAUDE.md 链 + MEMORY.md 前 200 行 + git status 快照 + skill 描述 → 打上缓存断点。
  3. 提交 prompt:UserPromptSubmit hook 可注入额外上下文;创建 checkpoint。
  4. Turn 1 · 收集:模型(可能带 thinking)输出 Bash: npm test -- auth;Bash 不在 allow 列表 → 弹出审批 → 用户选"Yes, and don't ask again"写入 settings.local.json;在 Seatbelt/bubblewrap 内执行;PostToolUse;结果作为 tool_result 回填。
  5. Turn 2 · 定位:模型并行发出 Grep "validateToken" 与 Read auth.ts、Read auth.test.ts;只读工具在工作目录内免审批,并发执行。
  6. Turn 3 · 行动:Edit auth.ts(old_string → new_string);编辑前快照文件;审批通过;PostToolUse hook 自动 prettier;LSP 返回诊断(如有)。
  7. Turn 4 · 验证:再次 Bash npm test -- auth,命中刚保存的 allow 规则,直接执行,全部通过。
  8. 结束:模型输出不含工具调用的文本总结;Stop hook 运行(可要求继续);ResultMessage 记录 usage 与成本;对话与快照落盘,可 --continue 恢复或 /rewind 回退。

如果此过程中上下文接近上限:PreCompact → 清理旧工具输出 → 摘要历史 → 重新注入 CLAUDE.md、memory、最近 5 个文件、skill 正文 → compact_boundary → 循环继续,用户无感。

17设计取舍与最佳实践

设计选择理由(官方表述/工程原则)
单循环 + 强工具,而非复杂工作流图《Building effective agents》:"从最简单的方案开始,只在需要时增加复杂度";成功的实现多用简单可组合的模式而非重框架
模型自主决定下一步编码任务的子任务不可预知,适合 agent 而非固定 workflow;靠环境反馈(测试结果、报错)判断进展
agentic search 代替预建索引Glob/Grep/Read 即时检索,始终看到最新代码,无需维护向量库
精确替换的 Edit 工具差异小、可审阅、可快照,失败可明确报错
deny 优先 + 多层设置 + 沙箱组织策略不可被个人或命令行覆盖;权限和隔离双保险
持久规则写文件、而非靠对话压缩会丢细节;CLAUDE.md 每次请求重新注入
扩展按需加载保护注意力预算;工具越多、描述越长,模型越难选对

使用建议

参考资料