386 lines
20 KiB
Markdown
386 lines
20 KiB
Markdown
# Цели Discovery MVP — Python-стек
|
||
|
||
**Версия:** 2.2
|
||
**Дата:** апрель 2026
|
||
**Статус:** Discovery MVP, месяцы 1–3
|
||
**Изменение vs v2.1:** переход с .NET на Python для backend, TypeScript для frontend
|
||
|
||
---
|
||
|
||
## 1. North Star Metric
|
||
|
||
**К концу месяца 3 получить 3 платящих пилотных клиента (≥30 тыс. ₽/мес каждый) и подать заявку в реестр российского ПО — это даст право пройти в Раунд А на 20–25 млн ₽.**
|
||
|
||
Этот критерий не зависит от стека и остаётся неизменным.
|
||
|
||
---
|
||
|
||
## 2. Технический стек MVP
|
||
|
||
### Backend
|
||
- **Язык:** Python 3.12
|
||
- **Web-фреймворк:** FastAPI 0.115+
|
||
- **ORM:** SQLAlchemy 2.0 + GeoAlchemy2 (для PostGIS)
|
||
- **Миграции:** Alembic
|
||
- **Валидация:** Pydantic v2
|
||
- **Background tasks:** Celery + Redis (или RQ для простоты)
|
||
- **HTTP-клиент:** httpx (async)
|
||
|
||
### Геометрия и геоданные
|
||
- **Shapely 2.0** — основная геометрия (полигоны, отступы, пересечения)
|
||
- **GeoPandas 1.0** — работа с табличными геоданными
|
||
- **Pyproj** — преобразования систем координат (WGS84 ↔ UTM ↔ МСК-66 для Свердловской обл.)
|
||
- **Rasterio** — если будем работать с растровыми данными (DEM, спутник)
|
||
|
||
### ML
|
||
- **XGBoost** — основной алгоритм скоринга участков
|
||
- **scikit-learn** — препроцессинг, метрики, простые модели
|
||
- **pandas** — обработка табличных данных
|
||
- **NumPy** — численные расчёты
|
||
|
||
### Экспорт документов
|
||
- **ReportLab** или **WeasyPrint** — PDF-отчёты (WeasyPrint удобнее для HTML-вёрстки)
|
||
- **ezdxf** — экспорт в DXF для архитекторов
|
||
- **openpyxl** — экспорт в Excel
|
||
|
||
### База данных
|
||
- **PostgreSQL 16** + **PostGIS 3.4** — основная БД
|
||
- **Redis 7** — кэш и очереди
|
||
|
||
### Frontend
|
||
- **Next.js 15** + **React 19** + **TypeScript 5**
|
||
- **Tailwind CSS 4** — стили
|
||
- **shadcn/ui** — базовые компоненты
|
||
- **TanStack Query** — работа с API
|
||
- **Mapbox GL JS** или **Leaflet + OSM** — карты
|
||
|
||
### Инфраструктура
|
||
- **Yandex Cloud** или **VK Cloud** (российские)
|
||
- **Docker + Docker Compose** для разработки
|
||
- **GitHub Actions** для CI/CD
|
||
- **Sentry** для мониторинга ошибок
|
||
|
||
### Dev tools
|
||
- **uv** или **poetry** — менеджер зависимостей (uv быстрее)
|
||
- **ruff** — линтер + форматтер (заменяет black + flake8 + isort)
|
||
- **mypy** — статическая типизация
|
||
- **pytest** — тесты
|
||
|
||
---
|
||
|
||
## 3. Цели по модулю A: Site Finder
|
||
|
||
### Функциональные цели (Discovery MVP)
|
||
|
||
**Загрузка данных**
|
||
- Парсер Росреестра ПКК для Свердловской области
|
||
- Сохранение ≥ 1000 участков в PostgreSQL/PostGIS
|
||
- Атрибуты: кадастровый номер, ВРИ, площадь, границы (геометрия), адрес
|
||
- Скрипт ежесуточной синхронизации (Celery beat)
|
||
|
||
**Фильтрация**
|
||
- 3 базовых фильтра: ВРИ, площадь (от-до), регион/город
|
||
- Геопространственный фильтр: участки внутри произвольно нарисованного полигона
|
||
- Текстовый поиск по адресу/кадастровому номеру
|
||
|
||
**Скоринг**
|
||
- 3 критерия в Discovery: расстояние до центра города, наличие инфраструктуры в радиусе 1 км (POI из OSM), средняя цена жилья в районе (ДОМ.РФ)
|
||
- Веса критериев настраиваемые пользователем
|
||
- Итоговый рейтинг 0–100 с разбивкой по компонентам
|
||
|
||
**Отображение**
|
||
- Карта (Mapbox/Leaflet) с участками-полигонами
|
||
- Цветовая градация по рейтингу
|
||
- Табличный список с сортировкой по любому параметру
|
||
- Детальная карточка участка с обоснованием рейтинга
|
||
|
||
**Интеграция с Generative Design**
|
||
- Кнопка «Обсчитать концепцию» в детальной карточке
|
||
- Передача геометрии участка через внутренний API в модуль B
|
||
- Возврат результатов в карточку
|
||
|
||
### Что НЕ делаем в Discovery MVP
|
||
- API ЕГРН с собственниками (требует платежей и юридического оформления — отложено на Фазу 1)
|
||
- Изохроны Яндекс.Карт (хорошо бы иметь, но не критично — Фаза 1)
|
||
- Скоринг по 15+ параметрам — Фаза 1
|
||
- Множественные регионы (только Свердловская обл.) — Фаза 1
|
||
- Алертинг на новые подходящие участки — Фаза 2
|
||
|
||
---
|
||
|
||
## 4. Цели по модулю B: Generative Design (пятно застройки)
|
||
|
||
### Функциональные цели (Discovery MVP)
|
||
|
||
**Вход**
|
||
- Полигон участка (ручная отрисовка на карте или передача из Site Finder)
|
||
- Параметры пользователя: класс жилья (эконом/комфорт/бизнес), целевая этажность, тип застройки (точечная/средне-этажная/многоэтажная)
|
||
- Региональные нормативы (для Discovery — Свердловская обл., ПЗЗ Екатеринбурга)
|
||
|
||
**Алгоритм генерации**
|
||
- Расчёт нормативных отступов от границ участка (через Shapely buffer)
|
||
- Размещение прямоугольных корпусов МКД методом «жадного заполнения»: подбор сетки положений, проверка отступов между корпусами и от границ
|
||
- 3 варианта: «максимум площади», «максимум инсоляции дворов», «оптимальный микс»
|
||
- Время генерации одного варианта ≤ 10 секунд
|
||
|
||
**Расчёт ТЭП**
|
||
- Площадь застройки, общая площадь корпусов
|
||
- Жилая площадь по типам квартир (1/2/3-комн в задаваемых пропорциях)
|
||
- Количество квартир, средняя площадь
|
||
- КЭП (коэффициент использования территории), плотность застройки
|
||
- Площадь придомовой территории, парковка (упрощённо: норматив × количество квартир)
|
||
|
||
**Финансовая модель**
|
||
- Выручка: жилая площадь × средняя цена м² по району (из ДОМ.РФ)
|
||
- Себестоимость: квадратный метр × норматив (из ФАУ «Главгосэкспертиза»)
|
||
- Стоимость земли (вход параметром)
|
||
- Валовая маржа, чистая прибыль (упрощённая модель без налогов)
|
||
- Базовый IRR (без дисконтирования cash flow по периодам — это в Фазе 1)
|
||
|
||
**Экспорт**
|
||
- PDF-отчёт с тремя вариантами, графиками, ТЭП и финмоделью (WeasyPrint)
|
||
- Excel с расчётами (openpyxl)
|
||
- DXF упрощённой схемы участка (ezdxf) — для передачи архитектору
|
||
|
||
### Что НЕ делаем в Discovery MVP
|
||
- Расчёт инсоляции по СП 52.13330 — Фаза 1, месяцы 7–9
|
||
- Произвольная форма корпусов (только прямоугольники) — Фаза 1
|
||
- Парковка по детальному нормативу — Фаза 1
|
||
- УДС (улично-дорожная сеть) — Фаза 1
|
||
- Социнфраструктура (школы, сады, поликлиники) — Фаза 1
|
||
- 3D-визуализация (Three.js) — Фаза 2 (год 2)
|
||
- Квартирография (планировки квартир внутри корпусов) — Фаза 2
|
||
- Фотореалистичный рендер — Год 2+
|
||
|
||
---
|
||
|
||
## 5. Цели по продажам и валидации
|
||
|
||
### Месяц 1
|
||
- 50 целевых клиентов в CRM (можно использовать Notion/AmoCRM/HubSpot Free)
|
||
- 5 cold-outreach писем отправлено
|
||
- 3 встречи назначено
|
||
- ООО зарегистрировано, расчётный счёт открыт
|
||
- Прототип Site Finder работает локально с 1000 участков
|
||
|
||
### Месяц 2
|
||
- 15 встреч кумулятивно проведено
|
||
- 2 LOI (Letters of Intent) подписано
|
||
- 1 платящий пилот подписан (≥ 30 тыс. ₽/мес)
|
||
- Демо прототипа на реальных участках клиентов
|
||
- Первая статья в профильном медиа (DigitalDeveloper, vc.ru, Bisnow Russia)
|
||
|
||
### Месяц 3
|
||
- 20+ встреч кумулятивно
|
||
- 3 платящих пилота
|
||
- 7+ LOI
|
||
- 1 региональная администрация в активных переговорах
|
||
- Заявка в реестр российского ПО подана
|
||
- Подготовлен инвестиционный deck для Раунда А (12 слайдов)
|
||
- Финансовая модель в Excel на 5 лет
|
||
- Data room для инвесторов
|
||
|
||
---
|
||
|
||
## 6. Технические цели MVP
|
||
|
||
### Качество кода
|
||
- Все публичные API эндпоинты типизированы (Pydantic)
|
||
- Покрытие тестами ключевой бизнес-логики ≥ 60%
|
||
- Линтер ruff проходит без ошибок
|
||
- mypy --strict проходит для core-модулей
|
||
|
||
### Производительность
|
||
- Time to First Value ≤ 10 минут (от регистрации до первого обсчёта)
|
||
- Загрузка участков по фильтру ≤ 2 секунд
|
||
- Генерация одного варианта концепции ≤ 10 секунд
|
||
- Генерация PDF-отчёта ≤ 5 секунд
|
||
|
||
### Надёжность
|
||
- 99% uptime в рабочие часы (для демо клиентам)
|
||
- Все ошибки в Sentry
|
||
- Бэкап БД ежедневно
|
||
- Recovery time ≤ 2 часов
|
||
|
||
### Безопасность
|
||
- Все данные пользователей шифруются at rest (PostgreSQL TDE или приложением)
|
||
- HTTPS обязательно
|
||
- API Rate limiting
|
||
- JWT-авторизация с refresh-токенами
|
||
- Логирование всех доступов к чувствительным данным (требование под реестр ПО)
|
||
|
||
---
|
||
|
||
## 7. Структура репозитория (предлагаемая)
|
||
|
||
```
|
||
project-root/
|
||
├── backend/
|
||
│ ├── app/
|
||
│ │ ├── main.py # FastAPI entrypoint
|
||
│ │ ├── api/
|
||
│ │ │ ├── v1/
|
||
│ │ │ │ ├── parcels.py # Site Finder endpoints
|
||
│ │ │ │ ├── concepts.py # Generative Design endpoints
|
||
│ │ │ │ └── auth.py
|
||
│ │ ├── core/
|
||
│ │ │ ├── config.py # Pydantic Settings
|
||
│ │ │ ├── security.py # JWT, hashing
|
||
│ │ │ └── db.py # SQLAlchemy session
|
||
│ │ ├── models/ # SQLAlchemy ORM
|
||
│ │ ├── schemas/ # Pydantic schemas
|
||
│ │ ├── services/
|
||
│ │ │ ├── site_finder/
|
||
│ │ │ │ ├── parser.py # Росреестр, ФИАС
|
||
│ │ │ │ ├── scorer.py # XGBoost скоринг
|
||
│ │ │ │ └── filters.py
|
||
│ │ │ ├── generative/
|
||
│ │ │ │ ├── geometry.py # Shapely алгоритмы
|
||
│ │ │ │ ├── teap.py # Расчёт ТЭП
|
||
│ │ │ │ └── financial.py # Финмодель
|
||
│ │ │ └── exporters/
|
||
│ │ │ ├── pdf.py # WeasyPrint
|
||
│ │ │ ├── excel.py # openpyxl
|
||
│ │ │ └── dxf.py # ezdxf
|
||
│ │ └── workers/ # Celery tasks
|
||
│ ├── tests/
|
||
│ ├── alembic/ # миграции
|
||
│ ├── pyproject.toml # uv/poetry
|
||
│ └── Dockerfile
|
||
├── frontend/
|
||
│ ├── app/ # Next.js 15 App Router
|
||
│ ├── components/
|
||
│ ├── lib/
|
||
│ └── package.json
|
||
├── docker-compose.yml # dev окружение
|
||
├── .github/workflows/ # CI/CD
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## 8. План на первый месяц (под Python)
|
||
|
||
### Неделя 1
|
||
- Установить **uv** (`pip install uv`)
|
||
- Создать проект: `uv init project-root && uv add fastapi sqlalchemy geoalchemy2 shapely pydantic`
|
||
- Поднять PostgreSQL + PostGIS в Docker (`postgis/postgis:16-3.4`)
|
||
- Первый эндпоинт `GET /parcels` возвращает заглушку
|
||
- Зарегистрировать ИТ-ООО (УСН 6%, ESOP пул в устав)
|
||
|
||
### Неделя 2
|
||
- Парсер Росреестра ПКК на httpx (асинхронный)
|
||
- Загрузка 1000 участков Екатеринбурга в БД
|
||
- Базовая модель `Parcel` в SQLAlchemy с PostGIS-геометрией
|
||
- Первый фильтр по площади и ВРИ
|
||
- Дизайнер-фрилансер делает 7 экранов в Figma
|
||
|
||
### Неделя 3
|
||
- Frontend Next.js: страница «Site Finder» с картой Leaflet
|
||
- API endpoint `POST /parcels/search` с фильтрами
|
||
- 5 cold-outreach писем целевым клиентам
|
||
- 3 встречи назначены
|
||
|
||
### Неделя 4
|
||
- Базовый скоринг (расстояние до центра + цена района)
|
||
- Первый прототип задеплоен в Yandex Cloud
|
||
- 5 встреч проведено
|
||
- Лендинг опубликован
|
||
- Первая статья в DigitalDeveloper или vc.ru опубликована
|
||
|
||
---
|
||
|
||
## 9. Что меняется в Custom Instructions проекта
|
||
|
||
В системный промпт проекта в Claude добавьте:
|
||
|
||
```
|
||
ТЕХНИЧЕСКИЙ СТЕК (актуальный с v2.2)
|
||
- Backend: Python 3.12 + FastAPI + SQLAlchemy 2.0 + Pydantic v2
|
||
- Геометрия: Shapely 2.0 + GeoPandas + GeoAlchemy2
|
||
- ML: XGBoost + scikit-learn + pandas
|
||
- БД: PostgreSQL 16 + PostGIS 3.4
|
||
- Очереди: Redis + Celery
|
||
- Frontend: Next.js 15 + React 19 + TypeScript + Tailwind + shadcn/ui
|
||
- Карты: Mapbox GL JS или Leaflet
|
||
- Экспорт: WeasyPrint (PDF), ezdxf (DXF), openpyxl (Excel)
|
||
- Облако: Yandex Cloud
|
||
- Dev: uv (зависимости), ruff (линт+формат), mypy (типы), pytest
|
||
|
||
КОММЕНТАРИЙ
|
||
Я перешёл с .NET на Python для MVP, потому что геометрия и ML
|
||
в Python-экосистеме намного сильнее. Опыт в C#/.NET 6 лет —
|
||
это база, на Python переключаюсь сейчас. При написании кода
|
||
учитывай, что я понимаю backend архитектуру отлично, но
|
||
синтаксис и идиомы Python ещё догоняю — давай явный type-hints
|
||
и комментарии к pythonic-конструкциям, которые могут быть
|
||
непривычны после C#.
|
||
```
|
||
|
||
---
|
||
|
||
## 10. Cost of switching: что реально потратите
|
||
|
||
### Время на «вкатывание»
|
||
- Неделя 1: 60% производительности vs привычный .NET
|
||
- Недели 2–3: 80%
|
||
- С недели 4: 100% и быстрее, чем на .NET (за счёт экосистемы)
|
||
|
||
### Что почитать в первую очередь
|
||
- **«Python for C# Developers»** (бесплатные статьи на Real Python)
|
||
- Документация **FastAPI** — отличная, начать с tutorial
|
||
- **Shapely manual** — для понимания геометрии
|
||
- **SQLAlchemy 2.0 docs** — async раздел
|
||
|
||
### Что НЕ читать сразу
|
||
- Книги «Python для начинающих» — вы не начинающий программист
|
||
- Гайды по Django — вам нужен FastAPI
|
||
- Старые туториалы (Python 3.8 и ниже) — слишком много изменилось
|
||
|
||
### Полезные привычки от .NET, которые работают и в Python
|
||
- Dependency Injection (FastAPI поддерживает через Depends)
|
||
- Strong typing (Pydantic + mypy)
|
||
- Repository pattern (через SQLAlchemy)
|
||
- Async/await (есть и работает)
|
||
|
||
### Что отучиться
|
||
- `Dictionary<string, object>` → используй Pydantic-модели
|
||
- LINQ → list comprehensions + библиотека `more_itertools`
|
||
- async всегда — в Python async только когда нужно (I/O bound)
|
||
- Heavy interfaces — Python предпочитает duck typing и Protocol
|
||
|
||
---
|
||
|
||
## 11. Acceptance Criteria для MVP
|
||
|
||
К концу месяца 3 продукт считается готовым к Раунду А, если:
|
||
|
||
**Функционально:**
|
||
- [ ] Site Finder загружает и показывает 1000+ участков Свердловской обл.
|
||
- [ ] Фильтр работает по 3 параметрам
|
||
- [ ] Скоринг по 3 критериям с настраиваемыми весами
|
||
- [ ] Generative Design генерирует 3 варианта за ≤ 10 секунд
|
||
- [ ] Расчёт ТЭП и базовая финмодель работают
|
||
- [ ] PDF/Excel/DXF экспорт работает
|
||
- [ ] Связь модулей (передача участка) работает
|
||
|
||
**Бизнесово:**
|
||
- [ ] 3 платящих пилота
|
||
- [ ] 7+ LOI
|
||
- [ ] Заявка в реестр ПО подана
|
||
- [ ] 1 администрация в переговорах
|
||
- [ ] Инвестиционный deck готов
|
||
- [ ] Финмодель на 5 лет готова
|
||
|
||
**Технически:**
|
||
- [ ] 60%+ покрытие тестами core-логики
|
||
- [ ] mypy --strict проходит
|
||
- [ ] Деплой в Yandex Cloud работает
|
||
- [ ] Sentry подключен
|
||
- [ ] Бэкапы БД ежедневно
|
||
|
||
Если все три блока выполнены — идём в Раунд А. Если выполнены 2 из 3 (например, технически + функционально, но только 2 пилота) — возможно продление Фазы 0 на 1–2 месяца за счёт собственных средств. Если выполнен только 1 блок или меньше — стоп проекта.
|
||
|
||
---
|
||
|
||
**Документ создан в апреле 2026. Версия 2.2 (Python-стек).**
|