<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>源码分析 on 鬼哥的空间</title><link>https://guige.ai/tags/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</link><description>Recent content in 源码分析 on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://guige.ai/tags/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/index.xml" rel="self" type="application/rss+xml"/><item><title>解剖 Claude Code（三）：Prompt 缓存分割与四级上下文压缩</title><link>https://guige.ai/p/cc-anatomy-03/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/cc-anatomy-03/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 解剖 Claude Code（三）：Prompt 缓存分割与四级上下文压缩" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;一个 AI Agent 的核心竞争力不在于它调用了多好的模型，而在于它的主循环有多健壮。Claude Code 的心脏是 &lt;code&gt;query.ts&lt;/code&gt; 中一个 1,700 行的 &lt;code&gt;while(true)&lt;/code&gt; 循环——本篇逐阶段拆解它。&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;本文为「解剖 Claude Code」系列第三篇。前篇：&lt;a class="link" href="https://guige.ai/p/cc-anatomy-02/" &gt;解剖 Claude Code（二）：ReAct 循环&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="问题"&gt;问题
&lt;/h2&gt;&lt;p&gt;一个典型的 Claude Code 会话可能持续几十轮。每一轮都要把完整的系统提示、对话历史、工具定义发给 API。如果不做优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统提示&lt;/strong&gt;：~10K Token，每轮都重复发送&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具定义&lt;/strong&gt;：50 个工具的 Schema，~15K Token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对话历史&lt;/strong&gt;：逐轮增长，最终撑爆上下文窗口（200K Token）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不做缓存 = 每轮重复支付这些 Token 的输入费用。不做压缩 = 对话最终无法继续。&lt;/p&gt;
&lt;p&gt;Claude Code 的解法是两套机制联合工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prompt 缓存分割&lt;/strong&gt;：把不变的部分标记为全局可缓存，只为变化的部分付费&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;四级上下文压缩&lt;/strong&gt;：当对话增长时，逐级压缩保留核心信息&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="在整体架构中的位置"&gt;在整体架构中的位置
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ReAct 循环的每一轮：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 上下文准备 ← 四级压缩在这里运行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: 模型调用 ← 缓存分割在这里生效
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="part-1prompt-缓存分割"&gt;Part 1：Prompt 缓存分割
&lt;/h2&gt;&lt;h3 id="核心思想静态-vs-动态"&gt;核心思想：静态 vs 动态
&lt;/h3&gt;&lt;p&gt;Claude Code 将系统提示在物理上分为两部分，用一个边界标记隔开：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;┌─────────────────────────────────────────────────┐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;STATIC&lt;/span&gt;&lt;span class="err"&gt;（全局缓存，&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;身份声明（&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are an interactive agent...&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;系统指南（工具使用、权限、压缩规则）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;任务执行指南&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;操作安全指南（可逆性、爆炸半径）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;工具使用规范（&lt;/span&gt;&lt;span class="n"&gt;Bash&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt; &lt;span class="err"&gt;专用工具）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;语气风格（无&lt;/span&gt; &lt;span class="n"&gt;emoji&lt;/span&gt;&lt;span class="err"&gt;、简洁）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;输出效率指南&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├────&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_PROMPT_DYNAMIC_BOUNDARY&lt;/span&gt; &lt;span class="err"&gt;──────────────┤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;DYNAMIC&lt;/span&gt;&lt;span class="err"&gt;（不缓存，每轮重新计算）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;会话引导（&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt; &lt;span class="err"&gt;类型相关指令）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;记忆内容（&lt;/span&gt;&lt;span class="n"&gt;loadMemoryPrompt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;环境信息（模型&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="err"&gt;、平台、&lt;/span&gt;&lt;span class="n"&gt;Shell&lt;/span&gt;&lt;span class="err"&gt;、&lt;/span&gt;&lt;span class="ne"&gt;OS&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="n"&gt;MCP&lt;/span&gt; &lt;span class="err"&gt;服务器指令（服务器随时连接&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;断开）&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="n"&gt;Scratchpad&lt;/span&gt; &lt;span class="err"&gt;目录&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;语言偏好&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;·&lt;/span&gt; &lt;span class="err"&gt;输出风格&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└─────────────────────────────────────────────────┘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="Prompt 缓存分割策略" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-03/03-cache-split.webp" srcset="https://guige.ai/p/cc-anatomy-03/03-cache-split_hu_9a22ac7bf0f61851.webp 800w, https://guige.ai/p/cc-anatomy-03/03-cache-split_hu_881ce560e35fc750.webp 1600w, https://guige.ai/p/cc-anatomy-03/03-cache-split_hu_44c7bc64a9fd245.webp 2400w, https://guige.ai/p/cc-anatomy-03/03-cache-split.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;边界标记&lt;/strong&gt;是一个常量字符串：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SYSTEM_PROMPT_DYNAMIC_BOUNDARY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="三种缓存范围"&gt;三种缓存范围
&lt;/h3&gt;&lt;p&gt;系统提示被分割成最多 4 个 &lt;code&gt;TextBlockParam&lt;/code&gt;，每个有不同的 &lt;code&gt;cache_control&lt;/code&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;块&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;th&gt;cache_control.scope&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;归属头（Attribution）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;不缓存，每请求元数据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;CLI 前缀&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;不缓存&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;静态内容（边界前）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;'global'&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;跨组织缓存&lt;/strong&gt;，所有用户共享&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;动态内容（边界后）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;不缓存，用户/会话特定&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;为什么分 &lt;code&gt;global&lt;/code&gt; 和 &lt;code&gt;org&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;global&lt;/code&gt; 缓存：所有 Anthropic 1P 用户共享。当你发送和另一个用户完全相同的静态系统提示时，直接命中缓存——零写入成本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;org&lt;/code&gt; 缓存：组织内共享（Bedrock/Vertex 3P 用户的默认）&lt;/li&gt;
&lt;li&gt;无 scope（&lt;code&gt;ephemeral&lt;/code&gt;）：仅当前请求链，5 分钟 TTL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;cache_control 的返回结构&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ephemeral&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1h&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 符合条件时升级到 1 小时
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;global&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 1P 用户的静态内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="ttl-升级从-5-分钟到-1-小时"&gt;TTL 升级：从 5 分钟到 1 小时
&lt;/h3&gt;&lt;p&gt;默认 TTL 是 5 分钟（ephemeral）。对于付费订阅用户，可以升级到 &lt;strong&gt;1 小时&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;升级条件&lt;/strong&gt;（三项都要满足）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;内部用户 或 Claude AI 订阅者（非超额使用）&lt;/li&gt;
&lt;li&gt;查询来源在 GrowthBook 白名单内（&lt;code&gt;repl_main_thread*&lt;/code&gt;, &lt;code&gt;agent:*&lt;/code&gt; 等）&lt;/li&gt;
&lt;li&gt;Bedrock 3P 用户需显式 opt-in&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;为什么 TTL 决策要&amp;quot;锁存&amp;quot;（latch）？&lt;/strong&gt; 如果用户在会话中途切换了订阅状态（如用量超额），TTL 可能从 1h 变回 5m，导致 ~20K Token 的缓存前缀失效。锁存确保 TTL 在整个会话中保持稳定。&lt;/p&gt;
&lt;h3 id="section-缓存机制"&gt;Section 缓存机制
&lt;/h3&gt;&lt;p&gt;动态部分内部也有缓存优化。每个 prompt section 分为两类：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 缓存 section：会话级别复用，/clear 或 /compact 时失效
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;systemPromptSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;env_info&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sb"&gt;`Model: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;modelId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;, Platform: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;...`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 非缓存 section（危险！每轮重算）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;DANGEROUS_uncachedSystemPromptSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mcp_instructions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;buildMcpInstructions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mcpClients&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;MCP servers connect/disconnect mid-session&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么 MCP 指令不能缓存？&lt;/strong&gt; 因为 MCP 服务器可能在会话中途连接或断开。如果缓存了旧的服务器列表，模型会尝试调用不存在的工具。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DANGEROUS_&lt;/code&gt; 前缀是刻意的命名——它强制开发者思考&amp;quot;为什么这个 section 不能缓存&amp;quot;，并通过第二个参数写下原因。&lt;/p&gt;
&lt;h3 id="工具-schema-的缓存稳定性"&gt;工具 Schema 的缓存稳定性
&lt;/h3&gt;&lt;p&gt;第 02 篇提到，工具注册表按名称排序以保护 Prompt Cache。这里看看具体怎么做的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具 Schema 通过 &lt;code&gt;getToolSchemaCache()&lt;/code&gt; 会话级缓存&lt;/li&gt;
&lt;li&gt;缓存 key 是 &lt;code&gt;${tool.name}:${jsonStringify(schema)}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每次请求只叠加 &lt;code&gt;defer_loading&lt;/code&gt;、&lt;code&gt;cache_control&lt;/code&gt;、&lt;code&gt;eager_input_streaming&lt;/code&gt; 等运行时属性&lt;/li&gt;
&lt;li&gt;如果工具列表稳定（名称和 Schema 不变），缓存前缀不受影响&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缓存断裂检测&lt;/strong&gt;：系统还有一个 &lt;code&gt;promptCacheBreakDetection.ts&lt;/code&gt; 模块，监控 &lt;code&gt;cache_read_input_tokens&lt;/code&gt; 的变化。如果缓存读取 Token 骤降 &amp;gt; 2,000 且 &amp;lt; 上次的 95%，说明缓存被打破了——系统会记录事件用于诊断。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="part-2四级上下文压缩"&gt;Part 2：四级上下文压缩
&lt;/h2&gt;&lt;p&gt;当对话持续增长，四级压缩体系逐级介入：&lt;/p&gt;
&lt;p&gt;&lt;img alt="四级压缩体系" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-03/03-four-levels.webp" srcset="https://guige.ai/p/cc-anatomy-03/03-four-levels_hu_95b395bcbf1d24bc.webp 800w, https://guige.ai/p/cc-anatomy-03/03-four-levels_hu_ea7c60a17c6e00bc.webp 1600w, https://guige.ai/p/cc-anatomy-03/03-four-levels_hu_59c5fb731708f7d6.webp 2400w, https://guige.ai/p/cc-anatomy-03/03-four-levels.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;h3 id="触发阈值"&gt;触发阈值
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;上下文窗口 = 200,000 Token（默认）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;摘要预留 = 20,000 Token（给压缩模型留空间）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;有效窗口 = 200,000 - 20,000 = 180,000 Token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;自动压缩阈值 = 180,000 - 13,000 = 167,000 Token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;阈值&lt;/th&gt;
 &lt;th&gt;值&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;AUTOCOMPACT_BUFFER_TOKENS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;13,000&lt;/td&gt;
 &lt;td&gt;自动压缩的缓冲区&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;WARNING_THRESHOLD_BUFFER_TOKENS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;20,000&lt;/td&gt;
 &lt;td&gt;UI 警告阈值&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ERROR_THRESHOLD_BUFFER_TOKENS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;20,000&lt;/td&gt;
 &lt;td&gt;UI 错误阈值&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MANUAL_COMPACT_BUFFER_TOKENS&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3,000&lt;/td&gt;
 &lt;td&gt;手动压缩的阻塞阈值&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;熔断器上限&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="第一级snip轻量裁剪"&gt;第一级：Snip（轻量裁剪）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;特性门控&lt;/strong&gt;：&lt;code&gt;HISTORY_SNIP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最轻量的压缩——直接移除旧消息。不做摘要，不做总结，就是删除。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保留最近的消息不动&lt;/li&gt;
