Тема
Слой 2 — ТЗ волны разработки модулей
Статус: готово к разработке (подготовлено 14.07.2026, учтены ревизии контрактов №1 (16 пунктов) и №2 (7 пунктов)). «Слой 2» — модули на глубине 2 от ядра по графу зависимостей: каждому нужен минимум один модуль слоя 1. Этот файл — сводное ТЗ волны: состав, предусловия, порядок, стыки и гейты. Подробные ТЗ — по ссылкам в таблицах; этот документ их не дублирует и при расхождении ТЗ модуля главнее.
Предусловия (гейт входа в слой)
Слой 2 нельзя начинать, пока не выполнено:
- Ядро волн 0–7 (порядок сборки) собрано, контрактные тесты
cms/testingзелёные. - Ревизии №1 и №2 реализованы в ядре — слой 2 опирается на них напрямую:
- канонический фильтр
security.csp+ nonce (нужен pixels, integration-yandex/google, video-hosting); - контракт
upload-scanner+ карантин медиатеки (нужен ugc, chat, video-hosting); - событие
LeadStatusChanged(нужно integration-crm, email-marketing); - persistent-роуты RFC 8058 (нужно email-marketing);
UserMerged(нужно cabinet-b2b, esia);- конвенция
200 + meta.degraded(все провайдеры внешних API).
- канонический фильтр
- Модули слоя 1, которые требует слой 2, установлены и приняты по своим ТЗ:
notifications-bus,integrations-bus,webhooks-in,realtime,storage-s3,consents,cookie-consent,services,cabinet-b2c,moderation,newsletter,email-templates,backup,health(дляupdates). - Проверки документации зелёные:
node scripts/check-links.mjsиnode scripts/check-deps.mjs— 0 ошибок.
Состав слоя и порядок разработки
Группы независимы друг от друга — можно вести параллельно; приоритет отражает потребности корпоративного сайта (коммерция — в последнюю очередь). Внутри группы модули тоже независимы (общих файлов нет) — по одному субагенту на модуль.
Группа D — надстройки корпсайта (приоритет 1)
| Модуль | requires | Ключевые стыки с ядром и ревизиями |
|---|---|---|
| services-seo | services | посадочные: SitemapRegistry, RedirectService (никаких своих таблиц редиректов), фильтр seo.meta |
| cabinet-b2b | cabinet-b2c | контракт cabinet-shell (секции встраиваются, не форкают кабинет); UserMerged; commerce-секции — заглушки до фазы 3 |
| ugc | moderation | контракт ugc-publication; загрузки — через upload-scanner (карантин pending); персонализация — только штатными режимами ядра |
| chat | realtime | чат → заявка через LeadService; вложения — upload-scanner; офлайн-фолбэк при недоступном realtime |
| email-marketing | newsletter, email-templates | One-Click Unsubscribe — persistent-роут (RFC 8058, ревизия №1 п. 14); триггеры по LeadStatusChanged; PrivacyRegistry |
Группа A — каналы уведомлений (приоритет 2)
Все реализуют provides: notification-channel <канал> и подключаются к cms/notifications-bus; ядро без шины шлёт через NotificationDispatch с log-fallback.
| Модуль | requires | Ключевые стыки |
|---|---|---|
| telegram | notifications-bus, webhooks-in | входящие апдейты — только через подпись webhooks-in; chat_id — ПДн (PrivacyRegistry) |
| web-push | notifications-bus | VAPID-ключи в .env; подписки — ПДн; rate-limit на /subscribe |
| mobile-api | notifications-bus | потребитель GET /content-types/{type}/schema (ревизия №2 п. 3); конверт ошибок с code |
| notifications-inbox | notifications-bus | канал inbox внутри БД; живое обновление — suggests realtime, деградация в поллинг |
| messengers | notifications-bus, integrations-bus, webhooks-in | внешние API мессенджеров — только через шину интеграций (креды, ретраи, журнал); входящие статусы/сообщения — через подпись webhooks-in |
Группа C — вставщики скриптов и аутентификация (приоритет 3)
| Модуль | requires | Ключевые стыки |
|---|---|---|
| pixels | cookie-consent | источники — фильтр security.csp, инлайн — с nonce (ревизия №2 п. 5); гейт согласия cookie |
| integration-yandex | integrations-bus | provides: captcha-provider (SmartCaptcha); скрипты Метрики/Карт — security.csp |
| integration-google | integrations-bus | provides: captcha-provider (reCAPTCHA); Consent Mode v2 — гейт cookie-consent |
| integration-crm | integrations-bus, webhooks-in | provides: crm-connector; LeadCreated/LeadStatusChanged в обе стороны; анти-эхо по origin |
| esia | consents | provides: auth-provider; UserRegistered/UserMerged; согласия — через consents |
Группа B — провайдеры данных (приоритет 4)
Все внешние вызовы — через cms/integrations-bus; деградация чтения — 200 + meta.degraded; синхронный вызов ≤ 2 с + fallback; лимиты/квоты и kill-switch (§6 стандарта) обязательны.
| Модуль | requires | Ключевые стыки |
|---|---|---|
| dadata | integrations-bus | provides: suggest-provider; подсказки с ПДн не логируются |
| cbr-rates | integrations-bus | provides: rates-provider; потребитель появится в фазе 3 (commerce-currencies) — модуль самодостаточен |
| transport-providers | integrations-bus | provides: mail-transport/sms-transport; фейловер, suppression-list |
| calendars | integrations-bus | CalDAV-синхронизация; TTL-резерв слотов — НЕ здесь (кандидат cms/booking) |
| video-hosting | integrations-bus, storage-s3 | загрузки — upload-scanner; плееры/iframe — security.csp |
Группа E — корп-MVP на ярусе 1 (ревизия 15.07.2026)
Формально ярус 1 (requires — только ядро, без модулей слоя 1), не ярус 2 — зафиксированы здесь единой волной ревизии корп-MVP от 15.07.2026 вместе со своими приоритетами P0–P2.
| Модуль | requires | Приоритет | Ключевые стыки с ядром |
|---|---|---|---|
| section-patterns | ядро (BlockRegistry, движок полей) | P0 | генерирует поддерево блоков при вставке пресета; suggests landings |
| catalog-showcase | ядро (движок полей, MediaService, LeadService/cms_forms, CacheTags, RequestContext, BlockRegistry) | P1 | НЕ requires/suggests ни один commerce-* (отдельный продуктовый уровень, commerce-catalog — фаза 2); suggests search, related-content, multicity, galleries |
| form-builder | ядро (FieldTypeRegistry, LeadService, cms_forms) | P1 | не хранит заявки и не переопределяет приём сабмита ядра; suggests notifications-bus, integration-yandex/integration-google (капча), multicity |
| head-scripts | ядро (швы layout.head/layout.body_end, security.csp) | P1 | доверенный код без санитайза — редактирование только под ролью studio; suggests multicity, audit |
| ai-content | ядро + integrations-bus | P2 — реализация отложена (проектируется, внедрение позже) | сервис снизу графа зависимостей: seo-engine/blog/commerce-catalog вызывают его через suggests, не наоборот |
Отдельно: updates (фаза 2 roadmap)
updates (requires: backup, health) — центр обновлений, он же фаза 2 дорожной карты: пайплайн cms:upgrade (бэкап → maintenance → migrate → health → откат), Satis-клиент, телеметрия. Разрабатывается, как только пилот слоя 1 живёт на клиенте; проверка обновлений — через cms:backup:clone-to-staging (ревизия №2 п. 6). ТЗ выверено, ждёт только своей очереди — не тяни его в общий пул групп.
Хвост слоя (глубина 3 — сразу после своей зависимости)
- sms — после transport-providers (группа B);
- services-axes — после services-seo (группа D);
- marketplace-modules — после updates (фаза 2+).
Что в слой 2 НЕ входит (осознанно)
- Коммерческая ветка глубины 2 (
commerce-pricing,commerce-attributes,commerce-stock,commerce-wishlist) и её спутники (erp,ofd) — фаза 3, по первому заказу магазина (порядок). cms/geoip— реализацияgeo-providerещё не заведена в каталог (кандидаты); до решения потребители живут в штатной деградации (fallbackdefault_city_id).- Кандидаты каталога (
booking, …) — ждут решения владельца продукта. (ai-contentзаскоуплен 15.07.2026 — P2, в Группе E выше, из кандидатов исключён.)
Правила волны (как разрабатывать)
- Параллельность — по стандарту студии (laravel/CLAUDE.md): до 5 Sonnet-субагентов, один модуль = один субагент; общие файлы (провайдеры, роуты, composer.json скелета) — только у основного агента; субагенты не запускают тесты и tinker с записью.
- Каждый модуль строится строго по своему ТЗ (шаблон v2.1 + матрица v2.2) и стандарту модуля; при конфликте ТЗ ↔ этот файл — ТЗ главнее, при конфликте ТЗ ↔ ревизии ядра — ревизия главнее (пометь ТЗ «⚠️ Противоречие»).
- Донор прежде всего: у большинства модулей в ТЗ указан донорский код (universal/masha/notal) — портировать, не изобретать.
- Новые provides-контракты в ходе волны не изобретаются — если нужен, это строка в реестре критериев → ревизия №3.
Гейты выхода слоя
- [ ] Критерии приёмки каждого ТЗ модуля выполнены (чекбоксы в разделе «Тесты и приёмка»);
- [ ] полный гейт полигона: Pest + phpstan + pint зелёные, включая контрактные тесты деградации (выключение каждого модуля слоя не роняет сайт);
- [ ] OpenAPI покрывает 100% новых эндпоинтов; конверт ошибок с
code— контрактный тест; - [ ]
cms:doctor --jsonи/api/v1/system/healthзелёные со всеми модулями слоя; - [ ] документация:
check-links.mjsиcheck-deps.mjs— 0 ошибок; - [ ] ПДн:
cms:privacy:export/forget --dry-runвидит обработчики всех модулей слоя, хранящих данные субъектов (telegram, web-push, chat, ugc, email-marketing, cabinet-b2b, esia).