витрина: строка без улицы больше не открывает страницу и игру #3291

Merged
bot-backend merged 1 commit from fix/mera-showcase-order-street into main 2026-08-31 09:14:50 +00:00
Collaborator

Владелец открыл игру «Проверьте себя» и увидел вместо схемы улиц полигон района.

Дефект

Первой строкой и в таблице сверки, и в первом раунде игры стояла единственная из двадцати сделка без улицы. У остальных 19 схема улиц есть — то есть карту показать было чем, просто не этой строке.

Она же несла худшее расхождение витрины (+75,7 %) и меньше всех аналогов (6 против 21,5 в среднем) — и открывала страницу про точность.

Причина

completeness() в landing_showcase_deals.py считала полноту по району, этажу и этажности. Улицы в счёте не было, хотя именно она решает, будет ли у строки карта. Строка без улицы оказывалась «полной» наравне с прочими и выигрывала по свежести.

Правка

Наличие улицы вошло в счёт полноты: строка, которой нечем нарисовать карту, полнее строки с картой быть не может.

Признак берётся из индекса улиц в памяти — load_street_index поднят из _schemes_for в refresh, запрос остался тот же один. Пространственные запросы не тронуты: build_street_scheme по-прежнему считается только для 20 отобранных строк, а не для всех кандидатов.

Чего правка НЕ делает

Не сортирует и не фильтрует по величине ошибки. Отбор по ошибке был дефектом и уже убран; прятать промахи запрещено. Строка с +75,7 % остаётся в витрине — проверено отдельным тестом при limit=2 она просто становится второй, а не исчезает. test_selection_ignores_error_magnitude зелёный.

Проверки

14 тестов, rc=0. Фальсификация автором и ревьюером независимо: убрать улицу из счёта полноты → assert [9, 8] == [8, 9], красное по значению, не по исключению.

ruff check и ruff format --check чисто.

Честные потолки

  1. has_street означает «имя улицы сматчилось с OSM», а не «схема точно построится». build_street_scheme всё равно может вернуть None (нет геометрии, отвалилась вьюха) — редкая строка отранжируется как полная и уедет без схемы. Точный признак стоил бы двух пространственных запросов на каждого кандидата: ~400 вместо 40. Приёмка — по первой строке витрины, не по логам.
  2. Проводка в refresh тестом не покрыта (замечание ревьюера): все 14 тестов идут через select_rows/build_row, подмена признака на константу осталась бы зелёной.
  3. На проде эффекта не будет до ручного пересчёта витрины — планировщик её не дёргает: docker exec … -m app.tasks.landing_showcase_deals.
  4. Смещение к 92 % адресов, легших на OSM, признано в докстринге — оно по наличию поля, а не по ошибке.
Владелец открыл игру «Проверьте себя» и увидел вместо схемы улиц полигон района. ## Дефект Первой строкой и в таблице сверки, и в первом раунде игры стояла единственная из двадцати сделка **без улицы**. У остальных 19 схема улиц есть — то есть карту показать было чем, просто не этой строке. Она же несла худшее расхождение витрины (+75,7 %) и меньше всех аналогов (6 против 21,5 в среднем) — и открывала страницу про точность. ## Причина `completeness()` в `landing_showcase_deals.py` считала полноту по району, этажу и этажности. **Улицы в счёте не было**, хотя именно она решает, будет ли у строки карта. Строка без улицы оказывалась «полной» наравне с прочими и выигрывала по свежести. ## Правка Наличие улицы вошло в счёт полноты: строка, которой нечем нарисовать карту, полнее строки с картой быть не может. Признак берётся из индекса улиц в памяти — `load_street_index` поднят из `_schemes_for` в `refresh`, запрос остался тот же **один**. Пространственные запросы не тронуты: `build_street_scheme` по-прежнему считается только для 20 отобранных строк, а не для всех кандидатов. ## Чего правка НЕ делает **Не сортирует и не фильтрует по величине ошибки.** Отбор по ошибке был дефектом и уже убран; прятать промахи запрещено. Строка с +75,7 % остаётся в витрине — проверено отдельным тестом при `limit=2` она просто становится второй, а не исчезает. `test_selection_ignores_error_magnitude` зелёный. ## Проверки 14 тестов, rc=0. Фальсификация автором и ревьюером независимо: убрать улицу из счёта полноты → `assert [9, 8] == [8, 9]`, красное **по значению**, не по исключению. `ruff check` и `ruff format --check` чисто. ## Честные потолки 1. **`has_street` означает «имя улицы сматчилось с OSM», а не «схема точно построится».** `build_street_scheme` всё равно может вернуть `None` (нет геометрии, отвалилась вьюха) — редкая строка отранжируется как полная и уедет без схемы. Точный признак стоил бы двух пространственных запросов на каждого кандидата: ~400 вместо 40. Приёмка — по первой строке витрины, не по логам. 2. **Проводка в `refresh` тестом не покрыта** (замечание ревьюера): все 14 тестов идут через `select_rows`/`build_row`, подмена признака на константу осталась бы зелёной. 3. **На проде эффекта не будет до ручного пересчёта витрины** — планировщик её не дёргает: `docker exec … -m app.tasks.landing_showcase_deals`. 4. Смещение к 92 % адресов, легших на OSM, признано в докстринге — оно по наличию поля, а не по ошибке.
bot-backend added 1 commit 2026-08-31 06:30:26 +00:00
fix(mera-landing): наличие схемы улицы входит в полноту строки витрины
All checks were successful
CI Trade-In / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 13s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m14s
e45b05845e
Первой строкой витрины и первым раундом игры «Проверьте себя» стояла
единственная из двадцати сделка БЕЗ улицы: у неё вместо схемы улиц
рисовался полигон района. Причина — `completeness()` считала район, этаж
и этажность, но не улицу, хотя именно она решает, будет ли у строки карта.

Схема улицы — такое же ВИДИМОЕ поле, как район: строка, которой нечем
нарисовать карту, полнее строки с картой быть не может. Признак берётся
из уже загружаемого индекса улиц (`StreetIndex.lookup`, поиск в памяти);
индекс поднят выше отбора, дорогие пространственные запросы остались в
`_schemes_for` и по-прежнему считаются только для показанных строк.

Отбор по ВЕЛИЧИНЕ ОШИБКИ не введён и введён быть не может: строка
с отклонением +75,7% остаётся в витрине, просто больше не открывает её.
Прежнее правило «наличие схемы на отбор не влияет» в докстринге
`_schemes_for` заменено с разбором, почему оно давало этот дефект.

Тест двусторонний: при прочих равных строка со схемой выше строки без
неё, а строка без улицы остаётся в витрине. Фальсифицирован — снятие
`row.has_street` из `completeness` даёт красное ПО ЗНАЧЕНИЮ ([9, 8]
вместо [8, 9]), не по исключению.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit f7d428c0c5 into main 2026-08-31 09:14:50 +00:00
bot-backend deleted branch fix/mera-showcase-order-street 2026-08-31 09:14:51 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
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#3291
No description provided.