ENCODER_INDEX_SEARCH spins indefinitely and never detects Z, but raw GPIO polling shows clean transitions

Controller: O Drive S1 firmware v0.6.10
Motor: T-Motor U7 KV480, 7 pole pairs
Encoder: AMT-103 V incremental encoder, A/B/Z wired to G3/G9/G10

Problem:
When I run odrv0.axis0.requested_state = AxisState.ENCODER_INDEX_SEARCH, the motor spins continuously and does not find the encoder index.

I wrote a small script that polls odrv0.get_gpio_states() and extracts bit 10 while manually spinning the motor shaft by hand — this clearly shows Z going from 0→1→0 once per revolution, so the physical signal and wiring appear to be working correctly at the raw GPIO level. I do notice that I have to spin the motor very slowly for the Z index to be found.

For automatic search, I set axis0.config.calibration_lockin.vel across a wide range (from very fast [default] down to very slow [0.05 units]) — no change in behavior, it still never detects the index.

Since the raw GPIO clearly sees a clean transition on G10, but the interrupt-based index search never picks it up, is there something else needed to properly register the index interrupt on this pin for the S1 specifically? Is there a known issue or additional config step I might be missing between “raw GPIO reads fine” and “commutation_mapper actually detects it as an index event”?

Interesting! I’m guessing this is just a config issue – would you mind posting that? odrivetool backup-config config.json