Tour construction is delegated to the Solver trait. Consumers build a
SolveRequest that includes a start coordinate, visit duration (minutes), an
interest profile, a random seed for deterministic behaviour, and an optional
max_nodes pruning hint for candidate selection. Call SolveRequest::validate
to enforce the implemented invariants: non-zero duration, finite coordinates,
and a positive max_nodes value when set. Successful solvers return
SolveResponse, which packages the chosen Route and its aggregate score.
Invalid inputs must produce SolveError::InvalidRequest instead of panicking.
Placeholder solvers may return SolveError::NotImplemented until a backend is
available.[^6]