feat(tradein): avito city-sweep — IMV-фаза (один прогон = SERP+detail+houses+IMV) #861
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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#861
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-avito-full-sweep-imv"
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?
Запрос: сделать одного поставщика (avito) который за ОДИН прогон наполняет ВСЕ данные, не несколько мелких запусков.
Было: avito city-sweep = SERP→detail→houses; IMV отдельным эндпоинтом. Стало: + финальная IMV-фаза в том же run.
CitySweepStartRequest.enrich_imv: bool = True→ проброс вrun_avito_city_sweep.run_avito_city_sweepсобираетtouched_house_idsпо ходу houses-enrichment → после всех anchor'ов вызываетprocess_houses_imv_batch(house_ids, request_delay_sec).house_imv_backfill.process_houses_imv_batch(db, house_ids, *, request_delay_sec)— новая обёртка по явному set house_id (reuse T7 core), пропускает дома без coords/address и с imv_status='ok'.14 тестов (test_sweep_imv_phase.py). 1472 passed, ruff clean. (2 фейла cian_valuation/search — pre-existing.)
⚠️ IMV-прокси приходит из #860 (route avito_imv через scraper_proxy_url) — мержить #860 раньше/вместе, иначе IMV-фаза пойдёт с datacenter-IP. request_delay_sec общий для houses+IMV (если IMV ловит 429 — добавить отдельный imv_delay_sec).
✅ APPROVE — avito city-sweep IMV-фаза (один прогон = SERP+detail+houses+IMV). Graceful, well-guarded.
Проверено (критичная зависимость снята):
save_house_catalog_enrichment(db, e) -> dict[str, int]УЖЕ возвращает{'house_id': N, ...}(avito_houses.py:1161-1175) →house_counters.get("house_id")валиден,touched_house_idsкорректно наполняется. Не AttributeError. (Интеграционные тесты мокаютrun_avito_pipelineцеликом — этот путь проверен мной отдельно по сигнатуре.)process_houses_imv_batch: пустой set → fast-return (тест: db не вызывается); SELECTid IN (:hid_N)numbered-binds (без инъекции, f-string только имена плейсхолдеров), фильтр lat/lon/address NOT NULL +imv_status != 'ok'(экономит API-квоту);_process_one_house(reuse T7), auth_error→60s/else delay. No:x::type.run_avito_city_sweep: агрегируетall_touched_house_idsпо anchor'ам; после цикла — cooperative-cancel (mark_done+return), иначеprocess_houses_imv_batchв try/except (crash → log +errors_count++, sweep всё равно mark_done); imv_attempted/enriched/failed + heartbeat.enrich_imv=False/пусто → skip.#860 зависимость удовлетворена (смержен): IMV-фаза →
evaluate_via_imvтеперь проксирован; #861 не трогает avito_imv.py → чистый merge.Anti-regression: PipelineResult/CitySweepCounters — новые default-поля (backward-compat); run_avito_pipeline save не изменён (доп. трекинг house_id); detail_top_n консервативен (429-риск). 14 тестов (все ветки: true/false/no-touched/crash-not-abort/cancel/empty/endpoint), 1472 passed. 2 предсущ. cian_valuation/cache фейла (CI-green класс). Секретов/self-extending нет.
Минор (не блок):
IN (...)с numbered-binds на большом touched-set — works, ноANY(CAST(:ids AS bigint[]))был бы чище (как в #858 batch). Перф-нит, не баг.Мержу. (Inbox-запрос «один поставщик за один прогон», без clean linked-issue.) Post-deploy QA: ad-hoc city-sweep → counters imv_attempted/enriched > 0.