&lt;li&gt;释放的 Token 数（&lt;code&gt;snipTokensFreed&lt;/code&gt;）传给后续阶段，影响 Autocompact 的触发判断&lt;/li&gt;
&lt;li&gt;如果 Snip 已经释放了足够空间，Autocompact 就不需要触发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么最先运行？&lt;/strong&gt; 因为它最快（零 API 调用），且对缓存无影响。&lt;/p&gt;
&lt;h3 id="第二级microcompact缓存感知压缩"&gt;第二级：Microcompact（缓存感知压缩）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心创新&lt;/strong&gt;：在不打破 Prompt Cache 的前提下压缩工具结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可压缩的工具&lt;/strong&gt;：FileRead、FileWrite、FileEdit、Bash、Grep、Glob、WebSearch、WebFetch&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两种模式&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;时间触发压缩&lt;/strong&gt;：如果距离上次 API 调用超过缓存 TTL，服务器缓存已过期。此时全量重写前缀不会有额外成本——因此可以直接清理旧工具结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缓存编辑压缩&lt;/strong&gt;（Cache Editing，仅内部用户）：利用 API 的 &lt;code&gt;cache_edits&lt;/code&gt; 功能，在不失效缓存的情况下删除工具结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 不是替换缓存内容，而是发送编辑指令
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cache_edits&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;edits&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;delete&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cache_reference&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tool_use_abc123&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;// 要删除的工具结果 ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这意味着：缓存前缀完全保持不变，只通过 &lt;code&gt;cache_reference&lt;/code&gt; 标记哪些工具结果已经不需要了。API 服务器会在应用缓存时跳过被删除的部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么这很重要？&lt;/strong&gt; 传统做法是修改消息内容来&amp;quot;清空&amp;quot;工具结果——但这会改变消息的 hash，导致整个缓存失效。Cache Editing 绕过了这个问题。&lt;/p&gt;
&lt;h3 id="第三级autocompactai-全量摘要"&gt;第三级：Autocompact（AI 全量摘要）
&lt;/h3&gt;&lt;p&gt;当 Token 超过阈值（默认 ~167K），触发 AI 全量摘要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;触发条件&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;tokenCount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;getAutoCompactThreshold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 其中 threshold = effectiveWindow - AUTOCOMPACT_BUFFER_TOKENS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// = (contextWindow - 20K) - 13K
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;排除场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前查询本身就是压缩查询（防止递归）&lt;/li&gt;
&lt;li&gt;Session memory 查询&lt;/li&gt;
&lt;li&gt;Context agent（&lt;code&gt;marble_origami&lt;/code&gt;）查询&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;摘要模板&lt;/strong&gt;（9 个分区）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;analysis&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[模型的思考过程——最终会被剥离]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/analysis&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Primary Request and Intent — 用户的所有显式请求
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. Key Technical Concepts — 讨论过的技术和框架
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. Files and Code Sections — 查看/修改的文件（含代码片段）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. Errors and Fixes — 遇到的错误及修复方式
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. Problem Solving — 已解决和进行中的问题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6. All User Messages — 所有非工具结果的用户消息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7. Pending Tasks — 明确的待办任务
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8. Current Work — 压缩前正在做什么
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9. Optional Next Step — 下一步建议（仅当与最近请求一致时）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;强制文本输出&lt;/strong&gt;：摘要 Prompt 开头有一段&amp;quot;反工具声明&amp;quot;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CRITICAL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Respond&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;TEXT&lt;/span&gt; &lt;span class="n"&gt;ONLY&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Do&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Tool&lt;/span&gt; &lt;span class="n"&gt;calls&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;REJECTED&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;waste&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;turn&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;fail&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;末尾还有 REMINDER 重复一次——双重保险。因为压缩调用本身也消耗 Token 和时间，如果模型在这里&amp;quot;开小差&amp;quot;调工具，代价极高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;摘要后的智能恢复&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;压缩完成后，系统不是简单地用摘要替换历史。它会&lt;strong&gt;恢复最重要的信息&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;恢复项&lt;/th&gt;
 &lt;th&gt;上限&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;最近读取的文件&lt;/td&gt;
 &lt;td&gt;最多 5 个文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;文件恢复总预算&lt;/td&gt;
 &lt;td&gt;50,000 Token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单文件预算&lt;/td&gt;
 &lt;td&gt;5,000 Token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Skill 恢复预算&lt;/td&gt;
 &lt;td&gt;25,000 Token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单 Skill 预算&lt;/td&gt;
 &lt;td&gt;5,000 Token&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;熔断器&lt;/strong&gt;：如果 Autocompact 连续失败 3 次（&lt;code&gt;MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES&lt;/code&gt;），停止尝试。防止&amp;quot;压缩失败 → 重试 → 又失败&amp;quot;的无限循环。&lt;/p&gt;
