跳转至

卷四 03|当前可工作的上下文是怎么被拼起来的

导读

前一篇刚把对象边界拆开,这一篇就要把它们重新接回当前 turn。Claude Code 每轮真正依赖的,不是 transcript 的原样回放,而是一块为了让当前工作继续推进而被主动拼出来的工作面。卷四前半如果不把这块“当前可工作上下文”立成正式观察框架,后面的治理链就会失去对象。

这篇要回答的问题

当前 turn 真正依赖的上下文面是怎么形成的,为什么它不等于“把全部历史直接送模”?

这篇要留下的判断是:

Claude Code 每一轮依赖的不是裸历史,而是一块由规则层、附加上下文和活动消息视图共同构造出来的当前工作面。

最短构造图

flowchart TD
    A[transcript / 历史档案] --> B[不是整段原样送模]
    C[system prompt] --> F[当前可工作上下文]
    D[system / user context] --> F
    E[活动 messages 视图] --> F
    B --> E
    F --> G[当前 query]
    G --> H[继续推进当前工作]

这里故意没有把 transcript 直接放进图中心,因为 transcript 更像材料库;真正被送进当前 turn 的,是经过选择、拼装和约束后的工作面。

先把“当前工作面”这个观察框架立住

这一篇真正要替卷四立住的,不只是一个构造过程,而是一个观察框架:

之后再看 projection、collapse、compact、restore,看的都不是“历史本身怎么变化”,而是“当前工作面怎样被构造、减负、重组和续接”。

也就是说,卷四从这里开始,观察对象已经不再是裸 transcript,而是这一块为了让当前 turn 能继续工作的运行表面。

第一层:system prompt 先给这一轮定解释框架

cc/src/constants/prompts.tssystemPromptSections.ts 里,system prompt 不是单块文本,而是一组 section。它们可以缓存、可以重算、也会在 /compact 后被清空再建。这说明系统一开始就默认:

  • 当前工作面不是天生存在的
  • 规则层要持续参与构造
  • 同样一段消息,只有放进当前规则层里才有稳定含义

所以 system prompt 在这里的作用,不是“附带提示词”,而是先决定这一轮在什么运行规则下理解后面的所有材料。

第二层:system / user context 把消息外条件补进来

cc/src/context.ts 中的 getSystemContext()getUserContext() 很关键,因为它们说明:系统不会只靠消息历史来决定这一轮怎样工作。

这两层 context 往当前工作面里补的是“消息外的条件”,比如:

  • 当前仓库或 git 状态
  • 用户级或工作区级说明
  • 记忆文件与额外约束
  • 需要跨多轮保留的长期背景

这类内容的价值不在于记录过去发生了什么,而在于回答:当前模型究竟处在什么环境里工作。

如果没有这层补充,message history 只能提供“前情”;它很难独自提供“现场”。

第三层:真正带进当前 turn 的,是活动 messages 视图

当前工作面当然离不开消息,但它依赖的不是 transcript 的全量原样,而是当前仍然活跃、仍然与本轮相关的消息视图。

这一点在 compact 相关代码里尤其明显。cc/src/services/compact/compact.ts 会使用 getMessagesAfterCompactBoundary(...) 之类逻辑;这说明系统天然就区分:

  • 哪些消息属于档案层的旧世界
  • 哪些消息还处在当前活动段里

也就是说,系统并不假定“只要是历史上出现过的消息,就该原样进入本轮 query”。它更像是在维护一块随工作推进而不断更新的活动视图。

这块面的目标不是最完整,而是最能继续工作

这是这一篇真正关键的一句。

Claude Code 构造当前工作面时,追求的不是“尽量像全部历史”,而是“尽量保住当前工作能力”。这意味着:

  • 不是所有历史都必须进入本轮
  • 不是带得越多越好
  • 只要当前 turn 能保持方向、记住关键约束、接住最近工作结果,系统就已经达成目标

这也是卷四必须与“长上下文百科”拉开的地方。卷四关心的不是上下文里到底能塞多少对象,而是:什么样的上下文面,才足以让工作继续。

一旦把观察框架立住,下一篇的问题就自然出现了

如果当前工作面的目标是“可工作”,而不是“原样重演全部历史”,那么一个更深的问题就会立刻冒出来:

为什么系统不能简单一点,始终把全部历史都带着走?

到这里,卷四就会自然从“构造链”推进到“治理链”。因为只要工作面是被构造出来的,它就迟早要面对预算、相关性和聚焦能力的问题。

一句话收口

Claude Code 每一轮真正送给模型的,不是 transcript 的原样回放,而是由 system prompt、system / user context 与活动消息视图共同拼出来的当前工作面;而从卷四开始,后面所有治理与恢复动作,本质上也都在围绕这块工作面展开。