# Правила SLM первого уровня Здесь собраны правила первого уровня. Это единственное место, где они формулируются; тематические черновики объясняют их и ссылаются на коды. ## Размещение кода по слоям ### SLM-L1-LAYER-R001 > **Назначение слоёв** > > Код внутри SLM root размещается в слое, нормативная роль которого соответствует ответственности этого кода. ### SLM-L1-LAYER-A002 > **Направление зависимостей** > > Внутри одного SLM root код каждого слоя может зависеть только от кода целевых слоёв, разрешённых для него нормативной матрицей слоёв. ### SLM-L1-LAYER-R003 > **Граница слоя `app`** > > В `app` размещаются только точки входа фреймворка для запуска, маршрутов, преобразования входных данных и подключения публичных API модулей разрешённых слоёв или ресурсов `shared`; ответственности этих модулей остаются за пределами `app`. ## Границы модулей ### SLM-L1-MODULE-A004 > **Публичный API модуля** > > Каждый модуль предоставляет единый публичный API; код за пределами модуля импортирует его содержимое только через этот API. ### SLM-L1-MODULE-A014 > **Папка модуля** > > Каждый модуль размещается в отдельной папке; его публичный API и внутренняя реализация находятся внутри этой границы, а вложенные модули образуют собственные папки. ### SLM-L1-MODULE-R006 > **Ответственность модуля** > > Одна модульная граница содержит код одной связной ответственности; части, которые изменяются по несвязанным причинам, размещаются в разных модулях. ### SLM-L1-MODULE-R011 > **Владелец ответственности** > > Каждая самостоятельная ответственность и относящийся к ней код принадлежат ровно одному модулю; вне модульной границы допускаются только точки входа `app` и нормативные ресурсы `shared`. ### SLM-L1-MODULE-R012 > **Состав публичного API** > > Публичный API модуля открывает только контракт, необходимый реальным внешним потребителям; детали реализации и изменяемые внутренние механизмы остаются закрытыми. ## Зависимости между модулями ### SLM-L1-DEPENDENCY-A005 > **Циклические зависимости** > > Граф зависимостей модулей внутри одного SLM root, включая вложенные модули, не содержит циклов. ## Назначение групп ### SLM-L1-GROUP-R007 > **Назначение группы** > > Группа содержит только модули и другие группы, не владеет файлами реализации, состоянием, жизненным циклом или публичным API и не импортируется внешним кодом. ## Назначение сегментов ### SLM-L1-SEGMENT-R008 > **Граница сегмента** > > Сегмент организует код только внутри одного модуля и не имеет собственной ответственности, публичного API или узла графа зависимостей. ## Ответственность компонентов ### SLM-L1-COMPONENT-R009 > **Ответственность компонента** > > Компонент реализует часть ответственности одного родительского модуля; все его зависимости, состояние и жизненный цикл принадлежат этому модулю и не образуют самостоятельную архитектурную границу. ## Границы вложенных модулей ### SLM-L1-NESTED_MODULE-A010 > **Доступ к вложенному модулю** > > Код за пределами родительского модуля не импортирует вложенный модуль напрямую и получает его экспорты только через публичный API родителя. ## Жизненный цикл ### SLM-L1-LIFECYCLE-R013 > **Жизненный цикл ресурсов** > > Для каждого ресурса жизненного цикла модуль-владелец определяет создание, область жизни, число экземпляров и очистку; ресурс активен только внутри своей области жизни. ## Граница доменных модулей ### SLM-L1-DOMAIN-R015 > **Доменный модуль** > > Каждая самостоятельная предметная область слоя `domains` представлена ровно одним доменным модулем; принадлежащие ей модели, правила, сценарии и продуктовое состояние размещаются внутри его границы, включая границы вложенных модулей.