Cosmo Santoni | 2026-02 | arXiv 2602.22402 Category: agent | Tags: context-management, session-branching, prompt-trimming, dag-state-model, llm-agent-tooling Read: 2026-05-25
CMV 将 LLM agent 会话历史建模为 DAG(快照为节点、分支为边),配合三遍流式裁剪算法(保留用户/助手消息、删除 tool 输出/base64/元数据),实现均值 20%、峰值 86% 的 token 缩减,并在 prompt caching 场景下 10 轮内收回缓存失效惩罚。
LLM coding agent 在长会话中积累架构理解、设计决策、代码库惯例等高价值上下文。当 context window 接近上限时,原生 autocompaction(如 Claude Code /compact)将 132k token 压缩到 2.3k——损失率 98%。新会话必须从零重建,导致 10–20 轮、15–30 分钟、输入成本二次增长的重复劳动。
现有方案各有缺陷:RAG 不保存对话状态;MemGPT 仅单会话 + 模型自管理内存;prompt 压缩(LongLLMLingua / RECOMP / In-Context AE)在 embedding 层操作、与 CMV 正交;原生 /rewind / --fork 缺少命名状态和谱系追踪。

Paper Figure 1: 左侧 132k token(76% 容量),右侧 2.3k token(12% 容量)。Autocompaction 将 98% 积累的会话状态压缩为寥寥数句。
Figure 1 直观展示了问题的严重性:左右两幅截图来自同一个 Claude Code 会话,一次 autocompaction 即抹去了几乎全部上下文。这不是 edge case——paper 的 76 个会话平均 84k token,说明大量会话在 compact 后都会遭遇类似损失。
类比:如同 OS virtual memory 将物理 RAM 抽象为连续地址空间、通过 paging 实现透明换入换出,CMV 将 LLM context window 抽象为可持久化、可分支的虚拟状态空间——用户可将"84k token 的理解"作为稳定根节点,衍生多条独立工作流,无需重建。
DAG 状态模型:会话历史 $G = (V, E)$,其中节点 $v \in V$ 是不可变快照(JSONL 对话日志 + 元数据),边 $(v_i, v_j) \in E$ 表示从 $v_i$ fork 出独立工作会话后生成 $v_j$。四个原语:Snapshot(捕获)、Branch(fork + 可选 trim)、Trim(Snapshot + Branch 复合)、Tree(ASCII 可视化谱系图)。
三遍裁剪算法:
String.includes() 扫描原始行,定位最后一个 compaction boundary $B$tool_use ID 集合 $\mathcal{O}$tool_result / 写工具输入替换为 stub;丢弃 tool_use_id ∈ \mathcal{O} 的孤儿 tool result保留保证:每条 user message、assistant response、tool invocation 元数据(file_path, command, description 等)原样保留——只剥离机械性输出。
核心技术壁垒:孤儿 tool result 处理。原生 compaction 的边界可能切割 tool_use/tool_result 配对——tool_use 在边界前被丢弃,但对应的 tool_result 留在边界后。LLM API 严格校验配对关系,缺少 tool_use 的 tool_result 直接触发 validation error。CMV 通过两遍前置扫描(Pass 1 + 2)预收集将成为孤儿的 ID,在 Pass 3 静默丢弃,保证 API 正确性——这是三遍架构存在的根本原因。
CMV 工作流:用户在 session s₀ 中积累 context 后执行 Snapshot 生成不可变节点 v₀;随后可多次 Branch 并经过三遍 Trimmer 产出独立子会话。DAG 的 tree 命令可渲染完整谱系图。
Pass 3 的七条裁剪规则按优先级:pre-compaction skip → metadata removal → base64 stripping → tool_result stub → tool_input stub → thinking block removal → orphan stripping。白名单字段(file_path, command, url 等)在 stub 时永远保留,确保模型仍知道"读过哪些文件、跑过哪些命令"。
无形式化作者证明 — 仅实证。
论文的数学内容限于经济可行性的 cost model(§4.1),不涉及收敛或正确性的形式证明。
Cost model 符号表:
| 符号 | 含义 |
|---|---|
| $T$ | token count |
| $h$ | cache hit rate |
| $P_\text{read}$ | cache read price / M tokens |
| $P_\text{write}$ | cache write price / M tokens |
| $T_\text{pre}$, $T_\text{post}$ | trim 前后 token count |
| $n^*$ | break-even turn |
Cost model 方程:
稳态每轮成本:$C(T, h) = \frac{T}{10^6}(h \cdot P_\text{read} + (1-h) \cdot P_\text{write})$
Cold-cache 惩罚轮成本:$C_\text{cold}(T) = \frac{T}{10^6} \cdot P_\text{write}$
一次性惩罚:$\Delta_\text{penalty} = C_\text{cold}(T_\text{post}) - C(T_\text{pre}, h)$
每轮节约:$\Delta_\text{savings} = C(T_\text{pre}, h) - C(T_\text{post}, h)$
Break-even 轮数:$n^* = \lceil \Delta_\text{penalty} / \Delta_\text{savings} \rceil + 1$
物理意义:trim 后的首轮丢失缓存前缀(写价格),后续轮因更小 prefix 而在 cache hit 下节省。$n^*$ 就是累积节约追平一次性惩罚所需的轮数。
6 checks:
可形式化但未做:trimming 的 "structurally lossless" 可以形式定义为投影函数 $\pi: M \to M'$ 使得 $\forall m \in M_{\text{user}} \cup M_{\text{assistant}}: m \in M'$,即 user/assistant 消息集合不变。论文以自然语言声明但未用集合论证明。
单用户 Claude Code(Opus 4.6)三个月的实际编码会话,排除子代理会话和 <10 messages / <5k token 的会话后保留 76 个。以 chars/4 估算 token(对 text-dominated 会话准确、对 image-heavy 会话高估)。假设 $h = 0.9$ 缓存命中率。

