Ten games, one new puzzle each, every day, forever. That is roughly 3,650 puzzles a year, and nobody here is going to author them by hand. So the interesting part of casualplay was never the games — it was the machine that feeds them.
Generation is the easy half
Every puzzle starts from a date seed. That single decision does most of the work: it means the day’s set is identical for every player in the world, it means we can regenerate any past day exactly, and it means a bug report that says “the puzzle on the 3rd was broken” is something we can reproduce rather than something we have to take on faith.
Validation is the half that matters
A generator will happily produce a puzzle with no solution, or four solutions, or one that falls apart the moment you look at it. So each candidate is handed to a solver that plays it properly.
- thread gets a Hamiltonian path search — the path must exist and the grid must be traversable.
- deduce gets a constraint solver that counts solutions. Exactly one, or it is thrown out.
- arc gets a trajectory search across the angle and power space, to confirm at least one shot lands.
- reconstruct and hue get their minimum move count computed, so the score has something true to measure against.
Anything that fails is discarded silently. Nobody sees it. There is no queue of “probably fine” puzzles waiting for a human to check them, because a human checking 3,650 puzzles a year is exactly the job we were trying not to create.
Nothing ships the night it is made
Survivors go into a rolling buffer that runs weeks ahead. This is the part that turns a clever script into something you can leave alone: if generation breaks tonight, we have weeks to notice before a player does.
The buffer is the difference between an automated pipeline and an unattended one.
And if the buffer ever does run dry, the day falls back to a known-good set from the archive. A repeat is a bad day. A blank screen is a broken product.