Good question. Honestly, most of the specific technical choices - bitboards, magic move generation, the NNUE evaluation, the search techniques like null-move and LMR, the SIMD inference - were suggested by the AI. My input was mostly at the level of goals and direction: "make it stronger," "add a neural network trained on self-play," "make it faster," "let's try to reach 3000," and so on. I made the judgment calls - which ideas to pursue, whether a result was a real gain or just noise, when to stop chasing something - and crucially I ran all the actual training and testing on my own hardware and fed the results back, which is where a lot of the real decisions happened (a couple of "improvements" turned out to be no better and got dropped after testing).Uri Blass wrote: ↑Tue Jun 16, 2026 2:18 amI wonder if the technical details that you mentioned like Bitboards + magic move generation are things that the AI suggested or things that you suggested to the AI to do when the AI wrote the things based on your suggestions(or maybe part based on your ideas and part based on the AI suggestions how to build a chess engine.Dylan wrote: ↑Sun Jun 14, 2026 12:08 pm Hi all,
I'd like to share Sable 1.6, a UCI engine I built over about a week.
Full disclosure up front, because it's part of why I'm posting it: the code was written by an AI (Anthropic's Claude) working under my direction. I designed the approach, ran all data generation, training and testing on my own hardware, debugged the pipeline, and verified strength at every step. The NNUE was trained from zero on self-play data generated on my own PC (i7-11700K + RTX 3070) — no external data, no pretrained weights, and no code derived from another engine. I'm releasing it partly to show what one person and a current AI model can build together in a few days.
Repo (MIT — source + net + training scripts):
https://github.com/dylan2554/sable
Technical summaryStrength — single-threaded, the way CCRL tests. Triangulated against engines with published CCRL Blitz ratings, under fair conditions (single thread both sides, equal 128 MB hash, 2'+1"):
- Bitboards + magic move generation (perft-verified, incl. Kiwipete)
- PVS / alpha-beta, transposition table, null-move, LMR, singular + double extensions
- Reverse-futility / futility / razoring, late-move + history pruning, SEE pruning
- Killers, counter-moves, butterfly + continuation history (with maluses)
- Quiescence with SEE filtering, delta pruning, and quiet checks
- Lazy SMP (1–16 threads)
- NNUE 768->512x2->1, clipped-ReLU, int16 quantized, AVX2 incremental inference
- Net trained across 4 self-play generations (each generation regenerates data using the previous, stronger net to label positions, then retrains)
The anchors agree on roughly ~3200 CCRL single-threaded. This is my own estimate, not an official listing — I'd be very grateful if anyone is willing to test it for a list.Code: Select all
Opponent (CCRL Blitz) Sable score Games Implied Inanis 1.6.0 (~3000) 70% 100 ~3150 Stash v27 (~3057) ~76% 180 ~3260 Stash v30 (~3166) ~54% 180 ~3195 Stash v32 (~3252) ~43% 180 ~3200
NotesFeedback very welcome — this is my first released engine and I'd love to hear how it does on other hardware and time controls.
- Binaries are unsigned, so Windows SmartScreen will warn; or build from source: [c]g++ -O3 -mavx2 -pthread sable.cpp[/c]. A non-AVX2 fallback build is also included.
- Keep [c]sable.nnue[/c] next to the executable — it loads automatically.
Thanks!
So it's fair to say the chess-engine know-how came largely from the model, and my role was more director, operator and tester than architect. That division is honestly part of what I found interesting about the whole thing.