# M2: full-archive relationships and issue #15 acceptance

This reproducible module describes historical relationships, without promising causal counters, live updates or M4 draft decisions. Lane and cross-role models use the full archive, retaining unknown formats as missing context. Co-selection opportunities use only series with supported rules and complete drafts. Existing M1/M3 predictions remain unchanged.

## Archive coverage and missing data

Of 16,437 input games, 15,669 are admitted. Every game has an audit status; none are silently dropped. Upstream processing already excluded 25 explicitly identified blind-pick games.

|Status|Games|
|---|---:|
|incomplete_or_unverified_series_join|671|
|admitted|15669|
|reserved_evaluation_partition|84|
|duplicate_alias|13|

|Format context|Games|
|---|---:|
|unknown|12523|
|classic|209|
|full_fearless|2937|

All 39 DCGI games share one test event block. Individual series IDs were not guessed. This conservative grouping prevents a real series from crossing partitions; it does not claim that every series is verified or that the event has finished.

Unknown does not mean Classic. The standard Tournament Draft interpretation is scoped to LEC 2024, with unresolved year/revision details in the mirrored rulebook. The official professional champion restriction list has not been recovered publicly. Closing the issue does not remove this disclosed uncertainty.

|Partition|Games|Groups (series or conservative event blocks)|
|---|---:|---:|
|train|12114|6128|
|selection|618|243|
|calibration|401|142|
|test|2536|979|

Fit before July 2025, select in July–August, calibrate in September–December, and use 2026 for retrospective diagnostics. Series stay intact, and Elo is updated only after labels are complete. Declared raw-value conflicts are masked per target, never filled with zero. See coverage.json and input_manifest.json for sources, aliases, rules and missing data.

## Complete lane ablations (test)

