Hermes 安全

Hermes Memory 不生效排查:12 步定位写入、注入、Profile 与冲突

用 MEMORY-FAULT-741 完成 D01–D12:区分未写入、待审批、旧 Session 快照、错误 Profile、目标关闭、容量溢出、冲突、Provider 和 Session Search。

进阶 治理 预计 45 分钟 更新 2026/9/10 核验 2026/9/10
本页目录
官方文档核验 · 尚未运行实测查看验证范围

已核读当前 Persistent Memory、Memory Providers、Profiles、Which File Does What 与 CLI 文档,并静态检查 D01–D12 诊断表;未在真实 Hermes Profile 中写入、修改或删除 Memory。

完成结果

学完后你会留下什么

一份填好的 D01–D12 诊断表,包含复现入口、实际 HERMES_HOME、pending/文件/新 Session 证据、根因、修复和回归结果。

参考版本
v0.21.1 / v2026.9.7(文档核读)
平台
macOS / Windows / Linux / Android
任务模式
Agent
权限
标准
积分影响
适合谁
已经让 Hermes 保存过偏好或项目事实,但新会话、Gateway、Cron 或 API 中没有按预期使用,希望找到确切故障层的用户
开始前确认
  • Hermes 可以启动
  • 知道或可以查询当前 Profile
  • 愿意用测试 Profile 和无害事实排查
  • 不把 Secret 或客户信息写入 Memory

“Memory 不生效”不是一个故障。它可能是根本没写入、还在 pending、写进了另一个 Profile、当前 Session 仍使用旧快照、目标被关闭、容量满了、两条事实冲突,或你实际启用了外部 Provider。

本课使用无害事实 MEMORY-FAULT-741,从最便宜的身份检查开始,逐层走到内容与 Provider。不要一上来重复 add;重复写入会把真正根因藏起来。

本站验证范围: 本页于 2026-09-10 核读 v0.21.1 / v2026.9.7 当前官方文档;本站没有操作真实 Memory、Session 或第三方 Provider。

下载诊断材料

先完整复制原始症状、入口和预期,不要把“感觉没有记住”写成结论。每一步只能填写实际证据。

先建立故障模型

请求保存
  → memory tool 接受 / 拒绝 / staged
  → 写入正确 HERMES_HOME 的 MEMORY.md 或 USER.md
  → 新 Session 冻结读取
  → 当前入口使用同一 Profile 与 Provider
  → 多条规则无冲突
  → 模型在具体任务中执行

回答正确只能证明最后一次推理命中,不能反推每一层都正常。诊断目标是找出第一处与预期不一致的证据。

D01:固定最小复现

在记录卡填写:

  • 原始入口:CLI、Telegram、Cron 或 API;
  • 原始 Profile ID;
  • 要保存的精确一句话;
  • 预期在哪个新 Session、哪个问题中出现;
  • 实际回答;
  • 首次发生时间和最近一次成功时间。

另开测试 Profile,使用:

请申请保存到 agent memory:诊断金丝雀是 MEMORY-FAULT-741。

不要加入项目背景。复杂任务失败不能证明 Memory 失败。

D02:确认运行身份

hermes profile list
hermes profile show <profile-id>
hermes -p <profile-id> dump

三处的 Profile ID 与实际 HERMES_HOME 必须一致。Gateway、Cron、API 和 CLI 都要分别记录;同一台机器上的 default、alias 和 sticky active 可能指向不同身份。

如果身份不一致,停止后续修改,先按 Profiles P01–P12 修正入口。不要把 A Profile 的 Memory 复制到 B 来掩盖路由错误。

D03:确认两个内置目标是否启用

memory:
  memory_enabled: true
  user_profile_enabled: true
  write_approval: true

memory_enabled: false 时不能向 MEMORY.md 写入;只保留 user target。user_profile_enabled: false 则相反。两者都 false 时,内置 memory tool 和提示块都被移除。

外部 provider 不受这两个开关影响。若想连外部 memory tools 也隐藏,需要检查 agent.disabled_toolsets,不能只改内置开关。

D04:检查写入结果和 pending

请求保存后,记录 memory tool 的真实结果:

  • accepted 并写入;
  • exact duplicate,成功但没有新增;
  • staged,等待批准;
  • capacity/error;
  • safety rejection;
  • target disabled。
/memory pending
/memory approve <id>
/memory reject <id>

write_approval: true 时,CLI 前台写入会内联询问;Messaging、脚本与后台 review 会 staged。先检查 pending,再决定 approve 或 reject。聊天里的 💾 Memory updated 通知模式只控制显示,不控制 review 是否运行或是否写入。

D05:核对落盘目标

内置文件位于当前 Profile 的:

<HERMES_HOME>/memories/MEMORY.md
<HERMES_HOME>/memories/USER.md

memory target 保存环境、项目约定、工具经验;user target保存身份、偏好和沟通方式。不要把项目规则自动放 USER.md,也不要把用户隐私塞进项目约定。

记录唯一金丝雀是否存在、出现几次和文件当前字符数。不要把整个 Memory 或个人资料粘到共享 issue。

D06:必须用新 Session 验证注入

Memory 在 Session 开始时作为冻结快照进入系统提示。当前 Session 中成功写入后,磁盘立即更新,但 prompt 前缀不变。

