# Кабинет директора и классный Договорённость на срез после событий и общения, не текущий код. Люди: [`people.md`](../02-people/people.md). Штат: [`staffing.md`](../03-staffing/staffing.md). ИИ: [`ai.md`](../05-ai/ai.md). Общение: [`social.md`](../09-social/social.md). События: [`events.md`](../11-events/events.md). Урок: [`lesson-consequences.md`](../off-queue/lesson-consequences.md). У школы появляется **власть на карте**: проступок помнится коротко, ученика **сами** гонят к директору — с очередью у кабинета и ожиданием в коридоре. У класса появляется **классный** (учитель из Управления); он редко оставляет класс после уроков на родительское собрание, и родители **реально входят** на карту. Игрок **назначает классных** и **смотрит**. Кнопки «вызвать к директору» и «назначить собрание» нет: авто и ИИ классного. ### Роль игрока: менеджер / симулятор бога Экран школы — **менеджер**, не контроллер юнитов. Игрок задаёт рамку (штат, расписание, правила, классные) и смотрит, как мир сам ходит, ссорится и вызывается к директору. Приказов «этому ученику — сюда» нет и в соседних срезах учёбы и здоровья не появляется. ## Что увидит игрок - В **Управлении** — у каждого класса слот «классный»: только из нанятых учителей; снять / переназначить. - На карточке ученика — **небольшой список** недавних проступков (несколько последних), не шкала дисциплины и не журнал оценок. - После драки / выговора система может отправить ученика к директору: он идёт, если кабинет занят — **ждёт в коридоре** у входа, внутри — **очередь по одному**. - Редко после последнего урока класса: классный и часть родителей в кабинете класса; тост, что собрание идёт. ## На какие вопросы отвечает - Как приказ «к директору» живёт в том же ИИ, что урок (сильная обязанность), без телепорта. - Как очередь у `PrincipalsOffice` не ломает присутствие и детерминизм. - Кто такой классный без нового `PositionDef`. - Как родитель впервые получает узел на карте и уходит после собрания. - Что видит игрок без кнопки вмешательства. ## Чего нет - Кнопки игрока «вызвать» / «на собрание». - Шкалы дисциплины 0…100 и дневника оценок. - Травм, медкабинета как больницы, выговора в отдельной вкладке «Правила». - Еженедельного календаря собраний и явки 100%. - Завуча как отдельной роли в этом срезе. - Оценок и приказов «отправить домой». ## Что меняется в уже принятом | Было | Стало | Почему | | --- | --- | --- | | Игрок только наблюдает; приказов нет ([`ai.md`](../05-ai/ai.md)) | Наблюдает вызовы; **назначает** классного | Классный — единственное решение игрока в срезе | | Драка → выговор на месте; кабинет директора не заводим ([`social.md`](../09-social/social.md)) | Часть проступков → авто-вызов, очередь | Иначе выговор пустой | | Родители без места на карте ([`people.md`](../02-people/people.md)) | На собрании получают узел и цель | Задел с ростера наконец используется | | `SchoolClass` — id, год, литера, кабинет, ученики | Плюс `classTeacherId` (учитель или пусто) | Не должность, слот на классе | | `EventDef`: утро, звонок, сбой генерации | Плюс вызов / собрание (info) | Игрок видит факт, не только строку в локации | | «Родителя вызвать — отдельный сюжет» | Собрание классного; **не** вызов одного родителя к директору | Узкий scope | ## Этап A — классный У `SchoolClass` опциональный id учителя. Назначить / снять — HTTP через мейлбокс школы (как предметы), только хозяин. Кандидаты: нанятые с должностью `Teacher`. Один учитель — классный у нескольких классов (ваниль не запрещает). Пустой слот: собраний нет, класс живёт как сейчас. Карточка класса / строка в Управлении показывает имя. Сейв — в `people.json` / ростере рядом с классами. После этапа школа целая: классных можно расставить, вызовов ещё нет. ## Этап B — проступки и кабинет ### Память На человеке **короткий список** недавних проступков (ваниль: несколько последних, потолок в `BehaviorDef`, старые вытесняются). Запись: вид (ссора / драка / выговор / …), когда (игровые часы или день+слот), опционально id второго участника. Не шкала. Писать при содержательном событии (тот же шов, что мнения), не каждый тик. Карточка ученика (вкладка «Сейчас» или рядом) показывает список. HTTP через мейлбокс. ### Вызов — только авто Игрок не жмёт. Триггер из уже живых фактов: обрыв драки сотрудником, выговор учителя, при необходимости грубый срыв с политикой речи — веса и пороги в `BehaviorDef`, не `if` по фамилии. Состояние «вызван» — **временное** (флаг / обязанность), пока не дошёл, не отбыл приём и не Sorвался день. Без долгой шкалы «дисциплина». ### Путь и очередь Кабинет — `PrincipalsOffice` (уже в `core`). Вызванный идёт обычной ходьбой. - Директор занят приёмом или отсутствует → очередь: ждут в **коридоре** у связанного узла (ребро карты к кабинету), не толпятся внутри. - В кабинете — **один** на приём. Очередь FIFO по id вызова (детерминизм: стабильный порядок). - Приём — короткое действие (выговор / разговор), мнение о директоре падает, проступок может дописаться; затем ученик свободен (обязанность урока снова тянет). - Skip пустого времени не оставляет вечный «вызван» без разрешения: утро сбрасывает зависшее или доигрывает по правилу в фазе. Директор без найма: вызов не стартует (или гаснет) — порог в данных, не паника. Тост info: кого вызвали (через `EventDef`). Протокол присутствия: действие / узел достаточно; отдельное поле «очередь» в кадре — только если без него UI врёт. Версию сокета бампит **коммит фазы**, не этот документ. После этапа школа целая без собраний: драки гонят к директору, очередь видна в коридоре. ## Этап C — родительские собрания Только **ИИ классного**, редко. Условия (числа в `BehaviorDef`): - у класса есть классный; - рабочий день, после **последнего** урока этого класса; - классный сегодня в школе; - бросок редкости от сида класса и дня. Классный остаётся в кабинете класса (homeroom). Часть родителей учеников класса приходит: получают место (двор → путь → кабинет), как обычная ходьба. Не 100% семей — доля и «кто» из сида. Учитель-родитель этого класса, если уже в школе, может войти в собрание без второго человека. Собрание — действие/кружок ограниченной длины; мнения семья↔классный слегка двигаются; тост info. После — родители уходят с карты (снова «вне школы»), классный свободен. Игрок собрание не назначает и не отменяет. После этапа школа целая целиком по срезу. ## Поток данных | Что | Где | | --- | --- | | `classTeacherId` | ростер / сейв; HTTP Управление | | Список проступков | на человеке; сейв; карточка HTTP | | Очередь вызовов | состояние школы на потоке воркера; не клиент | | Выбор «вызвать» / «собрание» | `HSchool.Ai` + адаптер симуляции | | Ходьба родителей | те же узлы и `travelMinutes`, что у всех | | Тосты | `EventDef` + доска уведомлений среза 11 | | Назначение классного | намерение HTTP → мейлбокс (инвариант 3, 7) | Инвариант 1: клиент не решает, кого вызвать. Инвариант 4: симуляция не знает тосты и ASP.NET. ## Где живёт код Нового проекта нет. | Что | Куда | | --- | --- | | Поля `BehaviorDef`, триггеры, потолки списка | `HSchool.Content` + JSONC `core` | | `SchoolClass` + классный | `HSchool.People` + сейв | | Обязанность вызова, очередь, собрание | `HSchool.Ai` + адаптер в `HSchool.Simulation` | | HTTP назначение, карточка проступков | `HSchool.Server` + клиент Управление / карточка | | `EventDef` вызова и собрания | `core` + шов среза 11 | | Присутствие | уже есть; бамп протокола только если нужен новый статус | ## Советы, которые стоит принять сразу - Не заводить `PositionDef` «классный» — слот на классе, как предметы у учителя. - Не телепортировать к директору и не пихать очередь внутрь кабинета. - Не давать игроку кнопку вызова: согласие на «только авто». - Не шкалу дисциплины рядом со списком — два представления одной идеи путают. - Родитель на карте только на время собрания (этот срез), не «живёт в школе». - Очередь и вызовы считает поток школы; HTTP их не трогает. - Редкость собраний — данные, не магическая константа в UI. ## Заведомо не сейчас - Кнопка «вызвать к директору» / «назначить собрание». - Оценки и журнал — [`grades.md`](../13-grades/grades.md); болезни — [`health.md`](../14-health/health.md). - Вызов одного родителя, травмы драки — [`fallout.md`](../15-fallout/fallout.md). - Завуч, рассадка, настроение-нужда. - Календарь собраний на четверть. ## Зафиксировано этим разговором | Тема | Решение | | --- | --- | | Форма | Именованный срез 12, не off-queue | | Вызов | Только авто; игрок не жмёт | | Поведение | Временный «вызван» + короткий список недавних проступков | | Классный | Только из учителей; Управление | | Собрание | Только ИИ классного, редко, после последнего урока класса | | Родители / вызов | Реально ходят по карте; у директора очередь, ждут в коридоре | | Ваниль | `core`, не отдельный пак | | Стоп | После A — классные; после B — кабинет без собраний | | Протокол | Бамп только если фазе нужен новый статус присутствия | | Оценки / шкала дисциплины | Не в срезе | | Роль игрока | Менеджер / симулятор бога: рамка школы, не приказы юнитам |