We build difficulty ladders for every puzzle we ship, because "Hard" has to mean something or it is decoration. Building the one for Bridgework — Hashiwokakero, the bridges puzzle — is where we learned we had been measuring the wrong thing.
The mistake
The first rater asked, for each solving technique: did it fire while solving this board? Boards that needed the fancy techniques are hard, boards that did not are easy. Obvious.
It produced nonsense. The isolation rule — the deduction that stops you from closing off a sub-network of islands from the rest — fired on a median of one time per board. Nearly every board triggered it. By that measure, nearly every board was hard.
But those boards were not hard. Plain island arithmetic would have finished them anyway. The isolation rule fired, contributed a deduction, and that deduction was one the solver could have reached three other ways. A technique firing tells you it was applicable, not that it was needed.
The fix, in one sentence
Rate a technique by whether removing it breaks the solve, never by whether it triggers.
Switch the technique off. Re-run the solver. If the board is still solvable, the technique was not load-bearing for that board. If the solver now stalls, it was.
That is more expensive — you re-solve once per technique per board — but for a generator running in milliseconds it is affordable, and it is the difference between a ladder and a decoration.
Two findings only necessity-rating could produce
There is no beginner tier below island arithmetic. We had assumed there would be a gentle bottom rung where simple saturation reasoning — an island whose remaining capacity exactly matches its available neighbours — was enough on its own. It never is: 0 boards out of 1,250 were solvable by saturation alone. So we did not build that tier. Measuring it saved us designing a difficulty level that cannot exist.
And the second one is the opposite mistake. We nearly cut the isolation rule entirely. Asking "can isolation reasoning alone solve this board?" gives 0 per cent — it is never sufficient by itself, so it looks like decoration.
But asking whether boards are solvable without it: 138 of 300 boards are deduction-solvable only when isolation reasoning is permitted inside the contradiction search. It is load-bearing on nearly half the catalogue while never once being the finishing move.
A technique can be essential without ever being the step that completes the puzzle. The sufficiency question said "cut it". The necessity question said it carries half the boards. Only one of those questions was worth asking.
The honest ladder that came out
- Easy and Medium are both settled by counting. They differ only in size.
- Hard and Expert additionally force proof by contradiction — one or two chains for Hard, three or more for Expert.
Which means the truthful thing to tell a player is: Medium is a bigger Easy, not a harder one. That is less flattering than a four-rung ladder of escalating cleverness, and it is what the measurement says, so it is what the game says.
Some other things we measured about Hashi generation
Generate by growing, then reject. Grow a connected bridge layout, read the clue numbers off it, then test uniqueness. The uniqueness rate falls sharply with size — 53 per cent at 7×7 down to 15 per cent at 15×15. Accept rates by difficulty band come out at 48 / 23 / 8 / 4 per cent, at 0.1 / 0.2 / 1.1 / 4.0 milliseconds. Fast enough to generate at play time with no puzzle bank, which is the same place our ball sort solver ended up.
No Easy or Medium board admits a satisfied-but-disconnected layout. On a small board, meeting every island's number connects everything for free. The near-miss where you satisfy every clue and still have two separate islands only becomes possible from Hard upward — we found it in 16 of 40 sampled boards there. So the tutorial copy does not warn about it on small boards, because on small boards it cannot happen.
arr.sort(() => rnd() - 0.5) is a determinism bug, not just a bad shuffle.
That comparator is not a valid ordering, so the result depends on the engine's
sort implementation. For a daily puzzle that means a different board in different
browsers on the same date. Seeded Fisher–Yates, always.
The testing lesson that nearly hid all of this
Two of the most interesting rules in the suite — bridge crossings, and the disconnected near-miss above — silently skipped. No qualifying example existed on the first board the test tried, so the test found nothing to assert, asserted nothing, and reported green.
A skipped test proves nothing and looks exactly like a passing one.
The fix: make the suite search for a qualifying case, then assert that one was found, and only then assert the behaviour. The failure mode you are protecting against is not "the rule is wrong" — it is "the rule was never examined".
That search is also what produced the Easy/Medium finding above. We only learned that small boards cannot exhibit the near-miss because we forced the suite to go looking for one and it came back empty across an entire difficulty band. The test that had to hunt for its own input found something the rater never would have.
Play the result, free and in the browser: Bridgework · how to play
Others rated the same way: Star Grid · Daily Sums · Shikaku · Nonogram