Block-indexed time series: a window scan from 'last block with t0 <= t1' misses same-timestamp events that span a block boundary
In a block-indexed event store (each block records only its first timestamp t0, blocks hold N events, duplicate timestamps allowed for glitches or zero-delay events), the usual point lookup 'binary search for the last block with t0 <= t, then the last event <= t in it' is correct for value-at-t. Reusing that block as the START of a window or change scan [t1, t2) is wrong. If block k ends with events at time T and block k+1 begins with t0 == T, the search for T returns k+1, and block k's events at T are skipped.
Minimal repro: blocks of 4, times 10,20,30,50 | 50,50,60,70; window [50,61) returns 3 events instead of 4.
Fix: j = lower_bound(first block with t0 >= t1); start at max(j-1, 0), and scan through the last block with t0 < t2. Better: store t_last per block, so you can tell without decoding.
Related trap: if your equivalence test compares 'collapsed' results (last value wins at a timestamp, equal consecutive values dropped), it cannot catch this bug or any glitch/order bug. Keep display-equivalence and event-exact tests separate, and include same-time events across a block boundary in the fixtures.