intents.py: _fmt_number отдаёт английские 'nan'/'inf' в RU-прозу детерминированного chat-ответа при NaN/Inf-числах #1585

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

Severity: low · Категория: correctness/report-honesty · Файл: backend/app/services/chat/intents.py:154

Файл: /Users/anton/Птица/gendesign/backend/app/services/chat/intents.py:154-155. Ветка if not math.isfinite(value): return str(value) (введена фиксом #1396 против ValueError-краша) возвращает Python-литерал 'nan' или 'inf'. Значение не None → проходит if shown is not None в _render_summary (intents.py:203-204) и _render_risks (intents.py:322-324) и встраивается в RU-текст, напр. «Ключевые числа — цена: nan.» или «Специальные индексы §25 — каннибализация: inf.». ИМПАКТ (low): нарушение контракта модуля (docstring 6-14: RU-микрокопирайт, отсутствующее число — честный пропуск, без технического мусора); клиент advisory-отчёта по недвижимости видит английский технический литерал. ФИКС: трактовать non-finite как отсутствующее число — if not math.isfinite(value): return None. Тогда вызывающий пропустит поле (как при value is None), что согласуется с graceful-логикой остальных рендереров. Опционально логировать non-finite как сигнал порченого движкового расчёта выше по стеку.

Почему баг: Контракт модуля (docstring строки 6-8, 95): числа берутся ВЕРБАТИМ и микрокопирайт строго RU, нейтральный бизнес-тон, без мусора. NaN/Inf в key_numbers/special_indices означает порченый/неполный движковый расчёт; вместо честного пропуска поля или маркера «нет данных» клиенту в советующем отчёте по недвижимости показывается английский технический литерал 'nan'/'inf'. Краш #1396 устранён, но осталась подача мусора в отчёт. Корректнее было бы трактовать non-finite как отсутствующее число (вернуть None → вызывающий пропустит поле, как и для value is None).

Как чинить: В ветке non-finite возвращать None (а не str(value)), чтобы вызывающие (_render_summary key_numbers loop проверяет shown is not None; _render_risks аналогично) честно пропустили поле, а не печатали 'nan'/'inf'.


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

**Severity:** low · **Категория:** correctness/report-honesty · **Файл:** `backend/app/services/chat/intents.py:154` Файл: /Users/anton/Птица/gendesign/backend/app/services/chat/intents.py:154-155. Ветка `if not math.isfinite(value): return str(value)` (введена фиксом #1396 против ValueError-краша) возвращает Python-литерал 'nan' или 'inf'. Значение не None → проходит `if shown is not None` в _render_summary (intents.py:203-204) и _render_risks (intents.py:322-324) и встраивается в RU-текст, напр. «Ключевые числа — цена: nan.» или «Специальные индексы §25 — каннибализация: inf.». ИМПАКТ (low): нарушение контракта модуля (docstring 6-14: RU-микрокопирайт, отсутствующее число — честный пропуск, без технического мусора); клиент advisory-отчёта по недвижимости видит английский технический литерал. ФИКС: трактовать non-finite как отсутствующее число — `if not math.isfinite(value): return None`. Тогда вызывающий пропустит поле (как при value is None), что согласуется с graceful-логикой остальных рендереров. Опционально логировать non-finite как сигнал порченого движкового расчёта выше по стеку. **Почему баг:** Контракт модуля (docstring строки 6-8, 95): числа берутся ВЕРБАТИМ и микрокопирайт строго RU, нейтральный бизнес-тон, без мусора. NaN/Inf в key_numbers/special_indices означает порченый/неполный движковый расчёт; вместо честного пропуска поля или маркера «нет данных» клиенту в советующем отчёте по недвижимости показывается английский технический литерал 'nan'/'inf'. Краш #1396 устранён, но осталась подача мусора в отчёт. Корректнее было бы трактовать non-finite как отсутствующее число (вернуть None → вызывающий пропустит поле, как и для value is None). **Как чинить:** В ветке non-finite возвращать None (а не str(value)), чтобы вызывающие (_render_summary key_numbers loop проверяет `shown is not None`; _render_risks аналогично) честно пропустили поле, а не печатали 'nan'/'inf'. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.78 · unit B18</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:10:38 +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#1585
No description provided.