Составной поток данных
Собери только те части data/domain-потока, которые нужны пользовательскому сценарию. Этот skill
координирует специализированные skills и не дублирует их шаблоны.
Сначала определи границы
- Изучи аналогичные потоки и существующие типы в целевом проекте.
- Зафиксируй источник истины: ответ текущей операции, Room или другой уже существующий store.
- Определи, что запускает обновление: UI, realtime-событие или WorkManager.
- Отметь уже реализованные части и не пересоздавай их.
- Выбери минимальный поток из таблицы ниже. Если сценарий гибридный, объедини только необходимые
строки.
| Сценарий |
Подключаемые skills |
Результат |
| Ktor-only |
create-ktor-endpoint, затем обязательный create-usecase |
Ответ используется конкретной domain-операцией без искусственного Room-кэша |
| Room-only |
create-room-storage, затем create-usecase; create-domain-mapper только при реальной границе моделей |
Чтение/запись локального источника без сетевого слоя |
| Ktor → mapper → Room |
create-ktor-endpoint, create-domain-mapper, create-room-storage, create-usecase |
Load-use case получает API-модель, маппит и атомарно обновляет Room; UI наблюдает Room отдельным FlowUseCase |
| realtime → reload |
create-signalr-channel, затем create-usecase; добавь Ktor/mapper/Room skills только для отсутствующих частей reload-потока |
Realtime-событие служит сигналом обновления, а не вторым источником состояния |
| WorkManager → network → Room |
create-workmanager-task, create-ktor-endpoint, create-domain-mapper, create-room-storage, create-usecase только для отсутствующих частей |
Worker вызывает переиспользуемую business-операцию; network/Room-логику не дублирует |
Перед реализацией загрузи каждый выбранный skill и следуй его границам. Порядок в таблице описывает
зависимости, но не требует пересоздавать уже готовые нижние слои.
Инварианты композиции
- Не добавляй Repository или Interactor, если целевой проект связывает конкретные зависимости через
UseCase / FlowUseCase.
- Не создавай Room, mapper, request/response или фоновую задачу «для полноты». У каждого слоя должен
быть вызывающий сценарий.
- При Room как источнике истины разделяй обновление и наблюдение: одноразовый load use case пишет в
Room, отдельный
FlowUseCase возвращает DAO Flow.
- Realtime handler и Worker инициируют use case. Они не копируют HTTP-вызовы, маппинг и SQL-запись
внутрь инфраструктурного класса.
- Композиционный use case разворачивает результат другого use case через
.getOrThrow().
- Используй транзакцию Room для согласованного набора связанных изменений, а не для одиночного
вызова DAO.
- Следуй структуре, именованию и уже выбранным библиотекам целевого проекта. Reference-проект
показывает поведение, но не является шаблоном для механической замены package name.
Завершение
Проверь, что созданные части образуют один вызываемый вертикальный поток, зарегистрированы в
существующих database/network/realtime/worker точках расширения и не оставили неиспользуемых
моделей. Запусти релевантные тесты и сборку затронутых модулей. Экран подключай отдельно через
create-feature-scaffold-screen.
1---2name: create-data-layer3description: Use when пользователь просит собрать или расширить составной поток данных фичи между Ktor, Room, мапперами, use case, realtime или WorkManager — например "wire up API and Room", "add a data layer", "reload persisted data from a socket event" или "sync in background". Выбирает минимальный поток и маршрутизирует работу к специализированным skills. Не используй для одного уже определённого endpoint, DAO/entity, mapper, use case, worker или realtime-канала; используй соответствующий атомарный skill напрямую. Не используй для Screen/ViewModel.4---56# Составной поток данных78Собери только те части data/domain-потока, которые нужны пользовательскому сценарию. Этот skill9координирует специализированные skills и не дублирует их шаблоны.1011## Сначала определи границы12131. Изучи аналогичные потоки и существующие типы в целевом проекте.142. Зафиксируй источник истины: ответ текущей операции, Room или другой уже существующий store.153. Определи, что запускает обновление: UI, realtime-событие или WorkManager.164. Отметь уже реализованные части и не пересоздавай их.175. Выбери минимальный поток из таблицы ниже. Если сценарий гибридный, объедини только необходимые18 строки.1920| Сценарий | Подключаемые skills | Результат |21| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |22| Ktor-only | `create-ktor-endpoint`, затем обязательный `create-usecase` | Ответ используется конкретной domain-операцией без искусственного Room-кэша |23| Room-only | `create-room-storage`, затем `create-usecase`; `create-domain-mapper` только при реальной границе моделей | Чтение/запись локального источника без сетевого слоя |24| Ktor → mapper → Room | `create-ktor-endpoint`, `create-domain-mapper`, `create-room-storage`, `create-usecase` | Load-use case получает API-модель, маппит и атомарно обновляет Room; UI наблюдает Room отдельным FlowUseCase |25| realtime → reload | `create-signalr-channel`, затем `create-usecase`; добавь Ktor/mapper/Room skills только для отсутствующих частей reload-потока | Realtime-событие служит сигналом обновления, а не вторым источником состояния |26| WorkManager → network → Room | `create-workmanager-task`, `create-ktor-endpoint`, `create-domain-mapper`, `create-room-storage`, `create-usecase` только для отсутствующих частей | Worker вызывает переиспользуемую business-операцию; network/Room-логику не дублирует |2728Перед реализацией загрузи каждый выбранный skill и следуй его границам. Порядок в таблице описывает29зависимости, но не требует пересоздавать уже готовые нижние слои.3031## Инварианты композиции3233- Не добавляй Repository или Interactor, если целевой проект связывает конкретные зависимости через34 `UseCase` / `FlowUseCase`.35- Не создавай Room, mapper, request/response или фоновую задачу «для полноты». У каждого слоя должен36 быть вызывающий сценарий.37- При Room как источнике истины разделяй обновление и наблюдение: одноразовый load use case пишет в38 Room, отдельный `FlowUseCase` возвращает DAO Flow.39- Realtime handler и Worker инициируют use case. Они не копируют HTTP-вызовы, маппинг и SQL-запись40 внутрь инфраструктурного класса.41- Композиционный use case разворачивает результат другого use case через `.getOrThrow()`.42- Используй транзакцию Room для согласованного набора связанных изменений, а не для одиночного43 вызова DAO.44- Следуй структуре, именованию и уже выбранным библиотекам целевого проекта. Reference-проект45 показывает поведение, но не является шаблоном для механической замены package name.4647## Завершение4849Проверь, что созданные части образуют один вызываемый вертикальный поток, зарегистрированы в50существующих database/network/realtime/worker точках расширения и не оставили неиспользуемых51моделей. Запусти релевантные тесты и сборку затронутых модулей. Экран подключай отдельно через52`create-feature-scaffold-screen`.