fix(tradein/scraper): прогон, у которого отказал каждый якорь, перестаёт быть успехом (#2625) #2813
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2813
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2625-run-that-did-nothing"
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?
Summary
Остаток #2625 после #2642. Основную часть (капча Циана →
banned, заглушки Яндекса →banned) закрыл #2642 — это подтверждено замером прода, см. ниже. Здесь чинится третий исход, у которого терминального статуса не было вовсе.Замер до/после (прод, 2026-08-10)
Развёртки
cian_city_sweep*/yandex_city_sweep*/*_full_load, окно от 21.07:donebannedfailedЧестная оговорка:
banned = 0в обеих колонках. Значит падение 42 → 1 дал не детект #2642, а то, что сбор реально заработал (#2796, #2798, #2800-#2805, #2804). Детект #2642 на проде не срабатывал ни разу — его правильность подтверждена только юнит-тестами.Что осталось
Тот единственный — прогон 3557 (
yandex_city_sweep_pervouralsk, 09.08 17:11): 155 мс,{"anchors_total": 1, "anchors_done": 1, "errors_count": 1, "lots_fetched": 0}, статусdone.И он не новый. За 90 суток под тот же признак попадают 28 прогонов, в том числе
yandex_city_sweep_nizhniy_tagil— 16 суток подряд (15-30.07), каждый ровно 240 с (таймаут якоря), ноль лотов,doneкаждый раз.Почему детект #2642 их не ловит — и правильно не ловит
Он считает попытки разбора (
_track_gate_result), аtransport_errorтуда не попадает намеренно (#2600 п.1: «наш прокси сдох» не должно выглядеть баном площадки). Якорь, упавший по таймауту или исключению до первого разобранного ответа, даётattempts == 0— условиеattempts > 0 and failures == attemptsмолчит, и прогон уходит вdone.Три случая разведены
banneddone→donefailedПризнак и что он доказывает
errors_count >= anchors_totalпри измеренном нуле (через существующий_run_result_count, #2703 — «не измерено» ≠ ноль).Поэтому
failedбезban_kind, а неbanned/platform: ротацию IP (#2611) на догадке дёргать нельзя (#2764). Признак намеренно не опирается на список антибот-маркеров — маркеры объясняют уже случившийся отказ и молчат про неизвестный (урок 09.08, #2798).Где стоит страж
В
mark_done, а не в каждом sweep'е: у финализатора четыре десятка вызывающих, и сторож, который надо не забыть позвать, — тот же дефект оборванной проводки, из-за которого задача и появилась. Обе strangler-копии (app.services.scrape_runs+scraper_kit.orchestration.runs).Ложная тревога не создаётся (замер, 90 суток)
done(частичный сбор — сбор);errors_count = 0, ноль лотов) → остаютсяdone;Test plan
tests/test_2625_run_that_did_nothing.py— 34 проверки, красный на origin/main:AssertionError: assert ['done'] == ['failed'](не AttributeError — поведенческие тесты читают статус в SQL, а не имя новой функции). Контрольныеtest_partial_harvest_stays_done/test_honest_empty_stays_doneпроходят на старом коде — тест не требуетfailedогульно.Критерий приёмки на проде — записан ДО факта
Ближайшие прогоны, способные сработать:
yandex_city_sweep_nizhniy_tagil(~14:10 UTC ежедневно) иyandex_city_sweep_pervouralsk(~17:10 UTC, раз в 3 суток).Проверка 11.08 после 18:00 UTC:
status='done'приerrors_count >= anchors_totalиlots_fetched = 0; строки, попавшие под правило, несутstatus='failed'иerror LIKE 'sweep-honest-status:%'.failedу прогона сlots_fetched > 0или сerrors_count < anchors_total— это ложная тревога, откатывать.Refs #2625
🤖 Generated with Claude Code