Skip to content

compress 工具结果缺少新块 ID 与实际 ref 跨度,模型块账本随会话漂移 #376

Description

@ranxianglei

来源: #375 (#375) 分析"模型为什么不使用推荐而是自己调用 acp_status"时发现

现象

真实会话中,模型对"之前的压缩块覆盖到哪里"的记忆与 nudge 推荐的 ranges 矛盾(记忆 b2 止于 m00056,实际 b1 止于 ≤m00043),被迫先调 acp_status 验证再执行。该记忆错误源于 compress 结果不回报新块的 ID 和实际覆盖:模型只能从自己提交的 startId/endId 推断。

根因

src/compress-tool.ts:455-458 构造的结果只有 ▣ ACP | X → Y tokens (~Z reclaimed, N blocks) + warnings;newBlockIds(L446)仅写入 debug log。同时 acp-kernel 的保护排除(src/compress.ts L806-837)与 turn-integrity 撤回(L839-879)会在事后改变实际覆盖范围——warning 只列被排除的 ref,不给最终覆盖。于是每次 compress 后模型的块账本都与现实偏差一点,累积到与 nudge 冲突时触发一次可避免的 acp_status 往返(~1.8K tokens + 一轮 LLM)。

建议方案

src/compress-tool.ts 的结果行中附带新块 ID 与实际 ref 跨度(数据已在 applied.state.blocks,取 effectiveMessageIds 的首尾 ref):

▣ ACP | 61.1K → 13.7K tokens (~47.4K reclaimed, blocks: b3=m00044–m00097*, b4=m00103–m00123*)

(* 表示范围含被保护/撤回排除的消息,实际覆盖以 warning 为准)。多块时逐块列出;tier 块标注 tier。

验收标准

成功 compress 的结果包含每个新建块的 id → ref 跨度;失败/partial 时仍准确;现有 45 个测试保持通过并新增对结果格式的断言。配套 acp-kernel#251(nudge 块地图)落地后两项共同消除验证性 acp_status 往返。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions