# Журнал ревью Сводка: [`../reviewed.md`](../reviewed.md). Индекс среза: [`README.md`](README.md). ## Срез 3. Штат - **Фазы:** 10–13 - **Проверен на:** `bdb1253`, 2026-08-20 - **Пути:** `src/HSchool.People/Staffing.cs`, `src/HSchool.People/ApplicantPool.cs`, `src/HSchool.Content/SubjectDef` и `defs/staffing`, `src/HSchool.Server/Api/SchoolEndpoints.cs` (staffing/hire/subjects), `src/HSchool.Server/mods/core/defs/{subjects,positions,rooms,staffing,traits}`, `src/HSchool.Client/src/ui/managementPanel.ts`, `src/HSchool.Client/src/net/api.ts`, `tests/HSchool.People.Tests/{StaffingTests,ApplicantPoolTests}.cs`, `tests/HSchool.AppHost.Tests/StaffingApiTests.cs`, `src/HSchool.Client/src/ui/managementPanel.test.ts` - **Итог:** обещания фаз 10–13 целы; дописаны 3 теста; `docs/protocol.md` дополнен `?lang=` Что подтверждено: - `PETeacher` нет; кабинеты без учительской должности; места через `defaultSeats`. Неизвестный навык в предмете роняет каталог. Стартовая дата 31 марта 2012. - Пул: детерминизм по сиду и неделе, частичное обновление, устойчивый размер, «сильный просит больше», пустой штат, соискатель вне ростера до найма. Пул 32. - Фонд оплаты, деление часов, пол ставки, покрытие. `GET /staffing` читает снимок, наём и назначение — `GameCommand` с `TaskCompletionSource`. `MaxWeeklyHours` не запрещает назначение, а оставляет предмет непокрытым. `PrimarySchool` на ванили требует трёх учителей (`teachersShort`). - Экран: деньги, непокрытые, пул, штат, назначение с карточки, отказ по пределу текстом, всё через `t(...)`. - Полностью укомплектованная школа влезает в 100 000 впритык (запас 5–13%). Нанять пул целиком без назначений предела достигает. Раскладка «каждому все предметы» — самая дешёвая, не «укомплектованная школа». Дописано: - `StaffingApiTests.AssigningPastTheCap_IsRejectedWithTheNumbers` — фаза 12 требовала API-тест на отказ по пределу; единственное место было написано через `if (over.StatusCode == Conflict)` и проходило при любом исходе. - `ApplicantPoolTests.ConfidentTraits_AskForMoreAndQuietOnesForLess` - В `AssignAndUnassign_HonourTheCap_AndReloadKeepsAssignments` — тот же пул с теми же ставками после перезапуска. Исправлено: - `docs/protocol.md` не упоминал `?lang=` у hire/subjects, хотя клиент его шлёт. ## Перепроверка среза 3. Штат - **Фазы:** 10–13 - **Проверен на:** `cf1403e`, 2026-08-20 - **Пути:** `src/HSchool.People/Staffing.cs`, `src/HSchool.People/ApplicantPool.cs`, `src/HSchool.Content/SubjectDef` и `defs/staffing`, `src/HSchool.Server/Api/SchoolEndpoints.cs` (staffing/hire/subjects), `src/HSchool.Server/mods/core/defs/{subjects,positions,rooms,staffing,traits}`, `src/HSchool.Client/src/ui/{managementPanel,mapEditor,applicantsDialog}.ts`, `src/HSchool.Client/src/net/api.ts`, `docs/protocol.md` (staffing), `tests/HSchool.People.Tests/{StaffingTests,ApplicantPoolTests}.cs`, `tests/HSchool.AppHost.Tests/StaffingApiTests.cs`, `tests/HSchool.Content.Tests/VanillaCoreTests.cs`, `src/HSchool.Client/src/ui/{managementPanel,mapEditor}.test.ts` - **Итог:** перепроверка после дрейфа с `bdb1253`. Обещания фаз 10–13 целы. Дописаны 3 теста; в `protocol.md` у соискателя — все навыки, не «три сильных». Что подтверждено: - `PETeacher` нет; кабинет — `defaultSeats`, без учительской должности; слоты у столовой, медкабинета, кабинета директора и библиотеки. Неизвестный навык роняет каталог. Старт — суббота 31 марта 2012. `GET /api/catalog` отдаёт предметы. - Пул 32, детерминизм по сиду и неделе, частичное обновление, устойчивый размер, навыки и черты в цене часа, пустой штат при полных местах, соискатель вне ростера до найма. - Фонд = цена часа × нагрузка, не ниже ставки; часы делятся; `MaxWeeklyHours` не запрещает назначение. `GET /staffing` читает снимок; наём и назначение — мейлбокс с `TaskCompletionSource`. Предел 100 000 проверяется в момент действия. `PrimarySchool` на ванили — трое (`teachersShort`). - Экран: Обзор / Управление, строка денег, непокрытые, окно пула, штат, назначение с карточки, отказ по пределу текстом, `t(...)`. Дрейф с прошлой проверки (не регрессия среза 3): - `ApplicantPool` берёт имена страны, не набор имён; новым соискателям назначается ориентация. - Во «Управлении» рядом вкладка правил одежды и речи; пул по-прежнему отдельным окном. Дописано: - `VanillaCoreTests` — у столовой, медкабинета, кабинета директора и библиотеки слоты на месте. - `mapEditor.test.ts` — у кабинета поле «мест», у столовой именованные слоты, не доска. - `ManagementPanel` — строка денег; назначение и снятие предмета с карточки нанятого. Исправлено: - `docs/protocol.md` всё ещё писал, что у соискателя в `GET /staffing` «три сильных навыка»; API давно отдаёт все навыки (окно пула сравнивает целиком).