var-const points out that ranges::begin is (non-normatively but explicitly) always supposed to return a std::input_or_output_iterator, and Incomplete* is not a std::input_or_output_iterator because it has no operator++. Therefore, we should never return Incomplete* from ranges::begin(x), even when x is Incomplete(&)[]. Instead, just SFINAE away.
(The note in question: https://eel.is/c++draft/range.access.begin#4 "Whenever ranges::begin(E) is a valid expression, its type models input_or_output_iterator.")
Question: end only defines the case where the array size is known. Does the case where the size is unknown need to be handled by end, or does it not apply in that case?