|Unit / minute|Model|Selected|Target|Valid N|MAE|RMSE|Nominal 90% interval coverage|Low-support N|
|---|---|---|---|---:|---:|---:|---:|---:|
|top/10|context|No|cs_difference|2388|10.47|13.26|89.8%|873|
|top/10|context|No|gold_difference|2388|395.34|504.33|83.3%|873|
|top/10|context|No|xp_difference|2388|323.96|431.81|93.0%|873|
|top/10|champions|Yes|cs_difference|2388|9.80|12.42|90.5%|873|
|top/10|champions|Yes|gold_difference|2388|364.87|473.99|84.9%|873|
|top/10|champions|Yes|xp_difference|2388|316.05|425.10|92.0%|873|
|top/10|hierarchical|No|cs_difference|2388|9.81|12.43|90.4%|873|
|top/10|hierarchical|No|gold_difference|2388|365.99|474.69|85.6%|873|
|top/10|hierarchical|No|xp_difference|2388|317.52|425.99|91.9%|873|
|top/15|context|No|cs_difference|2371|15.06|18.78|88.3%|866|
|top/15|context|No|gold_difference|2099|698.89|891.39|83.1%|768|
|top/15|context|No|xp_difference|2276|664.23|856.21|84.2%|829|
|top/15|champions|Yes|cs_difference|2371|14.45|18.16|87.1%|866|
|top/15|champions|Yes|gold_difference|2099|662.69|851.25|84.0%|768|
|top/15|champions|Yes|xp_difference|2276|657.27|849.60|83.1%|829|
|top/15|hierarchical|No|cs_difference|2371|14.46|18.19|87.1%|866|
|top/15|hierarchical|No|gold_difference|2099|665.11|853.24|82.6%|768|
|top/15|hierarchical|No|xp_difference|2276|658.67|851.25|83.2%|829|
|mid/10|context|No|cs_difference|2388|9.00|11.36|85.2%|818|
|mid/10|context|No|gold_difference|2388|373.62|483.39|85.4%|818|
|mid/10|context|No|xp_difference|2388|330.19|417.44|84.7%|818|
|mid/10|champions|No|cs_difference|2388|8.38|10.61|82.1%|818|
|mid/10|champions|No|gold_difference|2388|365.79|471.62|86.1%|818|
|mid/10|champions|No|xp_difference|2388|327.88|413.50|83.5%|818|
|mid/10|hierarchical|Yes|cs_difference|2388|8.46|10.72|83.3%|818|
|mid/10|hierarchical|Yes|gold_difference|2388|367.21|475.75|85.3%|818|
|mid/10|hierarchical|Yes|xp_difference|2388|327.11|412.75|85.0%|818|
|mid/15|context|No|cs_difference|2369|12.77|16.12|87.9%|813|
|mid/15|context|No|gold_difference|2100|626.22|804.11|88.5%|728|
|mid/15|context|No|xp_difference|2265|559.33|712.61|89.6%|779|
|mid/15|champions|No|cs_difference|2369|11.98|15.15|88.1%|813|
|mid/15|champions|No|gold_difference|2100|615.65|789.26|88.4%|728|
|mid/15|champions|No|xp_difference|2265|553.40|705.67|89.7%|779|
|mid/15|hierarchical|Yes|cs_difference|2369|12.13|15.34|86.6%|813|
|mid/15|hierarchical|Yes|gold_difference|2100|619.37|794.75|88.3%|728|
|mid/15|hierarchical|Yes|xp_difference|2265|554.60|706.28|87.5%|779|
|bot_duo/10|context|No|bot_cs_difference|2388|10.02|12.87|86.6%|2334|
|bot_duo/10|context|No|duo_gold_difference|2388|585.13|763.97|83.1%|2334|
|bot_duo/10|context|No|duo_xp_difference|2388|415.44|534.49|88.3%|2334|
|bot_duo/10|champions|Yes|bot_cs_difference|2388|9.89|12.68|89.5%|2334|
|bot_duo/10|champions|Yes|duo_gold_difference|2388|576.04|754.04|83.1%|2334|
|bot_duo/10|champions|Yes|duo_xp_difference|2388|410.83|528.76|88.6%|2334|
|bot_duo/10|duo|No|bot_cs_difference|2388|9.88|12.67|88.9%|2334|
|bot_duo/10|duo|No|duo_gold_difference|2388|575.23|753.14|83.3%|2334|
|bot_duo/10|duo|No|duo_xp_difference|2388|410.83|528.78|88.6%|2334|
|bot_duo/10|hierarchical|No|bot_cs_difference|2388|9.90|12.69|88.6%|2334|
|bot_duo/10|hierarchical|No|duo_gold_difference|2388|575.13|753.11|83.3%|2334|
|bot_duo/10|hierarchical|No|duo_xp_difference|2388|410.99|528.86|88.6%|2334|
|bot_duo/15|context|Yes|bot_cs_difference|2383|14.36|18.45|84.8%|2329|
|bot_duo/15|context|Yes|duo_gold_difference|2007|1049.12|1359.64|84.5%|1960|
|bot_duo/15|context|Yes|duo_xp_difference|2272|709.00|899.08|88.7%|2220|
|bot_duo/15|champions|No|bot_cs_difference|2383|14.35|18.36|86.3%|2329|
|bot_duo/15|champions|No|duo_gold_difference|2007|1042.42|1349.20|83.7%|1960|
|bot_duo/15|champions|No|duo_xp_difference|2272|705.66|895.52|87.9%|2220|
|bot_duo/15|duo|No|bot_cs_difference|2383|14.35|18.37|86.1%|2329|
|bot_duo/15|duo|No|duo_gold_difference|2007|1041.31|1348.37|83.4%|1960|
|bot_duo/15|duo|No|duo_xp_difference|2272|705.47|895.40|87.7%|2220|
|bot_duo/15|hierarchical|No|bot_cs_difference|2383|14.37|18.41|85.9%|2329|
|bot_duo/15|hierarchical|No|duo_gold_difference|2007|1041.12|1348.28|83.4%|1960|
|bot_duo/15|hierarchical|No|duo_xp_difference|2272|705.35|895.40|87.7%|2220|

