Skip to main content
The plugin registers a hermes mandate CLI group, a /mandate slash command, and a read-only mandate_status tool. The lists below match mandate_core/cli.py, mandate_core/plugin.py, and mandate_core/tool.py at the current checkout. There is also a standalone entry, python -m mandate_core.cli, that uses the same store but reports hooks as unregistered. If you call hermes mandate with no subcommand, it prints usage and exits 2. Unknown jobs print to stderr and exit 1: run watch or list first.

hermes mandate

<job> can be the cron job name or the job id.

/mandate slash command

Registered as /mandate with args hint [status|drift|scope <job>|unscope] [job]. Output is always plain text (no color). Interactive sessions are only covered after /mandate scope <job>. Cron runs do not need this. They are identified through ctx.current_cron_execution().

mandate_status tool

A read-only tool the agent can call. Schema name: mandate_status. Optional argument: job (id or name). Defaults to the current job. It is in EXEMPT_TOOLS, so Mandate does not enforce or record the tool against the policy. The handler returns JSON with:
  • job, mode, enforcing (true only when mode is enforce and an approved mandate exists)
  • version, sha256, mandate_yaml (or null)
  • blocked_this_run: up to 10 drift records for the current run when a scope is bound, otherwise recent drift for the job, each with drift_id, call, rule, and reason
  • advice telling the model to finish the allowed work and leave widening to a human
If no job is bound: {"mandate": null, "message": "No Mandate job is bound to this run. Nothing is enforced."}. Internal failures return a short JSON error, without a traceback.