Update design documentation for inventory and climate phases, clarify staffing test results, and add new presence test for hiring and assigning a teacher during lessons.
This commit is contained in:
+109
-6
@@ -142,14 +142,16 @@
|
||||
## Срез 2. Люди
|
||||
|
||||
- **Фазы:** 5–9
|
||||
- **Проверен на:** `5a00ad7`, 2026-08-19 (первичная проверка — `5cd5a6d`)
|
||||
- **Проверен на:** `bdb1253`, 2026-08-20 (первичная проверка — `5cd5a6d`; предыдущая перепроверка — `5a00ad7`)
|
||||
- **Пути:** `src/HSchool.People`, `src/HSchool.Content/PeopleDefs.cs`,
|
||||
`src/HSchool.Simulation/RosterSpawner.cs`, `src/HSchool.Simulation/School.cs`,
|
||||
`src/HSchool.Server/Api/SchoolEndpoints.cs`, `src/HSchool.Server/Game/PersonCardReader.cs`,
|
||||
`src/HSchool.Server/Game/SchoolWorker.cs`,
|
||||
`src/HSchool.Client/src/ui/peoplePanel.ts`, `src/HSchool.Client/src/ui/personCard.ts`,
|
||||
`tests/HSchool.People.Tests`, `tests/HSchool.Content.Tests/PeopleDefTests.cs`,
|
||||
`tests/HSchool.Simulation.Tests/PeopleInSchoolTests.cs`,
|
||||
`tests/HSchool.AppHost.Tests/PeopleApiTests.cs`
|
||||
`tests/HSchool.AppHost.Tests/PeopleApiTests.cs`,
|
||||
`tests/HSchool.AppHost.Tests/SchoolSeedTests.cs`
|
||||
- **Итог:** исправлен один тест, который падал на чистом клоне, укреплён второй, дописан один;
|
||||
расхождение с дизайном одно и то же, что в срезе 1 (раскладка оболочки менеджера)
|
||||
|
||||
@@ -234,16 +236,57 @@
|
||||
- Исправления среза 2 (карточка семьи, сортировка по фамилии, состав после набора и перезапуска)
|
||||
проходят на новом коде.
|
||||
|
||||
### Перепроверка на `bdb1253`, 2026-08-20
|
||||
|
||||
Дрейф после `5a00ad7` — свой сид школы (фаза 26), золотые ростеры (25), тесты панели (28) и
|
||||
данные поведения. Обещания фаз 5–9 целы.
|
||||
|
||||
Что подтверждено повторно:
|
||||
|
||||
- **Фаза 5.** Все пункты списка в `PeopleDefTests` (10/10): разбор, наследование, патч черты,
|
||||
неизвестная ссылка, склонение и таблица, мод со своим набором.
|
||||
- **Фаза 6.** Все шесть тестов генератора на месте, плюс `NewSchool_HasNoStaff` (фаза 11 не
|
||||
отменяет детерминизм и заполнение мест). `Assembly_DoesNotReferenceArchAspNetOrSockets` и
|
||||
`Sources_DoNotUseWallClock` зелёные. Неполные семьи 5–10% — `ReviewFixTests`.
|
||||
- **Фаза 7.** Одиннадцать кабинетов, сущности в `World`, `PersistPeople` только при изменении
|
||||
состава. Штат при создании пуст — это фаза 11, тест обновлён (`LeaveJobsEmpty`).
|
||||
- **Фаза 8.** Список с опубликованного снимка (`FindPeople`), карточка через `TaskCompletionSource`.
|
||||
Пять API-тестов плюс клиентские фильтры/пейджер (`peoplePanel.test.ts` 3/3). Вкладка, не нижний ряд.
|
||||
- **Фаза 9.** Выпуск старшей имеющейся, вместимость, семьи через поколения, reload после набора
|
||||
(`ReloadAfterTheYearlyIntake_RestoresTheNewComposition`).
|
||||
- **Сид.** Больше не `school.Id`. Новая школа берёт `_createSeed`, сейв — `loaded.Seed`; запасной
|
||||
`school.Id` только если `people.json` нет. `Card_IncludesFamilyAndLiveNeeds` передаёт `seed: 1`.
|
||||
`SchoolSeedTests`: тот же сид — те же люди, два без сида — разные, reload хранит выпавший.
|
||||
|
||||
Исправлено:
|
||||
|
||||
- В `design/people.md` скорость нужд всё ещё была «ноль» (нарратив, совет и таблица), хотя срез 5
|
||||
это отменил. Помечено как отменённое со ссылкой на `ai.md`, по тому же шаблону, что расписание.
|
||||
Код не трогался.
|
||||
|
||||
Закрыто из прошлого прохода:
|
||||
|
||||
- **Раскладка оболочки.** «Открыто» выше больше не действует: `design/people.md` и фаза 8 уже
|
||||
записаны под вкладку рядом с картой. Решение принято в том же ходе, что отказ от панели событий.
|
||||
|
||||
Замечено рядом:
|
||||
|
||||
- «Заведомо не сейчас» в `people.md` всё ещё говорит «должности закрываются генератором» —
|
||||
отменено срезом 3. Не переписывал исторический список стопов.
|
||||
|
||||
People 34, PeopleDef 10, PeopleInSchool 7, PeopleApi+SchoolSeed 13, клиентская панель 3/3.
|
||||
|
||||
## Срез 3. Штат
|
||||
|
||||
- **Фазы:** 10–13
|
||||
- **Проверен на:** `5a00ad7`, 2026-08-19 (первичная проверка — `21d79cb`)
|
||||
- **Проверен на:** `bdb1253`, 2026-08-20 (первичная проверка — `21d79cb`; предыдущая перепроверка — `5a00ad7`)
|
||||
- **Пути:** `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`
|
||||
`tests/HSchool.AppHost.Tests/StaffingApiTests.cs`,
|
||||
`src/HSchool.Client/src/ui/managementPanel.test.ts`
|
||||
- **Итог:** дописано 3 теста (один из них — прямо требуемый фазой 12 и отсутствовавший),
|
||||
дополнен `docs/protocol.md`; расхождений кода с дизайном не найдено
|
||||
|
||||
@@ -335,16 +378,48 @@
|
||||
как штатный исход. Это правильно: с пулом в 32 человека нанять всех и остаться в пределах суммы
|
||||
уже нельзя.
|
||||
|
||||
### Перепроверка на `bdb1253`, 2026-08-20
|
||||
|
||||
Дрейф после `5a00ad7` — `teachersShort` (фаза 25), свой сид, удостоверение пака. Обещания фаз 10–13
|
||||
целы; новых тестов не дописывал, расхождений с `design/staffing.md` нет.
|
||||
|
||||
Что подтверждено повторно:
|
||||
|
||||
- **Фаза 10.** `PETeacher` нет, кабинеты без учительской должности, места через `defaultSeats`,
|
||||
редактор показывает у homeroom одно поле «мест». `Subject_UnknownSkill_FailsTheCatalog`,
|
||||
стартовая дата 31 марта 2012.
|
||||
- **Фаза 11.** Все шесть тестов пула на месте (`SameSeedAndWeek`, частичное обновление, 50 недель,
|
||||
сильный просит больше, пустой штат, соискатель вне ростера). Пул 32, reload хранит ставки.
|
||||
- **Фаза 12.** `Hire_TwoPeopleAtThreeAndSevenThousand_RejectsTheThird` на фикстуре 10 000.
|
||||
`AssigningPastTheCap_IsRejectedWithTheNumbers` на API. `GET /staffing` читает снимок,
|
||||
наём/назначение — `TaskCompletionSource`. `MaxWeeklyHours` не запрещает назначение
|
||||
(`SubjectNeedingMoreHoursThanOnePersonCarries_StaysUncovered`). Ветка `if/else` вокруг предела
|
||||
убрана.
|
||||
- **Фаза 13.** Деньги, непокрытые, пул, штат, назначение с карточки, всё через `t(...)`.
|
||||
Отказ по пределу текстом — `managementPanel.test.ts`.
|
||||
- **Покрытие.** `PrimarySchool` на ванили требует трёх учителей (`TeachersShort == 3` в API и в
|
||||
`PrimarySchool_OnVanillaMap_NeedsThreeTeachers_AndASecondDoesNotCloseIt`). Это фаза 25, не
|
||||
ломает фазу 12: список непокрытых был и раньше, появилось число.
|
||||
|
||||
Замечено рядом:
|
||||
|
||||
- `people.md` «Заведомо не сейчас» всё ещё говорит, что должности закрывает генератор — то же, что
|
||||
в срезе 2. Исторический стоп среза 2, не трогал.
|
||||
|
||||
Staffing+ApplicantPool 18, Content 3, StaffingApi 9.
|
||||
|
||||
## Срез 4. Расписание
|
||||
|
||||
- **Фазы:** 14–17
|
||||
- **Проверен на:** `5a00ad7`, 2026-08-19 (первичная проверка — `21d79cb`)
|
||||
- **Проверен на:** `bdb1253`, 2026-08-20 (первичная проверка — `21d79cb`; предыдущая перепроверка — `5a00ad7`)
|
||||
- **Пути:** `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.AppHost.Tests/TimetableApiTests.cs`
|
||||
`tests/HSchool.Content.Tests/LunchBreakTests.cs`,
|
||||
`tests/HSchool.AppHost.Tests/TimetableApiTests.cs`,
|
||||
`src/HSchool.Client/src/ui/timetableGrid.test.ts`
|
||||
- **Итог:** дописан один тест на пять непокрытых кодов отказа, поправлены две устаревшие строки
|
||||
дизайна; расхождений кода с принятыми решениями нет
|
||||
|
||||
@@ -413,6 +488,34 @@
|
||||
Планировщик, каркас дня и API расписания не менялись; дописанный в прошлый проход тест на коды
|
||||
отказа пина проходит.
|
||||
|
||||
### Перепроверка на `bdb1253`, 2026-08-20
|
||||
|
||||
Дрейф после `5a00ad7` — обеденные смены в каркасе дня (`SchoolDay` / `CalendarDefs`) и сид/дамп в
|
||||
воркере. Планировщик и API расписания не менялись. Обещания фаз 14–17 целы; тестов не дописывал.
|
||||
|
||||
Что подтверждено повторно:
|
||||
|
||||
- **Фаза 14.** Суббота, каникулы и ночь — «вне учебного дня»; 10:20 вторника — третий урок;
|
||||
шестидневка делает субботу рабочей; зима через 1 января. Физкультура в спортзале.
|
||||
Обеденные смены уже стоят в `design/schedule.md`: младшие после 3-го, старшие после 4-го,
|
||||
обе перемены длинные (`LunchBreakTests`).
|
||||
- **Фаза 15.** Все шесть тестов планировщика на месте, плюс самопроверка сборки без Arch/ASP.NET
|
||||
и `DateTime.Now`.
|
||||
- **Фаза 16.** Перестроение только при `PeopleChanged` + `TimetableDirty`, не по тику.
|
||||
`GET /timetable` читает снимок, пин — `TaskCompletionSource`. `Reload_RestoresLockedLessons`,
|
||||
`PinAndUnpinRefusals_CarryTheDocumentedCodes`.
|
||||
- **Фаза 17.** Сетка, закрепление, тексты отказа — `timetableGrid.test.ts` (pin-rejected /
|
||||
no-teacher / unknown-lesson). Всё через `t(...)`.
|
||||
|
||||
Замечено рядом:
|
||||
|
||||
- `GET /api/catalog` по-прежнему отдаёт каркас без `lunchBreaks` (только `longBreakAfter`).
|
||||
Сетке расписания смены не нужны — они для решений. Молча расширять HTTP ревью не стало.
|
||||
- `OpeningASchoolDuringAMathLesson_...` с этой перепроверки падает и в одиночку — см. срез 1;
|
||||
это явка, не раскладка часов.
|
||||
|
||||
Calendar+обеды 20, планировщик 9, TimetableApi 6.
|
||||
|
||||
## Срез 5. Жизнь школы
|
||||
|
||||
- **Фазы:** 18–21
|
||||
|
||||
Reference in New Issue
Block a user