Proposed feature · not league policy AD2L registration · MMR caps

Confidence-weighted caps

Rank sitting and small MMR deviations to fit under a cap can't really be policed. Instead of pretending they can, give teams whose MMR is well-evidenced a little room over the cap, and hold teams whose MMR says less to the hard line.

Three records say how far a submitted MMR can be trusted. Ranked: hundreds of recent ranked games mean the number is current. Unranked: a big unranked win rate under a modest rank suggests the player is stronger than it says (on this site's ADL data, unranked win rate predicts league results better than ranked does). League: a player with a long league record near 50% has already been measured at this level; one who has been winning 65%+ has not been. Players new to the league aren't penalised; they just bring less evidence, so their team earns less wiggle room.

At a 6,000 cap, a team of ranked regulars with even league records might register at ~6,100, while a team of unranked sharks stays at 6,000 or under. The rule is deterministic: same inputs, same allowed cap, no admin judgement calls. Everything below is adjustable; the teams are made-up examples you can edit. This is the admin side; see the team view for what registering a roster would look like.

Calculator

Wiggle scale
Team score

Registered teams

fitsover allowed capwiggle roomdashed = hard cap
TeamAvg MMRRank confidenceAllowedStatus

How it's computed

  1. Evidence per player. Ranked counts are cumulative windows (1 ⊂ 3 ⊂ 12 months): games in the last month count fully, months 2–3 and 4–12 at the weights set above. League games count L times a ranked game, because they were played at this level. Unranked games add no evidence about the rank itself. n = g1 + w3·(g3 − g1) + w12·(g12 − g3) + L·league_games
  2. Evidence → confidence, Elo-style. Grows with evidence and saturates: a player with exactly K effective games is at 50%. evidence = n / (n + K)
  3. Win-rate consistency. If the MMR is right, a player should win about half their unranked and league games. Each win rate is shrunk toward 50% (a 20-game prior, so 8–2 over ten games isn't a red flag), and only the part above 50% + tolerance counts as excess. Excess eats confidence: at the penalty span, it's gone. Losing records aren't penalised; this is about being under-rated, not over. wr' = (wins + 10) / (games + 20) excess = max(0, wr' − 50% − tol) consistency = max(0, 1 − (excess_unranked + excess_league) / span) c = evidence · consistency
  4. Team confidence. Mean of the five players by default. "Weakest 2" averages the two lowest, so three ladder regulars can't carry two unranked sharks into the wiggle band.
  5. Allowed cap. In relative mode the least-confident registered team gets 0 wiggle and the most-confident gets the full max, everyone else scaled linearly between them (a moving target). In absolute mode team confidence maps straight onto the max. Rounded down to 5 MMR. rel: t = (T − Tmin) / (Tmax − Tmin) abs: t = T allowed = floor5( cap · (1 + max% · t) )

Why it helps

  • Rewards the behaviour the cap actually depends on: playing ranked, recently, a lot.
  • Uses unranked and league results as a cross-check on the rank, which is where sandbagging shows up.
  • A 1–2% band absorbs the "my rank dropped 80 last week" noise that admins can't police anyway.
  • Every input is public (OpenDota / Stratz match history, league records), so any captain can check their own number before registering.

Open questions

  • Relative mode moves as teams register. Freeze it at registration close, or snapshot each team's allowed cap when they register?
  • Can grinding ranked to farm confidence be gamed? It costs real games at your real rank, which is the point, but the 1-month window is the cheapest to pad.
  • League win rate from which division? A 65% record one division down is a stronger signal than 65% in this one; the demo treats all league games alike.
  • Private match histories: treat as zero evidence (no wiggle), not as disqualifying.
  • Ranked counts above ~8,500 were hidden Feb 2025 – Jul 2026; irrelevant at a 6,000 cap, but matters for top divisions.