I don't see the relevance of booleans being valid error values. The
point is that __close gets nil if and only if there were no errors. So,
there is a bulletproof (and simple) way to know whether there was an
error, with minimal changes from how it is now. This is what is needed,
isn't it?
I see, so it's trading "can't distinguish between no error and nil error" with a more obscure "can't distinguish between nil error and false error". I agree it's better, and the latter case is mostly irrelevant.
However, __close, and anything propagating the error from __close, should still document this value transform detail. Whether that is worth avoiding a third, backwards-compatible arg is up to you.