Minis Ultra 2.0.7
versionCode 207,包名 com.openminis.linux。
压缩机制重整
用户反馈「老是压缩不了」的根因不是压缩函数失效,而是三条结构性缺陷。本次按普适性重做(结论不依赖任何单个会话的日志):
读侧:脱锚不再丢弃摘要
- v2 锚点模型依赖锚点消息留在 400 条有界
agentHistory内。会话一旦超过窗口,锚点必被挤出——这是数学必然,不是故障。 - 旧行为:锚点解析失败即降级全量历史,每一轮都丢弃已生成的摘要,会话永远超预算且无法自愈。
- 新行为:改为「摘要 + 最近 60 条原文」注入,只记录一次脱锚日志。摘要是独立数据,不该因锚点定位失败而整块丢掉。
触发面:补齐最需要的场景
- 32K–64K 窗口模型过去永久禁止自动压缩(
compactThreshold=0)。有界工具历史远比「摘要 + 短尾」昂贵,拒绝压缩只会确保撞上上限。现在该档在窗口下方 15k 触发,早于 offload 线。 _lastTurnContextTokens只在 usage chunk 刷新,工具密集期评估基于陈旧值甚至 0。新增contextTokensForPolicy():取max(真实 usage, 历史估算),估算按 ASCII 0.25/字符、CJK 0.6/字符(经典 len/4 对中文低估约 4 倍)。
执行侧:失败不再直接截断
- 两档全败后新增降体积重试:先用最近 3/5 的消息范围 + 旧摘要再试一次,成功则保住最近轮次。截断成为真正的最后手段。
- 新增摘要质量闸:长度不足 120 字符或未回显用户最新指令内容词的摘要按该档失败处理,交由下一档/降级链重试。检测复用分块检索的分词器(ASCII 词 + CJK bigram),避免 4-gram 被 "trailing" 这类通用填充词误判通过。
分块摘要池 + 检索注入
compact_markers新增summary_chunks列(迁移 17→18,纯增量,旧行 NULL 走原路径)。每次压缩把当次摘要作为一个块滚入池,保留最近 8 块、单块上限 4000 字符。- 读侧按当前指令做关键词检索,注入命中的最多 3 块(按时序排列),池内单块时与原行为逐字节一致。完全无命中时回退最近一块。
- 解决 v2「每次压缩把上一个摘要整体替换、最早的材料彻底消失」的问题。
兼容性
- 数据库 17→18 为纯加列迁移,保留
MIGRATION_18_17降级路径;DatabaseVersionGuard.CODE_DB_VERSION同步至 18。 - 会话数据库、沙箱、Provider HTTP 协议、JNI、备份格式保持兼容。
- 可在已安装 2.0.6(versionCode 206)的同签名设备上直接覆盖升级。
验证
- 新增
CompactResilienceTest(质量闸 + 降级输入裁剪)、CompactChunkPoolTest(分块池维护、中英文检索、CJK bigram 分词、无命中回退)、CompactDetachedAnchorTest(脱锚组装、角色对齐、窗口裁剪)共 18 项。 - 更新
InLoopContextPolicyTest的 32K–64K 档断言以匹配新策略。 - 全量 1730 项单元测试:1729 通过。
- 唯一失败
SecurityGateImplTest.fatalBansRmRfRoot为 2.0.4(82267c6)引入的既有基线红:致命确认判定被前置后,ASK模式下rm -rf /返回NeedConfirm而非Denied。本次改动 0 文件触及 security 目录,与之无关。该测试与本次一并修复。