Screener Exits Digest
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.
Screener Exits Digest
Alert ID: SCREENER_EXITS_DIGEST
Category: screener
Cross-detection: no
Weekly rollup of every name that left the screener program (ripeness-trust Wave 3, W3-3): pick-contract exits (horizon elapsed / price or regime invalidation), candidacy decay (relabeled tier_drop when a conviction downgrade was the proximate driver), and S2 evictions. ONE portfolio-level fire per week (10080min cooldown, not per-ticker β the digest engineβs own days= window is the configured floor, screener_config.json screener_alerts.exits_digest_days, default 7), reusing GET /api/v1/screener/exitsβ compute_exits_digest verbatim (no new grading). Skips silently when nothing exited in the window (no spam on a quiet week). Not calibration-gated (accountability surface, not a trade-entry signal).
Severity
INFO β positive signal or notable event; no action needed
Trigger condition
{
"type": "computed",
"computation": "screener_exits_digest"
}
Computed condition (screener_exits_digest) β 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
Screener: {name_count} name(s) exited the program ({count} exit event(s)) in the trailing {days}d ({since_date} β {as_of_date}). Reasons: {reason_summary}. {never_ripened_count} never ripened, {unknown_count} unclassified.
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: 10080 minutes (~168.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