## Series-level error-difference intervals

Compare the fixed selected model with context: positive values indicate lower RMSE. Intervals use 2,000 paired bootstrap draws of whole series or conservative event blocks, not counter-coefficient confidence intervals. Missing labels are handled per target; test results do not reselect models.

|Unit / minute|Target|Valid N|Series|RMSE reduction|95% series interval|
|---|---|---:|---:|---:|---|
|top/10|cs_difference|2388|940|0.84|[0.62, 1.03]|
|top/10|gold_difference|2388|940|30.34|[23.86, 36.81]|
|top/10|xp_difference|2388|940|6.71|[2.91, 10.31]|
|top/15|cs_difference|2371|937|0.62|[0.34, 0.88]|
|top/15|gold_difference|2099|908|40.14|[28.74, 52.18]|
|top/15|xp_difference|2276|931|6.61|[0.93, 11.97]|
|mid/10|cs_difference|2388|940|0.64|[0.52, 0.75]|
|mid/10|gold_difference|2388|940|7.64|[4.29, 11.08]|
|mid/10|xp_difference|2388|940|4.69|[1.95, 7.38]|
|mid/15|cs_difference|2369|938|0.78|[0.65, 0.92]|
|mid/15|gold_difference|2100|907|9.36|[5.19, 13.73]|
|mid/15|xp_difference|2265|926|6.33|[2.73, 10.14]|
|bot_duo/10|bot_cs_difference|2388|940|0.20|[0.03, 0.37]|
|bot_duo/10|duo_gold_difference|2388|940|9.94|[6.02, 14.06]|
|bot_duo/10|duo_xp_difference|2388|940|5.73|[3.61, 7.98]|
|bot_duo/15|bot_cs_difference|2383|940|0.00|[0.00, 0.00]|
|bot_duo/15|duo_gold_difference|2007|897|0.00|[0.00, 0.00]|
|bot_duo/15|duo_xp_difference|2272|929|0.00|[0.00, 0.00]|

## Global relationship ablations

|Model|Selected|Test N|Log loss|Brier|
|---|---|---:|---:|---:|
|context|No|2536|0.6497|0.2285|
|champions|Yes|2536|0.6437|0.2260|
|same|No|2536|0.6443|0.2265|
|enemy|No|2536|0.6441|0.2263|
|full|No|2536|0.6483|0.2282|

|Interaction candidate|Log-loss reduction vs. single-champion baseline|95% series / event-block interval|
|---|---:|---|
|same|-0.000678|[-0.004063, 0.002837]|
|enemy|-0.000470|[-0.004469, 0.003661]|
|full|-0.004617|[-0.010421, 0.001451]|

The selected model is champions. Same-team and opposing-team interactions that fail selection are disabled or unknown in default queries. Raw win rates or co-occurrence are not presented as counters. Experimental queries can inspect supported regularized candidates.

## Opportunity models: separate formats

|Format|Weight|Selection opportunities|Test opportunities|Test top-5|Test log loss|
|---|---:|---:|---:|---:|---:|
|classic|0|0|0|No observations|No observations|
|full_fearless|0.5|5850|6540|17.1%|4.6760|

Classic masks only the current game; Full Fearless also masks champions picked by either team in earlier games. Missing complete history or unknown formats suppress opportunity scores. The client roster prevents future champions entering earlier patches; callers may supply a precise pool with provenance and timestamps. Unseen champions retain explicitly marked smoothed priors and zero support, without claiming measured synergy. Relative pool weights are not calibrated probabilities of a legal next pick.

## Sparse matchup candidates

The table shows the 60 most-supported entries; relationships.json contains all candidates. Four-champion order is explicit, with the first canonical group minus the second. Values are hierarchical residual components, not complete lane predictions. Candidates from unselected models are not enabled automatically.

