$ diff_runs.py sdk2 sdk1
A=sdk2-d46044f5 sdk=2.0.1.0 cases=225 failures=0
B=sdk1-efb9197a sdk=1.5.378.0 cases=225 failures=0
compared 225 cases: identical=225 differing=0; rows compared=3855, events compared=8 (ServerTimestamp compared for presence only: it is the read time)

$ sql_raw_check.py sdk2-d46044f5
ZIPSEN.WTC1                    2026-11-10T11:30:00 sql_stored=80 (boundary rows dropped=1) wire=80 quality(Q,QD,OPC)={('0', '192', '192'): 78, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH
ZIPSEN.WTC1                    2026-11-11T14:00:00 sql_stored=300 (boundary rows dropped=1) wire=300 quality(Q,QD,OPC)={('0', '192', '192'): 300} -> MATCH
ZIPSEN.OvenPressureTransducer  2026-11-10T11:30:00 sql_stored=14 (boundary rows dropped=1) wire=14 quality(Q,QD,OPC)={('0', '192', '192'): 12, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH
ZIPSEN.OvenPressureTransducer  2026-11-11T14:00:00 sql_stored=35 (boundary rows dropped=1) wire=35 quality(Q,QD,OPC)={('0', '192', '192'): 35} -> MATCH
SysPerfCPUTotal                2026-11-10T11:30:00 sql_stored=51 (boundary rows dropped=0) wire=51 quality(Q,QD,OPC)={('0', '192', '192'): 50, ('0', '44', '192'): 1} -> MATCH
SysPerfCPUTotal                2026-11-11T14:00:00 sql_stored=120 (boundary rows dropped=0) wire=120 quality(Q,QD,OPC)={('0', '192', '192'): 120} -> MATCH
6 tag-windows compared, 0 mismatching

$ aggregate_recompute.py sdk2-d46044f5
336 non-empty interval values recomputed from raw, 0 mismatching

$ sql_raw_check.py sdk1-efb9197a
ZIPSEN.WTC1                    2026-11-10T11:30:00 sql_stored=80 (boundary rows dropped=1) wire=80 quality(Q,QD,OPC)={('0', '192', '192'): 78, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH
ZIPSEN.WTC1                    2026-11-11T14:00:00 sql_stored=300 (boundary rows dropped=1) wire=300 quality(Q,QD,OPC)={('0', '192', '192'): 300} -> MATCH
ZIPSEN.OvenPressureTransducer  2026-11-10T11:30:00 sql_stored=14 (boundary rows dropped=1) wire=14 quality(Q,QD,OPC)={('0', '192', '192'): 12, ('1', '24', '0'): 1, ('0', '248', '192'): 1} -> MATCH
ZIPSEN.OvenPressureTransducer  2026-11-11T14:00:00 sql_stored=35 (boundary rows dropped=1) wire=35 quality(Q,QD,OPC)={('0', '192', '192'): 35} -> MATCH
SysPerfCPUTotal                2026-11-10T11:30:00 sql_stored=51 (boundary rows dropped=0) wire=51 quality(Q,QD,OPC)={('0', '192', '192'): 50, ('0', '44', '192'): 1} -> MATCH
SysPerfCPUTotal                2026-11-11T14:00:00 sql_stored=120 (boundary rows dropped=0) wire=120 quality(Q,QD,OPC)={('0', '192', '192'): 120} -> MATCH
6 tag-windows compared, 0 mismatching

$ aggregate_recompute.py sdk1-efb9197a
336 non-empty interval values recomputed from raw, 0 mismatching

$ hgcli_raw_check.py sdk2
SysPerfCPUTotal  2026-11-10T11:30:00 histgw-cli=51 wire=51 compared=51 MATCH
SysPerfCPUTotal  2026-11-11T14:00:00 histgw-cli=120 wire=120 compared=120 MATCH
ZIPSEN.OvenPressureTransducer 2026-11-10T11:30:00 histgw-cli=11 wire=14 compared=11 MATCH (histgw-cli stopped at the stored NULL: its JSON writer cannot emit NaN)
ZIPSEN.OvenPressureTransducer 2026-11-11T14:00:00 histgw-cli=35 wire=35 compared=35 MATCH
ZIPSEN.WTC1      2026-11-10T11:30:00 histgw-cli=77 wire=80 compared=77 MATCH (histgw-cli stopped at the stored NULL: its JSON writer cannot emit NaN)
ZIPSEN.WTC1      2026-11-11T14:00:00 histgw-cli=300 wire=300 compared=300 MATCH
