2026-05-08
One belief bug looked smaller than it was.
Black captured a white bishop on e2 with a rook. White could see the rook through the fog after the capture. But the belief viewer still showed the white bishop on e2, and did not update the black rook into the square.
At first glance that sounds like a bad visualization. It was deeper than that. The engine had modeled the material fact but not the occupancy fact.
In fog chess, a hidden capture gives you more than “one of my pieces disappeared.” It can also give you a board-state fact: the capturing opponent piece now occupies the landing square. If the observation system only removes the captured friendly piece, belief accounting can remain superficially plausible while the particle boards become illegal relative to what the player just observed.
That split mattered again in later annotated games. Hidden captures on c7, e7, and a7 exposed the same shape: the bot knew material had changed, but the particle generator did not preserve the landing-square constraint strongly enough.
The fix was to make opponent capture landing a first-class field in the observation stream. Belief repair, generic CSP reseeding, and the hard-fact validator all had to carry it. After that, the targeted replay for the annotated game went clean: the hard-observation check found zero violations where the previous run had repeated hidden-capture landing misses.
This is why the particle generator is becoming its own subtrack inside the engine project. It is not just a helper that samples plausible boards. It is a sub-engine with a contract: given the stream of observations, it must not emit worlds that contradict hard facts.
A fog observation can contain separate material and occupancy facts; modeling only the disappeared piece preserves accounting while losing the board-state constraint.