Misty, an open-source fog of war engine on the Obscuro architecture (GPL, Python + Rust)

Discussion of chess software programming and technical issues.

Moderator: Ras

brianhliou
Posts: 5
Joined: Thu Aug 27, 2026 1:09 am
Full name: Brian H. Liou

Misty, an open-source fog of war engine on the Obscuro architecture (GPL, Python + Rust)

Post by brianhliou »

I've written up Misty, an open-source fog of war (dark chess) engine: GPL, Python with a Rust core, pip install misty-chess. It follows Obscuro (Zhang and Sandholm, ICLR 2026, arXiv 2506.01242), the first superhuman agent for the game, which ships no code. Misty keeps every board consistent with what it has seen, samples 32 of them, and runs counterfactual regret minimization (CFR) over one tree the samples share, with Stockfish at depth 1 on the leaves. The other open implementation I know of is opowell's obscuro-chess, in JavaScript.

This forum has been near the game before: hgm's Dark Chess thread (2011, viewtopic.php?t=37571) on how WinBoard would show an engine only what it can see, and jorose (2021, viewtopic.php?t=77390&start=10) doubting that the heads-up hold'em methods would work here "due to the much larger state space." Obscuro runs those methods on a sample of the boards that fit the evidence.

The part I'd most like checked is where a 5 s move goes, averaged over 913 moves on the site:

Code: Select all

equilibrium pass        3.91 s   69%
Stockfish on new leaves 0.61 s   11%
rest of expansion       0.18 s    3%
leaf selection          0.16 s    3%
scope                   0.06 s    1%
outside the search      0.68 s   12%
Misty's CFR walks the whole tree on every iteration. The paper uses partial pruning (Brown and Sandholm 2015), so an iteration usually costs less than the tree's size. That gap is why Misty's tree stops at 2,000 leaves and samples 32 worlds where the paper uses a few hundred, and it's what I'm building next. The write-up lists every other departure from the paper with its measurement.

Two asks. If you've pruned CFR on a tree that grows during search, I'd like to hear what bit you: that's the next build. If you play it, send me the game and the move that looked worst; each one becomes a test. An engine that speaks the JSON protocol can also play Misty on the server, and the result gets published either way.

Write-up: https://brianhliou.com/posts/misty-fog-of-war-engine/
Source: https://github.com/brianhliou/misty
Play it in a browser: mistboard.com