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_factorWhy 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_thinksWhy −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 × 100The 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) / 15Neither 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_denominatorKnown 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.