fix(client): offer exactly the served aggregates in the CLI and UI

R08 2.3: AggregateType drops StandardDeviation (no backend serves it; always
BadAggregateNotSupported) and gains Range, Delta, MinimumActualTime,
MaximumActualTime, PercentGood and PercentBad. A parity test pins the enum to
AggregateFamilies.Served and each member to its same-named Part 13 ObjectId.
The CLI parses every enum name (plus aliases) and the UI picker lists them all.
Existing members keep their numeric values; 6 is retired.

Refs #747
Claude-Session: https://claude.ai/code/session_01Ub9hGmYLQvn9XETzw7CMsT
This commit is contained in:
Joseph Doherty
2026-10-22 16:24:18 -04:00
parent 57ae69a05e
commit a74a18e49a
9 changed files with 200 additions and 62 deletions
@@ -141,7 +141,16 @@ public class HistoryViewModelTests
public void AggregateTypes_ContainsNullForRaw()
{
_vm.AggregateTypes.ShouldContain((AggregateType?)null);
_vm.AggregateTypes.Count.ShouldBe(13); // null + 12 enum values
_vm.AggregateTypes.Count.ShouldBe(Enum.GetValues<AggregateType>().Length + 1); // null + every aggregate
}
/// <summary>The picker offers every client aggregate (the served set), including Range/Delta/PercentGood/...</summary>
[Fact]
public void AggregateTypes_offers_every_aggregate()
{
_vm.AggregateTypes.Where(a => a != null).Select(a => a!.Value)
.ShouldBe(Enum.GetValues<AggregateType>(), ignoreOrder: true);
_vm.AggregateTypes.ShouldContain(AggregateType.PercentGood);
}
/// <summary>Verifies that the Clear method resets the view model state.</summary>