)
上篇讲了骨架和主循环中篇讲了工具和权限。但有一个看不见的约束贯穿始终而且它才是 agent 工程里最磨人的部分——上下文窗口。模型一次能「看到」的文本量是有限的而 Claude Code 偏偏要让模型在一整个代码库里干活。下篇就讲 harness 怎么在「有限窗口」里塞进「无限任务」。上下文到底由什么拼成官方文档说得很清楚会话启动时窗口里就已经有内容了远在你敲第一个字之前。拼装来源大致是这些System promptClaude Code 自身的行为与工具使用指令。CLAUDE.md / AGENTS.md项目级和用户级的约定会话开始就加载仓库里若有 AGENTS.mdClaude Code 会就地读它代替 CLAUDE.md。Auto memory跨会话学到的笔记比如构建命令、项目模式、该避的坑限前 200 行或 25KB。Skill 描述可用 Skills 的简短描述启动时即载正文触发时才注入完整内容。MCP 工具名已连 MCP 服务的工具名完整 schema 可延迟到用时再载。会话历史你读过的文件、跑过的命令、模型的回答——最大的消耗源。一个有中等体量 CLAUDE.md、挂着几个 MCP 服务的项目开会话时可能就已经吃掉两万到三万 token。这还什么都没干。200K 是默认1M 是上限但都不是免费午餐默认窗口 200K token可用opus[1m]/sonnet[1m]扩到 1M2026 年 3 月起 Opus 4.6 / Sonnet 4.6 普遍可用。/context看分类明细/usage或/cost看花费。但窗口大不等于随便用。社区把这笔账叫context window tax上下文窗口税每一轮你发消息都会把会话开始以来积累的全部上下文重新发一遍——CLAUDE.md、工具调用轨迹、读过的文件、之前的回答全算输入 token 计费。缓存能软化成本但新进来的内容文件读取、工具输出、你最新的话仍是全价。更要命的是context rot上下文腐烂上下文越长模型对其中特定部分的注意力越不可靠表现就是开始忽略 CLAUDE.md 里的规矩、忘了三回合前你定的约束、写出违背早先约定的代码。1M 只是把天花板抬高没消除腐烂只是推迟它。窗口快满时五段压缩管线当上下文接近上限Claude Code 会触发自动压缩auto-compaction论文给出的触发点约在窗口容量的 85%–92%。它把对话历史换成结构化摘要保留原始需求、技术细节、动过的文件、已做的决定、待办项。设计空间论文把压缩管线拆成五段连续整形器在query.ts里、每次模型调用前跑budget reduction预算削减、snip裁剪、microcompact微压缩、context collapse上下文塌缩、auto-compact自动压缩。这是个层层递进的「挤牙膏」过程而不是一次性 summary。你也可以手动/compact而且能带 focus 指令告诉它优先保什么/compact focus on the auth bug fix但压缩本质是有损的。官方明确列了压缩后各自的下场System prompt 和输出风格不变。项目根 CLAUDE.md 和无作用域规则从磁盘重注入。Auto memory从磁盘重注入。路径作用域规则.claude/rules/丢失直到再读到对应文件。嵌套 CLAUDE.md丢失直到再读那个子目录的文件。已触发的 Skill 正文重注入但单 Skill 上限 5000 token、总计 25000 token。Hook不受影响因为它以代码形式跑不活在上下文里。这就是为什么老手都强调压缩是安全网不是策略。靠压缩续命的会话关键决定可能在压缩后失真——你在第三小时定的「这个接口用老格式」摘要未必保得住。正经做法是开局就控量CLAUDE.md 压到 200 行内、把参考资料搬进 Skills 按需加载、用子代理承接噪音。子代理把噪音挡在主会话之外子代理是上下文工程里最划算的一招。它跑在自己独立的上下文窗口里只把最终摘要回给主会话。你要读五十个文件做架构梳理、跑一遍安全扫描——这些中间产物会淹没主会话、且你再也不会引用——交给子代理主窗口只收到一份干净的结论加一点元数据。子代理在.claude/agents/下用 Markdown YAML frontmatter 定义name、description决定何时被委派、tools最小权限只读审计代理就别给 Write、model把便宜活路由给 sonnetopus 留给重推理、maxTurns、disallowedTools、permissionMode。Claude Code 还内置 Explore只读代码库搜索和 Plan规划期调研两个子代理自动把探索输出挡在主窗口外。模式上最值得用的是「对抗式评审」在一个全新子代理上下文里跑评审它只看到 diff 和评审标准看不到你产生改动时的推理——于是它按自己的标准打分而不是顺着你的思路点头。Skills 与 MCP不动主循环就能续能力这两个扩展机制都不改主循环只是往工具池和上下文里「插模块」。Skills描述启动即载便宜正文触发才注入贵。用disable-model-invocation: true可以让带副作用的 Skill 只在手动调用时加载避免模型擅自触发。/agents、/commands这类是打包好的可复用流程。MCPModel Context Protocol开放标准把外部工具和数据源接进工具池。三种传输stdio本地进程适合自定义脚本、http远程/云服务的推荐方式可带 bearer token、sse。连上之后Claude Code 能直接读你的 Jira、查 Postgres、拉 Figma、改 Notion——而不是你把这些内容复制进聊天框。触发信号很朴素当你开始频繁把另一个工具里的数据粘进对话就是该接 MCP 的时候。记忆跨会话的那块持久层上下文每轮重发、压缩还会丢所以真正要长期留的东西得落到磁盘。CLAUDE.md存项目约定每次会话重注入MEMORY.md存跨会话学到的偏好与坑限前 200 行 / 25KB。这两类文件是 harness 的「长期记忆」跟会话里那块会腐烂的上下文是两回事。把「同一句话你说第二遍」就说明它该进 CLAUDE.md 或 Skill——这是减少上下文税最直接的纪律。一句话带走下篇也带走整个系列Claude Code 能在有限窗口里干无限的活靠的不是更大的模型而是 harness 的一整套分层手艺工具池控量、权限与 hook 控险、压缩管线控窗、子代理隔离噪音、Skills 与 MCP 续接能力、磁盘记忆扛住跨会话。模型只是被这层壳托着的内核。回到上篇那句话——harness 才是主体。看懂这五层、这五段、这三道防线你就不只是「会用」Claude Code而是能判断它什么时候会失灵、在哪里失灵、以及该怎么在它失灵前先布好护栏。参考资料Anthropic.Explore the context window. https://code.claude.com/docs/en/context-windowAnthropic.Sub-agents. https://code.claude.com/docs/en/sub-agentsGeeksforGeeks.Controlling Context in Claude Code. https://www.geeksforgeeks.org/artificial-intelligence/controlling-context-in-claude-codeAnonymous.Dive into Claude Code: The Design Space of Today’s and Future AI Agent Systems. arXiv:2604.14228作者唐悦玮 | 从后端出发用 AI 拓展到全栈的工程师。