{"data_end_date":"2026-05-20","feature_importance":[{"feature":"horizon_days","importance":0.12919840216636658},{"feature":"month_sin","importance":0.11068723350763321},{"feature":"global_30d_events","importance":0.10472018271684647},{"feature":"month_cos","importance":0.09765468537807465},{"feature":"follower_base_rate","importance":0.09538375586271286},{"feature":"follower_90d_events","importance":0.09220441430807114},{"feature":"follower_enc","importance":0.08680064231157303},{"feature":"days_since_follower_last","importance":0.07990104705095291},{"feature":"follower_30d_events","importance":0.06445127725601196},{"feature":"same_auth_cluster","importance":0.035676512867212296},{"feature":"pair_coevents_365d","importance":0.03256774693727493},{"feature":"trigger_enc","importance":0.027370326220989227},{"feature":"trigger_30d_events","importance":0.027290312573313713},{"feature":"same_region","importance":0.016093412414193153}],"honest_caveats":["Pairwise temporal classifier; primary horizon=7d.","Trained on 17622 rows, tested on 9306 rows in last 45d window.","Each row is a (trigger_event, follower_country, horizon) tuple — same trigger appears N-follower times per horizon, so AUC is not strictly per-event but per-pair.","did_follow=1 includes ANY censorship/mixed event in the follower country within H days, which may be coincidental rather than causal contagion. Model can only learn that the joint distribution shifts after the trigger, not establish causality.","Top-chains are TEST-SET averages — they reflect what the model PREDICTS, not what necessarily WILL happen. Use as a forecast prior, not a ground truth.","Sparse positive class (~18% at 7d horizon) means precision @ high-confidence cutoffs is noisy — recommend using the score as a relative ranking, not an absolute probability."],"horizons_days":[3,7,14],"input_features_parquet":"/opt/voidly-ai/ml-deploy/contagion_chain_features.parquet","model":"pairwise-xgboost","n_candidate_countries":34,"n_follower_countries":34,"n_rows_total":26928,"n_significant_pairs_predicted_p_gt_0_30":92,"n_test":9306,"n_train":17622,"n_trigger_countries":34,"overall_test_ap":0.5134118545225828,"overall_test_auc":0.6983610717603259,"overall_test_brier":0.1847886341975772,"passed_promote_gates":true,"per_horizon_test_metrics":{"3":{"ap":0.34975608080084875,"auc":0.6457041379459076,"brier":0.1413486352273149,"n_test":3102,"pos_rate":0.16795615731785946},"7":{"ap":0.4928577559110649,"auc":0.6696949571962517,"brier":0.18587975807485208,"n_test":3102,"pos_rate":0.25435203094777564},"14":{"ap":0.5972444851313632,"auc":0.691951249794626,"brier":0.22713750929056467,"n_test":3102,"pos_rate":0.3346228239845261}},"primary_horizon_auc":0.6696949571962517,"primary_horizon_days":7,"promote_gate_thresholds":{"min_primary_auc":0.65,"min_significant_pairs":10},"top_chains_h7":[{"follow_rate_actual":1,"follower":"JO","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.9904783368110657,"trigger":"OM"},{"follow_rate_actual":1,"follower":"PK","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.9440260529518127,"trigger":"OM"},{"follow_rate_actual":0.6666666666666666,"follower":"JO","n_actual_follows":2,"n_examples":3,"p_follow_7d":0.9358898997306824,"trigger":"MA"},{"follow_rate_actual":1,"follower":"AZ","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.9255924224853516,"trigger":"OM"},{"follow_rate_actual":0.6666666666666666,"follower":"UZ","n_actual_follows":2,"n_examples":3,"p_follow_7d":0.9216236472129822,"trigger":"MA"},{"follow_rate_actual":1,"follower":"AZ","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.9208723306655884,"trigger":"NI"},{"follow_rate_actual":1,"follower":"UZ","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.9109622240066528,"trigger":"OM"},{"follow_rate_actual":0.8,"follower":"AZ","n_actual_follows":4,"n_examples":5,"p_follow_7d":0.8904728889465332,"trigger":"EG"},{"follow_rate_actual":1,"follower":"AZ","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.8801878690719604,"trigger":"SY"},{"follow_rate_actual":0.5,"follower":"JO","n_actual_follows":1,"n_examples":2,"p_follow_7d":0.8599941730499268,"trigger":"IQ"},{"follow_rate_actual":0.3333333333333333,"follower":"AZ","n_actual_follows":1,"n_examples":3,"p_follow_7d":0.8599410057067871,"trigger":"MA"},{"follow_rate_actual":0,"follower":"TZ","n_actual_follows":0,"n_examples":3,"p_follow_7d":0.8422905802726746,"trigger":"MA"},{"follow_rate_actual":1,"follower":"AZ","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.8371471762657166,"trigger":"IQ"},{"follow_rate_actual":1,"follower":"AZ","n_actual_follows":3,"n_examples":3,"p_follow_7d":0.8365092277526855,"trigger":"BY"},{"follow_rate_actual":0.8888888888888888,"follower":"AZ","n_actual_follows":8,"n_examples":9,"p_follow_7d":0.8232867121696472,"trigger":"UZ"},{"follow_rate_actual":1,"follower":"PK","n_actual_follows":2,"n_examples":2,"p_follow_7d":0.8167673349380493,"trigger":"IQ"},{"follow_rate_actual":0.875,"follower":"AZ","n_actual_follows":7,"n_examples":8,"p_follow_7d":0.8074698448181152,"trigger":"JO"},{"follow_rate_actual":0.8,"follower":"PK","n_actual_follows":4,"n_examples":5,"p_follow_7d":0.7995268702507019,"trigger":"EG"},{"follow_rate_actual":0.9090909090909091,"follower":"JO","n_actual_follows":10,"n_examples":11,"p_follow_7d":0.7983417510986328,"trigger":"PK"},{"follow_rate_actual":0.6666666666666666,"follower":"EG","n_actual_follows":2,"n_examples":3,"p_follow_7d":0.7925581932067871,"trigger":"MA"}],"train_cutoff_date":"2026-04-05","trained_at":"2026-05-21T14:25:41.860469Z","version":"1.0","_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."}}