# Журнал ревью Сводка: [`../reviewed.md`](../reviewed.md). Индекс среза: [`README.md`](README.md). ## Срез 4. Расписание — перепроверка - **Фазы:** 14–17 - **Проверен на:** `5a049d4`, 2026-08-20 - **Пути:** `src/HSchool.Schedule`, `src/HSchool.Content` (каркас дня, каникулы, `SubjectDef.room`), `src/HSchool.Simulation/SchoolTimetables.cs`, `src/HSchool.Server/Api/TimetableEndpoints.cs`, `src/HSchool.Server/Api/TimetableModels.cs`, `src/HSchool.Server/Game/SchoolWorker.Mailbox.cs` (пин), `src/HSchool.Server/Game/SchoolWorker.Persist.cs` (сейв и перестроение), `src/HSchool.Server/Game/SchoolWorker.Tick.cs` (`PeopleChanged` + `TimetableDirty`), `src/HSchool.Client/src/ui/timetableGrid.ts`, `src/HSchool.Client/src/ui/gameScreen.ts`, `tests/HSchool.Schedule.Tests`, `tests/HSchool.Content.Tests/CalendarTests.cs`, `tests/HSchool.Content.Tests/LunchBreakTests.cs`, `tests/HSchool.AppHost.Tests/TimetableApiTests.cs`, `src/HSchool.Client/src/ui/timetableGrid.test.ts` - **Итог:** перепроверка после дрейфа с `bdb1253`; обещания фаз 14–17 целы; дописаны тесты фильтров `GET` и `personTimetableQuery` Что подтверждено: - Календарь: суббота, каникулы и ночь — «вне учебного дня»; 10:20 вторника — третий урок; шестидневка; зима через 1 января. Физкультура в спортзале. Обеденные смены в каркасе дня (младшие после 3-го, старшие после 4-го). - Планировщик: все шесть тестов фазы 15 на месте; запреты Arch/ASP.NET/`DateTime.Now` живут в `LayerBoundaryTests` (срез 10), не в `Schedule.Tests`. - Перестроение только при `PeopleChanged` + `TimetableDirty`, не по тику — после раскола воркера это `SchoolWorker.Tick.cs`. `GET /timetable` читает снимок; пин требует владельца (срез 8) и идёт через `TaskCompletionSource`. `Reload_RestoresLockedLessons`. - Сетка, закрепление, тексты отказа, скобки в дереве из присутствия (ещё и с числом людей), личное расписание: учитель `?personId=`, ученик `?classId=`, родитель без сетки. Всё через `t(...)`. - Занятость узла в протоколе v7 живёт в кадре `Presence`, не в снимке карты — фаза 19. Дописано: - `TimetableApiTests.GetTimetable_ClassAndPersonFilters_NarrowTheLessons` — `?classId=` и `?personId=` сужают уроки; это обещание фазы 16 без отдельного теста. - `personTimetableQuery`: staff → `personId`, ученик → `classId`, родитель не staff → `null`. - Закреплённая ячейка несёт класс `timetable__cell--locked` и `title` из `t('timetableLocked')`. Исправлено: - Комментарий у `TimetableGrid` всё ещё писал, что занятость живёт в снимке карты. - `Saturday_HasNoOccupancyOnTheMap` не проверял занятость — переименован в `Saturday_StillStoresTheWeekTable` (пустой стол в выходной уже в `TimetableClockTests`). Открыто: - `GET /api/catalog` по-прежнему отдаёт каркас дня без `lunchBreaks` (только `longBreakAfter`). Сетке смены не нужны; молча расширять HTTP ревью не стало. ## Срез 4. Расписание - **Фазы:** 14–17 - **Проверен на:** `bdb1253`, 2026-08-20 - **Пути:** `src/HSchool.Schedule`, `src/HSchool.Content` (каркас дня, каникулы, `SubjectDef.room`), `src/HSchool.Simulation/SchoolTimetables.cs`, `src/HSchool.Server/Api/TimetableEndpoints.cs`, `src/HSchool.Server/Game/SchoolWorker.cs` (пин, перестроение), `src/HSchool.Client/src/ui/timetableGrid.ts`, `src/HSchool.Client/src/ui/gameScreen.ts`, `tests/HSchool.Schedule.Tests`, `tests/HSchool.Content.Tests/CalendarTests.cs`, `tests/HSchool.Content.Tests/LunchBreakTests.cs`, `tests/HSchool.AppHost.Tests/TimetableApiTests.cs`, `src/HSchool.Client/src/ui/timetableGrid.test.ts` - **Итог:** обещания фаз 14–17 целы; дописан тест на коды отказа пина; две строки дизайна помечены как отменённые срезом 5 Что подтверждено: - Календарь: суббота, каникулы и ночь — «вне учебного дня»; 10:20 вторника — третий урок; шестидневка; зима через 1 января. Физкультура в спортзале. Обеденные смены в каркасе дня (младшие после 3-го, старшие после 4-го). - Планировщик: четыре запрета, класс не влезает в меньший кабинет, без Arch/ASP.NET/`DateTime.Now`. - Перестроение только при `PeopleChanged` + `TimetableDirty`, не по тику. `GET /timetable` читает снимок, пин — `TaskCompletionSource`. `Reload_RestoresLockedLessons`. - Сетка, закрепление, тексты отказа (`pin-rejected` / `no-teacher` / `unknown-lesson`), скобки в дереве из присутствия, личное расписание в карточке. Всё через `t(...)`. - Занятость узла в протоколе v7 живёт в кадре `Presence`, не в снимке карты — фаза 19. Дописано: - `TimetableApiTests.PinAndUnpinRefusals_CarryTheDocumentedCodes` — `no-teacher`, `unknown-class`, `unknown-subject`, `unknown-room`, `unknown-lesson`, `invalid-query`. Исправлено: - В `../../design/04-schedule/schedule.md` «панель локации из расписания» и «люди находятся по расписанию» помечены как отменённые срезом 5.