00. 运行时分层¶
编程智能体首先要划清模型和本地系统的边界。Claude Code 可以拆成七层:入口层把 CLI、TUI、SDK 或服务端请求转换成统一运行配置;状态层保存当前会话、设置、MCP、工具、任务和界面状态;上下文层收集系统提示、项目规则、长期记忆和历史消息;查询引擎(QueryEngine)把这些输入合成一轮可执行请求;查询循环负责反复向模型采样并处理工具调用;工具运行时负责校验、权限判断和执行本地处理器;持久化层把会话写入转录记录(transcript),支持恢复(resume)、分叉(fork)和压缩(compact)后继续工作。
这套结构最重要的是模型边界。模型收到的是经过本地运行时装配后的消息、系统提示、工具结构说明(schema)和若干上下文附件。模型返回的是助手消息,其中可能包含自然语言,也可能包含工具调用(tool use,表示模型想让本地执行某个动作)。工具调用只是一段结构化意图,例如“运行 Bash 命令”或“读取某个文件”。它不会自动进入操作系统,也不会自动修改文件。运行时会先找到对应工具,再验证输入结构,运行钩子(hook,用于在执行前后插入本地检查或补充上下文),做权限决策,最后才调用本地处理器。
第二个边界是上下文边界。Claude Code 不会把磁盘、历史、记忆和规则原样全部交给模型。它会把不同来源整理成若干层:默认系统提示描述智能体行为;项目规则和用户规则变成用户上下文;git 状态等环境信息变成系统上下文;历史消息和工具结果构成对话主干;技能、MCP、压缩摘要、已读文件附件等按需要追加。查询循环每次采样前都会重新评估这些层,必要时压缩旧历史或补充动态发现的信息。
第三个边界是权限边界。权限不是提示词里的提醒,而是本地运行时的执行条件。模型可以请求一个工具,但工具是否可用、是否要问用户、是否能进入沙箱、是否被拒绝规则拦截,全部由本地代码决定。钩子可以影响输入或要求询问,但钩子的允许结果也不能越过显式拒绝、安全检查和工具自身限制。这样一来,模型输出和本地副作用之间始终隔着一层可审计的执行系统。
这个分层让一次任务不再是单个请求处理器,而是一组可恢复、可中断、可审批的状态转换。模型可能犯错、请求越界工具或输出无效参数,但真正的副作用必须经过本地运行时。理解 Claude Code 可以从数据流开始:输入进入查询引擎,查询引擎生成上下文并启动查询循环,查询循环调用模型,模型输出工具意图,工具系统在权限框架下执行,结果作为新的用户消息回填,下一次采样继续利用这些结果推进。
本章建立的是整体地图。后续章节会沿这条数据流展开:请求如何进入运行时,领域对象如何表达会话,入口如何收敛到核心,查询循环如何持续推进,工具和权限如何把动作限制在本地边界内。