You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`KabschCoplanar`| Kabsch with coplanar points doesn't crash, produces finite pose (rotation underdetermined around normal axis) |
108
108
|`LargeQuatNoOverflow`|`quatrotatevector` with very large quaternion components doesn't overflow |
109
+
|`AggregateErrorOverCountGate`|`sqrtf(sum/cnt)` compared against a status gate: `cnt==0` must never take the success branch; finite `sum`/`cnt>0` always yields finite `sensor_error`; the gate's success/failure decision is self-consistent with `sensor_error <= max_cal_error`|
109
110
110
111
`quatnormalize(zero)` and `normalize3d(zero)` produce NaN (documented, not a crash). Callers that may receive zero-magnitude input must guard against NaN propagation at their own boundary.
111
112
113
+
`AggregateErrorOverCountGate` is a regression test for the `mpfit_nan_guard` gap (Stagehand project, `poser_mpfit.c::solve_global_scene`): two existing guards filtered non-finite *inputs* into the GSS error accumulator, but nothing checked the *output* of `sqrtf(stats.sensor_error / stats.sensor_error_cnt)` before the success/failure branch. When every measurement was filtered upstream, `sensor_error_cnt` reached 0, producing `NaN`, which compares false against any threshold — so a 0-measurement solve silently took the success branch and poisoned the Kalman filter. The test isolates the divide-then-gate arithmetic so any optimizer code with the same shape (`status_failure || !isfinite(x) || x > threshold`) is exercised without needing a full `SurviveContext`/GSS scene fixture.
0 commit comments