obj_checks.extract_obj_checks: or-коалесинг passed-значения (list-ветка) теряет boolean False → проваленная проверка пишется как пройденная #1612

Closed
opened 2026-06-16 17:19:51 +00:00 by bot-backend · 0 comments
Collaborator

Severity: medium · Категория: or-coalescing / data-corruption · Файл: backend/app/services/scrapers/obj_checks.py:131-132

Файл: backend/app/services/scrapers/obj_checks.py:131-132.

passed_raw = item.get('passed') or item.get('value') or item.get('status') затем found_list[str(ct_raw)] = bool(passed_raw). or-fallback теряет легитимный False: для проваленной проверки вида {'checkType':'bankruptcy','passed':false,'value':'n/a'} вычисляется False or 'n/a' → 'n/a' → bool('n/a') = True. Проваленная проверка ('признаки банкротства' / 'не сдан в срок') сохраняется в domrf_obj_checks с passed=true.

Импакт: прямая порча данных. Консьюмер — analytics_queries.object_obj_checks (analytics_queries.py:1071, SELECT FROM domrf_obj_checks) → endpoint API/v1/analytics.py:191 → карточка ЖК 'Проверено на наш.дом.рф' покажет проваленную проверку как пройденную.

Статус: дормантно — callsite отключён (domrf_kn.py:33-35, endpoint /checks 404), но явно готовится к re-enable. Баг сработает в момент включения.

Фикс: брать строго boolean-поле без or-коалесинга, напр. passed_raw = item.get('passed') (если None — попробовать value/status явной проверкой is not None), и приводить с учётом строковых 'false'/'0' (см. также соседний дефект bool(string)).

Почему баг: Если API отдаёт проваленную проверку как {'checkType': 'bankruptcy', 'passed': false, 'value': 'n/a'} или {... 'passed': false, 'status': 'checked'}, то false or 'n/a' → 'n/a', bool('n/a') → True. Проваленная проверка ('есть признаки банкротства' / 'не сдан в срок') записывается в domrf_obj_checks как passed=true. Прямая порча данных и ложь в карточке ЖК 'Проверено на наш.дом.рф' (analytics_queries.object_obj_checks → API /v1/analytics:191). Модуль сейчас отключён на callsite (domrf_kn.py:33-35, endpoint 404), но явно готовится к re-enable ('Re-enable with _fetch_obj_checks_safe when endpoint is found') — баг сработает в момент включения.

Как чинить: Брать passed по приоритету ключей без or: проверять 'passed' in item прежде чем падать на value/status; не смешивать булевы и строковые поля через or.


deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.9 · unit B35

**Severity:** medium · **Категория:** or-coalescing / data-corruption · **Файл:** `backend/app/services/scrapers/obj_checks.py:131-132` Файл: backend/app/services/scrapers/obj_checks.py:131-132. `passed_raw = item.get('passed') or item.get('value') or item.get('status')` затем `found_list[str(ct_raw)] = bool(passed_raw)`. or-fallback теряет легитимный False: для проваленной проверки вида {'checkType':'bankruptcy','passed':false,'value':'n/a'} вычисляется `False or 'n/a'` → 'n/a' → bool('n/a') = True. Проваленная проверка ('признаки банкротства' / 'не сдан в срок') сохраняется в domrf_obj_checks с passed=true. Импакт: прямая порча данных. Консьюмер — analytics_queries.object_obj_checks (analytics_queries.py:1071, SELECT FROM domrf_obj_checks) → endpoint API/v1/analytics.py:191 → карточка ЖК 'Проверено на наш.дом.рф' покажет проваленную проверку как пройденную. Статус: дормантно — callsite отключён (domrf_kn.py:33-35, endpoint /checks 404), но явно готовится к re-enable. Баг сработает в момент включения. Фикс: брать строго boolean-поле без or-коалесинга, напр. `passed_raw = item.get('passed')` (если None — попробовать value/status явной проверкой `is not None`), и приводить с учётом строковых 'false'/'0' (см. также соседний дефект bool(string)). **Почему баг:** Если API отдаёт проваленную проверку как {'checkType': 'bankruptcy', 'passed': false, 'value': 'n/a'} или {... 'passed': false, 'status': 'checked'}, то false or 'n/a' → 'n/a', bool('n/a') → True. Проваленная проверка ('есть признаки банкротства' / 'не сдан в срок') записывается в domrf_obj_checks как passed=true. Прямая порча данных и ложь в карточке ЖК 'Проверено на наш.дом.рф' (analytics_queries.object_obj_checks → API /v1/analytics:191). Модуль сейчас отключён на callsite (domrf_kn.py:33-35, endpoint 404), но явно готовится к re-enable ('Re-enable with _fetch_obj_checks_safe when endpoint is found') — баг сработает в момент включения. **Как чинить:** Брать passed по приоритету ключей без or: проверять 'passed' in item прежде чем падать на value/status; не смешивать булевы и строковые поля через or. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.9 · unit B35</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:19:51 +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#1612
No description provided.