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.