fix(tradein): run same-building anchor without radius analogs (#691) #704

Merged
bot-reviewer merged 1 commit from fix/691-anchor-no-geocode into main 2026-05-30 08:34:25 +00:00
Collaborator

Summary

  • #691 (P1 demo-blocker): same-building anchor больше не скипается при провале геокода.
  • Прод: геокод часто отдаёт lat/lon=NoneST_DWithin не находит радиусные аналоги → median_price=0, и якорь того же дома НЕ запускался (гейт требовал listings_clean + median_price>0). При этом комплы того же дома есть — _fetch_anchor_comps резолвит дом по payload.address без гео (Ткачёва 13 → «улица Ткачей, 13», 27 комплов; Сакко 99).
  • Гейт ослаблен до resolved-таргета: area_m2 + (payload.address | geo.full_address), независимо от радиусных аналогов.

Safety

  • Новый гейт — супермножество старого (при непустом радиусе адрес всегда есть) ⇒ ранее-якорившиеся кейсы не меняются.
  • Если комплов реально нет — _compute_same_building_anchor вернёт None, мутации median/range нет (идентично insufficient-пути). Не фабрикуем число.

Test plan

  • pytest tests/test_same_building_anchor.py → 37 passed (+2: anchor при пустом радиусе median>0; контроль — без комплов median=0).
  • Регрессия: imv_blend/expected_sold/floor_optional/repair_coef/cohort → 55 passed.
  • LIVE после деплоя: Ткачёва 13, 3к/116 как admin → median>0.

Closes #691

## Summary - #691 (P1 demo-blocker): same-building anchor больше не скипается при провале геокода. - Прод: геокод часто отдаёт `lat/lon=None` → `ST_DWithin` не находит радиусные аналоги → `median_price=0`, и якорь того же дома НЕ запускался (гейт требовал `listings_clean` + `median_price>0`). При этом комплы того же дома есть — `_fetch_anchor_comps` резолвит дом по `payload.address` без гео (Ткачёва 13 → «улица Ткачей, 13», 27 комплов; Сакко 99). - Гейт ослаблен до resolved-таргета: `area_m2` + (`payload.address` | `geo.full_address`), независимо от радиусных аналогов. ## Safety - Новый гейт — **супермножество** старого (при непустом радиусе адрес всегда есть) ⇒ ранее-якорившиеся кейсы не меняются. - Если комплов реально нет — `_compute_same_building_anchor` вернёт `None`, мутации median/range нет (идентично insufficient-пути). Не фабрикуем число. ## Test plan - [x] `pytest tests/test_same_building_anchor.py` → 37 passed (+2: anchor при пустом радиусе median>0; контроль — без комплов median=0). - [x] Регрессия: imv_blend/expected_sold/floor_optional/repair_coef/cohort → 55 passed. - [ ] LIVE после деплоя: Ткачёва 13, 3к/116 как admin → `median>0`. Closes #691
bot-backend added 1 commit 2026-05-30 08:26:19 +00:00
На проде геокод часто отдаёт lat/lon=None → ST_DWithin не находит радиусные
аналоги → median_price=0, и same-building якорь скипался: его гейт требовал
listings_clean (непустой радиус) + median_price>0. При этом комплы того же
дома реально есть — _fetch_anchor_comps резолвит дом по payload.address без
геокода (Ткачёва 13 → «улица Ткачей, 13», 27 комплов; Сакко 99).

Гейт ослаблен до resolved-таргета: area_m2 + (payload.address|geo.full_address),
независимо от радиусных аналогов. Новый гейт — супермножество старого (при
непустом радиусе адрес всегда есть), так что ранее-якорившиеся кейсы не
меняются. Если комплов реально нет — _compute_same_building_anchor вернёт None
и мутации median/range не будет (идентично insufficient-пути).

Тесты: anchor срабатывает при пустом радиусе (median>0); контроль — без комплов
и без радиуса median остаётся 0 (не фабрикуем число).

Closes #691
bot-reviewer approved these changes 2026-05-30 08:34:24 +00:00
bot-reviewer left a comment
Collaborator

Run same-building anchor without radius analogs (#691). Gate drops the listings_clean+median>0 requirement, keeps area + (raw address or geo.full_address). Verified safe: geo non-None at this point (early _empty_estimate return), seg_counts guarded (empty->None), _fetch_anchor_comps gates Tier C on lat/lon not-None (None -> Tier C skipped, no crash; Tier A is address-based), anchor None -> no mutation (identical to old). New gate is a documented superset of old (non-empty radius always has address). No #674/#682 regression. Tests cover both now-reachable paths: empty-radius+same-building-comps -> anchor fires median>0 range valid; empty-radius+no-comps -> median stays 0 (no fabrication). APPROVE.

<!-- gendesign-review-bot: sha=a5bb79b verdict=approve --> Run same-building anchor without radius analogs (#691). Gate drops the listings_clean+median>0 requirement, keeps area + (raw address or geo.full_address). Verified safe: geo non-None at this point (early _empty_estimate return), seg_counts guarded (empty->None), _fetch_anchor_comps gates Tier C on lat/lon not-None (None -> Tier C skipped, no crash; Tier A is address-based), anchor None -> no mutation (identical to old). New gate is a documented superset of old (non-empty radius always has address). No #674/#682 regression. Tests cover both now-reachable paths: empty-radius+same-building-comps -> anchor fires median>0 range valid; empty-radius+no-comps -> median stays 0 (no fabrication). APPROVE.
bot-reviewer merged commit f04728297b into main 2026-05-30 08:34:25 +00:00
bot-reviewer deleted branch fix/691-anchor-no-geocode 2026-05-30 08:34:25 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#704
No description provided.