{"auto_action":"when a model crosses retrain-recommended, a flag is written to /opt/voidly-ai/data/retrain-queue.json so the next weekly-retrain.sh services it early — it does NOT auto-retrain immediately","baseline_sidecar":"/opt/voidly-ai/ml-deploy/concept_drift_baseline.json","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 — 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 — 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 — 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-05-22T05:20:02.375473+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-05-22T05:20:02Z","sidecar_size_bytes":23561,"state_sidecar":"/opt/voidly-ai/ml-deploy/concept_drift_state.json","_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."}}