Bug Report: Hub /inbound/pull returns sender_id_required after successful hello
Environment
- @evomap/evolver: v1.62.1 (also reproducible in v1.53.2)
- Node.js: v25.6.1
- OS: macOS 26.4 (arm64)
- Hub URL: https://evomap.ai
Bug Description
After the Proxy successfully registers with the Hub via POST /a2a/hello and receives a node_id, all subsequent calls to POST /a2a/inbound/pull fail with HTTP 400 and error sender_id_required.
Steps to Reproduce
- Start evolver with
EVOMAP_PROXY=1, A2A_HUB_URL=https://evomap.ai, valid A2A_NODE_ID and A2A_NODE_SECRET
- The Proxy calls
POST /a2a/hello — succeeds, returns node_id=node_0ca63ed0cfed
- The Proxy immediately calls
POST /a2a/inbound/pull — fails with 400 sender_id_required
Expected Behavior
The Hub should accept the inbound pull request, or provide a clear mechanism for the Proxy to include the correct sender_id.
Actual Behavior
[lifecycle] hello OK, node_id=node_0ca63ed0cfed
[sync] engine started
[Proxy] Started on http://127.0.0.1:19820
[inbound] pull failed: Hub returned 400: {"error":"sender_id_required","correction":{"problem":"This endpoint requires sender_id in the request body. sender_id is only optional on the first /a2a/hello call.","fix":"Include sender_id with the your_node_id value from your hello response. If you have not registered yet, send POST /a2a/hello first (sender_id is optional on first hello -- the Hub will assign your node_id).","doc":"/a2a/skill?topic=hello"}}
Analysis
The Proxy receives node_id from the hello response and uses it in subsequent requests. The Hub's error message says "Include sender_id with the your_node_id value from your hello response" — but the Proxy IS using the assigned node_id. This suggests either:
- The Hub expects
sender_id (not node_id) in the inbound pull request body
- The Hub's session/state for this node_id is invalid or expired
- The Proxy should re-register (send hello again with the existing node_id as
sender_id)
The same node_id (from the hello response) works fine when used directly by the heartbeat script (POST /a2a/heartbeat with {"node_id":"node_xxx"}), but fails for inbound pull.
Additional Context
- Heartbeat (
POST /a2a/heartbeat) works correctly with the same node credentials
- The Hub returns
service_degraded status in some heartbeat responses
- This happens on every evolver restart (reliable reproduction)
Questions for EvoMap Team
- Should
POST /a2a/inbound/pull use sender_id or node_id in the request body?
- Is there a session re-authentication step required between hello and inbound pull?
- Is the
service_degraded Hub status affecting node registration validity?
Bug Report: Hub
/inbound/pullreturnssender_id_requiredafter successful helloEnvironment
Bug Description
After the Proxy successfully registers with the Hub via
POST /a2a/helloand receives anode_id, all subsequent calls toPOST /a2a/inbound/pullfail with HTTP 400 and errorsender_id_required.Steps to Reproduce
EVOMAP_PROXY=1,A2A_HUB_URL=https://evomap.ai, validA2A_NODE_IDandA2A_NODE_SECRETPOST /a2a/hello— succeeds, returnsnode_id=node_0ca63ed0cfedPOST /a2a/inbound/pull— fails with 400sender_id_requiredExpected Behavior
The Hub should accept the inbound pull request, or provide a clear mechanism for the Proxy to include the correct
sender_id.Actual Behavior
Analysis
The Proxy receives
node_idfrom the hello response and uses it in subsequent requests. The Hub's error message says "Include sender_id with the your_node_id value from your hello response" — but the Proxy IS using the assigned node_id. This suggests either:sender_id(notnode_id) in the inbound pull request bodysender_id)The same
node_id(from the hello response) works fine when used directly by the heartbeat script (POST /a2a/heartbeatwith{"node_id":"node_xxx"}), but fails for inbound pull.Additional Context
POST /a2a/heartbeat) works correctly with the same node credentialsservice_degradedstatus in some heartbeat responsesQuestions for EvoMap Team
POST /a2a/inbound/pullusesender_idornode_idin the request body?service_degradedHub status affecting node registration validity?