feat: six difficulty levels on measured Elo - #53
Conversation
The previous ladder hid a chasm: its top two levels were about 1500 Elo apart, behind a 96% self-play score. That figure looked healthy and was not — a 500 point gap and a 1500 point gap both produce it, so the method could not tell them apart. Anchoring against Stockfish 18 with UCI_LimitStrength gave a calibrated yardstick this build cannot provide for itself, and only scores between 25% and 75% were used, since that is the band where the Elo formula discriminates at all. The result is six levels at roughly 550, 1000, 1350, 2000, 2250 and 2450, with a new Grand Maître on top. The widest remaining step is about 650, against 1500 before. The figures are displayed again, because they are now measured. The file records how, and states the caveats: the reference plays at a fixed 100ms while ours keeps a depth cap, UCI_Elo bottoms out at 1320 so Novice is chained from Débutant by self-play, and every number is worth about ±150. Depth and skill are no longer both required to rise at every step. Two levels share a depth and two share a skill; what the ladder needs is that neither ever falls and that at least one rises, which is what the test now asserts.
✅ Deploy Preview for chesstrainer-ai ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
PR Summary by QodoAdd sixth engine level and display measured Elo calibration
AI Description
Diagram
High-Level Assessment
Files changed (4)
|
Code Review by Qodo
1.
|
The name promised a depth that cannot see a reply coming, while the assertions had been reduced to an Elo bound — so a future change to Novice's depth would have passed silently under a title saying otherwise. It now asserts that Novice searches no deeper than anything else on the ladder, which is the property the name describes and the reason it hangs pieces.
Six levels, and every Elo on the card is measured rather than asserted.
The defect
The ladder merged in #52 had a chasm between its top two levels — about 1500
Elo — and I reported it as healthy. The self-play score was 96%, which I read
as a gap of roughly 500. It is not: a 500 point gap and a 1500 point gap both
produce 96%. The method could not tell them apart, and I did not say so.
The fix
Anchoring against Stockfish 18 with
UCI_LimitStrength, which is acalibrated opponent the shipped Stockfish 11 cannot provide for itself — it
exposes no
UCI_Eloat all. Only scores between 25% and 75% were used, sinceoutside that band the Elo formula stops discriminating.
Steps of roughly 450, 350, 650, 250 and 200. The widest is now about 650,
against 1500 before.
Caveats, stated in the file rather than implied away
these are measurements against a yardstick, not ratings earned against people.
UCI_Elobottoms out at 1320, so Novice sits below every available anchor andis chained from Débutant instead. It is the least certain of the six.
Monotonicity
Two levels share a depth and two share a skill, so requiring both to rise at
every step no longer fits. The rule the ladder actually needs is that neither
ever falls and at least one rises, and that is what the test asserts now.
Verified against broken code
Setting one level's Elo to 2800 to recreate a chasm fails the new gap test.
Not included
No level named after or alluding to a living player. Play Magnus was exactly
that product and it is licensed; an allusion specific enough to be recognised
carries the same identifiability problem as the name. Grand Maître is the sixth
level instead.