SaturationReport
The planner's answer to "why is this still hot?".
Nebula · Packages/com.1by3.nebula/Runtime/Orchestrator/AssignmentReport.cspublic struct SaturationReportThe planner's answer to "why is this still hot?". Emitted when the busiest worker's load cannot be reduced by moving anything it holds, and read by WorkerScaler (which names it in ScaleDecision.Reason), by the dashboard, and by admission reporting, which groups the rows by ScopeKey. A report is a statement, never an action: Nebula does not split a container, and never breaks a group or a hold to relieve a worker (docs/cohesion-rebalancing.md, D5).
Fields
ContainerId
public string ContainerId;The heaviest container of the item that cannot move: what the operator should look at first.
ScopeKey
public string ScopeKey;The scope the container belongs to ("" for the public world), so the rows group per scope.
Containers
public string[] Containers;Every container of the item, including ContainerId.
WorkerId
public string WorkerId;The worker that is carrying it, or "" when the item has no owner.
Utilization
public float Utilization;What the whole item costs its worker, in tick budgets (1 = a whole worker).
Cause
public SaturationCause Cause;Which constraint stops the planner.
Reason
public string Reason;The cause as a sentence: "cohesion 7 spans c0, c3", "held for another 4.2 s", "no boundary hint".
Methods
ToString
public override string ToString();The short form the scaler appends to its blocked reason and the dashboard prints.
NameOf
public static string NameOf(SaturationCause cause);The cause as it goes into JSON.