# `Relyra.Metadata.Backoff`
[🔗](https://github.com/szTheory/relyra/blob/v1.1.0/lib/relyra/metadata/backoff.ex#L1)

Pure exponential-backoff schedule for Phase 21 auto-suspend per D-25.

Tiers: 1h → 6h → 24h cap. After 5 consecutive transient failures
(the suspend threshold), the tier index advances by one each subsequent
consecutive failure, capped at the 24h tier. ±10% jitter per AWS
Builder's Library "Timeouts, retries and backoff with jitter" (D-25).

Pure: no I/O, no Ecto. Deterministic-with-jitter (`Enum.random/1` is the
only nondeterminism source).

# `backoff_until`

```elixir
@spec backoff_until(non_neg_integer(), DateTime.t()) :: DateTime.t()
```

Returns the absolute DateTime at which the source becomes eligible for a
half-open probe (D-25 soft-backoff semantics — scheduler skips the source
until this passes, then runs ONE probe). ±10% jitter (D-25).

# `suspend_threshold`

```elixir
@spec suspend_threshold() :: pos_integer()
```

# `tier_seconds`

```elixir
@spec tier_seconds(non_neg_integer()) :: pos_integer()
```

---

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