Files
lmxopcua/scripts/validation/opcua-aggregate-baseline

Original SDK aggregate oracle

This standalone .NET 10 process generates aggregate expectations from the published OPCFoundation.NetStandard.Opc.Ua.Server 1.5.378.182 package. Its local build and package properties isolate it from the application's SDK 2 graph. It is outside the solution; never add its baseline SDK assemblies to a candidate test or production process. Expectations must come from this original SDK, never from the compatibility calculators.

Run from the repository root with a fresh output path:

dotnet run --project scripts/validation/opcua-aggregate-baseline/Baseline.csproj \
  -c Release -- /tmp/opcua-original-aggregates-new.json

An existing output path is refused. The JSON records the original aggregate assembly's SHA-256, epoch and processing interval. The expected assembly hash is d8d9706dea577858325730cd89896826ed82f7bfcf9503ccd0260311663a69f4. Output uses compact metadata and data, followed by one vector per line for reviewable diffs.

The first 4,144 vectors retain the original seven datasets and complete grid over 37 aggregate IDs, forward/reverse reads, stepped/sloped interpolation, uncertain-as-bad and incremental/final processing. Their parsed objects and the seven original input datasets are unchanged. The request window is epoch +0 through +70 seconds, reversed for reverse vectors, with a 20,000 ms processing interval.

The next 2,000 focused vectors avoid expanding every dataset into the complete grid:

Cases Coverage
1,628 Eleven numeric datasets across all 37 IDs, both directions and both processing modes: all eight integer widths, Single, Double and mixed-type conversion. Includes narrow limits, Int64/UInt64 values around 2^53 and 2^63 and their full ranges, fractional interpolation, signed zero, nonfinite values and overflow.
148 Duplicate timestamp ties across all 37 IDs, both directions and processing modes; nonzero source/server picoseconds, independent server timestamp offsets and an exact source timestamp/picosecond tie.
224 Interpolative, TimeAverage/2, Total/2 and PercentGood/Bad over uncertain and sparse data, both directions and processing modes. Four explicit profiles cover PercentDataBad/Good 0/0, 1/99, 50/50 and 100/0, both uncertainty policies and sloped extrapolation.

New vectors use sloped interpolation (Stepped=false); their Configuration object records all five effective aggregate settings. UseServerCapabilitiesDefaults=false records the resolved configuration passed directly to the calculator. Existing vectors retain their original fields: omitted configuration means the vector's uncertainty policy, 100/100 thresholds, and both extrapolation and server-capability defaults disabled.

New samples may carry SourcePicoseconds, ServerPicoseconds and ServerOffsetTicks; absent fields mean zero. The server timestamp is epoch + Seconds + ServerOffsetTicks. Samples are sorted stably by Seconds, then the whole sequence is reversed for a reverse read, preserving a fully specified tie order. QueueAccepted records each attempted queue result through the point of any exception.

Each output retains its CLR type, round-trip value spelling, complete numeric status, source/server timestamp ticks, source/server picoseconds, and whether it came from an incremental (PartialRequested=false) or final (true) drain. Exception retains the exact original exception type and any outputs already emitted. NaN, infinities and signed zero are stored as strings so JSON does not change their numeric representation.

When importing fresh evidence into the candidate fixture, first compare the original 4,144 parsed vectors, seven datasets and metadata with the previous oracle. Investigate candidate mismatches; do not regenerate expectations from candidate output or adjust original exception types to make the comparison pass.