#675 (fixing #673) makes the shift split keep one vector per real, simple eigenvalue and always read both shifts when k ≥ 2. That recovered 5 regular branches. As a side effect, at singular poses (σ_J < 1e-4) there are now more loose lm-rescued points across #663's ~31k-pose sample: Python 826 → 1420, native 778 → 1363. Each closes FK within the 1e-5 contract but sits about 1e-3 to 1e-2 from a true branch: clutter in the solution set, not wrong answers. One piper wrist-lock point moved 0.05 along its continuum and now closes only to 4e-6.
Fix direction: drop a rescued candidate when it lies on, or within its own error band of, a continuum or branch that is already returned (the #667 slide plus #604 same-root dedup), or when an exactly certified branch dominates it. Measure on the same sample; no regular-root loss and no uniform-pose slowdown.
#675 (fixing #673) makes the shift split keep one vector per real, simple eigenvalue and always read both shifts when k ≥ 2. That recovered 5 regular branches. As a side effect, at singular poses (σ_J < 1e-4) there are now more loose
lm-rescued points across #663's ~31k-pose sample: Python 826 → 1420, native 778 → 1363. Each closes FK within the 1e-5 contract but sits about 1e-3 to 1e-2 from a true branch: clutter in the solution set, not wrong answers. One piper wrist-lock point moved 0.05 along its continuum and now closes only to 4e-6.Fix direction: drop a rescued candidate when it lies on, or within its own error band of, a continuum or branch that is already returned (the #667 slide plus #604 same-root dedup), or when an exactly certified branch dominates it. Measure on the same sample; no regular-root loss and no uniform-pose slowdown.