fix(tradein): честный радиус поиска аналогов на карте v2 (#2632) #2643

Merged
bot-backend merged 1 commit from fix/tradein-honest-search-radius into main 2026-08-05 06:13:59 +00:00
Collaborator

Summary

#2632 (M1 аудита #2583): эстиматор молча расширял радиус 1км→2км при нехватке аналогов, текст (confidence_explanation) об этом говорил, а круг на карте рисовался по выбору пользователя — картинка врала убедительнее текста (Первоуральск воспроизводился).

  • Backend: search_radius_m: int | null в AggregatedEstimate. Флип base→fallback ровно в тех же ветках, что ставят fallback_used (драйвер текста) — текст и число структурно не могут разойтись. ДКП-коридор и anchor-пути не влияют (поле = радиус отбора listings-аналогов). Явный radius_m-override: base==fallback by construction (#2044) — no-op. Не персистится (конвенция analog_tier) — rehydrate/старые ответы отдают null.
  • Frontend v2: круг по search_radius_m, пока дропдаун радиуса не тронут после ремаунта (панель ремаунтится по estimate_id, дропдаун всегда ресетится в «Авто» — проверено, что initialValues не несёт radius_m); поле отсутствует → прежнее поведение. Disclosure в стиле оговорок v2: «Аналогов в радиусе 1 км не хватило — поиск расширен до 2 км» (role="status", tokens.warn); не флапает на равных (AUTO_PREVIEW=1000 == DEFAULT_RADIUS_M).

Test plan

  • backend: base-ветка → 1000, widen-ветка → 2000 (side_effect по radius_m); 7/7 в модуле
  • полный tradein-сьют 3223 passed (1 known pre-existing 401 локально)
  • tsc --noEmit / next lint / next build чисто
  • post-deploy: Первоуральск-адрес → круг 2 км + disclosure

Review

code-reviewer: APPROVE — прослежены все ветки выбора радиуса (включая cohort-drop и _price_from_inputs-скоуп), подтверждена невозможность рассинхрона текст↔число by construction, guard ремаунта верифицирован на invariant'е initialValues.

Refs #2632

## Summary **#2632** (M1 аудита #2583): эстиматор молча расширял радиус 1км→2км при нехватке аналогов, текст (`confidence_explanation`) об этом говорил, а круг на карте рисовался по выбору пользователя — картинка врала убедительнее текста (Первоуральск воспроизводился). - **Backend**: `search_radius_m: int | null` в `AggregatedEstimate`. Флип base→fallback **ровно в тех же ветках**, что ставят `fallback_used` (драйвер текста) — текст и число структурно не могут разойтись. ДКП-коридор и anchor-пути не влияют (поле = радиус отбора listings-аналогов). Явный `radius_m`-override: base==fallback by construction (#2044) — no-op. Не персистится (конвенция `analog_tier`) — rehydrate/старые ответы отдают null. - **Frontend v2**: круг по `search_radius_m`, пока дропдаун радиуса не тронут после ремаунта (панель ремаунтится по `estimate_id`, дропдаун всегда ресетится в «Авто» — проверено, что `initialValues` не несёт `radius_m`); поле отсутствует → прежнее поведение. Disclosure в стиле оговорок v2: «Аналогов в радиусе 1 км не хватило — поиск расширен до 2 км» (`role="status"`, tokens.warn); не флапает на равных (AUTO_PREVIEW=1000 == DEFAULT_RADIUS_M). ## Test plan - [x] backend: base-ветка → 1000, widen-ветка → 2000 (side_effect по radius_m); 7/7 в модуле - [x] полный tradein-сьют 3223 passed (1 known pre-existing 401 локально) - [x] tsc --noEmit / next lint / next build чисто - [ ] post-deploy: Первоуральск-адрес → круг 2 км + disclosure ## Review code-reviewer: **✅ APPROVE** — прослежены все ветки выбора радиуса (включая cohort-drop и `_price_from_inputs`-скоуп), подтверждена невозможность рассинхрона текст↔число by construction, guard ремаунта верифицирован на invariant'е initialValues. Refs #2632
bot-backend added 1 commit 2026-08-05 06:10:14 +00:00
fix(tradein): честный радиус поиска аналогов на карте v2 (#2632)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m19s
CI Trade-In / backend-tests (pull_request) Successful in 2m51s
d132187155
Эстиматор молча расширял радиус 1км→2км при нехватке аналогов, но наружу
фактический радиус не отдавал — круг на карте рисовался по выбору
пользователя, текст говорил одно, картинка другое (Первоуральск
воспроизводился). search_radius_m в AggregatedEstimate: init=base,
флип на fallback ровно в тех же ветках, что ставят fallback_used (текст и
число структурно не могут разойтись); ДКП-коридор и anchor-пути не влияют
(поле = радиус отбора listings-аналогов). フронт: круг по search_radius_m
(пока дропдаун не тронут после ремаунта по estimate_id), фолбэк на выбор
пользователя при отсутствии поля; disclosure «Аналогов в радиусе 1 км не
хватило — поиск расширен до 2 км» в стиле оговорок v2. Не персистится
(конвенция analog_tier) — rehydrate отдаёт None без мигания.

Refs #2632
bot-backend merged commit 2aa79e2143 into main 2026-08-05 06:13:59 +00:00
bot-backend deleted branch fix/tradein-honest-search-radius 2026-08-05 06:14:00 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2643
No description provided.