Agent stack build plans · № 3 · part 3

Architecture

Everything below is a named Hermes feature except two boxes — those are marked, because pretending conventions are features is how plans like this rot.

Cron scheduler — built in jobs live in ~/.hermes/cron/ · created in natural language via the cronjob tool · managed with hermes cron list/run/pause/resume/status
↓ fires 07:15 daily
Agent run — the /research-intern briefing skill a skill you create at ~/.hermes/skills/research/research-intern/SKILL.md; the cron job’s instruction just invokes it
↓ gathers via tools
Web tools web_search / web_extract (Firecrawl) and x_search, all through the paid Nous Portal tool gateway — every call is billed
Scraper skills self-written via skill_manage, gated by skills.write_approvalSKILL.md + scripts/ per awkward source; run through execute_code/terminal
↓ scripts execute in
Docker terminal backend — the sandbox hardened container: all capabilities dropped, no-new-privileges, 256-process limit, 512 MB tmpfs /tmp. Not optional here — see the honesty note below
↓ checked against memory
session_search full-text (SQLite FTS5) over past conversations in ~/.hermes/state.db
reports/ archiveyou build this a directory of dated markdown reports the intern greps before writing — a convention this plan defines, not a Hermes feature
↓ writes report, then delivers via
Messaging gatewayhermes gateway background daemon (systemd/launchd installable); delivery to Telegram here, but cron can deliver to any supported platform

The memory, honestly

“A memory archive of past reports” sounds like one feature. In Hermes it is three layers, and only two exist out of the box:

The sandbox, honestly

Hermes’s execute_code tool runs Python that can call the agent’s tools over RPC — ideal for scraper scripts. But it is not inherently sandboxed: on the default local terminal backend that Python runs as your user, on your machine. Since this plan has an agent writing and running its own code against arbitrary web content unattended at 7 a.m., pairing it with the docker backend (one of six backends: local, docker, ssh, singularity, modal, daytona) is the load-bearing decision, not a nicety. The docs’ own framing: the container is the security boundary. Keep skills.write_approval on so new and edited scraper skills wait for you, and leave approvals in smart or manual mode — details on the setup page.

What’s deliberately absent

Disagree? Pin a note on it →