Ok, I found my bug. It was a good one--deeply buried in multiple layers upon layers of indirection and potential off-by-one errors (which it was).
Now time to take Mabel for a walk. Will return to tie up some loose ends and start a ton of code cleanup.