gendesign/tradein-mvp/backend/app/services
bot-backend 1ec37a793b
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
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 / backend-tests (pull_request) Successful in 3m55s
fix(tradein/estimate): домовой IMV-якорь приводится к базису ремонта квартиры
median_price к моменту blend'а уже домножен на _repair_coefficient («требует
ремонта» −6%, «евро» +10%), а домовой якорь из house_imv_evaluations запрошен
у Avito с ОДНИМ ремонтом (renovation_type). Порог anchor > median×1.15 и сам
blend клали два разных базиса на одну шкалу: у клиента с «требует ремонта»
порог фактически падал до ×1.081, а сработавший blend возвращал половину его
−6% обратно вверх — то есть однонаправленный якорь наполовину отменял
поправку на ремонт.

Правка не трогает калибровку: якорь домножается ровно на тот коэффициент,
который код УЖЕ применил к медиане (coef(ремонт клиента) / coef(ремонт строки
якоря)). Карточка Avito остаётся сырой — чужое число мы не правим; в blend
уходит пересчитанное, и пояснение это называет.

Замер на проде (1061 персистированная оценка, 2026-08-10, тем же кодом:
match_house_readonly → _fetch_house_imv_anchor → _apply_imv_blend):
- реализованный эффект СЕГОДНЯ 0 ₽ — blend не сработал ни разу (0 маркеров
  в confidence_explanation при 174 repair-заметках и 725 anchor-заметках
  в той же колонке, то есть канал показать срабатывание способен);
- 674/1061 оценок резолвятся в дом, 240 получают домовой якорь, порог
  пересекают 19 — все они гасятся гейтом anchor_tier is None выше по потоку;
- на этих 19 старый код против базис-согласованного: 9 оценок «требует
  ремонта» −3.3…−9.8 % (−4.13 млн ₽ суммарно), 1 оценка «хороший ремонт»
  +9.6 % (+0.47 млн ₽).

Однонаправленность blend'а НЕ трогаю — это отдельное продуктовое решение
(config: «ОДНОНАПРАВЛЕННО: только повышаем»), не дефект в смысле #2677.

