feat(tradein): location-coef MVP через FDW-мост к OSM POI Птицы (#2045 PR-B) #2314

Merged
lekss361 merged 1 commit from feat/tradein-location-coef-poi into main 2026-07-03 20:55:32 +00:00
Owner

Финальный PR для #2045 (первый — view на gendesign, уже смёржен/задеплоен). Backend-only, cross-DB через postgres_fdw:

  • 168_fdw_osm_poi_ekb.sql — foreign table поверх v_tradein_osm_poi_ekb (тот же SERVER gendesign_remote, без новых ролей/mapping).
  • 169_osm_poi_ekb_local.sql — локальное зеркало с GIST-индексом.
  • 170_scrape_schedules_seed_osm_poi_ekb_refresh.sql + app/tasks/osm_poi_ekb_refresh.py — daily bulk TRUNCATE+INSERT рефреш (без per-row FDW-запросов, атомарно в одной транзакции), отдельное расписание от cadastral_geo_match.
  • app/services/location_coef.py — порт straight-line POI-скоринга из Site Finder (CATEGORY_WEIGHTS as-is, радиус 1200м для квартир вместо 2000м участков, конфигурируем query-параметром 500-3000м); score→coef — явно помеченная heuristic v1 (0.95-1.05), НЕ откалиброванная на реальных ценовых дельтах.
  • GET /api/v1/trade-in/location-coef?estimate_id=&radius_m= — тот же IDOR-guard что у соседних роутов; graceful fallback (coef=1.0, factors=[], geo_source="unavailable") если локальное зеркало пусто — никогда 500, никогда фабрикация.
  • Scheduler зарегистрирован дважды намеренно (live dispatch + kit-registry #2192 ship-dark strangler) — по прецеденту cadastral_geo_match.

Вне scope: frontend wiring (mappers.ts/LocationDrawer.tsx) — отдельная задача после проверки эндпоинта в проде.

code-reviewer: APPROVE (12 мин, включая независимый прогон ruff+pytest). uv run pytest → 3147 passed/6 skipped. Полное покрытие: happy path, empty-mirror fallback, IDOR-матрица, radius-clamp.

Финальный PR для #2045 (первый — view на gendesign, уже смёржен/задеплоен). Backend-only, cross-DB через postgres_fdw: - `168_fdw_osm_poi_ekb.sql` — foreign table поверх `v_tradein_osm_poi_ekb` (тот же `SERVER gendesign_remote`, без новых ролей/mapping). - `169_osm_poi_ekb_local.sql` — локальное зеркало с GIST-индексом. - `170_scrape_schedules_seed_osm_poi_ekb_refresh.sql` + `app/tasks/osm_poi_ekb_refresh.py` — daily bulk TRUNCATE+INSERT рефреш (без per-row FDW-запросов, атомарно в одной транзакции), отдельное расписание от `cadastral_geo_match`. - `app/services/location_coef.py` — порт straight-line POI-скоринга из Site Finder (`CATEGORY_WEIGHTS` as-is, радиус 1200м для квартир вместо 2000м участков, конфигурируем query-параметром 500-3000м); score→coef — явно помеченная heuristic v1 (0.95-1.05), НЕ откалиброванная на реальных ценовых дельтах. - `GET /api/v1/trade-in/location-coef?estimate_id=&radius_m=` — тот же IDOR-guard что у соседних роутов; graceful fallback (`coef=1.0, factors=[], geo_source="unavailable"`) если локальное зеркало пусто — никогда 500, никогда фабрикация. - Scheduler зарегистрирован дважды намеренно (live dispatch + kit-registry #2192 ship-dark strangler) — по прецеденту `cadastral_geo_match`. Вне scope: frontend wiring (`mappers.ts`/`LocationDrawer.tsx`) — отдельная задача после проверки эндпоинта в проде. code-reviewer: ✅ APPROVE (12 мин, включая независимый прогон ruff+pytest). `uv run pytest` → 3147 passed/6 skipped. Полное покрытие: happy path, empty-mirror fallback, IDOR-матрица, radius-clamp.
lekss361 added 1 commit 2026-07-03 20:53:34 +00:00
feat(tradein): location-coef MVP через FDW-мост к OSM POI Птицы (#2045)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
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 1m36s
90731da537
Финальный PR issue #2045 (BE-3): GET /api/v1/trade-in/location-coef для
LocationDrawer. FDW foreign table -> локальное зеркало osm_poi_ekb_local
(TRUNCATE+INSERT, тот же паттерн что cad_buildings_local/cadastral_geo_match,
избегает ~1.16s/row FDW round-trip) -> straight-line POI-скоринг, портированный
из Site Finder poi_score.py::compute_poi_weighted_top7 (CATEGORY_WEIGHTS as-is,
радиус 1200м для квартир вместо Ptica 2000м для участков). score->coef -
новая MVP-эвристика (0.95..1.05, не откалибрована на реальных дельтах).

Graceful fallback (не 500, не фабрикуем факторы): пустая/не отрефрешенная
osm_poi_ekb_local или отсутствие lat/lon у оценки -> coef=1.0, factors=[],
geo_source="unavailable".

Scheduler: source=osm_poi_ekb_refresh, daily, зарегистрирован и в боевом
dispatch (scheduler.py), и в kit-registry (product_handlers.py) - иначе
test_kit_registry_completeness падает на ship-dark инварианте (#2192).

Frontend wiring (mappers.ts/LocationDrawer.tsx) - вне scope, отдельная задача
после проверки endpoint'а curl'ом на деплое.
lekss361 merged commit bc9549782b into main 2026-07-03 20:55:32 +00:00
lekss361 deleted branch feat/tradein-location-coef-poi 2026-07-03 20:55:32 +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#2314
No description provided.