# TASK-0002: Базовая архитектура Boot Flow ## Цель Создать минимальную архитектурную основу для boot flow: сервисный lifecycle, state-контракты и generic state controller. ## Что сделать - Создать `IService` с методами `InitializeAsync(CancellationToken ct)` и `ReleaseAsync(CancellationToken ct)`. - Создать базовый `Service : IService`, если это упростит общую структуру. - Создать `IState` с методами `EnterAsync(CancellationToken ct)` и `ExitAsync(CancellationToken ct)`. - Создать `IStatesController` с методом `EnterStateAsync(TEnum code, CancellationToken ct)`. - Реализовать `StatesController`. - Создать `BootStateCode` для состояний `Splash`, `Load`, `Menu`. - Создать `BootStatesController`, который собирает конкретные boot states и передает их в базовый controller. ## Технические требования - Использовать UniTask для всех async-методов. - Во все async-операции передавать `CancellationToken`. - Контракт перехода должен быть строгим: сначала `ExitAsync` текущего state, затем `EnterAsync` нового state. - `StatesController` не должен знать бизнес-логику boot flow. - State не должен сам решать, какой state будет следующим. ## Критерии готовности - `EnterStateAsync` вызывает `ExitAsync` текущего state перед `EnterAsync` нового state. - Первый вход в state работает без попытки выйти из отсутствующего текущего state. - Повторный вход в другой state не оставляет предыдущий state активным. - `CancellationToken` проброшен через `EnterStateAsync`, `ExitAsync` и `EnterAsync`. ## Заметки Generic state machine должна уметь только переключать состояния. Сценарий `Splash -> Load -> Menu -> Load` должен жить отдельно, чтобы не смешивать control flow и инфраструктуру state machine.