Custom HR zone range collapses to a single BPM when one end has a non-numeric zone ID (ZX)

Steps to reproduce

  1. Set up custom HR zones for Run with the IDs Z1, Z2, ZX, Z3, ZY, Z4, Z5 (80/20 style, based on LTHR).
  2. Create a planned run with a step that uses a zone range with ZX-Z3:
   - RPE 5-6 Easy 30m CZZX-CZZ3 HR
  1. See the HR printed wrong
  2. This HR is synced to device also.

Expected vs. actual behaviour

  • Expected: the 30m step targets the span from the bottom of ZX to the top of Z3.
  • Actual: the target is a single value, 156–156 bpm, which looks like the boundary between ZX and Z3. Same failure with ZX at the upper end of a range (e.g. CZZ2-CZZX).
  • Ranges between numeric IDs work fine: CZZ2-CZZ3 HR gives the correct span.
  • Renaming the zone ID from ZX to Z23 makes the range work. So the parser seems to fail when a range endpoint has a non-numeric ID.

Device & browser

  • Intervals.icu web

Screenshots