feat(gisogd66): permits_nearby — точный радиус-запрос РНС/РВЭ (#2367 PR-2, backend-half) #2401

Merged
bot-backend merged 1 commit from feat/gisogd-permits-nearby into main 2026-07-04 09:59:50 +00:00
Collaborator

Что

Backend-половина PR-2 из #2367: делаем видимыми данные ГИСОГД (9065 разрешений на проде) в analyze-payload. Закрывает 5-летний TODO в parcels.py:

# Spatial filter через geom недоступен до Phase 3 (geocoding → geom).
# Используем quarter prefix как прокси.
# После Phase 3: заменить на ST_DWithin(..., 500) по geom.

Phase 3 случилась (gisogd_permits.geom наполнена, GIST-индекс) → новый аддитивный ключ permits_nearby (ST_DWithin 500м), старый quarter-prefix путь (recent_permits_in_quarter/permits_summary, живая таблица ekburg_construction_permits с данными застройщика) не тронут — работает параллельно.

Честность (по конвенции проекта «без тихих капов»)

total_count/rs_count/rv_count считаются по полной выборке радиуса (SQL без LIMIT), список items капается срезом в Python (30), items_truncated явно сигнализирует, если список неполный — задел под «показать все N» на фронте.

Проверки

  • 47 тестов passed (honest-zero, RS/RV split, truncation 35→30, psycopg-safety, XSS-escape в PDF, non-fatal degradation)
  • code-reviewer: APPROVE — специально проверил, что горячий финансовый оркестратор analyze_parcel тронут ЧИСТО аддитивно (0 строк удалено, существующие ключи/scoring не задеты)
  • ruff + pinned pre-commit — Passed
  • api-types.ts diff: только новое поле (+4 строки)

Что дальше (не в этом PR)

Frontend-компонент рендера в §6 (Section6Forecast.tsx) — второй PR сразу после мержа этого (нужны свежие типы).

Refs #2367

## Что Backend-половина PR-2 из #2367: делаем видимыми данные ГИСОГД (9065 разрешений на проде) в analyze-payload. Закрывает 5-летний TODO в `parcels.py`: ``` # Spatial filter через geom недоступен до Phase 3 (geocoding → geom). # Используем quarter prefix как прокси. # После Phase 3: заменить на ST_DWithin(..., 500) по geom. ``` Phase 3 случилась (`gisogd_permits.geom` наполнена, GIST-индекс) → новый **аддитивный** ключ `permits_nearby` (ST_DWithin 500м), старый quarter-prefix путь (`recent_permits_in_quarter`/`permits_summary`, живая таблица `ekburg_construction_permits` с данными застройщика) не тронут — работает параллельно. ## Честность (по конвенции проекта «без тихих капов») `total_count`/`rs_count`/`rv_count` считаются по **полной** выборке радиуса (SQL без LIMIT), список `items` капается срезом в Python (30), `items_truncated` явно сигнализирует, если список неполный — задел под «показать все N» на фронте. ## Проверки - 47 тестов passed (honest-zero, RS/RV split, truncation 35→30, psycopg-safety, XSS-escape в PDF, non-fatal degradation) - code-reviewer: ✅ APPROVE — специально проверил, что горячий финансовый оркестратор `analyze_parcel` тронут ЧИСТО аддитивно (0 строк удалено, существующие ключи/scoring не задеты) - ruff + pinned pre-commit — Passed - api-types.ts diff: только новое поле (+4 строки) ## Что дальше (не в этом PR) Frontend-компонент рендера в §6 (`Section6Forecast.tsx`) — второй PR сразу после мержа этого (нужны свежие типы). Refs #2367
bot-backend added 1 commit 2026-07-04 09:44:01 +00:00
feat(gisogd66): permits_nearby — точный радиус-запрос РНС/РВЭ рядом с участком (#2367)
All checks were successful
CI / changes (pull_request) Successful in 8s
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m18s
CI / openapi-codegen-check (pull_request) Successful in 2m12s
CI / backend-tests (pull_request) Successful in 15m4s
79eb49e9bc
Phase 3 наполнила gisogd_permits.geom -> заменяем 5-летний TODO-прокси
quarter-prefix точным ST_DWithin(500м) как НОВЫЙ ключ payload
permits_nearby. Старый ekburg quarter-prefix путь
(recent_permits_in_quarter/permits_summary) не тронут — работает
параллельно.

Честность счётчиков: total_count/rs_count/rv_count считаются по ПОЛНОЙ
выборке радиуса (без LIMIT в SQL), items капается срезом в Python (30),
items_truncated сигнализирует капнутый список — без тихих капов.

Аддитивно, non-fatal (сбой -> честный ноль), + блок в §6 PDF-отчёта
(html.escape на все строки), + AnalyzeResponse schema + regen api-types.ts.
bot-backend merged commit b3a59b7cf1 into main 2026-07-04 09:59:50 +00:00
bot-backend deleted branch feat/gisogd-permits-nearby 2026-07-04 09:59:50 +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#2401
No description provided.