Files
Leonid PershinandCursor 362244fcbd
ci / server (push) Failing after 3m43s
ci / client (push) Successful in 21s
Register slice 15 fallout and clarify manager role in office design.
EOF

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-21 11:55:09 +03:00

192 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Кабинет директора и классный
Договорённость на срез после событий и общения, не текущий код.
Люди: [`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 — кабинет без собраний |
| Протокол | Бамп только если фазе нужен новый статус присутствия |
| Оценки / шкала дисциплины | Не в срезе |
| Роль игрока | Менеджер / симулятор бога: рамка школы, не приказы юнитам |