Hermes Agent v0.13.0 — The Tenacity Release
Overview
v0.13.0 — The Tenacity Release. Released May 7, 2026. 864 commits · 588 merged PRs · 829 files changed · 128,366 insertions · 282 issues closed (13 P0, 36 P1) · 295 community contributors (including co-authors).
The Tenacity Release answers one question with three different mechanisms: how does an agent finish what it starts? Before v0.13, Hermes was smart but not persistent — it could start a multi-step task, hit a snag, and silently drift or die. v0.13 ships three interlocking solutions: durable multi-agent Kanban (task boards with heartbeat, zombie detection, and hallucination recovery), /goal (the Ralph loop — lock the agent on a target across turns), and Checkpoints v2 (state persistence rewritten with real pruning). Together they make Hermes the first open-source agent framework with built-in completion guarantees.
This is also the biggest security release in the project’s history — 8 P0 closures in one release. Redaction is now ON by default. Discord role-allowlists are guild-scoped. WhatsApp rejects strangers by default. TOCTOU windows close across auth.json and MCP OAuth. The agent’s attack surface shrinks dramatically while its reach expands: Google Chat joins as the 20th messaging platform, providers become a pluggable surface, and the CLI and gateway now speak seven languages.
Major Features
1. Multi-Agent Kanban — Delegate to an AI Team That Actually Finishes
The headline feature of v0.13. Kanban turns Hermes into a durable multi-agent task board. Spin up a board, drop tasks on it, and let multiple Hermes workers pick them up, hand off, and close them out. The plumbing is what matters: heartbeats, reclaim on timeout, zombie detection, per-task retry budgets, auto-block on incomplete exit, and a hallucination recovery gate.
Create and manage a kanban board:
# Create a new board and switch to it
hermes kanban boards create project-a --name "Project A" --switch
# Add tasks
hermes kanban create "Implement OAuth flow" \
--priority 1 \
--body "Add OAuth 2.0 with PKCE support to the auth service"
hermes kanban create "Write integration tests" \
--priority 2 \
--body "Test coverage for all auth endpoints"
# List all tasks
hermes kanban list
# Check board statistics
hermes kanban stats
How the durability machinery works:
When a worker picks up a task, it starts sending heartbeats. If heartbeats stop (crash, network loss, OOM), another worker reclaims the task after a configurable timeout. Zombie detection catches workers that appear alive but aren’t making progress — they’re marked dead and their tasks are redistributed. If a task fails N times in a row, the retry budget kicks it to a human-review lane rather than looping forever. Workers that exit without completing their current task are auto-blocked to prevent silent abandonment.
The hallucination gate is what makes this production-grade, not a demo. When a worker claims it completed a task, the system verifies the claim before accepting it — checking for evidence that work was actually done, not just asserted.
# hermes.config.yaml — kanban worker profile
kanban:
board: project-a
worker:
max_spawn: 5 # up to 5 concurrent workers
heartbeat_interval: 30s
reclaim_timeout: 120s # how long before an idle task is reclaimed
max_retries: 3 # default retry budget per task
auto_block_on_exit: true # block tasks left incomplete on exit
You can also override retries per task for tasks that need more (or fewer) attempts:
hermes kanban create "Fragile data migration" --max-retries 1
hermes kanban create "Brute-force search job" --max-retries 10
Under the hood, the Kanban system includes:
- Multi-project boards — one Hermes install, many independent kanbans
- Atomic state writes — no partial board corruption on crash
- Per-platform home-channel notifications — get notified in Telegram, Discord, or Slack when tasks change state
- A generic diagnostics engine for task distress signals — workers can flag “I’m stuck, here’s why”
- Dashboard integration — real-time board view, inline task creation, workspace and path inputs
2. /goal — The Agent Doesn’t Forget What You Asked It to Do
The Ralph loop, now a first-class primitive. /goal locks the agent onto a target and keeps it there across turns. If the user tries to derail mid-conversation, the agent acknowledges the detour and returns to the objective. If a tool fails, it finds another way. If the session spans hours, the goal stays pinned.
# Set a persistent goal
/goal "Research the top 5 CRM tools, compare their pricing, and summarize the best fit for a 50-person startup"
# The agent stays locked on this across turns.
# You can ask unrelated questions — it'll answer, then circle back.
The /goal system uses a judge model to evaluate whether the objective is satisfied. The judge runs after each turn, assessing progress against the stated goal. The agent can take detours (side tasks, clarifications, tool failures) but cannot permanently abandon the goal until the judge declares it complete.
# Check goal status at any time
/goal status
# Pause and resume
/goal pause
/goal resume
# Clear and set a new one
/goal clear
/goal pairs with /subgoal (landing in v0.14.0) to let you add success criteria mid-flight. Together they approximate what a traditional project plan does — an objective plus refinements as you go.
3. Checkpoints v2 — State Persistence Rewritten
The old checkpoint system accumulated orphan shadow repos, had no real pruning, and grew unbounded. Checkpoints v2 is a clean rewrite:
- Single-store architecture — no more scattered state across directories
- Real pruning — old checkpoints are actually deleted, with configurable retention
- Disk guardrails — refuses to checkpoint when disk is critically low
- No orphan repos — every git shadow has a tracked lifecycle
Combined with the new gateway auto-resume feature, the agent now survives restarts transparently. Gateway bounces mid-agent? The conversation resumes. /update restarts the process? Back where you left off. Source file reloads? The session picks up.
4. Security Wave — 8 P0 Closures
This is the most security-hardened release in Hermes history. Eight critical vulnerabilities closed in a single release:
| # | Fix | Severity | What changed |
|---|---|---|---|
| 1 | Redaction ON by default | P0 | Agent output redacts sensitive content automatically — you don’t enable it, it’s on |
| 2 | Discord role-allowlists guild-scoped | CVSS 8.1 | Previously, roles from one guild could authorize access in another (cross-guild DM bypass) |
| 3 | WhatsApp rejects strangers | P0 | New WhatsApp connections blocked unless explicitly allowlisted; never responds in self-chat |
| 4 | MCP OAuth TOCTOU closed | P0 | Time-of-check-to-time-of-use window closed when saving OAuth credentials |
| 5 | auth.json TOCTOU closed | P0 | Credential writers hardened against race conditions |
| 6 | Browser cloud-metadata SSRF floor | P0 | Hybrid routing enforces cloud metadata endpoint block even on non-local CDP backends |
| 7 | Cron prompt-injection scans | P0 | Assembled skill content scanned for prompt injection before cron execution |
| 8 | hermes debug share redaction |
P0 | Log content redacted at upload time, not after |
Plus additional hardening:
.env,auth.json, andstate.dbrestored with 0600 permissions — owner read/write only- SRI integrity for dashboard plugin scripts
- Meet node server bound to localhost only, token file restricted to owner read
- Sensitive-write target extended to cover shell RC files and credential files
- YOLO mode hardened against quoted-bool string parsing
- OSV-Scanner CI + Dependabot for dependency vulnerability monitoring
5. Google Chat — The 20th Messaging Platform
Hermes now supports 20 messaging platforms natively, with Google Chat as the newest addition. The full list:
Telegram, Discord, Slack, WhatsApp, Signal, DingTalk, SMS (Twilio), Mattermost, Matrix, Webhook, Email (IMAP/SMTP), Home Assistant, Feishu/Lark, WeCom, Weixin, BlueBubbles (iMessage), QQBot, Yuanbao, Microsoft Teams, Google Chat.
All 20 platforms run from one gateway process with unified session management, restart handling, and thread routing. The gateway architecture now includes generic platform-plugin hooks — env_enablement_fn and cron_deliver_env_var — so third-party adapters drop in without touching core. IRC and Teams have already been migrated to this surface.
New cross-platform capabilities in this release:
allowed_channels/allowed_chats/allowed_roomsconfig across Slack, Telegram, Mattermost, Matrix, and DingTalk — restrict which channels the agent can interact with- Per-platform
gateway_restart_notificationflag — control whether each platform gets a “I’m back” message after restart busy_ack_enabledconfig — suppress “I’m working on it” acknowledgment messages- Auto-delete slash-command system notices after TTL
[[as_document]]directive — skills can force the gateway to deliver output as a document on platforms that support it
6. Providers Become a Pluggable Surface
Inference providers are no longer hardcoded into the core. A new ProviderProfile ABC and plugins/model-providers/ directory make them a first-class plugin surface:
# plugins/model-providers/my_provider.py
from hermes.abc import ProviderProfile
class MyProvider(ProviderProfile):
name = "my-custom-provider"
display_name = "My Custom Provider"
def list_models(self) -> list[ModelInfo]:
...
def chat_completion(self, request: ChatRequest) -> ChatResponse:
...
Drop provider plugins into the directory, and they appear in the model picker alongside OpenAI, Anthropic, and the built-in set. No core code changes needed.
New models added in this release:
| Model | Provider | Notes |
|---|---|---|
deepseek/deepseek-v4-pro |
OpenRouter + Nous Portal | Latest DeepSeek flagship |
x-ai/grok-4.3 |
OpenRouter + Nous Portal | xAI’s newest |
openrouter/owl-alpha |
OpenRouter | Free tier |
tencent/hy3-preview |
OpenRouter | Paid route |
| Arcee Trinity Large Thinking | OpenRouter | Temperature + compression overrides |
OpenRouter response caching is now supported for models that expose it — reduce costs on repeated context.
Nous OAuth now persists across profiles via a shared token store: sign in once, every profile inherits the session. No more re-authenticating for each profile.
7. Internationalization — 7 Locales
Hermes now speaks Chinese, Japanese, German, Spanish, French, Ukrainian, and Turkish — plus English. Static gateway messages (CLI help text, agent status, error messages) are fully translated. The docs site gains a Chinese (zh-Hans) locale.
# hermes.config.yaml
display:
language: zh # or ja, de, es, fr, uk, tr
8. Video & Voice — See and Speak
video_analyze gives Hermes native video understanding on Gemini and compatible multimodal models:
# Analyze a video from a file
hermes run "Watch meeting-recording.mp4 and summarize the decisions made"
# From a URL
hermes run "Analyze https://example.com/demo.mp4 — what's the workflow shown?"
xAI Custom Voices lands as a TTS provider with voice cloning support. Record a voice sample and Hermes will speak replies in your voice — or any voice you provide.
9. Delta Linting — The Agent Lints Its Own Writes
After every write_file or patch operation, Hermes now runs in-process linters for Python, JSON, YAML, and TOML. Syntax errors surface immediately instead of shipping downstream:
WRITE src/auth.py
✓ Syntax OK (Python 3.12)
✓ Import check passed
WRITE config.json
✗ Syntax error: Unexpected token at line 14, column 3
No more discovering broken syntax ten turns later when you try to run the code.
New Built-in Tools & Commands
| Tool / Command | Description | Usage |
|---|---|---|
/goal |
Persistent cross-turn goal tracking (Ralph loop) | /goal "Research X and summarize" |
/goal status |
Check current goal progress | /goal status |
/goal pause / /goal resume |
Pause or resume goal pursuit | /goal pause |
/goal clear |
Clear the current goal | /goal clear |
video_analyze |
Native video understanding on multimodal models | video_analyze path/to/video.mp4 |
hermes curator archive |
Archive curated skills | hermes curator archive |
hermes curator prune |
Prune old/consolidated curator entries | hermes curator prune |
hermes curator list-archived |
List all archived entries | hermes curator list-archived |
[[as_document]] |
Skill directive — deliver output as a document | Add [[as_document]] in skill frontmatter |
transform_llm_output |
Plugin hook — reshape/filter LLM output | Implement in plugin |
X-Hermes-Session-Key |
API header for stable session memory scoping | Pass via HTTP header |
no_agent cron mode |
Script-only watchdog — run scripts without an agent | Set no_agent: true in cron job config |
| OpenRouter cache control | Explicit caching for supported models | Via cache: true in provider config |
Improvements
Core Agent & Conversation
[[as_document]]skill directive — skills can force the gateway to deliver output as a downloadable document instead of inline texttransform_llm_outputplugin hook — new lifecycle hook that lets plugins reshape or filter LLM output before it hits the conversation; useful for context-window reducers and content filters- Context compression count shown in the status bar (CLI + TUI) — see how many times the context has been compressed
- Isolated
get_tool_definitionscache — deduplicates LCM injection and avoids redundant tool schema queries - Warning-first tool-call loop guardrails — the agent warns before entering infinite tool loops instead of silently spinning
- Break permanent empty-response loops — orphan tool tails no longer cause infinite empty-response cycles
- ContextVars propagated to concurrent tool worker threads
- Surface self-improvement review summaries across CLI, TUI, and gateway
- Token estimates now include system prompt + tool schemas for accurate compression triggers
Platform Allowlists
allowed_channels(Slack),allowed_chats(Telegram),allowed_rooms(Mattermost, Matrix), andallowed_robots(DingTalk) — restrict agent interaction to specific channels- Per-platform
gateway_restart_notification— granular control over post-restart messages busy_ack_enabled— suppress “I’m working on it” acknowledgment messages- Auto-cleanup of temporary progress bubbles
Session Durability
- Gateway auto-resumes interrupted sessions after restart — no lost conversations
- Pending update prompts preserved across restarts
- Home-channel thread targets preserved across restart notifications
- Thread routing preserved from cached live session sources
- Assistant metadata preserved when branching sessions
- Document type preserved when merging queued events
Curator (from v0.12, matured in v0.13)
hermes curator archive— archive curated entries for long-term storagehermes curator prune— clean up old, consolidated, or orphaned entrieshermes curator list-archived— view archived entries- Synchronous manual
hermes curator run— see results immediately without polling - Protected from overwriting bundled and hub skills
MCP (Model Context Protocol)
- SSE transport with OAuth forwarding and bumped
sse_read_timeout - Stale-pipe transport retries as session-expired (auto-reconnect)
- Image tool results surface as MEDIA tags instead of being silently dropped
- Periodic keepalive on long-lived lifecycle waits
- Reconnect on terminated sessions automatically
- Defensive numeric tool arg coercion in
mcp_serve - Utility stubs gated on server-advertised capabilities
Kanban Dashboard
- Workspace kind + path inputs in inline task creation
- Per-platform notification toggles for home-channel alerts
- Multiline textarea for task titles
- Boards filter by selected tenant
- Dashboard board pin authoritative over server current file
QQBot
- Native approval keyboards — inline Approve/Deny buttons for tool authorization
- Chunked upload for large files
- Quoted attachment support
TUI & CLI
- 100 new CLI startup tips covering cron, kanban, curator, plugins, and lesser-known flags
/modelpicker matcheshermes modelwith inline auth for all providers- Collapsible sections in the startup banner (skills, system prompt, MCP)
/newaccepts optional session name:/new my-refactor-sessionhermes update --yes/-yto skip interactive prompts
Dashboard
- Plugins page — manage, enable/disable, and check auth status for all plugins
- Profiles management page — create, edit, and delete profiles from the web UI
- Interactive column sorting in analytics tables
default-largetheme with 18px base font size- Reverse-proxy support via
X-Forwarded-Prefixheader - Launch as side-process via
HERMES_DASHBOARD=1in Docker
Web Tools
- SearXNG ships as a native search-only backend
- Per-capability backend selection — pick different backends for search vs extract vs browse
ACP (VS Code / Zed / JetBrains)
/steerslash command — direct the in-flight agent/queueslash command — queue follow-up tasks- Atomic session persistence via
replace_messages - Assistant reasoning metadata preserved across session persistence
- Windows cwd translation for WSL sessions
Security & Reliability
Critical Bug Fixes
- CLI crash on startup —
Invalid key 'c-S-c'(P0): prompt_toolkit doesn’t support the Shift modifier; keybinding removed - CLOSE_WAIT fd leak audit: httpx keepalive + WhatsApp aiohttp leak + Feishu hygiene — all fixed
- Gateway creates AIAgent with empty OpenRouter API key when
OPENROUTER_API_KEYis missing — fallback providers now correctly honored - Background review + curator protected from overwriting bundled/hub skills
- TUI compression continuation ghost sessions with incomplete metadata — fixed
hermes mcp addsilently launches chat instead of registering MCP server — fixed- Background review agent runtime propagation — provider/model/credentials now actually inherit from parent
- Inbound document host paths translated to container paths for Docker backend
- Matrix gateway race between auto-redaction and message delivery with high-speed models — fixed
/newduring active agent session never sends response on Telegram — fixed- Config.yaml wins over
.envfor agent/display/timezone settings - Git HEAD SHA used for stale-code check, not file mtimes
- Plan service stops handled without false-fatal errors
- Source file auto-restart when files change out from under the gateway
WhatsApp Hardening
In addition to the P0 stranger-rejection fix:
- Load home channel from env overrides
- Never respond in self-chat (prevents loop amplification)
Platform Reliability
- Gateway reset-failed before every fallback restart — prevents stranded gateway states
- Atomic restart markers + Windows runtime-lock offset
- Shutdown + restart hygiene — drain timeout, false-fatal, success log
- Ancestor PIDs excluded from gateway process scan
- Quick-command alias dispatch moved before built-ins (prevents accidental override)
- Other profiles shown in
gateway statusto prevent confusion
File Security
- Restore
.env/auth.json/state.dbwith 0600 permissions - Meet node server bound to localhost only
- Token file restricted to owner read
- Sensitive-write target extended to shell RC files and credential files
Upgrade
hermes update
For new installations, visit the install guide.
← Hermes Agent Changelog