fix(ptica): «геологический риск» больше не выводится из шума (#2934) #3006

Merged
bot-backend merged 1 commit from fix/2934-risks-coverage into main 2026-08-20 20:09:20 +00:00
Collaborator

Пункт 2 из порядка починки #2934.

Что было

# geology_risk_label: high если flooding, medium если шум > 65дБ, иначе low
if _has_flood:      _geo_label = "high"
elif noise_db_max >= 65.0:  _geo_label = "medium"
else:               _geo_label = "low"

Поле называется геологическим риском, а считается из подтопления и шума. Геологии в нём нет ни одного бита.

Хуже: cad_risk_zones пуста — 0 строк, писателя нет (п.6 той же задачи). Значит _flood всегда False, и подтопление приходит только из OSM-прокси «река или канал ближе 200 м». На тихом участке без реки поле всегда говорит "low" — зелёный вердикт, ни разу не подкреплённый проверкой геологии.

Правка

Поле убрано, а не переименовано. Замена не нужна: соседний блок geology уже честно отдаёт data_available: false, когда данных нет.

noise_score остаётся — он измерен честно. flood_zone остаётся — его судьба это отдельный пункт задачи (п.4, перевод на ЗОУИТ-35, где замер показал 8 объектов на 8 кварталов из 669).

Обоснование удаления — замером, а не словом

Убрать поле из публичного ответа можно только зная, что его никто не читает. Проверил и закрепил тестом, который перечитывает дерево исходников:

backend/app        — только сам parcels.py
frontend/src       — ни одного вхождения
§19-allowlist чата — не читает
экспортёры         — не читают
схема parcel.py    — risks: dict[str, Any] → OpenAPI не меняется

Тест не даст этому утверждению протухнуть.

Как проверено

  • Двусторонне: против origin/main три теста красные — «метка всё ещё выдаётся», «шум по-прежнему участвует в риск-блоке», «поле где-то ещё читается».
  • Контроль подмены: тест запрещает словесные градации ("high"|"medium"|"low") в риск-блоке. Без него «починка» переименованием оставила бы тот же обман.
  • Контроли от переусердствования, зелёные с обеих сторон: измеренный noise_score на месте, flood_zone тоже.
  • pytest backend/tests/api/377 passed, 1 skipped.

Проверка потребителей отличает комментарий от использования: иначе она краснеет на собственном объяснении правки — на это я наступал трижды за сутки, и здесь защита стоит явно.

Пункт 2 из порядка починки #2934. ## Что было ```python # geology_risk_label: high если flooding, medium если шум > 65дБ, иначе low if _has_flood: _geo_label = "high" elif noise_db_max >= 65.0: _geo_label = "medium" else: _geo_label = "low" ``` Поле называется **геологическим** риском, а считается из подтопления и **шума**. Геологии в нём нет ни одного бита. Хуже: `cad_risk_zones` пуста — 0 строк, писателя нет (п.6 той же задачи). Значит `_flood` всегда `False`, и подтопление приходит только из OSM-прокси «река или канал ближе 200 м». На тихом участке без реки поле **всегда** говорит `"low"` — зелёный вердикт, ни разу не подкреплённый проверкой геологии. ## Правка Поле убрано, а не переименовано. Замена не нужна: соседний блок `geology` уже честно отдаёт `data_available: false`, когда данных нет. `noise_score` остаётся — он измерен честно. `flood_zone` остаётся — его судьба это отдельный пункт задачи (п.4, перевод на ЗОУИТ-35, где замер показал 8 объектов на 8 кварталов из 669). ## Обоснование удаления — замером, а не словом Убрать поле из **публичного** ответа можно только зная, что его никто не читает. Проверил и закрепил тестом, который перечитывает дерево исходников: ``` backend/app — только сам parcels.py frontend/src — ни одного вхождения §19-allowlist чата — не читает экспортёры — не читают схема parcel.py — risks: dict[str, Any] → OpenAPI не меняется ``` Тест не даст этому утверждению протухнуть. ## Как проверено - **Двусторонне:** против `origin/main` три теста красные — «метка всё ещё выдаётся», «шум по-прежнему участвует в риск-блоке», «поле где-то ещё читается». - **Контроль подмены:** тест запрещает словесные градации (`"high"|"medium"|"low"`) в риск-блоке. Без него «починка» переименованием оставила бы тот же обман. - **Контроли от переусердствования, зелёные с обеих сторон:** измеренный `noise_score` на месте, `flood_zone` тоже. - `pytest backend/tests/api/` — **377 passed**, 1 skipped. Проверка потребителей отличает комментарий от использования: иначе она краснеет на собственном объяснении правки — на это я наступал трижды за сутки, и здесь защита стоит явно.
bot-backend added 1 commit 2026-08-20 19:43:54 +00:00
fix(ptica): «геологический риск» больше не выводится из шума (#2934)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m34s
CI / backend-tests (pull_request) Successful in 17m29s
416bb4ed89
`risks.geology_risk_label` назывался геологическим риском, а вычислялся так:

    high   — если подтопление
    medium — если шум ≥ 65 дБ
    low    — иначе

Геологии в нём не было ни одного бита. При этом `cad_risk_zones` пуста
(0 строк, писателя нет — #2934 п.6), поэтому подтопление приходило только
из OSM-прокси «река ближе 200 м». На тихом участке без реки поле ВСЕГДА
говорило «low» — зелёный вердикт, ни разу не подкреплённый проверкой
геологии.

Поле убрано, а не переименовано: соседний блок `geology` честно отдаёт
`data_available: false`, когда данных нет. Замена не нужна.

Удаление поля из публичного ответа обосновано замером, а не словом:
потребителей нет ни в backend, ни во фронте, ни в §19-allowlist чата, ни
в экспортёрах; в схеме `risks: dict[str, Any]`, поэтому OpenAPI не
меняется. На это поставлен отдельный тест, который перечитывает дерево
исходников — иначе обоснование держалось бы на моём слове.

Двусторонне: против origin/main три теста красные («метка всё ещё
выдаётся», «шум по-прежнему участвует в риск-блоке», «поле где-то ещё
читается»). Контроли зелёные с обеих сторон: измеренный `noise_score`
остаётся на месте, `flood_zone` тоже (его судьба — отдельный пункт
задачи).

Контроль подмены отдельно: тест запрещает словесные градации риска в
блоке, иначе «починка» переименованием оставила бы тот же обман.

Проверка потребителей отличает комментарий от использования — иначе она
краснеет на собственном объяснении правки (на это я наступал трижды за
сутки, см. соседние PR).

pytest backend/tests/api/ — 377 passed, 1 skipped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit 4a728b3a68 into main 2026-08-20 20:09:20 +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#3006
No description provided.