# M2 temporal weighting: training and validation

Newer completed games receive more training weight: w = 2^(-age in days at fitting / half-life). Compare 90, 180 and 365 days with no decay. Select in July–August 2025, calibrate in September–December, and use 2026 only for retrospective diagnostics. Test results never select the half-life.

Keep each original model's selected regularization strength fixed to isolate temporal weighting. The final fitting reference date is 2025-09-01. Changing a query date does not retrain the model; updating the reference date requires temporal validation of a new version.

Raw game counts, total training weight (recent-game-equivalent weight) and Kish effective sample size are returned separately. Weighted values are not additional games. Matchup residuals shrink by total training weight. Contracts for unknown formats, complete duo matchups, available pools, temporal isolation and zero ranked weight remain intact.

## Default lane models

|Unit / minute|Selected model|Half-life (days)|Raw fitting games|Total training weight|Effective sample size|
|---|---|---|---:|---:|---:|
|top/10|champions|365|9118|2604.0|4987.4|
|top/15|champions|365|9118|2604.0|4987.4|
|mid/10|hierarchical|No-decay fallback|9118|9118.0|9118.0|
|mid/15|champions|365|9118|2604.0|4987.4|
|bot_duo/10|champions|365|9118|2604.0|4987.4|
|bot_duo/15|context|No-decay fallback|9118|9118.0|9118.0|

## Comparison with previous defaults

Positive values indicate lower test RMSE. The 95% intervals use 2,000 paired draws of whole series or conservative event blocks. They describe fixed-model error differences, not counter-coefficient confidence intervals or guarantees for future events.

|Unit / minute|Metric|RMSE reduction|95% series interval|
|---|---|---:|---|
|top/10|cs_difference|-0.044|[-0.113, 0.024]|
|top/10|gold_difference|-3.170|[-5.528, -0.919]|
|top/10|xp_difference|0.125|[-1.415, 1.670]|
|top/15|cs_difference|0.038|[-0.058, 0.136]|
|top/15|gold_difference|-3.851|[-8.751, 0.659]|
|top/15|xp_difference|-0.403|[-2.895, 2.222]|
|mid/10|cs_difference|0.000|[0.000, 0.000]|
|mid/10|gold_difference|0.000|[0.000, 0.000]|
|mid/10|xp_difference|0.000|[0.000, 0.000]|
|mid/15|cs_difference|0.094|[0.027, 0.161]|
|mid/15|gold_difference|6.106|[3.323, 8.961]|
|mid/15|xp_difference|3.075|[0.643, 5.495]|
|bot_duo/10|bot_cs_difference|-0.089|[-0.200, 0.025]|
|bot_duo/10|duo_gold_difference|-11.498|[-14.521, -8.512]|
|bot_duo/10|duo_xp_difference|-5.060|[-6.779, -3.359]|
|bot_duo/15|bot_cs_difference|0.000|[0.000, 0.000]|
|bot_duo/15|duo_gold_difference|0.000|[0.000, 0.000]|
|bot_duo/15|duo_xp_difference|0.000|[0.000, 0.000]|

## Cross-role performance and co-selection

Selected global model: champions; half-life: no-decay fallback. Test log-loss reduction relative to the previous model is 0.000000. Unselected interactions remain disabled; single-champion results are not claimed as synergy benefits.

|Format|Co-selection half-life (days)|Relationship weight|Selection-window observations|
|---|---|---:|---|
|classic|No-decay fallback|0|False|
|full_fearless|90|0.5|True|

Classic has no observations in the new selection window. It retains the no-decay / zero-relationship-weight fallback, without guessing a half-life from test results.

## Usage and complete results

The unified query interface retains M2 pool and role contracts, adding temporal_weighting, decayed support and raw counts. The reference date is fixed; query dates do not retrain the model. M1/M3 predictions remain unchanged.

See validation.json for complete model/half-life selection errors and test results, and input_manifest.json for source hashes. No-decay candidates remain available; decay is not claimed to improve every metric.
