Superseded by ADR-0008. The substance holds — workers stay out-of-process — but “subprocesses” is too narrow: ARES also reaches workers via vendor SDKs over HTTPS and local HTTP. Retained unedited as history.
Status: Superseded (was: Accepted) Date: 2026-07-22 (recorded retroactively; the decision predates this record)
Upstream Hermes WebUI, which ARES forked, invokes its agent in-process:
api/streaming.py constructs AIAgent(...) directly and receives tokens through a
stream_delta_callback. Conversation history is passed as a Python list
(conversation_history=), so there is no serialization and no session-identity
problem.
ARES routes work to many workers — Hermes Agent, jros/JaegerAI, Claude Code, Codex, Ollama, cloud providers. FOUNDATION states the Companion does not re-implement or absorb a worker’s execution loop; adapters invoke them.
Workers are invoked as subprocesses through adapters in api/backends/.
Continuation is achieved by asking the worker to resume its own session
(--resume <session_id>), not by replaying history across the boundary.
Good:
Costs:
A common objection is that subprocess invocation must re-send the whole
conversation each turn. It does not. Only the new user message crosses the
boundary; the worker reloads its own history from its own store via --resume.
The payload is one message regardless of conversation length.
ARES ever narrows to a single, importable Python runtime — the multi-worker requirement is the whole justification. Process start-up latency alone is not a sufficient reason; measure it against a warm-worker daemon before reopening.