关闭当前 chat,在 同一 Profile 新建 Session,固定提问:

只回答你长期记忆中的诊断金丝雀值;没有则回答 UNKNOWN。

预期为 MEMORY-FAULT-741。旧 Session 回答 UNKNOWN 属于预期边界,不能继续重复 add。

D07:区分项目上下文与长期 Memory

当前官方文件职责是:

内容位置
用户偏好USER.md
Agent 学到的跨 Session 事实MEMORY.md
项目命令、端口、架构项目 .hermes.md / AGENTS.md
身份与人格SOUL.md
长步骤与固定验收Skill
过去对话详情Session Search

每个 Session 只加载一种项目上下文,优先级为 .hermes.md → AGENTS.md → CLAUDE.md → .cursorrules。若“项目构建命令没记住”,先检查 cwd 与实际加载的项目文件,不要把仓库整份规则重复写进 2200 字符 Memory。

D08:检查容量和重复

默认上限是 MEMORY 2200 字符、USER 1375 字符。超过上限时 tool 返回错误和 current entries,不会自动压缩或静默丢条目;更长的 replace 也可能溢出。

达到 80% 后先用精确 replace 合并重叠条目或 remove 删除过期项,再 add。Exact duplicate 会返回成功但不新增,这是去重行为,不是持久化失败。

D09:检查冲突而非继续追加

把影响当前任务的条目按时间与作用域列出。例如:

旧:所有回答必须详细。
新:默认简洁;用户要求方案或复盘时展开。

用唯一原文 replace,合成一条有条件的规则。若旧子串命中多次,先人工定位,不能模糊替换。修改后重新执行 D06。

D10:检查安全扫描与秘密边界

Memory 会拒绝 prompt injection、credential exfiltration、SSH backdoor 和不可见 Unicode 等威胁模式。被拒绝的内容不能通过直接编辑文件绕过。

API key、token、cookie、私钥、客户隐私和原始生产日志都不应进入长期 prompt。保存“凭据由哪个 Secret Manager 管理、轮换周期是什么”即可,不保存值。

D11:确认实际 Provider 与 scope

Hermes 支持八种外部 Memory Provider。启用 memory.provider 后,它有自己的存储、身份和检索策略;内置文件的正例不能证明外部 provider 正常。

分别记录:

  • 当前 provider 名称和配置来源;
  • Profile / user / session scope;
  • provider 自己的 health 或检索结果;
  • 断网、错误凭据和跨 Profile 负例;
  • 是否与内置 Memory 同时存在。

若 CLI 正常、API 或 Gateway 异常,还要检查 X-Hermes-Session-Key、平台 session key 与 Profile 路由,不能直接归因于模型。

D12:用 Session Search 验证“记得”还是“找得到”

Session Search 查询 SQLite 中的实际历史消息,适合过去讨论和长记录;它不是每轮注入的 Memory。

hermes -p <profile-id> sessions list

让 Agent 搜索包含唯一旧短语的会话,记录 session ID 与原始消息命中。若 Session Search 能找到,但新 Session prompt 不应自动使用,系统行为是正确的。把需要每次出现的少量事实压缩进 Memory,把长背景留在 Session 或项目文档。

症状到第一检查点

症状先查
刚写完当前对话没引用D06 冻结快照
Gateway 有 pending、CLI 没变化D04 write approval
CLI 命中、Cron 不命中D02 Profile 与 job workdir
USER 能写、MEMORY 拒绝D03 target 开关
返回成功但文件没多一条D08 exact duplicate
replace 报超限D08 新内容长度
时而遵守时而不遵守D09 条目与项目上下文冲突
换 Provider 后表现改变D11 scope
只想找上月讨论D12 Session Search

完成检查

  • D01–D12 有同一个 canary、Profile 和入口证据。
  • 你能区分 accepted、staged、duplicate、capacity、disabled 与 safety rejection。
  • 写入后使用新 Session,没有用旧快照制造假故障。
  • 实际 HERMES_HOME、目标文件、Provider 与调用入口一致。
  • 冲突被 replace/remove,而不是继续叠加第三条。
  • 项目规则、步骤、历史与 Secret 已分别转到正确位置。
  • 修复后重新跑最小复现,再跑原始入口,二者均有结果。

需要重建正确写入生命周期时,回到 Memory M00–M12 实验。若最终发现保存的是固定步骤,把它转成 Skills S01–S05 回归

官方资料

版本和参数,以这些来源为准

本文按实际任务重写,快速变化的信息仍应在操作前回到官方页面核对。

常见问题

继续操作前,先确认这些边界

当前对话里已经保存,为什么 Agent 还像没记住?

Memory 在 Session 启动时冻结注入。中途写入会立刻落盘,但不会改写当前 Session 的系统提示;必须新建同一 Profile 的 Session 复测。

显示 Memory updated 是否一定写入成功?

不一定。开启 write_approval 后,非交互入口和后台 review 会先 staged;应检查 /memory pending、approve/reject 结果与实际文件,而不是只看聊天提示。

为什么直接编辑 MEMORY.md 仍不适合当标准修复?

Agent 的 memory tool 会执行容量、重复和安全检查,并支持精确 replace/remove;直接编辑容易绕开这些证据。紧急人工修复后仍要开新 Session 回归。

继续学习

按当前任务继续推进