|Unit / minute|Canonical matchup IDs (duo = bot, support)|Games|Series|Shrinkage weight|Support by format|Adjusted residual component|
|---|---|---:|---:|---:|---|---|
|top/10|58 vs. 897|261|226|0.723|{'unknown': 231, 'classic': 6, 'full_fearless': 24}|cs_difference=1.5, gold_difference=31.1, xp_difference=26.0|
|top/15|58 vs. 897|261|226|0.723|{'unknown': 231, 'classic': 6, 'full_fearless': 24}|cs_difference=1.7, gold_difference=55.9, xp_difference=26.6|
|top/10|58 vs. 150|248|230|0.713|{'unknown': 237, 'classic': 2, 'full_fearless': 9}|cs_difference=-0.1, gold_difference=-12.9, xp_difference=-1.3|
|top/15|58 vs. 150|248|230|0.713|{'unknown': 237, 'classic': 2, 'full_fearless': 9}|cs_difference=-0.5, gold_difference=-9.1, xp_difference=-6.9|
|mid/10|163 vs. 268|233|218|0.959|{'unknown': 131, 'classic': 15, 'full_fearless': 87}|cs_difference=-1.2, gold_difference=-16.0, xp_difference=-6.2|
|mid/15|163 vs. 268|233|218|0.823|{'unknown': 131, 'classic': 15, 'full_fearless': 87}|cs_difference=-0.6, gold_difference=4.5, xp_difference=2.7|
|top/10|24 vs. 897|196|184|0.662|{'unknown': 188, 'full_fearless': 8}|cs_difference=-1.2, gold_difference=-58.3, xp_difference=-24.6|
|top/15|24 vs. 897|196|184|0.662|{'unknown': 188, 'full_fearless': 8}|cs_difference=-1.7, gold_difference=-94.4, xp_difference=-58.2|
|top/10|150 vs. 897|167|158|0.625|{'unknown': 147, 'classic': 6, 'full_fearless': 14}|cs_difference=-0.2, gold_difference=0.7, xp_difference=-20.1|
|top/15|150 vs. 897|167|158|0.625|{'unknown': 147, 'classic': 6, 'full_fearless': 14}|cs_difference=0.1, gold_difference=-12.1, xp_difference=-12.4|
|top/10|58 vs. 516|163|156|0.620|{'unknown': 143, 'classic': 12, 'full_fearless': 8}|cs_difference=1.0, gold_difference=21.6, xp_difference=-9.3|
|top/15|58 vs. 516|163|156|0.620|{'unknown': 143, 'classic': 12, 'full_fearless': 8}|cs_difference=0.8, gold_difference=15.8, xp_difference=-21.8|
|mid/10|103 vs. 163|157|147|0.940|{'unknown': 90, 'classic': 7, 'full_fearless': 60}|cs_difference=0.9, gold_difference=111.1, xp_difference=47.9|
|mid/15|103 vs. 163|157|147|0.758|{'unknown': 90, 'classic': 7, 'full_fearless': 60}|cs_difference=1.0, gold_difference=82.2, xp_difference=4.5|
|mid/10|61 vs. 268|156|143|0.940|{'unknown': 147, 'classic': 2, 'full_fearless': 7}|cs_difference=-0.1, gold_difference=-10.7, xp_difference=-19.8|
|mid/15|61 vs. 268|156|143|0.757|{'unknown': 147, 'classic': 2, 'full_fearless': 7}|cs_difference=-0.2, gold_difference=-60.5, xp_difference=-58.2|
|top/10|41 vs. 150|151|143|0.602|{'unknown': 149, 'full_fearless': 2}|cs_difference=-0.3, gold_difference=-13.9, xp_difference=-29.8|
|top/15|41 vs. 150|151|143|0.602|{'unknown': 149, 'full_fearless': 2}|cs_difference=-0.9, gold_difference=-34.2, xp_difference=-58.1|
|top/10|24 vs. 58|147|139|0.595|{'unknown': 138, 'classic': 1, 'full_fearless': 8}|cs_difference=1.5, gold_difference=45.5, xp_difference=30.3|
|top/15|24 vs. 58|147|139|0.595|{'unknown': 138, 'classic': 1, 'full_fearless': 8}|cs_difference=2.2, gold_difference=105.7, xp_difference=43.0|
|mid/10|103 vs. 268|145|139|0.935|{'unknown': 103, 'classic': 4, 'full_fearless': 38}|cs_difference=-0.8, gold_difference=0.4, xp_difference=-26.2|
|mid/15|103 vs. 268|145|139|0.744|{'unknown': 103, 'classic': 4, 'full_fearless': 38}|cs_difference=-1.4, gold_difference=9.1, xp_difference=-38.6|
|top/10|58 vs. 79|136|133|0.576|{'unknown': 121, 'classic': 6, 'full_fearless': 9}|cs_difference=1.3, gold_difference=34.1, xp_difference=9.4|
|top/15|58 vs. 79|136|133|0.576|{'unknown': 121, 'classic': 6, 'full_fearless': 9}|cs_difference=2.2, gold_difference=91.4, xp_difference=18.4|
|mid/10|18 vs. 42|136|105|0.932|{'unknown': 119, 'classic': 13, 'full_fearless': 4}|cs_difference=-2.3, gold_difference=-21.2, xp_difference=-30.6|
|mid/15|18 vs. 42|136|105|0.731|{'unknown': 119, 'classic': 13, 'full_fearless': 4}|cs_difference=-2.5, gold_difference=8.2, xp_difference=-41.8|
|top/10|150 vs. 887|132|124|0.569|{'unknown': 120, 'full_fearless': 12}|cs_difference=1.4, gold_difference=38.8, xp_difference=38.0|
|top/15|150 vs. 887|132|124|0.569|{'unknown': 120, 'full_fearless': 12}|cs_difference=1.8, gold_difference=77.6, xp_difference=59.0|
|mid/10|268 vs. 517|129|123|0.928|{'unknown': 110, 'classic': 3, 'full_fearless': 16}|cs_difference=2.4, gold_difference=12.4, xp_difference=55.6|
|mid/15|268 vs. 517|129|123|0.721|{'unknown': 110, 'classic': 3, 'full_fearless': 16}|cs_difference=2.7, gold_difference=14.3, xp_difference=47.7|
|mid/10|42 vs. 268|128|121|0.928|{'unknown': 111, 'classic': 8, 'full_fearless': 9}|cs_difference=0.6, gold_difference=-1.1, xp_difference=-32.7|
|mid/15|42 vs. 268|128|121|0.719|{'unknown': 111, 'classic': 8, 'full_fearless': 9}|cs_difference=1.5, gold_difference=50.5, xp_difference=0.3|
|mid/10|268 vs. 777|126|121|0.926|{'unknown': 81, 'classic': 3, 'full_fearless': 42}|cs_difference=-1.9, gold_difference=-69.5, xp_difference=-72.2|
|mid/15|268 vs. 777|126|121|0.716|{'unknown': 81, 'classic': 3, 'full_fearless': 42}|cs_difference=-1.9, gold_difference=-77.3, xp_difference=-96.4|
|bot_duo/10|221,117 vs. 236,267|123|104|0.552|{'unknown': 121, 'full_fearless': 2}|bot_cs_difference=0.2, duo_gold_difference=-17.4, duo_xp_difference=-11.5|
|bot_duo/15|221,117 vs. 236,267|123|104|0.552|{'unknown': 121, 'full_fearless': 2}|bot_cs_difference=0.7, duo_gold_difference=19.0, duo_xp_difference=30.6|
|top/10|58 vs. 266|121|111|0.548|{'unknown': 101, 'classic': 6, 'full_fearless': 14}|cs_difference=1.5, gold_difference=60.0, xp_difference=-5.7|
|top/15|58 vs. 266|121|111|0.548|{'unknown': 101, 'classic': 6, 'full_fearless': 14}|cs_difference=2.1, gold_difference=76.4, xp_difference=24.4|
|top/10|68 vs. 897|117|107|0.539|{'unknown': 88, 'classic': 5, 'full_fearless': 24}|cs_difference=1.7, gold_difference=66.4, xp_difference=28.6|
|top/15|68 vs. 897|117|107|0.539|{'unknown': 88, 'classic': 5, 'full_fearless': 24}|cs_difference=2.1, gold_difference=89.1, xp_difference=45.3|
|mid/10|112 vs. 268|117|107|0.921|{'unknown': 100, 'full_fearless': 17}|cs_difference=-1.3, gold_difference=-57.9, xp_difference=-79.0|
|mid/15|112 vs. 268|117|107|0.701|{'unknown': 100, 'full_fearless': 17}|cs_difference=-1.1, gold_difference=-107.9, xp_difference=-46.9|
|top/10|887 vs. 897|115|114|0.535|{'unknown': 112, 'classic': 2, 'full_fearless': 1}|cs_difference=0.6, gold_difference=-3.9, xp_difference=13.3|
|top/15|887 vs. 897|115|114|0.535|{'unknown': 112, 'classic': 2, 'full_fearless': 1}|cs_difference=0.1, gold_difference=-3.6, xp_difference=5.2|
|top/10|150 vs. 164|114|109|0.533|{'unknown': 109, 'classic': 2, 'full_fearless': 3}|cs_difference=0.9, gold_difference=-10.9, xp_difference=-4.9|
|top/15|150 vs. 164|114|109|0.533|{'unknown': 109, 'classic': 2, 'full_fearless': 3}|cs_difference=1.4, gold_difference=33.2, xp_difference=41.1|
|mid/10|84 vs. 268|114|109|0.919|{'unknown': 106, 'classic': 2, 'full_fearless': 6}|cs_difference=-0.8, gold_difference=8.0, xp_difference=4.8|
|mid/15|84 vs. 268|114|109|0.695|{'unknown': 106, 'classic': 2, 'full_fearless': 6}|cs_difference=-0.3, gold_difference=16.0, xp_difference=14.5|
|top/10|24 vs. 150|110|101|0.524|{'unknown': 99, 'full_fearless': 11}|cs_difference=0.7, gold_difference=14.4, xp_difference=24.5|
|top/15|24 vs. 150|110|101|0.524|{'unknown': 99, 'full_fearless': 11}|cs_difference=1.4, gold_difference=31.7, xp_difference=61.5|
|mid/10|61 vs. 112|109|105|0.916|{'unknown': 87, 'full_fearless': 22}|cs_difference=-0.7, gold_difference=34.1, xp_difference=-12.4|
|mid/15|61 vs. 112|109|105|0.686|{'unknown': 87, 'full_fearless': 22}|cs_difference=-1.3, gold_difference=37.2, xp_difference=-57.3|
|top/10|266 vs. 897|107|96|0.517|{'unknown': 100, 'classic': 1, 'full_fearless': 6}|cs_difference=1.9, gold_difference=32.2, xp_difference=19.9|
|top/15|266 vs. 897|107|96|0.517|{'unknown': 100, 'classic': 1, 'full_fearless': 6}|cs_difference=2.8, gold_difference=52.5, xp_difference=28.9|
|top/10|126 vs. 150|106|97|0.515|{'unknown': 105, 'full_fearless': 1}|cs_difference=0.8, gold_difference=-2.8, xp_difference=15.7|
|top/15|126 vs. 150|106|97|0.515|{'unknown': 105, 'full_fearless': 1}|cs_difference=1.4, gold_difference=23.9, xp_difference=58.7|
|mid/10|18 vs. 268|103|92|0.912|{'unknown': 96, 'classic': 5, 'full_fearless': 2}|cs_difference=1.0, gold_difference=33.6, xp_difference=-44.3|
|mid/15|18 vs. 268|103|92|0.673|{'unknown': 96, 'classic': 5, 'full_fearless': 2}|cs_difference=0.3, gold_difference=72.8, xp_difference=-23.0|
|mid/10|13 vs. 61|97|89|0.907|{'unknown': 77, 'full_fearless': 20}|cs_difference=-0.3, gold_difference=43.7, xp_difference=-4.4|
|mid/15|13 vs. 61|97|89|0.660|{'unknown': 77, 'full_fearless': 20}|cs_difference=-1.5, gold_difference=-10.5, xp_difference=-94.8|

