Skip to content

scope: thin-client refactor — defer to devagentic on persona / recovery / clarify / tool list / iteration cap / summary fallback #143

@PowerCreek

Description

@PowerCreek

hermes-agent: scope toward thin-client architecture

Premise

Per devagentic#203 (canonical fusion contract) + this rotation operating-doctrine:

  • Devagentic = the orchestration intelligence (intent classify, role route, preamble shape, cascade recovery, runaway detection, operating-mode selection)
  • Hermes-cli = the transport client (HTTP + SSE + local tool execution + terminal rendering)

The architectural goal: hermes-cli trends toward barebones so devagentic is the prominent driver. Today hermes carries opinions (persona, retry heuristics, clarify modals, summary fallbacks) that fight devagentic-side orchestration. Each layered opinion creates a surface where mode-confusion can happen.

Active thinning targets

Each below is a candidate hermes-agent issue. Sequence behind any in-flight work; ship as separate PRs so the refactor can be reverted granularly if needed.

T1. Persona / identity → defer to devagentic by default

Today: hermes ships "Hermes Agent by Nous Research" identity baked into the system prompt. Sandbox profile uses HERMES_DEFER_PERSONA=1 to strip it.

Ask: make HERMES_DEFER_PERSONA=1 the default. Persona is opt-in via HERMES_DEFER_PERSONA=0 for legacy users. Devagentic-controlled clients (provider=devagentic-local) auto-defer regardless. Justification: when devagentic owns the model role + preamble, hermes-side identity is a conflicting voice; devagentic-emitted system prompts should win.

T2. Empty-content recovery / retry-on-empty -> remove from hermes

Today: v0.18.4 added empty-content recovery (re-prompt model with "Your previous response was empty"). This is hermes-side recovery logic.

Ask: remove the empty-content recovery loop entirely. Devagentic-side cascade (NousResearch#324, NousResearch#345, NousResearch#346) handles this layer with full context (intent, role, dispatch trace). Hermes does NOT need to retry — if a response arrives empty, surface it; devagentic decides what to do next.

T3. Clarify-tool default-out

Today: clarify-tool emits a TUI input modal regardless of context. Even with --yolo, clarify still pops a "Type your answer" prompt.

Ask: remove clarify from the default tool subset for sessions with provider=devagentic-local. Devagentic-side intent classifier knows when clarification is actually needed (and can surface it via an OpenAI-shaped assistant message). Hermes does not need to own this UX.

T4. Tool subset defaults -> devagentic-controlled tool list, not bundled zoo

Today: hermes ships ~50 built-in tools (browser, computer_use, cronjob, delegation, discord, ...). Sandbox profile uses HERMES_TOOLS_SUBSET to narrow. Default behavior is "expose everything".

Ask: when provider=devagentic-local, hermes consults devagentic for the tool list. New endpoint or pre-flight query. The 50-tool default exposes attack surface + confuses small models. devagentic-controlled list = 5-10 tools curated per user/intent.

T5. Conversation loop max-iterations -> devagentic-controlled

Today: hermes hardcodes max 90 tool-call iterations per turn, then emits "Reached maximum iterations" fallback.

Ask: make the iteration cap a per-dispatch parameter devagentic sets. Devagentic-side runaway-detector (NousResearch#345/NousResearch#346/NousResearch#348) decides when to break a loop — hermes does not need its own 90-iteration cap.

T6. Summary / final-text synthesis fallback -> remove

Today: hermes has fallback paths that synthesize a "summary" response when something goes wrong (e.g. v0.18.6 "I reached the maximum iterations but could not summarize. Error: ...").

Ask: replace with deterministic devagentic-side response synthesis. Hermes does not author content; it transports.

Two-issue rule applies

For T1-T6, each ship needs:

  • A hermes-agent issue (the removal/refactor)
  • A devagentic issue if the capability migrates over (the cascade owns the recovery, the classifier owns clarify, etc.)

Some can be hermes-only removals (T2, T3, T6 — devagentic already does these). T1, T4, T5 may need devagentic-side wiring to fill the gap.

Why now

This rotation surfaced 3 root causes that all stem from hermes owning too much:

  1. v2 preamble forced mode 2 -> fabrication risk -> cannot fix with text alone, need devagentic-side mode selection
  2. _real_completion_stream silently discarded tool_calls (hermes saw nothing -> triggered its empty-content recovery -> looped) — symptom of hermes having recovery to trigger in the first place
  3. Codestral runaway-loop required devagentic-side detector (Feature: Message Coalescing for Gateway Platforms NousResearch/hermes-agent#345/Feature: Structured Memory System — Typed Nodes, Graph Edges, and Hybrid Search NousResearch/hermes-agent#346/Context overrun NousResearch/hermes-agent#348) because hermes-side has no visibility into intent / classifier / role

Each fix has been devagentic-side. The hermes thinning is the complementary direction: remove the opinions hermes ships that fight devagentic authority.

Sequencing

Recommend T2 first (remove empty-content recovery — least scope, biggest immediate win — devagentic-side cascade already covers it). Then T3 (clarify default-out — easy + cleans up sandbox UX). Then T1 (persona default-flip). T4-T6 are larger refactors and can wait until T1-T3 prove the pattern.

Standing by for sequence approval.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions