Agent stack build plans · № 5 · Hermes news pipeline

Architecture

One Hermes instance, four stages. Everything metered is marked, and so is everything you have to build yourself.

1 · Schedule — Hermes built-in cron

The cronjob tool creates jobs (natural-language schedules supported); definitions live in ~/.hermes/cron/; manage with hermes cron list/run/pause/status. Each tick runs the monitoring prompt below and delivers output to your messaging platform.

07:00 · 12:30 · 17:303 jobs, one per edition
Delivery targetTelegram / Slack thread
↓ each tick

2 · Watch — the monitoring sweep

All web tools route through the paid Nous Portal tool gateway. The sweep checks each watchlist item since the last run and applies your bar.

Topicsweb_search → web_extract (Firecrawl-powered)
X accountsx_search on your handle list
Subredditsweb_extract on the subreddit page — or a fetch script the skill runs you build this
RSS feedsnot built in — bridge below you build this
↓ story clears the bar

3 · Draft desk — subagent delegation

Three delegate_task calls per story (the delegation toolset spawns isolated subagents for parallel workstreams — Hermes’ own user-stories doc shows this orchestration with a different model per role).

Researcherweb_extract 4–6 primary sources → numbered claims-to-URLs list. Cheap fast model.
Summarizerdrafts per /house-style skill + SOUL.md voice, cites by claim number, self-scores on your rubric rubric is yours. Strongest model.
Fact-Checkergets claims + URLs only (never the draft), re-fetches each with web_extract, marks verified / unverified. Different model from the Summarizer.
↓ queue message

4 · Review — the human

Drafts + sources + fact-check table + style score land in the chat via the hermes gateway daemon. You approve, edit (in-thread), or spike. No CMS credentials exist anywhere in this system.

Gatewayhermes gateway — Telegram, Slack, Discord, and ~20 other platforms
Publish stepa human, by hand, on purpose

Where the voice lives

Two real mechanisms, used together. ~/.hermes/SOUL.md is the persona file — system-prompt slot #1, loaded into every session including every cron tick — so it holds the short version: who you write for, register, three hard rules. The house-style skill (~/.hermes/skills/editorial/house-style/SKILL.md, YAML frontmatter, invoked as the /house-style slash command) holds the long version: banned words, lede rules, sourcing standards, structure, and the scoring rubric — loaded only when the Summarizer drafts, not on every tick. Keep them in that order of size; the traps page explains the billing reason.

The escalation ladder for stubborn pages

  1. web_extract — the default; handles most article pages.
  2. browser_navigate / browser_snapshot — Browser Use cloud headless Chromium, also metered via Portal — only where extraction fails (JS-walled pages, cookie mazes). browser_vision is the expensive last resort; the monitoring prompt should say so explicitly.
  3. Respect the walls: no paywall circumvention, no login-walled scraping, honour robots and rate limits. If a source is paywalled, the draft links it and says so.

The optional RSS bridge (you build this)

Hermes has no RSS reader, but it does have a real webhook gateway: an external RSS-to-webhook service (or a tiny script on any box with a crontab) POSTs new items to http://your-server:8644/webhooks/<route-name>. Routes are configured under platforms.webhook.extra (port 8644, shared secret, rate limit 30/min, max body size), support HMAC validation, prompt templates, and deliver targets — so a fat feed item can wake the draft desk between cron ticks. It’s glue you own: budget an hour, and skip it until the cron sweep proves insufficient.

State, for completeness

Run-to-run continuity (“since the last run”, “already covered this”) rides on Hermes’ session recall — session_search over the SQLite store at ~/.hermes/state.db — plus a running “covered stories” list the cron prompt maintains. There is no built-in vector store, whatever other write-ups claim; don’t design as if there were.

Disagree? Pin a note on it →