Skip to content

v1.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Sep 15:25
· 1 commit to main since this release

v1.5.0

Stable release · 2026-09-14

Coco 1.5 brings the correctness and portability work from v1.5.0-pre.1 together with new search features: guarded capture ProbCut, explicit principal-variation storage, root-aware time allocation, and SMP best-move voting. It retains the existing 512-unit NNUE and original search-parameter defaults.

What changed since Coco 1.4

The existing NNUE is retained. This release concentrates on search, correctness, protocol support and portability; it does not claim a gain from a newly trained network.

Area Changes in 1.5.0 What this provides
Search and move ordering Staged move picker, dedicated capture/quiet/evasion generation, restored PVS/quiescence/LMR guards and guarded capture ProbCut More structured move selection and a reduced tactical verification search before eligible cutoffs
Principal variations Explicit per-node PV storage and validated search lines Direct tracking of the selected continuation rather than relying only on a transposition-table chain
Time management Root-aware time allocation, best-move stability adjustments and bounded clock/search-limit handling Search budgets that respond to root-move stability; the remaining timeout observations are disclosed below
Parallel search Independent worker search state, corrected root-node accounting and weighted best-move voting Better coordination of Lazy SMP workers sharing a transposition table
Transposition table Clustered cache-line storage, generation aging, power-of-two indexing, lockless verification, fail-soft bounds, mate-score conversion and move retention More robust storage, replacement and reuse of search results
Board and NNUE state Checked accumulator stack, incremental occupancy and position fingerprints, network-safe rebuilds after EvalFile reload Less accumulator copying and stronger state consistency during search and network changes
Sliding attacks Optional BMI2/PEXT backend with a magic-bitboard fallback Hardware-specific acceleration with a portable fallback and a Use PEXT switch
Chess GUI support MultiPV, pondering, searchmoves, bounded mate searches, node/time limits, WDL output, current-move reporting and tablebase-hit telemetry More complete UCI analysis and game-play controls
Endgames and input handling Syzygy rule-50/score-band fixes, safe tablebase lifecycle, validated FEN/move/command input and corrected UCI declarations Safer endgame probing and rejection of malformed input without partial board mutation
Data generation and evaluation tooling Native self-play datagen, deterministic seeds, private worker TTs, exact record targets, buffered output, manifests and classical-feature tracing Reproducible training-data generation and evaluation experiments; standard engine play still uses NNUE
Distribution C++20 builds, embedded NNUE, runtime build identity and 13 architecture-specific binaries Easier installation and clearer identification of the engine/network being tested

The stable release includes the functionality introduced in v1.5.0-pre.1 plus the later ProbCut, explicit-PV, root-time and SMP-voting changes. These are descriptions of implemented behavior, not individual Elo estimates. The original search defaults are retained; no unvalidated SPSA parameter vector is presented as a strength improvement.

Strength at a glance

  • Approximately 2,977 Elo in the filtered Ordo calibration described below; this is an estimate under the test conditions, not an official CCRL rating.
  • 4,442 retained games, scoring 52.75%, after the stated pair exclusions and historical-opponent exclusion.
  • Conditional 95% bootstrap interval: 2,959.3–2,995.3, with fixed rating anchors. This does not include uncertainty in those anchors or transfer to other hardware, openings and time controls.
  • SPRT PASS against the 1.5 pre-release: 1,092 games, 55.08% score and an observed match estimate of about +35.4 logistic Elo. This is not a measured gain over the official 1.4 release.

The 1.4 opponent used a substituted network, so its 500–0 result cannot establish a valid version-to-version Elo gain. The complete original score table is retained for transparency.

Validation evidence

The retained SPRT console log reports a native logistic SPRT PASS against the 1.5 pre-release baseline at 1,092 games: 332 wins, 221 losses, 539 draws. The test used 10+0.1, one thread, 16 MiB hash, the same NNUE, and hypotheses [0, 5] Elo with alpha/beta 0.05. Final LLR was +2.96, exceeding the approximately +2.944 acceptance boundary.

