feat(sf): in-app future-supply pressure + pipeline competitors (6.6) (#958) #1125

Merged
bot-backend merged 1 commit from feat/forecast-future-supply-competitors into main 2026-06-07 10:56:00 +00:00
Collaborator

Что

Подсекция «6.6 Будущее предложение и конкуренты» — рендер §16-трассируемого обоснования под прогнозом предложения, которое раньше жило только в экспортах:

  • future_market.future_supply (§9.3) — давление будущего предложения: открытый/скрытый сток, поглощение, месяцев давления, будущий ввод в горизонте, индекс давления.
  • future_market.future_competitors (§9.7) — pipeline-конкуренты, взвешенные по релевантности (имя, класс, расстояние, квартир, скорость/мес, релевантность-бар), сортировка по релевантности.

Относится к #958 (UI экран прогноза); визуализирует данные #950 (3-слойный склад/future-supply).

Честность (тема всей сессии)

  • Тип-фикс: FutureSupply/FutureSupplyBreakdown/FutureCompetitor в forecast.ts были over-non-nullable — исправлены под backend (FutureSupplyPressure.as_dict / Competitor-схему): null-метрики типизированы + рендерятся «нет данных», НЕ фабричный 0.
  • Гейтинг панели предложения по вычисленным метрикам (index/давление), НЕ по open/hidden стокам. На проде сегодня supply_layers пуст до Monday-воркера → SQL даёт 0 строк → open/hidden = 0-не-null. Если гейтить по ним, панель показала бы «Открытый сток: 0 ед.» для КАЖДОГО участка — ложно читается как «будущего предложения нет = безопасно строить», хотя правда «данные ещё не загружены». Теперь панель в этом состоянии скрывается (таблица конкурентов всё равно рендерится); когда появится реальный index — панель показывает и стоки (настоящий 0 тогда честен). hasSupplySignal — единый helper в forecast-helpers.ts (дедуп parent/child гейтов).

Качество

  • code-reviewer: APPROVE — оба гейта пройдены (нет null-регрессии у существующих consumer'ов future_supply; панель честно гейтится в not-loaded состоянии); тип-фикс сверен с backend; field-path top-level (assembler лифтит primary-horizon); no-regression к 6.1-6.5; нейтральные бары (relevance/index без валентности); RU-метки сверены с экспортами; токены, no any, no deps. Обе MINOR-правки (honesty-гейт + дедуп предиката) внесены. npm run build зелёный.

Тест-план (post-deploy)

/site-finder/analysis/66:41:0702048:27 → Секция 6 → «6.6 Будущее предложение и конкуренты»: таблица pipeline-конкурентов (ЖК «Малевич» и др., сорт по релевантности); панель давления предложения СКРЫТА пока supply_layers пуст (до Monday-воркера) — не показывает ложные «0 ед.».

## Что Подсекция **«6.6 Будущее предложение и конкуренты»** — рендер §16-трассируемого *обоснования* под прогнозом предложения, которое раньше жило только в экспортах: - `future_market.future_supply` (§9.3) — давление будущего предложения: открытый/скрытый сток, поглощение, месяцев давления, будущий ввод в горизонте, индекс давления. - `future_market.future_competitors` (§9.7) — pipeline-конкуренты, взвешенные по релевантности (имя, класс, расстояние, квартир, скорость/мес, релевантность-бар), сортировка по релевантности. Относится к #958 (UI экран прогноза); визуализирует данные #950 (3-слойный склад/future-supply). ## Честность (тема всей сессии) - **Тип-фикс:** `FutureSupply`/`FutureSupplyBreakdown`/`FutureCompetitor` в `forecast.ts` были over-non-nullable — исправлены под backend (`FutureSupplyPressure.as_dict` / `Competitor`-схему): null-метрики типизированы + рендерятся «нет данных», НЕ фабричный 0. - **Гейтинг панели предложения по вычисленным метрикам (index/давление), НЕ по open/hidden стокам.** На проде сегодня `supply_layers` пуст до Monday-воркера → SQL даёт 0 строк → open/hidden = 0-не-null. Если гейтить по ним, панель показала бы «Открытый сток: 0 ед.» для КАЖДОГО участка — ложно читается как «будущего предложения нет = безопасно строить», хотя правда «данные ещё не загружены». Теперь панель в этом состоянии скрывается (таблица конкурентов всё равно рендерится); когда появится реальный index — панель показывает и стоки (настоящий 0 тогда честен). `hasSupplySignal` — единый helper в `forecast-helpers.ts` (дедуп parent/child гейтов). ## Качество - `code-reviewer`: ✅ APPROVE — оба гейта пройдены (нет null-регрессии у существующих consumer'ов future_supply; панель честно гейтится в not-loaded состоянии); тип-фикс сверен с backend; field-path top-level (assembler лифтит primary-horizon); no-regression к 6.1-6.5; нейтральные бары (relevance/index без валентности); RU-метки сверены с экспортами; токены, no `any`, no deps. Обе MINOR-правки (honesty-гейт + дедуп предиката) внесены. `npm run build` зелёный. ## Тест-план (post-deploy) `/site-finder/analysis/66:41:0702048:27` → Секция 6 → «6.6 Будущее предложение и конкуренты»: таблица pipeline-конкурентов (ЖК «Малевич» и др., сорт по релевантности); панель давления предложения СКРЫТА пока `supply_layers` пуст (до Monday-воркера) — не показывает ложные «0 ед.».
bot-backend added the
scope/frontend
GG-форсайт
site-finder
labels 2026-06-07 10:55:58 +00:00
bot-backend added 1 commit 2026-06-07 10:55:58 +00:00
feat(sf): 6.6 in-app future-supply pressure + pipeline competitors (§13.3)
All checks were successful
CI / changes (push) Successful in 7s
CI / backend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 5s
CI / backend-tests (pull_request) Has been skipped
8595c18d41
Surface the §16-traceability evidence behind the supply forecast that
previously lived only in exports: future_market.future_supply (§9.3
supply-pressure breakdown — open/hidden stock, absorption, months of
pressure, future units, pressure index) and future_market.future_competitors
(§9.7 relevance-weighted pipeline, sorted by relevance desc). New
ForecastFutureSupplyBlock as subsection 6.6 (+ section-6-6 nav),
complementing 6.1's per-horizon aggregates.

- Fix FutureSupply/FutureSupplyBreakdown/FutureCompetitor optionality in
  forecast.ts to match the backend (FutureSupplyPressure/Competitor): null
  metrics typed + rendered «нет данных», never a fabricated 0.
- Supply panel gates on computed metrics (index/pressure), NOT open/hidden
  unit stocks — so the empty-supply_layers state (pre Monday-worker, every
  parcel today) hides the panel instead of falsely showing "0 ед."; the
  competitor table still renders. hasSupplySignal shared in forecast-helpers.
- RU labels reuse report_pdf/excel export wording. Graceful on partial/202.

Part of #958; surfaces #950 future-supply data.
bot-backend merged commit f5aa7ed191 into main 2026-06-07 10:56:00 +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#1125
No description provided.