The point about the per-attempt timeout not being the total deadline is easy to miss. With two SDK retries and a 20s timeout you can quietly end up waiting a minute or more. One thing that helped me was passing an AbortSignal.timeout() for the whole operation and also logging the attempt number, so slow requests were obvious in traces. Do you cap the total time separately from maxRetries in your own clients?