(low) conflict_resolution.py/_resolve: строковые правила игнорируют приоритет источников (порядок dict)
(low) houses.py/_upsert_house_source: ON CONFLICT не обновляет matched_method/matched_at — провенанс врёт
(medium) houses.py/match_or_create_house Tier 0: cadastr_exact не регистрирует alias -> риск дубля при бескадастровом скрейпе
(low) conflict_resolution.py/_resolve cross_validate: молча возвращает медиану, не сигнализирует расхождение цен
(medium) normalize.py/normalize_address: инициалы 'К.'/'Д.' в названии улицы раскрываются в 'корпус'/'дом'
(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, фильтрации по ремонту нет
(medium) trade_in_pdf._build_cover: «Срок действия данных» захардкожен today+30д, игнорирует estimate.expires_at (=now+24ч)
(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/_fetch_dkp_corridor: low/high_ppm2 = чистые min/max выборки, а не P10/P90 — advisory-текст по одиночному выбросу