(high) normalize.py/normalize_address: асимметричное раскрытие ' д '->' дом ' даёт разные ключи для одного дома
(low) trade_in_pdf._examples_rows: days_on_market==0 рендерится как «—» из-за
or вместо is not None
(low) trade_in_pdf._build_deals_page: house_label не содержит monolith_brick/other — рассинхрон «Тип дома» между стр.2 и стр.3
(low) trade_in_pdf._build_listings_page: строка «(с учётом ремонта)» дублирует тот же n_total, фильтрации по ремонту нет
(low) dadata._classify_kind: fias_level 65 (planning) и 75 (plot) ошибочно попадают в kind='house'
(low) cian_price_history.backfill: saved считает len(price_changes), а не реально вставленные строки
(medium) admin.test_cian_auth: 403-бан Cian отдаётся как authenticated=True (VERIFY_BAN_SENTINEL не различается)
(medium) image_sanitizer.sanitize_image: EXIF orientation срезается без поворота пикселей → фото клиента лежат на боку
(low) scheduler.py/import_rosreestr_dkp: substring(floor FROM '[0-9]+') теряет минус — этаж '-1' импортируется как 1
(medium) house_imv_backfill.py/_process_one_house: IMV вернул price=0 → дом помечается imv_status='ok' и больше не переоценивается
(low) house_imv_backfill.py/pick_lot_params: нет инварианта floor<=floor_at_home → при total_floors=NULL везде floor_at_home падает на 9
(medium) scheduler.py/trigger_cian_backfill_run: при протухших cookies next_run_at не сдвигается → verify_session бьёт по Cian каждые 60с
(medium) scrape_pipeline.run_avito_city_sweep: IMV-фаза отравляет сессию → update_heartbeat без rollback переводит успешный sweep в 'failed'
(low) estimator.py/estimate_quality: freshness/last_scraped_at/days_on_market считаются по listings_clean, а не по показанным anchor_comps_used
(medium) estimator.py/estimate_quality SB-anchor: границы диапазона из RAW comp_ppm2 без repair_coef рассинхронизированы с центром
(low) search.py/_validate_geo_pair: cross-field min>max через truthiness — граничный 0 обходит проверку
(low) schemas/search.py _validate_geo_pair: нет проверки инвертированных вилок floor/year_built/floors_total (min>max)
(medium) search.py/search(): cache_hit всегда false даже при отдаче из кэша — поле врёт
(high) search.py/search_query.py: кадастровый номер всегда NULL в выдаче поиска — рассинхрон имён cadastral_number vs kadastr_num
(medium) 12_more_pois.py/main: bbox padding ±0.005° меньше радиуса привязки 2 км — POI у границ теряются