乐于分享
好东西不私藏

AI 工程进化论 第3讲:Claude Code 拆解 — 终端里的执行闭环是怎么工作的

AI 工程进化论 第3讲:Claude Code 拆解 — 终端里的执行闭环是怎么工作的

导读

这是《AI 工程进化论》第 3 讲。 第1讲说了执行四条件,第2讲说了工具标准化。这一讲接上:Claude Code 作为第一个真正工程可用的终端 agent,它的内部是怎么组织的。 不讲怎么用,讲它为什么这样设计,边界在哪里,trap 在哪里。适合用过 Claude Code、想知道背后机制的人。

从一个真实场景开始

你给 Claude Code 发了一条指令:”修掉这个 bug,顺带把相关测试跑一遍。”

它开始读文件。读完了开始改。改了之后跑测试。测试报错了。它看到报错,重新读了几个文件,又改了一处。再跑测试。这次通过了。

这不是一次性生成,是一个循环。循环的每一轮,模型根据上一轮的 tool result 决定下一步做什么,不是预设的固定流程。

理解这个循环,是用好 Claude Code 的前提。


循环的序列图

下面是一个完整修复循环的实际发生序列:

这个图里有几件值得注意的事:

每次 tool_call 之后,模型在看结果做判断。 “测试失败”这条返回,不只是告诉它”错了”,而是让它的下一轮推理多了一个信息点——报错内容、哪个用例、什么错误类型。这和人类工程师 debug 的思维过程是同构的。

循环次数不预设。 图里它跑了两次测试才成功,这不是脚本写的,是模型根据每次结果动态决定的。有时候可能是十次。

“Think” 阶段不是独立的 tool_call,是模型内部的推理。 你看不到它,但它确实在每次 tool 返回之后、下一轮 tool 发出之前发生。


工具是闭环的原因,不是装饰

没有工具的 Claude Code,能力上限就是对话。

有工具之后,它能操作真实环境。文件、Bash 命令、Git 操作、Web 搜索——这些是它闭环的介质。

内置工具分五类,这个划分不是随意的:

文件 + Bash:这两类是直接改变环境状态的操作,是真正有副作用的。Edit 一个文件或跑一条 rm -rf,状态就变了,不可逆。

搜索(Glob / Grep):不改变状态,只获取信息。这类的风险边界很清楚:不会造成破坏。

Web(Search / Fetch):从外部补充信息,同样只读不写。

代码智能:依赖语言服务插件,属于增强能力,不是核心环。

这个分类的真正含义是:越靠前的类别,危险越大,权限控制越严。你在 session 里看到的那些”是否允许执行”的提示,背后的逻辑就是这个分层。


Session 的两个真实问题

Session 是上下文保持机制,但它有两个实际问题你迟早会遇到。

问题一:上下文断在哪里

随着 session 变长,上下文窗口会接近上限。Claude Code 自动压缩:先清理旧的 tool outputs(这些通常最长),再不够就对整个对话做摘要。

这个机制有一个 trap:早期说过的关键约束,可能在压缩里丢掉

比如你在 session 开始时说”这个项目的数据库是只读的,不允许任何写操作”。跑了三十轮之后,如果上下文被压缩,Claude 可能不再记得这条约束。它可能会尝试执行写操作——不是因为它故意违背,是因为它不记得了。

工程上正确的做法:关键约束写进 CLAUDE.md,不写进对话。CLAUDE.md 不会被自动压缩,每次 session 都会重新加载。

问题二:Checkpoint 不覆盖 git

Claude Code 在修改文件前会快照原文件,按两次 Esc 可以回滚。但这个快照是 session 级的本地机制,不等于 git commit。

trap 在这里:如果你在一个 session 里做了大量修改,然后切换了 git 分支,再切回来——那个 session 的 checkpoint 已经没了。checkpoint 只在同一个 session 内有效。

正确流程:重要节点主动 git commit,不要把 checkpoint 当成版本控制的替代品。


权限系统: trap 在团队场景

Claude Code 有四个权限档位,按 Shift+Tab 循环切换:

Default:文件修改和 shell 命令都需要确认。

Auto-accept edits:mkdir、mv 这类常见文件操作自动通过,其他命令仍需确认。

Plan mode:只读工具,生成行动计划等你批准后再执行。

Auto mode:全自动——目前是研究预览,不建议在正式场景用。

真正的 trap 在团队配置里。

开源版和团队版的差距不在模型能力,在权限粒度。.claude/settings.json 里可以预配置允许的命令白名单——比如 npm testgit status 这类高频信任操作,不需要每次点确认。

但这里有个边界:预配置的命令如果包含了有副作用的操作(比如 git push --force),等于开门让人走。

团队部署时的必做项:逐条审查允许的命令列表,不能直接用社区分享的默认配置


MCP 扩展:工具上限由你决定

第2讲讲了 MCP 协议,Claude Code 原生支持。

内置工具是基础,MCP Server 是扩展层。在 .claude/settings.json 里配一个 MCP Server,不需要改 agent 代码,工具列表自动增加。

这个设计的含义是:Claude Code 的能力上限不是固定的,是开放的

你接一个数据库 MCP Server,它就能查 schema;接一个 GitHub MCP Server,它就能操作 issue 和 PR;接一个 Slack MCP Server,它就能发消息。

对于需要接入内部系统的工程师来说,这个扩展性是实际落地的关键——不是写死的功能,是按需接入的架构。


三件事能带走

1. 循环是 Claude Code 的心脏,但循环次数不预设

不要假设它跑一轮就完成。给任务时想清楚:什么算完成?验证条件是什么?在指令里给出这些,比给一个模糊目标更有效。

2. 关键约束写 CLAUDE.md,不写对话

对话会被压缩,CLAUDE.md 不会。这是 Session 机制里最容易被忽略的 trap,也是出问题之后最难追溯的根因。

3. 权限白名单是团队部署的门槛

.claude/settings.json 里的允许命令列表,是 Claude Code 从”个人工具”变成”团队工具”的分界线。这个字段不能交给社区默认配置,要自己审。


下一讲:多智能体协作——并行 agent 怎么分工


Claude Code 架构来源:code.claude.com/docs/en/how-claude-code-works(2026-04-25 核实)。内置工具分类、Session 存储路径、权限模式、Checkpoint 机制、上下文压缩均来自该文档。