# `ClaudeWrapper.Retry`
[🔗](https://github.com/genagent/claude_wrapper_ex/blob/main/lib/claude_wrapper/retry.ex#L1)

Retry policy with exponential backoff for query execution.

## Usage

    config = ClaudeWrapper.Config.new()
    query = ClaudeWrapper.Query.new("fix the bug")

    # Retry up to 3 times with exponential backoff
    {:ok, result} = ClaudeWrapper.Retry.execute(query, config,
      max_retries: 3,
      base_delay_ms: 1_000,
      max_delay_ms: 30_000
    )

    # With custom retry predicate
    {:ok, result} = ClaudeWrapper.Retry.execute(query, config,
      retry_on: fn
        {:error, %ClaudeWrapper.Error{kind: :command_failed, exit_code: 1}} -> true
        {:error, %ClaudeWrapper.Error{kind: :timeout}} -> true
        _ -> false
      end
    )

# `opts`

```elixir
@type opts() :: [
  max_retries: non_neg_integer(),
  base_delay_ms: pos_integer(),
  max_delay_ms: pos_integer(),
  multiplier: number(),
  jitter: boolean(),
  retry_on: (term() -&gt; boolean())
]
```

# `compute_delay`

```elixir
@spec compute_delay(
  non_neg_integer(),
  pos_integer(),
  pos_integer(),
  number(),
  boolean()
) ::
  non_neg_integer()
```

Compute the delay for a given attempt number.

# `execute`

```elixir
@spec execute(ClaudeWrapper.Query.t(), ClaudeWrapper.Config.t(), opts()) ::
  {:ok, ClaudeWrapper.Result.t()} | {:error, term()}
```

Execute a query with retry logic.

## Options

  * `:max_retries` - Maximum number of retry attempts (default: 3)
  * `:base_delay_ms` - Initial delay between retries in ms (default: 1000)
  * `:max_delay_ms` - Maximum delay cap in ms (default: 30000)
  * `:multiplier` - Backoff multiplier (default: 2)
  * `:jitter` - Add random jitter to delays (default: true)
  * `:retry_on` - Function that receives the error and returns whether to retry.
    The default retries `:timeout` errors, plain non-zero `:command_failed`
    exits, and rate limits (`:auth` errors with reason `:rate_limit`). Other
    auth failures and rail-stop errors (`:max_turns_exceeded`,
    `:max_budget_exceeded`) are not retried.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
