[HIGH] tradein/scraper: охват Домклика упал в 8-10 раз — прод-свип даёт ~1% предложения, а видимый пул держался внешним ручным ингестом #2657
Closed
opened 2026-08-05 15:17:03 +00:00 by bot-backend
·
11 comments
No Branch/Tag specified
main
fix/3469-showcase-schedule
fix/3443-caddy-selfdowntime
fix/3463-db-statement-timeout
fix/3448-caddy-only-detection
fix/metrics-deploy-reloads-prometheus
feat/landing-showcase-band
fix/3452-corridor-advisory-zone
fix/alert-value-is-not-the-ratio
fix/3449-geocoder-cancel-orphan
fix/3451-tvf-deals-rooms
fix/msk-collector-net-retry
feat/msk-yandex-import
fix/3051-fetch-deals-rooms-dropped
feat/msk-collector-cian
fix/3256-asking-to-sold-buckets
fix/3083-estimate-throughput
fix/3274-part2b-gate
fix/3274-part2a-caddy-retry
fix/perimeter-smoke-retry-on-no-response
fix/3274-zero-downtime-frontend
fix/3274-part1-deploy-swap
fix/3412-cian-instance-relaunch
fix/3415-bucket-done-only-if-phases-ok
chore/backend-pool-wiring-tails
fix/3398-pool-ops-off-event-loop
fix/3402-followups-ban-kinds-curl
feat/3404-proxy-run-attribution
fix/cian-captcha-is-platform-refusal
refactor/3390-single-runs-module
fix/3398-estimator-valuations-proxy-pool
fix/3386-estimator-imv-proxy-pool
fix/3394-cian-sweep-houses-proxy-pool
fix/3393-interrupted-runs-outside-streaks
fix/drain-marks-inflight-app-tasks
fix/3384-no-proxy-at-batch-start
fix/3197-yandex-newbuilding-proxy-pool
fix/3376-price-history-decimal-slips
fix/backend-proxy-pool-flags
fix/3197-cian-history-backfill-proxy-pool
fix/3288-sidecar-ban-status-code
fix/3375-yandex-fullload-on-bucket-contract
fix/3380-deploy-metrics-alloy-recreate
fix/3354-alloy-query-secret-scrub
fix/3360-admin-prefix-anon-404
fix/3368-yandex-leaf-complete-flag
fix/3369-domclick-cancel-checkpoint
fix/3225-domklik-diff-percent
fix/smoke-history-path
fix/3288-breaker-block-kind
fix/3355-drain-mark-fullloads
fix/3191-yandex-detail-completeness
fix/3359-containment-cian-yandex
fix/3323-payment-init-fail-409
fix/3172-freshness-by-data
fix/3288-avito-ban-per-source
fix/3253-domclick-house-fields
fix/3312-defer-interval-minutes
fix/3324-rbac-401-oracle
fix/3274-deploy-window-error-page
fix/3343-auth-latency-flaky
fix/3315-exhaustive-containment-skip
fix/3338-backfill-save-false
fix/3339-thin-market-badge
fix/3154-glitchtip-secret-log-leak
fix/3333-drain-mark-all-sweeps
fix/3323-imv-thin-market-gate
fix/3324-mera-perimeter
fix/3323-coverage-copy-honesty
fix/3332-domclick-counter-identity
fix/3324-ptica-deploy-gate
fix/3316-role-single-source
fix/3319-citysweep-checkpoint
fix/3322-rosseti-stable-key
fix/3320-v2-honest-zeros
fix/3321-draft-fields-survive
fix/mera-mobile-nav-and-sticky
fix/audit-form-ux
fix/audit-coverage-500
fix/audit-dkp-price
fix/audit-accuracy-window
fix/audit-faq-contradiction
fix/perimeter-smoke-after-payments
feat/b2c-landing-honest-copy
feat/b2c-landing-live-numbers
feat/b2c-v3-becomes-root
feat/b2c-v3-port-v1-blocks
feat/b2c-report-redesign
feat/b2c-landing-v3-full
feat/3192b-yandex-phones
feat/3168-backfill-cursor-resume
fix/3118-domclick-no-proxy
fix/3170-yandex-combo-checkpoint
feat/3074-newbuilding-sweep-resume
fix/3163-infra-topic-default
fix/3156-tgbot-error-type
feat/3163-infra-topic-split
fix/3161-alertmanager-route-prefix
fix/3155-prometheus-no-alertmanager
feat/2997-drop-listings-geom-idx
fix/3122-boot-reap-observable
feat/3122-boot-reap
feat/3051-houses-region-code
feat/3074-cian-anchor-checkpoint
feat/3051-region-registry
fix/2656-anchor-ratio-freshness
fix/3114-scrub-credentials-in-logs
fix/3078-grafana-single-auth
fix/3081-honest-progress
fix/3063-pro-seller-derive
fix/3074-checkpoint-survives-claim
fix/3082-estimate-concurrency
fix/3044-enriched-total-seen
fix/telegram-pin-selectel-override
chore/compose-host-parameterised-resources
fix/revisit-floor-lateral-lookup
fix/avito-detail-fields
fix/3034-avito-fingerprint
fix/avito-offers-per-page
feat/3033-avito-secondary-filter
fix/2203-restore-drill-readiness
feat/2203-backup-staleness-and-forgejo
fix/2990-clean-start-initdb
fix/2924-yandex-jk-resolve-tried-at
fix/2992-upsert-distinct-gate
fix/2998-rosreestr-q2-partitions
feat/2936-null-penalty-flag
fix/2996-mislocated-houses-watchdog
fix/1781-secondary-only-param
fix/2934-risks-coverage
fix/2464-three-small
fix/2464-two-docstrings
fix/2464-zouit-label
fix/2464-building-pct-guard
fix/2464-download-binary-retry
fix/2986-permits-key
fix/2464-tep-docstring
fix/2464-act-date-backfill
fix/2464-area-bin-null
fix/2464-act-date-citation
fix/2464-detect-kind
fix/2464-status-negation
fix/2464-objective-zombie-sweep
fix/2464-inert-retry-config
fix/2464-default-profile-unique
fix/2464-zombie-any-running
fix/2464-catalog-skipped-counter
fix/2464-heat-loader-tx
fix/2464-objective-run-stuck
fix/2464-catalog-waf-breaker
fix/2464-lock-key-order
fix/2464-backfill-waf-abort
fix/2464-docs-vs-code
fix/2464-land-reservation-dedup
fix/2464-manual-list-validation
fix/2464-capacity-savepoints
fix/2464-leads-window-naming
fix/2464-zouit-count-label
fix/2464-catalog-batch-commits
fix/2464-html-zoning-fallback
fix/2950-lock-wait-observable
fix/2956-freshness-counts-failed-harvest
fix/2950-host-lock
fix/2953-nominatim-throttle
fix/2950-deploy-docker-lock
fix/2464-ird-lookups-savepoint
fix/2464-parcels-savepoint-pair
fix/2674-deal-floor-display
docs/2854-stale-justifications
chore/2857-drop-placeholder-columns
fix/2855-probe-protected-path
fix/2674-has-panorama
fix/house-imv-anchor-era
fix/2674-quality-cadastre-column
fix/sber-freshness-guard
fix/dkp-corridor-as-of
fix/scheduler-resume-checkpoint
fix/quarter-target-from-neighbour
fix/2687-domclick-ban-kind-platform
fix/2814-address-backfill
fix/2677-house-anchor-renovation
feat/tradein-paid-retention
chore/ci-config-cleanup
feat/mera-b2c-privacy
feat/tradein-payments-schema
chore/2674-dead-code-sweep
fix/2674-matching-tiers-honesty
fix/2674-avito-full-load-coverage
fix/2674-admin-metrics-honesty
fix/2674-writers-honor-schema
fix/2674-alerts-actually-fire
fix/2679-scraper-deploy-parity
fix/2674-house-imv-params
fix/2666-discount-plausibility-gate
feat/2435-cian-house-enrichment
fix/2657-domclick-block-not-done
feat/2571-login-throttle
fix/2660-display-freshness-segment
fix/2658-loud-skip-status
fix/2603-geocode-city-hint-tails
feat/2600-per-source-proxy-health
feat/tradein-v2-exposure-in-result-card
fix/tradein-avito-browser-proxy-pool
chore/tradein-cut-wasteful-scraping
fix/tradein-v2-deals-fallback-visible
fix/tradein-city-stamp-geo-guard
fix/tradein-cian-oblast-secondary
fix/tradein-implausible-build-year
fix/tradein-snapshot-query-perf
fix/tradein-asking-sold-city-scope
chore/tradein-purge-dead-mobileproxy
feat/tradein-asocks-rotation
fix/tradein-region-code-foreign-cities
fix/tradein-proxy-pool-self-healing
fix/tradein-backfill-listing-city-from-url
fix/tradein-geocode-queue-active-only
fix/tradein-geocode-city-hint
chore/tradein-remove-yandex-scripts
fix/tradein-listing-city-from-sweep
chore/tradein-remove-yandex-geocoder
chore/tradein-remove-n1
fix/tradein-geocoder-fail-closed
fix/tradein-ui-city-label-clip
feat/tradein-ui-city-hint
fix/tradein-coords-backfill-city-gate
fix/tradein-geocoder-city-default
fix/tradein-anchor-geo-scope
fix/tradein-avito-detail-oblast
feat/tradein-price-bands-refresh
feat/tradein-caddy-cutover
fix/tradein-team-nav-and-401
feat/tradein-team-dashboard
fix/tradein-team-list-order
feat/tradein-team-api
feat/tradein-login-ui
feat/tradein-auth-core
feat/tradein-auth-password-foundation
feat/tradein-auth-users-schema
fix/tradein-rbac-test-user2-expired
fix/tradein-auth-revoke-user2
fix/2013-avito-cohort-null
fix/rbac-test-user2-expired
fix/expire-brusnika-trial-access
feat/tradein-domclick-house-sku-schema
chore/design-sync-tradein
fix/tradein-deploy-scraper-paths-filter
fix/tradein-no-numberless-house-insert
fix/tradein-dedup-fias-pass-no-geoguard
feat/tradein-fias-estimate-frontend
fix/tradein-dedup-by-fias
feat/tradein-fias-tier-matching
fix/tradein-v2-uiux-p1
fix/objective-lots-dedup-1964
fix/audit-followups-1953
feat/concept-house-picker-1965-stage3b
feat/concept-house-catalog-1965-stage3a
feat/concept-live-massing-1965-stage2b
feat/concept-recompute-1965-stage2a
feat/concept-section-1965-stage1
fix/best-layouts-per-object-snapshot-1956
fix/deficit-segmentation-1959
feat/tradein-hedonic-ground-floor
fix/report-map-points-1961
fix/report-microcopy-1963
fix/report-nspd-zoning-1962
fix/report-frontend-display-1953
perf/tradein-estimate-audit
perf/best-layouts-objects-first
fix/171-migration-path
perf/171-objective-crm-report-month-idx
fix/1926-app-log-stdout
fix/estimator-tiebreaker-nanalogs
fix/1917-fetch-json-network-retry
fix/1926-scrape-runs-total-seen
fix/1781-house-fk-source-identity
feat/39-osrm-per-category
feat/1746-utility-infra-map
fix/test-849-savepoint-count
fix/parking-economics-by-class
fix/zouit-engineering-area-gate
fix/zoning-resolution-decouple
feat/dcf-velocity-schedule
feat/zone-regulation-backfill
chore/mock-financial-estimate
fix/finmodel-split-disclosure-threshold
feat/finmodel-financing
feat/finmodel-sitefinder-bridge
feat/finmodel-dcf
feat/finmodel-price-calibration
feat/finmodel-cost-cascade
audit/1871-p2-estimator-dedup-split
audit/1871-p2-avito-coord
audit/1871-p3-uiux
audit/1871-p2-invest-moi
audit/1871-p2-velocity-market
audit/1871-p1-3-isreal-stubs
audit/1871-p1-2-ghost-anchor-guard
audit/1871-p1-scenarios-collapse
revert/site-finder-v2
fix/v2-remove-resource-legend
fix/v2-map-legend-position
feat/site-finder-v2-map-light-polish
rollback/site-finder-home-light
feat/site-finder-v2-cockpit
rollback/sf-old-analysis-design
feat/ptica-tabs-6-6-reports-params
fix/ptica-vri-row
feat/ptica-map-glyphs-sitefinder-dark
fix/ptica-3d-preview-product-verdict
fix/ptica-button-fontsize
fix/ptica-parity-data-mapping
chore/ptica-iso-preview-spin
fix/ptica-inter-map-product
fix/ptica-visual-parity
fix/ptica-left-rail
feat/ptica-cockpit-complete-bottom
feat/ptica-default-and-rich-map
feat/ptica-real-ksit-frontend
feat/tradein-ekb-geoportal-buildings
fix/sf-feedback-batch
feat/avito-newbuilding-sweep
feat/browser-concurrent-pool
fix/backfill-kadastr-column
fix/avito-proactive-ip-rotate
feat/activate-domclick-sweep
feat/avito-newbuilding-capture
fix/house-id-fk-realtime-link
fix/migration-162-table-if-exists
feat/riasurt-sverdl-layers-108
fix/sber-dataset-paths-902
fix/conflict-resolution-freshness-1539
feat/objective-lots-history-writer-307-obj6
feat/velocity-mv-61
fix/objective-mapping-is-reviewed-gate-307-obj2
fix/cian-detail-rich-fields
fix/avito-novostroyki-segment
feat/yandex-novostroyki-newflat
fix/ci-dedup-runner-storm-1709
fix/emiss-pk-granularity-1687
feat/listings-segment-param-1188
fix/inn-regex-word-boundary-1682
fix/excel-deficit-horizon-1590
fix/admin-scrape-validation
fix/admin-leads-interval-cast-1694
fix/dkp-corridor-doc-p10p90-1695
fix/weather-wind-d-allnone
test/residential-zone-rawprops-1681
fix/domrf-badge-regex-narrow-1686
feat/yandex-camoufox-transport
fix/score-sat-factor-1509
fix/base-pace-room-bucket-1593
fix/gate-verdict-no-blocker-1617
fix/confidence-deal-count-window-1637
fix/match-economics-1511-1512
fix/listings-partial-indexes-1398
fix/smart-suggestions-threshold-1503
fix/dkp-corridor-percentile-1520
fix/enrich-economics-window-1513
fix/leads-stats-window-1383
fix/poi-score-scale-1486
fix/geo-weight-floor-1633
fix/inn-regex-context-1640
fix/domrf-status-classify-1609
fix/emiss-period-dedup-1606
fix/cian-paginate-tail-1393
fix/normalize-zero-fill-guard-1638
fix/supply-view-devgroup-key-1650
fix/residential-zone-detect-1353
fix/score-label-threshold-1357
fix/trend-ratio-vprior-zero-1508
fix/district-median-dedup-1352
fix/supply-layers-overlap-1355
fix/pdf-expires-at-1530
fix/quartirography-area-bucket-1406
fix/cad-zones-multipolygon-1344
fix/sold-pct-market-verdict-1407
fix/week-review-finish
fix/week-review-backend-v2
feat/plan-vectorization-spike-299
fix/1668-analyze-confidence
fix/1667-metro-block
fix/1666-layout-velocity-beat
chore/remove-n1-scraper
fix/cian-kitchen-area
feat/yandex-detail-backfill
feat/avito-detail-backfill
fix/best-layouts-bucket-normalization
fix/gknspecial-incremental-commit-per-prefix
fix/okn-objects-full-registry-load
fix/parcel-ird-overlap-except-expand
fix/report-assembler-confounded-keys
fix/job-settings-json-persist-v2
fix/nspd-geo-soft-time-limit-passthrough
fix/nspd-soft-time-limit-v2
fix/pilot-request-modal-validation
fix/recommend-mix-saturation-latest-snapshot
fix/scrape-cadastre-fail-counter-v2
fix/izyatie-ocr-cad-normalize
fix/job-settings-panel-json-state-persist
fix/noise-loader-savepoint-per-row
fix/objective-sync-config-bare-except
fix/parcel-snapshot-mdash-double-escape
fix/poi-loader-leap-year-date-replace
fix/scrape-cadastre-permanent-fail-counter
fix/usermenu-analyst-role-label
feat/location-948b-r
feat/location-entity-948b
feat/insight-entity-948a
feat/analyst-role-audit-962
feat/cbr-inflation-macro-946
feat/cian-zhk-resolve-972
perf/forecast-parallel-horizons-1129
feat/newbuilding-enrich-backfill-972
feat/emiss-macro-indicators-946
feat/rosstat-emiss-macro-946
ci/frontend-vitest-job
chore/frontend-vitest-wkt-tests
feat/forecast-meta-footer
feat/forecast-future-supply-competitors
feat/forecast-docx-pptx-buttons
feat/forecast-scoring-panel
feat/forecast-product-tz-block
feat/market-map-layers-999
feat/forecast-chart-section6
feat/forecast-export-pptx-959
feat/forecast-export-docx-959
feat/forecast-export-ui-959
feat/forecast-export-telegram-959
feat/forecast-export-md-959
feat/analyze-response-contract-961
feat/competitor-velocity-spatial-fallback-968
fix/frontend-healthcheck-hostname
feat/analyze-market-coords-999
fix/site-finder-entry-crash-1001
feat/horizon-selector-996
feat/forecast-section-998
feat/forecast-endpoint-horizon-enqueue
feat/forecast-celery-task-persist
feat/forecast-orchestrator-service
feat/demand-supply-months-of-inventory
feat/wire-district-resolver
feat/district-vocab-reconciliation
fix/affordability-market-spread
fix/backtest-sig-gate
feat/wire-978-almon-rate-regime
feat/backtest-oos-almon-seasonal
ci/forgejo-pytest-gate
fix/tradein-praktika-logo-form-scroll
feat/yandex-exhaustive-price-room
feat/794-sber-time-adjust
chore/bot-harness-tuning
docs/agent-usage-throttle-qa-terminal
fix/avito-sweep-single-run-guard
chore/analyst-inbound-queue-tradein-db
feat/801-preview-full-wt
chore/bot-safety-followups
feat/tradein-avito-imv-fix
feat/tradein-repair-coef-calibration
feat/tradein-avito-houses-fix
feat/tradein-address-precision
feat/tradein-backfill-prioritize-listings
feat/tradein-geocode-deals-nominatim
feat/tradein-geocode-deals-from-houses
feat/tradein-same-building-match
feat/claude-envvars-and-stale-cron
No results found.
Labels
Clear labels
Находки полного мульти-агентного ревью (Claude Fable 5, 2026-06-09)
Новое ТЗ от Ген Геныча (июнь 2026): Site Finder v2 — ИИ-прогноз продуктовой стратегии девелопера. Актуальный приоритет.
Admin UI / internal tools / pipeline tracker
Аналитика данных / matching
Authentication / authorization / multi-tenancy
Автоматизация / cron / scheduler
Something isn't working
Коммерческая воронка / пилоты / pipeline / реестр ПО
Operational housekeeping
Forgejo Actions / build pipeline
152-ФЗ / реестр ПО / legal / TOS
Data sources, parsers, ETL
Уникальные данные — sales tracker, CRM aggregation
README / runbooks / onboarding
This issue or pull request already exists
Developer experience / build speed
New feature or request
Feedback from Max (Senior partner)
Generative Design — concept generation engine
Pending team sync / decision
Human review/decision required
Monitoring / metrics / logs / Sentry / Uptime
Kill-switch — all autonomous bots pause
Latency / throughput / DB query tuning
Critical / production-blocker
High priority
Normal priority
Низкий приоритет (follow-up, tech-debt)
Backend Python — FastAPI, Celery, scrapers
DB migrations, indexes, SQL
docker-compose, Caddy, workflows
Frontend — Next.js, React, TypeScript
Tests, smoke, Playwright
Скрапперы (Avito/Cian/Yandex/Rosreestr)
Security audit / secrets / vulnerabilities
Site Finder scoring quality & data layer
Stage 1: Generative MVP (нед 2-7)
Stage 2: Site Finder MVP (нед 8-12)
Blocked — needs human intervention
Closed, completed
Raw/fuzzy task filed by human — auto-analyst подхватывает: code-archeology + декомпозиция в actionable scope/* + status/ready (или split на под-issues)
Reviewer/QA вернул worker на доработку — worker сам чинит свой PR (fixup), НЕ требует human (в отличие от status/blocked)
PR merged, awaiting smoke test
Ready for pickup by worker bot
PR open, awaiting code review
Work in progress (worker claimed)
Технический долг
Trade-In MVP проект
User experience / responsive / conversion
Week review 1 — находки multi-agent аудита проекта (2026-06-14)
This will not be worked on
Исходно-разрешительная документация — слой ограничений участка для analyze-таблицы
Trade-In Estimator — проект оценки вторичного жилья
Fable 5 ревью
Находки полного мульти-агентного ревью (Claude Fable 5, 2026-06-09)
GG-форсайт
Новое ТЗ от Ген Геныча (июнь 2026): Site Finder v2 — ИИ-прогноз продуктовой стратегии девелопера. Актуальный приоритет.
admin
Admin UI / internal tools / pipeline tracker
analytics
Аналитика данных / matching
auth
Authentication / authorization / multi-tenancy
automation
Автоматизация / cron / scheduler
bug
Something isn't working
business
Коммерческая воронка / пилоты / pipeline / реестр ПО
chore
Operational housekeeping
ci
Forgejo Actions / build pipeline
compliance
152-ФЗ / реестр ПО / legal / TOS
data
Data sources, parsers, ETL
data-moat
Уникальные данные — sales tracker, CRM aggregation
docs
README / runbooks / onboarding
duplicate
This issue or pull request already exists
dx
Developer experience / build speed
enhancement
New feature or request
feedback/max
Feedback from Max (Senior partner)
generative
Generative Design — concept generation engine
needs-discussion
Pending team sync / decision
needs-human
Human review/decision required
observability
Monitoring / metrics / logs / Sentry / Uptime
pause-bots
Kill-switch — all autonomous bots pause
performance
Latency / throughput / DB query tuning
priority/p0
Critical / production-blocker
priority/p1
High priority
priority/p2
Normal priority
priority/p3
Низкий приоритет (follow-up, tech-debt)
scope/backend
Backend Python — FastAPI, Celery, scrapers
scope/db
DB migrations, indexes, SQL
scope/devops
docker-compose, Caddy, workflows
scope/frontend
Frontend — Next.js, React, TypeScript
scope/qa
Tests, smoke, Playwright
scrapers
Скрапперы (Avito/Cian/Yandex/Rosreestr)
security
Security audit / secrets / vulnerabilities
site-finder
Site Finder scoring quality & data layer
stage/1
Stage 1: Generative MVP (нед 2-7)
stage/2
Stage 2: Site Finder MVP (нед 8-12)
status/blocked
Blocked — needs human intervention
status/done
Closed, completed
status/needs-analysis
Raw/fuzzy task filed by human — auto-analyst подхватывает: code-archeology + декомпозиция в actionable scope/* + status/ready (или split на под-issues)
status/needs-fix
Reviewer/QA вернул worker на доработку — worker сам чинит свой PR (fixup), НЕ требует human (в отличие от status/blocked)
status/qa
PR merged, awaiting smoke test
status/ready
Ready for pickup by worker bot
status/review
PR open, awaiting code review
status/wip
Work in progress (worker claimed)
tech-debt
Технический долг
tradein
Trade-In MVP проект
ux
User experience / responsive / conversion
week ревью 1
Week review 1 — находки multi-agent аудита проекта (2026-06-14)
wontfix
This will not be worked on
ИРД
Исходно-разрешительная документация — слой ограничений участка для analyze-таблицы
вторичка
Trade-In Estimator — проект оценки вторичного жилья
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
ИРД
вторичка
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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#2657
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Обвал охвата Домклика: прод-свип даёт ~1% предложения, а видимый пул держался внешним ручным ингестом.
Статус: третий пункт закрыт (PR #2667, смержен и проверен на проде). Первый и третий из «что решать» остаются — они на владельце.
Найдено при разборе #2574. Домклик выглядел здоровым: сбор ежедневный, свежесть идеальная. Но активных объявлений 376 против ~6 296 месяц назад, и объяснение оказалось хуже, чем «сузили охват».
Пул держался не тем, чем казалось
Те ~6 296 активных никогда не приходили из прод-развёртки. Их залил внешний ручной ингест
scripts/ingest_domclick_jsonl.py→save_listingsбезrun_id: вlistings_snapshotsвидно ровно 6 296 строк в сутки сrun_id IS NULLс 28.06 по 18.07, дальше ноль. Все 6 128 «мёртвых» строк заморожены на одномscraped_at = 2026-07-18 11:54:46.215350— одна транзакция.То есть месяц наш «домкликовский инвентарь» был снимком, залитым руками и ни разу не подтверждённым.
Прод-свип сломался ещё 13 июля
domclick_city_sweep: 18 прогонов подрядfailed(«QRATOR block or fetch errors — 0 listings»). После частичного восстановления 31.07 даёт 39-59 лотов в сутки против 347-464 в начале июля. Это примерно 1% реального предложения Екатеринбурга.Обвал счётчика произошёл в одном прогоне
deactivate_stale_domklik,run_id=2960, 2026-08-02 07:26, TTL=14 дней поscraped_at(включён миграцией 183) — деактивировал 6 131 строку разом. До этого дня порогNOW()-14dпросто ещё не доставал до 18 июля.Миграция 206 к обвалу отношения не имеет: она выключила только
domclick_detail_backfillи задеплоена в тот же день, но на 7 часов позже деактивации; темпdomclick_city_sweepона не трогала. Я сам подозревал её первой — не подтвердилось.Потерь между «найдено» и «сохранено» нет:
lots_fetched == inserted + updatedв каждом прогоне. Теряется всё выше по потоку, на блоке QRATOR.✅ Блок QRATOR больше не помечает прогон успешным — сделано
PR #2667. Оказалось, что моя формулировка была неверна: блок никогда не давал ноль лотов (срабатывает после сбора части бакетов, 39-464 лота), а гейт честности требовал одновременно блока и нуля — условие недостижимое, поэтому все 13 блоков из 13 уходили в
done. Подробности и две поправки к моим утверждениям — в комментариях ниже.Что остаётся решать (на владельце)
domclick_city_sweep— упирается в QRATOR, то есть в прокси (#2638), либо признать, что Домклик даёт 1% рынка, и перестать считать его полноценным источником в покрытии.scripts/ingest_domclick_jsonl.py: ручной ингест безrun_idсоздаёт инвентарь, неотличимый от собранного, но не подтверждаемый и невидимый для журнала прогонов. Либо прошить его через обычный путь сrun_id, либо убрать.Связано: #2574, #2625, #2638, #2670, миграции 183 и 206.
Working on this in PR #2667 — только пункт 2 issue (прогон с блоком не должен быть
done).Прод-факт: 13 из 13 прогонов
domclick_city_sweepсblocked=1уходили вdone, потому что honest-status (#1968) требовал ОДНОВРЕМЕННО блок и ноль лотов, а QRATOR обрывает sweep уже после первых собранных бакетов. 20failed-прогонов — другой путь (blocked=0,errors_count=1), там блок доDomClickBlockedErrorне доехал.Пункты 1 (охват свипа) и 3 (
ingest_domclick_jsonl.py) не трогал.Поправка к третьему пункту, который я сам же и сформулировал неверно. PR #2667 (открыт, на ревью).
Я написал «блок обрывает все бакеты, забирает ноль лотов — и прогон всё равно
done». Прод-данные говорят другое:donefailedРаспознанный блок никогда не давал ноль лотов. Он срабатывает уже после того, как часть комнатных бакетов собрана — 39-464 лота при ёмкости города около 6300. А проверка честного статуса (#1968) требовала одновременно блок и ноль лотов. Это условие на живых данных не выполнялось ни разу, поэтому все 13 распознанных блоков из 13 ушли в
done.То есть механизм честности был построен, но его условие было составлено так, что сработать не могло.
Это третий случай того же класса за сегодня, и они складываются в закономерность:
Общее у всех трёх: код написан, ревью пройдено, и никто не проверил, что условие вообще достижимо. Тестами такое не ловится — тест пишут на тот случай, который автор представлял.
Чем отличается фикс от #2642
У Циана и Яндекса порог — «все попытки провалились», с защитой от ложного срабатывания на независимых точках входа. У Домклика точек входа нет: свип линейный по комнатным бакетам, первое же исключение блока прерывает цикл, и оставшиеся бакеты не пробуются вовсе. Поэтому порог здесь — сам факт блока, а не доля неудач.
Статус выбран
banned, а неfailed— симметрично #2642: это внешнее ограничение, и он же триггерит ротацию адреса (#2611, когда появится токен).Сигнал в прокси-пул не тронут: он живёт в парсере, срабатывает внутри живой аренды и раньше финализации прогона. Статус прогона и пометка прокси — разные вещи, обе нужны.
Что изменится в картине мониторинга
Домклик начнёт уходить в
bannedежедневно, пока не починены прокси (#2638). Считаю это правдой, а не шумом: охват реально около 1% городского предложения, и молчаливоеdoneэту правду скрывало. Но картина в админке изменится, и лучше знать заранее.Что осталось непонятым
Двадцать прогонов с ошибкой, но без признака блока — вероятно тоже QRATOR, только прилетевший исключением, а не страницей с маркерами. Они честно
failed, поэтому под «блок не должен бытьdone» не подпадают. Диагностировать нечем: контейнер скрапера перезапущен деплоем, логов за тот период не осталось. Это довод в пользу того, чтобы логи скрапера не терялись при редеплое — отдельный разговор.Третий пункт закрыт — PR #2667 смержен. Ревью поправило два моих утверждения, оба в сторону «я перестраховался или ошибся».
Опасение про шум алертов было перевёрнутым
Я писал, что после правки Домклик будет ежедневно уходить в
bannedи завалит алерты. Проверка кода показала обратное: алерт срабатывает на точной серии из трёх, а не на каждом прогоне — условие требует, чтобы три последних прогона были неуспешны и четвёртый был успешен. Как только серия становится длиннее трёх, алерт замолкает навсегда.И вот что интереснее: сегодня те самые 13 успешных прогонов с блоком серию РАЗРЫВАЮТ, позволяя алерту взводиться заново и срабатывать каждый раз, когда неудачи возобновляются. После правки серия становится непрерывной. Разложение по дням: первый день без алерта, второй без, на третий — один алерт, дальше тишина.
То есть правка уменьшает количество алертов, а не увеличивает. Дедупликация не нужна, и строить её не надо.
Настоящий риск — зеркальный: постоянно забаненный источник замолкает навсегда, повторного напоминания нет. Это не привнесено этой правкой (так устроено с #1968), но именно она делает длинную серию бана ожидаемым состоянием до починки прокси. Завожу отдельно.
Статус
bannedсегодня не триггерит ротациюЯ написал, что
bannedзаодно запустит ротацию адреса. Это неверно на сегодня: у Домклика фетчер собирается без подключения к прокси-пулу (незакрытая проводка #2160 P4, в коде рядом стоит комментарий об этом), поэтому сигнал бана в пул — пустышка. Значит и ротация не сработает.То есть новый статус — чистая наблюдаемость, пока Домклик не подключен к пулу. Это не отменяет правку (видеть правду важно само по себе), но убирает из неё половину, которую я ей приписал.
Что подтвердилось
Переезд случая «блок и ноль лотов» из
failedвbannedинертен: ни одной строки на проде под него не подпадает. Потребители статусов проверены поимённо — планировщик смотрит только наrunning, админский фильтр и фронтbannedуже умеют, отката темпа по статусу нет, алерт считает оба одинаково.Прерывание цикла на первом же блоке — структурный факт, а не эвристика: единственный путь с продолжением цикла это ошибка разбора, а не блок. Частичного блока, при котором объявлять весь прогон забаненным было бы неверно, не бывает.
Ещё одна мина в шаге отсюда
Та же форма дефекта уцелела рядом: если прогон прервётся по таймауту или исключению после того, как часть лотов собрана, он попадёт в ветку «успешно». Такой прогон ровно так же неполон, как заблокированный, но отчитается зелёным. На проде пока не случалось (строк с ошибками и ненулевым сбором нет), но это тот же класс, что и весь сегодняшний список. Завожу отдельно.
done#2698Постановка проверена на проде сегодня (09.08) — устарела в худшую сторону, но не опровергнута: не «~1% предложения», а ноль.
listingssource='domklik': 376 активных,max(scraped_at)=2026-08-05 05:43— четверо суток без подтверждения. Контрольная группа отвечает: упал один Домклик, прокси/инфраструктура в целом живы.Где теряется — «не собираем», причём не там, где искали. Логи прогона 3502:
Домклик — единственный sweep-источник без
proxy_provider(#2160 P4), поэтому идёт через статическийSCRAPER_PROXY_URL=scrape_proxies.id=1. Живая проба тем же трактом, один URL BFF: через id=1 → 500NS_ERROR_PROXY_BAD_GATEWAY, через мобильный узел пула id=10 → 200 иsnippetsCount=678в бакете 'st'.Второй дефект рядом:
fetch_cityловил толькоValueError/TypeError, транспортная ошибка сайдкара пролетала мимо цикла и убивала прогон на первом бакете — отсюда0/6вместо «5 бакетов из 6».Опровергнуто три предпосылки:
blocked=0), отказ транспортный.Правка в PR #2796. Пункт 2 issue (
ingest_domclick_jsonl.py) не трогал.У владельца / для database-expert:
scrape_proxies.id=1сprovider_affinity='domclick'теперь вредит — держит под Домклик узел, для Домклика мёртвый, и прячет его от остальных. Проситсяprovider_affinity='any'отдельной миграцией. И отдельным issue: браузерная проба узла (#2723) ходит наavito.ru/robots.txtдля ВСЕХ узлов — поэтому id=1 стоит сbrowser_fail_streak=0, будучи непригодным для Домклика; проба идёт не тем трактом, что работа.Причина найдена и опровергает шапку: это не блокировка площадки, а мёртвый статический прокси
Постановка подтвердилась, но устарела в худшую сторону: не «~1% предложения», а ноль, четвёртые сутки.
max(scraped_at)у источника — 05.08 05:43. Контрольная группа отвечает однозначно: упал один Домклик, инфраструктура и остальные источники живы.Различающая проба, а не рассуждение
Один и тот же сайдкар, один и тот же URL Домклика, разные узлы:
affinity='domclick')NS_ERROR_PROXY_BAD_GATEWAYaffinity='any'){"offersCount":704,"snippetsCount":678}Домклик оказался единственным свип-источником, не подключённым к пулу прокси — он шёл через статический
SCRAPER_PROXY_URL, то есть через узел id=1, закреплённый за ним миграцией 173 и для него мёртвый.Второй дефект рядом, усиливавший первый
fetch_cityловил толькоValueError/TypeError(ошибки разбора), аhttpx.HTTPStatusErrorот сайдкара летел мимо цикла по бакетам и убивал прогон на первом же — отсюдаbuckets 0/6. Он же не давал сработать ротации узла: до неё просто не доживали.Опровергнутые предпосылки — их пять
blocked=0), отказ транспортный. Диагноз «QRATOR block or fetch errors» проставлялся по умолчанию до #2765 — та самая догадка, читающаяся дальше как факт.deactivated=0с 03.08, с 07.08 ещё иskipped_unhealthy=1(гейт #2710 работает).run_id.Что сделано
PR #2796 смержен и задеплоен, проверен по коду в живом контейнере, а не по статусу: свип получает
ctx.proxy_provider, бакет-уровневый перехват расширен доException(неBaseException— отмена проходит насквозь). Три теста, все три красные на старом коде (TypeError: unexpected keyword argument 'proxy_provider').Критерий приёмки, записанный ДО факта: первый прогон после 10.08 ~03:50 UTC должен дать
lots_fetched > 1000иbuckets_completed >= 5. Если снова ноль приproxy_lease_id != None— блок реально выше по потоку, и вопрос уходит владельцу (#2638).Следствие вынесено отдельно — #2800
Узел id=1 имеет
browser_fail_streak=0и свежую пробу, будучи мёртвым для Домклика. Причина: браузерная проба ходит для всех узлов на Авито. Прокси-узел — не «жив/мёртв» вообще, а пара «узел × площадка», и понятие пары в системе уже есть (scrape_proxy_source_bans, #2654), но проба про него не знает.Это продолжение #2723, не повтор: там проба шла другим транспортом, здесь — верным транспортом не туда. Оставляю эту задачу открытой до прогона 10.08.
Прогон 10.08 04:44 — критерий выполнен наполовину, и это честный результат
Критерий, записанный ДО факта:
lots_fetched > 1000иbuckets_completed >= 5. Факт — прогон 3594:doneпри нуле (врал)banned— честно назвал, чем кончилосьСбор пошёл. Транспортная стена, из-за которой узел отдавал отказ шлюза на каждом запросе, снята — Домклик больше не ходит через мёртвый статический прокси.
Но до 1000 не дошёл: прогон оборвался на блокировке. Одна
blocked, статусbanned. То есть теперь мы упираемся не в свою инфраструктуру, а в саму площадку — и это качественно другая стена.Подтверждение, что механизм пары «узел × источник» заработал
Побочно видно, что правка #2803 не только не мешает, но и делает своё дело. Таблица банов пар сейчас:
Строка
(10, domclick)появилась сегодня: узел 10, который в моей вчерашней пробе отдавал 200 и 704 предложения, получил бан от самой площадки в ходе боевого сбора. Раньше такой строки быть не могло — Домклик не пользовался пулом вовсе.Метки при этом раздельные и честные:
banned:domclick(площадка отбила) отличается отprobe:browser(наша проба не смогла), и после #2805 проба больше не может присвоить себе чужую строку.Что дальше
Задачу оставляю открытой: «собирает 372 из ожидаемых 1000+ и упирается в бан площадки» — это прогресс, а не решение.
Новый критерий, записанный ДО факта: прогон 11.08 ~04:44 должен дать
lots_fetched > 1000приblocked = 0— если пул успеет сменить узел до исчерпания бакетов. Если сноваbannedна 300-500 лотах, значит одного рабочего узла на Домклик не хватает, и вопрос уходит владельцу в #2638 (пул из четырёх узлов на четыре площадки) — тогда это не дефект кода, а нехватка ресурса, и чинить надо не здесь.Оговорка про мигающую пару из #2800 в силе: узел может отвечать по-разному с интервалом в минуты, поэтому один прогон — не приговор ни в какую сторону.
Критерий 11.08 НЕ выполнен, и провал глубже прогноза — вопрос уходит владельцу в #2638
Критерий, записанный 10.08 ДО факта: прогон 11.08 ~04:44 должен дать
lots_fetched > 1000приblocked = 0.Не просто «не дотянул до 1000» — сбор упал с 372 до 58-59. Оговорка про мигающую пару (#2800) здесь уже не спасает: три прогона подряд, все
banned, все на блокировке площадки, а не на транспорте.Сработала ровно та развилка, которую критерий предусматривал: «одного рабочего узла на Домклик не хватает». Видно в таблице банов пар:
Оба мобильных узла получили бан от самой площадки в ходе боевого сбора (метка
banned:domclick, неprobe:browser— после #2805 проба чужую строку присвоить не может). Значит это не дефект кода, а нехватка ресурса — #2638 (пул из четырёх узлов на четыре площадки). Чинить надо не здесь.Что правкой #2796 всё же куплено, и это не ноль:
listings source='domklik'активных 752 против 376 на 09.08,max(scraped_at)= 2026-08-12 04:29 — подтверждение идёт ежесуточно, а не стоит четверо суток. Транспортная стена (NS_ERROR_PROXY_BAD_GATEWAYчерез мёртвый статический узел) снята; осталась стена площадки.Задача остаётся открытой на пункте 1 из «что остаётся решать»: либо восстановить охват через прокси-пул, либо признать Домклик источником на ~1% рынка и перестать считать его полноценным в покрытии.
Пункт 2 (
scripts/ingest_domclick_jsonl.py) — не тронут, но его срочность подтверждённо нулевая: скрипт на месте вorigin/main, а снимков безrun_idвlisting_source_snapshotsза 14 суток — 0. Ручной ингест мёртв фактически, но остаётся заряженным: следующий запуск снова создаст инвентарь, неотличимый от собранного.Замер 13.08: проводка бана работает у свипа и НЕ работает у обогащения
Сначала — поправка к моему же утверждению. Я написал, что для Домклика нет ни одной записи в
scrape_proxy_source_bans, при том что для Циана и Авито они есть. Это неверно: я фильтровал поbanned_until > now(), то есть спрашивал «бан ещё действует», а не «бан когда-нибудь записывался». Записи есть.Ровно тот класс ошибки, который в этом же разборе ищут у кода: померил не то и прочитал ноль как дефект.
Что показывает исправленный замер
Забаненных прогонов Домклика — 10, записей по паре узел×источник — 2. И раскол проходит не случайно:
domclick_city_sweepdomclick_detail_backfillСовпадение по времени подтверждает авторство: бан свипа 10.08 в 04:44, запись по узлу 10 — в 04:49, через пять минут. А обогащение банится с 06.08, и до 10.08 в таблице пусто вовсе.
Тот же раскол, что и в
ban_kindЗа 14 суток
ban_kind='unknown': 7 у обогащения, 3 у свипа. Свип починен #2832 (смержен 12.08), обогащение — нет.Итого у обогащения две потери на одном пути: диагноз не доезжает до
scrape_runs.ban_kind, и отказ не записывается вscrape_proxy_source_bans. При этом блок распознан генуинно —parse_detail_htmlловит маркеры QRATOR при HTTP 200 и зовётreport_ban(providers/domclick/detail.py:553).Цена второй потери конкретна: пока отказ не записан по паре,
acquire('domclick')продолжает выдавать тот же узел. У свипа этот механизм сработал дважды и увёл узлы 10 и 9; у обогащения — ни разу за семь банов.Чего этот замер НЕ говорит
Не установлено, отбивает ли площадка на всех узлах. Живую различающую пробу (тот же тракт, каждый из четырёх узлов, Домклик против контроля на Авито/Циане) я запускал дважды, и оба раза разбор обрывался по среде, не по существу. Поэтому вопрос «можно ли вообще восстановить сбор» остаётся открытым, и я не выдаю отсутствие проверки за проверку.
Что известно про сбор сегодня:
Починка проводки сбор не воскресит — она сделает отказ различимым и перестанет отдавать заведомо отбитый узел. Это меньше, чем хотелось бы, но это то, что подтверждено замером.
Поправка к моему же комментарию выше — и живое подтверждение #2832
Прогон 3838 сегодня в 05:00 UTC меняет сразу две вещи, которые я сказал неверно.
1.
ban_kind='unknown'у обогащения — НЕ дефект, и это написано в кодеЯ назвал это «потерей диагноза». Автор задачи уже ответил, и ответ верный —
app/tasks/domclick_detail_backfill.py, строки 46-51:То есть
unknownздесь — правильный ответ: диагноз не теряется, он не установлен. Проставитьplatformозначало бы ровно тот дефект, который чинил #2764. Мою формулировку «теряется дважды» снимаю.Настоящая работа названа тем же докстрингом: развести исключение на подтипы. Различение уже существует в месте возбуждения —
providers/domclick/detail.pyзовётreport_banтолько на генуинном маркере (строка 553) и НЕ зовёт на сбое транспорта (строки 535-548). Схлопнуто оно только в типе исключения. Это выполнимая задача, и после неё диагноз станет установленным, а не назначенным.2. «Сбор мёртв, успешных 0» — верно по статусу, неверно по существу
Прогоны помечаются
banned— правильно, они упираются в блок. Но собирают они при этом не ноль:Свип берёт частичный срез, потом упирается в блок и бросает остальные корзины (
buckets=0/6, то есть ни одна из шести комнатных корзин не доведена). Обвал реален — 5937 за сутки 18.07 против 60-80 сейчас, — но «ноль успешных прогонов» и «ноль собранного» это разные утверждения, и я подал первое как второе.3. Проводка бана по паре работает, и сработала сегодня
Из логов прогона 3838:
Записей по паре для Домклика сейчас три (узлы 11, 9, 10). Моё «нет ни одной» было артефактом фильтра
banned_until > now().4. #2832 подтверждён на живом прогоне
ban_kindunknownplatformПравка смержена 12.08 вечером; первый свип после неё проставил диагноз верно. Критерий приёмки закрыт замером, а не рассуждением.
Что остаётся настоящей задачей: блок наступает на первой же комнатной корзине (
rooms='1'), и все шесть остаются несобранными. Именно это отделяет 79 лотов от нескольких тысяч, а не отсутствие проводки.Диагностика транспорта 15.08.2026: блокер — Qrator, а не бан IP и не сломанный транспорт
Проверял по просьбе владельца, начав со страницы
ekaterinburg.domclick.ru/search?.... Четыре замера, два из которых опровергают напрашивающиеся объяснения.1. Это не бан нашего IP
Запрос к той HTML-странице отдаёт одинаково с прод-сервера и с домашнего IP:
279 байт — это JS-челлендж Qrator, а не страница. Одинаковый ответ с двух разных сетей означает: блокируется любой клиент, который не исполняет JS, а не конкретный адрес. Обычный браузер челлендж проходит незаметно.
2. Сертификат: ложный след, который стоит запомнить
ДомКлик отдаёт цепочку на корневом CA Минцифры:
Этого корня нет ни в системном trust store наших контейнеров, ни в Chromium. Отсюда:
curlбез-k→code=000, «self-signed certificate in certificate chain»;ERR_CERT_AUTHORITY_INVALID;BrowserFetcherна этот хост →SEC_ERROR_UNKNOWN_ISSUER(в образеtradein-browserкаталог/usr/local/share/ca-certificates/пуст,russian trustedвca-certificates.crtне встречается).Выглядит как причина обвала — но ею не является, см. пункт 4. Практический вывод другой: любая ручная диагностика ДомКлика через curl/openssl бессмысленна без
-kи будет врать про «источник недоступен».3. Проверяли не тот хост
Боевой SERP-скрапер (
scraper_kit/providers/domclick/serp.py) ходит не на человеческую страницу поиска, а на JSON-BFFhttps://bff-search-web.domclick.ru/api/offers/v1. У ДомКлика, в отличие от Avito, curl-пути нет вовсе — толькоBrowserFetcher. То есть страница из исходного вопроса к прод-сбору отношения не имеет.4. Транспорт жив — это решающий замер
59 строк реально подтверждены сегодня утром. Значит на боевом пути TLS проходит (доверие решается на уровне camoufox и прокси, а не системного store), и «сертификат» отпадает как объяснение. Совпадает с
countersпрогона:lots_fetched: 59,pages_fetched: 600, затемbannedс «QRATOR block aborted sweep».Итог
Отказ ровно один и он на уровне приложения: Qrator обрывает свип после 59–79 лотов из ~600 страниц. Ни бана IP, ни поломки транспорта, ни проблемы с сертификатом на боевом пути нет.
Это не меняет развилку из тела задачи, а уточняет её: восстановление охвата упирается в обход Qrator (прокси/темп, #2638), потому что всё остальное в цепочке исправно. Альтернатива прежняя — признать, что ДомКлик даёт около 1% рынка (6798 строк против ~19 500 у Циана, все по ЕКБ), и перестать считать его полноценным источником покрытия.
Замеры делались с бюджетом в два запроса к площадке — долбить её ради диагностики не стал.
Ревизия открытых задач 2026-08-30. Проверено в коде на forgejo/main — сделано, закрываю.
Корень найден и устранён: свип ходил мимо прокси-пула. tests/test_2657_domclick_proxy_pool.py + правки pipeline.py и providers/domclick/serp.py.