mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
148 lines
10 KiB
Markdown
148 lines
10 KiB
Markdown
# Правила SLM второго уровня
|
||
|
||
Проект Level 2 соблюдает правила Level 1 и дополнительные правила этого реестра. `SLM-L1-DOMAIN-R015` заменяется правилами доменного пакета. `SLM-L1-GROUP-R007` сохраняется для Groups внутри пакета и вне слоя `domains`, а для навигационных Groups слоя `domains` заменяется `SLM-L2-GROUP-R004`. Для модуля `business` правило `SLM-L1-MODULE-A004` уточняется правилом `SLM-L2-BUSINESS-A019`: три объявленных фасета вместе образуют один логический публичный API и не считаются deep imports. Ранее использовавшийся номер `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 и среды выполнения и является единственным runtime-экспортом фасета `business/factory`.
|
||
|
||
## Ошибки домена
|
||
|
||
### SLM-L2-ERROR-R009
|
||
|
||
> **Публичный контракт ошибок**
|
||
>
|
||
> Модуль `business` экспортирует через type-only barrel именованные readonly-типы DomainError и DomainErrorCode, а через `business/error` только устойчивые runtime-коды и guards безопасной публичной формы независимо от выбранного способа передачи ошибки.
|
||
|
||
### SLM-L2-ERROR-R010
|
||
|
||
> **Изоляция исходных ошибок**
|
||
>
|
||
> Сбой adapter, SDK, транспорта, storage или другого домена, доступный приложению через `DomainApi`, представлен только безопасной ошибкой собственного доменного контракта и не раскрывает исходный объект, тип, message, status, payload или cause.
|
||
|
||
## Presets и зависимости
|
||
|
||
### SLM-L2-PRESET-R011
|
||
|
||
> **Роль preset**
|
||
>
|
||
> Каждый preset является SLM-модулем одного именованного контекста выполнения, при наличии технических зависимостей выбирает их adapter-модули, вызывает единственную 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 или другой технической интеграцией.
|
||
|
||
## Публичные фасеты business
|
||
|
||
### SLM-L2-BUSINESS-A019
|
||
|
||
> **Публичные фасеты business**
|
||
>
|
||
> Публичный API `business` состоит ровно из трёх entry points: корневой barrel содержит только type exports, а `business/factory` и `business/error` содержат только runtime exports; другие публичные пути и deep imports запрещены.
|
||
|
||
## Обязательные роли сборки
|
||
|
||
### SLM-L2-PRESET-A020
|
||
|
||
> **Обязательная Group presets**
|
||
>
|
||
> Корень каждого доменного пакета содержит ровно одну непустую Group `presets`, каждый прямой дочерний элемент которой является объявленной границей SLM-модуля.
|
||
|
||
### SLM-L2-ADAPTER-R021
|
||
|
||
> **Модули production adapters**
|
||
>
|
||
> Если business-фабрика имеет хотя бы одну техническую зависимость, корень доменного пакета содержит непустую Group `adapters`, а каждая production-реализация такой зависимости является отдельным adapter-модулем этой Group и не определяется в другом месте production-графа.
|
||
|
||
### SLM-L2-BUSINESS-A022
|
||
|
||
> **Потребители фасетов business**
|
||
>
|
||
> Корневой `business` импортируется извне только через `import type`; `business/factory` импортируют только presets своего домена, `app`, `compositions` и тесты, а `business/error` импортируют только framework binding modules своего домена, `app`, `compositions` и тесты.
|