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.

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.

Coming next

Currently-firing list, freeze timeline, per-asset rate, per-reason breakdown, and the calendar heatmap of daily counts all plumb in once the /v1/anomalies endpoint ships (Phase 5). The underlying mirror is already running on r1 — see the freeze-event sink listed in the research index.