ConceptInput.land_cost_rub без ge=0: отрицательная стоимость земли молча завышает маржу и IRR-proxy #1598

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

Severity: low · Категория: input-validation / неверные деньги · Файл: backend/app/schemas/concept.py:15

Файл: backend/app/schemas/concept.py:15 — land_cost_rub: float | None = Field(None, description=...) без ограничения ge=0.

Проблема: в отличие от target_floors (concept.py:13, ge=1, le=30) денежный вход не валидируется на знак. В compute_financial (financial.py:67-69) land = land_cost_rub if not None else 0.0; cost = construction + land; gross_margin = revenue - cost. Отрицательный land_cost_rub уменьшает cost, завышает gross_margin и irr-proxy (financial.py:75-76); клампинг лишь до [-1.0, 1.0] (financial.py:79) не ловит экономически некорректный вход.

Импакт: клиент или баг фронта может прислать отрицательную стоимость участка и получить завышенную маржу/доходность в отчёте без какого-либо сигнала. Нарушает консистентность контракта (все остальные числовые поля имеют границы).

Фикс: добавить ge=0 в Field для land_cost_rub в concept.py:15 (Field(None, ge=0, description=...)), чтобы Pydantic v2 отклонял отрицательные значения на входе.

Почему баг: Клиент (или фронт-баг) может прислать отрицательную стоимость участка и получить завышенную маржу/доходность — некорректные деньги в отчёте без какого-либо сигнала. Все остальные числовые входы (target_floors) имеют ge/le, а денежный — нет, что нарушает консистентность контракта.

Как чинить: Добавить в Field ограничение ge=0 (Field(None, ge=0, ...)) либо явную проверку в compute_financial с отклонением/занулением отрицательного land_cost и логом.


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

**Severity:** low · **Категория:** input-validation / неверные деньги · **Файл:** `backend/app/schemas/concept.py:15` Файл: backend/app/schemas/concept.py:15 — `land_cost_rub: float | None = Field(None, description=...)` без ограничения ge=0. Проблема: в отличие от target_floors (concept.py:13, ge=1, le=30) денежный вход не валидируется на знак. В compute_financial (financial.py:67-69) land = land_cost_rub if not None else 0.0; cost = construction + land; gross_margin = revenue - cost. Отрицательный land_cost_rub уменьшает cost, завышает gross_margin и irr-proxy (financial.py:75-76); клампинг лишь до [-1.0, 1.0] (financial.py:79) не ловит экономически некорректный вход. Импакт: клиент или баг фронта может прислать отрицательную стоимость участка и получить завышенную маржу/доходность в отчёте без какого-либо сигнала. Нарушает консистентность контракта (все остальные числовые поля имеют границы). Фикс: добавить ge=0 в Field для land_cost_rub в concept.py:15 (`Field(None, ge=0, description=...)`), чтобы Pydantic v2 отклонял отрицательные значения на входе. **Почему баг:** Клиент (или фронт-баг) может прислать отрицательную стоимость участка и получить завышенную маржу/доходность — некорректные деньги в отчёте без какого-либо сигнала. Все остальные числовые входы (target_floors) имеют ge/le, а денежный — нет, что нарушает консистентность контракта. **Как чинить:** Добавить в Field ограничение ge=0 (Field(None, ge=0, ...)) либо явную проверку в compute_financial с отклонением/занулением отрицательного land_cost и логом. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.8 · unit B27</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:15:37 +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#1598
No description provided.