[low] Cian has_furniture: реальное False теряется через or-коалесинг двух boolean-полей #1388

Closed
opened 2026-06-14 18:10:15 +00:00 by bot-backend · 0 comments
Collaborator

Описание

has_furniture вычисляется как offer.get('hasFurniture') or offer.get('isSoldFurnished'). Когда hasFurniture — явный False (продавец указал «нет мебели»), or короткозамыкается на isSoldFurnished, который может быть None или True — переворачивая определённое «нет мебели» в None/True. У двух полей разная семантика (мебель вообще vs продаётся с мебелью), их нельзя OR-склеивать.

Корень

Python or-коалесинг на boolean-поле, где False — валидное значение. Значение оседает в raw_payload['has_furniture'] (строка 865), персистится в БД, участвует в cross-source merge (conflict_resolution.py:79, LISTING_FIELD_PRIORITY для cian_serp).

Evidence

cian.py:805:

has_furniture: bool | None = offer.get("hasFurniture") or offer.get("isSoldFurnished")

Suggested fix

Явная None-проверка:

hf = offer.get('hasFurniture')
has_furniture = hf if hf is not None else offer.get('isSoldFurnished')

Либо хранить оба сырых поля раздельно в raw_payload.

Обоснование severity (low)

has_furniture — не first-class колонка ScrapedLot, не влияет на price/area/floor/address. Влияние ограничено качеством enrichment вторичного атрибута. Confidence 0.88.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=low · category=logic

Затронутые файлы:

  • /Users/anton/Птица/gendesign/tradein-mvp/backend/app/services/scrapers/cian.py
## Описание `has_furniture` вычисляется как `offer.get('hasFurniture') or offer.get('isSoldFurnished')`. Когда `hasFurniture` — явный False (продавец указал «нет мебели»), `or` короткозамыкается на `isSoldFurnished`, который может быть None или True — переворачивая определённое «нет мебели» в None/True. У двух полей разная семантика (мебель вообще vs продаётся с мебелью), их нельзя OR-склеивать. ## Корень Python `or`-коалесинг на boolean-поле, где False — валидное значение. Значение оседает в `raw_payload['has_furniture']` (строка 865), персистится в БД, участвует в cross-source merge (conflict_resolution.py:79, LISTING_FIELD_PRIORITY для cian_serp). ## Evidence `cian.py:805`: ```python has_furniture: bool | None = offer.get("hasFurniture") or offer.get("isSoldFurnished") ``` ## Suggested fix Явная None-проверка: ```python hf = offer.get('hasFurniture') has_furniture = hf if hf is not None else offer.get('isSoldFurnished') ``` Либо хранить оба сырых поля раздельно в `raw_payload`. ## Обоснование severity (low) `has_furniture` — не first-class колонка ScrapedLot, не влияет на price/area/floor/address. Влияние ограничено качеством enrichment вторичного атрибута. Confidence 0.88. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`logic`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/tradein-mvp/backend/app/services/scrapers/cian.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:10:15 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:56 +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#1388
No description provided.