Status: Accepted (vocabulary and contract split); routing not yet built Date: 2026-08-12
ARES can do two very different things that today share one ambiguous model/provider selector:
Model inference — “generate the next tokens.” The orchestration, tools,
context, and session belong to ARES or to Jaeger; only token generation is
outsourced. Implemented by ClaudeCloudBackend (Anthropic SDK, streaming),
OpenAICloudBackend, XAICloudBackend, OllamaLocalBackend, and by
Jaeger’s own external_model config block.
Agent delegation — “hand this whole task to another agent.” The other
agent runs its own tool loop, its own context window, its own session,
and returns a result. Implemented by ClaudeLocalBackend (claude -p),
CodexLocalBackend (codex exec), GrokLocalBackend, and Hermes.
These are not interchangeable, and the difference is user-visible:
ClaudeCloudBackend and ClaudeLocalBackend. Picking
“Claude” in a model dropdown is ambiguous today, and the two have
materially different privileges.The registry split (ADR-0009) hid this: both live behind
BackendRegistry/AgenticBackend with the same run_turn(message,
session_id) signature, which makes two different operations look like one.
Treat these as two named operations with separate contracts and separate UI vocabulary. They may share the adapter registry, but must not share a selector, a config key, or a label.
Concretely, before routing is built:
Automated routing (“decide which of the two this task needs”) is explicitly out of scope here. Naming the operations correctly is a precondition for building it, not the same work.
Good:
Costs:
A single unified operation genuinely emerges — for example if delegation targets start exposing token-level streaming, tool visibility, and context control equivalent to inference, such that the distinction stops being user-visible. That is not the case for any current adapter.