Summary (EN): Auto-compaction drops the user's newest ask and keeps stale ones, which makes the agent drift further off-target after every compaction. Root cause is in the hardcoded checkpoint prompt; OpenCode solves the same problem with two mechanisms we don't have. Suggested fix inside.
我遇到的困难
我是 MiniMax Code 的重度用户,长时间跑一个任务会话是常态。遇到一个反复出现、而且我没法自己修的问题:
上下文满触发自动压缩后,Agent 经常不再处理我最新提的需求,转而去处理上一轮甚至更早之前的需求。而那些旧需求其实早就做完了。
更麻烦的是这不只是一次跑偏。压缩之后历史就只剩那份摘要,Agent 拿着摘要里的过期待办继续干,干出来的决策、改动又变成新的历史;下次压缩时,这些基于错误前提的产出还会被写进「已完成工作」里被固化下来。偏差会一轮一轮累积、放大,越漂越远,最后我得手动把会话掰回来,有时候干脆重开会话。对一个定位是长程 Coding Agent 的产品来说,这个损失挺大的。
我发现的问题
我读了 app.asar 里的源码,定位到根因在压缩提示词,是硬编码的常量:
packages/local-runtime-v2/src/service/turn-system/compaction/execution/checkpoint-prompt.ts
export const CHECKPOINT_SYSTEM_PROMPT = `You are creating a loss-aware checkpoint of a coding-agent conversation.
...
## Pending User Asks
## Critical Context & Relevant Files`;
## Pending User Asks 是一个不分时序的收集桶。整份提示词里没有任何一条时效规则:
- 没有「只保留仍未回答或仍需行动的用户诉求」
- 没有「更新的历史优先于旧检查点」
- 没有「已解决的从待办移到已完成」
而提示词里恰恰写了一句反效果的话:Do not generate recent-query, Todo, or Plan state; the host appends verified state separately——它明确禁止摘要模型输出最近一轮状态,说这部分由宿主单独补。但宿主没有补。
我翻了自己机器上真实压缩过的会话(~/.minimax/v2/sessions/2026/10/09/.../messages.jsonl),摘要里是一长串 Pending User Asks,后面没有任何 recent-query 段落。这句话的两端都没兑现:模型不许写,宿主也不写。于是最新一轮就这么凭空消失了。
这就是漂移的起点:一份摘要里同时躺着过期待办和缺失的当前诉求,Agent 没有任何依据去偏好后者。
OpenCode 为什么做得更好
OpenCode 是开源的(packages/core/src/session/compaction.ts),同样的问题它用三个机制解决了:
一、它从物理上保住最新几轮原文。 splitConversation() 把对话切成两半,老的那半交给模型总结,最新约 15000 token 的内容原样保留,包在 <recent-context> 标签里跟摘要一起交给下一个 Agent。最新那一轮根本不经过摘要模型,自然不可能被误判成「已完成」。
二、它的摘要提示词明写了时效规则。 SUMMARY_RULES 原文:
Carry forward only user questions or requests that remain unanswered or require further action. Do not repeat ones that newer history has answered or resolved.
增量压缩时还有一条:
Newer history always takes precedence over the existing checkpoint.
三、它输出不合格会重问一次。 回复没填模板就补一句提醒再试,两次都不合格才算失败,不会让一次抽风直接毁掉整次压缩。
代码里的具体问题
按影响排序:
checkpoint-prompt.ts 的八节模板缺时效规则,Pending User Asks 没有出口。
- 同一文件里
Do not generate recent-query ... the host appends verified state separately 是未兑现的承诺——我通读了 compaction 相关代码,没找到宿主补这段的实现。
- 自动压缩路径完全没有注入自定义指令的入口。手动压缩有
customInstructions(/compact <文本> 可用),但 AutomaticContextCompactor 那边连这个字段都没有,所以我连绕都没法绕。
- 提示词覆盖机制在生产里被关掉了。
runtime-prompt-support.ts 里 enabled: false 写死,注释说是热修复;另一条 frozenPromptSource 入口需要 promptMode 或 freezeLocalPrompts,实际都没传。用户想自己修这份提示词都做不到。
我希望怎么改
按优先级:
P0 — 给 Pending User Asks 加时效规则。 一句话的事,比如「只保留仍未回答或仍需行动的用户诉求;更新的历史已回答、解决或取代的,移到 Completed Work」。这是性价比最高的一步,直接止住漂移。
P1 — 补上或者删掉那句承诺。 要么真的实现宿主追加 recent-query,要么把 Do not generate recent-query ... the host appends verified state separately 这句删掉。现在这样是提示词在骗模型,也让用户误以为有保障。
P2 — 增量压缩时声明新历史优先。 照 OpenCode 那句 Newer history always takes precedence over the existing checkpoint 加进去。
P3 — 学 <recent-context>,从物理上保住最新几轮。 这个改动大一些,但它是唯一能让「最新一轮被误判」在结构上不可能发生的方案。OpenCode 已经验证过可行。
另外两个不算 bug 但很想请求的:
- 打开提示词覆盖入口,至少让压缩提示词可以本地替换。现在用户遇到这种问题只能干等版本。
- 自动压缩也支持
customInstructions,让手动压缩已有的能力不要只留给 /compact。
环境
- MiniMax Code 桌面端 0.1.1136,macOS arm64
- 自动压缩与手动压缩都能复现,手动压缩时可我用
/compact 带指令临时缓解,自动压缩无解
很乐意帮你们测修复版,也可以补充更多会话样本。这个产品我天天在用它干活,真心希望它好——上面每一个点我都自己查过代码、确认过不是我的用法问题,但以用户身份能做的也就到这儿了。
Summary (EN): Auto-compaction drops the user's newest ask and keeps stale ones, which makes the agent drift further off-target after every compaction. Root cause is in the hardcoded checkpoint prompt; OpenCode solves the same problem with two mechanisms we don't have. Suggested fix inside.
我遇到的困难
我是 MiniMax Code 的重度用户,长时间跑一个任务会话是常态。遇到一个反复出现、而且我没法自己修的问题:
上下文满触发自动压缩后,Agent 经常不再处理我最新提的需求,转而去处理上一轮甚至更早之前的需求。而那些旧需求其实早就做完了。
更麻烦的是这不只是一次跑偏。压缩之后历史就只剩那份摘要,Agent 拿着摘要里的过期待办继续干,干出来的决策、改动又变成新的历史;下次压缩时,这些基于错误前提的产出还会被写进「已完成工作」里被固化下来。偏差会一轮一轮累积、放大,越漂越远,最后我得手动把会话掰回来,有时候干脆重开会话。对一个定位是长程 Coding Agent 的产品来说,这个损失挺大的。
我发现的问题
我读了
app.asar里的源码,定位到根因在压缩提示词,是硬编码的常量:packages/local-runtime-v2/src/service/turn-system/compaction/execution/checkpoint-prompt.ts## Pending User Asks是一个不分时序的收集桶。整份提示词里没有任何一条时效规则:而提示词里恰恰写了一句反效果的话:
Do not generate recent-query, Todo, or Plan state; the host appends verified state separately——它明确禁止摘要模型输出最近一轮状态,说这部分由宿主单独补。但宿主没有补。我翻了自己机器上真实压缩过的会话(
~/.minimax/v2/sessions/2026/10/09/.../messages.jsonl),摘要里是一长串Pending User Asks,后面没有任何 recent-query 段落。这句话的两端都没兑现:模型不许写,宿主也不写。于是最新一轮就这么凭空消失了。这就是漂移的起点:一份摘要里同时躺着过期待办和缺失的当前诉求,Agent 没有任何依据去偏好后者。
OpenCode 为什么做得更好
OpenCode 是开源的(
packages/core/src/session/compaction.ts),同样的问题它用三个机制解决了:一、它从物理上保住最新几轮原文。
splitConversation()把对话切成两半,老的那半交给模型总结,最新约 15000 token 的内容原样保留,包在<recent-context>标签里跟摘要一起交给下一个 Agent。最新那一轮根本不经过摘要模型,自然不可能被误判成「已完成」。二、它的摘要提示词明写了时效规则。
SUMMARY_RULES原文:增量压缩时还有一条:
三、它输出不合格会重问一次。 回复没填模板就补一句提醒再试,两次都不合格才算失败,不会让一次抽风直接毁掉整次压缩。
代码里的具体问题
按影响排序:
checkpoint-prompt.ts的八节模板缺时效规则,Pending User Asks没有出口。Do not generate recent-query ... the host appends verified state separately是未兑现的承诺——我通读了 compaction 相关代码,没找到宿主补这段的实现。customInstructions(/compact <文本>可用),但AutomaticContextCompactor那边连这个字段都没有,所以我连绕都没法绕。runtime-prompt-support.ts里enabled: false写死,注释说是热修复;另一条frozenPromptSource入口需要promptMode或freezeLocalPrompts,实际都没传。用户想自己修这份提示词都做不到。我希望怎么改
按优先级:
P0 — 给
Pending User Asks加时效规则。 一句话的事,比如「只保留仍未回答或仍需行动的用户诉求;更新的历史已回答、解决或取代的,移到Completed Work」。这是性价比最高的一步,直接止住漂移。P1 — 补上或者删掉那句承诺。 要么真的实现宿主追加 recent-query,要么把
Do not generate recent-query ... the host appends verified state separately这句删掉。现在这样是提示词在骗模型,也让用户误以为有保障。P2 — 增量压缩时声明新历史优先。 照 OpenCode 那句
Newer history always takes precedence over the existing checkpoint加进去。P3 — 学
<recent-context>,从物理上保住最新几轮。 这个改动大一些,但它是唯一能让「最新一轮被误判」在结构上不可能发生的方案。OpenCode 已经验证过可行。另外两个不算 bug 但很想请求的:
customInstructions,让手动压缩已有的能力不要只留给/compact。环境
/compact带指令临时缓解,自动压缩无解很乐意帮你们测修复版,也可以补充更多会话样本。这个产品我天天在用它干活,真心希望它好——上面每一个点我都自己查过代码、确认过不是我的用法问题,但以用户身份能做的也就到这儿了。