$ blog / crisc-analysis-pipeline

Back to index

CRISC: Analyzing a Time-Scramble Tactic in Online Chess

Does hanging a full piece in a time scramble actually help you win? I analyzed 3 months worth of Lichess games to find out.

12 min readJun 12, 2026
CRISC: Analyzing a Time-Scramble Tactic in Online Chess

This is a write-up for my CRISC (formerly RISCK) project. Source: https://github.com/yolorys/crisc-chess. Appreciate all the feedback that helped refine this project!

Update Logs

August 2026 – Iteration 2

Jump to Iteration 2 (Click to teleport)

  • Nomenclature standardization: Updated terminology from RISCK (Random Inferior Sacrificial Check to King) to CRISC (Contiguous Random Inferior Sacrificial Check), Control to Baseline, and standardized Player/Opponent role headers.
  • Confounding variable control: Enforced pre-ply (i.e., a ply before CRISC/baseline move) position balance (-150 to +150 centipawns) to eliminate won/lost bias, elo gap threshold (|elo diff| ≤ 200 elo), and anti-pseudoreplication (restricting to one event per game). This applies to both CRISC and Baseline groups.
  • Baseline group: Formerly called Control, but then I renamed it to Baseline because I realized my study is essentially observational vs. experimental and the data source is historical. The Baseline group is extracted from the same Parquet data using the same shared constraints above, but with no check or blunder requirement. It captures standard moves played under identical time-scramble conditions from balanced positions. To prevent the baseline from vastly outnumbering CRISCs, 21,500 moves are randomly sampled per month (ORDER BY random() LIMIT 21500), yielding N = 64,500 baseline moves across 3 months. Kept it to 21500 per month as in Iteration 1; planning to test if "LIMIT 3500" would yield different results.
  • Refined sample size: Controlling the abovementioned variables isolated a CRISC sample size of N_C = 10,813 against N_B = 64,500 Baseline moves.
  • Inferential stats: Implemented two-proportion Chi-Square / Z-tests for Win Rate Lift (ΔW) and Welch's t-tests for Opponent Reaction Time Difference (ΔR_O), complete with exact 95% Confidence Intervals and significance markers (***, **, *, ns).
  • Cross-stratification: Stratified metrics across 4 rating tiers (<1000, 1000-1500, 1500-2000, >2000) and 4 clock scramble brackets (≤5s vs ≤5s, ≤5s vs 5-10s, ≤5s vs 10-15s, ≤5s vs 15-20s).
  • Pipeline unification & CLI standardization: Consolidated fragmented sub-scripts into a unified CLI orchestrator (run_pipeline.py) and modular analysis tools (winrate.py, opponent_reaction.py).
  • Curated demo sample: Created a lightweight Parquet sample dataset (./data_sample/) allowing instant end-to-end pipeline execution in ~2 seconds without downloading full >40GB datasets.
  • Data visuals: fig1_winrate_analysis.png, fig2_reaction_time_analysis.png, fig3_research_summary_dashboard.png

June 2026 – Iteration 1 (Initial Release) (Click to teleport)

Introduction

CRISC.

It's a term I coined myself when I wasn't able to find any pre-existing term for the particular time-scramble tactic I'm analyzing. It stands for Contiguous Random Inferior Sacrificial Check. Formerly, I called it RISCK, Random Inferior Sacrificial Check to King, but I renamed it after the chess community on r/chess pointed out that it kind of implies we can check another piece than King. CRISC is a much more representative name, and hopefully I won't need to change it again.

To understand what a CRISC is, read the scenario below and see if you have experienced it in online speed chess:

  • You are playing bullet or fast blitz with no increment.
  • You and your opponent have under five seconds left on the clock.
  • Both of you start to feel the time pressure and start to make quick pre-moves to not lose on time.
  • All of a sudden, your opponent sacks their Rook or another major piece straight to your King's face for no clear tactical reason (see the article's cover image again for what I mean by "King's face").
  • You take a close look at that sacrifice, and by the time you realize it's a clear blunder, you have already lost on time.

You can see a visual example of a CRISC from my dataset in the GitHub repository.

It's definitely not the conventional way to play chess, but so many chess players on r/chess have shared that they execute this tactic very often in online speed chess. I'd say it occurs much more than the chess community openly discusses, so I thought it would be cool to analyze this time-scramble tactic mathematically and share the results.

