# TASK-0006: MenuState и Restart

## Статус

Ready

## Цель

Реализовать меню с кнопкой `Restart`, которое завершает `MenuState` и возвращает flow к загрузке.

## Что сделать

- Реализовать `MenuState`.
- Реализовать `MenuUIView`.
- Реализовать `MenuUIViewModel` или аналогичный plain C# объект для restart-сигнала.
- В `MenuState.EnterAsync` показать menu View и ожидать restart.
- Ожидание restart реализовать через `UniTaskCompletionSource` или аналогичный UniTask-friendly механизм.
- По нажатию кнопки `Restart` завершать ожидание `MenuState.EnterAsync`.
- В `MenuState.ExitAsync` release-нуть menu View и очистить подписки/listeners.

## Технические требования

- Кнопку подключать через `Button.onClick.AddListener(...)`.
- В `Release()` снимать ровно тот же listener через `RemoveListener(...)`.
- Не использовать `RemoveAllListeners()` как основной способ очистки.
- Не использовать анонимную лямбду, которую невозможно симметрично снять.
- Не переводить state machine напрямую из `MenuUIView`.
- Restart-событие должно попадать во flow через ViewModel/state, а не через глобальное состояние.

## Критерии готовности

- `MenuState.EnterAsync` завершается после нажатия `Restart`.
- После завершения `MenuState` внешний `BootFlowService` запускает `LoadState`.
- Несколько циклов `Menu -> Restart -> Load -> Menu` не дублируют callbacks.
- Повторный `Release()` у `MenuUIView` не падает.

## Заметки

Для кнопки лучше использовать method group или заранее сохраненный delegate. Это упрощает симметричный `AddListener`/`RemoveListener` и снижает риск дублирующихся callbacks.
