2cebb3cca1
push rejected ticks that went backwards across buckets but absorbed any tick whose timestamp fell inside the open bucket — including one older than the last tick already absorbed. Such a stale tick silently overwrote the bar's close with an outdated price. Track last_ts on OpenBar (set in from_tick, advanced in absorb) and, on the same-bucket path, reject a tick whose timestamp predates it with Error::Malformed, leaving the open bar untouched. Ticks that share a timestamp are still accepted, since several trades can land in the same millisecond.