Well, there is indeed some kind of problem here, but before I continue I need to fess up and admit with embarrassment that I posted this in the wrong forum. This is an OOTP 8 (8.0.0.13) issue. We won't be converting to 9 for another month. Would it be possible to move this thread over to the OOTP 8 tech forum? This'll teach me to rush over here as I'm about to leave work...
Alright, I've had a chance to do some testing on my end. First, when I try to replicate the situation using my backup files everything seems to work as you would expect. The option year disappears, there's a record of the option year being voided and the extension gets added onto the (now-expiring) contract.
Second, it's definitely not a display issue. Using our current files I simmed forward up into the preseason and it's still showing the voided option year as the 2009 salary (the season we're heading into). The extensions are waiting in the wings to pick up in 2010.
I understand the reasoning of the owners here: they wanted to keep the players but not at the salaries they'd be on the hook for if the option years were picked up. So they voided those options and instead negotiated a new extension. Seems perfectly reasonable; we see that happen in MLB as well.
So now it comes down to do I trust them that they voided the options (since there's no record of it)? In this case I do. Part of that is due to the track record of the owners in question and another part is due to the fact that it's two separate owners reporting the same problem simultaneously. That'd be a pretty well-coordinated conspiracy to pull off for two relatively minor relievers.
So if you buy that they're being honest - and I do - then there's something wrong here. I can only assume it has something to do with this situation where an option is voided and an extension is immediately negotiated.