Analyses multiple games and aggregates the evidence.
Detect engine assistance in chess games through multi-signal statistical analysis. Honest uncertainty. No false certainty.
Every game is analysed through multiple independent statistical lenses, then combined with proper correlation adjustment
A chess engine finds the best move in every position. We compare the player's actual moves to what the engine recommends
No single stat tells the whole story. We measure move accuracy, blunder rates, complexity handling, timing patterns, and more
Signals are compared against what's normal for the player's rating. A 1200 matching the engine 50% of the time is suspicious; for a GM, it's Tuesday
The result is a probability, not a yes/no. One game is rarely conclusive — scanning multiple games gives much stronger evidence
The pipeline validated against confirmed professional cheating cases with known outcomes
All analyses performed at depth 12 with shipped default baselines. Statistical evidence should never be the sole basis for accusations.
The problems, the math, the validation, and the honest limitations behind detecting engine-assisted play.
When a player uses a chess engine during a game, their moves will look more like what a computer would play. But here's the catch: strong players also match the engine often. A grandmaster's best game might look just like a cheater's average game.
Any detection system has to solve three problems at once:
Wrongly accusing a clean player can end a career. The system must be conservative.
What's suspicious for a 1200 is normal for a 2600. One size does not fit all.
Engine match rate alone is too noisy. You need multiple independent signals combined properly.
Instead of a binary "cheater or not" threshold, we use Bayes' theorem to compute the probability of engine assistance given the evidence. This is the same mathematical framework used in medical testing, courtroom forensics, and spam filtering.
Evidence is measured in decibans (dB) — a logarithmic scale where +10 dB means "10× more likely cheating" and −10 dB means "10× more likely clean." This lets evidence from different signals and different games simply add up.
Each game is run through Stockfish (one of the world's strongest engines), which evaluates every position and finds the best moves. From this analysis we extract:
How often the player's move matches the engine's #1 choice. Expected range depends heavily on rating.
Average "points" lost per move compared to the best move. Lower means more accurate play.
Do they play better in complex positions than in simple ones? Humans usually do worse; engines don't care.
The CPL tail test: cheaters have suspiciously few large mistakes compared to what's expected for their rating.
Clock data reveals if thinking time correlates with move quality. Humans think longer on hard moves; bots don't.
Did the player suddenly start playing much better mid-game? A statistical changepoint test finds where.
The most critical piece: a reference model of how players at each rating level actually play. Without it, you can't tell if 55% engine match is suspicious or routine.
The corpus spans the full rating spectrum from beginner (<800) through super-GM (2800+), split into 12 bands every 200 Elo. Each band gets its own fitted model so a 1200's "normal" isn't a 2400's "normal".
Each signal contributes its own evidence (positive for suspicious, negative for normal). These combine with correlation adjustments to prevent double-counting:
When scanning multiple games, evidence from each game simply adds to the running total. 20 clean games at −8 dB each pile up to −160 dB of exonerating evidence — even one suspicious game at +20 dB can't overcome that aggregate. But the system will still flag that individual game for closer review.
Parse PGN, fetch from Chess.com or Lichess API, detect book moves via the Lichess opening explorer
Multi-pass Stockfish: depth 4 shallow scan, depth 12 main pass, depth 22 on critical positions
Per-move frame with match rank, CP loss, complexity, timing, game phase. Book and forced moves excluded.
13+ statistical tests: z-scores against the rating-specific baseline for each signal independently
Correlation-adjusted log-likelihood ratios summed into a total. Credible intervals via Monte Carlo.
Posterior probability with uncertainty bounds. For scans: per-game flags, convergence curve, changepoint detection.
A model that hasn't been tested against reality is just a theory. We validated against known outcomes — games where we know the ground truth.
The hardest case is partial cheating by strong players. Feller (GM, 2649) used intermittent SMS relay — individually each game is ambiguous, but the per-player mixture model correctly accumulates weak signals across 8 games into a positive detection. This is exactly what the system was designed for.
Every line of analysis code is public. The baseline corpus, the fitted model, the signal weights — nothing is hidden. Fork it, improve it, challenge it.
Based on the research of Prof. Kenneth Regan (University at Buffalo), who pioneered statistical cheat detection in chess.
See the documented cases for validated examples.