NousResearch/hermes-agent · warning · RuntimeError

iron-proxy is not running — nothing to reload. Run `hermes

Error message

iron-proxy is not running — nothing to reload.  Run `hermes egress start`.

What it means

reload_proxy() POSTs to /v1/reload on the daemon's loopback management listener to hot-swap the config without dropping the proxy. It first reads the pidfile and checks liveness; if there is no pid or the pid is dead, there is nothing to reload and it raises with the command to bring the daemon up. This is a state precondition error, not a failure of the reload itself.

Source

Thrown at agent/proxy_sources/iron_proxy.py:930

    return (host or "127.0.0.1", port)


def reload_proxy() -> bool:
    """Hot-reload the running daemon's ruleset via the management API.

    POSTs to ``/v1/reload`` on the loopback management listener; the daemon
    re-reads proxy.yaml and atomically swaps the transform pipeline —
    validation failures leave the running config untouched (HTTP 422).

    Returns True on a successful reload.  Raises ``RuntimeError`` with an
    actionable message when the daemon isn't running, the config predates
    management-API support (no ``management`` block → restart required),
    or the reload is rejected.
    """

    pid = _read_pid()
    if not pid or not _pid_alive(pid):
        raise RuntimeError(
            "iron-proxy is not running — nothing to reload.  "
            "Run `hermes egress start`."
        )
    mgmt = _read_management_listen_from_config()
    if mgmt is None:
        raise RuntimeError(
            "The generated proxy.yaml has no management listener (written "
            "before reload support).  Re-run `hermes egress setup` and use "
            "`hermes egress restart` this one time."
        )
    token = _read_management_token()
    if not token:
        raise RuntimeError(
            "management.token is missing — re-run `hermes egress setup`, "
            "then `hermes egress restart`."
        )

    import urllib.error

View on GitHub (pinned to c896c09c42)

Solutions

  1. Start the daemon with `hermes egress start`, then re-run `hermes egress reload`.
  2. If you expected it to be running, inspect the daemon log (iron-proxy.log in the proxy state dir) for the earlier crash and fix that first.
  3. In automation, gate reload on get_status() showing a running daemon instead of assuming.

Example fix

// before
reload_proxy()  # RuntimeError: nothing to reload

// after
from agent.proxy_sources.iron_proxy import get_status, start_proxy, reload_proxy
if not get_status().running:
    start_proxy()
reload_proxy()
Defensive patterns

Strategy: validation

Validate before calling

from agent.proxy_sources.iron_proxy import get_status

def proxy_is_running() -> bool:
    try:
        return get_status().running
    except Exception:
        return False

Try / catch

try:
    reload_proxy()
except RuntimeError as e:
    if "nothing to reload" in str(e):
        start_proxy()
        reload_proxy()
    else:
        raise

Prevention

When it happens

Trigger: Calling reload_proxy() / `hermes egress reload` when the daemon was never started, was stopped (`hermes egress stop`), or crashed — _read_pid() returns None or _pid_alive(pid) is False.

Common situations: Editing proxy rules and running reload after a reboot (the daemon isn't auto-started); the daemon crashed earlier and nobody noticed; running reload on a fresh machine where setup ran but start never did.

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/7b3aa33350f0ee3f. Report an issue: GitHub.