- Remove extra-edge generation and cross pieces; board is now a single random spanning tree (one unique route between every pair of cells, no loops)
- Update leak rendering to place droplets on exact open edges using DELTA/EDGE and render water/flash layers above tiles in the container
- Adjust mini preview tiles and difficulty config (drop `extra` param)
- Rework tutorial to explain tree structure, scattered dead ends, and branch-by-branch solving strategy
- Update verification tool: assert tree edge count, no 4-way cells, leaf distribution across rows, faucet row variety, and board randomness; replace cross-based fixture with a valid tree
Replace the single Hamiltonian-path model with a spanning-tree + extra-edges
approach that produces boards full of T-pieces, crosses and dead ends. The
win condition is now simply "zero leaks" — every socket matched to a
neighbour that opens back — instead of requiring one continuous path from
faucet to drain.
Key changes:
- Logic: generate puzzles via randomized Kruskal spanning tree plus tunable
extra edges per difficulty; add bitCount, countLeaks, and derived
angleFor/canonical rotation table
- Art: new tile textures for stub (dead end), T-piece, and cross;
tileKeyFor and angleFor now handle all five piece types
- Game: faucet and drain are fixed anchors (not rotatable); removed the
CONNECTED counter in favour of a simpler LEAKS stat; updated difficulty
tiers (6×6 through 10×10) with extra-edge counts; improved water
rendering contrast
- Tests: rewrite verify script for the new generation model (spanning tree,
connectivity, piece mix, no-leak solution); update smoke test to skip
anchor tiles
- Tutorial: updated rules, board reading guide, and tips for the branching
network variant