Implement phase 35 dress appropriateness and school rules.

Adds outfit evaluation, morning home dressing, locker-room ChangeClothes with day-log events, PE/weather AI goals, dress-rules API, and tests.
This commit is contained in:
Leonid Pershin
2026-08-20 05:16:52 +03:00
parent 5b63c72806
commit 6a0d5a9886
32 changed files with 1894 additions and 25 deletions
+16 -16
View File
@@ -14,31 +14,31 @@
## Задачи
- [ ] Оценка уместности из данных: пол, возраст, погода/утепление, `pe`, формальность,
- [x] Оценка уместности из данных: пол, возраст, погода/утепление, `pe`, формальность,
цветовые теги, длина низа. Код знает оси, пороги — defs и правила школы
- [ ] На школе хранятся правила учеников и сотрудников (форма + цвет). Дефолт: обычная,
- [x] На школе хранятся правила учеников и сотрудников (форма + цвет). Дефолт: обычная,
без яркого. Смена с экрана — фаза 37; API уже пишет «с завтра»
- [ ] «Короткая» форма: длина юбки / короткий рукав; младше порога возраста ходят в обычной
- [ ] Дома утром: мгновенно подобрать надетое под правила, погоду и сегодняшний план
- [x] «Короткая» форма: длина юбки / короткий рукав; младше порога возраста ходят в обычной
- [x] Дома утром: мгновенно подобрать надетое под правила, погоду и сегодняшний план
(учебники только сегодняшних уроков в сумке, остальное — шкафчик или дом)
- [ ] В школе: действие `ChangeClothes` в своей (м/ж) раздевалке. Снятое — в шкафчик, если
- [x] В школе: действие `ChangeClothes` в своей (м/ж) раздевалке. Снятое — в шкафчик, если
есть, иначе в сумку
- [ ] Цель «одеться к физкультуре» и «вернуться с формы» рядом с обязанностью урока; не
- [x] Цель «одеться к физкультуре» и «вернуться с формы» рядом с обязанностью урока; не
каждый тик, а по звонку / приходу
- [ ] Цель «верх не по погоде» — дойти и сменить куртку, если уже в школе
- [ ] Вместимость действия — сколько одновременно переодеваются в комнате; не путать с
- [x] Цель «верх не по погоде» — дойти и сменить куртку, если уже в школе
- [x] Вместимость действия — сколько одновременно переодеваются в комнате; не путать с
числом шкафчиков
- [ ] Игрок по-прежнему не одевает с карточки
- [x] Игрок по-прежнему не одевает с карточки
## Тесты, без которых фаза не закрыта
- [ ] Школа с «без яркого»: утром на теле нет цвета с тегом `bright`
- [ ] «Короткая» + первоклассница → обычная длина; старше порога — можно короткое
- [ ] Перед уроком физкультуры ученик идёт в свою раздевалку и надевает `pe`; после — снимает
- [ ] Мальчик не идёт в женскую раздевалку
- [ ] Без шкафчика снятое оказывается в сумке, не исчезает
- [ ] Морозным утром на теле есть `Outer`; в июле шубы на теле нет
- [ ] Смена правила через API сегодня не меняет одежду до следующего рабочего утра
- [x] Школа с «без яркого»: утром на теле нет цвета с тегом `bright`
- [x] «Короткая» + первоклассница → обычная длина; старше порога — можно короткое
- [x] Перед уроком физкультуры ученик идёт в свою раздевалку и надевает `pe`; после — снимает
- [x] Мальчик не идёт в женскую раздевалку
- [x] Без шкафчика снятое оказывается в сумке, не исчезает
- [x] Морозным утром на теле есть `Outer`; в июле шубы на теле нет
- [x] Смена правила через API сегодня не меняет одежду до следующего рабочего утра
## Критерий готовности
+28
View File
@@ -373,6 +373,34 @@ land under `saves/{id}.portraits/` and survive until the school is deleted.
`GET /api/status` includes `swarmUiConfigured` and `swarmUiConnected` (`null` when not configured)
so the client can disable generate buttons and show reachability without trying POST first.
### `GET /api/schools/{id}/dress-rules`
Student and staff dress-code pairs for the school. Unknown `{id}` is `404` `unknown-school`.
`form` is one of `regular`, `short`, `strict`. `color` is one of `noBright`, `whiteTopBlackBottom`,
`free`. When a `POST` has been accepted but not yet applied, `pendingStudents` and/or `pendingStaff`
show what takes effect on the **next work morning** (six o'clock on a weekday outside holidays) —
not immediately.
```json
{
"students": { "form": "regular", "color": "noBright" },
"staff": { "form": "regular", "color": "noBright" },
"pendingStudents": null,
"pendingStaff": null
}
```
### `POST /api/schools/{id}/dress-rules`
Queues a change for the next work morning. Either or both of `students` and `staff` may be sent;
omitted sides keep their current rule. Unknown `{id}` is `404` `unknown-school`. Unknown `form` or
`color` is `400` `unknown-form` / `400` `unknown-color`. Response body matches `GET`.
```json
{ "students": { "form": "strict", "color": "noBright" } }
```
### `GET /api/schools/{id}/staffing`
Money, uncovered subjects, the applicant pool and current staff. Reads the **published**