chessinsights

Time signals

Each signal is a single number between 0 and 100. Per-game scores are aggregated across all of a player's games, weighted by the number of scorable windows (so longer games weigh more than quick draws). Games where a signal doesn't apply (too short, no clock data, wrong time control) are excluded rather than counted as 0.

Overall — Time IQ

A composite score in two stages. Decisive Think is a multiplier, not just another weighted term, because it tells us whether the player's time management actually pays off on the board. A fast player with mediocre thinks shouldn't top the leaderboard just because they never run out of time.

quality = Steadiness × 0.30
        + Pressure Boss × 0.25
        + (100 − Drowsy) × 0.25
        + (100 − Zeitnot) × 0.20

decisive_factor = 0.30 + 0.70 × (Decisive Think / 100)

Time IQ = quality × decisive_factor

Why multiplicative?With a purely linear weighted formula, a very fast player could collect ~45 "free" points (Pressure Boss 100, Drowsy 0, Zeitnot 0) even with a terrible Decisive Think — a bad Decisive only hurt one term. Now a poor Decisive amputates the whole score : if your thinks don't pay off, your clock hygiene is irrelevant.

Edge cases:

  • Decisive Think N/A (missing engine eval) → Time IQ is N/A. We refuse to produce a false positive rather than score the player on hygiene alone. Most live broadcasts get their evals within a few hours.
  • Booked is a signature trait (style of play), not a quality — excluded from the composite.

Decisive Think

Do big thinks find a good move? The direct test that clock use translates to on-board quality.

For each move where the player spent above a threshold (2 min in classical, 10 % of the initial budget in rapid / blitz), we compare the engine evaluation before and afterthe move, from the player's perspective.

delta = eval_after_my_move − eval_before_my_move (White)
delta = eval_before_my_move − eval_after_my_move (Black)
score = 100 × (big thinks where delta ≥ −30cp) / eligible_big_thinks

Why −30cp and not 0?When computing eval_before, the engine already assumes you'll play the best continuation. If you find it, delta lands near 0 (slightly negative at greater search depth). A positive delta would mean "you found a move the engine didn't see" — almost never. Allowing up to −30cp leaves room for "found one of the top 2-3 moves", which is what a productive big think at the top level looks like.

Mate evaluations are saturated at ±1000 cp so a mate-in-3 doesn't dominate the mean. Requires at least 4 big thinks with engine eval before and after — pooled across all the player's games(not per-game), so a classical-but-fast player like Nakamura with 2-3 big thinks per game still gets a score from the sum. N/A below 4 or when engine evals are missing (common on fresh broadcasts before Lichess's post-game engine pass).

Drowsy

Tendency to fall asleep on the clock — burning time in blocks.

A sliding window walks the player's moves and flags each window that triggers either signal:

  • Classical (≥ 60 min initial budget): 6 consecutive thinks ≥ 5 min, or sum of 4 consecutive moves ≥ 40 min.
  • Rapid / blitz: sum of 4 consecutive moves ≥ 35 % of initial budget (3:30 on 10+0, 1:45 on 5+3).
score = min(100, triggering_windows × 25)

Four triggering windows cap the score at 100 — “clinically asleep”. Higher = worse for time management.

Steadiness

How consistent the player's pace is across moves.

steadiness = 1 / (1 + (P90 − P10) / (median + 1s))
score = steadiness × 100

The inter-percentile spread (P90 − P10) is normalized by the typical think time (median). A perfect metronome has P90 ≈ P10, giving a score near 100. A player who alternates 2-second moves with 15-minute tanks gets a lower score.

Requires ≥ 10 timed moves to avoid unstable percentile estimators.

Pressure Boss

Keeping the opponent behind on the clock and holding the lead.

base = 100 × (moves after #10 where myClock > oppClock) / comparable_moves
bonus = min(15, avg_gap / 5min × 15)
score = clamp(0, 100, base + bonus)

Move 10 onwards only — the first 10 moves are usually book and both sides blitz through them. The bonus rewards not just being ahead, but being ahead comfortably (big average gap).

Slight bias: at equal quality, White tends to score higher since Black has always played one move less when we compare at a given move number. Don't over-interpret a 3-5 point difference between the two colors.

Booked

Visible opening preparation: how many first moves were played without thinking.

score = 100 × (first-15 moves played in < 5s) / 15

Neither good nor bad on its own. A heavily-booked player can win by depth of preparation — or get punished by a sharp early deviation.

Zeitnot prone

Tendency to finish in time pressure.

We look at the player's minimum remaining clock in the last 10 half-moves before move 40 (where FIDE classical adds 30 min and the signal becomes less interesting afterwards).

score = clamp(0, 100, 100 × (1 − min_clock / 5min))

A minimum clock of 0 hits 100 (flag-hanging). A minimum of 5 minutes or above gives 0. Games shorter than 20 moves, or without clock data, are excluded.

Aggregation across games

Per-game scores are weighted by their denominator— the number of scorable windows that game produced. A 60-move marathon contributes more to the player's profile than a 20-move draw.

player_score = Σ (game_score × game_denominator) / Σ game_denominator

Known limits

  • Small-sample noise— a player with 2 short games in a tournament gives unstable signals. The aggregation smooths this but doesn't remove the bias.
  • Time control coupling — Drowsy thresholds (5 min consecutive, 40 min sum) are calibrated for FIDE classical. Rapid / blitz use relative thresholds (35 % of initial budget), which is a reasonable approximation but not identical.
  • No peloton calibration yet— scores are absolute, not relative. 60 on Pressure Boss is "the player was usually ahead on the clock", which we'll eventually display next to a peloton median so you can see if it's remarkable or average for the event.