来源: #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 往返。
来源: #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):(* 表示范围含被保护/撤回排除的消息,实际覆盖以 warning 为准)。多块时逐块列出;tier 块标注 tier。
验收标准
成功 compress 的结果包含每个新建块的 id → ref 跨度;失败/partial 时仍准确;现有 45 个测试保持通过并新增对结果格式的断言。配套 acp-kernel#251(nudge 块地图)落地后两项共同消除验证性 acp_status 往返。