Cwtch 5
https://github.com/op12no2/cwtch/releases/tag/5
New engine releases & news H1 2026
Moderator: Ras
-
op12no2
- Posts: 560
- Joined: Tue Feb 04, 2014 12:25 pm
- Location: Gower, Wales
- Full name: Colin Jenkins
-
sgtqwq
- Posts: 4
- Joined: Sat Oct 11, 2025 1:35 pm
- Full name: Bingwen Yang
-
sgtqwq
- Posts: 4
- Joined: Sat Oct 11, 2025 1:35 pm
- Full name: Bingwen Yang
Re: New engine releases & news H1 2026
Sorry, this chess engine has a terrible bug that causes it to threefold repeat in half of the checkmating positions. I haven't fixed it yet, but a bugfix version will be released soon. Do not use the engine without win adjudication.sgtqwq wrote: ↑Mon Apr 06, 2026 3:09 pm Gecko 0.25!
https://github.com/sgtqwq/Gecko/releases/tag/v0.25
with a new NN training on Lc0 Data!
-
Gabor Szots
- Posts: 1544
- Joined: Sat Jul 21, 2018 7:43 am
- Location: Budapest, Hungary
- Full name: Gabor Szots
Re: New engine releases & news H1 2026
Pea 2.0 (a new, weak but actively developed engine)
https://github.com/WGCodings/Pea/releases/tag/v2.0
https://github.com/WGCodings/Pea/releases/tag/v2.0
Gabor Szots
CCRL testing group
CCRL testing group
-
ydebilloez
- Posts: 193
- Joined: Tue Jun 27, 2017 11:01 pm
- Location: Lubumbashi
- Full name: Yves De Billoëz
Re: New engine releases & news H1 2026
Belofte 2.2.0 (RD. Congo) has been released. Marginal gain of 40 elo in self-play but CCRL tests will tell more.
Still need some help with Android builds.
Full details of features in post and on sourceforge.net/projects/belofte/
Still need some help with Android builds.
Full details of features in post and on sourceforge.net/projects/belofte/
Yves De Billoëz @ macchess belofte chess
Once owner of a Mephisto I, II, challenger, ... chess computer.
Once owner of a Mephisto I, II, challenger, ... chess computer.
-
CMCanavessi
- Posts: 1145
- Joined: Thu Dec 28, 2017 4:06 pm
- Location: Argentina
Re: New engine releases & news H1 2026
Facón 1.3 - Yunque
https://github.com/CMCanavessi/facon/releases/tag/v1.3
+200 Elo over 1.2 (Ordo ~1900, gauntlet 2080 games at 2min+1sec)
Should be in the range of 1900-2000 now, if all goes well
Pre-work bug fixes
NMP depth floor (search.cpp): at depth == NMP_MIN_DEPTH (3), the NMP recursive call produced depth -1. With the corrected depth == 0 quiescence entry condition, this caused infinite recursion. Fixed: std::max(0, depth - 1 - NMP_REDUCTION).
depth <= 0 to depth == 0 (search.cpp): prerequisite for LMR. Negative depths from buggy reductions are now immediately detectable instead of silently entering quiescence.
Search
Late Move Reductions (LMR): quiet moves searched after the first 3 legal moves at depth >= 3 are searched at reduced depth. Formula: log(depth) * log(move_number) / 2.25, floored at 1. Re-searched at full depth if the reduced search raises alpha. Skipped for: captures, en passant, promotions, killer moves, in check.
History heuristic: history_[color][from][to] incremented by depth^2 on beta cutoffs. Replaces the flat ORDER_QUIET=0 score for quiet move ordering, improving LMR accuracy. Capped at 50,000 (below ORDER_KILLER2). Reset each search.
Aspiration windows: iterative deepening searches with a +/-50cp window around the previous score from depth 4+. On fail-low or fail-high, widens only in the failing direction and doubles delta. Full window used for depth < 4 and mate scores.
Evaluation
Pawn structure: five terms via bitboard operations -- isolated (-15cp), doubled (-15cp), backward (-12cp), passed (rank-scaled: 0/0/10/20/35/55/80/0cp), connected (+8cp). All computed symmetrically for both colors.
Mopup insufficient material guard: K+B vs K and K+N vs K are theoretical draws. Both exceed MOPUP_THRESHOLD (300cp) and previously activated corner-chasing. mopup_eval() now returns 0 when the strong side has exactly one minor piece.
Time Management
Quadratic extension scaling: extend_time() factors pre-scaled by (depth^2 / EXTENSION_FULL_DEPTH^2). PV changes at depth 2-9 have near-zero effect; extensions at the engine's operating depth (14+) apply the full factor. EXTENSION_FULL_DEPTH = 18.
accumulated_ext_ cap removed: the 2.0x cap consumed the budget at low depths before real extensions at depth 14+ could fire. The soft limit is now bounded only by the hard limit.
Easy move reduction (reduce_time): mate found (x0.05, one-shot), forced move (x0.1), PV+score stable >= 7 iterations at depth > 12 (x0.40, one-shot). Cancelled before extensions so they act on the full soft limit.
Emergency hard limit: when depth >= 25 and the extended soft would exceed hard, hard is raised to match (capped at 50% of raw remaining clock). Both limits rise together on subsequent extensions. Only triggered by real instability -- stable positions at depth 25+ would have already fired easy-move reduction.
Infrastructure
Centralized version system: PROJECT_VERSION and FACON_CODENAME in CMakeLists.txt control the binary name, startup banner, UCI id, and Windows version resource. To release: change codename from "dev" to "Yunque" and recompile.
perft command: perft N counts leaf nodes, perft divide N gives per-move breakdown. Bulk-counting at depth 1. Verified: startpos depth 5 = 4,865,609.
bitboard.cpp init message gated: suppressed when launched by GUI or automated tool.
Bug fixes
Aspiration window fail-low: the old handler set beta_asp = (alpha_asp + beta_asp) / 2, squeezing the upper bound. On re-search via TT/LMR interactions, this triggered artificial fail-highs (yo-yo effect). Fixed: widen only in the failing direction.
Mate reduction one-shot: is_mate_score() is true on every iteration after a mate is found. reduce_time(0.05) firing repeatedly collapsed the soft limit exponentially (x0.05^N). Fixed: mate_reduction_applied_ one-shot guard.
Race condition in cmd_ucinewgame(): TT.clear() could race with TT.probe()/TT.store() in the search thread. Fixed: join the search thread first.
Castling SAN check/mate: move_to_san() returned immediately for castling without checking if it delivers check or mate. Fixed: castling now falls through to the check/mate detection block.
seen[] guard mismatch: array enlarged to 1154 slots in 1.2, but the insertion guard still stopped at 1152. Updated to match.
Checksums (SHA1)
a8a681ae3c6129205f9e98bcc86adadf2d33b70a facon-1.3
3d51dc6625f69ca24d62d02d6cd72a67c254bb06 facon-1.3.exe
This release was a big step forward, but I've left several things for 1.4, mainly in Time Management. I'm still not 100% happy with how it behaves, but it's way better than before. No time losses and no illegal moves seen during testing.
Finally the engine is starting to crack (or getting close to) the 2000 elo barrier.
https://github.com/CMCanavessi/facon
https://github.com/CMCanavessi/facon/releases/tag/v1.3
+200 Elo over 1.2 (Ordo ~1900, gauntlet 2080 games at 2min+1sec)
Should be in the range of 1900-2000 now, if all goes well
Pre-work bug fixes
NMP depth floor (search.cpp): at depth == NMP_MIN_DEPTH (3), the NMP recursive call produced depth -1. With the corrected depth == 0 quiescence entry condition, this caused infinite recursion. Fixed: std::max(0, depth - 1 - NMP_REDUCTION).
depth <= 0 to depth == 0 (search.cpp): prerequisite for LMR. Negative depths from buggy reductions are now immediately detectable instead of silently entering quiescence.
Search
Late Move Reductions (LMR): quiet moves searched after the first 3 legal moves at depth >= 3 are searched at reduced depth. Formula: log(depth) * log(move_number) / 2.25, floored at 1. Re-searched at full depth if the reduced search raises alpha. Skipped for: captures, en passant, promotions, killer moves, in check.
History heuristic: history_[color][from][to] incremented by depth^2 on beta cutoffs. Replaces the flat ORDER_QUIET=0 score for quiet move ordering, improving LMR accuracy. Capped at 50,000 (below ORDER_KILLER2). Reset each search.
Aspiration windows: iterative deepening searches with a +/-50cp window around the previous score from depth 4+. On fail-low or fail-high, widens only in the failing direction and doubles delta. Full window used for depth < 4 and mate scores.
Evaluation
Pawn structure: five terms via bitboard operations -- isolated (-15cp), doubled (-15cp), backward (-12cp), passed (rank-scaled: 0/0/10/20/35/55/80/0cp), connected (+8cp). All computed symmetrically for both colors.
Mopup insufficient material guard: K+B vs K and K+N vs K are theoretical draws. Both exceed MOPUP_THRESHOLD (300cp) and previously activated corner-chasing. mopup_eval() now returns 0 when the strong side has exactly one minor piece.
Time Management
Quadratic extension scaling: extend_time() factors pre-scaled by (depth^2 / EXTENSION_FULL_DEPTH^2). PV changes at depth 2-9 have near-zero effect; extensions at the engine's operating depth (14+) apply the full factor. EXTENSION_FULL_DEPTH = 18.
accumulated_ext_ cap removed: the 2.0x cap consumed the budget at low depths before real extensions at depth 14+ could fire. The soft limit is now bounded only by the hard limit.
Easy move reduction (reduce_time): mate found (x0.05, one-shot), forced move (x0.1), PV+score stable >= 7 iterations at depth > 12 (x0.40, one-shot). Cancelled before extensions so they act on the full soft limit.
Emergency hard limit: when depth >= 25 and the extended soft would exceed hard, hard is raised to match (capped at 50% of raw remaining clock). Both limits rise together on subsequent extensions. Only triggered by real instability -- stable positions at depth 25+ would have already fired easy-move reduction.
Infrastructure
Centralized version system: PROJECT_VERSION and FACON_CODENAME in CMakeLists.txt control the binary name, startup banner, UCI id, and Windows version resource. To release: change codename from "dev" to "Yunque" and recompile.
perft command: perft N counts leaf nodes, perft divide N gives per-move breakdown. Bulk-counting at depth 1. Verified: startpos depth 5 = 4,865,609.
bitboard.cpp init message gated: suppressed when launched by GUI or automated tool.
Bug fixes
Aspiration window fail-low: the old handler set beta_asp = (alpha_asp + beta_asp) / 2, squeezing the upper bound. On re-search via TT/LMR interactions, this triggered artificial fail-highs (yo-yo effect). Fixed: widen only in the failing direction.
Mate reduction one-shot: is_mate_score() is true on every iteration after a mate is found. reduce_time(0.05) firing repeatedly collapsed the soft limit exponentially (x0.05^N). Fixed: mate_reduction_applied_ one-shot guard.
Race condition in cmd_ucinewgame(): TT.clear() could race with TT.probe()/TT.store() in the search thread. Fixed: join the search thread first.
Castling SAN check/mate: move_to_san() returned immediately for castling without checking if it delivers check or mate. Fixed: castling now falls through to the check/mate detection block.
seen[] guard mismatch: array enlarged to 1154 slots in 1.2, but the insertion guard still stopped at 1152. Updated to match.
Checksums (SHA1)
a8a681ae3c6129205f9e98bcc86adadf2d33b70a facon-1.3
3d51dc6625f69ca24d62d02d6cd72a67c254bb06 facon-1.3.exe
This release was a big step forward, but I've left several things for 1.4, mainly in Time Management. I'm still not 100% happy with how it behaves, but it's way better than before. No time losses and no illegal moves seen during testing.
Finally the engine is starting to crack (or getting close to) the 2000 elo barrier.
https://github.com/CMCanavessi/facon
Follow my tournament and some Leela gauntlets live at http://twitch.tv/ccls