Frozen Data Feed
Last verified
Auto-generated. This article is rebuilt from
app/signals/config/alert_thresholds.jsonbyscripts/build_alerts_kb.py. Edit the alert config and re-run the script β do not edit this file directly.
Frozen Data Feed
Alert ID: FROZEN_FEED
Category: integrity
Cross-detection: no
A persisted daily metric has printed the SAME value for longer than its publish cadence allows (consecutive-identical-value run >= max(5, 2x cadence) TRADING days; cadence derived from the registryβs release_calendar β no hand-list). Fired per-metric by the capture-cycle integrity guard (app/signals/integrity_guard.py), NOT by the macro alert engine; suppressed when the metricβs vintage/as-of column shows the vendor is still publishing (a genuinely flat series is not a dead feed). This is the alarm that catches NFCI frozen at -0.53 for 51 trading days β a genuine value-freeze far past its weekly bar. A MONTHLY series like ebp/gz_spread instead legitimately holds one value for a full ~33-trading-day publication interval (just under this bar), so its staleness is owned by the sibling STALE_INPUT alarm via the ebp_obs_date binding + 80-day budget (#15), NOT this value-repeat detector. Frozen-but-present values are invisible to NULL checks, and every downstream lens, grading pass, and analogue match silently consumes the stale copy.
Severity
WARNING β conditions deteriorating; worth monitoring
Trigger condition
{
"type": "computed",
"computation": "integrity_frozen_feed"
}
Computed condition (integrity_frozen_feed) β the trigger logic lives in app/signals/alerts.py:_eval_computed. This alert does not decompose into a simple field threshold; consult the source for the exact semantics.
Message template
Data integrity: {metric} has printed the same value ({value}) for {run_trading_days} consecutive trading days β publish cadence is {publishes} (~{cadence_trading_days} trading day(s); freeze bar {threshold}). The feed may be frozen: downstream lenses, grading, and analogues are consuming a stale copy.
Rendered with the current signals dict via Python str.format. Placeholders that fail to resolve fall back to the raw template (see _format_message in app/signals/alerts.py).
Cooldown / dedup
- Cooldown: 1440 minutes (~24.0 h) between fires. After the alert resolves, re-firing is suppressed until the cooldown window has passed.
- Dedup: at most one
active(oracknowledged) row peralert_idat a time. Re-firing while active updatesfired_atand the message but keeps the originalfirst_fired_at.
Notifies
- Active alert feed (
/api/v1/alerts/active,/alerts/summary). - SSE stream (
/api/v1/agents/stream) for real-time consumers. alert_firedwebhook on first fire.alert_resolvedwebhook when the condition clears (non-cross-detection alerts only).
See also
- No simple field references β see
app/signals/alerts.py:_eval_computedfor the computed-condition logic. - Alert reference
- Live alerts feed