wms_feature_info (nspd_bulk_client.py:418-420): отсутствует isinstance(data, dict)-guard — non-dict JSON-ответ роняет ячейку grid-walk через AttributeError, потеря без сигнала
search_by_quarter (nspd_bulk_client.py:305-316): подстрочная классификация 404/400 по тексту исключения с подмешанным body_preview проглатывает 5xx и валидный 400 как «кв…
Parcel.geometry объявлена как POLYGON — реинтродукция класса крашей на многоконтурных (MultiPolygon) участках, который чинила миграция 93 (латентно: модел…
[opportunity_harvest] n_features инкрементится до per-quarter commit — отчёт завышает число persisted фич при сбое commit
[objective_etl] import_anton_objective: FileNotFoundError возвращает dict без raise — Celery-таск SUCCESS при проваленном ETL
[scrape_kn_catalog_objects] force=True «Загрузить все» молча ограничивается LIMIT 300 — каталог недогружается
process_nspd_geo_job (nspd_geo.py:374-408, 82-97) не имеет атомарного claim → дублирующие task-сообщения для одного job_id могут идти параллельно (двойные WAF-хиты + зат…
worker_ready (lifecycle.py:160-171) немедленно ре-enqueue'ит WAF-paused nspd_geo jobs, обходя 30-минутный WAF-cooldown из cleanup_zombies
ppt_tep JOIN: slug-fallback ILIKE перевёрнут (doc_ref ILIKE '%doc_full_name%') — никогда не матчит + LIKE-метасимволы не экранированы
granddoc is_active: регистрозависимое сравнение == "Действующий" расходится с документированным lowercase doc_status_name → флаг и сортировка ломаются
gate_verdict: warning NO_ENGINEERING_NEARBY при ОТСУТСТВИИ инж.сетей форсирует «С ограничениями» вместо «Можно» — чистый вердикт недостижим для жилого учас…
premises_lookup: KNN ближайшего здания ранжирует в ГРАДУСАХ (LIMIT 1) — на широте ЕКБ выбирает не ближайшее по метрам, parking_ratio чужого дома / потеря вали…
competitors.py:491-502 — ценовой fallback покрывает только objective_complex_mapping, игнорируя nearest_cx gap-fill: конкурент с velocity>0 из спатиального матча получает avg_price=None
nspd_lite.fetch_geoportal / nspd_client._http_get_json: json.loads на HTTP 200 не обёрнут → WAF-челлендж со статусом 200 даёт JSONDecodeError мимо autoretry harvest_quarter
obj_checks.extract_obj_checks: bool() на строковом флаге → 'false'/'0'/'нет' трактуется как пройдено
obj_checks.extract_obj_checks: or-коалесинг passed-значения (list-ветка) теряет boolean False → проваленная проверка пишется как пройденная
nspd_denorm.denorm_dump: штатный пропуск feature без cad_num считается ошибкой → завышенный error-счётчик в метрике прогона
domrf_catalog scrape_one_flat: success=True даже при updated=False / 0 извлечённых полей — ложь в статистике батча
domrf_catalog status: классификация по первому ключевому слову во всём HTML + 'продано'≠'продана' → sold помечается free
domrf_catalog _TextCollector: void-теги (<br>/<img>/<input>) рассинхронизируют стек/буфер — текст блоков теряется