[site-finder] §25.3 истинная каннибализация: overlap vs собственный портфель (own-portfolio) #1169

Closed
opened 2026-06-08 11:03:00 +00:00 by bot-backend · 3 comments
Collaborator

Часть #944 (Site Finder v2 / ТЗ §25.3). Решено Anton 2026-06-08: взять в MVP.

Контекст

§25.3 «риск каннибализации» сейчас реализован как прокси (special_indices._cannibalization_index — доля конкурентов того же класса, взвешенная relevance; #986). Истинная §25.3 по ТЗ = проверка, не будет ли новый проект бить по СВОИМ проектам: пересечение по аудитории / срокам выхода / цене / квартирографии с нашими ТЕКУЩИМИ и БУДУЩИМИ проектами.

Источник «наших проектов» (решение Anton)

  • Текущие ← domrf по own_developer_ids (developer_id ПРИНЗИП; найти по юр-названию в domrf_kn).
  • Будущие/приватный pipeline ← ручной ввод (новая сущность own_planned_project, зеркало Insight).

План (2 PR, Foundation → Integration)

  • PR 1 (Foundation): own_developer_ids config; сервис own_portfolio (current из domrf + future из own_planned_project); таблица own_planned_project + CRUD /api/v1/own-projects; тесты. Graceful: пусто → индекс деградирует (§26).
  • PR 2 (Integration): апгрейд _build_cannibalization в special_indices.py — overlap по 4 осям (аудитория/сроки/цена/квартирография) vs own-portfolio; honest confidence; fallback на прокси/None.

Открытый прод-шаг

Найти реальный developer_id ПРИНЗИП в domrf_kn (нужен прод-DB доступ — config-driven, dormant пока не задан).

Refs #944

**Часть #944 (Site Finder v2 / ТЗ §25.3).** Решено Anton 2026-06-08: взять в MVP. ## Контекст §25.3 «риск каннибализации» сейчас реализован как **прокси** (`special_indices._cannibalization_index` — доля конкурентов того же класса, взвешенная relevance; #986). Истинная §25.3 по ТЗ = проверка, не будет ли новый проект бить по **СВОИМ** проектам: пересечение по **аудитории / срокам выхода / цене / квартирографии** с нашими ТЕКУЩИМИ и БУДУЩИМИ проектами. ## Источник «наших проектов» (решение Anton) - **Текущие** ← domrf по `own_developer_ids` (developer_id ПРИНЗИП; найти по юр-названию в `domrf_kn`). - **Будущие/приватный pipeline** ← ручной ввод (новая сущность `own_planned_project`, зеркало Insight). ## План (2 PR, Foundation → Integration) - **PR 1 (Foundation):** `own_developer_ids` config; сервис `own_portfolio` (current из domrf + future из `own_planned_project`); таблица `own_planned_project` + CRUD `/api/v1/own-projects`; тесты. Graceful: пусто → индекс деградирует (§26). - **PR 2 (Integration):** апгрейд `_build_cannibalization` в `special_indices.py` — overlap по 4 осям (аудитория/сроки/цена/квартирография) vs own-portfolio; honest confidence; fallback на прокси/None. ## Открытый прод-шаг Найти реальный `developer_id` ПРИНЗИП в `domrf_kn` (нужен прод-DB доступ — config-driven, dormant пока не задан). Refs #944
Author
Collaborator

PR1 #1170 (own-portfolio foundation) + PR2 #1171 (истинный overlap-движок) — оба merged. §25.3 истинная каннибализация (overlap vs собственный портфель) доставлена в ядре:

  • class + price + geo активны (geo-weighted soft-max, proxy-fallback с явной меткой, honest confidence §26, None-not-0, детерминизм).
  • code-reviewer на обе PR; 44 + 151 теста.

Остаётся (follow-up, не блокирует ядро):

  1. timing-ось — подключить candidate_release_month из §25.1 launch-window горизонта в _build_cannibalization (call-site orchestrator.py:331). Параметр уже заплюмблен.
  2. unit-mix ось — нужен project-level recommended mix (фаза 2).
  3. активация — задать OWN_DEVELOPER_IDS (developer_id ПРИНЗИП) в прод-env (чип заведён; кандидат 6208 — подтвердить по прод-domrf). До этого индекс честно деградирует на прокси.

Оставляю issue открытой до timing-оси + активации конфигом.

**PR1 #1170 (own-portfolio foundation) + PR2 #1171 (истинный overlap-движок) — оба merged.** §25.3 истинная каннибализация (overlap vs собственный портфель) доставлена в ядре: - class + price + geo активны (geo-weighted soft-max, proxy-fallback с явной меткой, honest confidence §26, None-not-0, детерминизм). - code-reviewer ✅ на обе PR; 44 + 151 теста. **Остаётся (follow-up, не блокирует ядро):** 1. **timing-ось** — подключить candidate_release_month из §25.1 launch-window горизонта в `_build_cannibalization` (call-site `orchestrator.py:331`). Параметр уже заплюмблен. 2. **unit-mix ось** — нужен project-level recommended mix (фаза 2). 3. **активация** — задать `OWN_DEVELOPER_IDS` (developer_id ПРИНЗИП) в прод-env (чип заведён; кандидат 6208 — подтвердить по прод-domrf). До этого индекс честно деградирует на прокси. Оставляю issue открытой до timing-оси + активации конфигом.
Author
Collaborator

§25.3 истинная каннибализация — реализация ЗАВЕРШЕНА (4/4 осей). Все PR смержены:

  • #1170 — own-portfolio data source (get_own_portfolio: domrf-current по OWN_DEVELOPER_IDS + ручные будущие own_planned_project).
  • #1171 — overlap-движок (class + price + geo, geo-weighted soft-max, proxy-fallback с явной меткой).
  • #1176 — timing-ось (из §25.1 launch-window горизонта).
  • #1180 — unit-mix ось (из recommend_mix, кросс-вокабулярное выравнивание ключей, perf-gate на own-portfolio-has-mix).

Итог: class + price + timing + unit-mix + geo. None-not-0, детерминизм, honest-confidence (§26), proxy когда own-portfolio пуст. ~205 тестов в test_special_indices.py.

Остаётся (НЕ код — активация/данные):

  1. OWN_DEVELOPER_IDS = developer_id ПРИНЗИП в прод-env → оживляет всю own-portfolio каннибализацию (сейчас спит → отдаётся proxy). Найти id = прод-запрос к domrf_kn (чип заведён).
  2. unit-mix ось вдобавок требует ручных будущих own-проектов с заданной квартирографией (own_planned_project.unit_mix; domrf-current → unit_mix=None).

Оставляю issue открытой до активации + live-verify на реальных данных.

**§25.3 истинная каннибализация — реализация ЗАВЕРШЕНА (4/4 осей).** Все PR смержены: - **#1170** — own-portfolio data source (`get_own_portfolio`: domrf-current по `OWN_DEVELOPER_IDS` + ручные будущие `own_planned_project`). - **#1171** — overlap-движок (class + price + geo, geo-weighted soft-max, proxy-fallback с явной меткой). - **#1176** — timing-ось (из §25.1 launch-window горизонта). - **#1180** — unit-mix ось (из `recommend_mix`, кросс-вокабулярное выравнивание ключей, perf-gate на own-portfolio-has-mix). Итог: class + price + timing + unit-mix + geo. None-not-0, детерминизм, honest-confidence (§26), proxy когда own-portfolio пуст. ~205 тестов в `test_special_indices.py`. **Остаётся (НЕ код — активация/данные):** 1. `OWN_DEVELOPER_IDS` = developer_id ПРИНЗИП в прод-env → оживляет всю own-portfolio каннибализацию (сейчас спит → отдаётся proxy). Найти id = прод-запрос к `domrf_kn` (чип заведён). 2. unit-mix ось вдобавок требует ручных будущих own-проектов с заданной квартирографией (`own_planned_project.unit_mix`; domrf-current → unit_mix=None). Оставляю issue открытой до активации + live-verify на реальных данных.
Author
Collaborator

§25.3 истинная каннибализация (overlap vs собственный портфель) полностью реализована:

  • PR1: 347203d feat(forecasting): §25.3 TRUE own-portfolio cannibalization overlap (#1169 PR2)
  • PR2: c9720a6 feat(forecasting): activate §25.3 cannibalization unit-mix axis (4/4), gated (#1169)
    Все 4/4 оси активированы за фиче-флагом. На main.

Закрываю как реализованное в проде.

§25.3 истинная каннибализация (overlap vs собственный портфель) полностью реализована: - PR1: 347203d feat(forecasting): §25.3 TRUE own-portfolio cannibalization overlap (#1169 PR2) - PR2: c9720a6 feat(forecasting): activate §25.3 cannibalization unit-mix axis (4/4), gated (#1169) Все 4/4 оси активированы за фиче-флагом. На main. Закрываю как реализованное в проде.
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#1169
No description provided.