Solved at Scale
Cross-Checking the Solution
A solver answer becomes a certificate when independent computations agree. This repo's own arithmetic re-checks every constraint on the decoded schedule, its own enumeration counts every feasible schedule, and the solver's streamed exhaustive enumeration runs at build time too: the two counts must agree or the build stops.
Independent re-verification
This repo's own arithmetic re-checks all 25 constraints on the decoded schedule: 9 coverage rules, 12 at-most-one rules, and 4 load rules. Why: an independent check must not reuse the solver's code path, and any violation would stop the build rather than let a wrong schedule through.
Counting every schedule
The own enumeration counts 5184 feasible schedules: per day an assignment injects the 3 shifts into the 4 nurses, 24 day-patterns; across 3 days that is 13824 combinations, and the load filter keeps exactly 5184. The solver's own exhaustive enumeration also runs at every build, streaming every feasible solution, and its streamed count of 5184 must equal this repo's count or the build stops; every streamed schedule passes the same per-constraint re-checks. Why: two live, independent counts landing on the same integer is a certificate, not a cross-reference to a number someone recorded once.
Many right answers
There are 5184 equally valid schedules, so propagation alone cannot narrow this instance to one answer; the solver's search committed to one of them. Why: the earlier chain propagates outright to singletons, and the stuck toy shows propagation stalling so search must branch; here the space of fully feasible answers is simply large.
Diagram note
The grid is the same decoded schedule, N1 through N4 by D1 through D3, and the count in the caption is recomputed by the own enumeration on every build. Pixel positions are rounded for layout; every number shown is exact.