bug(#233): pzz_sync — pkk.rosreestr.ru PKK6 deprecated, мигрировать на NSPD WMS (territorial_zones) #259

Closed
opened 2026-05-17 06:41:39 +00:00 by lekss361 · 1 comment
Owner

Симптом

pzz_sync (POST /api/v1/admin/scrape/pzz-sync) падает с JSONDecodeError: Expecting value: line 1 column 1 (char 0).

GlitchTip: BACKEND-1B (id=44, firstSeen 2026-05-17 06:32 UTC, culprit tasks.pzz_sync.sync_pzz_zones_ekb).

Root cause

pkk.rosreestr.ru/arcgis/rest/services/PKK6/... deprecated — Rosreestr убрал PKK6 GeoJSON endpoint. Конкретно:

GET https://pkk.rosreestr.ru/arcgis/rest/services/PKK6/ZONES/MapServer/5/query
    ?...&f=geojson&...
→ HTTP/1.1 301 Moved Permanently
→ GET https://nspd.gov.ru/map?thematic=PKK
→ HTTP/1.1 200 OK    ← но это HTML страница, не JSON!
→ httpx response.json() → JSONDecodeError

Stack:

app/services/site_finder/pzz_loader.py:64 in fetch_pkk6_zones
httpx/_models.py:832 in json
__init__.py:346 in loads

Последствия

pzz_zones_ekb table = 0 строк глобально. UI на /site-finder для всех cad показывает:

Данные ПЗЗ из НСПД недоступны. Используйте Публичную кадастровую карту для кад. номера X.

Тот fallback message в UI = right behavior (правильно показать deprecation message), но Макс ожидает что ПЗЗ покажутся.

Fix options

NSPD имеет WMS layer 875838 для территориальных зон. Уже есть NSPDClient.get_features_in_bbox (после PR #247get_features_in_bbox_grid с grid sampling). После merge Sub-PR B #256 (grid sampling integration в harvest_quarter) ПЗЗ будут extracted прямо в nspd_quarter_dumps.features_json (layer=territorial_zones) и доступны через quarter_dump_lookup._get_nspd_zoning.

То есть: fix через #256, separate pzz_sync миграция может не нужна.

Option B: переписать pzz_loader.py на NSPD endpoints отдельно

Аналогичная функциональность но через NSPDClient вместо httpx к PKK6. Сохраняет отдельную таблицу pzz_zones_ekb как cache.

Option C: deprecate pzz_loader, использовать только nspd_quarter_dumps

Удалить pzz_loader.py, pzz_zones_ekb table, всё через quarter dumps. Простой, но требует full harvest всех 2400 quarters до того как ПЗЗ заработают везде.

Что нужно сейчас

  1. Hotfix: в pzz_sync.py catch JSONDecodeError → log warning не error (чтобы не засорять GlitchTip). Это 5 минут.
  2. Decision: A / B / C. Default — A, после merge #256.
  3. UI: на текущий момент сообщение "Используйте ПКК" — корректное, но можно улучшить — "ПЗЗ временно недоступны, fix в pipeline (issue #...)" с link на этот issue.

Acceptance

  • POST /admin/scrape/pzz-sync не падает с JSONDecodeError
  • pzz_zones_ekb имеет данные ИЛИ нет (если deprecated)
  • /analyze для cad в ЕКБ возвращает nspd_zoning != null (через NSPD dump после #256)
  • UI показывает ПЗЗ зону (не fallback message)

Severity

🟠 P1 — блокирует ВСЕ ПЗЗ для всех cad. Низкий impact пока user smoke-only, критично для пилота (Макс ожидает рабочий G1 Gate verdict).

  • #233 — оригинальное issue (pzz_zones_ekb пуста — closed by PR #241 add to beat schedule)
  • #256 — Sub-PR B grid sampling (recommended path для fix)
  • backend/app/services/site_finder/pzz_loader.py:64
  • GlitchTip BACKEND-1B (id=44)

(QA discovery 2026-05-17 06:32 UTC — manual trigger pzz_sync через /admin/scrape/pzz-sync)

## Симптом `pzz_sync` (`POST /api/v1/admin/scrape/pzz-sync`) падает с **`JSONDecodeError: Expecting value: line 1 column 1 (char 0)`**. GlitchTip: **BACKEND-1B** (id=44, firstSeen 2026-05-17 06:32 UTC, culprit `tasks.pzz_sync.sync_pzz_zones_ekb`). ## Root cause `pkk.rosreestr.ru/arcgis/rest/services/PKK6/...` **deprecated** — Rosreestr убрал PKK6 GeoJSON endpoint. Конкретно: ``` GET https://pkk.rosreestr.ru/arcgis/rest/services/PKK6/ZONES/MapServer/5/query ?...&f=geojson&... → HTTP/1.1 301 Moved Permanently → GET https://nspd.gov.ru/map?thematic=PKK → HTTP/1.1 200 OK ← но это HTML страница, не JSON! → httpx response.json() → JSONDecodeError ``` Stack: ``` app/services/site_finder/pzz_loader.py:64 in fetch_pkk6_zones httpx/_models.py:832 in json __init__.py:346 in loads ``` ## Последствия `pzz_zones_ekb` table = **0 строк** глобально. UI на `/site-finder` для **всех cad** показывает: > Данные ПЗЗ из НСПД недоступны. Используйте Публичную кадастровую карту для кад. номера X. Тот fallback message в UI = right behavior (правильно показать deprecation message), но Макс ожидает что ПЗЗ покажутся. ## Fix options ### Option A (RECOMMENDED): NSPD WMS layer 875838 (territorial_zones) NSPD имеет WMS layer `875838` для территориальных зон. Уже есть `NSPDClient.get_features_in_bbox` (после PR #247 — `get_features_in_bbox_grid` с grid sampling). После merge **Sub-PR B #256** (grid sampling integration в `harvest_quarter`) ПЗЗ будут extracted прямо в `nspd_quarter_dumps.features_json` (layer=`territorial_zones`) и доступны через `quarter_dump_lookup._get_nspd_zoning`. То есть: **fix через #256, separate pzz_sync миграция может не нужна**. ### Option B: переписать pzz_loader.py на NSPD endpoints отдельно Аналогичная функциональность но через `NSPDClient` вместо `httpx` к PKK6. Сохраняет отдельную таблицу `pzz_zones_ekb` как cache. ### Option C: deprecate pzz_loader, использовать только nspd_quarter_dumps Удалить `pzz_loader.py`, `pzz_zones_ekb` table, всё через quarter dumps. **Простой**, но требует full harvest всех 2400 quarters до того как ПЗЗ заработают везде. ## Что нужно сейчас 1. Hotfix: в `pzz_sync.py` catch `JSONDecodeError` → log warning не error (чтобы не засорять GlitchTip). Это **5 минут**. 2. Decision: A / B / C. Default — **A**, после merge #256. 3. UI: на текущий момент сообщение "Используйте ПКК" — корректное, но можно улучшить — "ПЗЗ временно недоступны, fix в pipeline (issue #...)" с link на этот issue. ## Acceptance - [ ] `POST /admin/scrape/pzz-sync` не падает с JSONDecodeError - [ ] `pzz_zones_ekb` имеет данные ИЛИ нет (если deprecated) - [ ] `/analyze` для cad в ЕКБ возвращает `nspd_zoning != null` (через NSPD dump после #256) - [ ] UI показывает ПЗЗ зону (не fallback message) ## Severity 🟠 **P1** — блокирует ВСЕ ПЗЗ для всех cad. Низкий impact пока user smoke-only, **критично для пилота** (Макс ожидает рабочий G1 Gate verdict). ## Links - #233 — оригинальное issue (pzz_zones_ekb пуста — closed by PR #241 add to beat schedule) - #256 — Sub-PR B grid sampling (recommended path для fix) - `backend/app/services/site_finder/pzz_loader.py:64` - GlitchTip BACKEND-1B (id=44) (QA discovery 2026-05-17 06:32 UTC — manual trigger pzz_sync через `/admin/scrape/pzz-sync`)
Author
Owner

Status check 2026-05-23

Issue остаётся в силе. После security pivot (PRs #426-#442) pzz_sync не трогался — pkk.rosreestr.ru PKK6 deprecated, миграция на NSPD WMS (territorial_zones) не делалась.

Priority после pilot demo 28.05: high — без миграции PZZ-данные не обновляются.

Привязка: добавлен в umbrella epic(infra): Pilot infra status 2026-05-23 — после security pivot.

## Status check 2026-05-23 Issue остаётся в силе. После security pivot (PRs #426-#442) `pzz_sync` не трогался — `pkk.rosreestr.ru` PKK6 deprecated, миграция на NSPD WMS (territorial_zones) не делалась. **Priority после pilot demo 28.05**: high — без миграции PZZ-данные не обновляются. Привязка: добавлен в umbrella `epic(infra): Pilot infra status 2026-05-23 — после security pivot`.
Sign in to join this conversation.
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#259
No description provided.