The finale closes the loop - generate a puzzle from a seed, confirm it is well-formed, and solve it back to the grid it came from. Every part of the library, working together, from one seed.
Generate a seeded puzzle, confirm it is unique, and solve it back to its source grid.
The last spec ties the whole library into one story. From a single seed the generator builds a full grid, digs holes while a unique solution survives, and hands back a proper 26-clue puzzle; uniqueness confirms it is well-formed; difficulty rates it; and the solver, given only the sparse puzzle, reconstructs the exact full grid it was carved from. Generation and solving are inverses, and here you watch them close the loop on themselves.
Look back at what runs in that one line. An 81-cell board with its 27 units and 20 peers per cell; candidate sets and a candidate grid; naked and hidden singles propagating to a fixpoint with contradiction detection; most-constrained-cell backtracking search; solution counting; a seeded generator and shuffle. Together they are a genuine, complete Sudoku engine - Norvig’s constraint-propagation-and-search method, built from first principles - that solves any valid puzzle, judges it, and makes its own. That is a real solver, and it is yours.
puz := Generate(7)// IsUnique(puz) == true; Difficulty(puz) is Easy or Hardsol, ok := Solve(puz)// ok == true, IsComplete(sol) && IsValid(sol)// sol == FullGrid(7): the generator and solver close the loop