Nova + Echo into Brain — the cost answer, and what I found while measuring
Nova + Echo into Brain — the cost answer, and what I found while measuring
Young, 2026-10-17: "bring Nova and Echo to join Brain Unit — (1) using Hermes that Brain currently on, or (2) create a Telegram interface on SolOS."
1. The decisive cost fact: Option 1 is nearly free, Option 2 is a build
| Option 1 — Hermes | Option 2 — SolOS Telegram | |
|---|---|---|
| Licence | MIT, $0 | MIT, $0 |
| Telegram client | already built (plugins/platforms/telegram/) | must be built — V3 has no chat layer |
| A2A serving | already running — one gateway multiplexes profiles | exists (serve.py), works |
| Identity/persona | exists — cortex/personas → profiles | exists (registry-driven) |
| New code needed | ~none — create 2 profiles, add 2 ports | a whole client layer |
| Marginal RAM | +~200–530 MB per profile on disk; the gateway is shared (721 MB serves 3 profiles now) | +1 process per agent (~50 MB) |
Option 1 wins on cost by a wide margin. Hermes already has the Telegram plugin,
the A2A adapter, and profile multiplexing — measured: one gateway process
(pid 1085339, 721 MB) already serves min/mira/sol on ports 8311–8313. Adding two
more profiles reuses that machinery.
Option 2 means writing a Telegram client for SolOS. V3's runtime has
a2a_server / serve / worker / store / invoke — no chat layer at all. That is
new code, new tests, new failure modes, for a capability Hermes gives us free.
My recommendation (cost lane): Option 1. Option 2 is only right if the goal is independence from Hermes — and that is a design decision for Sol/Min, not a cost one.
2. 🔴 What I found while measuring — Nova and Echo are ALREADY running, and broken
They are not missing. They are up on ports 8304/8305 right now, started by systemd --user as V3 A2A servers:
python3.14 -m operation.runtime.serve --agent echo --host 127.0.0.1 --port 8304
python3.14 -m operation.runtime.serve --agent nova --host 127.0.0.1 --port 8305
They answer A2A 1.0 correctly — but every task fails:
{"status":{"state":"TASK_STATE_FAILED",
"parts":[{"text":"no rung can serve this task — the ladder is exhausted"}]}}
Root cause (measured, not guessed)
| Step | Finding |
|---|---|
core/config/router.py:290 | the message comes from route() when no rung can serve |
loop.py::ladder_from_contract() | works — I ran it: go_free: 1, zen_free: 3 models |
operation/runtime/serve.py | never builds a ladder — no ladder/rungs/Executor reference |
wire_route.py | same — no ladder wiring |
loop.py::default_rungs() | empty by design — "an Executor built without rungs starts with NOTHING" |
So: the contract CAN supply the ladder, but the A2A server never asks for it.
The server answers every task with an empty ladder, and route() correctly reports
"exhausted". This is the "built but never wired" defect class — and it is exactly
what Young's question is really about: the agents are present but cannot serve.
This is Sol's lane to fix (runtime wiring). I am reporting it, not patching it. It is also the honest answer to "can Heart serve?" — today, no.
The correct behaviour is already specified
ladder_from_contract() refuses to start on an empty ladder:
"the ladder is EMPTY — no free model is declared… The worker refuses to start: a fleet that cannot run a task must not read as healthy."
So the design is right and the wiring is missing. The A2A server should use the same contract read as the worker — and, per that rule, should refuse to serve rather than answer "exhausted" on every task.
3. Cost of the fix (my lane: it is zero)
The ladder function exists and works. Wiring it into serve.py is a code change,
not a purchase — no new licence, no new host, no new model spend. The models are
already declared and already free.
4. For the register
- Option 1 (Hermes) is the cost-efficient path — plugin + multiplexing already exist.
- Nova/Echo are running but non-functional (ladder not wired) — Sol's fix.
- The
models.yamldeclarations are incomplete — only 4 declared, but the catalogue has 14 free models on ZEN and 3 on GO (incl. today'scat-jam-free,deepseek-v4.1-flash-free). Min's lane; I flagged it earlier.
Honest limits
- I measured ports, processes, RAM and the failure message. I did not trace the
full call path inside
serve.py— Sol owns that. - "~200–530 MB per profile" is disk, not RAM; a profile's runtime cost is smaller and I have not isolated it (the gateway is shared).
- Option 2's build effort is not estimated in hours — that is Sol's number.

