Split classify() into reusable pieces: is_so_robot_type() for the robot_type
name test, and encoding_from_bounds() as the single source of truth for the
degrees_old/degrees_new/normalized/radians decision from per-joint min/max
(layout-agnostic, so v2.1 episodes_stats and v3.0 stats.json both feed it).