I don't think that scenario would happen...

We handle updating `RDY` state on the incoming message side, not the "finish" message side.  We send ready a `RDY` update whenever we're at 25% (or 0).  So if you got all 100 of your messages and managed to respond to 50 (like in the scenario you described) you also would have already sent a `RDY` update to the server which would then deliver to you 50 more messages (because you responded to 50).

I'm thinking that perhaps this is actually a documentation problem... one shouldn't write an async reader that relies on `IsStarved()` *alone*, it should also bound the waiting period by time.  `IsStarved()` is only designed to help with the problem of worst case scenarios of `max_in_flight` distribution.