From 3a25e2c4b835412d1a866a842ff21b63b6bfb405 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sat, 30 May 2026 02:07:38 +0300 Subject: [PATCH] fix(tradein): feed raw payload.address to same-building anchor (geocode-independent) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The #677/#679 same-building anchor was fed geo.full_address (the GEOCODED canonical address). On prod the geocoder frequently returns None (lat/lon/ canonical all None), so geo.full_address was empty → _normalize_building_key got nothing → Tier A (same building) never fired → fell back to the radius tier for every geocode-failing address. That is why live golden coverage was 67/58% (and flaky run-to-run) while the offline sim (which fed the raw address) showed 95%: Ткачёва 13 / Хохрякова 48 etc. geocode-fail on prod. Fix: pass payload.address (raw user input, always present, exactly what the normalizer is validated on) with geo.full_address as fallback. Makes the same-building anchor independent of geocode success. ruff clean; 30 anchor tests. Refs #651 #677 #679 --- tradein-mvp/backend/app/services/estimator.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tradein-mvp/backend/app/services/estimator.py b/tradein-mvp/backend/app/services/estimator.py index 52824378..f4bedac8 100644 --- a/tradein-mvp/backend/app/services/estimator.py +++ b/tradein-mvp/backend/app/services/estimator.py @@ -1624,7 +1624,11 @@ async def estimate_quality( comps, anchor_tier = _fetch_anchor_comps( db, - address=geo.full_address, + # payload.address (сырой ввод) ПЕРВИЧЕН: на проде геокод часто + # возвращает None (lat/lon/canonical=None), и geo.full_address пуст — + # тогда same-building Tier A не находил дом и падал в радиус. Raw-адрес + # всегда есть и именно на нём валидирован нормализатор (#677/#679). + address=payload.address or geo.full_address, target_house_id=target_house_id, lat=geo.lat, lon=geo.lon,