Iteration 1 - Initial Pilot

Iteration 1 was my initial pilot release to investigate whether hanging a major piece in a time scramble yields an empirical winning edge.

1. Control Group

To evaluate the impact of a CRISC, I first established a reference for standard checks under time pressure.

I extracted a control group of 64,500 Lichess positions where a player gave a mathematically sound check with under 5 seconds remaining on their opponent's clock. In this control group, the checking player won 82.52% of the time.

2. CRISC Win Rate

Win rate chart🔍 Click to expand full resolution

Next, I filtered over 64,000 verified positions for CRISC moves—checks accompanied by an objective evaluation drop of at least -400 centipawns (a major blunder, such as hanging an undefended Rook).

In standard chess, hanging a major piece plummets winning chances to near zero. But in a time scramble, playing a CRISC still yielded a 76.17% win rate.

This reveals something interesting: CRISC only reduced the checking player's statistical win rate by ~6.35% (82.52% vs. 76.17%). In time scrambles, remaining clock time appears to matter far more to the outcome than positional strength on the board.

3. Observed Reaction Times

Reaction chart🔍 Click to expand full resolution

I initially hypothesized that opponents might pause longer when presented with an absurd material blunder like CRISC, thus eventually losing the game on time. However, the data showed no significant delay:

  • Control check: Opponents responded in an average of 1.28 seconds.
  • CRISC: Opponents responded in an average of 1.24 seconds.

So how do CRISCs still achieve a 76.17% win rate, if opponents captured the CRISC piece at roughly the same speed as a standard check? Here are my thoughts:

  1. Pre-move gets cancelled + unexpectedly: In time scrambles, players heavily rely on pre-moving. Since a pre-move on Lichess consumes 0.0s if successfully executed, it can help a lot when players have low time. However, whenever a check is delivered but the receiver's pre-move doesn't resolve the check, their queued pre-move gets cancelled, which then demands them to take >0.0s to respond, thus draining their clock. It's not unlikely that the receiver's pre-move actually resolves a standard check; however, it's definitely very unlikely that a pre-move resolves a less expected move like CRISC.
  2. Follow-up pre-moves: The CRISC player can queue a follow-up pre-move in advance, while the opponent loses clock time responding to the CRISC.
  3. Elapsed clock time: Spending ~1.24s to capture the CRISC piece still consumes a significant portion of the opponent's remaining time (≤5s).

Conclusion - Iteration 1

Iteration 1 provided the initial observational proof-of-concept for the CRISC tactic. The data demonstrated that hanging a major piece directly next to the opponent's king when they are under 5s still yielded a 76.17% win rate. Under time pressure, the execution of check, whether standard or CRISC, and pre-move cancellation appeared to matter far more than objective material balance.

What's next?

While Iteration 1 provided an interesting proof-of-concept, after sharing it on r/chess, the community's feedback helped me realize that it lacked controls for pre-ply positional balance, elo gaps, and elo tier/time scramble tier stratification. The next step is to build a controlled pipeline (Iteration 2) that controls for these confounding variables across the same data.

Iteration 2

If you have read Iteration 1, you could probably tell it was flawed in different ways.

Iteration 2 introduces the following enhancements: pre-ply positional balance, elo gap threshold, elo stratification, and time scramble brackets.

Each time scramble bracket consists of two parts: Opponent clock time (T_O) vs Player clock time (T_P). T_O is the target data point and remains <=5s across all brackets. T_P varies across 4 brackets: <=5s, 5-10s, 10-15s, and 15-20s. Both are adjustable for sensitivity analysis.

The final aggregated Feb-Apr dataset comprises 10,813 CRISC moves and 64,500 Baseline moves.

Key findings are below.

1. Win Rate Lift Matrix (ΔW = CRISC Win Rate - Baseline Win Rate)

Iteration 2 Win Rate Analysis🔍 Click to expand full resolution

In equal time sracmbles (<=5s vs <=5s), comparing CRISC win rates against the Baseline group reveals a statistically significant win rate lift of +8.41% to +9.73% (p < 0.001) across all elo tiers above 1000. In the <=5s vs 5-10s bracket, that range is +7.07% to +9.80%.

Below is the same win rate lift matrix with a legend.

Win Rate Lift Matrix & Statistical Significance

Legend: *** (p < 0.001), ** (p < 0.01), * (p < 0.05), ns (not significant)

