Decisions under uncertainty, measured

aqueval builds chess and poker engines and publishes every change with its statistical test result, including the ones that fail. Two programmes are running: a chess engine in Rust with its own neural evaluation, and a poker AI that runs only in simulation.

33 tests: 26 accepted, 6 rejected, 1 inconclusiveWorking paper / independent research2 active programmesSnapshot · 5 Nov 2026
K = 0.00
A Kalman filter on a simulated signal: noisy readings, the estimate and its 95% band

Principle

No single game decides anything. aqueval studies decisions under uncertainty through verified engines, reproducible experiments and statistical evidence.

≈2980
Elo against Stockfish 17
26 of 33
Changes accepted
0
Rule mismatches
558,803
Hands per second

At a glance

What has been built so far, the evidence for each piece, and the methods behind it. Each entry links to the page where it is measured.

WorkEvidenceMethods and tools
Chess engine in Rust, written from scratch 33 changes tested by SPRT, 26 accepted; ≈2980 Elo against strength-limited Stockfish 17 RustAlpha-beta / PVS searchBitboardsSPRT, pentanomial statistics
Neural evaluation for the chess engine Own NNUE trained on 87.3 million self-play positions on CPU; ≈2560 → ≈2875 Elo in the October gauntlet Neural network trainingQuantised SIMD inferenceSelf-play data
Poker engine for No-Limit Hold'em 0 rule mismatches in 914,873 decisions against PokerKit; 558,803 hands per second on one core Python 3.13NumbaDifferential testing
Game-theoretic solver CFR, CFR+, Discounted CFR and Monte Carlo CFR match OpenSpiel on Kuhn and Leduc poker Counterfactual regret minimisationExploitabilityValidation against OpenSpiel
Heads-up blueprint Monte Carlo CFR on 19.5 million infosets, 644 million iterations; beats four rule-based agents by 1.6 to 4.9 big blinds per hand Card abstraction (EMD clustering)Local best responseDuplicate matches
Human decision data 21.6 million hands from 2009 parsed without error; 174 million decisions, split by player Data pipelinePlayer-level splitsSelection bias
Real-time search for poker (planned, M5) Depth-limited subgame solving for bets outside the abstraction; not started Subgame solvingAction translation

Programmes

Chess is a game of perfect information, poker one of hidden information. Both use the same discipline: a verified engine first, then measured improvements.

Painting: two men at a chessboard in a dark panelled studyPainting: three sisters around a chessboard, one of them looking up
Thomas Eakins, The Chess Players, 1876; Sofonisba Anguissola, The Chess Game, 1555

Chess engine

Version 1.0 · search queue paused

A UCI chess engine in Rust with neural evaluation trained only on its own games. Version 1.0 is released as Quant; further search experiments are paused after three consecutive rejections.

≈2980Elo estimate against strength-limited Stockfish 17, 5 November
Changes accepted
26 of 33
Test method
SPRT against the current main branch
Next milestone
Review the next search experiments
Open the chess engine
Painting: two men cheat a young card player, one signalling from behind himPainting: card players at a table, one drawing an ace from behind his back
Caravaggio, The Cardsharps, about 1595; Georges de La Tour, The Cheat with the Ace of Clubs, about 1630

Poker

Phase 2 of 5

No-Limit Texas Hold'em: an equilibrium baseline from counterfactual regret minimisation, a model of human decisions, and both compared in simulation.

0rule mismatches in 914,873 decisions checked against a reference implementation
Engine speed
558,803 hands/s
Human data
21.6 million hands, 174 million decisions
Next milestone
Real-time subgame solving (M5)
Open the poker programme

How we test

The same four steps apply to a pruning margin in chess and to a new strategy in poker.

  1. One changeper branch
    Each change is a hypothesis on its own branch, measured against the current best version.
  2. Correctness firstperft, rules reference
    Perft node counts in chess, a rules reference in poker. Nothing is measured before it is verified.
  3. Sequential statisticsSPRT, duplicate matches
    SPRT in chess, duplicate matches with confidence intervals in poker. Tests stop when the evidence is sufficient.
  4. Recordwith its error margin
    Accepted, rejected or inconclusive, every result goes into the log with its error margin.
  5. Chess so far26 accepted · 6 rejected · 1 inconclusive

About this project

aqueval is an independent research project on engines for games of perfect and hidden information. Code is written and tested in isolated environments; long runs execute on a single workstation. Results appear here once a milestone has been measured. The poker engine runs only in simulation and never on a live poker site.

About the author

  • Rust
  • Python · Numba
  • Search algorithms
  • Statistical testing (SPRT)
  • Game theory (CFR)
  • Neural networks (NNUE)
  • Performance engineering
  • Large-scale data pipelines
  • Differential testing
  • Reproducible experiments

Deniz

I direct aqueval’s research: setting goals, defining test protocols and making release decisions. The chess engine is developed with AI coding agents that write code and run tests. Results include both accepted and rejected changes.

Cite this work (BibTeX)
@misc{aqueval2026,
  author = {Deniz},
  title  = {aqueval: Engines for Games of
            Perfect and Hidden Information},
  year   = {2026},
  note   = {Working paper, updated 5 November 2026},
  howpublished = {Local research page}
}

Follow, verify, get in touch

Explore the chess-engine source and releases, or contact Deniz about methods and results. Poker results are documented in the supplied milestone reports.

Code and test log

Chess-engine source code, test history and documentation in the Quant repository.

Open the repository
Milestone updates

Versioned chess-engine releases and their documented changes.

View releases