tradein: «медианный торг» считается по псевдорепликам — 34% показываемых чисел стоят на ОДНОМ объявлении, и гейт по числу пар этого не видит #2672
Closed
opened 2026-08-05 19:06:47 +00:00 by bot-backend
·
8 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#2672
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?
Найдено при ревью PR #2671. Тот PR добавляет гейт правдоподобия и он полезен, но ревью показало, что порог считает не то, что нужно, и это надо знать до того, как задачу сочтут закрытой.
Пары — не независимые наблюдения
Функция подбирает по одному объявлению на сделку, но одно и то же объявление переиспользуется на многих сделках улицы. Медиана по группам — 18 сделок на одно различное объявление.
Живой случай, ради которого всё затевалось:
Сто семнадцать «независимых наблюдений» — это сто семнадцать цен сделок, делённых по сути на одну цену предложения. Медиана такой выборки говорит не о рынке улицы, а о том, насколько это одно объявление отличалось от типичной сделки.
Что это значит для гейта
Из 64 чисел, которые гейт пропускает:
Пример проходящего сегодня:
Белинского, 1-комн → −50.6%из 50 пар и 1 объявления.Джекнайф по объявлениям (выкинуть одно, 42 группы, 107 повторов) даёт отклонение медианы p50 3.7, p90 17.3, максимум 63.8 п.п. Это тот же порядок, что и шум при трёх парах, которым порог обосновывали — и порог по парам против него бессилен.
Причина в методе калибровки: бутстрап пересэмплировал пары, то есть измерял дисперсию со стороны сделок. Доминирует дисперсия со стороны объявлений — ровно тот корень, который называет #2666.
Отсюда же следует, что снижать порог по парам бессмысленно: вернувшиеся группы всё равно будут стоять на одном-двух объявлениях. Это была бы ложная точность, а не возвращённое покрытие.
Что предлагается
Считать различные объявления, а не пары. Покрытие, измеренное на 128 группах:
Настоящее решение проблемы — пейринг по дому, а не по улице (ADR #721). Гейт по различным объявлениям — честный промежуточный шаг.
Второе: нижняя граница слишком мягкая, а не слишком жёсткая
Я подозревал, что граница −60% может резать реальный рынок (у большого минуса есть законный механизм — занижение цены в договоре). Проверка показала обратное: всё до −60% проходит, механизм сохранён полностью. Проблема в другом — граница пропускает большой неправдоподобный отрицательный хвост.
Из 64 показываемых чисел 26 (41%) лежат ниже −23.8% — ниже худшего объяснимого рынком бакета коэффициента выкупа. Самое глубокое показываемое: −58.5%.
То есть мы гасим «+34%» как неправдоподобное и показываем «−58.5%», полученное из того же самого артефакта пейринга.
Асимметрия работает против нас: абсурдный плюс сам себя опровергает — пользователь просто не поверит виджету. Абсурдный минус выглядит правдоподобно и подталкивает продавца к выводу, что его улица торгуется за полцены. Цена ужесточения до −35%: показываемых чисел 64 → 50.
Третье: поштучный процент в таблице не гасится
Когда медиана скрыта как неправдоподобная, в таблице пар под ней всё равно видны строки вида +76%, +73%, +63%. На гейтнутом случае Космонавтова шесть из двенадцати первых строк — от +42% до +77%, и все против одной и той же цены предложения.
Обоснование «пара — факт, медиана — обобщение» не выдерживает: сделка факт и объявление факт, но сама пара — сконструированный артефакт, и процент считается по ней. Логично гасить или приглушать колонку разницы, когда гейт сработал.
Связано: #2666, #2671, ADR #721, #2660.
Прод-проверка гейта на живых адресах (те, что реально запрашивали пользователи). Гейт работает — и та же проверка подтвердила вторую находку вживую.
Гейт по числу пар работает (Нагорная: 4 пары → число погашено с объяснением), и случай «пар нет вовсе» корректно оставлен без объяснения — ровно то, что закрепляет новый тест.
Живое подтверждение слишком мягкой нижней границы
Серов, улица Ленина, 163 — реальный пользовательский запрос, 21 пара, и пользователю показывается медианный торг −46.54%.
Это вдвое ниже худшего объяснимого рынком уровня (−23.8% у студий). Никакой рынок так не торгуется. Значение приходит из того же артефакта пейринга по улице, из-за которого мы гасим «+34%» — только минус выглядит правдоподобно и потому опаснее.
Причём Серов — малый город, где улица Ленина длинная и застройка разнородная: сравнивать сделку в одном доме с объявлением в другом там ещё бессмысленнее, чем в Екатеринбурге.
Итого граница
−60%пропускает то, ради чего гейт и делался. Ужесточение до−35%(показываемых чисел 64 → 50) выглядит уже не теоретическим предложением, а необходимым — но это решение владельца, поэтому оставляю здесь с живым примером вместо абстракции.Заодно про порог пар
Тот же Серов показывает, что и порог по парам сам по себе недостаточен: 21 пара — вдвое выше порога, и всё равно результат абсурден. Это ещё один довод в пользу главного пункта этой задачи — считать различные объявления, а не пары.
Working on this in PR #2706 (части 1 и 2: гейт по различным объявлениям + ужесточение нижней границы). Пункт 3 (поштучный процент в таблице) — фронт, не входит.
Прод-верификация PR #2706 (смержен, задеплоен — контейнер
tradein-backendперезапущен через 9 минут после мержа; проверено по КОДУ внутри контейнера:SALES_VS_LISTINGS_MIN_DISTINCT_LISTINGS = 2,SANE_DISCOUNT_MIN_PCT = -35.0, текст объяснения на месте).Покрытие на живом проде: 64 → 32 (50% → 25%)
128 групп (реальные пользовательские запросы из
trade_in_estimates), прогнаны через задеплоенный эндпоинт. «ДО» пересчитано по старому правилу на ТЕХ ЖЕ парах, которые вернул тот же живой ответ — один вход, две трактовки:Все числа из issue воспроизвелись на проде до единицы: 128 групп, 64 показываемых, 22 (34%) на одном объявлении, 50 (78%) на <3, 26 ниже −23.7%, самое глубокое −58.5%,
Белинского1-комн. = 50 пар / 1 объявление / −50.6%, «18 сделок на одно различное объявление» (по показываемым группам). Покрытие вариантов тоже: пар≥10 и объявлений≥2 → 42 (33%), объявлений≥2 → 47 (37%).Два живых кейса, ответ прода
Космонавтов показателен: порог по объявлениям его НЕ ловит (2 ≥ 2), гасит граница. Виджет цел — 108/181 пар в таблице, linkage и
data_qualityне тронуты.Что стало с 26 числами ниже −23.7%
Осталось 10 (от −33.9 до −25.2, все на ≥2 объявлениях). Граница −35% намеренно проведена по «заведомо не рынок», а не по «рыночно правдоподобно»: у большого минуса есть законный механизм (занижение цены в ДКП), запас под него сохранён. Живой −46.5% из моего прошлого комментария (Серов, Ленина 163) больше не показывается.
Что осталось открытым
discount_pctв таблице не гасится вместе со сводным числом) — фронт, не входил в PR. Issue оставляю открытым под него.Working on part 3 in PR #2774 (поштучный процент в таблице). Постановка подтверждена на проде: из 5 054 показываемых процентов 3 678 (72.8%) стоят в группах, где медиана уже погашена.
Проверка на проде 2026-08-07 11:55 MSK: п.1 и п.2 подтверждены заново, п.3 смержен, но НЕ задеплоен
п.1 и п.2 — работают. Повторил замер независимо, прогнав 427 реальных адресов из
trade_in_estimatesчерез задеплоенный обработчик внутриtradein-backend:Константы в живом модуле:
SALES_VS_LISTINGS_MIN_DISTINCT_LISTINGS = 2,SALES_VS_LISTINGS_SANE_DISCOUNT_MIN_PCT = -35.0.п.3 — код есть в main, но не в контейнере. PR #2774 смержен сегодня в 08:56 UTC,
а работающий
tradein-backendсоздан в 08:50:51 UTC — на шесть минут раньше. Проверенопо коду внутри контейнера: маркера
pairs_stand_on_one_listingтам нет.То есть прямо сейчас, спустя час после мержа, поштучные проценты в погашенных группах
по-прежнему показываются:
Это ровно то число, которым PR #2774 обосновывался, — измеренное после его мержа на
живом проде. Правка ждёт следующего деплоя.
Критерий приёмки для п.3 (записан ДО факта)
Тот же замер после деплоя должен дать:
Задачу оставляю открытой до этого замера.
Переоткрываю: закрытие автоматическое, а критерий п.3 на проде не выполнен
Задачу закрыл мерж PR #2774 в 08:56:44 UTC — ключевым словом в описании PR, а не проверкой.
Автор задачи прямо писал обратное: «Пункт 3 этого issue — фронт, не входил в PR. Issue оставляю
открытым под него».
Проверка через 50 минут после мержа (комментарий выше): работающий
tradein-backendсоздан в08:50:51 UTC, то есть на шесть минут РАНЬШЕ мержа, и маркера
pairs_stand_on_one_listingв нём нет. Замер на живом проде прямо сейчас — 3 678 поштучных процентов из 5 054 (72.8%)
по-прежнему показываются в группах с погашенной медианой.
Это ровно тот случай, ради которого задача и заводилась: правка есть в main, эффекта на проде нет.
Критерий приёмки (записан ДО факта, повторяю из комментария выше): после деплоя тот же замер
должен дать ~1 396 строк с процентом вместо 5 054, а число показываемых медиан — остаться
33 из 135.
Прод-верификация PR #2774 (пункт 3 — поштучный процент). Смержен, задеплоен, проверено по КОДУ внутри контейнера
tradein-backend(маркер строкового объяснения на месте) и живыми запросами через задеплоенный эндпоинт.Постановка подтверждена (ДО правки, прод 2026-08-07)
427 реальных запросов из
trade_in_estimates, 135 групп с парами:Замер ДО/ПОСЛЕ на том коде, что мержится
origin/mainи ветка загружены черезimportlibв ОДИН процесс, обеим скормлены одни и те же живые пары из ответа прода:Живой прод после деплоя (27 групп, по 8 на каждую ветку гейта)
Все четыре сочетания микрокопии, ответ прода:
Решение и его цена
Строка гаснет там, и только там, где причина — свойство самой пары: объявлений < 2 (столбец «разница» = столбец цены сделки, поделённый на одну и ту же константу) либо медиана вне рыночного диапазона (по определению медианы половина строк ещё дальше от рынка). «Мало пар» строку не гасит — свойство выборки, про отдельную пару не говорит ничего; микрокопия «пар всего 4, поэтому процент в строке не показываем» была бы ложной причиной. Цена исключения: 3 группы / 20 строк.
Флаги считаются независимо от порядка веток гейта: порядок «мало пар → одно объявление → диапазон» прячет вторую причину за первой — 55 групп гаснут как «мало пар», хотя стоят ещё и на ОДНОМ объявлении.
Пороги не понижены и не изменены вовсе. Данные из строки не исчезают: цена сделки, цена объявления, срок и ссылка на месте — убирается наша подпись «торг» под их разностью.
Что остаётся открытым
Все три пункта issue закрыты (1 и 2 — PR #2706, 3 — PR #2774).
Расхождение двух проверок — вопрос времени, а не факта
Задачу переоткрыли с верным доводом: автозакрытие по ключевому слову сработало раньше деплоя. Оба замера верны, просто сделаны по разные стороны сборки.
tradein-backend(правки в нём нет)tradein-backend:latest— после всех трёх мержейТо есть переоткрытие было правильным в 10:00 и устарело к моменту следующей сборки. Правку донёс не свой деплой, а соседний — это ровно та ловушка, о которой предупреждает правило про очередь с
cancel-in-progress: false: «деплой прошёл» и «твой код в контейнере» — разные утверждения, и совпадают они не всегда.Проверка на живом коде после сборки 09:12
27 групп, по 8 на каждую ветку гейта:
Полный замер по 427 запросам из
trade_in_estimates: 5 054 → 1 396 строк (−72.4%), медиан по-прежнему 33 из 135, групп с погашенными строками 99.Видимое сокращение крупное — говорю числом, а не прячу в описании механизма. Убираются не данные: цена сделки, цена объявления, срок и ссылка остаются на месте. Снимается подпись «торг» под их разностью там, где ручаться за неё нечем.
Что осталось за рамками, чтобы это не читалось как «всё честно»
Закрываю по пункту 3. Первые два были закрыты ранее.