Elo Tier≤ 5s vs ≤ 5s≤ 5s vs 5-10s≤ 5s vs 10-15s≤ 5s vs 15-20s
< 1000+3.18% (ns)
[-5.91%, +12.27%]
+5.50% (ns)
[-1.88%, +12.89%]
+0.80% (ns)
[-5.93%, +7.52%]
+2.36% (ns)
[-0.98%, +5.71%]
1000 – 1500+8.99% (***)
[+5.32%, +12.65%]
+7.07% (***)
[+4.17%, +9.98%]
+2.63% (ns)
[-0.16%, +5.43%]
+0.57% (ns)
[-2.29%, +3.42%]
1500 – 2000+9.73% (***)
[+6.96%, +12.50%]
+9.29% (***)
[+6.83%, +11.75%]
+4.90% (***)
[+2.60%, +7.21%]
+1.35% (ns)
[-1.26%, +3.97%]
> 2000+8.41% (***)
[+6.02%, +10.79%]
+9.80% (***)
[+7.08%, +12.51%]
+6.01% (**)
[+2.90%, +9.11%]
-0.72% (ns)
[-5.16%, +3.71%]

2. Pooled Opponent Reaction Time Difference Matrix (ΔR_O)

Iteration 2 Opponent Reaction Time Analysis🔍 Click to expand full resolution

The ΔR_O matrix reveals that opponents respond 0.09s to 0.21s faster on average following a CRISC compared to a baseline move (p < 0.001).

Reaction Time Difference Matrix & Statistical Significance

Legend: *** (p < 0.001), ** (p < 0.01), * (p < 0.05), ns (not significant)

Elo Tier≤ 5s vs ≤ 5s≤ 5s vs 5-10s≤ 5s vs 10-15s≤ 5s vs 15-20s
< 1000-0.11s (ns)
[-0.28s, +0.06s]
-0.13s (ns)
[-0.29s, +0.03s]
-0.00s (ns)
[-0.24s, +0.24s]
-0.01s (ns)
[-0.24s, +0.22s]
1000 – 1500-0.21s (***)
[-0.26s, -0.15s]
-0.17s (***)
[-0.25s, -0.10s]
-0.21s (***)
[-0.30s, -0.13s]
-0.15s (*)
[-0.28s, -0.02s]
1500 – 2000-0.18s (***)
[-0.22s, -0.15s]
-0.18s (***)
[-0.23s, -0.14s]
-0.17s (***)
[-0.24s, -0.11s]
-0.15s (***)
[-0.24s, -0.06s]
> 2000-0.09s (***)
[-0.12s, -0.06s]
-0.12s (***)
[-0.15s, -0.09s]
-0.15s (***)
[-0.21s, -0.10s]
-0.10s (*)
[-0.28s, -0.01s]

3. Some other visuals I found insightful:

Iteration 2 Research Summary Dashboard🔍 Click to expand full resolution

  1. Win rate lift in equal scrambles: Consistent ~8% to 10% ΔW across rating tiers above 1000 elo.
  2. ΔR_O in equal scrambles: Above 1000 elo, opponent reaction time difference (ΔR_O) shrinks from -0.21s (1000–1500 elo) down to -0.09s (>2000 elo).
  3. Sample volume: In both CRISC and Baseline groups, the < 1000 elo bracket has really small sample size, which is one of the primary reasons for statistically insignifcant results in that bracket. As mentioned in the update log, I plan to test if a baseline sample size near CRISC sample size would yield different results, but I guess the overarching trends wouldn't change.
  4. Decreasing ΔW: Above 1000 elo, ΔW decreases as T_P increases relative to T_O.

Conclusion - Iteration 2

  1. Enforcing pre-ply positional balance (-150 to +150 centipawns) and elo parity (|elo diff| ≤ 200 elo) shows that CRISCs deliver a statistically significant win rate lift of +8.41% to +9.73% (p < 0.001) over Baseline moves in equal time scrambles (<=5s vs <=5s) for all players rated above 1000 elo.
  2. Opponents respond 0.09s to 0.21s faster on average after a CRISC compared to a baseline move (p < 0.001). One potential observational explanation is that checking moves (like CRISC) restrict legal response options on the board, which may be associated with faster response under time pressure.
  3. Low-rating (<1000 elo) tier exhibits wider confidence intervals and non-significant win rate lifts (+0.80% to +5.50%, ns), associated with lower sample count and, perhaps, higher move variance.
  4. As T_P soars relative to T_O, ΔW decays to non-significant levels (-0.72% to +2.36%, ns). In this kind of scenario, CRISC win rate and Baseline win rate are roughly equal.

