22 города Московской области в покрытии #3536

Merged
lekss361 merged 1 commit from feat/mo-cities-coverage into main 2026-09-16 16:42:08 +00:00
Owner

Зачем

Тестировщику по области нечего выбрать: реестр городов во фронте знал только Свердловскую область и Москву. Подмосковные населённые пункты лежали в _COVERAGE_NEGATIVE_CENTROIDS_DEG — намеренно, решением от 11.09.2026 «центроид без порога = город не определён».

Почему решение пересмотрено

Не «захотелось открыть регион», а замер — той же метрикой, которой Москве выбирали жёлтый тир: 120 проб на город, радиус 8 км от центра, когорта = is_active + точные комнаты + площадь ±15% + scraped_at > now() - 14d + ST_DWithin 1000 м.

ориентир медиана когорты доля проб ≥12
Екатеринбург (зелёный, порог 8) 37 0.865
города МО (22 шт.) 17-51 0.63-0.92
Москва (жёлтый, порог 12) 14 0.57
Нижний Тагил (жёлтый, порог 12) 11 0.473

Каждый город области плотнее Москвы, несколько — на уровне зелёного Екатеринбурга. Жёлтый порог для них консервативен.

Что внутри

  • city-registry.ts: тип региона 66 | 77 | 50, REGION_LABELS[50], 22 города после Москвы.
  • trade_in.py: COVERAGE_MO_CITIES_COVERAGE_CITY_THRESHOLDS с COVERAGE_YELLOW_MIN_N, 22 центроида в _CITY_CENTROIDS_DEG. 12 перенесены из негативного списка (32 → 20 записей, ключи двух словарей не пересекаются), 10 взяты из MOSCOW_OBLAST_CITY_ANCHORS — там они резолвлены Nominatim.
  • MOSCOW_CITY больше не берётся по индексу последнего элемента: список перестал заканчиваться Москвой, молчаливая поломка стоила бы дорого. Теперь поиск по id с явным throw.

Про тесты сетки

12 промоутнутых координат раньше держали большой пласт тестов, буквально утверждавших «здесь город не определён». Они переписаны по факту, а не подогнаны: контроль бесконечного радиуса переехал с точки в 22.9 км от новой Коломны, Пушкино теперь резолвится в Королёв (попал в 25-км радиус), _MOSCOW_OBLAST_CITIES сокращён с 16 до 4 реально оставшихся отрицательными.

Test plan

  • pytest tests/test_public_mera_api.py tests/test_coverage_probe_endpoint.py → 81 passed, 2 skipped (проверено в main-сессии, не со слов агента)
  • npx tsc --noEmit по всему фронту — чисто
  • ruff format + ruff check — чисто
  • После деплоя: выбрать город области в UI и получить оценку
