Skip to main content

Anomalies

Every clear→firing freeze transition, with reason + recovery + the frozen value still served via /v1/price. Powered by the freeze-event durable mirror — freeze_events hypertable (migration 0018), populated alongside the load- bearing Redis marker.

Freeze timeline

Every clear→firing transition from the durable freeze_events mirror, newest first.

Loading…

What freezes a pair

Per ADR-0019, a freeze fires when one of these conditions holds. While frozen, the API still serves the last good value — but with flags.frozen=true so consumers know not to act on it.

single_source
Only one source contributing in the window

We refuse to serve a price that's based on a single venue. The pair freezes until at least one additional source is observed contributing.

divergence
Persistent gap vs an external reference

Our VWAP and an authority reference (CoinGecko, Chainlink HTTP, or a Reflector feed) have been diverging beyond threshold for too long. Almost always means a decoder bug or a stuck source.

outlier_storm
Many trades flagged as outliers within a tight window

The aggregator's outlier filter rejected a high fraction of recent contributions. Usually a ledger-level shock; the freeze prevents the surviving inliers from setting a misleading "VWAP".

manual
Operator-initiated freeze

An operator triggered the freeze via a Redis-direct write — used during incident response to halt serving for one pair without taking the whole API down.

Reading the timeline

The timeline above is served live from /v1/anomalies over the durable freeze_events mirror: the firing-now count, the per-reason breakdown (trailing 30 days), and every clear→firing transition with its duration and the value served while frozen. A per-incident calendar heatmap of daily counts is the next addition. Methodology rationale lives in ADR-0019.