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 463aace..2dde72a 100644 --- a/agents/rap-node-agent/cmd/rap-node-agent/main.go +++ b/agents/rap-node-agent/cmd/rap-node-agent/main.go @@ -2861,7 +2861,8 @@ func heartbeatPayload(cfg config.Config, identity state.Identity, meshState *syn report := map[string]any{ "schema_version": "rap.vpn_fabric_session_transport_report.v1", "enabled": true, - "transport": "fabric_session_websocket_binary_frames", + "transport": "fabric_session_binary_frames", + "carriers": []string{"quic", "websocket"}, "packet_payload": "rap.vpn_packet_batch.fabric.v1", "gated": true, "observed_at": observedAt.UTC().Format(time.RFC3339Nano), 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 5836ce7..3cdcaad 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 @@ -750,6 +750,7 @@ func TestHeartbeatPayloadIncludesMeshEndpointReport(t *testing.T) { } if report, ok := payload.Metadata["vpn_fabric_session_transport_report"].(map[string]any); !ok || report["packet_payload"] != "rap.vpn_packet_batch.fabric.v1" || + report["transport"] != "fabric_session_binary_frames" || report["peer_sessions"] == nil { t.Fatalf("vpn fabric session report missing: %+v", payload.Metadata) } diff --git a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md index 0e2f565..df54123 100644 --- a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md +++ b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md @@ -333,6 +333,9 @@ bonus. Endpoint health observations are now emitted as a bounded standalone heartbeat report (`rap.vpn_fabric_endpoint_health_report.v1`) so control plane can ingest candidate feedback without parsing the transport diagnostics blob. +VPN fabric-session transport telemetry is carrier-neutral +(`fabric_session_binary_frames`) and reports QUIC/WebSocket as available +carriers instead of describing the dataplane as WebSocket-only. Deliverables: