Hermes yesterday, October 15, 2026: race day, and the bugs lost
What landed on Hermes Agent main on October 15, 2026: 27 race conditions fixed in one pull request, new installs on the latest stable release, live allowlist edits, a gateway restart that brings everything back, bot refusals fixed and REA in the catalog.

Table of contents
- 1. New installs land on the latest stable release
- 2. Allowlist edits take effect without a restart
- 3. The gateway comes back after a restart, and the CLI with it
- 4. Bots stop answering Sorry, I encountered an error
- 5. Background jobs report back on Discord and Telegram
- 6. The real browser profile stops breaking the browser tool
- 7. The classic CLI catches up with the shared gateway
- 8. Editors over ACP get their commands back
- 9. /loop counts down to its next wakeup
- 10. 1 new plugin in the catalog
- Meanwhile, in the engine room
- Watch the recap
Race day, and the bugs lost. One pull request hunted down 27 race conditions, the kind where two writers grab the same file and one of them quietly loses. Meanwhile the installer stopped handing new users unreleased code, and the shared gateway learned to come back after a restart. 227 commits landed on main; here are the 10 that matter.
1. New installs land on the latest stable release
Before: hermes update has followed stable releases on official checkouts for a while, but install.sh, install.ps1 and Hermes-Setup still cloned the tip of main, so every new user started on unreleased code and only reached stable at the next release. After: a fresh install of the official repository looks up the latest vX.Y.Z release (GitHub API, then the releases redirect, then the repository’s own tags) and checks it out, which today is v0.22.2. If no release can be reached, a fresh install stops with a retryable error instead of falling back to main. --channel main, -Channel main or HERMES_INSTALL_CHANNEL=main installs main’s tip and saves that choice for later updates. Who gets it: this is already live, because the hosted one-liners serve the script from main, and Hermes-Setup downloads it at install time. A rerun over an existing main checkout keeps it where it is and leaves the move to hermes update and its downgrade guard; forks, mirrors, other branches and --commit pins are unchanged.
Pull request: Installs on stable.
2. Allowlist edits take effect without a restart
Before: on the shared gateway, command_allowlist was read once at startup, so a pattern you removed from config.yaml by hand stayed auto-approved until a gateway restart (rm -rf build ran with no prompt), and a pattern you added was ignored. Desktop requests could also still reach a disabled plugin’s /api/plugins routes. After: every approval check applies what changed on disk, so a removed pattern prompts again and an added one matches; always approvals the gateway made but could not save are kept, and a pending always-save can no longer write a removed entry back. A malformed allowlist counts as empty, so commands prompt. Desktop requests to a disabled plugin get 404 like every other caller. In review: the same plugin gate for WebSocket connections and for every profile the gateway serves.
Pull requests: Live allowlist and plugin gate, In review, WebSockets and profiles.
3. The gateway comes back after a restart, and the CLI with it
Before: hermes gateway restart on a gateway you or a client started by hand waited for a supervisor that did not exist, exited 1 and left no gateway running, so cron and bots stayed down. The classic CLI never re-attached afterwards and blamed every prompt on the model. API callers queued behind a running turn got a 503 with Retry-After, so the OpenAI and Anthropic SDKs resent work that was going to run anyway. After an unclean exit, every local client hung while state.db was checked: 41 to 76 seconds on a 5.3 GB store. After: restart stops the gateway and starts a new one; the CLI redials on the next call and resumes its open sessions, and a turn cut off by the restart is reported as unknown and never resent; queued API callers are told their input is saved and must not be resent (x-should-retry: false, and /v1/runs reports them queued); and the database check runs in the background on WAL stores, with a 30 minute bound, and is skipped with one warning on rollback-journal stores.
Pull request: Restart and reconnect.
4. Bots stop answering Sorry, I encountered an error
Before: on a gateway serving several profiles (this turns on by itself once a named profile has its own bot credentials), every message to a profile running a plugin that rewrites incoming text was refused with RuntimeStoreError invalid_params, and so was every /retry from Telegram, Discord or any other platform. On Mattermost, every plain text post without an attachment was refused the same way. After: rewritten messages keep the provenance of the message they came from, /retry re-runs the last turn, and text-only posts pass admission on every platform. A refusal now names the failed check in gateway.log, and the chat reply names it only when it is about the content, never a trust check. Not covered: a /retry that is still refused (a paused session, for one) leaves the last turn removed from the transcript; that is tracked in an open issue. The Mattermost fix was not run against a live server.
Pull requests: Plugin rewrites, /retry, Mattermost and named refusals, Open issue, /retry transcript.
5. Background jobs report back on Discord and Telegram
Before: when a background process finished, its completion wake on Discord or Telegram was refused because it carried no message id while the chat’s stored source did, and it was retried every 5 seconds until the process was pruned 30 minutes later, so the agent never got the result. On Telegram DM topics the reply failed even once admitted. After: the wake is admitted and answers in the right topic; if a refusal persists, the watcher retries 8 times over about five minutes and then sends the plain completion notice. Not covered: in a shared thread where a different user started the job, the wake is still refused and falls back to that plain notice. In review: Discord threads whose title changed after creation.
Pull requests: Discord and Telegram wakes, In review, renamed threads.
6. The real browser profile stops breaking the browser tool
Before: with browser.use_real_profile on, every browser call failed when the profile could not be copied: Chrome running on macOS or Linux (it locks the saved-password and autofill files), Windows with Chrome open, a non-Chromium default browser, a bad pin or a launch failure. After: with Chrome running, Hermes copies the cookies and skips the locked password and autofill files, so you stay signed in; when the profile cannot load at all, the session gets a fresh browser without your logins and the first result tells the model why, so it says it is signed out instead of failing. browser_exec with local=true falls back to a fresh local browser, never the cloud one.
Pull request: Real browser profile.
7. The classic CLI catches up with the shared gateway
Before: the classic CLI now drives a session on the shared gateway, and several commands still looked at its own empty process: /model, /refine, /review and /moa did not reach the session, /agents showed 0 running processes, /diff session crashed or said checkpoints were off, /stop mid-turn froze input until every job exited, a stale toolset left in config refused every hermes chat with invalid_params, and @file and @folder references resolved against the gateway’s folder instead of yours. After: those commands run on the gateway session; -s skills and the other launch flags are carried in, and resuming with a different flag is refused by name instead of silently ignored; and when the last window closes, the session’s memory is committed on the gateway, once. Not changed: nothing runs those end-of-session hooks after a gateway crash. In review: /resume or /sessions as the first action of a fresh CLI is refused at the next prompt.
Pull requests: /model, /refine, /review, /moa, Launch flags, /agents, /diff, /stop, Profile-default toolsets, Session end on the gateway, @ references and folders, In review, /resume switch.
8. Editors over ACP get their commands back
Before: editors talking to Hermes over ACP went through a gateway client that dropped most of what the old in-process server returned: no model picker or modes, no slash commands, empty replies to /model and /compress, no usage updates, and a load with a changed MCP server list failed with acp_mcp_policy_conflict. After: the model picker, modes, slash commands (/help, /tools, /context, /reset, /steer, /queue, /version, /usage, /status), usage and title updates are back; the gateway owns each session’s editor MCP servers, applies a changed list on load and keeps them connected while the session has a viewer; tool names keep the server name; and /steer only redirects this editor’s own turn. Not yet: the Accept Edits and Don’t Ask modes are not offered.
Pull requests: Commands, models, usage, Editor MCP servers.
9. /loop counts down to its next wakeup
Before: a running /loop printed a one-time next in 45m line in the CLI that never moved, showed nothing in the TUI, and sat frozen in Desktop. After: the CLI’s live-work dock gets a loop row with cadence, run count and a countdown (per minute, seconds in the last one), the TUI shows a loop bar under the goal bar, and Desktop counts down by the second and says due, waiting for idle when it is overdue; all three show running now during a wakeup and the reason when paused.
Pull request: /loop countdown.
10. 1 new plugin in the catalog
One new entry, and it is official: REA reverse-engineers native binaries, .NET assemblies, Electron and JavaScript apps, Android packages and firmware through its MCP server; it needs Node.js 22.19 or newer and your own Ghidra, Hopper or IDA for native decompilation. Heads-up: a few REA tools run a command, drive an app, change a connected Android device or overwrite a file without a Hermes prompt; its bundled skill tells the agent to ask first. Its first pin could not install on v0.22.2 because of a manifest key that release did not know; the catalog was re-pinned the same day, and on main a plugin with a newer manifest key now installs with a warning instead of failing. Catalog entries do not wait for a release: they go live once the published catalog refreshes.
- Reverse engineering: rea
Pull requests: REA re-pin for v0.22.2, Newer manifest keys.
Meanwhile, in the engine room
Dozens of fixes landed yesterday that most users will never see, and the biggest share came from that race-condition hunt: files rewritten while another process read them, caches saved over each other, and timers that counted a sleeping laptop as idle.
- Windows Desktop attaches again to a gateway running as a Scheduled Task, which
hermes gateway ensurerefused for every task the installer registered (pull request). - On macOS, Desktop no longer hangs at startup when the home path’s letter case differs from the disk, and symlinked profiles get their tickets (pull request).
- Desktop’s own UI tools (preview, focus pane and the rest) work again on sessions the shared gateway owns, instead of saying they only run in the Desktop app (pull request).
- A successful
hermes updateis no longer reported as failed because the gateway read its exit-code file mid-write (pull request).
If you noticed none of this, it worked.
All on main, ships in the next release; the installer change is already live on the one-liners. Latest stable: v0.22.2.
Watch the recap
The 52-second motion recap, made with Remotion, is on X.
Was this configuration guide helpful?
If you have questions, encountered issues during setup, or want to discuss networking and security, connect or reach out on LinkedIn.
Connect on LinkedIn