fix(tradein/quality): витрина перестаёт рапортовать «доля с кадастром» (#2674) #2850
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2850
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2674-quality-cadastre-column"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
v_data_quality.pct_cadastr= 0.000000 у всех прогонов. Разбор показал: это НЕ дефект измерителя и НЕ «смотрит не на ту колонку» — это третий показатель класса 214 (outliers_flagged) и 216 (price_disagreements_count): ноль, гарантированный устройством системы, читается как «проверили — чисто». Поэтому показатель снят, а не переключён на соседнюю колонку.Числа с прода 2026-08-13 (точный count):
pct_cadastrlistings_active)listingsвсего 99 304)listings.cadastral_number IS NOT NULLdeals.cadastral_numberhouses.cadastral_number(DaData)listings.building_cadastral_numberИзмеритель здоров (контроль на заведомо здоровом образце в тех же данных): тот же CTE
active_listingsи тот же шаблонcount(*) WHERE <col> IS NOT NULL * 100.0 / NULLIF(count(*),0)в соседних строках даётpct_geocoded95.61%,pct_description39.82%,pct_year_built65.10%. Ровно 0% — про колонку, а не про арифметику.Почему ноль структурный.
listings.cadastral_number— кадастр КВАРТИРЫ. Единственное место в коде, которое его читает, —providers/cian/serp.py:886; в парсерах avito/yandex/domclick/n1 словcadastr/kadastrнет ни разу, т.е. для 4 площадок из 5 ноль гарантирован НАШИМ кодом и о предметной области не говорит ничего. Это уже записано и вmatching/houses.py: «площадки кадастр не отдают».Почему НЕ «правка на одну строку» (переключить на соседнюю колонку).
listings.building_cadastral_number— кадастр ЗДАНИЯ, и вlistingsу него ровно один писатель: наш ночной KNN ≤50 м по локальному зеркалу ЕГРН (tasks/cadastral_geo_match.py:161; других INSERT/UPDATE этой колонки наorigin/mainнет). #2674 замерил ключ как неинъективный (656/3 260 значений накрывают >1 здание ГАР, 20.1%) и запретил считать его идентичностью здания. Под подписью «доля объявлений с кадастром» он мерил бы покрытие нашего геокодера и охват зеркала (разброс по площадкам 20.3–49.7%) — новая ложь вместо старой. Авторитетный кадастр здания есть (houses.cadastral_number, DaData 2 648/9 468), но он про ДОМА, а витрина считает ОБЪЯВЛЕНИЯ.Цена правки. Читателей у витрины в коде нет (grep по
/app/appв живом контейнере пуст;/api/v1/admin/scraper/data-qualityсчитает свои метрики сам и кадастр не показывает) — это ручной psql-снимок. Зависимых объектов у view нет (pg_depend, прод 13.08: 0 строк) → CASCADE не нужен.Что в диффе
data/sql/259_data_quality_drop_pct_cadastr.sql—DROP VIEW→CREATE VIEWбез строкиpct_cadastr(CREATE OR REPLACE колонку удалить не может; тот же порядок, что 214/216). Тело скопировано из 222 и сверено с живымpg_get_viewdef. Из CTE убран ставший ненужнымcadastral_number— 222 завела явный список колонок ровно затем, чтобы view не держал column-level зависимость на то, чего не показывает.SET LOCAL lock_timeout = '5s'перед DROP.COMMENT ON VIEWвыставлен заново (DROP уносит комментарий вместе с объектом — в отличие от 222 с её CREATE OR REPLACE)._manifest_applied.txt— своя строка в своём PR.tests/test_2674_dead_admin_metrics.py— гейт против возврата, рядом с таким же дляoutliers_flagged; общий хелпер_latest_v_data_quality()вместо копии парсера.Test plan
origin/main(детач-worktree, тест скопирован в него):test_latest_v_data_quality_no_longer_reports_flat_cadastreFAILED — «показатель вернулся в v_data_quality», последний DDL там 222 со строкойAS pct_cadastr. Соседний..._no_longer_reports_outliersв том же прогоне PASSED (сама механика теста исправна). На ветке: 16 passed.COMMENT ON VIEWиз 259 → красный на ветке про потерянный комментарий; (2) снятьpct_cadastr, но подставитьbuilding_cadastral_numberпод другим именем → красный «в витрину подставили другой кадастр»; исходная 259 → зелёный.BEGIN READ ONLY— парсится, возвращает те же 15 колонок и те же значения минусpct_cadastr.scripts/check-migration-lock-timeout.py→ «блокирующий DDL прикрыт lock_timeout (проверено новых миграций: 9)»,--selftest OK.test_migrations_manifest.py,test_dead_code_sweep_2674.py— зелёные (34 passed суммарно), ruff check/format чисто.Refs #2674