Undecided

handling upper and lower case

Font and french grades are case sensitive 8A is not 8a. Y.D.S. is not case sensitive 5.10a is 5.10A. Y.D.S. can be truncated 10a is the same a 5.10a. Y.D.S. gets messy 10a/b could be the same as 5.10a/5.10b What about 5.10d/11a vs 5.10/11 vs 5.10+ vs 5.11- or (nightmarishily 5.10++) to some extent this can be mitigated/handled with comparison functions and sanitation.

    registerPreMatch(scale, series, fn(outside, inside)) {
    }
  
it might be best handled with an grade input. similar to how a date-time input manages complexity around date and time formats.

TODO: maintain historical XYZ and convey the skew to people interested in conversion
[I think i meant that storing 8A as an integer, means you can never adjust your conversions to align with other scales. 8A, must be stored a 8A.]

Do you know what your users mean?

Is a 5.10a for user#9105 the same as a 5.10- for user#803? Plain text doesn't convey the difference. Use a grade input.

Some conversions aren't worthwhile

Detect UK trad grading and avoid trying to convert it
a commit message from the ClimbingGradeConversionBot