&lt;h3 id="第四级reactive-compact紧急-413-压缩"&gt;第四级：Reactive Compact（紧急 413 压缩）
&lt;/h3&gt;&lt;p&gt;当 API 返回 413 Prompt Too Long 错误后触发——这是最后手段。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;与 Autocompact 的区别&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Autocompact&lt;/th&gt;
 &lt;th&gt;Reactive Compact&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;触发时机&lt;/td&gt;
 &lt;td&gt;API 调用前（预防性）&lt;/td&gt;
 &lt;td&gt;API 返回 413 后（响应性）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;触发条件&lt;/td&gt;
 &lt;td&gt;Token &amp;gt; 阈值&lt;/td&gt;
 &lt;td&gt;API 报错&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;可用次数&lt;/td&gt;
 &lt;td&gt;多次&lt;/td&gt;
 &lt;td&gt;每轮一次（&lt;code&gt;hasAttemptedReactiveCompact&lt;/code&gt;）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;图片处理&lt;/td&gt;
 &lt;td&gt;不处理&lt;/td&gt;
 &lt;td&gt;可剥离图片/PDF&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Token 差距计算&lt;/td&gt;
 &lt;td&gt;不需要&lt;/td&gt;
 &lt;td&gt;从 413 错误信息解析&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Token 差距计算&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;getPromptTooLongTokenGap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 从 &amp;#34;prompt is too long: 137500 tokens &amp;gt; 135000 maximum&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 提取出 gap = 137500 - 135000 = 2500
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;利用这个 gap，系统可以精确计算需要删除多少消息组，而不是盲目地一组一组删除。如果 gap 无法解析（Bedrock/Vertex 的错误格式不同），回退到&amp;quot;删除 20% 的消息组&amp;quot;策略。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图片/PDF 剥离&lt;/strong&gt;：对于 Media Size Error，直接将图片块替换为 &lt;code&gt;[image]&lt;/code&gt;、文档块替换为 &lt;code&gt;[document]&lt;/code&gt; 文本标记。这不是压缩——是放弃媒体内容以换取请求可以通过。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="token-成本的数学"&gt;Token 成本的数学
&lt;/h2&gt;&lt;p&gt;来算一笔账。以 Sonnet 4.6 为例：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Token 类型&lt;/th&gt;
 &lt;th&gt;价格（$/百万）&lt;/th&gt;
 &lt;th&gt;相对比&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;输入&lt;/td&gt;
 &lt;td&gt;$3.00&lt;/td&gt;
 &lt;td&gt;基准&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;输出&lt;/td&gt;
 &lt;td&gt;$15.00&lt;/td&gt;
 &lt;td&gt;5×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;缓存写入&lt;/td&gt;
 &lt;td&gt;$3.75&lt;/td&gt;
 &lt;td&gt;1.25×&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;缓存读取&lt;/td&gt;
 &lt;td&gt;$0.30&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;0.1×&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Web 搜索&lt;/td&gt;
 &lt;td&gt;$0.01/次&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;缓存回本点&lt;/strong&gt;：写入成本 $3.75 / 读取成本 $0.30 ≈ &lt;strong&gt;12.5 次读取回本&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对于一个持续 30 轮的会话，系统提示（~10K Token）的成本对比：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;无缓存：30 轮 × 10K Token × $3/Mtok = $0.90
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;有缓存：1 次写入 $0.0375 + 29 次读取 × $0.003 = $0.12
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;节省：$0.90 - $0.12 = $0.78（节省 87%）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果是全局缓存命中（&lt;code&gt;scope: 'global'&lt;/code&gt;），连写入费用都省了——第一个用户写入后，所有用户都只付读取费用。&lt;/p&gt;
&lt;h3 id="输出-token-的优化8k-默认--按需升级"&gt;输出 Token 的优化：8K 默认 + 按需升级
&lt;/h3&gt;&lt;p&gt;第 02 篇提到的 Token 上限升级机制，也是一个成本优化：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;默认 max_tokens = 8,000 (CAPPED_DEFAULT_MAX_TOKENS)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;按需升级到 = 64,000 (ESCALATED_MAX_TOKENS)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么默认只给 8K？&lt;/strong&gt; 数据显示 p99 的输出 Token 才 4,911——绝大多数请求在 8K 以内就能完成。默认 64K 意味着 API 需要为每个请求预留 8 倍的计算资源，但 99% 的时候这些资源是浪费的。&lt;/p&gt;
&lt;p&gt;8K 默认 + 按需升级 = 资源利用率大幅提升，&amp;lt; 1% 的请求需要重试。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6-级-prompt-优先级"&gt;6 级 Prompt 优先级
&lt;/h2&gt;&lt;p&gt;系统提示不是一个简单的字符串——它有 6 级优先级，决定最终发给 API 的内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先级 0: Override（覆盖一切）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先级 1: Coordinator 模式
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先级 2: Agent 系统提示
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先级 3: 自定义提示（--system-prompt）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先级 4: 默认提示
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;优先级 5: Appendive（总是追加）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键设计&lt;/strong&gt;：Agent 在 Proactive 模式下是&lt;strong&gt;追加&lt;/strong&gt;到默认提示（不是替换）。因为 Proactive 模式的默认提示已经很精简（自主 Agent 身份 + 记忆 + 环境），Agent 在此基础上添加领域指令，就像队友在共享基础上各自添加专长。&lt;/p&gt;
&lt;p&gt;而在非 Proactive 模式下，Agent 是&lt;strong&gt;替换&lt;/strong&gt;默认提示——因为默认提示太长，全部保留会浪费缓存前缀空间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Appendive&lt;/strong&gt; 级别的提示总是追加（除非 Override 激活）——用于注入临时上下文，如用户的 &lt;code&gt;--append-system-prompt&lt;/code&gt; 参数。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="可借鉴的模式"&gt;可借鉴的模式
&lt;/h2&gt;&lt;h3 id="1-静态动态分割是缓存优化的第一步"&gt;1. 静态/动态分割是缓存优化的第一步
&lt;/h3&gt;&lt;p&gt;任何 LLM 应用都可以做这个优化：把系统提示中不会变化的部分放前面，标记为可缓存。改动频繁的部分（用户上下文、环境信息）放后面，不缓存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键洞察&lt;/strong&gt;：顺序很重要。Prompt Cache 是前缀匹配——只要前缀相同就命中。动态内容放后面意味着它的变化不影响前缀的缓存命中。&lt;/p&gt;
&lt;h3 id="2-分级压缩优于一刀切"&gt;2. 分级压缩优于一刀切
&lt;/h3&gt;&lt;p&gt;不要在上下文快满时直接&amp;quot;砍掉一半历史&amp;quot;。分级压缩的好处是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;轻量操作（Snip）先跑，可能就够了&lt;/li&gt;
&lt;li&gt;避免不必要的 API 调用（AI 摘要很贵）&lt;/li&gt;
&lt;li&gt;每一级都保留尽可能多的信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-缓存编辑是一个值得关注的-api-特性"&gt;3. 缓存编辑是一个值得关注的 API 特性
&lt;/h3&gt;&lt;p&gt;Cache Editing（通过 &lt;code&gt;cache_reference&lt;/code&gt; + &lt;code&gt;cache_edits&lt;/code&gt; 修改缓存内容而不失效）是一个强大的优化手段。虽然目前只有 Anthropic API 支持，但它展示了一个方向：&lt;strong&gt;缓存不需要是全有全无的&lt;/strong&gt;——可以细粒度地增删。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="下一篇预告"&gt;下一篇预告
&lt;/h2&gt;&lt;p&gt;缓存分割和压缩保证了&amp;quot;对话能继续&amp;quot;。但 Agent 的能力边界取决于&lt;strong&gt;工具&lt;/strong&gt;——50 个工具如何做到自包含又统一？&lt;code&gt;Tool&amp;lt;Input, Output, Progress&amp;gt;&lt;/code&gt; 类型契约是怎么设计的？&lt;code&gt;buildTool()&lt;/code&gt; 的 fail-closed 默认值意味着什么？下一篇，我们拆解 Tool System。&lt;/p&gt;
&lt;hr&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;篇&lt;/th&gt;
 &lt;th&gt;标题&lt;/th&gt;
 &lt;th&gt;状态&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://guige.ai/p/cc-anatomy-01/" &gt;01&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;512K 行代码，一个终端里的 Agent Runtime&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://guige.ai/p/cc-anatomy-02/" &gt;02&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;ReAct 循环：&lt;code&gt;while(true)&lt;/code&gt; 里的五个阶段与七层恢复&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;03&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Prompt 缓存分割与四级上下文压缩&lt;/strong&gt;（本篇）&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;04&lt;/td&gt;
 &lt;td&gt;50 个工具的统一契约：Tool System 设计&lt;/td&gt;
 &lt;td&gt;🔄 下一篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05&lt;/td&gt;
 &lt;td&gt;五层记忆体系：从短期到持久化&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;06&lt;/td&gt;
 &lt;td&gt;纵深防御：23 项安全检查与&amp;quot;不信任任何输入&amp;quot;&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;07&lt;/td&gt;
 &lt;td&gt;投机执行与自研状态管理：隐藏延迟的两个利器&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;08&lt;/td&gt;
 &lt;td&gt;多 Agent 编排：三种执行模型与 Coordinator 模式&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;09&lt;/td&gt;
 &lt;td&gt;在终端里造一个浏览器：自定义 Ink 渲染引擎&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10&lt;/td&gt;
 &lt;td&gt;Bridge 与协议层：让 VS Code、Web、Mobile 共享一个 Claude&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;11&lt;/td&gt;
 &lt;td&gt;Skill、Plugin、Hook：三层扩展的设计谱系&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;回顾：从 Claude Code 中提炼的 10 个 Agent 工程模式&lt;/td&gt;
 &lt;td&gt;⬚&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>解剖 Claude Code（二）：ReAct 循环 — while(true) 里的五个阶段与七层恢复</title><link>https://guige.ai/p/cc-anatomy-02/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/cc-anatomy-02/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 解剖 Claude Code（二）：ReAct 循环 — while(true) 里的五个阶段与七层恢复" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;一个 AI Agent 的核心竞争力不在于它调用了多好的模型，而在于它的主循环有多健壮。Claude Code 的心脏是 &lt;code&gt;query.ts&lt;/code&gt; 中一个 1,700 行的 &lt;code&gt;while(true)&lt;/code&gt; 循环——本篇逐阶段拆解它。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="问题"&gt;问题
