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 b033f82..d5aaea8 100644 --- a/agents/rap-node-agent/cmd/rap-node-agent/main.go +++ b/agents/rap-node-agent/cmd/rap-node-agent/main.go @@ -3265,6 +3265,9 @@ func heartbeatPayload(cfg config.Config, identity state.Identity, meshState *syn if meshState != nil && meshState.VPNFabricSessionDialStats != nil { report["dial_stats"] = meshState.VPNFabricSessionDialStats.Report(observedAt) } + report["flow_pressure"] = vpnFabricFlowPressureReport(vpnruntime.FabricFlowSchedulerSnapshot{ + PressureLevel: "nominal", + }) if meshState != nil && meshState.VPNFabricIngress != nil { ingressSnapshot := meshState.VPNFabricIngress.Snapshot(identity.ClusterID) report["flow_pressure"] = vpnFabricFlowPressureReport(ingressSnapshot.FlowScheduler) diff --git a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md index 49707ba..37e92e2 100644 --- a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md +++ b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md @@ -474,6 +474,8 @@ Heartbeat VPN fabric transport reports now include a compact recovery timing, reason counts, and recommended per-class windows. Nodes advertise the `vpn_fabric_flow_pressure` capability when that heartbeat summary is available. +When the VPN fabric ingress runtime has not been initialized yet, the heartbeat +still emits a nominal `flow_pressure` summary for schema stability. 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.