extract_obj_checks фабрикует passed=False для отсутствующих в payload проверок → UNKNOWN трактуется как FAILED (латентно, endpoint отключён) #1649

Closed
opened 2026-06-16 18:46:55 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: false-report-data-fabrication · Файл: backend/app/services/scrapers/obj_checks.py:114-117, 133-136

Файл: backend/app/services/scrapers/obj_checks.py:114-117 (dict-ветка) и 133-136 (list-ветка). После сбора реально присутствующих флагов в found/found_list код итерирует по всем шести CHECK_TYPES и пишет {'check_type': ct, 'passed': found.get(ct, False)}. Если endpoint вернёт лишь часть из шести флагов (частичный payload — обычно при изменении API DOM.РФ), остальные уйдут в upsert_obj_checks с passed=False. analytics_queries.object_obj_checks (analytics_queries.py:1088-1094) отдаёт passed как есть, где False = 'проверка НЕ пройдена' → объект без данных по проверке покажется как проваливший её ('есть банкротство / нет документов / сорваны сроки') — ложь в отчёте клиенту.

Фикс: не добавлять строку при отсутствии флага (различать UNKNOWN и FAILED) — итерировать только по фактически найденным ключам, либо хранить passed как nullable BOOLEAN.

Примечание: severity low — код сейчас не вызывается (импорт закомментирован в domrf_kn.py:33-35, endpoint /checks → 404, call-site domrf_kn.py:1842 закомментирован). Импакт латентный до ре-энейбла.

Почему баг: Если endpoint вернёт лишь часть из шести флагов (частичный payload — обычная ситуация при изменении API DOM.РФ), остальные 5 уйдут в UPSERT (upsert_obj_checks) со значением passed=False. analytics_queries.object_obj_checks (analytics_queries.py:1088-1094) отдаёт passed как есть в API/отчёт, где False = 'проверка НЕ пройдена'. То есть объект, у которого данных по проверке просто нет, в карточке покажется как проваливший проверку «нет банкротства / есть документы / сроки» и т.п. — прямая ложь в отчёте клиенту. Корректнее не писать строку вовсе при отсутствии флага (UNKNOWN ≠ FAILED). Примечание: endpoint /checks сейчас отключён (domrf_kn.py:33 — 404), импорт закомментирован, поэтому импакт латентный до ре-энейбла.

Как чинить: Записывать только реально найденные проверки: for ct, val in found.items(): results.append({...}) вместо прохода по всем CHECK_TYPES с дефолтом False. Отсутствие проверки трактовать как 'нет данных' (строку не вставлять), а не как passed=False.


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.7 · unit B35

**Severity:** low · **Категория:** false-report-data-fabrication · **Файл:** `backend/app/services/scrapers/obj_checks.py:114-117, 133-136` Файл: backend/app/services/scrapers/obj_checks.py:114-117 (dict-ветка) и 133-136 (list-ветка). После сбора реально присутствующих флагов в found/found_list код итерирует по всем шести CHECK_TYPES и пишет `{'check_type': ct, 'passed': found.get(ct, False)}`. Если endpoint вернёт лишь часть из шести флагов (частичный payload — обычно при изменении API DOM.РФ), остальные уйдут в upsert_obj_checks с passed=False. analytics_queries.object_obj_checks (analytics_queries.py:1088-1094) отдаёт passed как есть, где False = 'проверка НЕ пройдена' → объект без данных по проверке покажется как проваливший её ('есть банкротство / нет документов / сорваны сроки') — ложь в отчёте клиенту. Фикс: не добавлять строку при отсутствии флага (различать UNKNOWN и FAILED) — итерировать только по фактически найденным ключам, либо хранить passed как nullable BOOLEAN. Примечание: severity low — код сейчас не вызывается (импорт закомментирован в domrf_kn.py:33-35, endpoint /checks → 404, call-site domrf_kn.py:1842 закомментирован). Импакт латентный до ре-энейбла. **Почему баг:** Если endpoint вернёт лишь часть из шести флагов (частичный payload — обычная ситуация при изменении API DOM.РФ), остальные 5 уйдут в UPSERT (upsert_obj_checks) со значением passed=False. analytics_queries.object_obj_checks (analytics_queries.py:1088-1094) отдаёт passed как есть в API/отчёт, где False = 'проверка НЕ пройдена'. То есть объект, у которого данных по проверке просто нет, в карточке покажется как проваливший проверку «нет банкротства / есть документы / сроки» и т.п. — прямая ложь в отчёте клиенту. Корректнее не писать строку вовсе при отсутствии флага (UNKNOWN ≠ FAILED). Примечание: endpoint /checks сейчас отключён (domrf_kn.py:33 — 404), импорт закомментирован, поэтому импакт латентный до ре-энейбла. **Как чинить:** Записывать только реально найденные проверки: `for ct, val in found.items(): results.append({...})` вместо прохода по всем CHECK_TYPES с дефолтом False. Отсутствие проверки трактовать как 'нет данных' (строку не вставлять), а не как passed=False. --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.7 · unit B35</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:46:55 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1649
No description provided.