ARTICLE / 开源项目
补充技能库锁定分类配置特性的研究
PR 地址:NousResearch/hermes-agent#47108 · 用一条配置豁免整个技能分类,告别逐个 pin
研究摘要
Hermes 的 curator(技能管理者)会按时间自动归档闲置技能,官方提供的保护手段是 hermes curator pin <name>——把技能逐个钉住。对拥有十几个安全类技能、几十个运维类技能的用户来说,这意味着要为每个技能单独执行一次 pin 命令,繁琐且容易漏。更麻烦的是,漏掉的那个技能可能正是被自动归档后才发现丢了。
本 PR 新增 curator.locked_categories 配置项:在配置里列出分类名,匹配该分类的所有技能整体豁免 curator 的自动转换流程。以安全技能为例,一行 - security 就锁住整个安全分类,无论里面有多少个技能。改动 +279/-1,覆盖 4 个文件,默认空列表、零行为变化;63 个测试通过(6 个新增 + 57 个既有),160 个 curator 相关测试全绿。
一、问题背景:分类级保护需求与技能级 pin 的错配
1.1 curator 的自动转换机制
curator 会周期性扫描技能库,对长时间未使用、内容过时的技能执行自动归档等状态转换。这是 Hermes 技能库保持整洁的默认机制,但它只认使用时间,不认技能的领域价值。
1.2 领域技能集合的困境
安全研究、渗透测试这类领域的技能库有一个特点:数量多、使用频率低、但价值极高。一个安全分类下挂 11 个技能很常见,它们可能几周才被调用一次,却都是关键时刻要用的武器。按使用时间评估,它们全是自动归档的高危对象。
此前唯一的保护手段是逐个 pin:
- 11 个技能就要执行 11 次
hermes curator pin; - 每次新增安全技能都要记得补 pin,漏一次就埋下被归档的隐患;
- pin 状态散落在技能维度上,无法一眼看出"整个安全分类被保护"。
保护意图是分类级的(这些领域技能整体需要豁免),而保护手段是技能级的(逐个钉住),两者错配。
二、特性设计:一条配置、三个函数、零投机基建
2.1 配置面
curator.locked_categories 接受一个分类名列表,匹配技能 frontmatter 里的 category 字段。默认值为空列表——未配置的用户行为与升级前完全一致。
2.2 实现拆解
改动集中在四个文件,核心逻辑在 agent/curator.py:
get_locked_categories():从配置读取锁定分类列表;_get_skill_category():通过既有的parse_frontmatter()解析 SKILL.md 头部,取出技能的category字段——直接复用现有解析能力,不新增任何解析基础设施;_is_category_locked():判断技能分类是否命中锁定列表;apply_automatic_transitions()接入:自动转换流程遍历候选技能时,命中锁定分类的技能直接跳过;评审提示(review prompt)同步更新,让参与评审的模型知道哪些分类处于锁定状态;候选列表展示时带上分类名与锁标记,用户在 status 里能直接看到技能被锁的原因。
CLI 侧,hermes_cli/curator.py 的 status 输出在配置了锁定分类时显示 locked_cats 字段,保护范围一目了然。文档侧,website/docs/user-guide/features/curator.md 新增配置示例与"Locked categories"章节。
2.3 四个关键设计决策
- 无投机基建:直接读 SKILL.md 既有的 frontmatter,不引入钩子或扩展点,能力长在既有自动转换路径上;
- 核心窄:只在
curator:下加一个配置键,不铺开新概念; - 提示缓存安全:只改配置加载,不动系统提示词组装,prompt 缓存不受影响;
- 向后兼容:空列表默认值保证既有用户零行为变化。
2.4 与技能级 pin 的协同定位
锁定分类与既有的技能级 pin 服务于同一目标的两档粒度:pin 保护单个技能,锁定分类保护整个类别。对"11+ 个安全技能"的场景,锁定分类一次覆盖全部,pin 则继续服务于"分类锁定之外、个别需要单独保护"的技能。两条路径独立生效、互不干扰,保护范围取并集。这个设计把 curator 的保护粒度从技能级提升到分类级,补上了中间档位。
三、实测结果
| 测试 | 结果 |
|---|---|
| 新增 6 个测试(默认配置、配置解析、分类跳过、非锁定技能仍归档、无分类技能归档) | passed |
| 既有 57 个测试 | passed |
| curator 相关测试全量 | 160 passed |
6 个新测试覆盖了测试矩阵的关键面:默认空列表不改变行为、配置能正确解析、锁定分类被跳过、非锁定技能照常归档、没有 category 字段的技能不受影响。160 个 curator 相关测试全绿,说明自动转换主流程无回归。
四、能力边界
- 按分类名精确匹配:豁免以 frontmatter 的
category字段为准,分类名写错或技能未声明分类则不会命中,仍走常规归档流程; - 不覆盖技能级 pin:锁定分类与 pin 是两条独立保护路径,两者可叠加使用,本特性不改变 pin 的既有语义;
- 保护的是自动转换:锁定只作用于 curator 的自动转换流程,手动归档等显式操作不受影响(也不应被影响);
- PR body 未提供真机长周期验证:给出的验证为单元测试层面,未包含多周运行下"锁定分类技能被持续豁免"的实测记录。
五、PR 信息
- PR 地址:https://github.com/NousResearch/hermes-agent/pull/47108
- 改动规模:+279 / -1,4 个文件(
agent/curator.py、hermes_cli/curator.py、tests/agent/test_curator.py、curator 文档) - PR 状态:closed
- 提交时间:2026-06-16
本文记录 x7peeps 向 Hermes Agent 上游贡献的特性研究,所有数据来自 PR 实测记录。