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
Registered teams
How it's computed
- 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
- Evidence → confidence, Elo-style. Grows with evidence and saturates: a player with exactly K effective games is at 50%. evidence = n / (n + K)
- 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
- 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.
- 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.