Тема
Дорожная карта
Статус: фаза 0 завершена; фаза 1 в работе (обновлено 2026-07-14). Ядро волн 0–22 и 24 собрано на полигоне cms.rosveb.ru; инфраструктура дистрибуции (Gitea+CI, Satis, skeleton, генераторы, бэкапы) поднята. Ревизия Q1 (14.07.2026): первый потребитель — пилот-копия universal на новой CMS (боевой universal не трогается), внешний клиентский заказ станет вторым потребителем. Исполняемый ранбук с прогрессом —
TZ.mdрепозиторияlaravel/cms.rosveb.ru. Все 12 вопросов брейншторма закрыты — см. Решения. Принцип неизменен: ядро без живого потребителя — долгострой; пилот на своём насыщенном контенте даёт ту же обкатку боем.
Фазы
Фаза 0 — контракты на бумаге ✅ завершена (спеки + ТЗ)
Спеки контрактов до первой строки кода — готовы (уровень «как именно»), поверх них — рабочие ТЗ: стандарт модуля, ТЗ ядра + API и отдельное ТЗ на каждый из ~115 модулей (индекс). Самое дешёвое место для исправления ошибок; архитектурные вопросы закрыты (Решения).
Фундамент:
- Канонический стек и фронтенд зон — Laravel 13 / PHP 8.4 / PostgreSQL 16 / Filament v5.6.6+;
- Целевая платформа — обоснование Laravel 13 vs 12;
- Модель данных и жизненный цикл контента — таблицы ядра, установка/экспорт/перенос;
- Движок полей — один под блок + тип контента + форму;
- Производительность и кеширование — бюджет запросов, слои кеша, многоядерность.
Контракты:
- Контракт блока и BlockRegistry (версии схем + data-миграция);
- WidgetRegistry и области;
- Контракт модуля (манифест, capability-слой, граф зависимостей, безопасность);
- Контракт темы;
- Три оси + обмен данными (пять каналов ядро↔модули);
- API-слой + OpenAPI-контракт (headless-ready, автодокументация).
Доменные модели: e-commerce (ТП, мульти-склад, цены, НДС/чеки, rule-engine, highload) · мультиязычность.
Надёжность: Жизненный цикл и надёжность модулей (версии, откат, деградация вместо падения, вывод ошибок).
Незакрытые уточнения «до кода» (не блокируют старт) — Открытые детали реализации. Выход фазы: спеки отпочковываются в self-hosted репозиторий CMS (Gitea/GitLab). Фаза 1 начата на полигоне cms.rosveb.ru; выход фазы — первый клиентский сайт (Q1).
Ключевые решения, влияющие на фазу 0:
- произвольные типы контента — через JSONB+GIN, не EAV (Q5);
- виджет — отдельная сущность (WidgetRegistry) (Q4);
- drag&drop — средняя свобода (без стилей на уровне блока), нужны блоки-контейнеры (Q9);
- версионирование страниц — с 1.0, меняет модель хранения (Q7).
Фаза 1 — ядро-минимум + первый потребитель
Монорепо: packages/core, packages/testing, skeleton/, базовая тема. Порт из universal: pages/блоки, settings, SEO, формы, медиа, кеш-слой. Первый потребитель — ближайший реальный клиентский заказ: ядро строится в объёме, который нужен ему (YAGNI работает сам), обкатывается под давлением дедлайна. Universal не трогаем — он прод.
Ключевое отличие от v1: с самого начала закладываем открытый BlockRegistry, события, фильтры и drag&drop-редактор (не откладываем расширяемость «на потом»).
Развёртка фазы по волнам (порядок сборки, зависимости, security-гейты и критерии готовности каждой волны) — Порядок разработки.
Фаза 2 — центр обновлений
Satis на инфре студии, cms:upgrade с полной процедурой (бэкап → maintenance → update → migrate → opcache-restart → health-check → откат), страница «Обновления» в Filament, двухтабличная модель версий. Именно здесь, а не в конце: пока клиент один — обкатывать безопасно. См. Центр обновлений.
Фаза 3 — модули по мере заказов
Каталог, гео/мультигород, AI-контент, поиск, платежи — портируются из проектов-доноров, когда их требует очередной заказ. Не раньше: модуль без потребителя — мёртвый код с обязательствами поддержки. См. Реестр модулей.
Фаза 4 — миграция universal + флит-дашборд
Universal переезжает на ядро как обычный клиент (когда контракты устаканились ~1.x). Параллельно — флит-дашборд: телеметрия версий, волны обновлений, контроль бэкапов. С этого момента подписка на поддержку — процесс, а не ручной труд.
Фаза 5 (перспектива) — открытый маркетплейс
Открытие маркетплейса сторонним разработчикам — если бизнес-модель подтвердит спрос. Сейчас маркетплейс закрытый (только модули студии), но контракт модуля с capability-слоем и лицензирование по клиенту заложены с фазы 0 — открытие не потребует переделки. Требует решения модели ревью безопасности чужого кода (см. безопасность и права). Уровень drag&drop-редактора зафиксирован как «средняя свобода» (Q9) — развитие до Tilda-подобной свободы стилей не планируется (защита дизайна).
Риски
| Риск | Смягчение |
|---|---|
| Долгострой ядра «в стол» | Жёсткая привязка фазы 1 к реальному заказу с дедлайном |
| ТЗ модулей расходятся с ядром по мере разработки | Правило стандарта: изменился контракт ядра → сначала ревизия стандарта и затронутых ТЗ, потом код; docs/module.md пакета обновляется тем же PR |
| Перфекционизм контрактов | Фаза 0 — недели, не месяцы; контракт правится до 1.0 свободно |
| Соблазн рефакторить universal «по пути» | Запрет: universal — донор кода, не полигон |
| Schema-drift блоков у клиентов | Версии схем + cms:blocks:migrate — с первого релиза |
| Один разработчик — bus-factor | Модули только под заказ; anti-goals соблюдаются; документация в этой базе |
| Инцидент при обновлении клиента | Процедура с бэкапом/health-check/откатом обязательна с первого клиента |
| Расширение scope (маркетплейс, drag&drop) размывает фокус | Маркетплейс и полный drag&drop — фаза 5, не блокируют ядро |
| Безопасность сторонних плагинов (урок WP) | Policy-слой, «плагин ≠ ядро по правам» — заложить в контракт модуля с фазы 0 |
Как пользоваться разделом
Раздел — источник правды по решениям v2-концепции. Новое решение → сюда, в соответствующую страницу, с датой и мотивировкой. Спеки конкретных подсистем при старте фазы 0 отпочковываются в репозиторий CMS; этот раздел остаётся уровнем «зачем и что», спеки — уровнем «как именно».
Связь с предыдущей версией: первая концепция (Rosveb CMS v1 — закрытый инструмент студии) в архив не сохранялась; расхождения с ней описаны в видении v2.