Refs #2677
2026-08-10 14:36:51 +05:00
..
exporters feat(tradein/payments): оплаченный отчёт хранится год — retain_until и предохранители в задаче удаления 2026-08-06 21:48:06 +03:00
matching fix(tradein/matching): город развёртки доезжает до стража Tier-2a — межгородские склейки домов (#2777) (#2808) 2026-08-10 08:51:14 +00:00
payments fix(tradein/payments): строгий разбор нотификации и отказ вместо догадок на враждебном входе 2026-08-06 15:48:57 +03:00
tgbot fix(tradein/tgbot): ограничение частоты на отправителя в мосте поддержки (#2543) 2026-07-26 23:16:57 +00:00
__init__.py feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in) 2026-05-21 00:25:39 +03:00
account_quota.py feat(tradein/auth): восстановить доступ praktika + безлимит через данные вместо хардкода (#2544) 2026-07-26 23:29:53 +00:00
auth_session.py feat(tradein): переключаемый реестр людей — подготовка переезда «Меры» в БД auth [PR-2b/6] 2026-08-01 02:50:14 +03:00
brand.py fix(tradein/pdf): МЕРА branding + 4-page report, no empty pages (#2513) 2026-07-13 18:04:07 +00:00
buildings_query.py fix(tradein/sale-share): гард по этажности — отсечь near-neighbor mis-match 2026-06-29 00:31:09 +03:00
cache.py feat(tradein): Phase 3.2 — /api/v1/search endpoint + Redis cache (#479) 2026-05-23 14:44:22 +00:00
cian_price_history.py fix(tradein/cian): персист bti_data/valuation house_info в houses + дедуп УК (#2435) (#2437) 2026-07-04 20:21:32 +00:00
cian_session.py fix(tradein/scraper): фильтр skipped в админке + освежение схлопнутой строки (#2658) 2026-08-05 23:10:47 +05:00
dadata.py fix(tradein/geocoder): строгий матч литеры дома + починка DaData region-фильтра (#2622) 2026-08-02 12:06:44 +00:00
data_erasure.py fix(tradein/privacy): нормализация телефона к каноническому РФ-виду при erasure (#2547) 2026-08-06 19:59:34 +03:00
domclick_session.py fix(tradein): сигналы о сбоях наконец становятся событиями, а протухание кук предупреждает заранее (#2674) 2026-08-06 02:29:11 +05:00
domrf_kapremont_loader.py fix(tradein/ingest): 4 data-integrity дефекта в бэкфилле годов и импорте ДКП 2026-07-12 22:12:31 +03:00
estimator.py fix(tradein/estimate): домовой IMV-якорь приводится к базису ремонта квартиры 2026-08-10 14:36:51 +05:00
gar_flats_loader.py feat(tradein): канонический матч ГАР↔houses (0%→41% yield) + tradein_canon_addr + --match-only (#2063) 2026-06-28 15:50:07 +00:00
geocoder.py fix(tradein/geocode): гейт мусорного города вынести в общий хелпер и прошить в admin-путь (#2603) 2026-08-05 20:20:41 +05:00
house_dedup_merge.py feat(tradein/houses): журнал слияний домов — слияние стало обратимым (#2740) 2026-08-06 15:41:20 +00:00
house_imv_backfill.py fix(tradein/imv): домовая оценка ходит в сайдкар через пул, а не через чужой env-прокси (#2698) (#2708) 2026-08-06 06:52:15 +00:00
house_metadata.py feat(tradein): postgres_fdw live read of gendesign.cad_buildings (replaces snapshot) (#493) 2026-05-24 08:57:30 +00:00
identity_store.py feat(tradein): переключаемый реестр людей — подготовка переезда «Меры» в БД auth [PR-2b/6] 2026-08-01 02:50:14 +03:00
image_sanitizer.py fix(tradein/photos): защита от pixel-flood DoS в image_sanitizer 2026-07-12 22:12:12 +03:00
location_index.py fix(tradein): тест ловит копию константы, а не equality; честный комментарий про вклад свежести (#2660) 2026-08-05 23:13:22 +05:00
product_handlers.py fix(tradein/deactivate): TTL не снимает объявления по порогу ниже собственного цикла обхода (#2797) 2026-08-09 17:26:18 +00:00
proxy_pool.py fix(tradein/proxy): упавшая проба присваивала себе бан боевого сбора (#2800) (#2805) 2026-08-09 20:13:10 +00:00
proxy_rotation.py fix(tradein/proxy): backup-узел должен быть пригоден + рычаг снятия бана (#2600 п.2) 2026-08-05 17:45:07 +05:00
rosreestr_poll.py fix(tradein): чинит такт загрузки СберИндекса — иначе новый ERROR стал бы ложной тревогой (#2674) 2026-08-06 02:53:26 +05:00
sber_index.py fix(tradein): сигналы о сбоях наконец становятся событиями, а протухание кук предупреждает заранее (#2674) 2026-08-06 02:29:11 +05:00
scheduler.py fix(tradein/scraper): сигнал живости из середины батча — живые прогоны перестают числиться зависшими (#2725) (#2727) 2026-08-06 11:30:52 +00:00
scrape_runs.py fix(tradein/scraper): диагноз бана перестаёт назначаться по умолчанию (#2764) (#2765) 2026-08-06 23:17:59 +00:00
scraper_adapters.py fix(tradein/matching): город развёртки доезжает до стража Tier-2a — межгородские склейки домов (#2777) (#2808) 2026-08-10 08:51:14 +00:00
scraper_settings.py chore(tradein): деактивировать N1.ru scraper — источник переехал в Cian 2026-06-16 14:50:51 +03:00
search_query.py fix(tradein/matching): честность тиров сопоставления домов (#2674) 2026-08-06 04:37:12 +05:00
user_events.py feat(tradein/audit): request-audit middleware + estimate_request logging → user_events (#2519) 2026-07-13 20:09:22 +00:00
yandex_address_backfill.py fix(tradein): yandex address-enrich — city-agnostic title regex (спутники ЕКБ) (#875) 2026-05-31 09:08:29 +00:00
yandex_price_history.py chore(tradein/scrapers): удалить весь legacy scrapers/ каталог — final E (#2397, #2277) 2026-07-04 15:58:15 +03:00
zhkh_flats_loader.py fix(tradein): cadastre ЖКХ-fallback + COALESCE merge-key + median-floors guard 2026-06-29 01:32:48 +03:00