fix(tradein/yandex): недорендеренная карточка — отказ, не успех: структурный маркер encryptedPhones + порог размера, карточка остаётся в очереди #3364

Merged
bot-backend merged 2 commits from fix/3191-yandex-detail-completeness into main 2026-09-05 19:21:06 +00:00
Collaborator

Refs #3191 (p1). Страница 1,8 МБ без блока контактов проходила единственную проверку len(html) < 500 и уезжала в БД с detail_enriched_at — навсегда.

Признак полноты — два независимых, любой = отказ

  • структурный encryptedPhones (DETAIL_CONTACTS_MARKER в providers/yandex/detail.py): анонимная сессия его получает — yandex_session.py:10 и миграция 274 прямо фиксируют, что с куками и без есть encryptedPhones/redirectPhones, отличается только mainPhone (поэтому mainPhone признаком быть не может). Наблюдавшийся недогруз 1,8 МБ ловит именно маркер;
  • размер settings.yandex_detail_min_html_bytes (1 МБ, config.py рядом с соседними yandex-настройками).

Недогруз = отказ

Проверка в yandex_detail_backfill.py ДО parseincomplete += 1, failed += 1, continue; save_detail_enrichment не вызывается → detail_enriched_at не проставлен → очередь (detail_enriched_at IS NULL) берёт объявление снова. incomplete ⊆ failed, тождество attempted == enriched + failed (#3338) держится. Серия недогрузов двигает consecutive_none → брейкер max_consecutive_blocks обрывает прогон. Per-listing счётчика попыток в схеме нет — колонка не заводилась (ограничение только на уровне прогона; отметить в issue).

newbuilding.py не тронут: надёжного маркера для ЖК-лендинга нет (фикстуры нет, encryptedPhones неприменим), порог 1 МБ там был бы выдуманным.

Тесты

test_3191_yandex_detail_completeness.py: 359 passed, 1 skipped (-k yandex); фейковые ответы соседних тестов дополнены до «полной страницы», иначе они молча стали бы кейсами про полноту. Фальсификация (откат продовых файлов): Expected 'save_detail_enrichment' to not have been called — недогруз сохраняется как успех.

Ущерб (прод-замер — комментарием в issue)

SQL воркера по прокси-признаку agency_name IS NULL AND is_pro_seller IS NULL (телефоны вычищены PII-пургой #2217) — верхняя оценка.

Refs #3191 (p1). Страница 1,8 МБ без блока контактов проходила единственную проверку `len(html) < 500` и уезжала в БД с `detail_enriched_at` — навсегда. ## Признак полноты — два независимых, любой = отказ - **структурный `encryptedPhones`** (`DETAIL_CONTACTS_MARKER` в `providers/yandex/detail.py`): анонимная сессия его получает — `yandex_session.py:10` и миграция 274 прямо фиксируют, что с куками и без есть `encryptedPhones`/`redirectPhones`, отличается только `mainPhone` (поэтому `mainPhone` признаком быть не может). Наблюдавшийся недогруз 1,8 МБ ловит именно маркер; - **размер** `settings.yandex_detail_min_html_bytes` (1 МБ, config.py рядом с соседними yandex-настройками). ## Недогруз = отказ Проверка в `yandex_detail_backfill.py` ДО `parse` → `incomplete += 1`, `failed += 1`, `continue`; `save_detail_enrichment` не вызывается → `detail_enriched_at` не проставлен → очередь (`detail_enriched_at IS NULL`) берёт объявление снова. `incomplete ⊆ failed`, тождество `attempted == enriched + failed` (#3338) держится. Серия недогрузов двигает `consecutive_none` → брейкер `max_consecutive_blocks` обрывает прогон. Per-listing счётчика попыток в схеме нет — колонка не заводилась (ограничение только на уровне прогона; отметить в issue). `newbuilding.py` не тронут: надёжного маркера для ЖК-лендинга нет (фикстуры нет, `encryptedPhones` неприменим), порог 1 МБ там был бы выдуманным. ## Тесты `test_3191_yandex_detail_completeness.py`: `359 passed, 1 skipped` (-k yandex); фейковые ответы соседних тестов дополнены до «полной страницы», иначе они молча стали бы кейсами про полноту. Фальсификация (откат продовых файлов): `Expected 'save_detail_enrichment' to not have been called` — недогруз сохраняется как успех. ## Ущерб (прод-замер — комментарием в issue) SQL воркера по прокси-признаку `agency_name IS NULL AND is_pro_seller IS NULL` (телефоны вычищены PII-пургой #2217) — верхняя оценка.
bot-backend added 1 commit 2026-09-05 19:02:58 +00:00
fix(tradein): недогруженная карточка Яндекса — отказ, а не успех (#3191)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m11s
4b5f8fb54c
Страница на 1,8 МБ без блока контактов приходит с HTTP 200 и валидным HTML:
window.INITIAL_STATE на месте, parse отрабатывает — и частичная карточка уезжала
в БД с detail_enriched_at, выбывая из очереди навсегда. Единственная проверка
размера (newbuilding.py, len(html) < 500) отвечала на вопрос «пришло ли хоть
что-то»: 1,8 МБ проходит её в 3600 раз.

Признак полноты структурный + размерный, любой из двух даёт отказ:
encryptedPhones (65 вхождений у полных карточек, 0 у недогруза; отдаётся и
анонимной сессии — см. yandex_session.py) и settings.yandex_detail_min_html_bytes
(1 МБ). Наблюдавшийся недогруз ловит именно структурный: 1,8 МБ порог проходит.

В backfill проверка стоит ДО parse: исход incomplete ⊆ failed, save не
вызывается, значит detail_enriched_at не проставляется и следующий снапшот
(detail_enriched_at IS NULL) возьмёт объявление снова. Серия недогрузов двигает
consecutive_none — тот же брейкер, что у parse→None, поэтому вечно недогружаемая
карточка обрывает прогон, а не молотится (per-listing счётчика попыток в схеме
нет).

Фейковые ответы в тестах-соседях (#3196/#3338) теперь при HTTP 200 выглядят
полной страницей — иначе они молча стали бы кейсами про полноту.
Light1YT added 1 commit 2026-09-05 19:14:53 +00:00
fix(tradein): маркер полноты — encryptedPhones ИЛИ redirectPhones (#3191)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 13s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m21s
78e3da6bc3
Ревью #3364. Требуя именно encryptedPhones, отбраковывали бы вечно
необмеренный класс карточек «без телефона / только чат»: в очередь они
возвращаются, а ключ не появится. redirectPhones измерен тем же замером
#3192 и присутствует в обеих ветках (с куками и без).

Текст ABORT: consecutive_none смешанный (фетч-ошибка + parse-None +
недогруз) — «N подряд без обогащения», а не «недогруженных».
bot-backend merged commit 6ced16618c into main 2026-09-05 19:21:06 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#3364
No description provided.