From c1f8840235fc4663936a757319ec0ec8702d0ee9 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 16 May 2026 13:30:39 +0300 Subject: [PATCH] Advertise VPN flow pressure capability --- agents/rap-node-agent/cmd/rap-node-agent/main.go | 1 + agents/rap-node-agent/cmd/rap-node-agent/main_test.go | 3 +++ docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md | 2 ++ 3 files changed, 6 insertions(+) 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 8f7d0c7..b033f82 100644 --- a/agents/rap-node-agent/cmd/rap-node-agent/main.go +++ b/agents/rap-node-agent/cmd/rap-node-agent/main.go @@ -3273,6 +3273,7 @@ func heartbeatPayload(cfg config.Config, identity state.Identity, meshState *syn payload.Capabilities["vpn_fabric_session_transport"] = true payload.Capabilities["vpn_packet_batch_binary_frames"] = true payload.Capabilities["vpn_fabric_session_stream_shards"] = true + payload.Capabilities["vpn_fabric_flow_pressure"] = true if meshState != nil && meshState.VPNFabricEndpointObservations != nil { payload.Metadata["vpn_fabric_endpoint_health_report"] = meshState.VPNFabricEndpointObservations.Report(observedAt, maxVPNFabricEndpointHealthReportEntries) } else { 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 6845d21..d478019 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 @@ -781,6 +781,9 @@ func TestHeartbeatPayloadIncludesMeshEndpointReport(t *testing.T) { if payload.Capabilities["vpn_fabric_session_stream_shards"] != true { t.Fatalf("vpn fabric stream shard capability missing: %+v", payload.Capabilities) } + if payload.Capabilities["vpn_fabric_flow_pressure"] != true { + t.Fatalf("vpn fabric flow pressure capability missing: %+v", payload.Capabilities) + } if payload.Capabilities["vpn_fabric_endpoint_health_feedback"] != true { t.Fatalf("vpn fabric endpoint health capability missing: %+v", payload.Capabilities) } diff --git a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md index 02f0358..49707ba 100644 --- a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md +++ b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md @@ -472,6 +472,8 @@ reasons. Heartbeat VPN fabric transport reports now include a compact `flow_pressure` summary with level, score, reasons, bulk pressure, route recovery timing, reason counts, and recommended per-class windows. +Nodes advertise the `vpn_fabric_flow_pressure` capability when that heartbeat +summary is available. Endpoint ranking treats `capacity_limited` observations as a soft pressure penalty instead of a hard recent failure, enabling load spreading without marking the carrier unhealthy.