Сохранённая оценка отдавала search_radius_m=null, и карта рисовала круг по
превью-радиусу 1 км. Прод 2026-08-11 (оценка 4c20518f, Советская 51):
relaxations = ["радиус расширен до 5000 м"], все 10 показанных аналогов вне
круга, самый дальний — 4381 м. По всей базе: у 62 из 388 оценок с расстояниями
(16%) есть аналог дальше километра, p90 максимума 1572 м, максимум 4381 м.
- GET /estimate/{id} восстанавливает фактический радиус из того, что реально
персистится: подпись каскада «радиус расширен до N м» (точное значение, то же,
что вернул POST), иначе — размах сохранённых аналогов, но не ниже
DEFAULT_RADIUS_M. Нет расстояний — остаётся null, фронт падает на выбор
пользователя, как раньше. Колонки/миграции не требуется.
- Подпись каскада и её разбор — один helper (radius_relaxation_label /
radius_from_relaxations), иначе строка и парсер разъедутся.
- confidence_explanation называет ФАКТИЧЕСКИЙ радиус: было прибито «расширили
радиус до 2 км» (константа старого 1км→2км fallback'а) даже когда каскад
#oblast-F уходил до 5 км — метка называла не результат (ср. #2811).
- Ответ несёт обе величины: requested_radius_m (с чего начали) рядом с
search_radius_m (чем кончили). На GET requested_radius_m остаётся null —
radius_m не персистится, подставлять дефолт значило бы выдать догадку за
выбор пользователя.
Refs #2632