## Зачем Тестировщику по области нечего выбрать: реестр городов во фронте знал только Свердловскую область и Москву. Подмосковные населённые пункты лежали в `_COVERAGE_NEGATIVE_CENTROIDS_DEG` — намеренно, решением от 11.09.2026 «центроид без порога = город не определён». ## Почему решение пересмотрено Не «захотелось открыть регион», а замер — той же метрикой, которой Москве выбирали жёлтый тир: 120 проб на город, радиус 8 км от центра, когорта = `is_active` + точные комнаты + площадь ±15% + `scraped_at > now() - 14d` + `ST_DWithin` 1000 м. | ориентир | медиана когорты | доля проб ≥12 | |---|---|---| | Екатеринбург (зелёный, порог 8) | 37 | 0.865 | | **города МО (22 шт.)** | **17-51** | **0.63-0.92** | | Москва (жёлтый, порог 12) | 14 | 0.57 | | Нижний Тагил (жёлтый, порог 12) | 11 | 0.473 | Каждый город области плотнее Москвы, несколько — на уровне зелёного Екатеринбурга. Жёлтый порог для них консервативен. ## Что внутри - `city-registry.ts`: тип региона `66 | 77 | 50`, `REGION_LABELS[50]`, 22 города после Москвы. - `trade_in.py`: `COVERAGE_MO_CITIES` → `_COVERAGE_CITY_THRESHOLDS` с `COVERAGE_YELLOW_MIN_N`, 22 центроида в `_CITY_CENTROIDS_DEG`. 12 перенесены из негативного списка (32 → 20 записей, ключи двух словарей не пересекаются), 10 взяты из `MOSCOW_OBLAST_CITY_ANCHORS` — там они резолвлены Nominatim. - `MOSCOW_CITY` больше не берётся по индексу последнего элемента: список перестал заканчиваться Москвой, молчаливая поломка стоила бы дорого. Теперь поиск по `id` с явным throw. ## Про тесты сетки 12 промоутнутых координат раньше держали большой пласт тестов, буквально утверждавших «здесь город не определён». Они переписаны по факту, а не подогнаны: контроль бесконечного радиуса переехал с точки в 22.9 км от новой Коломны, Пушкино теперь резолвится в Королёв (попал в 25-км радиус), `_MOSCOW_OBLAST_CITIES` сокращён с 16 до 4 реально оставшихся отрицательными. ## Test plan - [x] `pytest tests/test_public_mera_api.py tests/test_coverage_probe_endpoint.py` → 81 passed, 2 skipped (проверено в main-сессии, не со слов агента) - [x] `npx tsc --noEmit` по всему фронту — чисто - [x] `ruff format` + `ruff check` — чисто - [ ] После деплоя: выбрать город области в UI и получить оценку
lekss361 added 1 commit 2026-09-16 16:15:26 +00:00
feat(trade-in): 22 города Московской области в покрытии
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
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 / frontend-checks (pull_request) Successful in 1m34s
CI Trade-In / backend-tests (pull_request) Successful in 5m7s
f6dd426494
Тестировщику по области было нечего выбрать: реестр городов во фронте знал
только Свердловскую область и Москву, а подмосковные населённые пункты
лежали в _COVERAGE_NEGATIVE_CENTROIDS_DEG — намеренно, решением от
11.09.2026 «центроид без порога = город не определён».

Решение пересмотрено на замере, а не на желании открыть регион. Метрика —
та же, которой Москве выбирали жёлтый тир: 120 проб на город, радиус 8 км
от центра, когорта = is_active + точные комнаты + площадь ±15% +
scraped_at > now()-14d + ST_DWithin 1000 м. Результат: медиана когорты по
городам области 17-51, доля проб с >=12 аналогов 0.63-0.92. У Москвы,
которая уже жёлтая, медиана 14 и доля 0.57; у Нижнего Тагила (тоже
жёлтый) — 11 и 0.473. То есть каждый город области плотнее Москвы, и
жёлтый порог для них — консервативный выбор, а не натяжка.

Парность реестра и порогов сохранена (гейт test_public_mera_api): 22
города добавлены и во фронт, и в _COVERAGE_CITY_THRESHOLDS с
COVERAGE_YELLOW_MIN_N, и в _CITY_CENTROIDS_DEG. 12 центроидов перенесены
из негативного списка (32 -> 20 записей, ключи двух словарей не
пересекаются), 10 взяты из MOSCOW_OBLAST_CITY_ANCHORS — там они
резолвлены Nominatim.

MOSCOW_CITY больше не берётся по индексу последнего элемента: список
перестал заканчиваться Москвой, и молчаливая поломка стоила бы дорого —
теперь поиск по id с явным throw.

Тесты сетки покрытия переписаны по факту, а не подогнаны: 12 промоутнутых
координат раньше держали утверждение «здесь город не определён».
Контрольные точки пересчитаны (Пушкино теперь резолвится в Королёв,
контроль бесконечного радиуса переехал с точки в 22.9 км от Коломны).
lekss361 merged commit 4af1b14225 into main 2026-09-16 16:42:08 +00:00
lekss361 deleted branch feat/mo-cities-coverage 2026-09-16 16:42:09 +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#3536
No description provided.