Call f1verse.pit_exchanges(race). It pairs the stops that actually traded track position and returns a verdict per exchange, with neutralised laps excluded.
>>> f1verse.pit_exchanges(race)[0]
{'attacker': 'RUS', 'defender': 'LEC', 'verdict': 'undercut', ...}
A stop under a safety car is not an undercut, and counting it as one inflates every strategy summary built on top. Neutralised laps are excluded by default rather than behind a flag.
What an undercut is worth is track-specific: f1verse.circuit_profile(2026, 13) reports pit loss split by track state — {'normal': 25.43, 'sc': 16.11, 'vsc': 18.4}.