Files
hermes-web-ui/docs/hermes-write-gate.md
ekko 3ab875998b [codex] Improve write gate and desktop startup UX (#1496)
* Split Hermes bridge Python modules

* Add Hermes write gate controls

* Adjust approval prompt width

* Improve write gate and desktop startup UX

* Fix bridge runtime patch sync

---------

Co-authored-by: Codex <codex@openai.com>
2026-06-11 20:21:13 +08:00

3.7 KiB

Hermes Agent Write Gate Notes

Hermes Agent v0.16.0 adds a write approval gate for persistent self-improvement writes. The gate covers Hermes Agent memory and skill writes, not ordinary Web UI state or arbitrary file edits.

What It Controls

Write Gate protects two long-lived Hermes Agent stores:

  • memory: entries written to memories/MEMORY.md and memories/USER.md.
  • skills: agent-created or agent-edited skills under the active profile's skills directories.

These writes affect future agent behavior across sessions. The gate exists so a user can review what the agent learned or changed before it becomes durable.

Configuration

The switches live in the active Hermes Agent profile's config.yaml.

memory:
  write_approval: true

skills:
  write_approval: true

The defaults are false, which preserves the previous behavior: memory and skill writes are applied immediately.

Equivalent CLI commands:

hermes config set memory.write_approval true
hermes config set skills.write_approval true

Disable them with:

hermes config set memory.write_approval false
hermes config set skills.write_approval false

For multi-profile installs, the relevant file is the config.yaml under the profile directory selected by HERMES_HOME.

Runtime Behavior

When the gate is disabled, writes proceed normally.

When enabled:

  • Foreground interactive CLI memory writes can reuse the dangerous-command approval callback inline.
  • Gateway, Web UI, script, and background-review memory writes are staged for later review.
  • Skill writes are always staged, because a skill change can be too large to review safely in an inline prompt.

Staged records are stored under the active profile:

<HERMES_HOME>/pending/memory/*.json
<HERMES_HOME>/pending/skills/*.json

Each pending record includes an id, subsystem, action, summary, origin, created timestamp, and replay payload.

Review Commands

Hermes Agent exposes review commands through its CLI and gateway slash-command surfaces:

/memory pending
/memory approve <id>
/memory reject <id>

/skills pending
/skills diff <id>
/skills approve <id>
/skills reject <id>

approve replays the staged payload and then removes the pending record. reject removes the pending record without applying it.

Web UI Impact

Hermes Web UI already handles dangerous command approvals through approval.requested / approval.resolved events and renders an approval bar in chat and group chat.

Write Gate is different for Web UI sessions. Hermes Agent does not always emit a browser-visible approval event for memory and skill writes. In gateway-like contexts, memory writes are staged, and skill writes are always staged. The review workflow is currently command/pending-store based.

Current practical meaning:

  • Users can enable memory.write_approval and skills.write_approval.
  • Agent writes become pending JSON records instead of being applied.
  • Reviewing those pending writes currently depends on Hermes Agent's /memory ... and /skills ... command handling or direct pending-store inspection.
  • A first-class Web UI popup or review panel would require Web UI API/UI work to list, diff, approve, and reject pending memory/skill writes.

Hermes Agent Code References

The upstream implementation is in Hermes Agent:

  • tools/write_approval.py: config resolution, pending store, gate decisions, skill diff helpers.
  • tools/memory_tool.py: stages gated memory mutations and replays approved pending writes.
  • tools/skill_manager_tool.py: stages gated skill mutations and replays approved pending writes.
  • hermes_cli/write_approval_commands.py: shared /memory and /skills pending/approve/reject/diff command handling.