The observed score was 55.08%, equivalent to approximately +35.4 logistic Elo in this match. This is a match estimate, not an official rating or a guaranteed gain at other time controls. The one-thread match does not measure the playing-strength contribution of SMP voting. The original PGNs and recovery archive are unavailable, so the recorded result cannot be independently replayed. See the SPRT report for the configuration and evidence limits.

The isolated native build passed the 477,035-node benchmark, UCI/search-limit checks, multi-thread lifecycle checks, 149 perft positions with 441 matching reference counts, and a search with a 10-second budget. Release-packaging checks also passed. Hosted validation passed all 13 platform builds, GCC/Clang protocol and perft checks, native Windows execution, and all 19 C++ fixtures with AddressSanitizer and UndefinedBehaviorSanitizer. The instrumented randomized-state test exercised 1,000 deterministic games. See the release-candidate validation run.

Release gauntlet results

The tournament completed 5,000 games, with 500 games against each of ten opponents, at 10 seconds plus 0.1 seconds per move. Coco used one thread and 16 MiB hash. Each opening was played with both colours. The runner used eight concurrent games on an Intel Core i5-12450H Windows 11 system, with no additional runner time margin; resign, draw, tablebase and maximum-move adjudication were disabled.

The actual PGNs contain 25 distinct starting FENs per opponent, each repeated for ten colour pairs. These repeated openings reduce the diversity of the sample; the bootstrap groups repetitions of each opponent/FEN together rather than treating every game as independent.

Original matchup scores

Opponent Games Coco wins Draws Coco losses Coco score Qualification
Cepimetheus-16 500 362 46 92 77.00%
Coco-1.4.0 500 500 0 0 100.00% Excluded from calibration: substituted network
Lynx-1.5.0 500 318 62 120 69.80%
Surveyor-ONE.1 500 292 70 138 65.40%
Sable-1.1.0 500 271 81 148 62.30%
Stash-25.0 500 215 93 192 52.30%
Dual-0.4.1 500 178 103 219 45.90%
Crustik-0.3.0 500 61 103 336 22.50%
Potential-3.0.0 500 185 94 221 46.40%
Noggin-2.1 500 121 97 282 33.90%

Filtered Ordo estimate

Release estimate: approximately 2,977 Elo, from a filtered Ordo fit over 4442 games (1971W / 1727L / 744D, 52.75%). Both games were removed from each of the 29 opening pairs containing a timeout or abandoned game, regardless of which engine lost. The 500 games against the substituted-network Coco 1.4 opponent are also excluded. The original games remain intact.

This is a local, conditional estimate, not an official CCRL rating. The fixed CCRL Blitz references are Lynx 1.5.0 = 2819, Sable 1.1.0 = 2933 and Stash 25.0 = 2932. A 1000-sample bootstrap of the remaining opponent/FEN clusters gives a conditional 95% percentile interval of 2959.3–2995.3 (seed 20260914). External-rating uncertainty, transfer to other conditions and systematic run defects are outside that interval. Excluding terminations after the run can introduce selection bias; filtering does not prove the rest of the run was free of contention.

Rank Engine Filtered Ordo rating Games Engine score
1 Crustik-0.3.0 3194.9 498 77.61%
2 Noggin-2.1 3097.7 492 66.57%
3 Dual-0.4.1 3004.0 494 53.85%
4 Potential-3.0.0 3001.2 492 53.46%
5 Coco-1.5.0-Dev 2977.0 4442 52.75%
6 Sable-1.1.0 2933.0 498 37.75%
7 Stash-25.0 2932.0 492 47.87%
8 Surveyor-ONE.1 2862.8 496 34.27%
9 Lynx-1.5.0 2819.0 480 30.73%
10 Cepimetheus-16 2765.2 500 23.00%

Scores in this rating table are from the named engine's perspective; the original matchup table uses Coco's perspective. Anchor ratings are fixed, and other entries are inferred within this gauntlet. These are not new official ratings for the opponents.

For comparison, the original nine-opponent fit used all 4500 games and estimated 2978.6 (2003W / 1748L / 749D, 52.83%). Its independent-game simulation error was ±16.6 and its opening-cluster bootstrap interval was 2960.8–2996.8; these belong to the unfiltered analysis, not the filtered headline. Single-anchor fits on the unfiltered sample ranged from 2948.1 (Stash) to 3021.0 (Sable), with Lynx at 2965.8. This spread is calibration sensitivity, not a confidence interval. Including the historical matchup gives 2503W / 1748L / 749D = 57.55% over all 5000 games.

Reliability observations

The PGNs record 4967 normal games, 32 time forfeits and one abandoned game. Coco lost 11 games on time (0.22% of its 5000 games). Opponent time losses were Lynx 10, Noggin 5, Potential 3, Stash 2 and Sable 1. The abandoned game was a Lynx connection stall, scored as a Coco win. No PGN termination is labelled an illegal-move loss; the full move text was not independently replayed through a second chess library.

Coco emitted 3547 warnings for PV continuation beyond threefold repetition and 828 beyond the fifty-move rule. These are displayed-line warnings, not 4375 illegal game moves. No Coco bestmove/PV-start mismatch was found in the warning tally. Other engines also generated PV warnings.

Concurrency was eight on an i5-12450H Windows 11 laptop, with no runner time margin. Other CPU workloads overlapped parts of the tournament. The time losses are real observations; their cause has not been isolated between engine timing and host scheduling. This report does not certify a clean, uncontended run. A lower-concurrency timing check and more distinct openings are recommended before making stronger release-strength claims.

The Coco 1.4 result uses a substituted external network and cannot establish a historical-version gain. See the full gauntlet report for engine identities, opening repetition and supporting results.

Engine and network

  • C++20 UCI engine with no built-in opening book.
  • Chess768 piece-square features, 512 hidden units per perspective, concatenated for the output layer.
  • Embedded NNUE: 789,508 bytes; SHA-256 392BE46C8E06C6D0CB6BEDF00D8E3D08950D11DAA883362DE98F0C1DEEE68055.
  • UCI identity: Coco v1.5.0. Fifteen public options; internal search-tuning options remain hidden from the GUI option list.
  • Expected deterministic five-position benchmark: 477,035 nodes. This is an identity/correctness check, not an Elo measurement.

Downloads and setup

This release provides 13 binaries for Windows, Linux and macOS. Choose a build supported by both your CPU and operating system:

Platform Build suffix Requirements
Windows / Linux x86-64-popcnt x86-64, SSE4.1 and POPCNT
Windows / Linux / Intel macOS x86-64-avx2 Above, plus AVX2
Windows / Linux x86-64-bmi2 Above, plus BMI2; benchmark PEXT on your CPU
Windows / Linux x86-64-avx512 Above, plus AVX-512F/BW/DQ/VL
Intel macOS x86-64-popcnt x86-64, SSE4.1 and POPCNT
Linux ARM64 arm64 / arm64-dotprod ARMv8 / ARMv8.2 with dot-product support
Apple Silicon macOS apple-silicon Apple M-series

Add the executable as a UCI engine in your chess GUI. The network is embedded; a separate file is unnecessary. EvalFile can deliberately load a compatible replacement. An external coco.nnue beside the executable can override the embedded network, so check the info string build output when reproducing a result.

The release manifest records each binary's source revision, hash, architecture, network identity, and whether its fixed signature was executed on the build runner. Cross-compiled Windows variants and unsupported runner instruction sets are not represented as individually runtime-tested. Checksums, Coco's GPL license, and the bundled Fathom license accompany the binaries.

Report crashes, illegal moves, time losses and malformed PVs through GitHub Issues, with the build identity, time control, thread/hash settings and a reproducible position or PGN. See the README for the full UCI option table and the changelog for version history.