| Владелец | Какой модуль определяет контракт и внутреннюю реализацию |
| Слой | Какой архитектурной роли соответствует ответственность |
| Потребители | Кому действительно нужен публичный API |
| Зависимости | Какие другие владельцы и возможности необходимы |
| Состояние | Кто определяет смысл и допустимые изменения данных |
| Жизненный цикл | Кто создаёт ресурсы, какова их область жизни и очистка |
| Физическая форма | Какими путями и фасетами представлено принятое решение |
Если ответственность или владелец не определены, проверка путей откладывается: одинаковая файловая структура может представлять разные архитектурные решения.
## Архитектурное ревью
На ревью проверяется смысл кода, который нельзя надёжно вывести из файловой системы:
- принадлежит ли каждый доменный сценарий модулю слоя `domains`;
- находятся ли бизнес-правила, продуктовое состояние, смысл операций с предметными данными, предметные исходы и доменный UI у владельца сценария;
- только ли использует и компонует модуль `compositions` готовые публичные API доменов, не определяя и не дополняя их сценарии;
- не размещён ли сценарий временно в композиции только потому, что подходящий доменный модуль ещё не создан;
- не скрывает ли связывание нескольких доменных API новый порядок, условие, общий предметный результат или политику ошибок;
- обслуживает ли прямое использование `infra` собственную техническую потребность композиции, а не продуктовую операцию или доступ к предметным данным;
Вызовы `fetch`, HTTP-клиента, SDK, query client или storage внутри `compositions` являются сигналами для проверки, но не самостоятельным доказательством нарушения. Ревью устанавливает, обслуживает ли вызов техническую ответственность самой композиции или реализует доменный сценарий в обход его владельца.
## Проверка домена
Для каждого создаваемого или изменяемого домена дополнительно проверяется:
- остаётся ли домен одним специализированным модулем и узлом графа, а не неявным контейнером нескольких владельцев;
- объявлены ли входы, модели и результаты самим доменом до подключения источника;
- можно ли описать доменный контракт без упоминания endpoint, SDK, DTO или схемы внешнего сервиса;
- не выведен ли публичный тип через alias, наследование, `Pick`, `Omit`, `ReturnType` или другой source type;
- определены ли ожидаемые неуспешные исходы самим доменом;
- создаёт ли реализация только исходы, объявленные доменным контрактом;
- не определяют ли mapper, adapter или framework-код независимые ошибки параллельно декларации домена;
- зависит ли потребитель только от error contract текущего домена независимо от выбранной формы его представления;
- не выдаётся ли project policy о code, payload, union или casing за универсальное правило SLM;
- отсутствуют ли в публичной ошибке чужие error type, source code, message, transport status, raw payload и `cause`;
- адаптируются ли request и response источника выбранным внутренним механизмом;
- попадают ли в правила, состояние и доменный UI только значения доменного контракта;
- интерпретируется ли каждая ошибка источника и зависимого домена в терминах текущего сценария;
- нужен ли runtime-механизм идентификации реальным потребителям и совместим ли он с их средой выполнения;
- не экспортируется ли constructor, guard, parser или schema без доказанной потребности;
- не замаскирована ли programming defect под ожидаемую доменную ошибку.
Прямой импорт source type во внутренний код адаптации сам по себе допустим. Нарушением является его достижимость из публичного фасета, использование как доменной модели или состояния либо передача потребителю без преобразования.
Интеграционный код ревьюится только после определения доменного контракта и семантики ожидаемых ошибок. Запрос к реальному источнику не считается допустимой временной реализацией домена, если предметная граница ещё не объявлена.
Проект сопоставляет физические пути с SLM root, слоями, группами, модулями, вложенными модулями, сегментами, фасетами, точками входа `app` и ресурсами `shared`. Сопоставление задаётся локальной конфигурацией и не меняет смысл сущностей.
Наличие `index.ts` само по себе не объявляет модуль. Проверка отличает объявленные корни модулей и их публичные фасеты от локальных точек входа и других внутренних единиц.
Импорты типов (`import type`) и реэкспорты проверяются как архитектурные связи. Импорты файлов одного модуля сворачиваются и не создают межмодульного ребра. Вложенный модуль считается отдельным узлом.
File-level проверка не заменяет модульную: два модуля могут зависеть друг от друга через разные файлы без замкнутого пути между конкретными файлами. Полный алгоритм описан в разделе [Зависимости](../architecture/dependencies.md#запрет-циклов).
## Проверка внутренней структуры
Ревью или дополнительный project lint подтверждают:
- помимо опционального главного framework-файла, остальные компонентные единицы размещены на одном внутреннем уровне модуля;
- их локальные каталоги не содержат другие компонентные единицы или вложенные модули;
- runtime-дерево компонентов не используется как файловая иерархия;
- рекурсивная структурная вложенность проходит только через вложенные модули;
- в корне модуля находятся только фасеты и опциональный главный implementation- или assembly-файл;