RippleEffect

Every outlined region of s cells holds 1 to s, each exactly once. And the rule it is named for: if the same value k shows up twice in one row or one column, the two cells must be more than k apart — a 1 needs one clear cell between them, a 5 needs five. Click a cell to cycle through its region's values, or select it and type a digit.

A row is not one graph, it is one graph per value

In Sudoku a row is an all-different clique and stays that clique no matter which digit you are holding. Here the row splits into overlapping windows of width k+1, and the window depends on k: the conflict graph for 1s (neighbours only) shares no edges with the graph for 5s beyond its own. One board carries as many line-conflict graphs as it has distinct values, and a propagator that only knows about the row cannot express any of them.

The partition is already the puzzle

Before a single number is written, the region partition can be unsatisfiable. The smallest example: two size-1 regions sitting side by side. Both are forced 1s, one step apart, and 1s need a gap. The counting version is bigger and does far more damage — every region of size v or more must spend exactly one v, while each row holds at most ⌈n/(v+1)⌉ of them. Cut a 6×6 board into eighteen dominoes and it is over: eighteen regions want a 2 and the board has room for twelve.

Most randomly drawn partitions die this way. The numbers are in the repository's stats output, and they are the reason the generator draws a skeleton and asks "does this have any solution" before it ever thinks about givens.

The strongest rule never shows up in a difficulty rating

Demand against capacity, applied line by line, is the sharpest thing in this solver — and on a board that already carries its givens it decides almost nothing extra, because by then the cheaper rules have got there first. Not one board in the shipped bank is labelled lines. Its whole contribution is upstream, on the skeleton, deciding which boards get to exist. A rule can be indispensable to the generator and dead weight to the solver, and the difficulty column will never tell you.

Givens are monotone, skeletons are not

A given is written on a cell whose value the intended solution already fixes, so adding one cannot change that solution — it can only remove rivals. Termination is free: in the worst case every cell becomes a given. The partition has no such courtesy, which is why it is drawn first, tested, and thrown away wholesale when it fails.