I'm guessing that somebody is keeping a running count rather than calculating the votes directly. So, this would happen if your running count missed a downvote, but didn't miss the person removing their downvote, and also didn't have rails to guard against the value going negative. That would also jive with the person saying it's not Voyager. Maybe you don't see it on the other platforms because they have client-side guard rails for this data.
Normally, this is why keeping a running count is a big no-no in programming, because it easily (often instantly) gets out-of-sync with the actual data. But for a big distributed system, it is an especially challenging problem, and it might simply not be worth it to get the exact right value, and a running count might be good enough.