I think the definition of "temporary" is the issue here. Something like an underlying EAGAN is "temporary" - retrying the same operation that failed on the same socket again can succeed. A read error from a closed TCP connection is not temporary - reading again
cannot possibly unclose the connection and suddenly succeed.
However, it not being a temporary error doesn’t mean that larger scale operation can never succeed - retrying by making another request can work.
In other words, for your HTTP purposes I don’t think the (*OpError).Temporary() is a valuable indicator. You’re probably better off considering known fatal HTTP errors as non-temporary (a 404 probably indicates the request won’t succeed in 500
ms either, unless you know otherwise) and other errors as transient and subject to a retry.