hermes research decision-grade Pattern A+B mixed — single trial Fleet-wide adoption arc · 2 sub-agents + main-thread synthesis · 4 deliverables

T2 — Nous Hermes-Agent — Fleet-Wide Capability Profile

Companion: T1-pantheon-scheduling-stack.md (mirror axes for matrix join in T3). Source: viska-autoresearch T5/T6/PHASE2/DECISIONS + machine-report (K20N0S Hermes live) — no firecrawl extension required. Lens: fleet-wide adoption candidate evaluation. NOT viska-specific.

Reframing from viska arc

Viska arc (T5/T6/PHASE2/DECISIONS) scoped hermes-agent as a single-client autonomous research substrate. Fleet-wide reframe shifts the question from "can it host one client agent" to "can it host one of N executor roles inside a multi-tenant Pantheon constellation."

Carries forward unchanged: - 5 mandatory guardrails (PHASE2 §guardrails): pin tag, OS-sandbox, Pantheon-only skills, mirrored fork, 4–8 wk hook half-life. - SECURITY.md "only boundary is OS" (T5 §security-posture §2.2). Implementation gap: in-process plugins/skills/hooks run with full agent privileges. - Bus factor 1+ (teknium1 4,712 commits vs #2 660) + weekly v0.x cadence (T5 §release-pattern). - D11 strict-isolation directive — Pantheon-authored only, agentskills.io blocked at Envoy. - D10 hardened Docker Compose stage-1, OpenShell stage-2.

Reframes for fleet: - Viska = ONE client deployment. Fleet = multiple agents (atlas/hermes/plutus/proteus/...) potentially using hermes-agent as a shared scheduling executor on K20N0S. Tenant boundary moves from viska to <agent-name>. - D11 ceiling "Pantheon-authored only" now means fleet-Pantheon (cross-agent shared skill registry), not viska-Pantheon (per-client siloed registry). Wider skill author surface, same trust ceiling. - Hermes-on-K20N0S is already live (machine report: launchd-managed, OpenRouter deepseek-v4-pro, LAN-only, Slack delivery active). Fleet adoption is not greenfield — it's role-promotion of an existing process. - Fleet role candidates for hermes-agent: (a) scheduling executor (alongside launchd/n8n/Mastra), (b) autonomous-research agent (Ralph loop), (c) supervisor/orchestrator, (d) delivery surface (Slack gateway already covering this). Different roles fit different axes — score against PRIMARY-role-as-scheduling-executor for T3 matrix-join.

Surface inventory (capabilities covered)

Per T5 §release-pattern, T6 §extensibility-inventory:

Axis profiles

Scoring: 0 = not supported, 1 = barely, 2 = workable with friction, 3 = solid, 4 = strong, 5 = best-in-class.

Axis 1 — Triggering modes

Executor cron event manual conversational file-watch score note
nous-hermes ✓ (cron subsystem, native skill-injection scheduler) ✓ (22 messaging-platform inbound events, gateway hooks, HTTP gateway, MCP server-side triggers via sampling) ✓ (CLI invoke, TUI gateway JSON-RPC, OpenAI-compat HTTP+SSE, ACP) ✓ (Ralph /goal loop autonomous re-triggering across turns; conversational schedule-modify forbidden fleet-wide per T1 invariant 6) ✗ (no native; could be plugin via pre_tool_call + inotify subprocess) 4 Broadest single-process surface. Cron + gateway-event + ACP + HTTP + Ralph. Conversational schedule-mutation primitive present but MUST be Hades-blocked per T1 invariant 6. src: T1 D9 §architecture, T5 §release v0.14 OpenAI-compat, T6 row "Gateway hooks"

Triggering-mode note: Hermes is the only candidate in the T1 matrix that natively supports BOTH cron AND conversational re-triggering AND HTTP-event ingress in one process. The Ralph loop is novel — it persists pursuit of a goal across LLM turns until completion criteria fire, effectively chaining executions without operator intervention. Fleet adoption converts this into a "long-running autonomous schedule" primitive that no other T1 executor offers. Risk: Ralph-loop runaway is real (operator anecdotes in T5 §production-deployments cite multi-hour runs); iteration-guard plugin (T6 #11) is the mandated countermeasure.

Axis 2 — Persistence + state durability

Executor restart reboot sleep state location score
nous-hermes ✓ (launchd-supervised K20N0S) ✓ (launchd KeepAlive) inherits launchd wake-catchup on macOS; cron-subsystem catchup semantics not documented Hermes memory provider (Holographic SQLite on Railway volume per D12 / local FS); ~/.hermes/ config + jobs.json; gateway-state in-process 3 — durable via launchd wrapper, but Hermes-internal cron has no published catch-up semantics (gap vs launchd's wake-catchup primacy). src: D12 Tier-1 mount, T6 row "Memory providers"

Persistence note: Memory durability and schedule durability are two different surfaces. Memory provider (Holographic SQLite, D12 Tier-1) handles the Ralph loop's goal-state durability across process restart. Schedule durability (cron-table survival across reboot) depends on ~/.hermes/jobs.json being on persistent disk — which it is on K20N0S local FS, but Railway-container deployments need explicit volume mount. Gateway-state (active sessions, in-flight tool calls) is NOT durable — process restart drops in-flight Ralph iterations. For fleet posture: every long-running Ralph goal must checkpoint to Holographic at iteration boundaries; in-flight tool-call state is lost on crash. Mnemosyne-checkpoint plugin (T6 #22) is the mandated countermeasure for the latter.

Axis 3 — Tool surface

Executor tool surface available at runtime score
nous-hermes Built-in tool set (web_search, web_extract, browser, terminal, execute_code, vision, voice, computer-use) + plugin-registered tools + MCP-client tools + skills + 22 messaging platforms + 8 memory providers + delegate_task subagents. Provider-routing layer with fallback chains per task. 5 — broadest in any candidate. src: T5 §release v0.14, T6 §extensibility-inventory

Tool-surface note: The breadth is both a feature and a fleet-adoption risk. Per-tool attack surface compounds — terminal + execute_code + browser + computer-use each have independent security envelopes. T6 threat-model rows TM-2/TM-3/TM-4 all assume the surface is minimized via per-tool veto (pre_tool_call allowlist), not native. For fleet adoption, a "scheduling-executor-role-only" deployment should aggressively disable tool surface (e.g., no browser, no computer-use, no voice/vision) via config to reduce attack surface. Compare to launchd (T1 axis-3 score 2, shell only) — Hermes ends up at launchd-level surface when locked down, but with hooks/plugins/MCP-client intact, which is the differentiation worth keeping.

Axis 4 — Cost model

Executor cost score (cost-efficiency)
nous-hermes self-host on K20N0S ($0 hosting); LLM API pay-per-token (OpenRouter deepseek-v4-pro currently per machine report); Nous Portal default tier $23–55/mo light volume (D8); $200–400/mo stage-1 light, $900–1650/mo heavy (PHASE2 §cost-comparison); skill ecosystem free (MIT). 4 — comparable to other self-host stacks. Caveat: per-call LLM cost via provider, not flat. src: PHASE2 §cost-comparison, D8

Cost note: Per-call LLM cost is the dominant variable. Fleet adoption with N agents fanning out across one Hermes process aggregates cost into one OpenRouter account (or whichever provider); process-per-agent fanout splits into N quotas. D8's stage-1 stance of "Default tier (180 RPM), scale on telemetry" applies — but at fleet aggregate, 180 RPM may saturate sooner than single-client viska usage. Process-per-agent pattern also splits cost-attribution per agent, easier billing/chargeback per client engagement. Skill/plugin authoring cost is the hidden line item — 4–8 wk hook half-life means recurring engineering tax that compounds with number of authored plugins (see fleet-deployment §plugin-maintenance-budget).

Axis 5 — Isolation / sandbox posture

Executor process network secret tenant-boundary score
nous-hermes hardened Docker Compose stage-1 / OpenShell stage-2 (D10); default local backend "explicitly out-of-support" per SECURITY.md §2.2 (T5 §security-posture); terminal.backend: docker with cap_drop:[ALL], no-new-privileges, pids-limit, tmpfs noexec (T6 row "Container backends") application-layer website-blocklist + built-in SSRF guard (RFC 1918, link-local, cloud-metadata, CGNAT, redirect re-validation, fail-closed DNS) — T6 row "SSRF guard" + threat-model TM-7. NO network-layer egress allowlist — Envoy sidecar still mandatory (T6 #7, threat-model TM-4) Bitwarden Secrets Manager built-in + Vault-adapter pluggable surface at agent/secret_sources/; MCP credential filtering (only PATH/HOME/USER/LANG/TERM/SHELL/XDG_* pass to subprocess); credential redaction on tool errors (ghp_, sk-, bearer, token=, key=, password=, secret=); execute_code/terminal env-strip on KEY/TOKEN/SECRET/PASSWORD/CREDENTIAL/PASSWD/AUTH substrings per-process tenant by default — multi-agent coexistence INSIDE one Hermes process is NOT a built-in primitive. Plugins + delegate_task subagents can carve sub-tenants but trust still flows through main process privileges (SECURITY.md §2.4/§2.5 — in-process plugins run with full agent privileges). 3 — strong app-layer + container-layer, weak network-layer (Envoy still external), weak intra-process multi-tenant. src: T5 §security-posture, T6 §extensibility-inventory + threat-model

Isolation note: Hermes's SECURITY.md is the most honest in the candidate set — it names what is and isn't a boundary. The compensations (SSRF guard, hardline blocklist, approval modes, context-file injection scan) are real and reduce risk meaningfully (T6 threat-model rows TM-1/TM-2/TM-7 all move to "Lower"). But the in-process trust model means any plugin or skill compromise is full-agent compromise. K20N0S currently runs Hermes WITHOUT the Docker Compose wrap (machine report shows launchd-direct daemon on host). For fleet adoption, that posture must change — either wrap in Docker Compose per D10 stage-1, or accept that K20N0S Hermes runs at "out-of-support" posture per Nous's own §2.2.

Axis 6 — Observability

Executor logs traces rule-18 evidence integration score
nous-hermes built-in observability/langfuse plugin (per-turn / per-LLM-call / per-tool-call tracing); pre/post_api_request + pre/post_tool_call hooks = audit-trail substrate (T6 #8 sketch); per-call usage_pricing surface; gateway logs per platform ✓ first-class via Langfuse plugin + custom audit-trail plugin to separate Supabase application-emitted via plugin authoring — pre_tool_call can capture entity_ids before tool dispatch, post_tool_call can capture commit_shas / api_acks; but deterministic evidence (rule-18 CHECK constraint requirement) depends on plugin discipline, not framework guarantee. No native verification_evidence JSONB writer like Mastra writeRun step. 3 — strong observability surface, but rule-18 evidence requires Pantheon-authored plugin (not free). src: T6 #8, T6 row "Built-in plugins"

Observability note: The Langfuse plugin is a working reference implementation — it proves the hook surface is sufficient to capture every LLM call + every tool dispatch with structured per-call observations including usage_pricing. Re-using its pattern, a pantheon-audit-trail plugin writing to fleet_schedule_runs.verification_evidence is ~3–5 days of work (T6 #8 effort estimate). The framework guarantee is absent, however — there is no enforced CHECK constraint inside Hermes that says "every tool call MUST emit evidence." Plugin discipline is the only guarantor. By contrast Mastra's writeRun step is deterministic by design — the Workflow shape forces it. For fleet adoption, the audit-trail plugin must be one of the first authored + must be Argus-monitored for plugin-disabled drift.

Axis 7 — Multi-tenant boundary

Executor boundary score
nous-hermes per-process. One hermes-agent process = one tenant. Multi-agent coexistence (atlas + plutus + proteus tasks in one Hermes) requires plugins to gate per-call, NOT a built-in tenant primitive. Plugin-trust ceiling D11 (Pantheon-only) bounds the attack surface but does not enforce inter-agent isolation. For fleet-wide use, the natural pattern is one Hermes process per agent identity (multi-process fanout) — turns K20N0S into N processes. 2 — workable only via process-per-agent pattern; intra-process tenant boundary is convention, not enforced. src: SECURITY.md §2.4/§2.5 (T5), T6 §extensibility row "MCP credential filtering"

Multi-tenant note: This is the single most consequential axis for fleet adoption decision. T1 Routines scored 1 here for the same reason (per-operator-account collapse). Hermes scoring 2 instead of 1 reflects that plugins CAN carve sub-tenants — but the trust line is plugin-author discipline, not OS-enforced. Compare Mastra (T1 axis-7 score 4): per-Workflow tool-constraint = sandbox by construction. Process-per-agent on Hermes reaches Mastra-tier (estimated 4) at the cost of N× resource footprint + N× provider-routing configuration + N× plugin maintenance surface. T3 weighting must decide: is the per-process tax acceptable for the feature-ceiling-escalator benefit?

Axis 8 — Failure modes + auto-pause

Executor retry auto-pause silent-stall risk score
nous-hermes per-tool retry within delegate_task ladder + provider fallback chain (T6 row "Fallback providers + auxiliary tasks"); approval-system fail-closed timeout (default 60s) on approvals.mode: manual; hardline blocklist refuses catastrophic commands regardless of approve flags ✗ native (no Inngest-style auto-pause-after-N-failures). Operator must build via plugin: freeze-flag plugin (T6 #20) checks Supabase status, vetoes all pre_tool_call when set; cron poller updates the flag. Out-of-the-box: kill-switch is replicas: 0 (external) or operator-flipped flag (plugin). medium — cron-subsystem catch-up semantics undocumented (Axis 2 gap); plugin-trust drift if hook contract changes between weekly releases (T5 §plugin-API-stability "low-to-moderate" 6mo confidence). 3 — solid app-layer, needs Pantheon plugins to reach fleet auto-pause posture. src: T6 #20, T5 §plugin-API-stability

Failure-mode note: Hermes inherits the same gap as the rest of T1 stack — no native auto-pause-after-N-failures (T1 §cross-stack-gaps gap 1). PRD §3 ladder (1 failure log → 2 handoff → 3 paused_by_failure=true + athena decision-request) compensates SSOT-side rather than executor-side. The freeze-flag plugin sketch (T6 #20) does the executor-side enforcement — pre_tool_call reads a Supabase flag and vetoes all tool dispatch when set. Cron-poll cadence matters: too slow = blast radius before freeze takes effect; too fast = Supabase load. Suggested baseline: 30s poll. Combined with Cerberus P-SCHED-5..8 probes, the failure-mode coverage approaches Mastra-tier (T1 axis-8 score 4).

Axis 9 — Learning / feedback loop

Executor reflection step learns from outcome rows score
nous-hermes Ralph /goal loop = native multi-turn reflection on goal progression (T5 §release v0.13 Tenacity); memory provider (Holographic) supports trust-scoring; agent-skills can be self-authored ("self-created skills cut research-task time by ~40%" — TokenMix benchmark, T5 §production-deployment-signals); checkpoints v2 enables loop-state replay partial — reflection lands in memory provider but Hermes does NOT natively read fleet_schedule_runs to adjust cadence/retry/evidence-shape. Same gap as rest of T1 stack (T1 §axis-9 stack-level gap). Plugin path open via post_tool_call reading outcome rows + pre_llm_call injecting cadence-adjustment context. 3 — Ralph loop + checkpoints + self-authored skills move score above other executors; cross-executor fleet_schedule_runs learning still requires fleet-side plugin glue. src: T5 §release v0.13, T5 §production-deployment-signals Krzysztof benchmark

Learning note: This is where Hermes is genuinely differentiated. Most T1 executors are stateless invocations; Hermes ships a persistent goal-pursuit loop AND a self-modifying skill substrate AND a memory provider with trust-scoring. The TokenMix benchmark (~40% research-task time reduction via self-created skills) is the load-bearing external signal. For fleet adoption as the autonomous-research role (not the scheduling role), this is THE feature — no other T1 candidate touches it. But: self-modifying skill primitive collides with fleet invariant 6 (forbidding in-prompt schedule mutation). If "skills" can mutate their own scheduling, Hades-layer gating is mandatory before fleet adoption.

Axis 10 — Cross-machine + sleep/wake survival

Executor wake catchup cross-machine needs always-on score
nous-hermes inherits host (launchd on K20N0S → macOS wake-catchup IF wrapped by launchd; Hermes-internal cron behavior on host sleep undocumented — assume silent skip without launchd wrapper) ✗ native — single-process, single-host. Multi-host means one Hermes per host coordinated externally. fleet_schedules.executor_machine field disambiguates (PRD §5, T1 §architecture-invariants). K20N0S already configured no-sleep (machine report); other hosts would need same posture or launchd-wake-catchup wrapper 3 — strong on K20N0S-as-primary-host, weak on multi-host coordination; depends on launchd wrap for wake-catchup behavior. src: machine report, T1 axis-10 launchd row

Cross-machine note: This is the classic "scheduling executor needs a coordination story" axis. Routines (T1 axis-10 score 5) wins by being cloud — reachable from any Tailscale host. Hermes is single-host like launchd, n8n, CC Desktop, Mastra. The K20N0S no-sleep configuration is the load-bearing assumption — Hermes-internal cron has no documented wake-catchup, so any host sleeping mid-schedule loses the run. For fleet adoption beyond K20N0S (MacBook fleet, Mac Mini secondaries), the recommended pattern is to wrap Hermes invocations in launchd plists (Posture A from fleet-deployment considerations) so launchd's wake-catchup applies and Hermes runs as the execution payload, not the trigger.

Architecture invariants (carry-forward from viska arc, reframed for fleet)

Beyond the 5 mandatory guardrails (PHASE2), the following Hermes-specific architecture invariants survive the fleet reframe and constrain T3 weighting:

Fleet-deployment considerations

Stack-level findings (5 bullets)

Adoption-vs-T1-stack net assessment

If fleet adopts hermes-agent as one more executor in the T1 enum, it joins as the broadest-surface (Axis 3 = 5, ties top tier), strongest-learning (Axis 9 = 3, top of stack), broadest-triggering (Axis 1 = 4, ties n8n). It is weakest on multi-tenant boundary (Axis 7 = 2, ties launchd + n8n at bottom of stack), weakest on persistence vs launchd's wake-catchup primacy (Axis 2 = 3), and inherits the same network-layer-egress gap as the rest of stack (Envoy still external). Five-axis weighted score depends on T3 axis weights — but on raw axis scoring, hermes-agent is roughly Mastra-tier (composite expected mid-3 to low-4) with different per-axis distribution.

Where it WINS vs T1 incumbents: - Ralph loop = unique autonomous-pursuit primitive (axis 9 leadership). - Skill ecosystem + 22 messaging platforms + 8 memory providers = highest feature ceiling per process. - Self-modifying skills primitive — both feature and risk (fleet invariant 6 needs Hades enforcement).

Where it LOSES vs T1 incumbents: - Persistence durability (Axis 2): launchd 5 > hermes 3 on wake-catchup primacy. - Observability + rule-18 evidence (Axis 6): Mastra 5 > hermes 3, because Mastra writeRun step is deterministic by design. - Multi-tenant boundary (Axis 7): Mastra 4 > hermes 2, because per-Workflow tool-constraint is enforced by Workflow shape. - Stability cadence: every other T1 executor has slower release cadence than Hermes weekly v0.x.

The adopt question, sharpened: Does the Ralph loop + memory provider + skill ecosystem + multi-gateway feature ceiling justify the per-process maintenance tax + plugin-discipline-required posture + 4–8 wk hook half-life + in-process trust model? Decision rests on whether fleet has a use-case that NEEDS the Ralph loop. If yes → adopt as executor for that role specifically, scope tight. If no → cheaper to stay with launchd + n8n + Mastra stack and skip Hermes.

Comparison highlights vs T1 stack

Quick read-out of where nous-hermes lands relative to T1 executors on key axes:

Pantheon-authored plugin backlog (fleet adoption path)

Compiled from T6 §implementation-order + PHASE2 §updated-implementation-order, reframed for fleet (not viska):

# Plugin Hooks used Effort Fleet-scope notes
1 pantheon-audit-trail pre/post_api_request, pre/post_tool_call 3–5d Adapts Langfuse pattern. Writes to fleet_schedule_runs.verification_evidence + separate fleet-audit Supabase project. Ships first — every other plugin's evidence chains through it.
2 verification-evidence-writer post_tool_call, transform_tool_result 2–3d Specifically targets rule-18 CHECK constraint shape. Captures entity_ids/commit_shas/file_paths/api_acks/slack_message_ts per the PRD §6 schema.
3 fleet-schedules-trigger-adapter on_session_start + custom HTTP gateway endpoint 3–5d Themis-side: Themis reads fleet_schedules + posts to Hermes endpoint. Hermes-side: this plugin receives + invokes the cron skill. Adapter path A from fleet-deployment §coexistence.
4 research-fetch-allowlist + fetch_research(domain_id) tool pre_tool_call + new built-in tool 1–2d Per T6 #6. Allowlist queried from Supabase, cached per session. Replaces free-form URL fetches.
5 pre-ingestion-sanitize transform_tool_result 1–2d Per T6 #10. Zero-width strip + NFC + HTML-comment + CSS + aria-label + JSON-LD strip on every web_extract/web_search/browser_navigate result.
6 pii-tokenizer transform_tool_result + transform_llm_output + on_session_start/end 3–5d Per T6 #3. Fleet-scope tokenization rules may differ from viska's (client-name tokens etc). Schema lives in fleet_tokenization_policies.
7 iteration-guard agent:step + pre_llm_call + on_session_start 3–5d Per T6 #11. Ralph-loop runaway countermeasure — drift score + iteration cap. Mandatory fleet-side given Axis 9 autonomous-loop differentiation.
8 entropy-anomaly post_api_request 1–2d Per T6 #16. Outbound LLM prompt entropy baseline; alert on Nσ deviation.
9 freeze-flag pre_tool_call + cron poll 1d Per T6 #20. Supabase status check → veto all tool dispatch when flipped. Fleet kill-switch.
10 slack-template-filter transform_llm_output 1–2d Per T6 #21. JSON-Schema validation on Slack-delivery outputs.
11 mnemosyne-checkpoint agent:step + agent:end gateway hooks 1–2d Per T6 #22. Iteration-snapshot POST to Mnemosyne/Aion ingest.
12 dual-LLM via auxiliary config + delegate_task pattern 1–5d Per T6 #1. Quarantined LLM for ingested-content reasoning. Config-mostly.

Aggregate fleet-authoring effort: ~25–40 person-days (~5–8 weeks single-dev, ~3–5 weeks two-dev). All plugins enter the 4–8 wk hook-half-life maintenance cycle once shipped.

Source citation map

Quick-index of which inputs drove which axis/section, for T3 matrix-join verification:

Open questions

  1. Process count. Fleet adoption pattern: one shared Hermes process on K20N0S (lower resource, weaker tenant boundary), N processes (one per agent identity — stronger boundary, higher resource), or hybrid (one Hermes per "tenant cluster" — atlas+plutus shared, viska siloed). Decides Axis 7 score from 2 → 4 depending on path. T3 weighting needed.
  2. Launchd-wraps-Hermes vs Hermes-internal-cron. Posture A vs B per "Coexistence with launchd" above. Wake-catchup behavior of Hermes-internal cron on macOS sleep is undocumented — empirical probe needed before either path is locked. Affects Axis 2 + Axis 10 scoring confidence.
  3. fleet_schedules.executor adapter path. Mastra-bridge-style (HTTP POST to mastra-bridge translates to Hermes invocation) vs direct (Themis writes to Hermes jobs.json mirror + Hermes reads as file-watch). Latter is lower-latency but couples Hermes to Themis schema; former preserves separation. PRD-level decision, not pure T2 scope.
  4. Cross-tenant LLM-quota coordination. If process-per-agent, each Hermes consumes its own OpenRouter / Nous Portal quota. Fleet aggregate could exceed D8's 180 RPM Default tier even when each agent stays under. Cutover criteria from D8 need fleet-aggregate revision.
  5. update_scheduled_task MCP-tool equivalent in Hermes cron subsystem. T1 §architecture-invariants invariant 6 forbids in-prompt self-rescheduling fleet-wide. Hermes cron is skill-injection — does an in-running plugin/skill have the primitive to mutate the cron table? If yes, that primitive needs Hades-layer block. If no, axis-9 score stays at 3 (no self-modification risk).
  6. Multi-machine fanout. Fleet has K20N0S + other machines (MacBook fleet, hostinger-vps, Railway). Hermes is single-host. Multi-host scheduling requires N Hermes installs coordinated via fleet_schedules.executor_machine. Adapter work multiplies; bus-factor risk multiplies too (each host now depends on teknium1).
  7. Plugin re-test infrastructure. D13 review-gated rolling requires "all 10 Pantheon hardening plugins must pass on candidate tag before merge." No CI fixture for plugin-vs-Hermes-tag-matrix exists today. Building this infra is a hard prerequisite to fleet adoption — separate from per-plugin authoring cost.