The design is built with na.action = na.pass, so a missing predictor or
response survives into X / y. No fitter drops incomplete cases, so an
NA/NaN/Inf would propagate into the C++ kernels as a NaN estimate. Fail
loudly with the offending row instead.
Details
Reached from tulpa(), from the direct beta-only doors, and from
.validate_glm_design(), which is what carries it to every fitter taking a
(y, X, n_trials) bundle.