## Issue #15 acceptance checklist

|Requirement|Implementation|Remaining data limitations|
|---|---|---|
|Existing top-team archive, international games and completed DCGI games, with coverage accounting|Game-by-game archive audit; at least one team is an annual member. Lane/cross-role models retain unknown formats.|Games without verified complete series joins are quarantined. Admitted DCGI games form one conservative test block; 84 games are reserved for evaluation, and 13 are duplicate aliases. Inputs use the specified historical snapshot, not live collection.|
|Exclude blind picks; separate Classic and Full Fearless opportunities|Explicit blind picks are excluded upstream. Known formats are fitted separately; unknown, mixed or incomplete-draft series do not train opportunities.|Historical rules and revisions have gaps. Unknown is not guessed as Classic; LEC 2024 evidence retains its revision caveat.|
|Recorded roles; CS/gold/XP at 10/15 minutes; complete bottom-lane duo matchups|Original targets, separate finite-label denominators, four-champion keys, ADC CS, duo gold/XP and complete ablations|Physical lane positions, lane swaps, roaming and interventions remain unknown.|
|Sparse sharing, shrinkage and uncertainty|Regularized champion/duo terms, canonical matchup residual shrinkage, low-support groups, single-game residual intervals and series-level error-difference intervals|No fabricated counter-coefficient confidence intervals; cross-year interval coverage is not guaranteed.|
|Separate co-selection, same-team and opposing-team relations; control patch, teams, strength and single-champion baselines|Independent co-selection; five global models; patch categories and major/minor versions, region, format and pre-game Elo; negative results retain fallbacks|Unknown formats may leave residual confounding. All relationships are adjusted associations, not causal counters.|
|Professional data first, with limited comparable ranked auxiliary data; no player-champion win-rate/KDA bonuses|Independent transfer validation covers 2,493 ranked games. Gold benefits are not stable, so the current contribution is zero. M2 features exclude personal champion win rates and KDA.|Per-game ranked queue and rank are unknown; the data is not claimed to be entirely Master or higher.|
|Queries by patch, champion, candidate role and lineup; support/provenance and team-tendency interface|Unified JSON API; marginalization over feasible joint roles; current draft prefix and pool provenance; historical team context|The default client roster is not an official restriction list. Caller pools are not independently verified by the project; legal probabilities or T1 lane preferences are not fabricated.|
|Temporal/whole-series validation, deduplication, scripts, parameters, structured results, visualizations and coverage reports; preserve M1|Grouped partitions, completed labels, fixed replay, hashes, complete ablations and this report; M1/M3 files remain unchanged|2026 data has already been viewed and is retrospective only. M4 integration and future unseen windows remain subsequent work.|

The delivery covers the module, validation, interface and reporting requirements of issue #15. Missing data remains explicit in the contract; not all historical official rules or restriction lists have been recovered. Production ranked weight is zero, unselected relationships fall back, and personal champion win-rate/KDA bonuses are excluded. Next steps are M4 integration and validation on a new time window.
