# Exposure dedup

Repeat evaluations replay locally. Run boundaries do not.

Repeat `evaluate` calls for the same Flag and `targetingKey` within the revalidation window (`revalidateMs`, default 60 seconds) replay locally with `reason: "CACHED"` and fire no second Exposure. Rendering a component twice in one page load counts the subject once.

When a new experiment Run starts, the SDK detects the boundary within that window and fires a fresh Exposure. A Run is the unit analysis is computed over, so an Exposure suppressed across a Run boundary would attribute the subject to the wrong Run.

Errors are never cached. A failed resolution replayed from cache would turn one outage into a window of them with no new signal.

## Bounding the seen set

Dedup state is an in-memory seen set bounded by `maxSize` and a TTL. Both must be positive; a zero or negative bound would disable dedup without saying so, which is exactly the silent-default failure the SDK refuses.

Telemetry for a replayed local resolution is reported separately. If that report cannot be delivered you get [SDK_CACHED_TELEMETRY_FAILED](/docs/error/SDK_CACHED_TELEMETRY_FAILED). The value your code received is unaffected; it is surfaced so a telemetry gap never reads as an absence of traffic.

Source: https://splitch.dev/docs/sdk/exposure-dedup