Found by the #46 characterization sweep (PR #101; row-level detail in docs/ACCURACY_CHARACTERIZATION.md, Contract findings appendix).
Behavior: scalar paths propagate NaN inputs correctly; the batch (span/SIMD) paths of uniform, gamma, chi-squared, laplace, pareto, weibull, beta, and von Mises instead return finite, plausible-looking values — 35 sweep rows total. Worst class: uniform batch pdf(NaN) returns the full in-support density (1.0, 500.0, …) because the NaN range-comparison silently takes the in-range branch; pareto batch cdf(NaN) returns 0.9992….
Why it matters: garbage-in-plausible-out is silent data corruption for any consumer feeding unvalidated data through the batch API. Gaussian/lognormal/exponential batch paths propagate correctly, so this is per-kernel mask handling, not a framework limitation.
Fix shape: per-kernel — ensure the range/support masks classify NaN lanes into the NaN-propagating branch (typically: blend the input back for x != x lanes, the pattern used for the sin(±0) fix in #95). Fail-first per the doctrine: regression gates asserting NaN→NaN on every batch path, demonstrated failing against the unfixed kernels first.
Independent of this milestone's new-distributions theme — placed here as the next active milestone; could be pulled into a patch release if one is cut earlier.
🤖 Generated with Claude Code
Found by the #46 characterization sweep (PR #101; row-level detail in
docs/ACCURACY_CHARACTERIZATION.md, Contract findings appendix).Behavior: scalar paths propagate NaN inputs correctly; the batch (span/SIMD) paths of uniform, gamma, chi-squared, laplace, pareto, weibull, beta, and von Mises instead return finite, plausible-looking values — 35 sweep rows total. Worst class: uniform batch
pdf(NaN)returns the full in-support density (1.0,500.0, …) because the NaN range-comparison silently takes the in-range branch; pareto batchcdf(NaN)returns0.9992….Why it matters: garbage-in-plausible-out is silent data corruption for any consumer feeding unvalidated data through the batch API. Gaussian/lognormal/exponential batch paths propagate correctly, so this is per-kernel mask handling, not a framework limitation.
Fix shape: per-kernel — ensure the range/support masks classify NaN lanes into the NaN-propagating branch (typically: blend the input back for
x != xlanes, the pattern used for the sin(±0) fix in #95). Fail-first per the doctrine: regression gates asserting NaN→NaN on every batch path, demonstrated failing against the unfixed kernels first.Independent of this milestone's new-distributions theme — placed here as the next active milestone; could be pulled into a patch release if one is cut earlier.
🤖 Generated with Claude Code