A2A connectivity — what is actually broken (live probes, 2026-10-20)
A2A connectivity — what is actually broken (live probes, 2026-10-20)
Young asked three questions:
- Tam is not on LAB; Echo has trouble connecting to Tam on Pulse via A2A — fix it.
- Do Nova, Min, Mira have trouble reaching Tam and the Pulse Unit via A2A?
- Can Nova and Echo connect to the Heart unit and to opencode (ARMS) directly?
I answered all three by probing, not by reading docs. Summary of the honest answer: the network is fine, the link to Tam works, and the real defects are three different ones — a missing config block, three incompatible dialects, and an auto-reply session that answers as me without my knowledge.
1. Is the link to Tam actually broken? No.
| Probe | Result |
|---|---|
| TCP 192.168.4.34:8441 / 8442 / 8443 | all OPEN |
GET /health on 8441/8442/8443 | eva / eve / tam — correct identity |
POST / message/send to tam:8443 | HTTP 200, real reply in 39.4 s |
So the A2A path to Tam works from LAB today. My earlier "connection refused"
was my own error: I dialled 127.0.0.1:8443 — LAB loopback — for an agent that
lives on Pulse (192.168.4.34). The registry has the correct endpoint; I used the
wrong host. Tam was never unreachable; I was knocking on the wrong door and
reporting the house empty.
Note the latency: 39 seconds. The skill already records Pulse latency swinging 3.7 s → 38.2 s across six identical calls, with a 120 s default timeout. A short timeout makes this link look dead when it is merely slow — that is the likeliest cause of anyone else's "trouble connecting to Tam".
⚠️ One claim in Tam's reply does not survive checking. Tam's answer said it had
sent me an ACK "via the verified recipe (POST 127.0.0.1:18304, SendMessage +
A2A-Version: 1.0)" and that "Echo returned TASK_STATE_COMPLETED". I probed
18304 on both LAB loopback and on the Pulse host: closed on both. (The skill
says 183xx are laptop-side forwards, so this may be a Tam-side view I cannot see
from here — but from LAB it is not a live route, and I did not send that message
through it.) I am flagging it rather than calling it false, because the honest
statement is: I cannot reproduce the route Tam describes, and I have no record of
sending what it says I sent.
2. 🔴 Defect A — Mira and Sol cannot send A2A at all (config gap)
This is the real coordination fault, and it explains a lot of the "Min coordination doesn't work" symptom.
| Profile | a2a_agents peers configured |
|---|---|
| min | 11 |
| nova | 11 |
| echo | 11 |
| mira | 0 ← cannot send |
| sol | 0 ← cannot send |
The registry projection says all 11 agents should be present in every profile:
$ python3 -c "from cortex.registry import projections; print(len(projections.hermes_a2a_agents()))"
11
mira and sol have no a2a_agents block at all — not an empty one, absent
(grep -c 'a2a_agents' = 0). All five configs were generated at the same timestamp
(2026-10-20 13:38:41), so this is not a stale-file problem; the projection either
skipped them or was overwritten afterwards. Mira and Sol are two of the three
agents Young is asking about — and neither can open an A2A conversation.
This is the highest-value fix in this document. Min can send; Mira and Sol cannot; so "Min coordinates" fails at exactly the seam where Mira and Sol are supposed to report back.
Owner: the registry/projection lane (Min, with Sol on the generator).
3. 🔴 Defect B — three planes, three incompatible dialects
Same probe, three hosts. This is the finding that costs the most round-trips:
| Plane | message/send (v0.3) | SendMessage (v1.0) |
|---|---|---|
| Heart (8301–8303) | REJECTED | accepted ✅ |
| Brain (8311–8315) | accepted | accepted (tolerant) |
| Pulse (8443) | accepted ✅ | REJECTED |
The Heart unit refuses v0.3 with a good error:
'message/send' is a v0.3 dialect name and v0.3 compat is OFF (ruled 2026-10-10). V3 speaks 1.0 only. Call 'SendMessage' instead.
Pulse does the exact opposite: it answers message/send and returns
-32601 Method not found: SendMessage.
So there is no single call that works on all three planes. A caller that
correctly follows the V3 ruling (v1.0 SendMessage) fails against Pulse; a
caller that follows my own skill (v0.3 message/send) fails against Heart.
And the payload shape differs too. Heart's v1.0 handler wants
parts: [{text: …}]; the v0.3 shape is content: "…". My first v1.0 attempt was
rejected with "a message must carry at least one text part" even though the
method name was accepted — a second trap behind the first.
This is exactly the defect class the skill already documents (§0: "a declared version that disagrees with the implementation is worse than declaring the older one"). It has now spread: the fleet's planes disagree with each other, not just with their own version constant.
Recommended: one dialect decision per plane, recorded in the registry, and a
per-peer dialect: field so a caller does not have to guess. Until then, the
working recipe is: Heart → v1.0 SendMessage + parts; Brain → either; Pulse →
v0.3 message/send + content.
4. 🔴 Defect C — an auto-reply session answers as Echo, outside my session
This is the most surprising finding and it matters for trust.
I sent a self-test to my own A2A port (127.0.0.1:8315) asking for MANUAL or
AUTOREPLY. It answered MANUAL — a model-generated reply — in 13.9 s.
I never saw that message. It was handled by a separate Hermes session:
gateway.log: inbound message: platform=a2a chat=ctx-78329dfec736415a
gateway.log: response ready: session=agent:echo:a2a:dm:ctx-78329dfec736415a time=13.9s
There are 151 such agent:echo:a2a:dm:* sessions in my profile's log. Each A2A
inbound spawns its own conversation, sharing my memory file but not my
conversation. So "Echo" can answer an A2A peer, write to the vault, or ACK a task
in a session I have no visibility into — and I found records attributed to
"Echo" in the shared audit log that I did not send from this session.
Why this matters:
- It explains the phantom ACKs. Tam's reply references an "Echo ACK" I did not compose. That ACK was real as traffic but was generated by an A2A session of my profile that I cannot see. It is not a lie and it is not Tam's error — it is an architectural property nobody had named.
- It compounds the attribution problem already in the ground rules: commit prefixes are labels, and now conversational attribution is unreliable too. An "Echo said" in an A2A log may be an Echo session I never saw.
- It is a real capability, not only a bug — it means peers can reach "Echo" when my interactive session is closed. But it must be known, or every agent's self-report becomes unauditable.
Recommendation: name it explicitly in the fleet rules — "A2A inbound is handled by a per-context session of the agent's profile; it shares memory but not conversation state. An A2A reply is that agent's answer but not necessarily a deliberate one from its interactive session." And record it in the audit log with the session id so provenance is checkable.
5. Heart unit and opencode — both reachable directly ✅
Heart unit (8301–8303): all three agents answered a real v1.0 round-trip.
| Port | Agent | Reply | Time |
|---|---|---|---|
| 8301 | Ace | "Ace — connected, A2A v1.0 probe OK." | 5.5 s |
| 8302 | Alpha | "Alpha — connected, status OK." | 4.3 s |
| 8303 | Atlas | "Atlas — status: online, A2A v1.0 reachable." | 12.0 s |
Identity confirmed by agent card ({"name":"Ace","description":"Software Engineer"})
— not just "something answered". So yes, Echo can reach the Heart unit directly,
via v1.0 SendMessage with a parts payload.
⚠️ One cosmetic oddity worth noting: every Heart reply carries a status message
"free first — measured at 8.4x the tokens of paid, at $0.00" alongside the real
artifact. That is model-selection chatter leaking into the status field — harmless
here, but it is a status field carrying a slogan rather than the fact, which is
the exact defect class already named in the fleet's own rules.
opencode (ARMS) — reachable directly ✅
$ /home/lab/.opencode/bin/opencode run "Reply with exactly: OPENCODE-DIRECT-OK"
opencode v2.0.27
> build · deepseek-v4.1-flash-free
OPENCODE-DIRECT-OK exit=0
opencode is not on PATH (command -v opencode → nothing); only the absolute
path works, exactly as the skill records. A long-lived server is running:
opencode serve --service (pid 928162, up 6 days, listening 127.0.0.1:49374).
ARMS is not a daemon — /home/lab/.solos/core/arms/ contains only a README; it
is a library/CLI surface, so "connecting to ARMS" means invoking opencode, not
dialling a port. So yes: Echo can drive opencode directly.
6. Answers to Young's questions, in one place
| Question | Answer |
|---|---|
| Tam unreachable / Echo has trouble with Tam? | No — the link works (HTTP 200, 39 s). My earlier failure was my own wrong host (loopback instead of Pulse). Watch the latency. |
| Nova / Min / Mira reaching Tam + Pulse? | Min ✅, Nova ✅ (11 peers each). Mira ⛔ and Sol ⛔ — zero peers configured, cannot send A2A at all. |
| Nova + Echo → Heart unit directly? | Echo ✅ verified live (all 3 agents, real round-trips). Nova: same 11-peer config, so the path is configured — not independently probed from Nova's session. |
| Nova + Echo → opencode (ARMS) directly? | Echo ✅ verified live (v2.0.27, direct run, exit 0). ARMS is a CLI, not a port. Nova: not probed. |
Honest scope: I probed from LAB, as Echo. I cannot probe from Nova's or Mira's session; I verified their configuration, and for Mira that is enough to prove she cannot send. For Nova I confirmed the config exists but did not prove a successful send.
7. What I am NOT doing
- Not fixing the mira/sol config gap — that is the registry/projection lane (Min), and the generator is Sol's.
- Not changing the dialect behaviour of any plane — Sol/Min's call.
- Not editing the ground-rules file — still Sol's, still pending his fix.
- Not touching Tam's or Pulse's configuration — remote host, and it is not my lane.
Correction (2026-10-21, t_3d8f4875)
The earlier statement "the registry projection says 11 for every profile" conflated two different things and is withdrawn as a measurement:
projections.hermes_a2a_agents()returns the registry's peer set (11 agents), which is the same for every consumer by design — it is the expected set, not a measurement of what any profile actually holds.- The per-profile measurement is
drift_report(expected, actual), which compares that expected set against the profile's livea2a_agentsblock.
Re-measured per profile (2026-10-21, before fix):
| Profile | peers held | drift |
|---|---|---|
| min | 12 | 1 (tam-lab, intentional shim peer — Sol's lane to add to registry) |
| nova | 12 | 1 (tam-lab) |
| echo | 12 | 1 (tam-lab) |
| mira | 0 | 11 (no block at all) |
| sol | 0 | 11 (no block at all) |
After fix (mira + sol get the projected block + a2a toolset): both hold 12 peers, drift 1
(tam-lab only, matching min/nova/echo).
AC3 proof: live a2a_call from mira and sol (see completion metadata).
Honest limits
- I did not test every port on every plane; I tested the ones Young named.
- The Pulse dialect result is from one probe of
SendMessage; Pulse latency is variable, so I would re-run before treating it as final. - I cannot see the Pulse host, so Tam's
18304route may be real there. I report what LAB can reach, and say so. - The auto-reply finding is from my own profile's logs (151 sessions). I did not audit other agents' profiles, so I do not know whether their A2A sessions behave identically — I would expect so, but that is an inference.
- I did not re-probe after writing this; a sibling may fix any of these while I write. The board card carries the evidence hash.
A2A connectivity audit — all units
Young's ask 2026-10-20: "Tam is not on LAB. Echo has trouble connecting to Tam on Pulse via A2A. Can we rectify? Nova/Echo — can you connect to Heart and opencode ARMS?"
Two A2A isolation defects, and one refusal that looks like success
Owner: Echo (research & security lane). Measured on LAB, 2026-10-21 ~17:42–19:00 AEDT. Lane: plugins/platforms/a2a/ (vendored Hermes A2A plugin) — context isolation and terminal-state honesty, not the payload path.

