mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
120 lines
7.4 KiB
Markdown
120 lines
7.4 KiB
Markdown
# Граница доменного пакета
|
||
|
||
> Пояснение контейнерной сущности Level 2 и её совместного использования с доменными модулями Level 1.
|
||
|
||
## Связанные правила
|
||
|
||
- [`SLM-L2-DOMAIN-R002`](../../rules/level-2.md#slm-l2-domain-r002)
|
||
- [`SLM-L2-DOMAIN-A003`](../../rules/level-2.md#slm-l2-domain-a003)
|
||
- [`SLM-L2-GROUP-R004`](../../rules/level-2.md#slm-l2-group-r004)
|
||
- [`SLM-L2-API-R005`](../../rules/level-2.md#slm-l2-api-r005)
|
||
- [`SLM-L2-DOMAIN-A026`](../../rules/level-2.md#slm-l2-domain-a026)
|
||
- [`SLM-L2-API-A019`](../../rules/level-2.md#slm-l2-api-a019)
|
||
- [`SLM-L2-ASSEMBLY-A020`](../../rules/level-2.md#slm-l2-assembly-a020)
|
||
- [`SLM-L2-ADAPTER-R021`](../../rules/level-2.md#slm-l2-adapter-r021)
|
||
|
||
## Предметная граница
|
||
|
||
Доменный пакет представляет одну связную предметную область и объединяет только принадлежащие ей SLM-модули. Пакет `auth` может содержать Domain API авторизации, production adapters её providers, assemblies и React bindings, но не страницу профиля, общий database client или multi-domain navigation policy.
|
||
|
||
Пакет не владеет исполняемой ответственностью. Domain API, adapters, production graph, framework projection и lifecycle принадлежат конкретным модулям внутри него.
|
||
|
||
Level 2 применяется к пакету, а не ко всему SLM root. Например, `auth` может быть пакетом Level 2, пока `catalog` и `news` остаются доменными модулями Level 1.
|
||
|
||
## Корень пакета
|
||
|
||
```text
|
||
domains/auth/
|
||
├── README.md
|
||
├── api/
|
||
├── adapters/
|
||
├── assemblies/
|
||
└── react/
|
||
```
|
||
|
||
В корне разрешены:
|
||
|
||
- документация;
|
||
- ownership metadata;
|
||
- декларативный manifest архитектурной проверки;
|
||
- объявления environment capability sets;
|
||
- обязательный модуль `api`;
|
||
- обязательная непустая Group `assemblies` с модулем `default`;
|
||
- непустая Group `adapters`, если хотя бы одна фабрика имеет dependency port;
|
||
- Framework Groups при наличии соответствующих модулей.
|
||
|
||
В корне запрещены:
|
||
|
||
- `index.ts` или другой агрегирующий executable entry point;
|
||
- runtime-файлы и side effects;
|
||
- изменяемое состояние и lifecycle resources;
|
||
- реэкспорт API внутренних модулей;
|
||
- page-specific компоненты или сборка нескольких доменов.
|
||
|
||
Metadata содержит только статические данные. Проверяющий инструмент может читать её декларативно, но она не исполняется и не становится скрытым API пакета.
|
||
|
||
## Policy boundary
|
||
|
||
Доменный пакет не является узлом import-графа. Его техническая граница состоит из объявленного проверке набора дочерних модулей и правил, применяемых ко всем связям через эту границу.
|
||
|
||
Отсутствие root barrel намеренно:
|
||
|
||
- client, server, RSC и worker entry points не агрегируются в один импорт;
|
||
- каждый модуль сохраняет отдельные ответственность и environment boundary;
|
||
- concrete adapters не становятся частью Domain API;
|
||
- Groups не превращаются в скрытые modules;
|
||
- versioning publishable package остаётся за пределами Level 2.
|
||
|
||
## Модули и Groups
|
||
|
||
```text
|
||
auth/
|
||
├── api/ # SLM-модуль
|
||
│ ├── index.ts # Consumer-facing types
|
||
│ ├── ports.ts # Implementer-facing types
|
||
│ ├── factory.ts # Runtime factories
|
||
│ └── runtime.ts # Необязательный deterministic runtime
|
||
├── adapters/ # Group при наличии ports
|
||
│ ├── identity-rest/ # SLM-модуль
|
||
│ └── identity-realtime/ # SLM-модуль
|
||
├── assemblies/ # Обязательная Group
|
||
│ ├── default/ # Обязательный SLM-модуль
|
||
│ └── administration/ # Дополнительный SLM-модуль
|
||
└── react/ # Framework Group
|
||
├── session/ # SLM-модуль
|
||
└── queries/ # SLM-модуль
|
||
```
|
||
|
||
Groups не имеют `index.ts`. Публичными путями являются `auth/api`, `auth/api/ports`, `auth/api/factory`, опциональный `auth/api/runtime`, `auth/adapters/identity-rest`, `auth/assemblies/default` и `auth/react/session`, но не `auth`, `auth/adapters`, `auth/assemblies` или `auth/react`.
|
||
|
||
## Навигационные Groups
|
||
|
||
Слой `domains` может содержать Groups с обеими формами домена:
|
||
|
||
```text
|
||
domains/
|
||
└── commerce/ # Навигационная Group
|
||
├── catalog/ # Доменный модуль Level 1
|
||
└── orders/ # Доменный пакет Level 2
|
||
```
|
||
|
||
Такая Group отличается от Group внутри пакета допустимым составом: она содержит доменные модули, доменные пакеты и другие navigation Groups, а не внутренние модули пакета.
|
||
|
||
Одна предметная область не представляется одновременно модулем и пакетом. Переход завершается удалением старой границы выбранного домена, но требует обновить все его входящие imports и production composition roots.
|
||
|
||
## Границы соседних слоёв
|
||
|
||
| Ответственность | Владелец |
|
||
|---|---|
|
||
| Публичные модели, Domain API, validation и domain errors | `api` |
|
||
| Контракт external capability | `api/ports` |
|
||
| Production-реализация dependency port | Adapter внутри пакета |
|
||
| Штатный production-граф | `assemblies/default` |
|
||
| Специальный production-граф | Дополнительная assembly |
|
||
| Domain-specific framework state, cache и bindings | Модуль внутри `react`, `vue` и аналогичной Group |
|
||
| Универсальный технический сервис | `infra` |
|
||
| Страница, маршрут, redirect, продуктовый текст | `compositions` |
|
||
| UI, объединяющий несколько доменов | `compositions` |
|
||
|
||
Зависимость от React, WebSocket или SDK сама по себе не определяет владельца. Решающими остаются предметная ответственность, направление dependency inversion и публичная граница.
|