# Фаза 39. Хозяин школы ## Зависимости - [Фаза 38](38-session.md) - [Фаза 13](13-management-tab.md) ## Зачем У школы есть хозяин. Свои слоты — свои, чужие смотрят отдельно и не управляют. ## Задачи - [ ] `SimulationOptions.MaxSchools` — слоты **игрока**, умолчание 2. `MaxSchoolsTotal` — воркеры процесса, умолчание 16. Подъём с диска режет по Total, не по слотам игрока - [ ] Сейв несёт `owner`. Нет поля — бесхозная. Формат не бампить - [ ] Create пишет текущего пользователя; отказ: свои слоты кончились (`limit-reached`) или сервер полон (`server-full`) - [ ] `GET /api/schools`: `maxSchools` — слоты игрока, `maxSchoolsTotal`, `schools` — свои, `others` — чужие и бесхозные (`owner` имя или `null`). Карточка школы несёт `mine` - [ ] Welcome.`MaxSchools` — слоты игрока (байт тот же, смысл новый) - [ ] Мутации чужой — HTTP `403` `not-owner`. Бесхозную может удалить любой залогиненный. `OpenSchool` — всем с сессией. Пауза / скорость / пропуск от гостя до работника не доходят. **Исключение:** `POST .../portrait` — гость генерирует теми же пресетами школы; это не управление - [ ] Меню: блок «Мои» и блок «Чужие». У бесхозной в чужих — удалить, у чужой с хозяином — нет - [ ] Внутри чужой школы нет вкладки «Управление» и нет кнопок часов (пауза, скорость, пропуск). Карта и люди остаются - [ ] `docs/protocol.md` — списки и коды ошибок. Версию сокета не бампить ## Тесты, без которых фаза не закрыта - [ ] Два пользователя: у каждого по две школы, третья своего — `limit-reached`; чужая в `others`, не в `schools` - [ ] Восьмая школа на сервере с `MaxSchoolsTotal` = 7 — `server-full`, даже если у игрока слот есть - [ ] Гость: `POST` найма — `403`; `SetRunning` не меняет `running` хозяина - [ ] Сейв без `owner` поднимается, лежит в `others`, удаляется вторым пользователем - [ ] Клиентский тест: чужая карточка без кнопки удаления; в чужой школе нет «Управление» ## Критерий готовности - Два браузера, два имени: каждый видит свою сетку и чужие отдельным блоком; в чужой школе часы чужие не нажимаются - `dotnet test` и `npm test` / `build` проходят ## Стоп Не отдавать бесхозную в слот игрока. Не показывать гостю «Управление» даже чтением. Не менять скорости.