From 08cff706ec7f5b2aca34555e1b066d599e4d829c Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 15 Aug 2026 21:00:42 +0300 Subject: [PATCH] =?UTF-8?q?docs(tradein/deactivate):=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D1=87=D0=B8=D1=81=D0=BB=D0=BE=20=D0=B8=D0=B7=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=82=D0=BE=D0=BB=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В шапке модуля, в комментарии миграции 264 и в докстринге теста стояло «23 687 из 44 744 avito-объявлений не подтверждались >7 суток» под заголовком «ЗАМЕР НА ПРОДЕ». Число реальное, но приписано не тому. Перепроверено запросом 2026-08-15: это ВСЕ источники вместе, и две трети — новостройки, которых оценщик не берёт (он фильтрует listing_segment IS NULL OR = 'vtorichka'). У самого avito просроченных строк ноль: 8 663 активных, максимальный возраст 10 суток. Оставлять это в коде нельзя: следующий человек прочитает «avito раздут вдвое», проверит и не найдёт — а заодно потеряет доверие к остальным числам в том же абзаце, которые верны и сверены с scrape_runs.counters. Заодно явно записано, чего потолок НЕ делает: он не сжимает пул (0 деактиваций замерено на всех четырёх джобах), а защищает от разгона пола и от опечатки в расписании. Настоящий раздутый срез — строки с пустым сегментом, они чинятся отдельной джобой. --- .../backend/app/tasks/deactivate_stale_avito.py | 14 +++++++++----- .../sql/264_deactivate_stale_avito_cap_mult.sql | 10 +++++++--- .../backend/tests/test_deactivate_stale_ttl_cap.py | 9 +++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tradein-mvp/backend/app/tasks/deactivate_stale_avito.py b/tradein-mvp/backend/app/tasks/deactivate_stale_avito.py index 9248a45c..52432da6 100644 --- a/tradein-mvp/backend/app/tasks/deactivate_stale_avito.py +++ b/tradein-mvp/backend/app/tasks/deactivate_stale_avito.py @@ -202,11 +202,15 @@ _REVISIT_FLOOR_SEGMENT_FILTER = "\n AND l.listing_segment = ANY(CAST(:s # ── Потолок эффективного TTL (положительная обратная связь пола, найдено 2026-08-15) ── # У пола выше нет верхней границы: max(ttl_days, пол) может расти неограниченно. -# ЗАМЕР НА ПРОДЕ, из-за которого этот потолок существует: 23 687 из 44 744 «активных» -# avito-объявлений не подтверждались >7 суток; cian 10 572/19 514 и yandex 7 178/15 790 -# — старше 30 суток; самая старая «активная» запись не видена 86 суток. В пуле -# сравнимых 3 497 просроченных строк. У yandex counters держали ttl_days_effective -# 75/75/75/39/52/54 шесть прогонов подряд при deactivated=0. +# ЗАМЕР НА ПРОДЕ (уточнён 2026-08-15 после разбора): у yandex counters держали +# ttl_days_effective 75/75/75/39/52/54 шесть прогонов подряд при deactivated=0 — +# пол реально разгонялся без верхней границы, и потолок закрывает именно это. +# ЧЕГО ПОТОЛОК НЕ ДЕЛАЕТ: он НЕ сжимает пул «активных». Замер показал 0 +# деактивируемых строк на всех четырёх джобах и до, и после калибровки. Цифра +# «23 687 из 44 744 не подтверждались >7 суток» относится ко ВСЕМ источникам +# сразу, и две трети её — новостройки, которых оценщик не берёт. У avito +# просроченных ноль. Раздутый пул, влияющий на оценку, лежит в строках с ПУСТЫМ +# сегментом и чинится отдельной джобой, не этим потолком. # # МЕХАНИЗМ ПЕТЛИ: медленный обход поднимает пол (он же квантиль разрывов переобхода) # -> высокий пол продлевает жизнь снятым лотам дольше, чем к ним успевает вернуться diff --git a/tradein-mvp/backend/data/sql/264_deactivate_stale_avito_cap_mult.sql b/tradein-mvp/backend/data/sql/264_deactivate_stale_avito_cap_mult.sql index 33128201..fc0a1273 100644 --- a/tradein-mvp/backend/data/sql/264_deactivate_stale_avito_cap_mult.sql +++ b/tradein-mvp/backend/data/sql/264_deactivate_stale_avito_cap_mult.sql @@ -5,9 +5,13 @@ -- поднимает эффективный TTL через max(ttl_days, пол) без верхней границы -- на проде -- это оказалось петлёй с положительной обратной связью: медленный обход поднимает -- пол, высокий пол продлевает жизнь снятым лотам дольше, чем к ним успевает --- вернуться свежий обход, пул «активных» раздувается протухшими строками -- 23 687 --- из 44 744 avito-строк не подтверждались >7 суток, самая старая «активная» запись --- не видена 86 суток. Потолок cap_mult ограничивает пол сверху: эффективный TTL не +-- вернуться свежий обход, пул «активных» раздувается протухшими строками. ВАЖНАЯ +-- ОГОВОРКА (перепроверено 2026-08-15): цифра «23 687 из 44 744» -- это ВСЕ источники +-- вместе, и две трети её -- новостройки, которые оценщик не берёт вообще. У самого +-- avito просроченных строк НОЛЬ (8 663 активных, максимальный возраст 10 суток) -- +-- его деактивация работает исправно. Этот потолок существует не ради сжатия пула +-- (он деактивирует 0 строк, замерено), а как защита от опечатки в расписании и от +-- будущего разгона пола. Потолок cap_mult ограничивает пол сверху: эффективный TTL не -- может превысить ttl_days * cap_mult (код -- app/tasks/deactivate_stale_avito.py, -- CAP_MULT). -- diff --git a/tradein-mvp/backend/tests/test_deactivate_stale_ttl_cap.py b/tradein-mvp/backend/tests/test_deactivate_stale_ttl_cap.py index 8045a548..ddbaa559 100644 --- a/tradein-mvp/backend/tests/test_deactivate_stale_ttl_cap.py +++ b/tradein-mvp/backend/tests/test_deactivate_stale_ttl_cap.py @@ -4,10 +4,11 @@ эффективный TTL через max(ttl_days, пол) без верхней границы. На проде это оказалось петлёй с положительной обратной связью: медленный обход поднимает пол, высокий пол продлевает жизнь снятым лотам дольше, чем к ним успевает вернуться свежий обход, пул -«активных» раздувается протухшими строками -- 23 687 из 44 744 avito-строк не -подтверждались >7 суток; cian 10 572/19 514 и yandex 7 178/15 790 -- старше 30 суток; -самая старая «активная» запись не видена 86 суток. У yandex ttl_days_effective держали -75/75/75/39/52/54 шесть прогонов подряд при deactivated=0. +«активных» раздувается протухшими строками. У yandex ttl_days_effective держали +75/75/75/39/52/54 шесть прогонов подряд при deactivated=0 -- это и есть разгон пола, +ради которого потолок написан. Цифру «23 687 из 44 744» из исходного разбора сюда НЕ +переносим: она про все источники сразу, две трети её -- новостройки вне выборки +оценщика, а у самого avito просроченных строк ноль (уточнено 2026-08-15). Этот файл проверяет CAP_MULT -- потолок, не пускающий эффективный TTL выше ttl_days * CAP_MULT, независимо от того, насколько высоко посчитанный пол.