Whether a failure that surfaced without a retry did so because of the
retry-budget count gate: the failure was retryable (the per-class matrix
in getRetryDelay would have returned a delay), but the window's
retry spend was already used up.
This is the precise condition behind the budgetExhausted fact on the
terminal onError report: computeNextRetryDelay returns null for four
disjoint reasons (a failed probe, a disabled policy, the budget gate, and
a non-retryable error class), and only the budget gate should carry the
flag. A never-retryable failure (a validation error, an auth error, a
status-less GraphQL envelope) that happens to land while the shared
budget is spent must not be miscounted as chronic budget exhaustion.
Whether a failure that surfaced without a retry did so because of the retry-budget count gate: the failure was retryable (the per-class matrix in getRetryDelay would have returned a delay), but the window's retry spend was already used up.
This is the precise condition behind the
budgetExhaustedfact on the terminalonErrorreport:computeNextRetryDelayreturnsnullfor four disjoint reasons (a failed probe, a disabled policy, the budget gate, and a non-retryable error class), and only the budget gate should carry the flag. A never-retryable failure (a validation error, an auth error, a status-less GraphQL envelope) that happens to land while the shared budget is spent must not be miscounted as chronic budget exhaustion.