Profiles (hermes -p work) |
Each profile has its own HERMES_HOME, so its own plugins.enabled, .env, and AgentsFence state ($HERMES_HOME/agentsfence). |
Enable AgentsFence in each profile you use (hermes -p work plugins enable agentsfence). The agent can’t edit any profile’s config.yaml, .env, auth.json or plugins/. cross_profile writes ask first. |
Chat session (hermes chat, TUI) |
First message → policy. /fence shows it; /fence audit shows recent decisions. |
ASK_USER uses the normal [o]nce / [s]ession / [a]lways / [d]eny prompt. Every answer applies to that exact action (same command, recipients, paths) in this task only. |
One-shot (hermes chat -q "…") |
Same as a chat session with one message. |
Hermes still prompts in your terminal for approvals. For unattended runs, phrase the request so it needs no approvals: name the recipients, folders and sites. |
| The agent loop (turns, tool calls, replanning) |
Replanning is free: any tool that classifies as a read is fine in a read task. Consequential calls are checked one by one. |
The agent is told when something is blocked and asked not to work around it. If it genuinely needs more authority, it should ask you in the chat. |
/new, --resume, --continue |
/new drops the policy. Quitting Hermes keeps it, so --resume continues under the same restrictions. Policies expire after 12 hours by default (policy.ttl_hours). |
After expiry, tool calls are blocked until your next message, which starts a fresh policy (only the task’s owner can restart it in a shared chat). |
| Gateway (Telegram, Slack, Discord, …) |
Approvals arrive as the platform’s approval buttons. In group chats, only the person who started the task can widen it; anyone’s “don’t …” still applies. |
Keep Hermes’ group_sessions_per_user: true (the default). Where a platform doesn’t report who sent a message, AgentsFence can’t tell participants apart. /fence is disabled in the gateway because one process serves many chats; use agentsfence audit on the host. |
Toolsets and MCP servers (-t, platform_toolsets, mcp_servers) |
Hermes decides which tools exist; AgentsFence only narrows. MCP tools (mcp_<server>_<tool>) are classified from their names unless you map them. |
Map the MCP tools you rely on, especially any whose name doesn’t reveal what it does. |
Subagents (delegate_task) |
Children run under the parent’s policy and share its budgets. A child’s goal (written by the parent model) is never compiled into authority. |
Delegation can’t multiply authority or call limits. |
execute_code |
Running code is EXECUTION. Tool calls made from inside the code are checked against the same task policy. |
Once you authorize code execution, what the code does outside Hermes tools is opaque. Use a container backend for such tasks. |
terminal |
Commands are classified by what they do. ls/grep/git status are reads; rm is a delete; curl -d, scp and git push are outbound writes; sudo is a permission change. Write options on “safe” commands (sort -o, rg --pre) are caught. Anything unfamiliar is execution. |
Approving a command approves that command, not the terminal. |
| Browser tools |
Navigating and reading are reads. Clicking, typing and pressing keys are external writes (they can submit forms). browser_console with a JavaScript expression is code execution. |
Suspicious URLs (long encoded query strings, email addresses in the query) ask, even in a research task. |
Memory (memory) |
Memory writes are local writes and need your authority (“remember that …”). |
This stops an injected email from planting a persistent instruction. |
Skills (skill_manage) |
Creating or editing a skill is a local write; deleting one is a delete. |
Skills can change future behaviour; treat skill edits like code edits. |
Cron jobs (cronjob tool, hermes cron) |
Creating a job is EXECUTION, so it needs your authority. When the job runs, its stored prompt is compiled into that run’s policy. |
Hermes’ approvals.cron_mode defaults to deny, so a cron run can’t get approvals; it only does what its prompt authorizes. Keep that default. |
| Kanban workers |
Each worker’s task prompt is compiled like a user message. |
Authority comes from whoever wrote the task card. |
| Approval modes |
See the table below. |
— |
Safe mode (HERMES_SAFE_MODE=1) |
Hermes skips all plugins, so AgentsFence is off. |
agentsfence doctor warns when safe mode is on. |
| Other plugins |
If other plugins also decide tool calls, AgentsFence puts itself first when it loads and at every turn, so their approve can’t hide its block, even on the first tool call. |
agentsfence doctor lists them. Set plugin_conflicts: strict if you also want AgentsFence’s questions never to hide their blocks. |