&lt;/h2&gt;&lt;p&gt;当你在 Claude Code 里输入&amp;quot;帮我重构这个函数&amp;quot;，系统不是简单地调一次 API 然后返回结果。它可能需要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先搜索代码找到函数位置&lt;/li&gt;
&lt;li&gt;读取相关文件理解上下文&lt;/li&gt;
&lt;li&gt;生成修改方案&lt;/li&gt;
&lt;li&gt;执行文件编辑&lt;/li&gt;
&lt;li&gt;运行测试确认没有 break&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每一步都是一次&amp;quot;模型思考 → 工具执行&amp;quot;的循环。如果中途上下文溢出了怎么办？输出被截断了怎么办？API 过载了怎么办？网络断了怎么办？&lt;/p&gt;
&lt;p&gt;Claude Code 的回答是：&lt;strong&gt;一个能自我修复的 ReAct 循环&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="在整体架构中的位置"&gt;在整体架构中的位置
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户输入 → QueryEngine.submitMessage()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ query.ts │ ← 本篇聚焦
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ while(true) { │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ...1,700 行... │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ } │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Ink 渲染引擎 → 终端
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;QueryEngine&lt;/code&gt; 是入口，但真正的循环逻辑在 &lt;code&gt;query.ts&lt;/code&gt; 的 &lt;code&gt;queryLoop()&lt;/code&gt; 函数中。&lt;code&gt;QueryEngine.submitMessage()&lt;/code&gt; 做的是消息规范化、系统提示组装，然后把控制权交给 &lt;code&gt;query()&lt;/code&gt; 异步生成器。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="循环状态一个-agent-需要记住什么"&gt;循环状态：一个 Agent 需要记住什么
&lt;/h2&gt;&lt;p&gt;在进入循环之前，先看循环维护的状态。这个状态对象定义了一个 ReAct Agent 需要跨轮次追踪的所有信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;: &lt;span class="kt"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;// 对话历史（持续增长）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;toolUseContext&lt;/span&gt;: &lt;span class="kt"&gt;ToolUseContext&lt;/span&gt; &lt;span class="c1"&gt;// 工具执行上下文
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;autoCompactTracking&lt;/span&gt;: &lt;span class="kt"&gt;AutoCompactTrackingState&lt;/span&gt; &lt;span class="c1"&gt;// 压缩状态追踪
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;maxOutputTokensRecoveryCount&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt; &lt;span class="c1"&gt;// 输出截断恢复次数（上限 3）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;hasAttemptedReactiveCompact&lt;/span&gt;: &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="c1"&gt;// 是否已尝试紧急压缩
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;maxOutputTokensOverride&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="c1"&gt;// Token 上限覆盖（8K→64K）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;pendingToolUseSummary&lt;/span&gt;: &lt;span class="kt"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;...&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;// 上一轮的工具摘要（异步）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;stopHookActive&lt;/span&gt;: &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="c1"&gt;// Stop Hook 是否激活
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;turnCount&lt;/span&gt;: &lt;span class="kt"&gt;number&lt;/span&gt; &lt;span class="c1"&gt;// 当前轮次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;transition&lt;/span&gt;: &lt;span class="kt"&gt;Continue&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="c1"&gt;// 上一次继续的原因
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;两个关键设计&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;恢复计数器在每轮重置&lt;/strong&gt;：&lt;code&gt;maxOutputTokensRecoveryCount&lt;/code&gt; 在正常轮次结束时归零——每轮都有 3 次恢复机会，而不是全局 3 次。这意味着一个跨 20 轮的长任务，每轮都能独立恢复。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transition 追踪&lt;/strong&gt;：&lt;code&gt;transition.reason&lt;/code&gt; 记录上一次循环为什么继续，而不是结束。这不是给用户看的——是给调试和测试用的。可能的值包括 &lt;code&gt;'next_turn'&lt;/code&gt;（正常）、&lt;code&gt;'reactive_compact_retry'&lt;/code&gt;（紧急压缩后重试）、&lt;code&gt;'max_output_tokens_escalate'&lt;/code&gt;（Token 升级）等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="五个阶段"&gt;五个阶段
&lt;/h2&gt;&lt;p&gt;&lt;img alt="ReAct 循环的五个阶段" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-02/02-five-phases.webp" srcset="https://guige.ai/p/cc-anatomy-02/02-five-phases_hu_dc3ee9324cba9472.webp 800w, https://guige.ai/p/cc-anatomy-02/02-five-phases_hu_95274c4685e62c85.webp 1600w, https://guige.ai/p/cc-anatomy-02/02-five-phases_hu_b616758575aa087.webp 2400w, https://guige.ai/p/cc-anatomy-02/02-five-phases.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;h3 id="阶段一上下文准备--在调-api-之前先瘦身"&gt;阶段一：上下文准备 — 在调 API 之前先&amp;quot;瘦身&amp;quot;
&lt;/h3&gt;&lt;p&gt;每轮 API 调用之前，系统会运行一条&lt;strong&gt;压缩管线&lt;/strong&gt;，确保消息历史不会超出上下文窗口：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tool Result Budget (单消息上限)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Snip (历史裁剪)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Microcompact (工具结果压缩)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Context Collapse (选择性归档)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Autocompact (AI 全量摘要)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;每级压缩&lt;strong&gt;逐层递进&lt;/strong&gt;，前一级减少不够才进下一级：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool Result Budget&lt;/strong&gt;：给单条工具结果设置上限。过长的搜索结果、文件内容会被截断。这一步在 Microcompact 之前运行，因为它的截断对缓存是不可见的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snip&lt;/strong&gt;：轻量裁剪，直接移除旧消息。保留最近的上下文不动。释放的 Token 数 &lt;code&gt;snipTokensFreed&lt;/code&gt; 会传给后续阶段，影响 Autocompact 的触发阈值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microcompact&lt;/strong&gt;：按 &lt;code&gt;tool_use_id&lt;/code&gt; 压缩工具结果。关键技术：它操作的是&lt;strong&gt;缓存索引&lt;/strong&gt;而非消息内容本身，对 API 的 Prompt Cache 不可见。这意味着压缩不会打破缓存。支持的工具包括 FileRead、Shell、Grep、Glob、WebSearch、WebFetch、FileEdit、FileWrite。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context Collapse&lt;/strong&gt;：选择性归档。不是摘要所有内容，而是保留细粒度上下文、只归档确定不再需要的部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autocompact&lt;/strong&gt;：AI 全量摘要。当 Token 数超过 &lt;code&gt;上下文窗口 - 13,000&lt;/code&gt; 时触发。使用专门的 Prompt 让模型生成 9 个分区的结构化摘要（请求意图、技术概念、文件代码、错误修复、问题解决、用户消息、待办任务、当前工作、下一步建议）。&lt;/p&gt;
&lt;p&gt;有一个&lt;strong&gt;熔断器&lt;/strong&gt;：如果 Autocompact 连续失败 3 次（&lt;code&gt;MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3&lt;/code&gt;），就停止尝试，避免无限循环。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="阶段二模型流式调用"&gt;阶段二：模型流式调用
&lt;/h3&gt;&lt;p&gt;准备好上下文后，调用 Anthropic API：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;deps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;: &lt;span class="kt"&gt;prependUserContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messagesForQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;systemPrompt&lt;/span&gt;: &lt;span class="kt"&gt;fullSystemPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;: &lt;span class="kt"&gt;toolUseContext.options.tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;: &lt;span class="kt"&gt;toolUseContext.abortController.signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;model&lt;/span&gt;: &lt;span class="kt"&gt;currentModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;fallbackModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;maxOutputTokensOverride&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 可能已从 8K 升至 64K
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;fastMode&lt;/span&gt;: &lt;span class="kt"&gt;appState.fastMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;taskBudget&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;queryTracking&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;depth&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 流式处理每个消息块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;流式处理的核心&lt;/strong&gt;：模型的输出不是一次性返回的，而是逐块到达——文本块、工具调用块、思考块。系统在流式接收过程中做了三件关键的事：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 错误拦截与暂扣&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;并非所有错误都立即暴露给调用方。三类错误会被&lt;strong&gt;暂扣&lt;/strong&gt;（withheld），等待后续恢复：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;错误类型&lt;/th&gt;
 &lt;th&gt;暂扣条件&lt;/th&gt;
 &lt;th&gt;恢复手段&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;413 Prompt Too Long&lt;/td&gt;
 &lt;td&gt;Context Collapse 或 Reactive Compact 可用&lt;/td&gt;
 &lt;td&gt;压缩后重试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Max Output Tokens&lt;/td&gt;
 &lt;td&gt;总是暂扣&lt;/td&gt;
 &lt;td&gt;Token 升级或多轮恢复&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Media Size Error&lt;/td&gt;
 &lt;td&gt;Reactive Compact 可用&lt;/td&gt;
 &lt;td&gt;剥离图片/PDF 后重试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;暂扣的消息仍然会推入 &lt;code&gt;assistantMessages&lt;/code&gt;，但不会 &lt;code&gt;yield&lt;/code&gt; 给调用方。只有恢复失败后才会浮出。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 工具调用块收集&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msgToolUseBlocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;toolUseBlocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;msgToolUseBlocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;needsFollowUp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;// 标记：本轮需要继续循环
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. 流式工具执行（如果启用）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是最精巧的部分——下一节详述。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="阶段三工具执行--流水线并行"&gt;阶段三：工具执行 — 流水线并行
&lt;/h3&gt;&lt;p&gt;&lt;img alt="流式工具执行时序" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-02/02-streaming-executor.webp" srcset="https://guige.ai/p/cc-anatomy-02/02-streaming-executor_hu_744de4ad394ba6fc.webp 800w, https://guige.ai/p/cc-anatomy-02/02-streaming-executor_hu_f09473cbcd360a09.webp 1600w, https://guige.ai/p/cc-anatomy-02/02-streaming-executor_hu_14f4f214d12189c4.webp 2400w, https://guige.ai/p/cc-anatomy-02/02-streaming-executor.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;Claude Code 有两种工具执行模式：&lt;/p&gt;
&lt;h4 id="模式-a流式执行器streamingtoolexecutor"&gt;模式 A：流式执行器（StreamingToolExecutor）
&lt;/h4&gt;&lt;p&gt;当特性门控 &lt;code&gt;tengu_streaming_tool_execution2&lt;/code&gt; 开启时，工具&lt;strong&gt;在模型还在输出时就开始执行&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;工作原理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型流式输出 &lt;code&gt;tool_use&lt;/code&gt; 块 → &lt;code&gt;streamingToolExecutor.addTool(block)&lt;/code&gt; 立即入队&lt;/li&gt;
&lt;li&gt;执行器检查并发安全性 → 满足条件立即开始执行&lt;/li&gt;
&lt;li&gt;模型继续输出 → 新工具继续入队和执行&lt;/li&gt;
&lt;li&gt;模型输出完毕 → &lt;code&gt;getRemainingResults()&lt;/code&gt; 等待剩余工具完成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;并发安全规则&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;canExecuteTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isConcurrencySafe&lt;/span&gt;: &lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;executing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;executing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;executing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isConcurrencySafe&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;executing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;every&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isConcurrencySafe&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;翻译成人话：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果没有工具在执行 → 直接执行&lt;/li&gt;
&lt;li&gt;如果当前工具和所有正在执行的工具都是并发安全的 → 并行执行&lt;/li&gt;
&lt;li&gt;否则 → 等待&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;哪些工具是并发安全的？&lt;/strong&gt; 读操作通常是安全的（&lt;code&gt;FileRead&lt;/code&gt;、&lt;code&gt;Grep&lt;/code&gt;、&lt;code&gt;Glob&lt;/code&gt;）。写操作通常不安全（&lt;code&gt;Bash&lt;/code&gt;、&lt;code&gt;FileEdit&lt;/code&gt;）。但 &lt;code&gt;Bash&lt;/code&gt; 工具有特殊逻辑：某些只读命令（&lt;code&gt;git status&lt;/code&gt;、&lt;code&gt;ls&lt;/code&gt;）也可以并发。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bash 错误的传播&lt;/strong&gt;：如果一个 Bash 工具报错，它会通过 &lt;code&gt;siblingAbortController.abort('sibling_error')&lt;/code&gt; 取消所有兄弟工具。这是因为 Bash 错误通常意味着环境出了问题，继续执行其他工具没有意义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工具状态机&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;queued → executing → completed → yielded
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="模式-b批量执行器toolorchestrationts"&gt;模式 B：批量执行器（toolOrchestration.ts）
&lt;/h4&gt;&lt;p&gt;如果流式执行未启用，工具在模型输出完毕后&lt;strong&gt;批量执行&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;partitionToolCalls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolUseBlocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;并发安全工具分到同一批（并行，最多&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="err"&gt;个）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="err"&gt;非安全工具各自一批（串行）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;两种模式的接口是统一的——都产出 &lt;code&gt;{ message, newContext }&lt;/code&gt; 的异步迭代器——循环体不需要知道用的是哪种模式。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="阶段四附件收集"&gt;阶段四：附件收集
&lt;/h3&gt;&lt;p&gt;工具执行完成后，系统收集一系列&amp;quot;附件&amp;quot;为下一轮做准备：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;排队命令&lt;/strong&gt;：用户在工具执行期间输入的命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skill 发现&lt;/strong&gt;：后台预取的新 Skill&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆预取&lt;/strong&gt;：后台发现的相关长期记忆&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具摘要&lt;/strong&gt;：用 Haiku 模型异步生成的工具使用摘要（fire-and-forget，不阻塞下一轮）&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 工具摘要是异步的——这一轮生成，下一轮才消费
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;nextPendingToolUseSummary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;generateToolUseSummary&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;: &lt;span class="kt"&gt;toolInfoForSummary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;: &lt;span class="kt"&gt;toolUseContext.abortController.signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 失败也不阻塞
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="阶段五终止或继续"&gt;阶段五：终止或继续？
&lt;/h3&gt;&lt;p&gt;这是每轮的最终决策点：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;模型调用了工具？
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├─ 是 → needsFollowUp = true → 继续循环
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─ 否 → 进入终止检查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;终止检查链：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1. API 错误？→ 执行失败 Hook，返回 &amp;#39;completed&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2. Stop Hook 阻止？→ 返回 &amp;#39;stop_hook_prevented&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3. Stop Hook 报错？→ 注入错误消息，继续循环（reason: &amp;#39;stop_hook_blocking&amp;#39;）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4. Token Budget 未用完？→ 注入 nudge 消息，继续循环
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5. 超过 maxTurns？→ 返回 &amp;#39;max_turns&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 6. 以上都不是 → 返回 &amp;#39;completed&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Stop Hook&lt;/strong&gt; 是一个有趣的机制：用户可以在设置中定义 Shell 命令，在模型每次完成回复后执行。Hook 可以检查模型的输出，决定是否允许继续。如果 Hook 返回错误，错误会被注入到消息历史中，模型会在下一轮看到这些错误并尝试修正。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Token Budget&lt;/strong&gt; 是另一个控制点：当启用时，系统会检查本轮已消耗的 Token 是否达到预算的 90%。如果没有，注入一条 nudge 消息（&amp;ldquo;已用 X%，继续工作，不要总结&amp;rdquo;）让模型继续工作。还有&lt;strong&gt;衰减检测&lt;/strong&gt;：如果连续 3+ 轮且每轮新增 &amp;lt; 500 Token，判定为&amp;quot;衰减&amp;quot;并停止——模型可能在兜圈子。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="七层恢复机制"&gt;七层恢复机制
&lt;/h2&gt;&lt;p&gt;&lt;img alt="七层恢复瀑布图" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-02/02-recovery-cascade.webp" srcset="https://guige.ai/p/cc-anatomy-02/02-recovery-cascade_hu_b7fcae5eda65d3a4.webp 800w, https://guige.ai/p/cc-anatomy-02/02-recovery-cascade_hu_5a785506bf5bde19.webp 1600w, https://guige.ai/p/cc-anatomy-02/02-recovery-cascade_hu_6c0be8b43571d739.webp 2400w, https://guige.ai/p/cc-anatomy-02/02-recovery-cascade.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;恢复机制是这个循环最精妙的部分。不是简单的 try-catch 重试，而是&lt;strong&gt;分层的、有针对性的自我修复&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="前三层预防性在-api-调用前"&gt;前三层：预防性（在 API 调用前）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层&lt;/th&gt;
 &lt;th&gt;名称&lt;/th&gt;
 &lt;th&gt;触发&lt;/th&gt;
 &lt;th&gt;做什么&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;L1&lt;/td&gt;
 &lt;td&gt;Autocompact&lt;/td&gt;
 &lt;td&gt;Token &amp;gt; 上下文窗口 - 13K&lt;/td&gt;
 &lt;td&gt;AI 生成 9 段结构化摘要&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L2&lt;/td&gt;
 &lt;td&gt;Snip&lt;/td&gt;
 &lt;td&gt;历史消息过长&lt;/td&gt;
 &lt;td&gt;裁剪旧消息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L3&lt;/td&gt;
 &lt;td&gt;Microcompact&lt;/td&gt;
 &lt;td&gt;工具结果冗余&lt;/td&gt;
 &lt;td&gt;按 tool_use_id 压缩&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这三层&lt;strong&gt;在 API 调用前运行&lt;/strong&gt;，目的是把上下文控制在安全范围内，避免触发 413 错误。&lt;/p&gt;
