# Фаза 2. Работник школы и диск ## Зависимости Нет по коду клиента. Ломает текущий общий `GameLoopService`. ## Зачем Основа среза: каждая школа — свой поток, свой Arch `World`, свой файл. Пока ещё можно обойтись часами без карты — сейв расширится в фазе 3, формат закладывать расширяемым. ## Задачи - [x] Супервизор держит ящики `id →` очередь; не трогает `World` - [x] У школы выделенный поток (`LongRunning`), свой таймер фиксированного шага, свой `World` - [x] Команды create/delete/open/close/running/speed идут в ящик, не в общий цикл - [x] Меню читает опубликованные снимки, как сейчас, без блокировки работника - [x] Кадры часов по-прежнему из работника в outbox соединения - [x] Сейв на диск: имя, id, часы, running, speedIndex; запись при create/delete, shutdown, редкий снимок часов (не 20 Гц) - [x] Старт процесса поднимает школы с диска - [x] Обновить инвариант в `AGENTS.md`: трогает школу только её работник - [x] Тесты AppHost: create → рестарт хоста (или явный reload) → школа на месте с тем же временем с разумной погрешностью снимка ## Критерий готовности - `dotnet test` проходит - Две школы тикают независимо (пауза одной не останавливает часы другой — уже так по симуляции; поток не должен это ломать) - После перезапуска сервера список школ не пустой, если их создали ## Стоп Не грузить defs в этой фазе. Не писать файл каждый тик.