[EPIC] МЕРА: 47 мест, где код написан, отревьюен, смержен — и ни разу не сработал на проде #2674
Open
opened 2026-08-05 19:12:32 +00:00 by bot-backend
·
18 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
1 participant
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#2674
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?
Системный поиск после того, как за один вечер случайно нашлись четыре таких места подряд. Пять независимых линз, каждая сверяла код с прод-данными: значения перечислений, колонки с писателем но пустые, сигналы о сбоях, расписания и флаги, недостижимые условия. Все числа — с
tradein-postgres, каждая находка обязана была иметь ифайл:строка, и число с прода.Найдено 47. Корневая вынесена отдельно в #2673: за всю историю продукта наружу не ушло ни одного уведомления, потому что в GlitchTip нет ни правил, ни получателей. Это и объясняет, почему остальные сорок шесть выжили.
Деньги (4)
Домовая оценка Авито всегда запрашивается как «косметический ремонт» — 2685 из 2685 запросов, при том что реальный микс ремонта в этих же домах: стандарт 4564, хороший 4118, требует ремонта 2279, отличный 1631. То есть «косметика» — лишь 36% реальных лотов. Маппинг ремонта уже существует и используется поштучным путём; в домовом стоит литерал. 2.5 месяца.
Неизвестный тип дома молча уходит как «панель» — самый дешёвый класс. 363 дома из 2685 не имеют типа нигде, плюс 75 домов с типом в camelCase (
monolithBrick), который не совпадает со словарём после приведения к нижнему регистру. Итог отправленного: панель 1499, кирпич 656, монолит 367, блок 163.Монитор устаревания СберИндекса сработал 9 раз и не создал ни одного события — написан уровнем
warning, а событиями становятся толькоerror. Данные внешнего бенчмарка цен стоят с 1 июня.Оценка Циана, седьмой источник эстиматора, умерла 29 июня — куки протухли, 37 дней ни одной строки. Ни алерта, ни следа в статусах.
Наблюдаемость (11)
Разобрано в #2673. Кроме описанного там:
run_typeвырожден в одно значение во всех 3236 прогонах; счётчики HTTP-запросов, ошибок, вернувшихся и исчезнувших объявлений — ноль во всех прогонах, писателя нет вообще;is_outlierне пишет ни одна строка кода, а админский показатель «помечено выбросов» рапортует ноль как достижение; метрика расхождения цен между площадками структурно недостижима — ни у одного объявления нет двух источников; статус «не найдено» у домовой оценки недостижим, потому что 404 от геокодера не обрабатывается и все 39 таких домов лежат в «ошибке».REDIS_URLне задан в прод-окружении — кэш поиска всю жизнь стучится в localhost и получает отказ, хотя redis на хосте есть.Потеря данных (12)
У всех 25 055 подсказок Avito IMV потеряны фотографии — парсер выбрасывает ссылку, а колонка не входит в запрос вставки. 74 дня.
cadastral_numberпуст у всех 93 350 объявлений — при том что по нему стоит фильтр поиска и нулевой тир матчинга домов. Отсюда же: тир «точное совпадение по кадастру» недостижим по построению (кадастр появляется у объявления после матчинга, а не до), а тир «точное совпадение по ФИАС» — мёртвый код, ни один вызывающий не может передать нужный параметр.В дневной истории объявлений статус «снято» не пишется никогда — оба места вызова захардкожены на «активно». Значит дата снятия объявления, лучший доступный сигнал «скорее всего продано», не запрашивается из истории, а восстанавливается на глаз.
Журнал событий объявлений знает пять типов, писатель умеет один: изменение цены. Снятие, возврат, редактирование, первое появление — ноль за всё время.
sale_typeне нормализован: Домклик пишет русские фразы, Авито и Циан — английские значения.Тиерные коэффициенты выкупа — мёртвые таблицы: посчитаны один раз миграцией, не обновляются, не читаются.
«Строительная серия» и «высота потолков» есть в живом ответе Циана, но их нет в карте разбора — а интерфейс здания серию показывает.
Сохранение расписания из админки всегда сдвигает следующий запуск на «завтра» и игнорирует заданную периодичность; комментарий в коде утверждает обратное, а описанной в нём ветки никогда не существовало.
avito_full_load: миграция перевела источник на недельный такт, но окно ретроспективы осталось двухдневным — при успехе прогон видит двое суток из семи.avito_full_load_exhaustive: срабатывает по графику, успешным был один прогон из семи, с 21 июня ни одного.Мёртвый код (8)
has_panoramaпарсится и покрыт тестами, но в базу не попадает ни одной строкой. Скачивание CSV ДОМ.РФ реализовано и покрыто тестами, но не вызывается ниоткуда. Дедуп-хелперы эстиматора живут только в тестах: 25 тестовых ссылок, ноль прод-вызовов.BROWSER_BLOCK_RESOURCESвыставлен во всех трёх контейнерах, а такого имени в коде нет вообще. Пачка колонок без единого писателя.filters_hashчитает несуществующий ключ ответа — 0 из 1658.Логин Циана задекларирован в конфиге, но отсутствует в проде — автоперелогин недоступен, сбор истории стоит 38 дней. Куки Домклика протухли 3 августа, единственный сигнал — предупреждение в лог; заблаговременного предупреждения нет вовсе (Циану его сделали в #2658, Домклику — нет).
Что во всём этом общее
Ни одно из сорока семи не ловится тестами — по построению. Тест пишут на случай, который автор себе представлял; здесь ломается ровно то, чего он не представлял: ключ ответа площадки называется иначе, условие «И» недостижимо, уровень лога не долетает, колонка не попала в запрос вставки, значение захардкожено литералом.
Ловится это одним вопросом, заданным проду: сколько раз эта ветка, это поле, этот статус реально появлялись за всё время? Ответ «ноль» означает одно из трёх — мёртвый код, недостижимое условие или потерянные данные. Все три стоит увидеть.
Отсюда предложение, которое дороже любого отдельного фикса: сделать этот вопрос регулярным. Не разовый аудит, а проверка, которая раз в неделю сверяет «что код умеет писать» с «что реально появилось» и приносит разницу.
Порядок
Полный список с числами и
файл:строкапо каждой находке — в результатах прогона, приложу разбором по подзадачам.Working on this in PR #2682 — три находки класса «схема обещает, писатель не пишет»: фото/метрики подсказок IMV (25 055 строк с NULL), статус «снято» в listings_snapshots (394 704 строки константой active), четыре недостающих типа событий listing_source_events (8288 строк одного типа из пяти).
Поправка: находка про СберИндекс была истолкована неверно
В списке денежных я написал: «монитор устаревания СберИндекса сработал 9 раз и не создал ни одного события, данные внешнего бенчмарка стоят с 1 июня». Первая половина верна, вторая — нет, и вывод из неё был неправильный.
Ревью PR #2681 разобрало механику по прод-данным:
Загрузка индекса ходит раз в 28 дней и приносит период на месяц новее, а возраст считается от первого числа покрытого месяца. Значит в момент самой свежей загрузки возраст уже 46, и к следующей естественно дорастает до 74. Порог — 60.
То есть пила 46→74 пересекает порог каждый цикл, примерно 14 дней из 28. Девять срабатываний — это не улика застоя данных, а замер нашего собственного такта загрузки.
Практический вывод меняется на противоположный: если бы правка уровня поехала как есть, главным событием новой «честной телеметрии» стал бы сигнал, который гаснет сам, без единого действия оператора. Ровно то, чего мы избегаем — ложная тревога, которая приучает не читать алерты.
Что делать вместо этого
Лучший вариант — не трогать порог, а ускорить загрузку: раз в 7 дней вместо 28 (это девять запросов к открытому API). Тогда возраст упирается примерно в 53, и порог 60 наконец начинает означать именно «Сбер перестал публиковать».
Побочно это чинит вторую вещь, которую я не заметил: у оценщика есть собственная проверка свежести бенчмарка с порогом 35 дней, и при текущем такте она срабатывает почти на каждой оценке — потому что возраст стартует с 46 и меньше уже не бывает.
Что остаётся в силе
Остальные три денежные находки не затронуты. И сама по себе проблема «предупреждение не долетает до системы событий» реальна — просто на примере СберИндекса она демонстрировалась ошибочно: там не долетало то, что и не должно было лететь.
Отдельно завожу latent-находку, всплывшую при том же разборе: ветка «неизвестный источник» в планировщике выполняется каждые 60 секунд и после #2658 в этом состоянии писала бы 1440 строк прогонов в сутки. Сейчас не срабатывала ни разу, но это мина того же класса.
Working on this in PR #2684 — четыре находки «показатель, который не может быть ненулевым» (is_outlier / счётчики scrape_runs / run_type / фильтр источников).
Working on the matching-tier findings in PR #2688 (кадастр объявлений / тир по кадастру / тир по ФИАС).
Итог замеров на проде: верхние тиры не срабатывали ни разу — 0 из 49 502 строк
house_sourcesимеютcadastr_exactилиfias_exact; всё сматчено слабее (fingerprint 58.97%, new 22.65%, geo_proximity 18.36%). Цена этого — 781 лишняя строка вhouses(8.3% таблицы), 653 кластера, 6 389 объявлений на дублях одного и того же здания ГАР (риск #1772). Проверено read-only прогоном mapping-SQL дедупа: старый ключ даёт 0 пар, расширенный — 781.Working on this in PR #2689 — раздел «Мёртвый код», восемь находок. Две из них оказались не мёртвым кодом, а оборванной проводкой: загрузчик ДОМ.РФ (написан с #2013, но Handler'а и строки расписания не существовало — 29 978 строк staging с одним loaded_at 12.07, то есть единственный ручной запуск) и filters_hash (Циан кладёт ключ на уровень выше, чем его читали: 139/139 сырых ответов несут хеш при 0/1658 заполненных колонок). Ещё одна подключена: has_panorama. Удалены две таблицы тиерных коэффициентов, две колонки без писателя, две дедуп-обёртки без прод-вызовов и показатель расхождения цен, который не мог быть ненулевым. BROWSER_BLOCK_RESOURCES оставлена инертной, но сервис теперь предупреждает о ней на старте — трафик от её пропажи не вырос, image глушит camoufox block_images.
done#2698errors=0иdone, все домовые поля Циана нулевые #2700save_listingsиз девяти теряютrun_id#2701bot-backend referenced this issue2026-08-06 06:23:36 +00:00
Сводка за сутки: 11 PR смержено, метод эпика проверен на себе
Закрыто
Деньги — 3 из 4.
warningдо уровня, который становится событием, — #2681. Заодно там же пришлось починить такт загрузки, иначе новыйERRORбыл бы ложной тревогой.Наблюдаемость.
run_type, четыре счётчика без писателя,is_outlier, показатели админки, которые не могли быть ненулевыми, — #2684 и #2689. Корневая #2673 остаётся открытой и остаётся корневой.Потеря данных. Фотографии подсказок IMV — писатель починен (#2682) и 21 480 из 25 055 строк восстановлены задним числом (#2693; остальные 3 575 невосстановимы — сырой ответ перетирался при повторной оценке). Тиры сопоставления домов — #2688.
sale_typeперестал быть третьим словарём — #2696. Окно ретроспективы Авито приведено к недельному такту — #2685. Сохранение расписания перестало игнорировать такт — #2694 (задето 16 из 50 источников, включая квартальный опрос Росреестра с тактом 28).Мёртвый код. Разобран весь блок — #2689. Три места оказались не мёртвыми, а оборванными: загрузка ДОМ.РФ (не было ни строки расписания, ни обработчика), хеш фильтров Циана (читали на уровень глубже — 0 → 139 из 139), признак панорамы (парсился, не сохранялся).
Три находки оказались другим диагнозом, чем предполагалось
Это результат, а не оговорка: неверный диагноз здесь стоил бы либо удаления готовой работы, либо бесконечной задачи.
position_in_serp— не оборванная проводка, а невыразимый механизм. Колонка лежит в снимках с ключом «объявление × сутки», а позиция это свойство пары «объявление × конкретный прогон выдачи». За одни сутки в таблицу писали 13 разных прогонов от четырёх источников; внутри одного обхода объявление приезжает с разным индексом от перекрывающихся якорей. СтарыйON CONFLICTосадил бы индекс последнего писателя дня — хуже NULL, потому что читалось бы как факт. Колонка подписана, тест сторожит попытку «подключить» обратно (#2694).«Снято» в дневной истории — тоже невыразимо, и это доказано контрольной группой: событие «снято/вернулось» измеряет полноту нашего обхода, а не жизнь объявления. Источник с почти полным покрытием даёт ноль «возвратов», источник с третью покрытия — 218 в сутки.
«Серия и высота потолков не разбираются» — предпосылка ложна. Разбор работает; на экране пусто по другой причине (см. #2700).
Что метод эпика нашёл сверх списка
Проверка каждого пункта числом с прода вскрыла то, чего в исходных 47 не было:
{"saved": 0, "errors": 35, "checked": 50}в каждом прогоне, статусdone.run_id, в двух значение лежит в той же функции.Что упирается во владельца — #2704
Собрано в одно место: получатель уведомлений, учётные записи Циана и Домклика, ключ Яндекс-геокодера, токен ротации прокси, два решения (#2661, #2680) и статус бана ДОМ.РФ. Восемь пунктов, ни один не чинится кодом.
Существенно, что два из них блокируют проверку уже сделанной работы: правки разбора Циана нельзя подтвердить, пока идёт 403, а починенные сторожа будут срабатывать в пустоту, пока не задан получатель.
Про предложение сделать вопрос регулярным
Тело эпика предлагает проверку, которая раз в неделю сверяет «что код умеет писать» с «что реально появилось». Сутки работы дали материал, уточняющий это предложение: проверять надо не только «появилось ли», но и «почему ноль». За сутки три нуля означали три разные вещи — «уже починено вчера», «заблокировано выше по потоку», «структурно неприменимо к этому источнику» — и требовали трёх разных действий. Ноль без названной причины запускает не ту работу.
Что проверять завтра: девять предсказаний с точными критериями
За сутки смержено много такого, что нельзя было проверить в момент мержа — производитель бежит по расписанию. Чтобы завтрашняя проверка была проверкой, а не пересказом, фиксирую критерии заранее. Предсказание, записанное после факта, ничего не стоит.
Все времена UTC.
newbuilding_enrichyandex_detail_backfillenriched > 0иunenrichable_pending ≈ 3 535cian_history_backfillskipped, причина «куки протухли»skipped_unhealthy=1, 62 подтверждения против порога 200); avito/cian/yandex исполняютсяavito_detail_backfillscrape_runs.errorhouse_dedup_mergehouse_imv_backfillsaved > 0,NS_ERROR_PROXY_BAD_GATEWAYисчез из причинavito_full_loaddonebrowser_unfit_sinceОтдельно про последнюю строку
Браузерная проба прокси сегодня отработала (
browser_checked: 4, browser_ok: 4) — то есть исполняется и не даёт ложных отказов. Но что она ловит непригодный узел, не доказано: сейчас все четыре здоровы по обоим трактам. Это подтвердится только когда узел деградирует естественным образом — по истории такое случалось регулярно.Держать это как «работает» было бы преувеличением. Держу как «работает, по назначению не срабатывало».
Почему список именно такой
Каждая строка — это то, что сегодня было записано словами «не проверено, а не не работает». За сутки этот оборот употреблялся девять раз, и каждый раз он был честным: код доехал, а производитель ещё не бежал. Но «не проверено» имеет срок годности: если через неделю оно так и не проверится, это уже не осторожность, а незаконченная работа.
Отсюда практика, которую предлагаю закрепить: у каждого «не проверено» должны быть дата и критерий. Без них оно превращается в вечное «вроде сделано».
ban_kindпроставляется по умолчанию у 9 вызывающих из 12 — метка выглядит доказательством, не будучи им #2764Проверка девяти предсказаний — одной командой
Чтобы завтрашняя проверка не свелась к «посмотрим, как оно», собрал её в скрипт. Он лежит на сервере (
/tmp/verify_predictions.sql) и выдаёт таблицу «критерий → факт → вердикт».Сейчас (23:40 UTC, до первого прогона) он отвечает так:
«Ждём» здесь — не заглушка, а различимое состояние. Скрипт специально не выдаёт «ОК» при отсутствии данных: пустая выборка и успешная проверка обязаны выглядеть по-разному, иначе получится ровно тот молчаливый пропуск, который мы сегодня разбирали трижды.
Строка 8 проверяется вне SQL — надо показать запись контейнера, которого больше нет:
Обёртка через docker нужна потому, что пользователь деплоя не входит в группы чтения журнала (снимается разово командой
usermod -aG adm gendesign). И обязательноTZ=UTC: флаг вывода в UTC меняет только формат, а границы окна разбираются в локальном времени — без него команда молча показывает чужие три часа ночи.Что скрипт НЕ проверяет
Слияние домов 08.08 и полный обход Авито 10.08 — они за пределами ближайшей ночи, для них критерии записаны в таблице выше, но кода в скрипте нет.
Строка 9 останется «ждём» неопределённо долго: она сработает только когда узел деградирует сам. Это честнее, чем считать механизм проверенным.
Проверка здоровья после суток правок
За сутки смержено больше двадцати изменений, многие в скрапере. Проверил, не стало ли где-то хуже — потому что «много починили» и «система здоровее» это разные утверждения.
Прогоны:
Объём в норме (86 при обычных 71–94). Доля
doneупала с 100% до 92% — и это не регресс, а результат:failed,bannedиskippedпоявились ровно там, где раньше молча стоялоdone. Пустой прогон перестал называться успешным.Собрано объявлений:
3 830 — больше, чем в любой из четырёх предыдущих дней. Авито восстановился в 5.5 раза относительно вчера.
Честно про атрибуцию
Приписать рост конкретной правке не могу. За сутки приземлились: подключение домовой оценки к пулу прокси (#2708), повтор на той же странице в сайдкаре (#2721), браузерная проба узлов (#2736), гейт по виду ссылки у Яндекса (#2738), брейкер у Авито (#2739) — плюс чужая прокси-волна днём раньше. Разделить их вклад по одному дню нельзя, и делать вид, что можно, я не буду.
Что сказать честно: сбор не пострадал ни от одной из правок, а суммарно вырос. Это то, ради чего проверка и делалась.
Что осталось нулевым и почему
Домклик — ноль, но он на нуле всю неделю, а не с сегодня: куки протухли 3 августа, плюс антибот. Это известный блокер, ждущий владельца (#2704, п. 3), а не следствие правок.
Оговорка о методе
Пять дней — короткое окно, и 4 августа (1060) показывает, насколько велик естественный разброс. Один хороший день не доказывает устойчивого улучшения. Правильная проверка — через неделю; тогда же станет видно, держится ли восстановление Авито.
Учёт по пунктам: что закрыто, что осталось, что оказалось неверным
Проверил замерами те находки, по состоянию которых у меня не было уверенности. Два пункта самого списка не подтвердились.
Опровергнуто заново (сегодня, замером)
«Тиерные коэффициенты — мёртвые таблицы, не читаются». Таблица содержит 369 строк и читается тремя местами: эстиматором (9 обращений), обработчиками продукта (6) и задачей обновления (9). Утверждение «не читаются» неверно. Про «не обновляются» — задача обновления существует и стоит в расписании; отдельно проверять её эффект не стал.
«
BROWSER_BLOCK_RESOURCES— такого имени в коде нет вообще». Имя в коде есть, и разрешено правильно: переменная действительно не читается как рабочий флаг (с #1812), но внесена в реестр отставных, сервис предупреждает о ней на старте, а тест сторожит, чтобы она не начала снова что-то менять. Закрыто в #2689 — то есть находка была верна по сути («ни на что не влияет»), но неверна в формулировке.Подтверждено и по-прежнему открыто
cadastral_numberпуст у всех 94 108 объявлений — ровно как в списке, ничего не изменилось.Метрика расхождения цен между площадками недостижима: объявлений, у которых больше одного источника, — ноль. Структурная невозможность подтверждена.
Статус «не найдено» у домовой оценки недостижим: домов в состоянии «ошибка» стало 46 (в списке было 39). То есть 404 от геокодера по-прежнему уезжает в общую ошибку.
Оценка Циана мертва — последняя строка 29 июня, ждёт учётной записи (#2704, п. 2).
Метод эпика: что он дал и где ошибался
Из проверенных сегодня формулировок две из шести оказались неточными, причём обе — в сторону преувеличения («не читается» вместо «читается», «имени нет» вместо «имя есть, но отставлено»). Обе неточности одного вида: вывод сделан по одному признаку (нет вызова в одном месте / нет совпадения в одном поиске), а признак оказался неполным.
Это ровно тот же промах, который за сутки повторился у меня трижды — искал по неверному признаку и получал уверенный неправильный ответ. Показательно, что метод эпика («каждое утверждение несёт число с прода») от этого не защищает: число было верным, неверной была его интерпретация.
Вывод для дальнейшего: число с прода отвечает на вопрос, который ему задали. Прежде чем строить на нём вывод, стоит проверить, тот ли вопрос — тем же способом, каким проверяют путь данных.
ВАЖНО для чтения завтрашних результатов: перед ночью осталcя один прокси общего назначения
Предполётная проверка в 00:25 UTC, за 14 минут до первого прогона:
Два узла из четырёх выключились автоматически (7 и 5 отказов подряд). Узел id=1 закреплён за Домкликом и Авито не выдаётся. Остаётся один узел общего назначения на все источники.
В журнале в 00:05 — свежий
httpx.ProxyError: 502 Bad Gateway, то есть отказы происходят прямо сейчас.Что это значит для девяти критериев
Провал любого из них этой ночью может означать «не было прокси», а не «правка не работает». Это ровно та ошибка чтения, против которой весь список и составлялся, поэтому фиксирую заранее:
Ожидание по узлам
Проверка здоровья идёт в 00:35 и переспрашивает выключенные узлы — они могут вернуться так же автоматически, как ушли. Смотреть надо на состояние после 00:35, а не на нынешнее.
Отдельно: браузерная проба по всем узлам последний раз проходила в 19:03–21:34, то есть у неё свой, более редкий такт. Она пока ничего не пометила непригодным — но и не проверяла с тех пор, как начались отказы. Это и есть первый шанс критерия 9 сработать по назначению.
Корень тот же
Три узла общего назначения на все источники — теснота, о которой #2638: ротация написана и не может включиться без токена. Пока его нет, «нет свободного прокси» будет повторяться независимо от того, сколько правок мы сделаем в коде.
Ночная проверка, промежуточный итог: подтверждено шесть из девяти
02:20 UTC.
Где моя разметка помех оказалась неверной
Критерий 2 я отнёс к зависимым и предупреждал, что при одном живом прокси его ноль скажет о пуле, а не о правке. Ноля не случилось: 198 обогащений, ни одного отказа. Путь обогащения Яндекса от нехватки прокси не пострадал вовсе.
То есть разметка была избыточно осторожной. Ошибка в безопасную сторону — пометил помехой то, что помехой не оказалось; обратное (счесть чистым испорченное) стоило бы дороже. Но отметить надо: разметка помех тоже бывает неверной, и проверяется она тем же способом, что и всё остальное — фактом.
Число непригодных ссылок при этом совпало точно: предсказывал ≈3535, получилось 3535.
Уточнение к критерию 9
Формулировка «ждём деградации узла» оказалась неточной, и это выяснилось этой же ночью. Два узла деградировали — но по HTTP, то есть провалили и дешёвую пробу тоже, за что и были выключены. Браузерная проба идёт только по включённым узлам, и это верно по построению: у мёртвого для HTTP узла нечего уточнять.
Значит критерий ждёт не «деградации», а узла, который пройдёт HTTP и провалит браузер. Сегодняшняя деградация — не того вида.
Правильная формулировка ожидания: «ждём события определённого вида», иначе первая же поломка будет ошибочно принята за проверку. Я допустил эту неточность сам, в собственном критерии.
done, причина в разборе а не в сети #2767Критерий 2 подтверждён не только счётчиком, но и содержанием
«Обогащено 492» само по себе не доказывает пользы — можно проставить отметку о попытке и ничего не записать. Проверил, что именно легло в строки:
Ноль просмотров тут ожидаем и к #2669 отношения не имеет: там чинился разбор фразы у Циана, а Яндекс просмотров не отдаёт вовсе. Отмечаю явно, чтобы этот ноль потом не был прочитан как дефект — сегодня уже трижды выяснялось, что ноль без названной причины запускает не ту работу.
Гейт по виду ссылки считает ровно то, что обещал
Расхождение в 11 строк — естественный дрейф: за ночь часть объявлений сменила состояние. Порядок и смысл совпали точно.
Оценка на будущее
При нынешнем темпе (492 за ночной прогон) очередь из 9 079 годных разбирается примерно за 18 ночей, если ничего не мешает. Это первая осмысленная оценка срока — раньше её нельзя было дать, потому что голова очереди была забита ссылками, которые разбор не принимал в принципе.
Число стоит перепроверить через неделю: темп зависит от доступности прокси, а он этой ночью был минимальным (два узла из четырёх выключены).
Уточнение критерия 4 до прогона: посчитал, что гейт увидит
Критерий про деактивацию я пометил опасным — он может подтвердиться по неверной причине: если ночью нечем собирать, подтверждений станет мало у всех источников, и гейт пропустит не только Домклик. Чтобы это различить, посчитал заранее, что именно гейт увидит.
Состояние на 03:20 UTC (прогоны с 06:44 до 07:49):
У Авито запас 2.7%. До прогона три с половиной часа; если за это время несколько объявлений выпадут из трёхсуточного окна, он опустится ниже порога и тоже будет пропущен.
Как читать оба исхода
Домклик пропущен, остальные исполнились — предсказание сбылось полностью, гейт работает как задумано.
Пропущены Домклик и Авито — это НЕ провал гейта, а верное срабатывание на честно тонких данных: сбор по Авито этой ночью действительно был скудным (два прокси из четырёх выключены). Читать это как «гейт слишком жаден» будет ошибкой. Но и записывать в подтверждение нельзя — подтвердится не то, что проверялось.
Пропущен кто-то из Циана или Яндекса — вот это был бы настоящий провал: у них запас в три и семь раз.
Зачем это здесь
Предсказание «домклик должен быть пропущен» было верным, но недостаточным: оно не различало два разных мира, в которых оно сбывается. Числа выше различают.
Это второй раз за ночь, когда предварительный расчёт оказывается ценнее самого наблюдения: первый был с разметкой помех, где я ошибся в безопасную сторону и узнал об этом только потому, что разметка существовала.
Поправка к моему же расчёту: я считал не тем запросом, что гейт
Час назад я выложил числа, которые гейт увидит в 06:44. Решил проверить их тем же путём, каким идёт код — и нашёл, что считал иначе.
Гейт (
_build_confirmations_sql) берёт:scraped_at, а неlast_seen_at;vtorichka.Мой запрос брал
last_seen_atдля всех и без фильтра по сегменту.Вывод не изменился: Домклик пропускается, три остальных исполняются. Но запасы у Циана и Яндекса вдвое скромнее, чем я написал (×3.2 и ×4.4 вместо ×4 и ×8), а у Домклика дефицит чуть глубже.
Зачем это здесь
Предсказание, посчитанное не тем запросом, что проверяемый код, — это то же самое, что проверять правку не на том пути, по которому идут данные. За сутки я допустил этот промах трижды (вызвал функцию в обход обёртки, получил ноль из-за своей экранировки, отдал владельцу сервис как чужой, потому что искал файл вместо сервиса). Здесь поймал до факта, а не после.
Оговорка о том, чего не проверил: окно в 3 суток взято из умолчания кода — в параметрах расписаний оно не задано. Если умолчание другое, все четыре числа сместятся, но соотношение с порогами вряд ли изменит знак.
done#2698weights_profile.source = "profile"ставится по факту параметра, а не по факту найденного профиля #2811Находка, которая уточняет сам эпик: улучшение приписали не той правке
Разбор #2625 (капча засчитывается как успех) дал результат, важный для метода, а не только для задачи.
Симптом ушёл — но не от того, что его чинило
Доля прогонов
doneс нулевым результатом у развёрток Циана и Яндекса:donebannedПадение 42 → 1 выглядит триумфом детекта капчи из #2642. Но
banned = 0в обеих эрах — то есть детект не сработал на проде ни разу за 5.5 суток. Симптом убрали совсем другие правки: прокси-пул и разбор (#2796, #2798, #2800-#2805). Сбор просто заработал.Правильность #2642 сегодня подтверждена только юнит-тестами. Обещанная верификация «на живом эпизоде капчи» не состоялась, потому что эпизода не было.
Это отдельный вид ошибки, которого в эпике ещё не было. Не «код не сработал» и не «метка врёт», а улучшение, приписанное не той причине. Оно опаснее обоих: механизм считается проверенным, хотя проверка не проводилась, а настоящая причина улучшения остаётся неназванной — и если она откатится, никто не поймёт, почему симптом вернулся.
Признак, по которому это ловится: счётчик самой правки не сдвинулся. Если механизм чинит X, а счётчик его срабатываний равен нулю, то X починило что-то другое.
Настоящая дыра была противоположной той, что в задаче
Задача говорила про «пустые выдачи». Честная пустота как раз отличима — валидный ответ с пустым списком. Дыра была в отказе дойти.
Прогон 3557 и ещё 27 таких за 90 суток: все якоря кончились отказом, собрано ноль, статус
done. Самый показательный — развёртка Нижнего Тагила, проверил построчно:Шестнадцать суток подряд, каждый прогон ровно 240 секунд (таймаут якоря), и каждый раз «успешно». По краям — 14.07 со 155 лотами и 31.07 с 91: то есть источник был жив до и после, а посередине шестнадцать дней тишины, которую никто не мог увидеть.
Детект #2642 их не видит и правильно не видит: он считает попытки разбора, а транспортный отказ туда намеренно не попадает — «наш прокси сдох» не должно выглядеть баном площадки.
Три случая разведены
banneddone→donefailedПризнак — собственная бухгалтерия прогона: отказов не меньше числа якорей при измеренном нуле. Он доказывает, что каждый якорь кончился отказом и собрано ноль; он не доказывает, кто виноват — поэтому
failedбез диагноза причины, а неbanned. Дёргать ротацию прокси на догадке нельзя.На список антибот-маркеров новый страж не опирается вовсе — прямое следствие урока 09.08, где
antibot_markers=noneозначало «наш список не знает этой блокировки», а не «блокировки нет».Ложной тревоги нет: за 90 суток 132 прогона с отказами, но ненулевым сбором, и 37 прогонов честной пустоты остаются
done. Перекрашиваются ровно 28 описанных.Проверка на проде: что из 47 живо сегодня (12.08, только чтение)
Прошло пять суток, честного текущего статуса не было ни у одной находки. Шесть проверяющих опросили прод, каждую группу отдельно перепроверял скептик, которому запрещено было сводить «вывод» и «обоснование» в один бит.
Охват 42 находки: починены 23, живы 14, проверить нельзя 3 (со сроком), неприменимы 2.
Граница этой проверки, до всего остального
Скептики перепроверили 5 находок из 42 (12%). Вывод не опровергнут ни разу — но остальные 37 держатся на одном исполнителе каждая, и это надо читать буквально, а не как «всё подтвердилось».
Опровергнутые предпосылки — самое ценное
Не менее восьми пунктов эпика были неточны или уже неверны в момент подачи.
Четыре пункта закрылись до постановки. Блок «мёртвый код и учётки» починен 06.08 (
f5b39e6f,3d38d589), эпик подан 07.08. Кэш поиска — 06.08 22:37, за сутки. Уровень сообщений монитора СберИндекса поднят с предупреждения до ошибки 06.08 (3e1b9a8b).Механизм назван неверно — это дороже всего, потому что уводит починку не туда:
Путаница величин. «Оценка Циана мертва 37 дней» — это две разные длительности: нуля данных было 42.5 суток, а 37 — молчание тревоги.
«Событиями становятся только ошибки» для учётных данных Циана исторически неверно: карточка уровня «предупреждение» имеет счётчик 63 за 30.05-30.06 — предупреждения долетали и внезапно замолчали. Механизм отказа другой. (Для монитора СберИндекса предпосылка подтверждена точно: 9 срабатываний → 0 событий, после правки 7 из 7.)
Однородные на вид пункты разного размера. Ремонт был жёстким литералом (100% на 2633 запросах), тип дома — значением по умолчанию только у нераспознанных (55.9%); правка сдвинула долю панели на 15.5 пп, а не обнулила.
У нуля причина: две находки надо ЗАКРЫТЬ, а не чинить
Вывод верен, обоснование неверно — 2 случая
Это не придирка: правка по неверному обоснованию не сработает, а замер по слепому признаку даёт зелёный результат без предмета.
«Правка расписаний не срабатывала ни разу за 6 суток» — выведено из совпадения меток «изменено» и «последний прогон». Но метку «изменено» переписывает каждый прогон (три места планировщика). Все включённые расписания прогонялись за 1-3 суток, значит любое сохранение раньше последнего прогона физически неотличимо от его отсутствия. Правильная формулировка — «срабатывания ненаблюдаемы», а не «их было ноль». Вывод при этом верен: 25 из 25 расписаний имеют корректный интервал.
«13 трёхдневных и 11 недельных» — не воспроизводится ни при каком группировании. Факт: 17 трёхдневных, 7 недельных, 1 двадцативосьмидневное. Итог (25) верен, слагаемые нет.
Три следующих шага, по убыванию цены
1. Переоценить 2633 домовые оценки на неверных параметрах. 98.2% всей истории (2633 из 2680) посчитаны с зашитым «косметическим» ремонтом, у 1471 тип дома подставлен «панелью». Правка исправила 47 строк (1.8%). При нынешнем темпе естественное обновление займёт свыше 300 суток.
2. Порог свежести внешнего ориентира. Взято в работу отдельно — см. ниже.
3. Две строки учётных данных Циана в окружение прода. Цена уплачена: 41 день пропусков сбора, 42.5 суток нуля данных. Ручка автоперехода написана и покрыта тестами, отвечает 400, потому что 0 из 2 переменных заданы. Нынешняя сессия жива до 09.09 — запас 28 суток. Действие ваше, ключи я не подбираю.
Ближайшее за тройкой: обход Домклика — 59 объявлений в сутки против 5364 у Циана, его восстановление разблокирует три отложенные проверки.
Поправка к двум денежным пунктам: они разного размера, и не того, что заявлено
Замерил оба против истины, а не по счётчику отправленного. Оказалось, что пункты, поданные как равные, различаются в шестнадцать раз — и я сам вчера повторил преувеличение в сводке для владельца.
Тип дома — дефект в 2.8%, а не в 55.9%
Эпик: «неизвестный тип дома молча уходит как панель… панель 1499». Верно как счётчик отправленного. Но «отправлено панель» и «отправлено неверно» — разные утверждения.
Сверка
house_imv_evaluations(эра до 06.08, 2633 строки) сhouses.house_type, с применением словаря самого кода (_HOUSE_TYPE_TO_IMV: monolith→monolithic, monolith_brick→monolithic):Состав ошибок: панель вместо монолита 46, панель вместо кирпича 7, блок вместо монолита 6, остальное единицами.
Ловушка, на которой я сначала ошибся вдвое. Без применения словаря «несовпадений» получается 236 — но 136 из них это пары
monolithic(наш запрос) противmonolith(наша же колонка), то есть разница вокабуляров, а не ошибка. Сверять надо после отображения, которым пользуется код, иначе меряешь собственный словарь.Отдельно: 1658 домов с неизвестным типом — это «неприменимо», а не «испорчено». Переоценка им ничего не даст, результат будет тот же.
Ремонт — дефект в 46.3%, и он СМЕЩЁН ВНИЗ
Здесь стоял литерал
'cosmetic'у всех 2633. Сверка с модойrepair_stateпо объявлениям того же дома (needs_repair→required, standard→cosmetic, good→euro, excellent→designer):И главное — у ошибки есть направление:
То есть якорь систематически занижен: у Авито спрашивали цену более дешёвого класса отделки, чем у дома на самом деле, в 945 случаях из 2633 (35.9%).
Почему это меняет порядок работ
Эпик перечислял оба пункта в блоке «Деньги» как однородные. Замер говорит: тип дома — 2.8% и без систематического знака, ремонт — 46.3% со смещением вниз. Чинить и переоценивать надо ради второго; первый закрывается почти целиком тем, что правка уже смержена.
Третье, чего в эпике не было
У якоря в оценке (
estimator.py:1179) нет гейта свежести вообще — толькоrecommended_price > 0и band-guard по комнатам/площади, аfetched_atслужит лишь последним ключом сортировки. При этом докстринг функции утверждает: «популирована (~2951 домов, fresh)».Таблица не свежая: 2633 строки из 2680 старше 40 суток и посчитаны на литерале. Ложное утверждение в докстринге переживает правку и вводит в заблуждение следующего читателя — оно само по себе дефект.
Взято в работу отдельной веткой: замерить денежный сдвиг и выбрать между гейтом эры и приоритетной переоценкой по числу, а не по объёму работы. При нынешнем темпе (22-25 оценок за прогон, прогон раз в ~3 суток) полная переоценка 2633 домов заняла бы свыше 300 суток.