546fdd96b5
The previous code used `if not mm_history:` to decide whether to fall back to get_training_status(). If the maxmet API returned a non-empty list with no valid vo2max values (or a non-list type), the fallback was skipped and nothing stored. Changes: - Normalise mm_raw: only use it if it's a list (handles dict/None responses) - Check valid_from_range: fall back to training_status whenever no usable value was found in the range query, regardless of whether it returned entries - Upgrade all related log lines to INFO so the result is visible without debug mode - Guard the entry loop against non-dict items Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>