Parcel.geometry объявлена как POLYGON — реинтродукция класса крашей на многоконтурных (MultiPolygon) участках, который чинила миграция 93 (латентно: модел… #1625

Closed
opened 2026-06-16 18:44:17 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: geometry-type / latent-crash · Файл: backend/app/models/parcel.py:24

Файл: backend/app/models/parcel.py:24 — geometry: Mapped[object] = mapped_column(Geometry("POLYGON", srid=4326)).

ФАКТЫ: проект уже наступал на эти грабли — data/sql/93_cad_parcels_geom_multipolygon.sql мигрировал cad_parcels.geom Polygon→MultiPolygon ровно потому, что НСПД возвращает MultiPolygon для многоконтурных участков (пример 66:41:0105017:4), а strict geometry(Polygon,4326) ронял INSERT с psycopg.DataError → worker crash → autoretry exhausted → job hang (Pilot v8/v10).

ПОЧЕМУ ВСЁ ЖЕ LOW (латентно): (а) ORM Parcel мапится на таблицу parcels, для которой НЕТ DDL — grep CREATE TABLE ... parcels по data/sql/ пуст (есть только cad_parcels / cad_parcels_geom и др.). (б) ORM-класс Parcel в рантайме не используется: единственный Parcel( в коде (services/generative/geometry.py:283) — это ДРУГОЙ объект-датакласс (конструируется с polygon_m/buildable_m/grid/_to_wgs84 — не ORM-поля). По app/ нет ни Parcel( от ORM, ни raw-SQL к таблице parcels. Модель — мёртвый scaffold «Stage 2a» (docstring «real Parcel model»).

ИМПАКТ: сегодня нулевой (мёртвая модель, нет таблицы, нет вставок). Но если эту модель когда-либо подключат к реальному кадастровому потоку, тип POLYGON дословно воскресит уже исправленный класс крашей воркера на multi-contour parcels.

ФИКС: сразу объявить Geometry("MULTIPOLYGON", srid=4326), как в проде cad_parcels (миграция 93), чтобы scaffold не нёс известную мину.

Почему баг: Тип POLYGON в модели жёстко отвергнет любой многоконтурный участок. Сегодня импакт латентный (таблица parcels — scaffold «Stage 2a» без своего DDL, модель мёртвая), поэтому low. Но если эту модель когда-либо подключат к реальному кадастровому потоку (а docstring называет её «real Parcel model»), она дословно воскресит уже исправленный класс крашей воркера на multi-contour parcels. Стоит сразу объявить MULTIPOLYGON, как в проде cad_parcels.

Как чинить: Заменить на Geometry("MULTIPOLYGON", srid=4326) (как фактический тип cad_parcels.geom после миграции 93), либо явно пометить модель как deprecated/unused, если таблица parcels не планируется.


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.72 · unit B07

**Severity:** low · **Категория:** geometry-type / latent-crash · **Файл:** `backend/app/models/parcel.py:24` Файл: backend/app/models/parcel.py:24 — `geometry: Mapped[object] = mapped_column(Geometry("POLYGON", srid=4326))`. ФАКТЫ: проект уже наступал на эти грабли — data/sql/93_cad_parcels_geom_multipolygon.sql мигрировал cad_parcels.geom Polygon→MultiPolygon ровно потому, что НСПД возвращает MultiPolygon для многоконтурных участков (пример 66:41:0105017:4), а strict `geometry(Polygon,4326)` ронял INSERT с psycopg.DataError → worker crash → autoretry exhausted → job hang (Pilot v8/v10). ПОЧЕМУ ВСЁ ЖЕ LOW (латентно): (а) ORM Parcel мапится на таблицу `parcels`, для которой НЕТ DDL — grep `CREATE TABLE ... parcels` по data/sql/ пуст (есть только cad_parcels / cad_parcels_geom и др.). (б) ORM-класс Parcel в рантайме не используется: единственный `Parcel(` в коде (services/generative/geometry.py:283) — это ДРУГОЙ объект-датакласс (конструируется с polygon_m/buildable_m/grid/_to_wgs84 — не ORM-поля). По app/ нет ни `Parcel(` от ORM, ни raw-SQL к таблице parcels. Модель — мёртвый scaffold «Stage 2a» (docstring «real Parcel model»). ИМПАКТ: сегодня нулевой (мёртвая модель, нет таблицы, нет вставок). Но если эту модель когда-либо подключат к реальному кадастровому потоку, тип POLYGON дословно воскресит уже исправленный класс крашей воркера на multi-contour parcels. ФИКС: сразу объявить `Geometry("MULTIPOLYGON", srid=4326)`, как в проде cad_parcels (миграция 93), чтобы scaffold не нёс известную мину. **Почему баг:** Тип POLYGON в модели жёстко отвергнет любой многоконтурный участок. Сегодня импакт латентный (таблица parcels — scaffold «Stage 2a» без своего DDL, модель мёртвая), поэтому low. Но если эту модель когда-либо подключат к реальному кадастровому потоку (а docstring называет её «real Parcel model»), она дословно воскресит уже исправленный класс крашей воркера на multi-contour parcels. Стоит сразу объявить MULTIPOLYGON, как в проде cad_parcels. **Как чинить:** Заменить на `Geometry("MULTIPOLYGON", srid=4326)` (как фактический тип cad_parcels.geom после миграции 93), либо явно пометить модель как deprecated/unused, если таблица parcels не планируется. --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.72 · unit B07</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:44:17 +00:00
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#1625
No description provided.