objective_distinct не фильтрует group_name, но objective_group хардкодится 'Екатеринбург' — латентный кросс-город mislabel при расширении датасета (#307) #1588

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

Severity: low · Категория: correctness/edge-case · Файл: backend/app/services/etl/objective_backfill.py:94-97

Файл: backend/app/services/etl/objective_backfill.py:94-97 (CTE objective_distinct) + строка 198 (хардкод group).

objective_distinct берёт SELECT DISTINCT project_name FROM objective_corpus_room_month без WHERE group_name = 'Екатеринбург', а auto_apply_matches вставляет "group": "Екатеринбург" безусловно. Таблица поддерживает несколько групп: group_name TEXT NOT NULL (data/sql/68_schema_objective.sql:116) входит в UNIQUE(report_month, group_name, project_name, corpus_name, room_bucket) (строка 167).

Сейчас безопасно: единственное значение group_name = 'Екатеринбург' (docstring objective_backfill.py:9-10, подтверждено 155:9-11). Инвариант держится только на текущем содержимом.

Импакт (латентный): #307 («data goldmine») напрямую расширяет Objective-датасет. Как только появятся проекты других городов, их project_name попадут в кандидаты и будут записаны с objective_group='Екатеринбург', связав не-ЕКБ ЖК с ЕКБ-domrf-объектами. velocity.py/MV читают маппинг по domrf_obj_id→project_name без перепроверки города → загрязнение ЕКБ-аналитики чужими городами.

Фикс: добавить WHERE group_name = 'Екатеринбург' в objective_distinct (или параметризовать группу и согласовать с хардкодом в insert), чтобы матчинг и вставка были в одной группе.

Почему баг: Инвариант держится только на текущем содержимом таблицы. Как только в objective_corpus_room_month появятся проекты других городов (расширение Objective-датасета — прямая цель #307 «data goldmine»), их project_name попадут в кандидаты и будут вставлены как objective_group='Екатеринбург', связав не-ЕКБ ЖК с ЕКБ-domrf-объектами. velocity/MV читают по domrf_obj_id→project_name без перепроверки города → загрязнение ЕКБ-аналитики чужими городами. Каноничные SQL-бэкфиллы матчат против objective_lots с явной нормализацией и фиксируют группу, но Python берёт сырой DISTINCT project_name.

Как чинить: Добавить в objective_distinct фильтр WHERE group_name = 'Екатеринбург' (либо параметризовать группу и использовать её же при вставке), чтобы кандидаты и записываемый objective_group были согласованы.


deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.7 · unit B19

**Severity:** low · **Категория:** correctness/edge-case · **Файл:** `backend/app/services/etl/objective_backfill.py:94-97` Файл: backend/app/services/etl/objective_backfill.py:94-97 (CTE objective_distinct) + строка 198 (хардкод group). objective_distinct берёт `SELECT DISTINCT project_name FROM objective_corpus_room_month` без `WHERE group_name = 'Екатеринбург'`, а auto_apply_matches вставляет `"group": "Екатеринбург"` безусловно. Таблица поддерживает несколько групп: group_name TEXT NOT NULL (data/sql/68_schema_objective.sql:116) входит в UNIQUE(report_month, group_name, project_name, corpus_name, room_bucket) (строка 167). Сейчас безопасно: единственное значение group_name = 'Екатеринбург' (docstring objective_backfill.py:9-10, подтверждено 155:9-11). Инвариант держится только на текущем содержимом. Импакт (латентный): #307 («data goldmine») напрямую расширяет Objective-датасет. Как только появятся проекты других городов, их project_name попадут в кандидаты и будут записаны с objective_group='Екатеринбург', связав не-ЕКБ ЖК с ЕКБ-domrf-объектами. velocity.py/MV читают маппинг по domrf_obj_id→project_name без перепроверки города → загрязнение ЕКБ-аналитики чужими городами. Фикс: добавить `WHERE group_name = 'Екатеринбург'` в objective_distinct (или параметризовать группу и согласовать с хардкодом в insert), чтобы матчинг и вставка были в одной группе. **Почему баг:** Инвариант держится только на текущем содержимом таблицы. Как только в objective_corpus_room_month появятся проекты других городов (расширение Objective-датасета — прямая цель #307 «data goldmine»), их project_name попадут в кандидаты и будут вставлены как objective_group='Екатеринбург', связав не-ЕКБ ЖК с ЕКБ-domrf-объектами. velocity/MV читают по domrf_obj_id→project_name без перепроверки города → загрязнение ЕКБ-аналитики чужими городами. Каноничные SQL-бэкфиллы матчат против objective_lots с явной нормализацией и фиксируют группу, но Python берёт сырой DISTINCT project_name. **Как чинить:** Добавить в objective_distinct фильтр `WHERE group_name = 'Екатеринбург'` (либо параметризовать группу и использовать её же при вставке), чтобы кандидаты и записываемый objective_group были согласованы. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.7 · unit B19</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:13:05 +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#1588
No description provided.