A structural reason the platform won’t merge a review, read from its API
rather than its error text - so a wording change can’t silently reclassify
a real failure. None means nothing structural blocks the merge, or the
platform did not say (the caller falls back to matching the error text).
Detect the provider and build its review client together - the pair nearly
every provider-backed command opens with. The returned DetectedProvider
still carries the kind and detection source for messages.
The branch’s review only when it actually heads that branch. A provider can
return a review for a different head (a stale or look-alike match); a flow
acting on “this branch’s review” wants None there, not someone else’s.