Commit graph

2 commits

Author SHA1 Message Date
lekss361
e9eb812d8b fix(tradein): recompute expected_sold_* after IMV blend + band-guard anchor (#651)
Review-bot findings:
- CRITICAL: expected_sold_* were derived from PRE-blend median/range/ppm2, so
  after the #651 blend raised median_price the UI showed asking (blended) vs
  expected-sold (un-blended) → nonsensical discount. Moved the asking→sold
  derivation to AFTER the blend block; INSERT + returned estimate now use the
  post-blend values.
- IMV anchor had no rooms/area band → a studio-only IMV row could anchor a
  3-room target and inflate via the x1.15 trigger. Added NULL-tolerant guard
  (abs(Δrooms)<=1 AND area_m2 BETWEEN area*0.7..1.3) in _fetch_house_imv_anchor.
- Tests: expected_sold↔blended-median consistency, band rejection, weight clamp
  [0,1], corridor count branch. ruff clean; 26 + 145 estimator regression pass.
2026-05-29 20:11:25 +03:00
lekss361
70ee7b282c feat(tradein): blend Avito IMV anchor into estimate + ДКП corridor advisory — backend (#651, #652)
Radius-median underestimated premium/view units ~2x. #651: blend real Avito
IMV (house_imv_evaluations per house_id) one-directional raise-only — when
IMV recommended > median*1.15, median = blend(median,IMV,w=0.5), range_high
extends to IMV higher. #652: ДКП corridor (rosreestr deals, RUB/m2, advisory
+ soft +-25% note, no clamp). Behind config flags (default on), null-guarded
no-op when absent. Adds avito_imv + dkp_corridor to AggregatedEstimate.
Validated on live DB (B. Yeltsina 6 80m2: 19.7M->25.8M, range->33.5M).
Frontend surfacing (tradein-mvp/frontend) follows in next commit.
2026-05-29 18:58:10 +03:00