A solver fills a few rows for free, then hits a wall in the middle of the board. Here's the mechanism: a scarce piece spent in the wrong place, rows ago.
Fill the board top-left to bottom-right and every new cell already knows two
of its colors: the north color from the piece above, the west color from the
piece to the left. The cell needs an unused piece that can show that exact
pair. Those demands are scarce, with only about three possible pieces on
average, and 47 of them have just one.
So a board that looks healthy, most pieces still in the box, can already be
doomed. Somewhere back up the board, the single piece that could ever serve
an upcoming cell was used for something else. When the solver finally reaches
that cell, there's nothing to place.
A tempting fix is a global check: do the remaining pieces still cover the
remaining cells? It doesn't help. Globally the supply is fine; the failure is
one scarce piece misallocated, not a shortage. So a global lookahead sees
nothing wrong right up until the cell turns out to have no server, which is
why this wall resisted so many attempts to prune it early.
Set this beside no forced moves and the trap
is complete. Every piece has dozens of places it could go, so the solver is
never told where a scarce piece must be saved, yet each scarce piece has
exactly one demand it must be saved for. Freedom to place, no guidance on
where to save.