&lt;h3 id="第四层context-collapse413-第一道防线"&gt;第四层：Context Collapse（413 第一道防线）
&lt;/h3&gt;&lt;p&gt;当 API 返回 413 错误后，系统首先尝试 Context Collapse——选择性归档消息。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transition&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;collapse_drain_retry&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 只尝试一次，避免双重 drain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;drained&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;contextCollapse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recoverFromOverflow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messagesForQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;drained&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;committed&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="c1"&gt;// reason: &amp;#39;collapse_drain_retry&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键细节&lt;/strong&gt;：通过 &lt;code&gt;transition.reason&lt;/code&gt; 检查避免重复 drain——如果上一轮已经是 &lt;code&gt;collapse_drain_retry&lt;/code&gt;，就不再尝试，直接进入下一层。&lt;/p&gt;
&lt;h3 id="第五层reactive-compact413-最后手段"&gt;第五层：Reactive Compact（413 最后手段）
&lt;/h3&gt;&lt;p&gt;如果 Context Collapse 也不够，触发紧急全量压缩：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hasAttemptedReactiveCompact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;reactiveCompact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tryReactiveCompact&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="c1"&gt;// reason: &amp;#39;reactive_compact_retry&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Reactive Compact 会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;计算需要清理的 Token 差距（&lt;code&gt;actualTokens - limitTokens&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;对整个对话生成紧凑摘要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能恢复&lt;/strong&gt;：压缩后自动恢复最重要的信息（最近读取的文件、当前 PR 文件等，最多 5 个文件，预算 50K Token）&lt;/li&gt;
&lt;li&gt;对于 Media Size Error，可以剥离图片/PDF 后重试&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;死亡螺旋防护&lt;/strong&gt;：413 恢复路径显式跳过 Stop Hook——因为模型从未产生有效输出，Hook 没有东西可评估。如果在这里运行 Hook，会产生&amp;quot;错误 → Hook 阻塞 → 重试 → 错误&amp;quot;的死亡螺旋。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 代码注释原文：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Do NOT fall through to stop hooks: the model never produced a valid response,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// so hooks have nothing meaningful to evaluate. Running stop hooks on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// prompt-too-long creates a death spiral: error → hook blocking → retry → error → …
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第六层token-上限升级8k--64k"&gt;第六层：Token 上限升级（8K → 64K）
&lt;/h3&gt;&lt;p&gt;当模型输出被截断（&lt;code&gt;max_output_tokens&lt;/code&gt; 错误），系统的第一反应不是重试，而是&lt;strong&gt;升级限制&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;capEnabled&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;maxOutputTokensOverride&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 从默认的 8K 升级到 64K——单次升级，同一请求内立即重试
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;maxOutputTokensOverride&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="c1"&gt;// ESCALATED_MAX_TOKENS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="c1"&gt;// reason: &amp;#39;max_output_tokens_escalate&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么默认只给 8K？&lt;/strong&gt; 这是一个成本优化。大多数回复在 8K 以内就能完成。只在真正需要时才升级到 64K，避免不必要的 Token 消耗。&lt;/p&gt;
&lt;h3 id="第七层多轮恢复最多-3-次"&gt;第七层：多轮恢复（最多 3 次）
&lt;/h3&gt;&lt;p&gt;如果 64K 也不够，系统会注入恢复指令让模型从断点继续：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxOutputTokensRecoveryCount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// MAX_OUTPUT_TOKENS_RECOVERY_LIMIT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recoveryMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createUserMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Output token limit hit. Resume directly — no apology, no recap...&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;isMeta&lt;/span&gt;: &lt;span class="kt"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 对 UI 不可见
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;maxOutputTokensRecoveryCount&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="c1"&gt;// reason: &amp;#39;max_output_tokens_recovery&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意恢复指令的措辞：&amp;ldquo;Resume directly — no apology, no recap&amp;rdquo;——告诉模型直接从断点继续，不要浪费 Token 道歉或重复已输出的内容。&lt;/p&gt;
&lt;p&gt;3 次恢复后如果仍然被截断，才浮出错误给用户。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="循环的-10-种终止方式"&gt;循环的 10 种终止方式
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;终止原因&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;completed&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;正常完成：模型没有调用工具&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;aborted_streaming&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;用户中断（Ctrl+C），模型还在输出&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;aborted_tools&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;用户中断，工具还在执行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hook_stopped&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hook 发出了停止信号&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;stop_hook_prevented&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stop Hook 显式阻止继续&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;prompt_too_long&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;413 错误，所有恢复手段用尽&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image_error&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;图片处理错误&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;blocking_limit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Token 超过手动压缩阈值&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;model_error&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;未处理的模型调用异常&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_turns&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;超过最大轮次限制&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;6 种继续循环的原因&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Transition Reason&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;next_turn&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;正常：模型调用了工具，需要继续&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;collapse_drain_retry&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Context Collapse 释放了空间，重试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reactive_compact_retry&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;紧急压缩成功，重试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_output_tokens_escalate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Token 上限从 8K 升到 64K&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;max_output_tokens_recovery&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;注入恢复指令，继续输出&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;stop_hook_blocking&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hook 报错，注入错误让模型修正&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;token_budget_continuation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Token 预算未用完，注入 nudge&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="一个完整的循环实例"&gt;一个完整的循环实例
&lt;/h2&gt;&lt;p&gt;把所有部分串起来，看一个&amp;quot;重构函数&amp;quot;任务的完整循环轨迹：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 1: 用户输入 &amp;#34;帮我重构 parseConfig 函数&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 无需压缩（对话刚开始）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: 模型调用 GrepTool 搜索 &amp;#34;parseConfig&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 3: GrepTool 并发执行（read-only，并发安全）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 4: 收集搜索结果
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 5: needsFollowUp=true → continue (reason: &amp;#39;next_turn&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 2:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 无需压缩
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: 模型调用 FileReadTool 读取文件 + GlobTool 查找相关文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 3: 两个工具并行执行（都是只读）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 4: 收集文件内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 5: needsFollowUp=true → continue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 3:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 无需压缩
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: 模型调用 FileEditTool 修改代码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 3: FileEditTool 串行执行（写操作，非并发安全）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 4: 记录文件变更
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 5: needsFollowUp=true → continue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 4:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 无需压缩
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: 模型调用 BashTool 运行测试
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 3: BashTool 串行执行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 4: 收集测试结果
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 5: needsFollowUp=true → continue
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 5:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 无需压缩
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: 模型输出最终回复（无工具调用）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 3: 跳过
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 4: 后台生成工具摘要、提取记忆
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 5: needsFollowUp=false → Stop Hook 通过 → 返回 &amp;#39;completed&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;5 轮循环，4 次工具调用，零错误——最简单的路径。&lt;/p&gt;
&lt;p&gt;但如果 Turn 3 的编辑触发了上下文溢出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 3 (异常路径):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: API 返回 413 → 暂扣错误
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Recovery L4: Context Collapse → 释放了 20K Token → continue (reason: &amp;#39;collapse_drain_retry&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Turn 3 (重试):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 1: 上下文已缩小
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Phase 2: API 调用成功，模型继续编辑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 恢复正常流程
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用户&lt;strong&gt;完全无感&lt;/strong&gt;——系统自动压缩、重试，编辑继续。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="可借鉴的模式"&gt;可借鉴的模式
&lt;/h2&gt;&lt;p&gt;从这个循环中可以提取三个通用模式：&lt;/p&gt;
&lt;h3 id="1-分层恢复而非统一重试"&gt;1. 分层恢复，而非统一重试
&lt;/h3&gt;&lt;p&gt;不同类型的错误需要不同的恢复策略。413 和 &lt;code&gt;max_output_tokens&lt;/code&gt; 是完全不同的问题——前者需要压缩输入，后者需要扩展输出。用一个通用的 &lt;code&gt;retry(n)&lt;/code&gt; 处理所有错误是不够的。&lt;/p&gt;
&lt;h3 id="2-暂扣错误给恢复留窗口"&gt;2. 暂扣错误，给恢复留窗口
&lt;/h3&gt;&lt;p&gt;不是&amp;quot;收到错误 → 立即报告&amp;quot;，而是&amp;quot;收到错误 → 先暂扣 → 尝试恢复 → 恢复失败才报告&amp;quot;。这个模式适用于所有有恢复能力的系统。&lt;/p&gt;
&lt;h3 id="3-状态重置的粒度"&gt;3. 状态重置的粒度
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;maxOutputTokensRecoveryCount&lt;/code&gt; &lt;strong&gt;每轮重置&lt;/strong&gt;，&lt;code&gt;hasAttemptedReactiveCompact&lt;/code&gt; &lt;strong&gt;每轮重置&lt;/strong&gt;（除非是 Stop Hook 阻塞的重试）。恢复预算是按轮次而非全局分配的——长任务不会因为早期的错误耗尽后期的恢复能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="下一篇预告"&gt;下一篇预告
&lt;/h2&gt;&lt;p&gt;ReAct 循环的阶段一（上下文准备）提到了四级压缩和 Prompt Cache 分割——这是控制 Token 成本的核心。下一篇，我们将深入拆解：&lt;strong&gt;静态/动态 Prompt 分割如何最大化缓存命中率&lt;/strong&gt;，以及&lt;strong&gt;四级压缩体系如何在保留关键信息的同时将 Token 消耗降到最低&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="系列导航"&gt;系列导航
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;篇&lt;/th&gt;
 &lt;th&gt;标题&lt;/th&gt;
 &lt;th&gt;核心问题&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a class="link" href="https://guige.ai/p/cc-anatomy-01/" &gt;01&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;512K 行代码，一个终端里的 Agent Runtime&lt;/td&gt;
 &lt;td&gt;全景认知&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;02&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ReAct 循环：while(true) 里的五个阶段与七层恢复&lt;/strong&gt;（本篇）&lt;/td&gt;
 &lt;td&gt;系统心脏怎么跳&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;03&lt;/td&gt;
 &lt;td&gt;Prompt 缓存分割与四级上下文压缩&lt;/td&gt;
 &lt;td&gt;长对话怎么省钱&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;04&lt;/td&gt;
 &lt;td&gt;50 个工具的统一契约：Tool System 设计&lt;/td&gt;
 &lt;td&gt;Agent 能力怎么扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05&lt;/td&gt;
 &lt;td&gt;五层记忆体系：从短期到持久化&lt;/td&gt;
 &lt;td&gt;Agent 怎么记住事情&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;06&lt;/td&gt;
 &lt;td&gt;纵深防御：23 项安全检查与&amp;quot;不信任任何输入&amp;quot;&lt;/td&gt;
 &lt;td&gt;怎么让 Agent 安全&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;07&lt;/td&gt;
 &lt;td&gt;投机执行与自研状态管理：隐藏延迟的两个利器&lt;/td&gt;
 &lt;td&gt;怎么让用户感觉快&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;08&lt;/td&gt;
 &lt;td&gt;多 Agent 编排：三种执行模型与 Coordinator 模式&lt;/td&gt;
 &lt;td&gt;多个 Agent 怎么协作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;09&lt;/td&gt;
 &lt;td&gt;在终端里造一个浏览器：自定义 Ink 渲染引擎&lt;/td&gt;
 &lt;td&gt;终端 UI 怎么做到 60fps&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10&lt;/td&gt;
 &lt;td&gt;Bridge 与协议层：让 VS Code、Web、Mobile 共享一个 Claude&lt;/td&gt;
 &lt;td&gt;CLI 怎么变成平台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;11&lt;/td&gt;
 &lt;td&gt;Skill、Plugin、Hook：三层扩展的设计谱系&lt;/td&gt;
 &lt;td&gt;怎么不改源码就扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;回顾：从 Claude Code 中提炼的 10 个 Agent 工程模式&lt;/td&gt;
 &lt;td&gt;带走什么&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>解剖 Claude Code（一）：512K 行代码，一个终端里的 Agent Runtime</title><link>https://guige.ai/p/cc-anatomy-01/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/cc-anatomy-01/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 解剖 Claude Code（一）：512K 行代码，一个终端里的 Agent Runtime" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;2026 年 3 月 31 日，Anthropic 的 Claude Code CLI 完整源码因 npm 包中的 &lt;code&gt;.map&lt;/code&gt; 文件泄露。512,000 行 TypeScript，1,900 个文件——这不是一个 CLI 工具，这是一个藏在终端里的 &lt;strong&gt;AI Agent 运行时&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="为什么要读这份源码"&gt;为什么要读这份源码？
&lt;/h2&gt;&lt;p&gt;市面上的 AI 编程工具不少：Cursor、Windsurf、Aider、Copilot CLI……但 Claude Code 是第一个被完整泄露源码的&lt;strong&gt;生产级 Agent Runtime&lt;/strong&gt;。它不是一个简单的&amp;quot;调 API → 输出结果&amp;quot;的 wrapper——它有自己的渲染引擎、权限系统、多 Agent 协调器、五层记忆体系、四级上下文压缩，甚至还有投机执行机制。&lt;/p&gt;
&lt;p&gt;读懂它，不只是在看 Anthropic 的内部工程，而是在看一个&lt;strong&gt;完整的 Agent 架构范本&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本系列共 12 篇，本篇是全景导读。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="技术栈一个看似奇怪的组合"&gt;技术栈：一个看似奇怪的组合
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层级&lt;/th&gt;
 &lt;th&gt;选型&lt;/th&gt;
 &lt;th&gt;为什么？&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;运行时&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Bun&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;启动速度是 CLI 体验的生命线。Bun 比 Node.js 快 3-5 倍。&lt;code&gt;bun:bundle&lt;/code&gt; 的 &lt;code&gt;feature()&lt;/code&gt; API 实现编译期死代码消除——未启用的功能从构建产物中彻底消失&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;语言&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;TypeScript (strict)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;50 万行代码没有类型系统是不可想象的&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;终端 UI&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;React + 自定义 Ink&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;声明式 UI + Yoga flexbox 布局，在终端里实现接近 IDE 的交互体验&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CLI 解析&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Commander.js&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;成熟稳定，类型安全&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Schema&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Zod v4&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;一套 Schema 同时用于运行时验证和 API JSON Schema 生成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;搜索&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;ripgrep&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;代码搜索的事实标准&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;协议&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;MCP + LSP&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;标准协议集成外部工具和语言服务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;遥测&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;OpenTelemetry&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;标准化可观测性&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;特性门控&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;GrowthBook&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;灰度发布、A/B 测试&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这套组合的底层逻辑是：&lt;strong&gt;启动要快（Bun）、交互要好（React+Ink）、扩展要广（MCP/LSP）、安全要硬（TypeScript strict + Zod）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="技术栈分层图" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-tech-stack.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-tech-stack_hu_92f3baf23f19c896.webp 800w, https://guige.ai/p/cc-anatomy-01/01-tech-stack_hu_93ebcac19ddb80d9.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-tech-stack_hu_19ebea41f24420bf.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-tech-stack.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;值得注意的是，Claude Code &lt;strong&gt;完全不依赖传统的代码索引&lt;/strong&gt;——没有 Embedding 向量检索，没有 AST 分析，没有代码图谱。它纯靠大模型的推理能力配合 Grep/Glob 全局搜索来理解代码库。这是一个大胆的哲学选择：赌模型能力的增长速度会超过代码库的增长速度。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="核心数据流一次对话背后发生了什么"&gt;核心数据流：一次对话背后发生了什么
&lt;/h2&gt;&lt;p&gt;当你在 Claude Code 中输入一条消息，数据会经过以下管线：&lt;/p&gt;
&lt;p&gt;&lt;img alt="核心数据流：从用户输入到终端渲染" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-data-flow.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-data-flow_hu_dd195d787ccd9edd.webp 800w, https://guige.ai/p/cc-anatomy-01/01-data-flow_hu_ffcba6f0cd03e359.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-data-flow_hu_e1dc1f9ca157ee3a.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-data-flow.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户输入
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ QueryEngine.submitMessage() │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ┌─────────────────────────────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ query.ts: while(true) — ReAct 循环 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ Phase 1: 上下文准备 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → Snip / Microcompact / Autocompact │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ Phase 2: 模型流式调用 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → Anthropic API (streaming) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ Phase 3: 工具执行 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → StreamingToolExecutor (并行) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → 权限检查 → 沙箱执行 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ Phase 4: 附件收集 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → 任务通知 / 记忆 / 文件变更 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ Phase 5: 终止或继续？ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → 有工具调用？继续循环 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → 无工具调用？结束 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ → 出错？七层恢复 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └─────────────────────────────────────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 错误恢复层: │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L1 Autocompact (80% 预警) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L2 Snip (历史裁剪) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L3 Microcompact (工具结果压缩) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L4 Context Collapse (选择性归档) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L5 Reactive Compact (413 紧急压缩) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L6 Token 升级 (8K→64K) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ L7 多轮恢复 (最多 3 次) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Ink 渲染引擎 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ React Reconciler → Yoga 布局 → Screen Buffer │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ → 增量 Diff → ANSI 输出 → 终端 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个流程最值得注意的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型调用和工具执行是并行的&lt;/strong&gt; —— &lt;code&gt;StreamingToolExecutor&lt;/code&gt; 在模型还在输出时就已经开始执行已完成解析的工具调用。这不是等模型说完再跑工具，而是流水线式并行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;七层恢复不是简单重试&lt;/strong&gt; —— 每一层处理不同类型的故障。413 上下文溢出会触发压缩后重试；输出被截断会自动将 Token 上限从 8K 升至 64K；API 过载会指数退避。系统在各种异常下自我修复，而不是直接崩溃。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上下文压缩是分级的&lt;/strong&gt; —— 不是简单地&amp;quot;砍掉旧消息&amp;quot;，而是四级递进：轻量裁剪 → 缓存感知压缩 → AI 全量摘要 → 紧急压缩。每一级都尽可能保留更多有用信息。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="五个维度看系统成熟度"&gt;五个维度看系统成熟度
&lt;/h2&gt;&lt;h3 id="维度一react-循环--系统心脏"&gt;维度一：ReAct 循环 — 系统心脏
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;query.ts&lt;/code&gt; 中的 &lt;code&gt;while(true)&lt;/code&gt; 循环是整个系统的心脏，实现了经典的 ReAct（推理-行动）模式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;五个阶段，每轮都走一遍&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;阶段&lt;/th&gt;
 &lt;th&gt;做什么&lt;/th&gt;
 &lt;th&gt;关键技术&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;上下文准备&lt;/td&gt;
 &lt;td&gt;裁剪旧消息、压缩工具结果&lt;/td&gt;
 &lt;td&gt;Snip + Microcompact + Autocompact 三级组合&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;模型流式调用&lt;/td&gt;
 &lt;td&gt;发送对话历史 + 系统提示 + 工具列表&lt;/td&gt;
 &lt;td&gt;流式输出、Prompt Cache 分割&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;工具执行&lt;/td&gt;
 &lt;td&gt;并行执行工具调用&lt;/td&gt;
 &lt;td&gt;StreamingToolExecutor 流水线并行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;附件收集&lt;/td&gt;
 &lt;td&gt;任务通知、记忆提取、文件变更&lt;/td&gt;
 &lt;td&gt;后台 Agent 异步提取记忆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;终止决策&lt;/td&gt;
 &lt;td&gt;根据模型行为决定循环或结束&lt;/td&gt;
 &lt;td&gt;七层恢复、Stop Hook&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;最精巧的设计&lt;/strong&gt;在于流式工具执行器：模型还在生成第二个工具调用时，第一个工具已经在并行执行了。如果第一个工具是并发安全的（&lt;code&gt;isConcurrencySafe: true&lt;/code&gt;），它甚至可以和其他并发安全工具同时运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;七层恢复机制&lt;/strong&gt;则是韧性设计的典范：&lt;/p&gt;
&lt;p&gt;&lt;img alt="七层恢复机制：从预警到紧急恢复的递进防线" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-seven-layer-recovery.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-seven-layer-recovery_hu_8d18e40cdce1b83b.webp 800w, https://guige.ai/p/cc-anatomy-01/01-seven-layer-recovery_hu_f236c00c1313a62d.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-seven-layer-recovery_hu_c428fad9edf54fa8.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-seven-layer-recovery.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层&lt;/th&gt;
 &lt;th&gt;触发条件&lt;/th&gt;
 &lt;th&gt;恢复策略&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;L1&lt;/td&gt;
 &lt;td&gt;对话达到上下文窗口 80%&lt;/td&gt;
 &lt;td&gt;预警式自动摘要&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L2&lt;/td&gt;
 &lt;td&gt;历史消息过长&lt;/td&gt;
 &lt;td&gt;轻量裁剪（Snip）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L3&lt;/td&gt;
 &lt;td&gt;工具结果冗余&lt;/td&gt;
 &lt;td&gt;缓存感知压缩（Microcompact）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L4&lt;/td&gt;
 &lt;td&gt;API 返回 413&lt;/td&gt;
 &lt;td&gt;选择性消息归档（Context Collapse）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L5&lt;/td&gt;
 &lt;td&gt;L4 失败&lt;/td&gt;
 &lt;td&gt;紧急全量压缩（Reactive Compact）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L6&lt;/td&gt;
 &lt;td&gt;输出被截断&lt;/td&gt;
 &lt;td&gt;Token 上限 8K→64K 单次升级&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;L7&lt;/td&gt;
 &lt;td&gt;L6 仍被截断&lt;/td&gt;
 &lt;td&gt;注入恢复指令，最多重试 3 次&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;系列第 2 篇&lt;/strong&gt;将深入拆解这个循环的每个阶段和恢复机制。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="维度二五层记忆体系--超越上下文窗口"&gt;维度二：五层记忆体系 — 超越上下文窗口
&lt;/h3&gt;&lt;p&gt;大多数 Agent 工具的&amp;quot;记忆&amp;quot;就是对话历史。Claude Code 构建了&lt;strong&gt;五层记忆体系&lt;/strong&gt;，覆盖从毫秒到永久的全时间尺度：&lt;/p&gt;
&lt;p&gt;&lt;img alt="五层记忆体系：从毫秒到永久" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-memory-layers.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-memory-layers_hu_94bf00ee3d554dab.webp 800w, https://guige.ai/p/cc-anatomy-01/01-memory-layers_hu_a151e2e5ecd207ae.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-memory-layers_hu_3c92df571142731d.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-memory-layers.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 5 层：Checkpoint（会话持久化） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 关闭终端，下次打开完整恢复 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ JSONL 转录文件 + 元数据快照 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 4 层：摘要记忆 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ AI 生成的结构化对话摘要（9 个分区） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 区别于简单截断，保留语义 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 3 层：长期记忆 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ~/.claude/projects/&amp;lt;path&amp;gt;/memory/ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 4 种类型：用户偏好 / 纠正反馈 / 工作约束 / 外部引用 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 检索时用 LLM 做相关性判断，提取 Top-5 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 2 层：工作记忆 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 7 种任务状态 / 投机执行状态 / 权限追踪 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 1 层：短期记忆 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 当前会话消息列表（内存中） │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;长期记忆的设计尤其精巧&lt;/strong&gt;：它不是一个笨重的向量数据库，而是本地目录下的 markdown 文件，按主题组织。检索时不是做 embedding 相似度搜索，而是把所有记忆的&lt;strong&gt;文件名和描述&lt;/strong&gt;发给模型，让模型选出最相关的 5 个再读取全文。&lt;/p&gt;
&lt;p&gt;这种&amp;quot;用 LLM 做检索&amp;quot;的方式看似低效，但在记忆数量可控（几十到几百个文件）的场景下非常实用——它避免了 embedding 模型的维护成本，同时利用了大模型的语义理解能力。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;系列第 5 篇&lt;/strong&gt;将深入拆解五层记忆体系。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="维度三安全纵深--六层防御不信任任何输入"&gt;维度三：安全纵深 — 六层防御，不信任任何输入
&lt;/h3&gt;&lt;p&gt;一个能执行 Shell 命令的 AI Agent，安全不是可选项，是生存条件。Claude Code 构建了&lt;strong&gt;六层纵深防御&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img alt="六层安全纵深防御" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-security-layers.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-security-layers_hu_c96a8af863e27524.webp 800w, https://guige.ai/p/cc-anatomy-01/01-security-layers_hu_371e1e831f77205e.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-security-layers_hu_8bdaba35db0fc5dd.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-security-layers.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 6 层：内容检测 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 秘密/PII 检测，遥测隐私保护 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 5 层：路径校验 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 路径遍历防护、符号链接检查 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 4 层：命令级验证 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 纯 TS Bash 解析器，23 项安全检查 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 50ms 超时 + 50K 节点预算防 DoS │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 3 层：规则匹配 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 8 来源权限规则：policy &amp;gt; managed &amp;gt; project &amp;gt; user │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 2 层：权限模式 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ default / plan / auto / bypass │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Auto 模式：二阶段分类器决策 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────────────────────────────────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 第 1 层：沙箱 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 文件系统/网络级隔离 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;几个硬核细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;纯 TypeScript 写的 Bash 解析器&lt;/strong&gt;（130KB）：生成 tree-sitter-bash 兼容的 AST，在执行前静态分析命令安全性。设置了 50ms 超时和 50K 节点预算，防止恶意构造的命令消耗解析资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;23 项 Bash 安全检查&lt;/strong&gt;：覆盖命令替换、注入攻击、Unicode 同形攻击、IFS 注入、brace 展开、heredoc 注入等攻击面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解释器黑名单&lt;/strong&gt;：Python、Node 等只允许 &lt;code&gt;--version&lt;/code&gt; 检查，禁止在自动模式下执行任意脚本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZSH 危险命令黑名单&lt;/strong&gt;：16 个可绕过安全检查的 Zsh 内建命令（zmodload、emulate、sysopen、zpty 等）被显式禁止。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套体系的设计哲学是&lt;strong&gt;每一层都不信任上一层&lt;/strong&gt;——即使沙箱被绕过，权限系统仍然在拦截；即使权限被绕过，Bash 解析器仍然在检查命令安全性。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;系列第 6 篇&lt;/strong&gt;将深入拆解完整的安全体系。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="维度四多-agent-编排"&gt;维度四：多 Agent 编排
&lt;/h3&gt;&lt;p&gt;Claude Code 不是单 Agent 工具。它支持&lt;strong&gt;三种 Agent 执行模型&lt;/strong&gt;和一个编排层：&lt;/p&gt;
&lt;p&gt;&lt;img alt="多 Agent 编排架构：Coordinator + 三种 Worker 模型" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-multi-agent.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-multi-agent_hu_ede46efcee28675b.webp 800w, https://guige.ai/p/cc-anatomy-01/01-multi-agent_hu_7dbb225cf8a87354.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-multi-agent_hu_e39f5a5827c5533a.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-multi-agent.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三种执行模型&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;模型&lt;/th&gt;
 &lt;th&gt;实现&lt;/th&gt;
 &lt;th&gt;隔离方式&lt;/th&gt;
 &lt;th&gt;适用场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;子 Agent&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AgentTool&lt;/code&gt; 生成&lt;/td&gt;
 &lt;td&gt;Git Worktree&lt;/td&gt;
 &lt;td&gt;独立的文件修改任务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;同进程队友&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;InProcessTeammateTask&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AsyncLocalStorage&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;需要共享内存的协作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;远程队友&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;RemoteAgentTask&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;独立进程/远程会话&lt;/td&gt;
 &lt;td&gt;PR 审查、后台任务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Coordinator 模式&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;当启用后，系统切换为&amp;quot;指挥者-执行者&amp;quot;架构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Coordinator 只负责任务分解和结果汇聚&lt;/li&gt;
&lt;li&gt;Worker 拥有完整工具集，独立执行&lt;/li&gt;
&lt;li&gt;内置角色：General Purpose（通用）、Explore（只读探索）、Plan（只读规划）、Verification（破坏性验证）&lt;/li&gt;
&lt;li&gt;Worker 间通过 &lt;code&gt;SendMessageTool&lt;/code&gt; 通信，通过 Scratchpad 目录共享持久知识&lt;/li&gt;
&lt;li&gt;任务完成后以 &lt;code&gt;&amp;lt;task-notification&amp;gt;&lt;/code&gt; XML 标签的 user-role 消息通知 Coordinator&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Git Worktree 隔离&lt;/strong&gt;是一个精巧的设计：每个子 Agent 在独立的 Git Worktree 中工作，可以自由修改文件而不影响主工作区。用户确认后才合并变更；拒绝则直接删除 worktree。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;系列第 8 篇&lt;/strong&gt;将深入拆解多 Agent 架构。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="维度五可观测性与隐私"&gt;维度五：可观测性与隐私
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;遥测栈&lt;/strong&gt;：OpenTelemetry（Trace + Metrics + Logs）→ OTLP/Prometheus/BigQuery&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三级隐私类型系统&lt;/strong&gt;——这是最值得学习的设计之一：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 第 1 级：安全元数据（工具名、计数、状态码）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 第 2 级：PII 标记数据（文件路径、仓库 URL）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 用 _PROTO_* 前缀路由到特权列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;AnalyticsMetadata_I_VERIFIED_THIS_IS_PII_TAGGED&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 第 3 级：通用元数据（已净化的值）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;类型名本身就是安全检查&lt;/strong&gt;：当你写 &lt;code&gt;AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS&lt;/code&gt; 时，这个冗长的类型名逼迫你在写代码时思考：&amp;ldquo;我确认这个值不包含代码或文件路径吗？&amp;rdquo; 这是把安全审查嵌入类型系统的优雅做法。&lt;/p&gt;
&lt;p&gt;MCP 工具名默认脱敏为 &lt;code&gt;'mcp_tool'&lt;/code&gt;，只有官方注册的 MCP 服务器才保留原始名称。工具输入截断到 512 字符/4KB，防止业务代码意外被遥测上传。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六大惊艳的工程设计速览"&gt;六大惊艳的工程设计（速览）
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;#&lt;/th&gt;
 &lt;th&gt;设计&lt;/th&gt;
 &lt;th&gt;核心思路&lt;/th&gt;
 &lt;th&gt;详见&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Prompt 缓存分割&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;系统提示拆为静态（全局缓存）+ 动态（不缓存），极大提高 API 缓存命中率&lt;/td&gt;
 &lt;td&gt;第 3 篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;四级上下文压缩&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Snip → Microcompact → Autocompact → Reactive Compact，压缩后智能恢复关键信息&lt;/td&gt;
 &lt;td&gt;第 3 篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;投机执行&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;在用户确认前，在 Overlay 文件系统中预执行。确认写入，拒绝丢弃&lt;/td&gt;
 &lt;td&gt;第 7 篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;23 项 Bash 安全检查&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;覆盖注入、替换、同形攻击等。解释器黑名单防止自动执行脚本&lt;/td&gt;
 &lt;td&gt;第 6 篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;自研状态管理&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Zustand 风格轻量 Store，精准订阅防止 React Ink 级联重渲染&lt;/td&gt;
 &lt;td&gt;第 7 篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;6&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;工具延迟加载&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;超过 20 个工具时，不直接写入 system prompt，让模型自己搜索发现&lt;/td&gt;
 &lt;td&gt;第 4 篇&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="模块地图"&gt;模块地图
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;★&lt;/span&gt; &lt;span class="n"&gt;ReAct&lt;/span&gt; &lt;span class="err"&gt;循环（系统心脏）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;QueryEngine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;★&lt;/span&gt; &lt;span class="err"&gt;对话引擎入口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;★&lt;/span&gt; &lt;span class="err"&gt;工具类型契约&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;★&lt;/span&gt; &lt;span class="err"&gt;工具注册表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;命令注册表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tsx&lt;/span&gt; &lt;span class="err"&gt;入口（&lt;/span&gt;&lt;span class="n"&gt;Commander&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;React&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Ink&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;上下文收集&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tracker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;费用追踪&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="err"&gt;个工具实现&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;BashTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Shell&lt;/span&gt; &lt;span class="err"&gt;执行（最复杂，含&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="err"&gt;项安全检查）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;AgentTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;子&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt; &lt;span class="err"&gt;生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;FileEditTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;文件编辑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;GrepTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;代码搜索&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;MCPTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;MCP&lt;/span&gt; &lt;span class="err"&gt;协议桥接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;SkillTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Skill&lt;/span&gt; &lt;span class="err"&gt;执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;ToolSearchTool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;工具延迟加载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;服务层&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Anthropic&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;客户端（多提供商）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;compact&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;四级上下文压缩&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;MCP&lt;/span&gt; &lt;span class="err"&gt;集成（&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="err"&gt;种传输）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;extractMemories&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;后台记忆提取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;analytics&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;遥测与隐私（三级类型系统）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;coordinator&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;多&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt; &lt;span class="err"&gt;协调器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="err"&gt;种任务类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;memdir&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;长期记忆目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;自研状态管理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;ink&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;自定义&lt;/span&gt; &lt;span class="n"&gt;Ink&lt;/span&gt; &lt;span class="err"&gt;渲染引擎&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;reconciler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="n"&gt;React&lt;/span&gt; &lt;span class="n"&gt;Reconciler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Yoga&lt;/span&gt; &lt;span class="err"&gt;布局引擎&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;W3C&lt;/span&gt; &lt;span class="err"&gt;事件模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="n"&gt;Screen&lt;/span&gt; &lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;Intern&lt;/span&gt; &lt;span class="err"&gt;池化）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;termio&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;终端&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="err"&gt;解析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;bridge&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;IDE&lt;/span&gt; &lt;span class="err"&gt;集成（&lt;/span&gt;&lt;span class="n"&gt;VS&lt;/span&gt; &lt;span class="n"&gt;Code&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;JetBrains&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;skills&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Skill&lt;/span&gt; &lt;span class="err"&gt;系统（&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="err"&gt;种来源）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Plugin&lt;/span&gt; &lt;span class="err"&gt;系统&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;hooks&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Hook&lt;/span&gt; &lt;span class="err"&gt;系统（&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="err"&gt;类&lt;/span&gt; &lt;span class="err"&gt;×&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="err"&gt;种事件）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Vim&lt;/span&gt; &lt;span class="err"&gt;模式（状态机实现）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;voice&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;语音输入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;permissions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;权限引擎（&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;来源规则）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;sandbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;沙箱适配器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;bash&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="err"&gt;纯&lt;/span&gt; &lt;span class="n"&gt;TS&lt;/span&gt; &lt;span class="n"&gt;Bash&lt;/span&gt; &lt;span class="err"&gt;解析器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;telemetry&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;OpenTelemetry&lt;/span&gt; &lt;span class="err"&gt;集成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;prompts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="err"&gt;系统提示（&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="err"&gt;级优先级）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="一个关键哲学选择"&gt;一个关键哲学选择
&lt;/h2&gt;&lt;p&gt;&lt;img alt="哲学选择：无索引 vs 传统索引" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/cc-anatomy-01/01-no-index-philosophy.webp" srcset="https://guige.ai/p/cc-anatomy-01/01-no-index-philosophy_hu_5357c8c2a5b27b51.webp 800w, https://guige.ai/p/cc-anatomy-01/01-no-index-philosophy_hu_d17115d0a8d51a9.webp 1600w, https://guige.ai/p/cc-anatomy-01/01-no-index-philosophy_hu_591420314eefae63.webp 2400w, https://guige.ai/p/cc-anatomy-01/01-no-index-philosophy.webp 2752w" width="2752"&gt;&lt;/p&gt;
&lt;p&gt;最后值得讨论一个贯穿整个架构的哲学选择：&lt;strong&gt;Claude Code 完全不做代码索引&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;没有 Embedding 向量数据库，没有 AST 解析，没有代码图谱，没有符号表。当模型需要理解一个代码库时，它就用 &lt;code&gt;GrepTool&lt;/code&gt; 和 &lt;code&gt;GlobTool&lt;/code&gt; 全局搜索。&lt;/p&gt;
&lt;p&gt;这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;冷启动零成本&lt;/strong&gt;——不需要先索引再使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;永远是最新的&lt;/strong&gt;——每次搜索都读实际文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单到不可能出错&lt;/strong&gt;——没有索引就没有索引过期&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但也意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大型代码库可能效率低&lt;/strong&gt;——每次搜索都是全局扫描&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖模型的推理能力&lt;/strong&gt;——需要模型知道搜什么、怎么缩小范围&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token 消耗更高&lt;/strong&gt;——搜索结果直接进入上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个选择在当前模型变强的趋势下是说得通的。模型越强，越擅长用最少的搜索找到目标。但在百万行级代码库中，这个策略是否还能 hold 住，是一个开放问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="系列导航"&gt;系列导航
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;篇&lt;/th&gt;
 &lt;th&gt;标题&lt;/th&gt;
 &lt;th&gt;核心问题&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;01&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;512K 行代码，一个终端里的 Agent Runtime&lt;/strong&gt;（本篇）&lt;/td&gt;
 &lt;td&gt;全景认知&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;02&lt;/td&gt;
 &lt;td&gt;ReAct 循环：&lt;code&gt;while(true)&lt;/code&gt; 里的五个阶段与七层恢复&lt;/td&gt;
 &lt;td&gt;系统心脏怎么跳&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;03&lt;/td&gt;
 &lt;td&gt;Prompt 缓存分割与四级上下文压缩&lt;/td&gt;
 &lt;td&gt;长对话怎么省钱&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;04&lt;/td&gt;
 &lt;td&gt;50 个工具的统一契约：Tool System 设计&lt;/td&gt;
 &lt;td&gt;Agent 能力怎么扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;05&lt;/td&gt;
 &lt;td&gt;五层记忆体系：从短期到持久化&lt;/td&gt;
 &lt;td&gt;Agent 怎么记住事情&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;06&lt;/td&gt;
 &lt;td&gt;纵深防御：23 项安全检查与&amp;quot;不信任任何输入&amp;quot;&lt;/td&gt;
 &lt;td&gt;怎么让 Agent 安全&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;07&lt;/td&gt;
 &lt;td&gt;投机执行与自研状态管理：隐藏延迟的两个利器&lt;/td&gt;
 &lt;td&gt;怎么让用户感觉快&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;08&lt;/td&gt;
 &lt;td&gt;多 Agent 编排：三种执行模型与 Coordinator 模式&lt;/td&gt;
 &lt;td&gt;多个 Agent 怎么协作&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;09&lt;/td&gt;
 &lt;td&gt;在终端里造一个浏览器：自定义 Ink 渲染引擎&lt;/td&gt;
 &lt;td&gt;终端 UI 怎么做到 60fps&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10&lt;/td&gt;
 &lt;td&gt;Bridge 与协议层：让 VS Code、Web、Mobile 共享一个 Claude&lt;/td&gt;
 &lt;td&gt;CLI 怎么变成平台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;11&lt;/td&gt;
 &lt;td&gt;Skill、Plugin、Hook：三层扩展的设计谱系&lt;/td&gt;
 &lt;td&gt;怎么不改源码就扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;回顾：从 Claude Code 中提炼的 10 个 Agent 工程模式&lt;/td&gt;
 &lt;td&gt;带走什么&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;下一篇，我们将深入 &lt;code&gt;query.ts&lt;/code&gt; 中的 &lt;code&gt;while(true)&lt;/code&gt; 循环，看看这个 Agent Runtime 的心脏是如何一拍一拍跳动的。&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>