ChessGrader / Methodology
How ChessGrader grades your moves
The public model, thresholds, safeguards, and node budgets behind a ChessGrader report, written down. If you think a grade is wrong, this page is how you check our side of the math.
The engine
ChessGrader runs Stockfish 17.1 with the lite NNUE network, compiled to WebAssembly, in your browser. There is no server-side analysis. Every position in your game is evaluated with a fixed budget of 100,000 nodes per move. The app verifies at startup that the NNUE network actually loaded and records that with each analysis — it never silently falls back to the weaker classical evaluation.
Why fixed nodes instead of depth or time
Most analysis tools search for a fixed time or to a fixed depth. Fixed time means a gaming PC and a five-year-old phone produce different evaluations — and therefore different grades — for the same game. Fixed depth is closer, but depth is an uneven unit: modern Stockfish prunes aggressively, so "depth 20" covers wildly different amounts of work in different positions. A fixed node count makes the search deterministic in effort: the same game gets the same grades on any device, any day. That reproducibility is worth more to a grading system than squeezing out extra strength on fast hardware.
The two-pass design
The first pass grades every move at 100,000 nodes. Then the moments that matter — potential blunders, potential brilliancies, big evaluation swings, mates appearing or disappearing — are re-searched at 600,000 nodes with MultiPV 2 (the engine's two best lines), up to 20 ordinary critical positions per game. Mate-distance changes are always checked, even when that takes the pass over 20.
The point: big labels should rest on deep numbers. Brilliant and Great can only be awarded by this verification pass. A shallow search occasionally mistakes a losing sacrifice for a sound one; six times the nodes and a second principal variation catch most of those. The verification pass also works in your favor on close calls — if your move ties the engine's second line within 10cp in a non-mating position, or keeps the same mate distance, it's credited as Best, compared on one consistent search.
Expected points
Chess.com's February 2026 Classification V2 documentation says ordinary labels are based on rating-aware expected-points loss. The inputs and classification boundaries are public; the fitted conversion model is not. ChessGrader therefore uses a conservative approximation: a player's engine evaluation and rating become an expected score from 0 to 100, and a move is measured by how much of that score it gave up.
The ordinary boundaries are 0 / 2 / 5 / 10 / 20 expected points. Lower ratings use a slightly flatter evaluation-to-score curve than master ratings.
Expected points capture the important context: dropping from +2 to 0 matters much more than dropping from +9 to +7. But a probability curve becomes very flat in decided positions, so ChessGrader also keeps a centipawn-loss backstop. That prevents a 100–400cp technical error from being called Good merely because the result was already likely. Centipawn loss explained covers why.
Move grades
There are 11 labels. Ordinary quality labels use the expected-points bands below; Book, Forced, Miss, Great, and Brilliant also need their own chess-specific evidence.
| Grade | Rule |
|---|---|
| Brilliant (!!) | Engine's best move AND a genuine sacrifice (static exchange < 0), position not already totally winning, still sound after — verified at 600,000 nodes |
| Great (!) | The only good move (second-best line ≥18% worse), or the precise punish that turned a lost or equal game — verified at depth |
| Forced (□) | The position had exactly one legal move |
| Best (★) | Matches the engine's top choice, ties its second line within 10cp in a non-mating position, or keeps the same mate distance |
| Excellent | No more than 2 expected points lost |
| Good | More than 2 but fewer than 5 expected points lost |
| Book | Low-loss move in the still-contiguous opening prefix, up to move 8 |
| Inaccuracy (?!) | At least 5 expected points lost |
| Miss (✗) | Missed mate, a concrete missed tactic, or a large opportunity handed over by the opponent and immediately given back |
| Mistake (?) | At least 10 expected points lost |
| Blunder (??) | At least 20 expected points lost |
Plain-English versions of each label live in move classifications explained, and the sacrifice test behind the !! label in what makes a move Brilliant.
Centipawn and mate safeguards
Expected-points math needs guardrails at the extremes. Centipawn loss acts as a backstop when the expected-points curve has flattened, but is capped below Blunder in a position whose result was already overwhelming. Mate has explicit rules too: skipping mate in one is a Miss even if another forced mate remains, and losing a forced mate while still winning is also a Miss. Other longer mating routes stay at least Excellent, while a defender already facing forced mate is not charged again for the inevitable.
Accuracy
ChessGrader uses a CAPS2-inspired approximation, calibrated against reviewed games exposed through Chess.com's public game archive. Accuracy uses its own rating-neutral expected-points loss, separate from the centipawn safeguard used for move labels. Book and Forced moves score 100; every other move scores max(0, 100 − 7.2 × loss^1.75), and the game score is the ordinary mean. That school-test average keeps one zero from overwhelming dozens of precise moves. Chess.com's exact CAPS2 formula is private, so benchmark agreement is the calibration target—not pixel-identical output. Benchmarks by rating tell you what the resulting number means.
Estimated game rating
When the player's real rating is available, the game estimate starts there and moves up or down using both expected-points accuracy and capped average centipawn loss. Accuracy measures moves that changed the likely result; centipawn loss catches technically loose play in positions where the result was already nearly decided. The adjustment is capped at 600 points and needs at least 10 moves. Rating-less PGNs fall back to a community ACPL-to-rating fit. Caveats, stated as bluntly as we can: one game is a tiny sample; time control changes everything; a one-sided game can flatter the result. It's a vibe, not a measurement, and the report says so.
How close it actually gets to chess.com
Measured, not asserted. Two numbers matter, and they say different things.
- Accuracy scores: mean absolute error of 4.30 points. Across a corpus of 12 publicly reviewed games and 24 player scores, the median error is 3.06, the largest single error is 14.01, 17 of 24 scores land within five points, and the stronger player is identified correctly in 12 games out of 12.
- Individual move labels: 65% exact agreement. Across 15 games and 406 moves walked out of chess.com’s own Game Review interface, ChessGrader assigns the identical label on 264 of them. Most of the remaining disagreement sits on the Excellent / Good / Best boundary — the region where centipawn loss alone does not separate the classes — rather than on mistakes and blunders, which are the labels that change how you play.
We publish the lower number as readily as the higher one. Any tool claiming near-perfect agreement with chess.com is claiming to have reproduced a private, fitted model; what can honestly be measured is compatibility, and this is ours.
Why your numbers can differ from chess.com's
Chess.com's fitted expected-points model, exact CAPS2 formula, search depths, and Brilliant detection remain private. ChessGrader follows the published Classification V2 concepts and calibrates against public reviewed-game benchmarks, but it does not claim to reproduce those private systems. Borderline grades and whole-game accuracy can differ materially. When the two disagree, you can at least check ChessGrader's side of the argument — it is all on this page.
What the private-beta coach is being built to do
The coach is currently invitation-only and the public route is a waitlist. The dormant beta implementation freezes the latest 30 eligible games, then ranks a repair priority by recurrence across distinct games, impact, trainability, evidence confidence, and the goal the player selected. Every diagnosis carries its denominator, confidence reason, and exact source positions. Results alone cannot create an opening diagnosis; that requires engine-backed evidence across multiple games.
- Recall: solve cold while the move, evaluation, grade, and old explanation stay hidden.
- Repair: commit a move, predict the reply, and explain the decision before seeing corrective feedback.
- Transfer: write a decision rule and apply it to a mixed position or a new matched-time-control game.
The ten-minute schedule is exactly 2 minutes of recall, 5 of repair, and 3 of transfer. Longer schedules preserve the same sequence. Primary positions return on days 1, 3, 7, and 14; mixed positions and unseen game receipts prevent memorizing one board. Missed sessions roll forward without a streak penalty.
The campaign awards practice XP for completed training acts, never for a predicted rating gain. XP persists across missed days, and the player can change their schedule at any time. That choice is deliberate: visible mastery supports competence without using a fragile daily streak as pressure. The approach follows the autonomy, competence, and relatedness principles described by self-determination theory.
The mechanics follow current learning-science evidence on retrieval practice in real classrooms, interleaved delayed practice, elaborated retrieval and transfer, and deliberate study in chess. These sources justify the training design, not an Elo promise.
The coach waits for ten strictly newer, like-for-like games before retesting the frozen priority. It does not silently switch the focus and it does not claim that a rating change was caused by the plan.
Frequently asked questions
Why do my grades differ from chess.com’s Game Review?
Chess.com publishes the V2 system's inputs and label boundaries, but not its fitted expected-points model, exact CAPS2 accuracy formula, search settings, or Brilliant detection. ChessGrader uses Stockfish 17.1 locally and a public, rating-aware approximation calibrated against reviewed-game benchmarks, so many evaluations align while labels and whole-game accuracy can still differ.
Is browser analysis weaker than server analysis?
In raw search, yes: Lichess's servers search millions of nodes per move versus ChessGrader's 100,000-node first pass. ChessGrader trades peak depth for consistency — the same grades on any device — and re-verifies the moments that decide big labels at 600,000 nodes with the top two engine lines. For grading purposes the results agree with deeper searches on the large majority of moves.
Can I trust a Brilliant label from ChessGrader?
More than most. Brilliant is only awarded when the move is the engine’s best, is a genuine material sacrifice by static exchange evaluation, the position was not already totally winning, and the move survives a 600,000-node verification search with the top two lines. A shallow first-pass search can never award it on its own.
What does 100,000 nodes mean in depth terms?
Very roughly depth 18 to 22 with modern Stockfish in typical middlegame positions, though it varies a lot because the search prunes unevenly. That is well beyond human tactical vision, but shallower than Lichess server analysis. Node counts are used precisely because depth is an inconsistent unit.
Do all devices really produce the same grades?
Yes. The search budget is a fixed node count, not a time limit, so a phone and a workstation do the same amount of engine work per move — the phone just takes longer. The NNUE network is verified as loaded before any analysis runs.
How accurate is the estimated game rating?
It is deliberately rough. When a player's rating is known, the estimate is anchored there and adjusted by a blend of expected-points accuracy and capped average centipawn loss, with a maximum 600-point swing. Rating-less PGNs use a community ACPL fit. One game and one time control are far too noisy for it to be a measurement.
What is the Miss grade and why does it exist?
Miss names an opportunity rather than just a numerical loss: skipping mate in one, losing another forced mate while still winning, missing a concrete tactic, or immediately giving back a large opportunity your opponent just handed you. Expected-points math alone would not describe those situations clearly.