What's next?

Iteration 2 established controlled empirical evidence for CRISCs, but several open questions remain for future iterations:

  • Lasting impact analysis: Do CRISCs affect the position quality and reaction times on follow-up moves (1.5, 2.5, and 3.5 moves after the check)?
  • Pre-move cancellation: How often do CRISCs successfully cancel Opponent's queued pre-move?
  • Piece type breakdown: Basically comparing win rates and reaction times across different checking pieces: Rook, Knight (probably not, since it can't be a CRISC), Bishop, and Queen.
  • Opponent response: Does Opponent resolve the CRISC by capturing the checking piece or escaping with their King? How often does each response type occur?
  • Centisecond clock precision: Analyzing datasets with centisecond clock tags (%clkc) to measure reaction times with centisecond precision (click to read associated limitation).
  • Multi-ply cascades: Expanding candidate extraction beyond single-ply candidate extraction (QUALIFY ROW_NUMBER() = 1) to analyze multi-ply sacrifice cascades.
  • Baseline sample size sensitivity: Testing whether adjusting the baseline sample size (e.g. LIMIT 3500 per month instead of LIMIT 21500) impacts win rate lift estimates.

Currently focusing on the first four in Iteration 3.

Methodological Limitations & Platform Variance

To maintain rigorous bounds on these conclusions, several platform-specific constraints and analytical edge cases must be noted:

  • Lichess clock system: Lichess utilizes a distinct time-handling system (allowing exactly one pre-move that consumes 0.0 seconds, alongside specific network lag compensation). Our reaction time metrics inherently reflect these platform-specific mechanics.
  • Clock precision limits: Lichess stores clock times as discrete whole-second values in standard PGN exports using %clk H:MM:SS. While Lichess has provided specialized historical exports (such as datasets from 2013–2021) utilizing %clkc tags that capture time down to centiseconds (hundredths of a second), the primary dataset analyzed in this research does not record centiseconds.
  • Platform generalizability: Competitor platforms like Chess.com handle time scrambles differently (e.g., allowing multiple queued pre-moves that consume 0.1 seconds each). Conducting this analysis on Chess.com data would likely alter the behavioral mechanics and reaction time deltas between a CRISC and a Baseline move.
  • Data availability: Validating platform variance mathematically requires cross-referencing datasets. However, unlike Lichess, Chess.com does not provide public, open-source bulk databases of their games, restricting this analysis to a single platform's ecosystem.
  • First-event extraction: To ensure statistical independence and prevent pseudoreplication, only the first CRISC move per game is sampled (QUALIFY ROW_NUMBER() = 1), leaving multi-ply CRISC cascades for future iterations.
  • Low-elo variance: In the <1000 elo tier, wider confidence intervals and small sample size result in non-significant results.

Methodology Appendix

For data scientists and chess developers, here is the up-to-date multi-month pipeline specification:

  • Data source: Raw Parquet data from February, March, and April 2026 via Thomas Daniels' Aix-compatible Lichess Database (>40GB of game data).
  • Environment: All processing was executed on a High-Performance Computing (HPC) cluster utilizing DuckDB (v1.5.3) and Python inside a read-only Nix package environment.
  • Positional balance & Rating controls: Enforced pre-ply position balance (-150 to +150 centipawns) and elo gap threshold (|elo diff| ≤ 200 elo) using SQL.
  • Step 1 filter (SQL): DuckDB CLI was utilized to scan millions of Lichess games and isolate objectively inferior moves (eval drop ≤ -400cp) across four time scramble brackets.
  • Step 2 filter (Python): python-chess was used to rebuild the board states of candidate moves to verify geometric adjacency (square_distance <= 1 to the king) and capturability (the checking piece was completely undefended).
  • Inferential stats: Computed two-proportion Chi-Square / Z-tests for Win Rate Lift (ΔW) and Welch's t-tests for Opponent Reaction Time Difference (ΔR_O), complete with 95% Confidence Intervals.
  • Final sample size: The multi-month pipeline isolated 10,813 CRISCs and 64,500 Baseline moves.