POST /estimate возвращает price_trend, last_scraped_at, avito_imv и
dkp_corridor, но GET /{id} (shared-link, PDF reopen, ?id= restore) отдавал
их null — house_id не ререзолвился в GET-хендлере, derived-поля терялись.
Пересчитываем в хендлере из персистированного состояния (DDL не требуется):
- target_house_id ререзолвится по address (tradein_normalize_short_addr) с
geo-fallback 100м — тот же паттерн, что в placement-history/house-analytics;
- price_trend / avito_imv (display-only anchor) / dkp_corridor — через
существующие estimator-хелперы _fetch_price_trend / _fetch_house_imv_anchor /
_fetch_dkp_corridor;
- last_scraped_at реконструируется как created_at − data_freshness_minutes
(оба поля персистятся; эквивалентно max(scraped_at) на момент POST).
Всё best-effort: None при отсутствии данных — без регрессий относительно
прежнего поведения. cian_valuation / est_days_on_market тоже POST-only на GET
(вне scope #696 — потенциальный follow-up).
Closes#696