5.4 KiB
Открытые вопросы Level 2
Эти вопросы не являются правилами и не отменяют зафиксированные границы.
Зафиксированные решения
- Level 1 является общей базой, а Level 2 применяется отдельно к выбранным предметным областям.
- Доменный модуль Level 1 и доменный пакет Level 2 могут постоянно сосуществовать в одном SLM root.
- Одна предметная область имеет только одну форму.
- Корень пакета содержит только metadata, модуль
businessи допустимые Groups и не имеет executable API. businessможет объявлять несколько независимо собираемых Domain API и одну фабрику для каждого API.- Публичный API
businessимеет обязательные type-onlybusinessи runtimebusiness/factory, а также необязательный deterministicbusiness/runtime. - Приложение получает предметную модель, transitions и результаты через Domain API; technical и framework cache могут хранить и проецировать эти значения.
- Ожидаемые ошибки adapters и других доменов не пересекают API текущего домена в исходной форме.
- Каждый доменный пакет содержит минимум одну assembly; универсальная изоморфная assembly не обязательна.
- Assembly может создавать именованный граф нескольких API и не добавляет к ним сценарии.
- При наличии технических зависимостей Group
adaptersобязательна, а каждая связная production implementation принадлежит adapter-модулю. - Runtime cross-domain imports через пакетную границу разрешены только из
business/runtime; type-only public contracts разрешены и входят в DAG. - Framework Group называется по фреймворку и содержит самостоятельные SLM-модули.
- Cross-domain framework state, hooks, contexts и components не импортируются.
- Clock, timer, random, ID generator и environment являются явными dependencies business.
- Assembly без собственного lifecycle-ресурса не обязана возвращать пустой
dispose.
Владение состоянием
Нужно подробнее определить создание initial state, применение transitions, persistence и внешний event input. Нормативным уже является то, что предметную модель и переходы определяет business, а concrete state manager реализует business-owned port либо framework projection.
Отдельно требуется проверить SSR snapshot, hydration, concurrent rendering, reset и поведение после завершения request scope.
Передача ошибок
Нужно выбрать общую рекомендацию exception или discriminated Result, определить cancellation и unexpected failures, а также сериализацию ошибок через RPC и server actions.
Структура публичных фасетов от этого решения больше не зависит: type errors публикуются через business, а необходимые runtime codes и guards через опциональный business/runtime.
Технические порты
Нужно определить, является ли consumer-owned port обязательной формой каждой технической зависимости и какие behavioral guarantees он описывает: timeout, retry, cancellation, idempotency, ordering, concurrency и subscription cleanup.
Cross-domain API dependency уже зафиксирована как отдельный вид зависимости и не зависит от этого решения.
Lifecycle сборки
Уже зафиксировано, что явная операция, запускающая ресурс, возвращает cleanup, а assembly с собственным ресурсом предоставляет cleanup handle результата. Ещё нужно определить async cleanup, rollback частичной сборки, repeated disposal, request abort и поведение API после завершения scope.
Cache hydration
Нужно проверить единый способ разделять framework-neutral cache policy, client hooks, server prefetch и serialization boundary без утечки query-library types в Domain API.
Автоматическая проверка
Нужно выбрать machine-readable формат для форм домена, metadata, модулей, Groups, entry points, environment labels и запрещённых транзитивных импортов.