Skip to content

Слой 2 — ТЗ волны разработки модулей

Статус: готово к разработке (подготовлено 14.07.2026, учтены ревизии контрактов №1 (16 пунктов) и №2 (7 пунктов)). «Слой 2» — модули на глубине 2 от ядра по графу зависимостей: каждому нужен минимум один модуль слоя 1. Этот файл — сводное ТЗ волны: состав, предусловия, порядок, стыки и гейты. Подробные ТЗ — по ссылкам в таблицах; этот документ их не дублирует и при расхождении ТЗ модуля главнее.

Предусловия (гейт входа в слой)

Слой 2 нельзя начинать, пока не выполнено:

  1. Ядро волн 0–7 (порядок сборки) собрано, контрактные тесты cms/testing зелёные.
  2. Ревизии №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).
  3. Модули слоя 1, которые требует слой 2, установлены и приняты по своим ТЗ: notifications-bus, integrations-bus, webhooks-in, realtime, storage-s3, consents, cookie-consent, services, cabinet-b2c, moderation, newsletter, email-templates, backup, health (для updates).
  4. Проверки документации зелёные: node scripts/check-links.mjs и node scripts/check-deps.mjs — 0 ошибок.

Состав слоя и порядок разработки

Группы независимы друг от друга — можно вести параллельно; приоритет отражает потребности корпоративного сайта (коммерция — в последнюю очередь). Внутри группы модули тоже независимы (общих файлов нет) — по одному субагенту на модуль.

Группа D — надстройки корпсайта (приоритет 1)

МодульrequiresКлючевые стыки с ядром и ревизиями
services-seoservicesпосадочные: SitemapRegistry, RedirectService (никаких своих таблиц редиректов), фильтр seo.meta
cabinet-b2bcabinet-b2cконтракт cabinet-shell (секции встраиваются, не форкают кабинет); UserMerged; commerce-секции — заглушки до фазы 3
ugcmoderationконтракт ugc-publication; загрузки — через upload-scanner (карантин pending); персонализация — только штатными режимами ядра
chatrealtimeчат → заявка через LeadService; вложения — upload-scanner; офлайн-фолбэк при недоступном realtime
email-marketingnewsletter, email-templatesOne-Click Unsubscribe — persistent-роут (RFC 8058, ревизия №1 п. 14); триггеры по LeadStatusChanged; PrivacyRegistry

Группа A — каналы уведомлений (приоритет 2)

Все реализуют provides: notification-channel <канал> и подключаются к cms/notifications-bus; ядро без шины шлёт через NotificationDispatch с log-fallback.

МодульrequiresКлючевые стыки
telegramnotifications-bus, webhooks-inвходящие апдейты — только через подпись webhooks-in; chat_id — ПДн (PrivacyRegistry)
web-pushnotifications-busVAPID-ключи в .env; подписки — ПДн; rate-limit на /subscribe
mobile-apinotifications-busпотребитель GET /content-types/{type}/schema (ревизия №2 п. 3); конверт ошибок с code
notifications-inboxnotifications-busканал inbox внутри БД; живое обновление — suggests realtime, деградация в поллинг
messengersnotifications-bus, integrations-bus, webhooks-inвнешние API мессенджеров — только через шину интеграций (креды, ретраи, журнал); входящие статусы/сообщения — через подпись webhooks-in

Группа C — вставщики скриптов и аутентификация (приоритет 3)

МодульrequiresКлючевые стыки
pixelscookie-consentисточники — фильтр security.csp, инлайн — с nonce (ревизия №2 п. 5); гейт согласия cookie
integration-yandexintegrations-busprovides: captcha-provider (SmartCaptcha); скрипты Метрики/Карт — security.csp
integration-googleintegrations-busprovides: captcha-provider (reCAPTCHA); Consent Mode v2 — гейт cookie-consent
integration-crmintegrations-bus, webhooks-inprovides: crm-connector; LeadCreated/LeadStatusChanged в обе стороны; анти-эхо по origin
esiaconsentsprovides: auth-provider; UserRegistered/UserMerged; согласия — через consents

Группа B — провайдеры данных (приоритет 4)

Все внешние вызовы — через cms/integrations-bus; деградация чтения — 200 + meta.degraded; синхронный вызов ≤ 2 с + fallback; лимиты/квоты и kill-switch (§6 стандарта) обязательны.

МодульrequiresКлючевые стыки
dadataintegrations-busprovides: suggest-provider; подсказки с ПДн не логируются
cbr-ratesintegrations-busprovides: rates-provider; потребитель появится в фазе 3 (commerce-currencies) — модуль самодостаточен
transport-providersintegrations-busprovides: mail-transport/sms-transport; фейловер, suppression-list
calendarsintegrations-busCalDAV-синхронизация; TTL-резерв слотов — НЕ здесь (кандидат cms/booking)
video-hostingintegrations-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-busP2 — реализация отложена (проектируется, внедрение позже)сервис снизу графа зависимостей: 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 — сразу после своей зависимости)

Что в слой 2 НЕ входит (осознанно)

  • Коммерческая ветка глубины 2 (commerce-pricing, commerce-attributes, commerce-stock, commerce-wishlist) и её спутники (erp, ofd) — фаза 3, по первому заказу магазина (порядок).
  • cms/geoip — реализация geo-provider ещё не заведена в каталог (кандидаты); до решения потребители живут в штатной деградации (fallback default_city_id).
  • Кандидаты каталога (booking, …) — ждут решения владельца продукта. (ai-content заскоуплен 15.07.2026 — P2, в Группе E выше, из кандидатов исключён.)

Правила волны (как разрабатывать)

  1. Параллельность — по стандарту студии (laravel/CLAUDE.md): до 5 Sonnet-субагентов, один модуль = один субагент; общие файлы (провайдеры, роуты, composer.json скелета) — только у основного агента; субагенты не запускают тесты и tinker с записью.
  2. Каждый модуль строится строго по своему ТЗ (шаблон v2.1 + матрица v2.2) и стандарту модуля; при конфликте ТЗ ↔ этот файл — ТЗ главнее, при конфликте ТЗ ↔ ревизии ядра — ревизия главнее (пометь ТЗ «⚠️ Противоречие»).
  3. Донор прежде всего: у большинства модулей в ТЗ указан донорский код (universal/masha/notal) — портировать, не изобретать.
  4. Новые 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).

Внутренняя база знаний студии