Agents-anywhere — Heart agents present on any host (2026-10-17)
Agents-anywhere — Heart agents present on any host (2026-10-17)
Young's question (Sat morning): "Heart Agents can be present on any host such as Production Server — all our hosts now have opencode V2 as our ARMS. Can they?" Answer: yes — and most of the enablers already exist today. This note is the measured design.
1. What an agent actually is (measured, not theorised)
An agent instance = 4 layers, all already host-portable:
| Layer | What it is | Where it lives today | Portable? |
|---|---|---|---|
| Identity/persona | SOUL + config, generated FROM the V3 registry | LAB cortex/personas (projected into profiles) | ✅ generated from cortex/registry/agents.yaml — one source, projected anywhere |
| State | profile dir: SOUL, MEMORY, state.db, skills | per-host ~/.hermes/profiles/<agent> | ✅ it is already a file tree — copy/rsync to a new host is the whole migration |
| Runtime | Hermes/OpenCode v2 process binding an A2A port | one process per host (LAB gateway serves 3 agents on 8311-8313) | ✅ identical runtimes on laptop/LAB/prod (v2 parity verified Oct-15) |
| Presence | the A2A port reachable via tunnels | fleet-ssh-tunnels.md registry | ✅ add a tunnel row = fleet reachability |
The V3 design already mandates this: Stage 1's registry derives everything (ports, lanes, cards, Hermes config) from one agents.yaml. An agent isn't "a thing on the LAB" — it's a registry entry instantiated wherever it runs.
2. Why the current outage proves the value
This morning's live state: LAB gateway binds only min/mira/sol; ace/echo/nova absent → every peer gets HTTP 000. Under agents-anywhere, the registry + tunnels + the new dashboard would show: "ace instance DOWN on LAB — last-good 13:00, alternate available: none". The outage becomes announced, not mysterious. Which is exactly the Stage 8/9 lesson: absence must announce itself, and spare presence must be easy to stand up.
3. The pattern (fleet version of our own hosting product)
Same shape as the per-tenant Medusa compose stacks — deliberate symmetry, one doctrine:
agent-anywhere pack = git-tagged directory (registry-issued)
profile/ persona + memory + skills + config (state.db etc.)
a2a bind: 127.0.0.1:<port>
ops: systemd --user unit, enabled + linger, autossh tunnels per registry
hosts run instances = "tenants of our own fleet":
laptop (Pulse): tam eva eve
LAB: min mira sol (+ ace echo nova atlas alpha when running)
prod: available for ANY of the above (opencode v2 ready; capacity: 4 OCPU/24G RAM, verified)
- Stand up agent X on host H: pull the pack (vault → git) →
systemctl --user enableunit → registry row (host, port) → tunnel rows added → dashboard shows the new endpoint live. - Move host A→B: stop A, pull/start on B, re-register ports + tunnels. No rebuild — state files move as data, identity comes from the registry.
- Co-residency: multiple agents per host is already how LAB runs (one gateway, three agents). Careful: one gateway per host binds its profile ports; multiple agent instances on one host = one gateway process each profile.
4. What needs building (small, ordered)
- Agent packs in the vault (
Pulse/config/agent-packs/<agent>/): each agent's state dir template + unit file + port, registered in the fleet-tunnels table. Proof: deploy echo (the currently-down sample) to prod from the pack. - Registry row addition (Sol/Min V3 lane when Stage 1 lands):
hosts:array per agent instead of the single LAB binding.a2a_fleetderives, dashboard consumes. - Dashboard rule (already in design): agent absent on its primary host but present on a secondary = green with a "home=h.getB" badge; absent everywhere = red.
- Keys hygiene per pack: each pack carries the agent's own SSH key refs (paths, not secrets; secrets stay 0600 on the host — per fleet rule).
5. What I verified this morning to ground this
- Heart = Ace, Alpha, Atlas (pronoun roster); LAB currently serves min/mira/sol only.
- opencode v2 present on laptop + LAB + prod (verified Oct-15 — the ARMS layer Young named).
- prod capacity measured Oct-13 (4 OCPU / 24GB / 180G free) — plenty for agent instances besides tenant stacks.
- Tunnels registry = the reachability layer already proven end-to-end (Min cross-verified Oct-13).
- All three of Nova's design docs + my stale-ref fixes shipped this morning — content layer is fully green.
6. Open for Young/Team
- Which Heart agent goes where first (the practical one: run Ace on prod as the first any-host instance, since his LAB instance is the outage case, ping Nova's design workflow after)?
- Registry single-source timing depends on Stage 1/2 V3 wiring — until then the vault fleet-tunnels table is the live registry (it already has every port per agent per host).
🎯 Tam's Read: the pieces for agents-anywhere already exist (registry-driven identity, portable state, opencode v2 everywhere, loopback tunnels) — the build is a pack format + registry rows, not a rewrite; ace-on-prod is the cheapest first proof and doubles as the outage fix.

