diff --git a/agents/rap-node-agent/cmd/rap-node-agent/main.go b/agents/rap-node-agent/cmd/rap-node-agent/main.go index eaf57df..ba87bb8 100644 --- a/agents/rap-node-agent/cmd/rap-node-agent/main.go +++ b/agents/rap-node-agent/cmd/rap-node-agent/main.go @@ -2980,6 +2980,7 @@ func heartbeatPayload(cfg config.Config, identity state.Identity, meshState *syn payload.Metadata["mesh_peer_recovery_report"] = meshPeerRecoveryReport(meshState, observedAt) payload.Metadata["mesh_peer_connection_intent_report"] = meshPeerConnectionIntentReport(meshState, observedAt) payload.Metadata["mesh_peer_connection_manager_report"] = meshPeerConnectionManagerReport(meshState, observedAt) + payload.Capabilities["mesh_peer_cache_endpoint_health_ranking"] = true payload.Metadata["mesh_rendezvous_lease_report"] = meshRendezvousLeaseReport(meshState, identity, observedAt) payload.Metadata["mesh_route_path_decision_report"] = meshRoutePathDecisionReport(meshState, identity, observedAt) payload.Metadata["mesh_route_generation_report"] = meshRouteGenerationReport(meshState, identity, observedAt) diff --git a/agents/rap-node-agent/cmd/rap-node-agent/main_test.go b/agents/rap-node-agent/cmd/rap-node-agent/main_test.go index 0fcadca..7253b9e 100644 --- a/agents/rap-node-agent/cmd/rap-node-agent/main_test.go +++ b/agents/rap-node-agent/cmd/rap-node-agent/main_test.go @@ -1302,6 +1302,9 @@ func TestHeartbeatPayloadIncludesPeerRecoveryReportWithoutAdvertisedEndpoint(t * if payload.Capabilities["mesh_peer_connection_intent_planning"] != true { t.Fatalf("connection intent capability missing: %+v", payload.Capabilities) } + if payload.Capabilities["mesh_peer_cache_endpoint_health_ranking"] != true { + t.Fatalf("peer cache endpoint health capability missing: %+v", payload.Capabilities) + } if _, ok := payload.Metadata["mesh_endpoint_report"]; ok { t.Fatalf("endpoint report should not be emitted without advertised endpoint: %+v", payload.Metadata) } diff --git a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md index 3fc4115..ad27c2d 100644 --- a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md +++ b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md @@ -353,6 +353,9 @@ degraded-path feedback as VPN fabric-session dialing. Peer cache snapshots expose best-candidate score reasons, giving diagnostics a direct explanation for why a QUIC, WebSocket, relay, or fallback endpoint was chosen. +Heartbeat capabilities now advertise that peer-cache endpoint ranking consumes +health observations, allowing control plane and UI diagnostics to detect nodes +running the health-aware peer selection path. Deliverables: