diff --git a/agents/rap-node-agent/internal/vpnruntime/fabric_transport_test.go b/agents/rap-node-agent/internal/vpnruntime/fabric_transport_test.go index 478e824..89a661f 100644 --- a/agents/rap-node-agent/internal/vpnruntime/fabric_transport_test.go +++ b/agents/rap-node-agent/internal/vpnruntime/fabric_transport_test.go @@ -797,6 +797,16 @@ func TestFabricFlowSchedulerDropsWhenChannelQueueIsFull(t *testing.T) { } } +func TestFabricFlowSchedulerSnapshotReportsNominalAction(t *testing.T) { + snapshot := NewFabricFlowScheduler(8, 8).Snapshot() + if snapshot.PressureLevel != "nominal" || + snapshot.PressureScore != 0 || + len(snapshot.PressureReasons) != 0 || + snapshot.RecommendedAction != "observe" { + t.Fatalf("nominal pressure snapshot = %+v", snapshot) + } +} + func TestFabricFlowSchedulerRoundsSubMillisecondSendDuration(t *testing.T) { scheduler := NewFabricFlowScheduler(8, 8) channelID := "flow-01" diff --git a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md index 1df6413..a21cbba 100644 --- a/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md +++ b/docs/architecture/DISTRIBUTED_FABRIC_NODE_PROTOCOL_PLAN.md @@ -478,6 +478,7 @@ The `flow_pressure` summary includes a `recommended_action` such as `recommended_action` is now part of the shared `FabricFlowSchedulerSnapshot` contract, so heartbeat reports and smoke diagnostics consume the same runtime decision. +The scheduler's nominal snapshot explicitly reports the `observe` action. `mesh-live-smoke` reports the recommended action for its mixed bulk/interactive load scenario. Nodes advertise the `vpn_fabric_flow_pressure` capability when that heartbeat