feat(tradein/domclick): чекпоинты для city_sweep — корзина как единица возобновления (#3118) #3140
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3140
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/3118-domclick-checkpoint"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Реализация вывода из форензика #3118 (и исправление моего же раннего «домклику чекпоинтить нечего» из #3074 — тот замер по средним 3 минутам был опровергнут данными #3118).
Почему теперь да
QRATOR рубит свип внутри 1-2-й корзины при ЛЮБОМ старте (
buckets_completed ≤ 1из 6 во всех прогонах), при этом banned-прогоны собирают 59–1815 лотов. Сдвиг #2854 лишь распределяет потери по корзинам; чекпоинт превращает случайную ротацию в систематический обход — шесть прогонов закрывают шесть корзин вместо случайных повторов. Это прямая цитата вывода владельца в #3118.Как (зеркально yandex-чекпоинту #3074/PR #3098)
fetch_city(skip_buckets=...): по собранным корзинам ни одного запроса;completed_buckets— ИМЕНА завершённых (счётчик остаётся);buckets_totalсжимается до объёма ЭТОГО прогона — иначе honest-status (#2625/#2700) читал бы возобновлённый прогон как вечно-частичный; гард «цепочка накопила все 6» → честный no-op без падения на пустом обходе;done_buckets = унаследованное ∪ завершённое, записывается heartbeat'ом сразу после фазы (мерж jsonb — финализаторы done/banned/failed ключ не затирают);resume_run_id=_pick_resume(...)— весь generic-механизм #2845 (params-идентичность, свежесть, потолок цепочки, machine-readable отказы) бесплатно;Проверки
test_3118_domclick_checkpoint.py(4): скип не порождает запросов + total сжат; блок на середине сохраняет имена завершённых; все-6-в-чекпоинте → no-op; планировщик отдаёт resume_run_id (красный на main по значению: None ≠ 6001)Приёмка на проде: у следующего оборванного
domclick_city_sweepпреемник показываетresume_reason='ok'и растущийdone_buckets; за ≤6 прогонов покрываются все 6 корзин (сейчас — никогда). Обрывы у домклика ежедневные, приёмка снимется за 1-2 суток.🤖 Generated with Claude Code
Смержил после разбора. Отмечу, что проверял и что осталось под наблюдением.
Что проверял
Правки в общем
pipeline.py(−41/+60) — целиком косметика форматтера. Переносы строк вокруг_try_rotate_within_budgetи склейка логов; ни одного изменения логики. Это важно, потому что файл общий для avito/cian/yandex, и регресс там задел бы всех.Механизм не новый.
_pick_resumeуже обслуживает четыре задания (строки 847, 904, 924, 953) — здесь к нему подключается пятое. Тождество задания сверяется поsource+paramsпобайтово, что и требуется.Цепочка resume завершается.
_RESUME_STATUSES = {banned, cancelled, failed}— от прогона со статусомdoneнаследование не происходит вовсе, поэтому «собрали всё → следующий начинает заново» работает по построению.Остаточный край — стоит посмотреть после первого возобновлённого прогона
No-op ветка (все шесть корзин уже в чекпоинте предшественника) опирается на то, что вызывающий финализирует такой прогон как
done. Тестtest_all_skipped_is_honest_noopпроверяет, что обход не падает, но терминальный статус не фиксирует.Если такой прогон почему-то финализируется как
banned, получится замкнутый круг: следующий прогон снова унаследует полный чекпоинт, снова ничего не соберёт, и domklik встанет насовсем. Косвенный довод против: no-op не делает ни одного запроса, значит сигнала блокировки взяться неоткуда, и honest-status должен датьdone.Проверить это дёшево — после первого прогона, у которого
resume_reasonнеno_checkpoint:Пока это не наблюдалось: за неделю у
domclick_city_sweep0 успешных прогонов из 6, всеbanned, так что хуже текущего состояния изменение сделать не может.