{"alert_status":"watch","alert_threshold":{"f1":0,"fp":3,"low_confidence":true,"max_tp_seen":0,"n_alerts_backtest":3,"n_incidents_in_window":2,"precision":0,"raised_from_global":false,"recall":0,"threshold":0.05,"tp":0},"country":"IR","generated_at":"2026-05-22T05:10:01.827919+00:00","honest_caveats":["Cutting the false-alarm rate TRADES recall. Each candidate's true_positive_rate_pct is reported next to its false_alarm_rate_pct — read them together.","Per-country thresholds are picked IN-SAMPLE on the same 90-day window they are scored on. The live forward false-alarm rate will be somewhat worse than this backtest; treat the backtest FP rate as an optimistic lower bound.","Thresholds are floored at the global 0.05 — the fix only ever RAISES an alert bar, never lowers one, so it can never fire MORE alerts than the baseline.","Countries with zero incidents in the window get recall=1 by convention when they also fire zero alerts; a country that fires alerts but had no incident is correctly scored as all-false-alarm.","The persistence gate fires one alert per sustained episode (on the day the run reaches PERSIST_DAYS length), not one per day — so it genuinely de-duplicates 1-day spikes rather than just delaying them.","Chronic-FP suppression downgrades a country to 'watch', it does not delete its forecast. The risk number is still published at /v1/sentinel/current_risk/{cc}; only the webhook alert is withheld.","DBSCAN / contagion multi-signal confirmation was considered but NOT backtested: those sidecars are point-in-time snapshots, not historical time series, so there is no honest 90-day backtest for them. They remain a candidate for a future fix once their history is retained."],"note":null,"schema":"voidly-sentinel-alert-quality/v1","suppressed":true,"suppression_detail":{"baseline_alerts":3,"baseline_precision":0,"baseline_true_positives":0,"country":"IR","rule":"chronic_fp"},"window":{"lookback_days":90,"since":"2026-02-21T05:10:01.827919+00:00","until":"2026-05-22T05:10:01.827919+00:00"},"winner_summary_for_context":{"alerts_analyzed":40,"candidate":"C3_suppress_chronic_fp","false_alarm_rate_pct":35,"fp_rate_after":35,"fp_rate_before":80.7,"tp_rate_after":60,"tp_rate_before":17.5,"true_positive_rate_pct":60},"_voidly_pay":{"claim_did":"https://voidly.ai/pay/claim","for_builders":"https://voidly.ai/pay/for-builders","marketplace":"https://api.voidly.ai/v1/pay/marketplace","live_demo":"https://huggingface.co/spaces/emperor-mew/voidly-pay","universal_proxy":{"url":"https://api.voidly.ai/v1/pay/proxy","example":"https://api.voidly.ai/v1/pay/proxy?u=<https-url>&to=did:voidly:<your-did>&price=0.01","page":"https://voidly.ai/pay/proxy","note":"Paywall any public HTTPS URL with one query param. No SDK install required."},"install":{"typescript":"npm install @voidly/pay","python":"pip install voidly-pay","langchain":"pip install voidly-pay-langchain","vercel_ai":"npm install @voidly/pay-vercel-ai","mcp":"npx @voidly/pay-mcp","cli":"npm install -g @voidly/pay-cli"},"note":"Voidly Pay is the open agent-to-agent payment rail. Claim a DID + 10 starter credits in 60s, or paywall any URL via the universal proxy with one query param."}}