# Фаза 25. Золотые файлы и мелкие долги ## Зависимости Нет. Можно вести параллельно с 22–24. ## Зачем Две регрессии сейчас ловятся только глазами: молчаливая смена генерации людей и сейв, который перестал грузиться после нового поля. Обе дешёвы в защите и дороги в разборе постфактум. ## Задачи - [x] Отпечаток ростера файлом в фикстурах: фиксированные сид, карта, набор имён и родной язык - [x] Тест печатает **первую** несовпавшую строку, а не «строки различаются» - [x] Правило записано рядом с фикстурой: отпечаток обновляется в том же коммите, что и генерация, и коммит объясняет, что поменялось - [x] Файл сейва текущего формата в фикстурах хоста; тест поднимает из него школу - [x] Рядом с ним — файл сейва **без** новых полей, чтобы «отсутствующее поле имеет разумное значение» проверялось, а не подразумевалось - [x] Форма голодного дня закрепляется тестом: приходят сытыми, к своей смене около 0.4, уходят голодными, к утру снова полны. Числа подобраны замером и сейчас ничем не защищены - [x] `uncovered` в staffing говорит, скольких учителей не хватает предмету - [x] Клиент показывает это число в списке непокрытых, через `t(...)` ## Тесты, без которых фаза не закрыта - [x] Отпечаток ростера совпадает с файлом - [x] Школа поднимается из сохранённого файла: те же люди, то же время, тот же штат - [x] Сейв без поля родного языка грузится и не перетасовывает набор - [x] Кривая голода за учебный день держится в заявленных границах - [x] `PrimarySchool` на ванильной карте требует трёх учителей, и ответ это говорит - [x] Назначение второго учителя уменьшает нехватку, но не закрывает её ## Критерий готовности - Изменить порядок бросков в генераторе — золотой тест краснеет - Добавить поле в сейв — старый файл по-прежнему грузится - `dotnet test` и клиентские `npm test` / `run build` проходят ## Стоп Не превращать золотой файл в снимок всего мира: отпечаток должен читаться человеком.