fix(tradein/yandex): снести признак «панорама» — его нет на площадке #2851
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2851
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2674-has-panorama"
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
Вердикт разбора: НЕПРИМЕНИМО → УДАЛИТЬ.
has_panoramaразбирался, писался и обещался публичным контрактомmarket.v_houses, но положительных значений не имел ни одного.Числа (прод, 13.08.2026):
external_valuationssource=yandex_valuation, страниц за 24.05–12.08raw_payload->'house'->>'has_panorama' = 'true'= 'false'houses: строк / непустых / trueЖивая проверка боевым трактом 13.08.2026. curl_cffi
impersonate=chrome120+ прод env-прокси,RealScraperConfig+get_scraper_delay— ровно какestimator.py:879;proxy_provider=None, пул не задействован, в БД не писал. Три адреса Екатеринбурга, все HTTP 200:Вхождений «анорам» без учёта регистра в полном HTML: 0, 0, 0. Равно как
panorama/Panorama/3D-тур/Виртуальн/Street— 0. Мета при этом разобралась целиком: 1974/9эт/панель/2,50/46 объектов · 2020/18эт · 1977/5эт/кирпич/184 объекта.Словарь удобств дома на странице: «Дом 1974 года · 9 этажей · Панельное здание · 2,50 м потолки · Газ · Лифт · Мусоропровод», причём с явными отрицаниями — «Лифт отсутствует», «Мусоропровода нет». Будь панорама признаком дома, она печаталась бы в этом же ряду и в отрицательной форме.
Природа нуля — третий вид: неприменимо. Не «метка переехала»: слова нет ни в тексте, ни в атрибутах, ни в data-*, ни в JSON-стейте — документ проверен целиком, а не только
body.text. Ноль был механически гарантирован самим кодом ("Панорама" in body_textпо тексту, где такого слова не бывает) и о предметной области говорил ровно одно: измерять нечего.Опровергнуто в исходной формулировке задачи. «Соседний has_lift — готовая контрольная группа, он доказывает, что разбор работает» — неточно.
has_lift = "Лифт" in body_textловит подстроку внутри отрицания: живая Сурикова 47 (5 этажей, 1977 г.) печатает «Лифт отсутствует», парсер отдаётTrue. На проде 300 из 313 пятиэтажек значатся «с лифтом», и 1370 из 1402 отрисованных страниц вообще. Как контроль «текст читается» он годится (это и подтвердилось), как контроль корректности разбора — нет; его 1241/1326 завышены. Гейт отрицания дляhas_lift— отдельной однострочной правкой, в этот PR не смешан.Тесты на панораму были тавтологичны:
test_parse_house_meta_with_panoramaкормил парсеру строку «7 объектов Дом 2010 года Панорама Лифт», собранную самим автором. Соседнийtest_parse_house_meta_full, наоборот, задаёт полный блок дома вообще без панорамы и ждётFalse— автор фикстуры уже знал реальный словарь страницы.«В справочнике 12 из 12 — нет» читалось как второй дефект; на деле путь записи
_save_yandex_house_panoramaвлит 2026-08-06 (f5b39e6f) и просто не успел набрать объём.Что сделано
Снос сквозь 9 файлов + миграция:
packages/scraper-kit/.../yandex/valuation.py— полеValuationHouseMeta.has_panorama+ строка разбораapp/services/estimator.py—_save_yandex_house_panoramaи её вызов (порядок «резолв дома до раннего возврата» сохранён — остаточный эффект переноса реален: дом иhouse_sourcesдля страниц без истории)app/services/matching/conflict_resolution.py— ключ вHOUSE_FIELD_PRIORITYdata/sql/259_houses_drop_has_panorama.sqlЦена: ломаем публичный контракт
has_panoramaвходит вmarket.v_houses(мигр. 154), где сказано прямым текстом: «adding a column later is backward compatible, renaming/removing one is not». Изменение ломающее и принято осознанно — читателей внеtradein-mvpнет (git grepпуст, включаяnewbuilding_crossload.py, единственный живой консьюмер контракта).CREATE OR REPLACE VIEWколонку удалить не умеет →DROP VIEW→DROP COLUMN→CREATE VIEW. Порядок обязателен ещё и потому, чтоDROP COLUMNбезCASCADEупрётся в зависимость view (на проде это единственный зависимый объект).CASCADEне используем.DROP VIEWуничтожает гранты — на проде наmarket.v_housesвиситGRANT SELECTдляgendesign_reader(мигр. 155); восстановлен явно. Без этой строки внешний ETL получил бы permission denied на следующем прогоне. Новый список колонок сверен с прод-information_schema: 60 → 59, порядок идентичен, разница ровно одна колонка.SET LOCAL lock_timeout = '5s'—scripts/check-migration-lock-timeout.py✓ (блокирующий DDL прикрыт lock_timeout (проверено новых миграций: 9)).Красный прогон
Снос измерителя нельзя проверить самим измерителем, поэтому гейт — регрессионный: имя не должно вернуться в боевой код, а миграция обязана снести колонку, пересобрать контракт и вернуть грант.
На
origin/main(те же тесты, код нетронут) — 3 failed:На ветке — 124 passed (6 затронутых файлов), полный бэкенд-прогон 4317 passed, 21 skipped.
Гейт умеет краснеть и после фикса (проверено фальсификацией на ветке): вернул ключ в
HOUSE_FIELD_PRIORITYи убралGRANTиз миграции → те же 3 теста снова red, с осмысленными сообщениями («DROP VIEW уничтожает гранты — без явного GRANT внешний ETL получит permission denied»). Порча откачена.Оговорка честности
Сырой HTML прошлых сборов не хранится (
raw_payloadдержит толькоbody_len/items_count), поэтому утверждение «метка была и исчезла в мае» доказательно не опровергается. Но и положительных за всё окно 1536 страниц ноль — в измеренной истории её тоже не было.Test plan
check-migration-lock-timeout.py— зелёныйorigin/main— 3 failed, вывод выше_schema_migrationsсодержит259_houses_drop_has_panorama.sql;information_schema.columnsпоhousesбезhas_panorama;market.v_houses= 59 колонок;role_table_grants—gendesign_readerснова с SELECT наmarket.v_housesRefs #2674