
Claude Code 最新架构观察:while-loop 只是表层,真正重要的是运行时
很多人讲 Claude Code 架构时,会把它简化成一个 while-loop:
- 读上下文;
- 调工具;
- 看结果;
- 再决定下一步。
这个说法有用,但只讲到了骨架。真正让 Claude Code 变得好用的,是骨架外面的运行时:上下文怎么进来、工具怎么被授权、哪些动作能被 hook 拦住、什么时候压缩历史、怎样让 subagent 隔离大规模读取、MCP 和 skills 怎么降低重复劳动。
如果你只学会“让模型循环调用工具”,很快就会撞到工程边界。
官方架构:gather、act、verify
Claude Code 文档把 agentic loop 拆成三段:gather context、take action、verify results。更准确地说,它们不是线性阶段,而是反复交织。
这就是 Claude Code 和普通聊天模型的区别:它不是只生成答案,而是能读取仓库、修改文件、运行命令、看错误、再回头修正。
但真正的难点不在“能不能循环”,而在循环中的每个边界。
运行时分层
| 层级 | 作用 | 常见工具或机制 | 失败时的表现 |
|---|---|---|---|
| 模型层 | 推理、规划、代码生成 | Sonnet、Opus、Fable | 想错、过度自信、成本过高 |
| 上下文层 | 给模型提供事实 | CLAUDE.md、auto memory、file reads、MCP tool names、skill descriptions | 读错文件、上下文挤爆、旧规则残留 |
| 工具层 | 执行外部动作 | Read、Edit、Bash、MCP、browser、GitHub | 误写、误删、误调用 |
| 权限层 | 控制能做什么 | allow / ask / deny、permission modes、sandbox | 该拦没拦,或该放行被卡住 |
| 扩展层 | 固化流程和外部系统 | skills、hooks、subagents、MCP | 工具太多、规则冲突、不可审计 |
| 会话层 | 让任务跨时间持续 | resume、fork、compact、worktree | 记忆丢失、分支冲突、上下文污染 |
Claude Code 的强点,是这些层都已经产品化。你可以只用默认模式,也可以慢慢把团队规范塞进 CLAUDE.md、skills、hooks 和 MCP 里。
上下文不是越多越好
Claude Code 的 context window 包含很多你在终端里看不到的东西:启动时加载的 CLAUDE.md、auto memory、MCP tool names、skill descriptions、文件读取结果、path-scoped rules、hook 注入内容、模型自己的回答。
这带来一个重要结论:上下文是运行时资源,不是垃圾桶。
| 进入上下文的内容 | 价值 | 风险 |
|---|---|---|
| 根级 CLAUDE.md | 稳定团队规范 | 写太多会挤占任务空间 |
| nested CLAUDE.md | 子目录专用规则 | compaction 后要重新触发才回来 |
| skill body | 重复流程标准化 | 过长会被截断,重要内容必须放前面 |
| file reads | 当前任务事实 | 大文件会快速消耗窗口 |
| MCP tool names | 外部能力可见 | 工具太多会增加选择噪音 |
| hook context | 自动补充事实 | 不透明注入会让调试变难 |
官方 context window 文档里有个很实用的提醒:subagent 可以把大规模研究放在自己的 context window 里,主 session 只拿摘要回来。这是长任务里非常关键的设计。
compaction 后什么会留下
长会话一定会压缩。问题不是会不会 compact,而是 compact 后哪些信息还能回来。
| 机制 | compact 后状态 | 建议 |
|---|---|---|
| system prompt / output style | 不受影响 | 用来放稳定行为风格 |
| 根级 CLAUDE.md | 从磁盘重新注入 | 关键团队规则放这里 |
| auto memory | 从磁盘重新注入 | 保留构建命令、调试经验 |
| path-scoped rules | 等文件再次被读才回来 | 不要把全局规则放这里 |
| nested CLAUDE.md | 等对应目录文件被读才回来 | 子系统规则可以放,但别依赖它全局生效 |
| skill body | 重新注入但有 token cap | 最重要的指令放在 SKILL.md 顶部 |
| hooks | 不作为上下文保存 | 用来执行,而不是保存记忆 |
所以一个成熟仓库的规则布局应该很克制:根级 CLAUDE.md 写少量硬规则;子目录规则写本地约束;Skill 写流程;hook 做机器检查。
权限系统才是 Agent 的刹车
Claude Code 的权限不是提示词。提示词可以影响模型想做什么,权限系统决定它实际能不能做。
官方权限文档把规则分成 allow、ask、deny,并且按 deny、ask、allow 的顺序判断。Read-only 通常不需要审批;Bash、文件修改和外部写入则要受规则控制。
| 权限模式 | 适合场景 | 不适合 |
|---|---|---|
| default | 日常开发,首次工具调用要确认 | 高速批量任务 |
| plan | 先读、先分析、不改文件 | 需要快速修小 bug |
| acceptEdits | 工作目录内常规编辑 | 高风险仓库 |
| dontAsk | 只允许预先批准的工具 | 临时探索 |
| auto | 有背景安全检查的自动批准预览 | 不能承受误操作的任务 |
| bypassPermissions | 容器或 VM 里的隔离实验 | 本机真实项目、生产目录 |
我更倾向于把权限当成“工程策略”而不是个人偏好。比如团队可以规定:PR review agent 永远不能 push 主分支;数据库 MCP 默认只读;部署命令必须 ask;删除命令必须 deny。
hooks 是运行时拦截器
Hooks 让 Claude Code 在生命周期关键点执行 shell、HTTP endpoint 或 prompt-based / agent-based logic。事件很多,从 SessionStart、UserPromptSubmit、PreToolUse、PostToolUse,到 FileChanged、WorktreeCreate、PreCompact、SessionEnd。
这已经不是“自动格式化”这么简单,而是一个运行时拦截系统。
| Hook 点 | 适合做什么 | 不适合做什么 |
|---|---|---|
| SessionStart | 加载环境、检查依赖、提醒工作区状态 | 做长时间任务 |
| UserPromptSubmit | 补充项目上下文、校验输入 | 悄悄改写用户意图 |
| PreToolUse | 阻止危险命令、检查权限 | 每次都跑重测试 |
| PostToolUse | 格式化、记录审计、触发轻量检查 | 无限制启动后台任务 |
| FileChanged | 更新索引、通知相关系统 | 直接提交代码 |
| PreCompact | 保存关键状态摘要 | 写入大量噪音 |
| SessionEnd | 输出工作报告、清理临时资源 | 影响真实业务状态 |
Hook 设计得好,Claude Code 会更像一个有护栏的工程环境;设计得差,它会变成隐形副作用来源。
Skills、MCP、subagents 该怎么分工
Medium 上关于 Claude Code skills 的一篇文章说得很对:Skill 不是“一个 markdown 文件”那么简单,它更像一个可复用设计模式。我的理解是:
| 能力 | 最适合承载什么 | 判断标准 |
|---|---|---|
| CLAUDE.md | 稳定项目规范 | 每个 session 都应该知道 |
| Skill | 可复用流程 | 不是每次都要加载,但触发时要很具体 |
| MCP | 外部系统状态和工具 | Agent 需要读/写真实系统 |
| Hook | 生命周期自动动作 | 必须在某个事件点执行 |
| Subagent | 大规模研究或专门角色 | 不想污染主上下文 |
| Worktree | 并行改动隔离 | 多个 session 不应互相覆盖 |
一个常见反模式是把所有规则都塞进 CLAUDE.md。这样简单,但会让每个任务都背着一大包无关上下文。更好的做法是分层加载:通用规则常驻,场景规则 Skill 化,大文件研究 subagent 化,外部状态 MCP 化。
推荐的团队架构
我会这样落地:
- 根级 CLAUDE.md 只写 20 条以内的硬规则。
- 每个高频流程写成 Skill:PR review、UI 验收、部署检查、事故复盘。
- MCP 只接真正需要外部状态的系统。
- PreToolUse hook 拦危险命令,PostToolUse hook 做轻量验证。
- 大规模代码研究交给 subagent,主 session 只接收摘要。
- 并行任务用 worktree,避免多个 Agent 写同一个目录。
我的判断
Claude Code 的核心竞争力不是“模型会写代码”,而是它越来越像一个完整的 agentic runtime:模型只是其中一层,真正决定可用性的,是上下文、权限、工具、hooks、skills、subagents 和会话管理。
while-loop 可以解释 Agent 的基本动作,但解释不了生产可用性。能把运行时边界设计清楚的团队,才会真正从 Claude Code 里拿到复利。
来源
- Claude Code Docs:How Claude Code works
https://code.claude.com/docs/en/how-claude-code-works - Claude Code Docs:Explore the context window
https://code.claude.com/docs/en/context-window - Claude Code Docs:Configure permissions
https://code.claude.com/docs/en/permissions - Claude Code Docs:Hooks reference
https://code.claude.com/docs/en/hooks - Claude Code Docs:Common workflows
https://code.claude.com/docs/en/common-workflows - Medium:What the docs don’t tell you about Claude Code skills
https://medium.com/data-science-collective/what-the-docs-dont-tell-you-about-claude-code-skills-235d1278162b - Medium:Building a Production Agent Harness
https://medium.com/@licaomeng/building-a-production-agent-harness-turning-claude-code-into-a-multi-agent-engineering-pipeline-1db4e242d08a