Альтернативы при отрицательном вердикте: оптимизатор программы (класс × этажность × mix) в конце отчёта #2181

Closed
opened 2026-07-02 17:41:52 +00:00 by bot-backend · 1 comment
Collaborator

Фидбек Anton 2026-07-02: «если отчёт отрицательный по показателям — предложить выгодные варианты расчёта как альтернативу, просчитать всё».

Диагноз

  • Вердикт отчёта: report_assembler.py:781-870 _build_exec_summary() — «отрицательный» = deficit_index < −0.05 (затоварка) / низкий overall_score / low confidence; при затоварке headline «Локация затоварена — выход рискован» и всё, альтернатив нет.
  • Машинерия перебора есть частично: compute_scenarios (#984, scenarios.py:312-405) гоняет прогноз под 3 конвертами ставки, но НЕ варьирует программу (класс/этажность/mix/фазировку).
  • Финмодель по программе уже считается в §7 (концепция → ТЭП + финмодель по геометрии участка).

План

  1. Backend «оптимизатор программы»: при негативном вердикте перебор грида программ (класс × этажность × 2-3 mix-пресета из §4.2) → для каждой ТЭП+финмодель (NPV/IRR/срок) → топ-3 по NPV с положительным исходом; честно сказать если НИ ОДИН вариант не сходится.
  2. Endpoint GET /parcels/{cad}/program-alternatives (кэш по расчёту).
  3. UI: блок «Как участок сходится» в конце отчёта (после 6.6, перед footer) — таблица топ-3 альтернатив (программа, NPV, IRR, срок, чем отличается от базовой) + кнопка «Пересчитать §7 с этой программой».
  4. Разбить на sub-PR: Foundation (перебор+финмодель) → API → UI.

Ключевые файлы: report_assembler.py:781-870, scenarios.py:312-405, product_scoring.py:560-752, Section6Forecast.tsx, Section7Concept.tsx.

Фидбек Anton 2026-07-02: «если отчёт отрицательный по показателям — предложить выгодные варианты расчёта как альтернативу, просчитать всё». ## Диагноз - Вердикт отчёта: `report_assembler.py:781-870` `_build_exec_summary()` — «отрицательный» = deficit_index &lt; −0.05 (затоварка) / низкий overall_score / low confidence; при затоварке headline «Локация затоварена — выход рискован» и всё, альтернатив нет. - Машинерия перебора есть частично: `compute_scenarios` (#984, `scenarios.py:312-405`) гоняет прогноз под 3 конвертами ставки, но НЕ варьирует программу (класс/этажность/mix/фазировку). - Финмодель по программе уже считается в §7 (концепция → ТЭП + финмодель по геометрии участка). ## План 1. Backend «оптимизатор программы»: при негативном вердикте перебор грида программ (класс × этажность × 2-3 mix-пресета из §4.2) → для каждой ТЭП+финмодель (NPV/IRR/срок) → топ-3 по NPV с положительным исходом; честно сказать если НИ ОДИН вариант не сходится. 2. Endpoint `GET /parcels/{cad}/program-alternatives` (кэш по расчёту). 3. UI: блок «Как участок сходится» в конце отчёта (после 6.6, перед footer) — таблица топ-3 альтернатив (программа, NPV, IRR, срок, чем отличается от базовой) + кнопка «Пересчитать §7 с этой программой». 4. Разбить на sub-PR: Foundation (перебор+финмодель) → API → UI. Ключевые файлы: `report_assembler.py:781-870`, `scenarios.py:312-405`, `product_scoring.py:560-752`, `Section6Forecast.tsx`, `Section7Concept.tsx`.
Author
Collaborator

Live и прод-верифицировано (PR #2222). На участке Anton 66:41:0204016:10: базовая оценка NPV −77.6 млн / ROI −2.9% → блок «Как участок сходится» в конце отчёта показывает any_viable=true и топ-3 из грида 12 комбо:

Вариант NPV ROI
Эконом · 5 эт (лучший) +82 млн +14.7%
Эконом · 9 эт +73 млн +14.7%
Эконом · 14 эт +73 млн +14.7%

Цена одна во всех комбо — 131 523 ₽/м² (рынок: медиана новостроек в радиусе), класс двигает только себестоимость/эффективность/лот — поэтому эконом честно выигрывает на этой локации. Грид синхронный (~15 мс), Celery не понадобился. При «не сходится ни один» блок показывает наименее убыточные с честным текстом. На позитивных участках блока нет вовсе (гейт npv<0 OR roi<0).

Закрываю — весь фидбек-лист Anton от 2026-07-02 (5 пунктов → #2177-#2181) доставлен: #2177 шаг 1 live (шаги 2-3 остаются в issue), #2178/#2179/#2180/#2181 закрыты.

Live и прод-верифицировано (PR #2222). На участке Anton 66:41:0204016:10: базовая оценка **NPV −77.6 млн / ROI −2.9%** → блок «Как участок сходится» в конце отчёта показывает `any_viable=true` и топ-3 из грида 12 комбо: | Вариант | NPV | ROI | |---|---|---| | **Эконом · 5 эт** (лучший) | **+82 млн** | +14.7% | | Эконом · 9 эт | +73 млн | +14.7% | | Эконом · 14 эт | +73 млн | +14.7% | Цена одна во всех комбо — 131 523 ₽/м² (рынок: медиана новостроек в радиусе), класс двигает только себестоимость/эффективность/лот — поэтому эконом честно выигрывает на этой локации. Грид синхронный (~15 мс), Celery не понадобился. При «не сходится ни один» блок показывает наименее убыточные с честным текстом. На позитивных участках блока нет вовсе (гейт `npv<0 OR roi<0`). Закрываю — весь фидбек-лист Anton от 2026-07-02 (5 пунктов → #2177-#2181) доставлен: #2177 шаг 1 live (шаги 2-3 остаются в issue), #2178/#2179/#2180/#2181 закрыты.
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#2181
No description provided.