{"auto_action": "when a model crosses retrain-recommended, a flag is written to [internal path] so the next weekly-retrain.sh services it early \u2014 it does NOT auto-retrain immediately", "baseline_sidecar": "[internal path]", "build_scripts": ["scripts/build-concept-drift-baseline.py", "scripts/detect-concept-drift.py"], "current_overall_verdict": "retrain-recommended", "description": "Distribution-shift monitor for the two production models. Daily, recomputes each model's monitored features on the last 7 days of live data and runs Population Stability Index (PSI) + a two-sample Kolmogorov-Smirnov test per feature against the frozen training distribution. Also tracks LABEL drift: the target positive-rate over the trailing 30 days vs the training baseline.", "drift_score": {"definition": "0.6 * (mean monitored PSI, scaled) + 0.4 * (label drift, scaled); floored at retrain-recommended when label drift is 'major'", "verdict_thresholds": {"drifted": 0.4, "retrain_recommended": 0.6, "watch": 0.2}}, "endpoint": "/v1/atlas/concept-drift", "honest_caveats": ["PSI bin count (10) and thresholds (0.2 watch->drift, 0.25 major) are industry convention, not derived from Voidly's data.", "Classifier contagion features (neighbor_*) are NOT monitored \u2014 they need the offline adjacency + regime-correlation pipeline.", "Calendar features (month, week_of_year, day_of_week, is_weekend, is_friday) are reported but EXCLUDED from the composite drift_score \u2014 PSI on a calendar feature over a 7-day window is structurally guaranteed to be huge and says nothing about model health.", "The forecast baseline EXCLUDES the most-recent 30 days so label drift is baseline-vs-recent, not recent-vs-itself.", "Drift is not the same as a broken model: a genuine real-world censorship surge IS distribution shift but the model may still be correct.", "KS here compares the live window against a sample reconstructed from stored training quantiles \u2014 PSI (full decile bins) is the primary signal, KS is a cross-check.", "KS on a 7-day window is noisy; lean on the composite drift_score, not single-feature KS spikes."], "label_drift": {"definition": "absolute shift in target positive-rate over the trailing 30 days vs the training baseline", "note": "this is the signal that would have flagged the IODA-disruption-label flood (April positive rate 79%)", "thresholds": {"drifted": 0.2, "major": 0.35, "watch": 0.1}}, "last_run": "2026-10-04T05:20:16.307987+00:00", "models": ["classifier-v3.3", "forecast-v1"], "per_model_endpoint": "/v1/atlas/concept-drift/{model}", "psi": {"definition": "sum((live% - train%) * ln(live% / train%)) over 10 decile bins frozen from the training distribution", "note": "0.2 / 0.25 are industry convention, not derived from Voidly's data", "thresholds": {"drifted": 0.2, "major": 0.25, "watch": 0.1}}, "refresh": "daily at 05:20 UTC via cron", "sidecar_last_modified": "2026-10-04T05:20:16Z", "sidecar_size_bytes": 23659, "state_sidecar": "[internal path]"}