Paper Figure 2: 76 个会话的 token reduction 分布,按 bloat profile 着色。中位 12%,均值 20.4%,长尾可达 86%。
分布呈右偏长尾:29 个会话缩减 <5%(几乎纯对话),但 12 个 mixed 会话平均 39%。这意味着 CMV trimming 对 tool-heavy 会话有显著价值,对纯对话会话接近无效——适用性取决于 workflow 类型。

Paper Figure 3: 散点图。>30% 缩减的会话在 15 轮内 break-even("worth it" 区域),<10% 缩减的会话聚集在 60 轮 cap("trimming is unnecessary" 区域)。
Figure 3 是论文经济论证的关键图:它将 reduction 和 break-even 的非线性关系可视化——30% 是实用分界线,低于此值 trimming 在 API 定价下可能是净负面的。两条注释线(<15 turns = worth it, <5 turns = easy win)帮助实践者快速判断。

Paper Figure 4: 累积输入成本。高亮会话(46% 缩减)在 turn 6 回本,此后持续节省。淡线显示其他会话的分布。
高亮线清晰展示了 trim-then-cache 策略的典型行为:首轮 cold miss 造成跳跃,但更小的 prefix 使后续每轮斜率降低,curve 持续发散。

Paper Figure 5: 各会话 JSONL 字节组成。绿色 = 对话内容(保留),其他颜色 = 可裁剪开销(tool results, thinking/sigs, file history 等)。
Figure 5 解释了 bimodal 分布的根源:有些会话(如左侧几个)tool result + file history 占比超 40%,给 trimmer 留出大量空间;右侧会话几乎全是对话,trimmer 无处可削。
| Bloat Profile | Sessions | Mean Red. | Med. Red. | Mean Break-even | Mean Context |
|---|---|---|---|---|---|
| Mixed (≥15%) | 12 | 39% | 33% | 10 turns | 97k |
| Conversational (<15%) | 64 | 17% | 10% | 40 turns | 82k |
| All | 76 | 20% | 12% | 35 turns | 84k |
Mixed 会话虽仅占 16%,但平均上下文更大(97k vs 82k),break-even 更快(10 vs 40),是 trimming 的主要受益群体。
论文明确承认:branching 带来的 context rebuilding 避免是 "primary value proposition",但仅以定性论述支撑。一次 branch load 成本 $0.53(cache-write, 84k token),缓存命中后降至 $0.04——远低于从零重建同等理解的 10–20 轮累积成本。
| Step | 论点 | 证据 | 逻辑类型 |
|---|---|---|---|
| 1 | Autocompaction 在 context window 满时造成 98% 的会话状态损失 | Fig. 1: 132k → 2.3k 观测实例 | 观察归纳(n=1 实例) |
| 2 | 现有方案(RAG, MemGPT, prompt compression)不能保留完整对话状态 | §1 功能对比表:RAG 无状态、MemGPT 单会话、压缩操作在 embedding 层 | 分类排除 |
| 3 | DAG 版本控制模型 + 四原语可实现跨会话 context 复用 | §2 形式定义 $G=(V,E)$ + Snapshot/Branch/Trim/Tree 语义 | 构造性设计 |
| 4 | 三遍裁剪算法在 structural level 无损压缩 conversation log | Algorithm 1 + 七条规则 + 孤儿处理保证 API 正确性 | 算法规约 |
| 5 | Trimming 在 mixed 会话中经济可行(39% 缩减, 10 轮 break-even) | Table 3, Fig. 2–4: 76 session 实测 | 经验验证 |
| 6 | Context rebuilding 避免是主要价值但未定量测量 | §4.4: 定性论述 "10–20 turns / 15–30 min" | 未验证声明 |
论证链从问题观察(step 1)经由排除现有方案(step 2)到设计方案(step 3–4),再经实验验证(step 5),最后以未验证声明(step 6)结束。注意 step 1 的 98% 数字来自单例观测,step 6 完全无量化支撑。
开源参考实现:github.com/CosmoNaught/claude-code-cmv
三遍架构存在的唯一原因是 LLM API 的 tool_use / tool_result 严格配对约束。如果 API 允许未配对的 tool_result(或自动忽略),Pass 2 可以被消除,算法退化为单遍流式过滤。CMV 在 userland 解决了一个本质上属于 API schema 设计的问题——未来 API 松绑此约束将使此壁垒消失。
§ Agent scope: 本文的 agent 是 coding agent(Claude Code),属闭环(single-user 持续交互、tool-use dominated),交互模式为多轮、人在环路。CMV 不改变 agent 本身的推理能力,而是管理其 context window 生命周期。
§ Planning & reasoning: CMV 不涉及 agent 的 planning / reasoning 机制——它在 agent 下层运行,管理会话日志。用户手动决定何时 snapshot / branch / trim。无 backtracking(快照不可变),但可通过创建新 branch 实现功能等价的 "回到旧状态"。
§ Tool & environment interface: CMV 自身的 "tools" 是四个 CLI 命令(snapshot, branch, trim, tree),操作对象是文件系统上的 JSONL 文件。Side effects: snapshot 为只读复制;branch 创建新会话目录;trim 在 branch 基础上修改 JSONL。Environment 假定:文件系统确定性、Claude Code JSONL 格式稳定。
§ LLM backbone requirements: 无最小模型要求——CMV 操作的是 conversation log 而非 model weights。论文评估仅用 Opus 4.6,但方法对任何遵循 tool_use / tool_result schema 的 API 通用。
§ Evaluation: 无标准 benchmark。76 个真实 session 的 case study,single-user(n=1 user)。Metric: token reduction %, break-even turns, cumulative $ cost。无 pass@k / success rate / reasoning accuracy 测量。无与其他工具的 A/B 对照。
§ Production readiness: 参考实现是 CLI wrapper over filesystem + JSONL 操作。无沙箱(直接操作 Claude Code session 文件)。无 auth / secrets 管理。无并发控制(手动单用户操作)。Observability: Tree 命令提供谱系可视化。成本控制:break-even 分析作为事前决策工具。
[实现已公开] — https://github.com/CosmoNaught/claude-code-cmv