@mlms13 pointed out that sometimes you do IO-based updates in a reducer (UpdatedWithIO, etc.), but the IO can't fail (has an error type of Void.t). The framework is requiring you to return an IO.t(action, action) right now, and I did that mainly for convenience, but it probably makes sense to change the expected type to IO.t(action, Void.t) to indicate that you have handled the errors (by changing them to a successful action), and to also allow for IO actions that can't fail.
This would be a breaking change, and would require users to update their code everywhere, but the change should be very simple to make. I.e. using IO.handleError.