# Правила SLM второго уровня Проект Level 2 соблюдает правила Level 1 и дополнительные правила этого реестра. `SLM-L1-DOMAIN-R015` заменяется правилами доменного пакета. `SLM-L1-GROUP-R007` сохраняется для Groups внутри пакета и вне слоя `domains`, а для навигационных Groups слоя `domains` заменяется `SLM-L2-GROUP-R004`. Ранее использовавшийся номер `SLM-L2-DOMAIN-R001` не переиспользуется после изменения модели уровней. ## Граница доменного пакета ### SLM-L2-DOMAIN-R002 > **Предметная граница пакета** > > Каждая самостоятельная предметная область слоя `domains` представлена ровно одним доменным пакетом; все его модули относятся только к этой предметной области. ### SLM-L2-DOMAIN-A003 > **Корень доменного пакета** > > Корень доменного пакета содержит только декларативную metadata, модуль `business` и допустимые Groups и не содержит других прямых модулей, исполняемых файлов, изменяемого состояния, ресурсов жизненного цикла, публичного API или реэкспортов. ### SLM-L2-GROUP-R004 > **Навигационная Group доменов** > > Group, расположенная непосредственно в слое `domains` или другой такой Group, содержит только доменные пакеты и навигационные Groups и не владеет реализацией, состоянием, жизненным циклом или публичным API. ## Business и DomainApi ### SLM-L2-BUSINESS-R005 > **Модуль business** > > Каждый доменный пакет содержит ровно один модуль `business`, который владеет публичными предметными сценариями и контрактом `DomainApi` этой предметной области. ### SLM-L2-BUSINESS-R006 > **Единственный runtime-источник домена** > > Приложение получает доменные данные, состояние и результаты предметных сценариев только через экземпляр `DomainApi`; adapters, presets и framework binding modules не предоставляют параллельный runtime-источник этих данных или результатов. ### SLM-L2-BUSINESS-A007 > **Импортная замкнутость business** > > Все runtime- и type-only импорты `business`, кроме междоменных зависимостей по `SLM-L2-DEPENDENCY-A012`, ведут только к файлам этого модуля, объявленным environment-neutral ресурсам `shared` и внешним пакетам, объявленным как business-safe. ### SLM-L2-FACTORY-R008 > **Единая фабрика DomainApi** > > Модуль `business` предоставляет ровно одну публичную фабрику, которая получает явные runtime-зависимости и создаёт `DomainApi` одного контракта независимо от preset и среды выполнения. ## Ошибки домена ### SLM-L2-ERROR-R009 > **Публичный контракт ошибок** > > Модуль `business` экспортирует устойчивые коды доменных ошибок, именованный readonly-тип безопасной публичной формы и runtime guard этой формы независимо от выбранного способа передачи ошибки. ### SLM-L2-ERROR-R010 > **Изоляция исходных ошибок** > > Сбой adapter, SDK, транспорта, storage или другого домена, доступный приложению через `DomainApi`, представлен только безопасной ошибкой собственного доменного контракта и не раскрывает исходный объект, тип, message, status, payload или cause. ## Presets и зависимости ### SLM-L2-PRESET-R011 > **Роль preset** > > Каждый preset является SLM-модулем одного именованного контекста выполнения, выбирает реализации явных зависимостей, вызывает единственную business-фабрику и не добавляет предметные сценарии, методы `DomainApi` или собственные доменные ошибки. ### SLM-L2-DEPENDENCY-A012 > **Междоменные импорты** > > Модуль одного доменного пакета не импортирует runtime-экспорты другого пакета, включая функции, состояние, hooks, contexts, Providers и components; разрешён только type-only импорт публичного business-контракта, который остаётся ребром общего ацикличного графа. ### SLM-L2-ENVIRONMENT-A013 > **Совместимость среды выполнения** > > Публичная точка входа, обозначенная как client-, server- или shared-entry point, не импортирует и не реэкспортирует код несовместимой среды выполнения во всём достижимом графе импортов. ## Framework Groups и тестирование ### SLM-L2-FRAMEWORK-R014 > **Framework Group домена** > > Framework binding modules доменного пакета размещаются в Group, названной по фреймворку, и каждый прямой дочерний элемент этой Group является framework binding module. ### SLM-L2-FRAMEWORK-R015 > **Framework binding module** > > Модуль внутри Framework Group владеет одной domain-specific framework-ответственностью, получает готовый `DomainApi` и не выполняет business-сборку, не выбирает adapters и не владеет страницей, маршрутом или multi-domain композицией. ### SLM-L2-TEST-R016 > **Проверка владельцев Level 2** > > Каждый публичный предметный сценарий проверяется через business-фабрику, а основные тесты adapter, preset и framework binding module проверяют только собственные публичные границы и не повторяют полный набор предметных сценариев. ## Миграция ### SLM-L2-MIGRATION-A017 > **Изоляция форм во время миграции** > > Пока SLM root содержит одновременно доменные модули Level 1 и доменные пакеты Level 2, модули этих двух форм не создают между собой runtime- или type-only импортов. ## Внешние библиотеки business ### SLM-L2-BUSINESS-R018 > **Business-safe внешний пакет** > > Внешний пакет объявляется business-safe только если он детерминирован, не выполняет ввод-вывод, не владеет изменяемым состоянием или runtime capability и не является SDK, generated client, storage, state manager, framework или другой технической интеграцией.