(low) get_connection_points игнорирует harvest_error/staleness — error-only дамп отдаётся как dump_available=true #1371

Closed
opened 2026-06-14 18:09:52 +00:00 by bot-backend · 0 comments
Collaborator

Описание

get_connection_points при наличии строки в nspd_quarter_dumps безусловно возвращает dump_available=True и пустые structures/zouit_overlaps, не проверяя ни harvest_error, ни возраст дампа. Но _upsert_dump при частичном сбое пишет error-only строку с harvest_error != NULL, нулевыми счётчиками и валидным fetched_at_utc. Для такого квартала клиент получает dump_available=true + nearest_structure_distance_m=None + total_structures_in_radius=0, что неотличимо от «дамп есть, инж.сетей рядом нет», и harvest не перезапускается. Это противоречит соседней get_quarter_dump_data, которая для того же error-row ставит available=False и триггерит повторный harvest.

Корень

SELECT dump_row выбирает только fetched_at_utc, total_features; поле harvest_error не читается и не проверяется до return {'dump_available': True}. dump_row is None → False (строка существует), проверка ошибки отсутствует. Прямая несогласованность с get_quarter_dump_data.

Evidence

/Users/anton/Птица/gendesign/backend/app/services/site_finder/quarter_dump_lookup.py:928-979

if dump_row is None:
    _trigger_harvest(quarter)
    return {... 'dump_available': False ...}
fetched_at = dump_row[0]
...
return {
    ...
    'dump_available': True,   # нет проверки harvest_error / staleness
    'dump_fetched_at': dump_fetched_at,
}

/Users/anton/Птица/gendesign/backend/app/services/site_finder/nspd_sync.py:218-243_upsert_dump пишет error-only строку с harvest_error != NULL, fetched_at_utc = now(), нулевыми счётчиками.

Suggested fix

В SELECT dump_row добавить harvest_error и (опционально) проверку возраста; если harvest_error IS NOT NULL — трактовать как отсутствие данных: _trigger_harvest(quarter) + вернуть dump_available=False, как делает get_quarter_dump_data.

Обоснование severity

Low: данные не повреждаются, пространственные запросы возвращают корректные пустые массивы для error-row; endpoint /connection-points дополнительный, не блокирующий. Но дефект достижим в проде и создаёт вводящий в заблуждение ответ без самовосстановления.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=low · category=correctness

Затронутые файлы:

  • /Users/anton/Птица/gendesign/backend/app/services/site_finder/quarter_dump_lookup.py
  • /Users/anton/Птица/gendesign/backend/app/services/site_finder/nspd_sync.py
## Описание `get_connection_points` при наличии строки в `nspd_quarter_dumps` безусловно возвращает `dump_available=True` и пустые structures/zouit_overlaps, не проверяя ни `harvest_error`, ни возраст дампа. Но `_upsert_dump` при частичном сбое пишет error-only строку с `harvest_error != NULL`, нулевыми счётчиками и валидным `fetched_at_utc`. Для такого квартала клиент получает `dump_available=true` + `nearest_structure_distance_m=None` + `total_structures_in_radius=0`, что неотличимо от «дамп есть, инж.сетей рядом нет», и harvest не перезапускается. Это противоречит соседней `get_quarter_dump_data`, которая для того же error-row ставит `available=False` и триггерит повторный harvest. ## Корень SELECT `dump_row` выбирает только `fetched_at_utc, total_features`; поле `harvest_error` не читается и не проверяется до `return {'dump_available': True}`. `dump_row is None` → False (строка существует), проверка ошибки отсутствует. Прямая несогласованность с `get_quarter_dump_data`. ## Evidence `/Users/anton/Птица/gendesign/backend/app/services/site_finder/quarter_dump_lookup.py:928-979` ```python if dump_row is None: _trigger_harvest(quarter) return {... 'dump_available': False ...} fetched_at = dump_row[0] ... return { ... 'dump_available': True, # нет проверки harvest_error / staleness 'dump_fetched_at': dump_fetched_at, } ``` `/Users/anton/Птица/gendesign/backend/app/services/site_finder/nspd_sync.py:218-243` — `_upsert_dump` пишет error-only строку с `harvest_error != NULL`, `fetched_at_utc = now()`, нулевыми счётчиками. ## Suggested fix В SELECT `dump_row` добавить `harvest_error` и (опционально) проверку возраста; если `harvest_error IS NOT NULL` — трактовать как отсутствие данных: `_trigger_harvest(quarter)` + вернуть `dump_available=False`, как делает `get_quarter_dump_data`. ## Обоснование severity Low: данные не повреждаются, пространственные запросы возвращают корректные пустые массивы для error-row; endpoint `/connection-points` дополнительный, не блокирующий. Но дефект достижим в проде и создаёт вводящий в заблуждение ответ без самовосстановления. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`correctness`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/backend/app/services/site_finder/quarter_dump_lookup.py` - `/Users/anton/Птица/gendesign/backend/app/services/site_finder/nspd_sync.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:09:52 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:54 +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#1371
No description provided.