feat(financial/dcf): dormant separate-index inflation capability (default OFF) #1906

Merged
bot-backend merged 1 commit from feat/dcf-inflation-indices into main 2026-06-25 12:12:02 +00:00
Collaborator

Закрывает последний пункт остатка #1881 — раздельные инфляция-индексы СМР/цены — безопасным способом.

Контекст и риск

Excel-эталон применяет раздельную инфляцию к СМР-затратам и цене продажи по горизонту. Scoping показал: это ломает инвариант Σ cashflow == net_profit (номинальный DCF vs today-money БДР) и материально меняет headline NPV для всех проектов — поэтому реализовано как дремлющая capability, выключенная по умолчанию.

Что

  • _build_monthly_cashflow получил smr_inflation_annual=0.0 / sale_inflation_annual=0.0: помесячно-компаундная эскалация СМР-затрат (ПИР + СМР-бандл) и выручки. Земля НЕ эскалируется (t0-лумп). Маркетинг/НДС/налог прорейтятся на эскалированную выручку (тотал сохранён, только перераспределён по времени).
  • Гейт: константы _SMR_INFLATION_ANNUAL = _SALE_INFLATION_ANNUAL = 0.0compute_financial передаёт 0.0 → capability ВЫКЛ.

Zero-diff гарантия (deep-review verified)

При дефолте (1+0)**t == 1.0 → cashflow байт-в-байт идентичен прежнему → инвариант Σ cashflow == net_profit и все 57 прежних тестов проходят без изменений. Deep-review независимо проверил IEEE-754 идентичность + proration-denominator guard (denominator = raw revenue при выкл). Blast radius при дефолте: ноль.

Включение — отдельная калибровка

Enable требует: (а) калиброванных индексов (ориентиры Rosstat ~7-8% СМР / ~6% цена) и (б) решения переосмыслить headline-инвариант (номинальный DCF vs real БДР). Задокументировано в docstring. Плумбинг готов, протестирован, выключен.

Тесты

+10 (zero-diff байт-в-байт, компаундинг-фактор, NPV монотонно убывает по СМР-инфляции, земля не эскалируется, номинальная Σ расходится с net_profit при вкл). 67 passed, mypy strict clean, ruff clean. Без schema/API/codegen (capability внутренняя). Deep-review .

Refs #1881

Закрывает последний пункт остатка #1881 — раздельные инфляция-индексы СМР/цены — **безопасным способом**. ## Контекст и риск Excel-эталон применяет раздельную инфляцию к СМР-затратам и цене продажи по горизонту. Scoping показал: это **ломает инвариант** `Σ cashflow == net_profit` (номинальный DCF vs today-money БДР) и **материально меняет headline NPV** для всех проектов — поэтому реализовано как **дремлющая capability, выключенная по умолчанию**. ## Что - `_build_monthly_cashflow` получил `smr_inflation_annual=0.0` / `sale_inflation_annual=0.0`: помесячно-компаундная эскалация СМР-затрат (ПИР + СМР-бандл) и выручки. Земля НЕ эскалируется (t0-лумп). Маркетинг/НДС/налог прорейтятся на эскалированную выручку (тотал сохранён, только перераспределён по времени). - Гейт: константы `_SMR_INFLATION_ANNUAL = _SALE_INFLATION_ANNUAL = 0.0` → `compute_financial` передаёт 0.0 → **capability ВЫКЛ**. ## Zero-diff гарантия (deep-review verified) При дефолте `(1+0)**t == 1.0` → cashflow **байт-в-байт идентичен** прежнему → инвариант `Σ cashflow == net_profit` и **все 57 прежних тестов проходят без изменений**. Deep-review независимо проверил IEEE-754 идентичность + proration-denominator guard (denominator = raw `revenue` при выкл). **Blast radius при дефолте: ноль.** ## Включение — отдельная калибровка Enable требует: (а) калиброванных индексов (ориентиры Rosstat ~7-8% СМР / ~6% цена) и (б) решения переосмыслить headline-инвариант (номинальный DCF vs real БДР). Задокументировано в docstring. Плумбинг готов, протестирован, выключен. ## Тесты +10 (zero-diff байт-в-байт, компаундинг-фактор, NPV монотонно убывает по СМР-инфляции, земля не эскалируется, номинальная Σ расходится с net_profit при вкл). **67 passed**, mypy strict clean, ruff clean. **Без schema/API/codegen** (capability внутренняя). Deep-review ✅. Refs #1881
bot-backend added 1 commit 2026-06-25 11:53:57 +00:00
feat(financial/dcf): dormant separate-index inflation capability (default OFF)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m47s
CI / backend-tests (pull_request) Successful in 11m0s
9e848cee43
Wire smr_inflation_annual / sale_inflation_annual into _build_monthly_cashflow
(monthly-compounded escalation of СМР costs vs sale revenue), gated by module
constants _SMR_INFLATION_ANNUAL / _SALE_INFLATION_ANNUAL = 0.0. At default the
factor (1+0)**t == 1.0 → byte-identical cashflow → existing Σ cashflow ==
net_profit invariant and all 57 prior tests unchanged (deep-review verified
IEEE-754 identity + proration-denominator guard). Land not escalated (t0 lump);
marketing/VAT/tax prorated on escalated revenue (total preserved, only retimed).

Capability разведено+протестировано, OFF until calibrated indices + a decision
to reframe the headline today-money invariant (nominal DCF vs real БДР). No
schema/API/codegen change. +10 tests (zero-diff, compounding, NPV monotonicity,
land-excluded, nominal-Σ-diverges-when-on).

Refs #1881
bot-backend merged commit 66da75681f into main 2026-06-25 12:12:02 +00:00
bot-backend deleted branch feat/dcf-inflation-indices 2026-06-25 12:12:03 +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#1906
No description provided.