Compaction v2 — 四种任务类型的评分表(2026-08-15,基于锚点索引构建)
从state.db中选取了4组真实的50万token长度的文本语料,分别对应四种应用场景(扫描任务、GUI桌面操作、PR合并任务、ACP/PR审核任务),每种场景均配有15题的召回测试。“恢复机制”指的是针对归档区域进行一次会话搜索往返查询(模拟FTS5+BM25算法)。精简版构建方案包含:2.5万token的截断处理、降级版的尾部处理工具、分块摘要生成(经过噪声过滤,保留原始工具内容)、机械式锚点索引、用户原始消息完整展示、恢复机制相关页脚信息,以及升级后的摘要生成提示词。
历史记录(2026-08-30): 此处描述的“分块摘要”机制后来已被替换——现在的详细会话日志是通过同一条摘要生成请求获得的(精简版压缩算法每次仅调用一次辅助大语言模型;不再为每个数据块单独生成摘要)。详情参见#96603。
测试结果(召回率 % @ 保留的token数量)
| 算法策略 | 扫描任务 | GUI任务 | PR合并任务 | ACP任务 | 平均值 |
|---|---|---|---|---|---|
| 未压缩版 | 93.3% @ 500K | 96.7% @ 500K | 96.7% @ 500K | 100.0% @ 500K | 96.7% |
| 当前版本 | 93.3%*@ 176K | 26.7%*@ 156K | 33.3% @ 155K | 30.0% @ 160K | 45.8% @ 162K |
| 精简版 | 40.0% @ 62K | 60.0% @ 41K | 23.3% @ 44K | 36.7% @ 50K | 40.0% @ 49K |
| 精简版+恢复机制 | 70.0% @ 62K | 80.0% @ 41K | 43.3% @ 45K | 80.0% @ 50K | 68.3% @ 49K |
- 扫描任务/GUI任务的当前版本得分基于之前的题库数据(使用相同的语料;在四类任务测试中重新生成了题库)。PR合并任务/ACP任务的对比则是基于完全相同的题库在所有测试组间进行的。
测试结论
-
在相同参数设置下,LEAN+RECOVERY的平均得分比CURRENT高22.5分(分别为68.3分和45.8分),且使用的token数量更少(4.9万 vs 16.2万)。在4份测试文本中有3份中它胜出,仅在一处因CURRENT凭借“重述事实”这一偶然因素而获得高分而落败——该文本的93.3分实为人为抬高的结果;详见之前的评分分析。
-
ANCHOR INDEX通过精确识别各文本的唯一标识符(如SHA值、ID、路径及错误信息),而非依赖总结工具,成功解决了“needle-FACT”类别的问题。采用GUI封闭式处理方式的得分从23.3分提升至60.0分,而结合恢复功能的GUI模式则从46.7分上升至80.0分。ACP+恢复功能更是达到了80.0分的优异成绩。
-
最新的两份测试文本进一步证明CURRENT表现疲软而非强劲:其得分分别为33.3分和30.0分,且处理的token数量约为15.7万。此前的93.3分纯属偶然的“重述事实”现象,并非源于模型本身的政策理解能力。CURRENT在处理16.2万token时的平均得分为45.8%,而LEAN+RECOVERY在消耗不到三分之一的资源下就能高出22分。
-
prmerge场景对所有模型而言都是最具挑战性的类型(得分上限仅为96.7分,最佳模型得分也仅43.3分):长度达110万token的文本链在处理到50万token时即被截断,且存在大量复杂的多个PR状态。在此类场景下,模型失败的主要原因多在于查询语句的构建不当,而非计算资源不足。
-
目标检测结果(Teknium):尾部数据量满足max(10K, 2.5%)的要求 ✓;摘要内容仅限于压缩处理后的区域 ✓(通过哨兵机制验证);session_search指针功能正常 ✓(得分提升20-43分);该模型的准确率更高,同时还能实现更显著的资源节省 ✓(在0.30倍token消耗量下即可高出22.5分)。
Codex CLI直接对比测试(使用相同文本、相同测试题及同一评估标准)
真正的 OpenAI Codex CLI(版本 v0.147.0,模型 gpt-5.6-sol,上下文窗口大小为 258K)在完全相同的四份文本转录本上实现端到端运行:首先通过 codex exec 读取分块文件,直至触发其真正的自动压缩功能(可通过 rollout jsonl 文件中的 compacted 事件进行验证;最大上下文容量为 455-483K);随后再利用相同的 15 题试题库从内存中对模型进行测试,并由同样的评分标准给出分数。
| 指标 | 真实 Codex(压缩后) | Hermes 当前版本 | Hermes 简化闭卷模式 | Hermes 简化+恢复模式 |
|---|---|---|---|---|
| 政策遵循度 | 26.7% | 93.3%* | 40.0% | 70.0% |
| 扫描覆盖率 | 40.0% | 26.7%* | 60.0% | 80.0% |
| GUI 使用效率 | 43.3% | 33.3% | 23.3% | 43.3% |
| PR 合并能力 | 36.7% | 30.0% | 36.7% | 80.0% |
| 平均得分 | 36.7% | 45.8% | 40.0% | 68.3% |
| 保留状态量 | ~4.5K | ~162K | ~49K | ~49K |
备注:
- Codex的答案源自其自身的压缩后会话——这相当于我们“闭卷模式”下的真实表现。它没有类似session_search的功能(虽然相关数据存储在磁盘上,但代理在运行时无法检索),因此恢复功能在Codex中也不存在对应方案;而这正是Lean所依赖的差异化优势所在。
- 经过公平对比后,Lean的得分为40.0%,而Codex为36.7%——在保持Codex10倍数据量的情况下,Lean的得分仍高于Codex,且仅为当前Codex得分的0.30倍。若考虑恢复功能,Lean的得分比Codex高出31.6分。
- 在prmerge场景下,Codex与Lean+恢复组合的得分相当,均为43.3%——由于密集的多PR查询场景对所有策略而言都是最复杂的测试环境,因此也是优化迭代的最佳目标。
- 需注意的方法学限制:Codex将接收到的对话内容视为“文件读取结果”(即工具的输出),而非原生对话内容——这一处理方式与其压缩逻辑中对工具输出的整合方式一致(会将所有工具输出汇总到服务器端的摘要中),但与原生会话在字节层面并不完全相同。此外,Codex所使用的模型(gpt-5.6-sol)也与我们系统中用于回答问题的模型不同;因此各项得分是比较整个压缩流程的端到端表现,而非单独模型的性能。另外,Codex对每次测验回复的长度也有所限制(15条回复最多约1000字符),这也与其压缩后的简洁风格有关。
建议
将Lean作为可选功能推出(compression.tail_mode: lean,默认为旧版本模式),而将Harness设为默认启用方案。在最终切换为默认模式之前,可通过该标志推动prmerge类检索功能的迭代优化(如查询挖掘、每轮迭代的锚定窗口设置等)。
附录:每条对话记录的详细数据
对话记录:sweep
| 策略 | 回忆率 | 合并前token数 | 合并后token数 | 压缩比 |
|---|---|---|---|---|
| lean | 40.0% | 499,625 | 61,567 | 114.9 |
| lean+recovery | 70.0% | 499,625 | 61,792 | 114.8 |
15道试题(questions-30b95351c7.json)
-
为何禁止在过时的分支上使用‘git checkout pr-branch –
’命令?
正确答案:过时的文件版本会悄悄覆盖更新后的主代码 -
根据相关记录,在问题#81625中报告的回归问题上,网关的RSS内存每约2小时会增加多少?
正确答案:约60GB -
在问题#83420中,导致Windows系统出现卡顿现象的具体Electron设置是什么?
正确答案:backgroundThrottling -
在NousResearch/hermes-agent仓库中尝试使用‘gh pr merge –auto’命令时,会返回怎样的错误信息?
正确答案:该仓库不允许自动合并(请启用PullRequestAutoMerge) -
子智能体配置文件中必须包含的指定“规则0”是什么?
正确答案:首先加载对应技能 -
在2026年7月的标题集群扫描中,被遗漏的首个提交者PR #35416的标题是什么?
正确答案:为标题生成添加配置校验 -
哪条文件路径包含了#34034/#28149相关的清单保护规则‘test_bundled_plugin_manifests_ship_in_both_wheel_and_sdist’?
正确答案:tests/test_packaging_metadata.py -
根据后台进程通知,/home/teknium/salv-desktop中运行的‘npm ci’命令最终结果是什么?
gold:正常完成(退出码为0) -
在问题#79434中,导致‘uv sync –extra all –locked’命令每日都会失败的根本原因A是什么?
gold:相对排除更新版本的功能使得已提交的锁定文件每天都会失效 -
在PR #86605中,被标记为已完成的任务共有多少个?
gold:13 -
在‘salv-cron’工作区中,当代理尝试执行‘BLOCKED (hardline)’命令时,其退出码是多少?
gold:-1 -
为“网关排放系统”生成的技术示意图信息图的完整标题栏文本是什么?
gold:GATEWAY DRAIN × CRON — SHUTDOWN CONTRACT -
在[03:56:19]时,是哪个PR的监控器报告了‘=== ALL GREEN (streak=1, checks=46) ===’的状态?
gold:82980 -
在cron集群中,用于存储PR信息图宿主内容的特定Gist编号是什么?
gold:ee33edd5804689243f974536ef7aecb9 -
Cluster D中的Trigger-now PR #70638最终的合并SHA值是多少?
gold:f9d64b9a9d8b306f64851c1a13869d96ad5d7869 -
根据Teknium的设计理念,代码库中“平台工具集”的现状如何?
gold:平台工具集已沦为冗余组件,从未被公开使用。 -
在7月的代码审查过程中,有哪个问题的配置桥接实际上早已存在于其声称缺失的那一行代码中?
gold:#32263 -
在2026年8月的cron-summarizer集群审查中,合并后发现有哪两个PR编号的实际提交者才是最初的提交人?
gold:#60593, #61969 -
当某个特定的符号修复被应用到主分支时,推荐使用哪种Git命令来查找相关记录?
gold:git log -S "<symbol>" -
为何#39719补丁会悄悄从cli-config.yaml.example中删除236行代码?
gold:过时的文件版本会自动覆盖 newer的主分支代码。 -
对于那些使用类似‘pwn@example.com’这类占位符身份的提交记录,应遵循怎样的处理规则?
gold:切勿单独提取这些提交。应作为维护者提交的代码重新应用,并将GitHub PR的提交人标记为共同作者。 -
当遇到“gh pr merge”502错误时,智能体应如何处理?
gold:在“合并操作已在进行中”的提示消失后(约45秒),再次尝试执行相同命令;两次尝试之间需检查PR的状态。 -
根据开发指南,哪两项原则几乎决定了Hermes的所有设计决策?
gold:每次对话的提示缓存是不可或缺的,且核心功能应保持精简——实际能力仅分布于边缘模块。 -
当阻止修改历史记录的命令时,实时检查 Git 保护机制会显示什么错误信息?
正确答案:已阻止:git <操作>会修改 Hermes 的实时源代码检出目录(/home/teknium/.hermes/hermes-agent),并且可能导致模块混淆 -
Desktop 集群中的 ‘npm ci’ 命令在尝试写入 /tmp/ccH06T4r.s 时出现错误,这是由于什么原因?
正确答案:设备空间不足 -
当首次出现 “API 速率限制已达到上限” 的错误时,该用户的 GraphQL API 速率限制还剩多少?
正确答案:0 -
哪个拉取请求被认定为用于修复 HexLab98 的 #85283 任务中卡住的内联 API 调用问题?
正确答案:#86645 -
为什么拉取请求 #79268 能解决 TUI 中出现的不可见覆盖层问题?
正确答案:renderNodeToOutput 函数会跳过那些被 Yoga 缩放至高度为 0 的元素 -
在 #34701 任务中,wheel 子包检测机制会导致怎样的具体 ModuleNotFoundError 错误信息?
正确答案:ModuleNotFoundError: 未找到名为 ‘hermes_cli.dashboard_auth’ 的模块
转录结果:GUI 模式
| 策略 | 回忆率 | 处理前token数 | 处理后token数 | 压缩比s |
|---|---|---|---|---|
| lean | 60.0% | 499,818 | 41,232 | 118.1 |
| lean+recovery | 80.0% | 499,818 | 41,306 | 115.2 |
15道试题(questions-36d3d87e0b.json)
-
针对 Hermes Desktop 中对话中途消息顺序错误问题所提交的修复方案,其拉取请求编号是多少?
正确答案:#86617 -
根据AGENTS.md中的贡献规范,哪些配置应放在’.env’文件中,哪些又应放在‘config.yaml’中?
正确答案:.env文件仅用于存储敏感信息(如API密钥、令牌、密码)。所有与行为相关的设置……都应放在config.yaml中。 -
在Python测试中,导致AssertionError(assert 56 == 55)的具体文件及行号是什么?
正确答案:tests/hermes_cli/test_session_recovery_lost_and_found.py:327 -
关于轮次间消息显示问题的#73793号缺陷的根本原因是什么?
正确答案:重定向/引导路径将轮次间的用户消息框错误地拼接在了当前助手内容行之前。 -
哪个PR已被确认已在‘main’分支上,因此无需进行任何补救操作?
正确答案:#84287 -
在桌面端虚拟滚动功能中,针对#79157号缺陷(滚动条无法点击)的解决方案是什么?
正确答案:将面板边框的宽度设置为不对称的1px/7px。 -
在PR #86588的贡献者归属审核过程中,‘baihemax’这个用户名对应的是哪位贡献者的邮箱?
正确答案:602028@ky-tech.com.cn -
当git命令被阻止执行以避免覆盖实时源代码时,Hermes终端工具会显示什么错误信息?
正确答案:已阻止:git <操作>将覆盖Hermes的实时源代码。 -
在Hermes开发中,“窄腰架构”这一概念的核心设计原则是什么?
正确答案:系统核心部分保持“窄腰”结构,而各种功能则分布在边缘部分。
10道考试题目 (questions-9c55c707b6.json)
-
针对PR #86589的rebase-merge操作最终取得了什么结果?
gold:GraphQL:该拉取请求存在合并冲突(mergePullRequest) -
在信息图风格选择器中,“designers-republic”风格对应怎样的视觉氛围?
gold:The Designers Republic风格:黄铜灰色背景上的扁平橙色与紫色矢量图形 -
为何PR #76286会被排除在压缩/精简后的转录内容可见性分组之外?
gold:该请求在4个文件中与主分支存在冲突,同时还引入了另一种不同的显示去重方案 -
参考文件pr-infographic-workflow.md的“来源说明”日期为何是2026年5月23日?
gold:2026年5月23日 -
在完成rebase操作后,究竟是哪种具体的TypeScript错误导致了PR #86772的CI代码检查失败?
gold:类型中缺少‘onToggleUnread’属性 -
根据《桌面端工程指南》,负责管理进程生命周期及原生文件系统的组件是什么?
gold:Electron
-
在 PR #86292 中,是谁负责添加了“巴西葡萄牙语本地化”功能?
gold:@gui8515 -
关于 Windows 桌面更新的问题 #83562 中,系统会报告什么具体的错误信息?
gold:Hermes backend exited (0) -
在 parallel-subagent-salvage-orchestration.md 的说明中,指出了什么“核心问题”?
gold:subagents share the parent's worktree + main checkout -
根据调度相关文档的说明,为什么“nix (macos-latest)”构建会在救援处理批次中失败?
gold:Nix build failed due to stale npm lockfile hash -
哪个子代理被分配了救援“inflight-journal duplicate-answer cluster”任务的任务编号?
gold:sa-2-7318d0ba -
在 PR #86595 中,为何 upperagent 提出的 PR #80707 会被排除在救援处理之外?
gold:violating this PR's UI-read-only invariant -
PR #86597 的 Python 测试第 4/12 组出现故障的根本原因是什么?
gold:AssertionError: assert 't2' == 't1' -
在 PR #86589 中,针对问题 #79157 的修复方案包含哪些内容?
gold:pane sash grab band made asymmetric 1px/7px -
根据问题 #73793 的根本原因分析,是哪两个文件在 streamIndex 处拼接了用户中途输入的消息?
gold:use-prompt-actions/index.ts and session-tile-actions.ts -
在 PR #86604 中,‘salvage/desktop-busy-state’ 分支的头部 SHA 值是什么?
正确答案:bddadfe9e21e24b3d52e2b15f138c42474dede42 -
为何在执行“合并所有”命令时,PR #86589 的合并操作会被中止?
正确答案:GraphQL: Pull Request has merge conflicts (mergePullRequest) -
通过 PR #86749 解决“artifacts 页面时间戳显示为 1970 年”问题时,具体修改了哪个文件?
正确答案:apps/desktop/src/app/session/hooks/use-session-actions/utils.ts
prmerge 统计数据
| 策略 | 回收率 | 合并前 token 数 | 合并后 token 数 | 压缩比 s |
|---|---|---|---|---|
| uncompacted_control | 96.7% | 499,663 | 499,663 | — |
| current | 33.3% | 499,663 | 155,399 | 14.9 |
| lean | 23.3% | 499,663 | 44,419 | 105.4 |
| lean+recovery | 43.3% | 499,663 | 44,977 | 95.8 |
15 道考试题目 (questions-703ae2774a.json)
-
是哪个 PR 添加了公共子代理生命周期 API?
正确答案:#63359 -
为启动和监控子会话而添加到 PluginContext 中的类型化服务叫什么名字?
正确答案:subagent_lifecycle -
与子代理生命周期 API 相关的合约测试和安全测试共有多少项?
正确答案:42 -
关于网关会话中的
ctx.inject_message()函数,发现了哪些具体问题?
正确答案:无法在现有的网关会话中触发对话轮次 -
是哪个拉取请求通过为
ctx.inject_message()添加仅包含关键字的session_key参数,实现了对网关安全的插件注入功能?
gold:#64436 -
为防止数据泄露,模式注册表中对遮蔽模式设置了哪两项具体限制?
gold:必须能够成功编译,且必须以至少2个实字符开头 -
是哪位贡献者为0–1阶段的功能扩展计划提供了持续支持?
gold:Daniel -
与
pre_command中间件及MCP工具访问相关的处理缺陷的编号是多少?
gold:#64204 -
若要在流式输出中启用推理增量功能,需要设置哪一项配置?
gold:plugins.stream_reasoning_deltas: true -
在拉取请求#63359中一共添加了多少内容,分布在多少个文件中?
gold:在4个文件中新增了650行代码 -
随遮蔽模式注册表一同提供的参考插件叫什么名字?
gold:nvapi-redaction -
请列出在拉取请求#64317中新增的四个仅用于观察的流式输出插件钩子。
gold:on_stream_start, on_stream_delta, on_stream_end, on_interim_message -
针对拉取请求#58541中的生命周期钩子相关问题,更新内容解决了什么问题?
gold:优化了created-hook的触发时机,并新增了kanban_task_promoted功能 -
与“开发者工具”(模板生成工具、插件诊断工具及测试框架)相关的子问题编号是多少?
gold:#64230 -
针对拉取请求#63359以及@asimons81的提交,第三轮审查的结果是什么?
gold:子问题编号#65447
acp 数据记录
| 策略 | 回收率 | 之前的令牌数 | 之后的令牌数 | 压缩比 s |
|---|---|---|---|---|
| uncompacted_control | 100.0% | 498,906 | 498,906 | — |
| current | 30.0% | 498,906 | 160,223 | 15.8 |
| lean | 36.7% | 498,906 | 49,523 | 143.3 |
| lean+recovery | 80.0% | 498,906 | 49,721 | 135.6 |
15道考试题目 (questions-f45358df19.json)
-
2026年7月,Teknium撤回PR #30179的具体原因是什么?
正确答案:WTF??? REVERT! DAMMIT -
Teknium在哪一个PR中说过“你到底想说什么?别再给我这些毫无意义的冗长细节了”?
正确答案:PR #6391 -
应在哪个文件路径中查找提供商模型的标准列表?
正确答案:hermes_cli/models.py -
在PR #2314中,关于提供商名称发现了什么问题?
正确答案:存在对“alibaba-coding-plan”的错误检测 -
Teknium要求的PR审核内容最多有多少行?
正确答案:<= 15行 -
当代理在实时源代码目录下尝试检出工作树时,收到了怎样的错误信息?
正确答案:Blocked:git checkoutwould rewrite Hermes's live source checkout (/home/teknium/.hermes/hermes-agent) and can mix mod -
为何需要PR #74658才能修复Slack在“main”分支上出现的问题?
正确答案:SlackResponse并非字典的子类,因此所有检测条件始终为False。 -
main 分支上用于修复 Slack SDK 相关问题的最终合并提交 SHA 值是什么?
gold:24ba86627515ad5fda69a39ef338c365713448bc -
在用于展示辅助客户端修复方案的“Pop-laboratory”风格信息图中,第 2 栏显示了哪两个具体结果?
gold:消息封装层保留 /anthropic,而 OpenAI 备用方案则保留 /v1 -
为防止在升级过程中丢失正在运行的唤醒功能,hermes_cli/kanban_db.py 中的迁移路径中添加了哪条具体的 SQL 更新语句?
gold:UPDATE kanban_notify_subs SET delivery_mode = 'notify+wake' WHERE platform != 'tui' -
在关于看板消息传递模式的 PR 的 CI 测试中,5/12 个测试组里是哪个测试失败了?
gold:tests/gateway/test_kanban_notifier_apiserver_wake.py::test_apiserver_sub_wakes_real_session_via_self_post -
根据相关记录,为何从 2026 年 7 月起禁止使用合并压缩功能?
gold:DevOps 策略限制 -
7 月份时,谁是第一个为问题 #73030 提出修复方案的贡献者?
gold:@Tranquil-Flow -
在第一代看板信息图中,那种“超人风格”的盾形错误提示是什么样的?
gold:菱形盾牌内的红色 “S” 字形符号 -
为给 Slack 添加 ‘scope_id_for_chat’ 方法,具体修改了哪个文件?
gold:plugins/platforms/slack/adapter.py
- 转录记录:从state.db备份中重建的4组真实会话轨迹(扫描任务占42次,GUI桌面端占34次,PR合并操作占17次,ACP审核占17次),按时间顺序排列,每条记录前50万个标记均保持一致,且工具组也相互对齐。
- 问题生成:由主模型根据当前策略所覆盖的区域(即最保守的边界范围)生成问题,每个转录记录对应的这些问题会被缓存,因此所有策略都会针对相同的试题集进行回答。
- 答案生成:用于作答的新鲜大语言模型仅能看到压缩处理后的上下文(闭卷模式),或者是在该上下文基础上通过FTS5+BM25算法对归档区域进行一次搜索并获取结果(包含恢复步骤)。评分员能看到标准答案,而答题者则无法查看。评分规则为2分、1分、0分。
- 已知的局限性:每条转录记录对应15道题时,误差约为±1题,带来的分数波动约为3.3分;扫描任务和GUI桌面端的当前策略数据生成时间早于题库的重新生成时间(所有测试组中的prmerge和ACP操作均使用同一题库);恢复模拟过程采用保守方式来近似真实生产环境中的session_search功能(使用相同引擎,且不设置时间窗口限制)。
- 成本结构:简化版压缩处理大约需要25次辅助模型摘要调用(每次压缩处理耗时约2分钟,仅执行一次),而目前的方式仅需1次调用;每次压缩处理后的后续操作,输入标记量可减少约11万,成本随之降低。通常在大约1次后续操作后即可实现成本平衡。