Fleet-Wide Nous Hermes-Agent Adoption — Decision Report
Status: Decision-grade. Hermes proposes; operator + athena ratify. Author: hermes (research) • Date: 2026-05-26 Source arcs: - T1:
T1-pantheon-scheduling-stack.md(Pantheon stack profile) - T2:T2-nous-hermes-fleet-profile.md(nous-hermes fleet profile) - T3:T3-eval-matrix.md(weighted axis matrix + 3 role-framings) - Carry-forward:research/viska-autoresearch-2026-05-25/(T5/T6/PHASE2/DECISIONS — Viska arc, 5 mandatory guardrails) - Carry-forward:docs/research/2026-05-20_scheduled-tasks-fleet-protocol.md+ PRD draft v0 - Carry-forward:research/n8n-mastra-slack-scheduled-task-2026-05-24/REPORT.mdGrounding: machine report on K20N0S Hermes runtime (2026-05-26, operator-supplied).
TL;DR
Adopt Pattern A+B mixed. Keep K20N0S Hermes as Slack delivery surface (Pattern B, status-quo). Add ONE trial role under Pattern A — Plutus market-close research loop — bounded by tight scope criteria and gated rollback. Reject Pattern C (full replacement) outright.
Composite eval: Hermes loses the head-to-head against best-of-Pantheon-stack across all three role framings (28pp scheduling, 20–25pp autonomous-research, redundant for delivery). BUT mechanical scoring under-credits the Ralph loop's actively-closed feedback cycle — the one gap-filler Pantheon-stack cannot deliver without 5–10 days of fleet-side wiring around Mastra reflection_text.
Decision posture: - Pattern B (delivery): operate-as-is, light Docker Compose hardening pass. - Pattern A (autonomous-research): single bounded trial. Plutus market-close, NOT atlas governance loop, NOT hermes-fleet-agent YouTube-intel. - 12-plugin Pantheon-authored backlog scoped to 6 minimum-viable plugins for trial (~12–18 person-days). - 90-day trial gate, then promote/retire decision with operator + athena.
Cost envelope (trial scope): - One-time: ~12–18 person-days engineering (~2.5–3.5 weeks one-dev) + K20N0S hardening pass (~3–5 days Hades). - Recurring: ~1–2h/wk maintenance + monthly upgrade triage during trial. - LLM: existing K20N0S OpenRouter line item + Plutus subscription quota.
1. Verdict
1.1 Three patterns considered
| Pattern | Scope | Verdict |
|---|---|---|
| A — Autonomous-research executor | Hermes runs autonomous loops on K20N0S for selected fleet agents (Plutus/atlas/hermes-fleet-agent) | PARTIAL ADOPT — single trial |
| B — Delivery surface only | Maintain current K20N0S Slack gateway as-is | CONTINUE |
| C — Full executor replacement | Hermes replaces launchd + Mastra + parts of n8n for fleet scheduling | REJECT |
1.2 Why reject Pattern C
- Concentrates bus-factor risk (teknium1 dependency, T5 §maturity) across ALL fleet scheduling.
- Breaks multi-executor SSOT defense-in-depth invariant (T1 §architecture-invariants invariant 3 —
fleet_schedules.executorenum). - Net score loss: Pantheon-best 169/185 vs Hermes 116/185 on scheduling role (T3 §matrix-scheduling).
- Effort: ~3–6 months engineering vs marginal value-add.
- Reverses 5+ ratified decisions (PRD v0 §G7 — launchd/Routines/n8n primary triad).
1.3 Why partial-adopt Pattern A
- Ralph loop is the only true Pantheon-stack gap-filler (T3 §gap-zone-summary item 1) — actively closes feedback cycle that Mastra's
reflection_textwrites-but-never-reads. - TokenMix benchmark (~40% research-task time reduction via self-authored skills, T2 §Axis 9) is the load-bearing external signal. Single fleet trial validates or refutes for our use cases.
- Bounded trial preserves optionality — if it fails, retire without disrupting the rest of the stack.
- Carry-forward of 5 mandatory guardrails from viska arc (PHASE2 §guardrails) means we already know what hardening looks like.
1.4 Why continue Pattern B unchanged
- K20N0S Hermes Slack gateway already deployed, healthy, and gating workspace-isolated rate budgets per Slack invariant (T1 axis-7 Slack score 5).
- 22-platform breadth is latent value — currently only slack-boas + slack-viska are fleet delivery surfaces. Don't pay for surface we don't use.
- Replacing with
@slack/bolt-direct adds re-implementation cost with zero functional gain. Hermes-as-Slack-relay is already paid for.
2. Pattern A — Trial role selection
2.1 Selection criteria
A role qualifies for the Pattern A trial if all four are true:
- Existing manual loop — there's a recurring human-driven research/analysis loop today that consumes operator time.
- Closed-form success criteria — outcome is measurable (catch-rate, time-savings, false-positive rate), not subjective.
- Low blast-radius on failure — autonomous-loop runaway or hallucination doesn't move money, leak PII, or destabilize fleet infrastructure.
- Fits in one Hermes process — no need for cross-process orchestration in trial.
2.2 Candidate ranking
| Candidate | Qualifies? | Rationale |
|---|---|---|
| Plutus market-close digest loop | YES (recommended trial) | Existing manual loop (mimir reviews market close 5x/wk). Closed-form (catch-rate vs operator override). Low blast-radius (research only, no broker writes — that's gated stage 2 per Viska D4). Fits one process. |
| atlas governance-research loop (skill-refresh 4-6w) | NO | Closed-form weak (governance is subjective). Blast-radius medium (atlas decisions shape fleet protocol). Better-suited for /loop or Routines per PRD §6. |
| hermes-fleet-agent YouTube-intel | NO | Already pipelined via existing constellation-hermes (this repo) scripts. Hermes-agent overlap is reinvent-the-wheel. Same surface, different runtime. |
| Plutus broker-execution loop (stage 2) | NO (premature) | Trifecta exposure (PII + positions + LLM). Wait for stage 2 broker gates (Viska D4 stage-2 trigger criteria). |
Selected trial role: Plutus market-close research loop.
2.3 Trial scope definition
- Tasks owned by trial Hermes process:
- Fetch market-close prints (no broker writes).
- Generate per-position commentary via Ralph loop iteration.
- Synthesize daily digest.
- Slack-post to mimir review channel via existing Hermes Slack gateway.
- Write
verification_evidenceJSONB tofleet_schedule_runsvia Pantheon-authored audit-trail plugin. - Tasks explicitly OUT of scope for trial:
- Broker calls (read OR write).
- PII handling (client-name tokenization required if broker positions referenced — out of trial scope).
- Schedule mutation in-prompt (forbidden fleet-wide per T1 invariant 6).
- Cross-agent dispatch (no
delegate_taskto non-Plutus identities). - Skill auto-installation from agentskills.io (D11 strict-isolation).
3. Hermes-K20N0S task-boundary proposal
Currently undefined per operator brief. This section establishes the boundary.
3.1 Tenant identity model
One Hermes process per fleet agent identity. No shared multi-agent process.
Rationale: T2 §Axis 7 = in-process trust is full-privilege; plugin discipline is convention not enforcement. Shared process collapses agent identity (same failure mode as Routines per-operator-account, T1 axis-7 Routines score 1).
K20N0S resource posture: - Existing: 1 Hermes daemon (Slack gateway role, currently shared K20N0S identity). - Add: 1 Plutus-identity Hermes daemon (Pattern A trial role). - Cap: 3 Hermes processes max on K20N0S (older hardware per machine report). Beyond 3 → migrate Pattern A scope to alternative host (MacBook fleet or new dedicated machine).
3.2 Network boundary
- LAN-only. No Tailscale exposure per machine report (older macOS incompatible with current Tailscale builds).
- Inbound: LAN 192.168.2.107 only. Themis-bridge POSTs to Hermes HTTP gateway on K20N0S local IP. No public exposure.
- Outbound: OpenRouter API (existing line item), Supabase fleet project (write
fleet_schedule_runs), Slackchat.postMessage. All other egress DENY at Envoy sidecar. - Envoy is MANDATORY per T6 #7 + T2 §invariants. TM-4 (LLM-API-exfil) and TM-5 (tenant-escape) close only at network layer.
- K20N0S currently has NO Envoy sidecar. This is a Pattern A prerequisite, not a nice-to-have.
3.3 Identity and credential boundary
- Trial Plutus-Hermes process gets its own credential bundle (Hades-deposited):
- OpenRouter API key (Plutus-scoped, separate from Slack-gateway-Hermes existing key).
- Slack bot token (slack-boas
plutus-botalready exists). - Supabase service-role JWT (Pantheon project, scoped to
fleet_schedule_runswrite +fleet_schedulesread). - No shared credential between the two Hermes processes on K20N0S.
3.4 Filesystem boundary
- Existing Hermes home:
/Users/k20n0s/.hermes/ - Trial Plutus-Hermes home:
/Users/k20n0s/.hermes-plutus/(separate) - Mirror fork checkouts:
/Users/k20n0s/pi/hermes-agent(existing) +/Users/k20n0s/pi/hermes-agent-fleet-stable(new fleet-stable branch).
3.5 Schedule authoring scope
Hermes process invoked via fleet_schedules.executor='hermes' enum value (new). Schedule authorship goes through Themis the same way as any other executor:
# {repo}/schedules/plutus-market-close-digest.yaml
id: plutus-market-close-digest
agent: plutus
executor: hermes # NEW enum value (D-extension via PRD amendment)
executor_machine: K20N0S
hermes_process: hermes-plutus # disambiguates within K20N0S
cron: 30 21 * * 1-5
notify_slack: slack-boas
requires_governance_ratification: true
verification_evidence_required: true
freeze_exempt: false
Themis reads → fleet_schedules → on schedule fire, POSTs to Hermes HTTP gateway on K20N0S with run context → Hermes invokes cron-skill or /goal Ralph loop → completion → audit-trail plugin writes evidence.
4. Integration with fleet_schedules SSOT
4.1 PRD amendment requirements
PRD v0 §5 currently has executor enum {launchd, routine, n8n, github-actions}. Pattern A requires:
- Amendment A: Add
hermesto enum. CHECK constraint update onfleet_schedules.executor. - Amendment B: Add
hermes_processcolumn (TEXT, nullable, disambiguates which Hermes process on a given executor_machine). - Amendment C: Themis parser extension — case for
executor='hermes'→ resolvesexecutor_machine+hermes_process→ POSTs to that Hermes gateway.
4.2 New mastra-bridge endpoint (mirrored from n8n integration)
Mirrors the pattern from research/n8n-mastra-slack-scheduled-task-2026-05-24/REPORT.md §1.1.
mastra-bridge :3002
/api/workflows/schedule-analyze/start (existing — n8n)
/api/workflows/hermes-schedule-dispatch/start (NEW — hermes)
Or alternative: direct Themis → Hermes (no mastra-bridge hop). Adapter path TBD via §6.1 below.
4.3 Rule-18 evidence chain
Themis fire
→ POST to Hermes gateway with schedule_id, run_id, expected_evidence_shape
→ Hermes invokes /goal or cron-skill
→ pantheon-audit-trail plugin (Pantheon-authored) captures:
- entity_ids[] (Supabase rows touched)
- api_acks[] (OpenRouter call IDs, Slack ts values)
- file_paths[] (any written artifacts)
- commit_shas[] (if vcs_mutating, but trial scope = false)
→ verification-evidence-writer plugin writes JSONB to fleet_schedule_runs
→ CHECK constraint enforces: outcome='success' ⇒ verification_evidence NOT NULL
No native Hermes writeRun step. Plugin discipline is the only enforcer.
5. Risk inventory
5.1 Inherited from Viska arc (PHASE2 §risk-inventory)
- Bus factor (teknium1). Mitigated by mirror fork + 4–8 wk hook half-life budget + pinned tag (D13).
- Weekly v0.x cadence + no LTS. Mitigated by D13 review-gated rolling + plugin re-test CI fixture (T2 open question 7).
- In-process trust full-privilege. Mitigated by D10 hardened Docker Compose stage-1 + D11 Pantheon-only skills.
- TM-4 LLM-API-as-exfil at network layer. Mitigated by Envoy egress sidecar (MANDATORY per T6 #7, Pattern A prerequisite).
- Plugin hook contract drift. Mitigated by D13 + CI fixture for plugin-vs-Hermes-tag matrix.
5.2 Fleet-specific additions
- K20N0S older-macOS constraint. Hermes Docker Compose support on this macOS version unverified — Hades probe required pre-trial. Fallback: operator-signed waiver for "out-of-support" posture per Nous SECURITY.md §2.2 (incompatible with D11 strict-isolation if accepted).
- Cron-subsystem wake-catchup semantics undocumented (T2 axis 2). Hermes-internal cron behavior on macOS sleep not specified. Pattern A trial mitigation: launchd-wraps-Hermes posture (Posture A from T2 §coexistence) — launchd is the trigger, Hermes is the payload. Preserves wake-catchup primacy.
- Resource cap on K20N0S. Trial = 2 processes (existing Slack-gateway + new Plutus). Adding more agents → 3-process cap. Beyond → migrate to alternative host or reject expansion.
- Bridge bus-factor on Themis adapter. Pattern A adds Themis → Hermes adapter to Themis's responsibility surface. Metis owns Themis. New code path = new failure mode. Mitigation: explicit Metis review of adapter design before merge.
- Plugin re-test fixture absent. No CI infrastructure today for plugin-vs-Hermes-tag-matrix. Building this is a hard prerequisite to fleet adoption per T2 open question 7. Effort: ~2–3 days. Add to Implementation Order.
6. Open decisions (gating implementation)
6.1 Adapter path
Two options for fleet_schedules.executor='hermes' dispatch:
| Option | Mechanism | Pros | Cons |
|---|---|---|---|
| A1 — Mastra-bridge mediated | Themis → mastra-bridge :3002 /api/workflows/hermes-schedule-dispatch/start → Hermes HTTP gateway | Reuses existing mastra-bridge pattern; tier the Hermes role behind atlas-owned middleware | Adds hop latency; mastra-bridge becomes critical-path for Hermes schedules |
| A2 — Direct Themis → Hermes HTTP | Themis posts straight to Hermes gateway on K20N0S | Lower latency; Hermes is independent of mastra-bridge availability | Adds Hermes endpoint shape to Themis parser; Themis carries adapter for two executor types (currently 4) |
Operator/architecture decision needed.
6.2 Docker Compose wrap for K20N0S
Per Hermes SECURITY.md §2.2 + D10 stage-1, hardened Docker Compose wrap is required for D11-compliant posture. K20N0S currently runs launchd-direct daemon (machine report). Pre-trial Hades hardening pass = ~3–5 days.
Two posture options: - B1 — Wrap before trial start (recommended). 5–8 day delay; full D10-D11 compliance. - B2 — Defer wrap, run "out-of-support" stage-0 posture for trial. Operator-signed waiver. Trial begins immediately, hardening lands by trial end-date. Risk: trial outcomes confounded with un-hardened posture.
Operator decision needed.
6.3 Envoy egress sidecar on K20N0S
T6 #7 names Envoy MANDATORY. K20N0S has no sidecar today. Pattern A trial cannot proceed without this network-layer boundary (per 5 mandatory guardrails inheritance from PHASE2).
Effort: Hades-owned, ~3–5 days (Envoy config + allowlist + cert pinning + DNS lockdown).
Allowlist for Plutus-Hermes trial:
- OpenRouter API (openrouter.ai)
- Pantheon Supabase REST endpoint
- Slack API (slack.com)
- Deny everything else (including DNS-over-HTTPS, IMDS 169.254.0.0/16 — separate from D7 Railway IMDS probe).
No operator decision needed (mandatory). Just sequencing in Implementation Order.
6.4 Trial duration + promote/retire criteria
Recommended:
- Duration: 90 days from trial-start (sufficient cycles to gather catch-rate vs operator-override telemetry).
- Promote criteria (ALL must hold):
- Plutus catch-rate (Plutus-said-approve, operator agreed) ≥ 90%.
- Time saved per market-close digest cycle ≥ 30 min vs manual baseline.
- Zero verification_evidence false-positives (plugin gathered correct evidence — measured by operator audit of N=20 sample rows).
- Zero security incidents (no Envoy block escalations, no plugin contract breaks).
- ≤ 4 hours/week maintenance overhead during trial.
- Retire criteria (ANY triggers retirement):
- Plutus catch-rate < 75%.
- Time savings ≤ 0 min (Hermes adds work).
- Any security incident.
- Maintenance overhead > 8h/wk.
- Upstream hermes-agent breaking change requiring > 2 weeks plugin re-author.
Operator confirmation on numbers needed.
6.5 Bundle with viska-autoresearch implementation?
Viska arc already commits to hermes-agent adoption for Viska client (D9 confirmed). Fleet-wide Pattern A trial is structurally separate (different agent identity, different K20N0S process, different schedule scope) but shares engineering work (audit-trail plugin, verification-evidence-writer, Envoy sidecar pattern).
Two delivery options: - C1 — Bundle. One engineering effort delivers both viska-autoresearch trial + fleet-wide Plutus trial. Saves ~30% effort by sharing plugins/infra. Higher coupling — viska delays land on fleet trial. - C2 — Sequence. Ship viska-autoresearch first (already operator-decided), evaluate, then fleet-wide trial. Less coupling, higher total effort, slower fleet learning.
Operator decision needed. Recommend C1 — bundle.
7. Implementation order (Pattern A trial, assuming C1 bundle)
| # | Task | Owner | Effort | Prereq |
|---|---|---|---|---|
| 1 | Envoy egress sidecar on K20N0S (allowlist + cert pin + DNS lockdown) | Hades | 3–5d | Operator approval §6.3 |
| 2 | K20N0S Hermes Docker Compose hardening pass (D10 stage-1) | Hades | 3–5d | §6.2 B1 (recommended) |
| 3 | Mirror fork setup (fleet-stable branch in boas-dev namespace) |
Hephaistos + Metis | 1d | None |
| 4 | Plugin re-test CI fixture (plugin-vs-Hermes-tag matrix) | Metis | 2–3d | Mirror fork |
| 5 | pantheon-audit-trail plugin (shared viska + fleet) |
hermes-fleet-agent or atlas | 3–5d | CI fixture |
| 6 | verification-evidence-writer plugin (shared viska + fleet) |
hermes-fleet-agent or atlas | 2–3d | audit-trail |
| 7 | freeze-flag plugin (fleet kill-switch) |
hermes-fleet-agent | 1d | audit-trail |
| 8 | iteration-guard plugin (Ralph loop runaway countermeasure) |
hermes-fleet-agent | 3–5d | audit-trail |
| 9 | slack-template-filter plugin (delivery sanity check) |
hermes-fleet-agent | 1–2d | None |
| 10 | fleet-schedules-trigger-adapter plugin + Themis parser case for executor='hermes' |
Metis (Themis) + hermes-fleet-agent (plugin) | 3–5d | adapter path §6.1 decided |
| 11 | PRD amendment (executor enum + hermes_process column + Themis case) | atlas → athena ratify | 1–2d | None |
| 12 | Plutus market-close trial schedule authored | Plutus + hermes-fleet-agent | 1–2d | All above |
| 13 | Trial begins (T-day) | mimir | 0 | All above |
| 14 | Mid-trial check (T+30d) | hermes (research) + mimir | 0.5d | Telemetry |
| 15 | Trial close + promote/retire decision (T+90d) | mimir + athena | 1d | Telemetry |
Critical path: 1 → 2 → (3 || 4 || 5) → 6 → 10 → 11 → 12 → 13. Estimated calendar time: ~5–7 weeks to trial start. Total trial cycle: ~5–7 weeks setup + 90 days trial + decision week = ~22–25 weeks.
8. Coordination + handoffs
Pattern A trial touches multiple fleet agents. Handoffs needed:
| To | Subject | Trigger |
|---|---|---|
| operator | Open decisions §6.1 (adapter path), §6.2 (Docker wrap timing), §6.4 (trial criteria numbers), §6.5 (bundle vs sequence) | This report ratification |
| Hades | Envoy egress sidecar config + Docker Compose hardening + macOS-Docker-on-older-OS probe | §6.3 mandatory pre-trial |
| Metis | Themis parser extension for executor='hermes' + plugin re-test CI fixture |
After §6.1 adapter path decided |
| Plutus | Trial role scope (market-close digest only); telemetry collection for catch-rate baseline pre-trial | Before trial start |
| atlas | PRD v0 amendment for executor enum + hermes_process column | After §6.1 adapter path decided |
| athena | PRD amendment ratification + 5 mandatory guardrails fleet-extension review | After atlas amendment |
| Hephaistos | Mirror fork setup + fleet-stable branch | Independent — can start now |
| proteus | n8n-instance side (no work — informational only that fleet now has 5 executors not 4) | At PRD amendment ratification |
9. Open questions (T4 cannot resolve)
Bumped to operator + future research:
- Cron-subsystem wake-catchup semantics (T2 OQ2). Empirical probe: on K20N0S, sleep machine, miss a Hermes-internal cron fire, wake, observe — does it catch up? If not, launchd-wraps-Hermes (Posture A) is mandatory. Probe before trial start.
- Hermes Docker Compose support on older macOS. Hades probe required §6.2.
- MacOS-K20N0S Tailscale alternative. Machine report flags Tailscale broken. Future fleet expansion of Pattern A to other machines may need alternative VPN/secure-LAN transport. Not blocking for trial (LAN-only on K20N0S sufficient).
- Plutus subscription quota at trial volume. Pattern A trial adds Hermes-driven LLM calls on top of existing Plutus CC subscription. Quota arithmetic: trial volume × OpenRouter cost vs current Plutus monthly LLM line item. Operator should set ceiling pre-trial.
- 22-platform messaging breadth — fleet roadmap. Does fleet anticipate Telegram/Discord/Teams/Matrix expansion within 12 months? If yes, Pattern A trial proves the substrate for that expansion. If no, the 22-platform breadth remains latent capability.
- Skill-authoring substrate fleet-wide. Hermes lets agents author their own skills at runtime. TokenMix benchmark ~40% time-reduction. Fleet adoption of skill-authoring as a primitive (separate from cron) is a research question downstream of trial — does Pantheon want self-modifying agent loops as a category, or treat the Plutus trial as the only instance?
10. Recommendation summary
| Question | Answer |
|---|---|
| Adopt nous-hermes-agent into Pantheon fleet? | YES, partial: Pattern A+B mixed. |
| Replace existing executors (launchd/n8n/Mastra)? | NO. Pattern C rejected. |
| Roll out to all fleet agents? | NO. Single trial role: Plutus market-close digest. |
| Trial duration? | 90 days post-setup, ~5–7wk setup → 22–25wk total to decision. |
| Engineering cost? | ~12–18 person-days plugin authoring + ~6–10 days Hades hardening = ~18–28 person-days first-deploy. ~1–4h/wk recurring during trial. |
| Pre-trial gates (all blocking)? | Envoy egress sidecar on K20N0S; Docker Compose wrap (or operator waiver); plugin re-test CI fixture; PRD amendment ratified by athena. |
| Rollback path? | Retire criteria §6.4 ANY trigger → flip freeze-flag plugin → migrate schedules off executor='hermes' → keep K20N0S Hermes Slack-gateway role (Pattern B) intact. |
The Ralph loop is the only true gap-filler. The rest is Pantheon-stack already covers. A bounded trial validates whether the Ralph loop pays for the maintenance tax.
11. Cross-references
- T1 (Pantheon stack):
research/nous-hermes-fleet-adoption-2026-05-26/T1-pantheon-scheduling-stack.md - T2 (Hermes fleet profile):
research/nous-hermes-fleet-adoption-2026-05-26/T2-nous-hermes-fleet-profile.md - T3 (Eval matrix):
research/nous-hermes-fleet-adoption-2026-05-26/T3-eval-matrix.md - Viska arc (5 guardrails source):
research/viska-autoresearch-2026-05-25/(REPORT-PHASE2.md, DECISIONS.md, T5, T6) - Scheduled-tasks PRD v0:
docs/research/2026-05-20_scheduled-tasks-fleet-protocol-PRD-draft.md - n8n+Mastra+Slack extension:
research/n8n-mastra-slack-scheduled-task-2026-05-24/REPORT.md - Decisions backlog (cross-agent ratification):
backlog/decisions--scheduled-tasks-cross-agent-ratification.md - Decisions backlog (freeze-exemption):
backlog/decisions--scheduled-tasks-freeze-exemption.md - K20N0S machine report: operator-supplied 2026-05-26 (Dropbox)