(low) Cian _walk_price_range: force-paginate ветка молча теряет хвост ценового бакета (задокументированная потеря в hot path) #1393

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

Описание

Когда leaf-бакет всё ещё имеет totalOffers > price_cap_per_bucket, но bracket больше нельзя разделить (hi-lo < _MIN_BRACKET=50_000), need_split принудительно ставится в False и бакет пагинируется как есть. Пагинация ограничена max_pages = min(ceil(total/28), max_pages_per_bucket=54) ≈ 1512 офферов. Для одной ценовой точки с тысячами одинаково-оценённых объявлений остаток (total − 1512) никогда не подтягивается. WARNING-лог признаёт 'tail loss', т.е. это известное ограничение, но на плотном рынке означает систематический недобор exhaustive-sweep, питающего asking-price аналитику.

Корень

Intentional design trade-off (константа _MIN_BRACKET с комментарием, docstring guard, WARNING с числом потерь), но без вторичного измерения партиционирования при over-cap узком бакете.

Evidence

cian.py:475-537:

if need_split and too_narrow:
    ...
    need_split = False  # принудительно пагинируем
...
max_pages = min(math.ceil(total / _CIAN_OFFERS_PER_PAGE), max_pages_per_bucket)

Suggested fix

При вынужденной пагинации over-cap узкого бакета добавить вторичное измерение партиционирования (по площади или этажу) вместо принятия tail loss, либо как минимум surface'ить dropped count в Sentry/metrics, чтобы недобор был наблюдаем, а не только WARNING-строкой.

Обоснование severity

low: потери ограничены (минимум 1512 офферов всё же собираются); сценарий нетривиален (нужны тысячи объявлений в диапазоне <50k ₽); WARNING с числом потерь даёт частичную observability; это задокументированный trade-off, а не случайная ошибка. confidence 0.75.


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

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

  • /Users/anton/Птица/gendesign/tradein-mvp/backend/app/services/scrapers/cian.py
## Описание Когда leaf-бакет всё ещё имеет `totalOffers > price_cap_per_bucket`, но bracket больше нельзя разделить (`hi-lo < _MIN_BRACKET=50_000`), `need_split` принудительно ставится в False и бакет пагинируется как есть. Пагинация ограничена `max_pages = min(ceil(total/28), max_pages_per_bucket=54)` ≈ 1512 офферов. Для одной ценовой точки с тысячами одинаково-оценённых объявлений остаток (total − 1512) никогда не подтягивается. WARNING-лог признаёт 'tail loss', т.е. это известное ограничение, но на плотном рынке означает систематический недобор exhaustive-sweep, питающего asking-price аналитику. ## Корень Intentional design trade-off (константа _MIN_BRACKET с комментарием, docstring guard, WARNING с числом потерь), но без вторичного измерения партиционирования при over-cap узком бакете. ## Evidence `cian.py:475-537`: ```python if need_split and too_narrow: ... need_split = False # принудительно пагинируем ... max_pages = min(math.ceil(total / _CIAN_OFFERS_PER_PAGE), max_pages_per_bucket) ``` ## Suggested fix При вынужденной пагинации over-cap узкого бакета добавить вторичное измерение партиционирования (по площади или этажу) вместо принятия tail loss, либо как минимум surface'ить dropped count в Sentry/metrics, чтобы недобор был наблюдаем, а не только WARNING-строкой. ## Обоснование severity low: потери ограничены (минимум 1512 офферов всё же собираются); сценарий нетривиален (нужны тысячи объявлений в диапазоне <50k ₽); WARNING с числом потерь даёт частичную observability; это задокументированный trade-off, а не случайная ошибка. confidence 0.75. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`data-integrity`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/tradein-mvp/backend/app/services/scrapers/cian.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:11:21 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:57 +00:00
bot-backend added the
needs-human
label 2026-06-15 16:44:02 +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#1393
No description provided.