Merge phase 27 save format and dump.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -14,25 +14,25 @@
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] Загрузка читает `Format`: новее своего — школу не стартовать, файл не трогать, в лог. Как с
|
||||
- [x] Загрузка читает `Format`: новее своего — школу не стартовать, файл не трогать, в лог. Как с
|
||||
пропавшей папкой мода
|
||||
- [ ] Формат старее своего — явный шов для апгрейда: сегодня пустой, но названный и с комментарием
|
||||
- [ ] `GET /api/dev/schools/{id}/dump` — ростер, присутствие, расписание и нужды одним JSON. За тем
|
||||
- [x] Формат старее своего — явный шов для апгрейда: сегодня пустой, но названный и с комментарием
|
||||
- [x] `GET /api/dev/schools/{id}/dump` — ростер, присутствие, расписание и нужды одним JSON. За тем
|
||||
же переключателем, что и `reload-schools`, и никогда в проде по умолчанию
|
||||
- [ ] Дамп читает опубликованные снимки и мейлбокс, а не лезет в `World` мимо работника
|
||||
- [ ] Раздел «Things that will bite you» в `AGENTS.md` пополняется тем, что нашло ревью: сид школы
|
||||
- [x] Дамп читает опубликованные снимки и мейлбокс, а не лезет в `World` мимо работника
|
||||
- [x] Раздел «Things that will bite you» в `AGENTS.md` пополняется тем, что нашло ревью: сид школы
|
||||
был её id; тесты хоста делят один сервер и одну папку сейвов, поэтому начинают с очистки;
|
||||
на паузе кадры присутствия не приходят вовсе
|
||||
- [ ] Классы тестов вокруг Arch перестают идти параллельно: `HSchool.Simulation.Tests` получает
|
||||
- [x] Классы тестов вокруг Arch перестают идти параллельно: `HSchool.Simulation.Tests` получает
|
||||
запрет параллельности, потому что нативная память Arch этого не любит
|
||||
- [ ] `docs/protocol.md` описывает дамп в разделе дев-ручек
|
||||
- [x] `docs/protocol.md` описывает дамп в разделе дев-ручек
|
||||
|
||||
## Тесты, без которых фаза не закрыта
|
||||
|
||||
- [ ] Сейв с `format` больше текущего оставляет школу незапущенной и файл нетронутым
|
||||
- [ ] Сейв текущего формата грузится как раньше
|
||||
- [ ] Дамп отдаёт людей, их узлы и текущее расписание для живой школы
|
||||
- [ ] Дамп неизвестной школы — `404`
|
||||
- [x] Сейв с `format` больше текущего оставляет школу незапущенной и файл нетронутым
|
||||
- [x] Сейв текущего формата грузится как раньше
|
||||
- [x] Дамп отдаёт людей, их узлы и текущее расписание для живой школы
|
||||
- [x] Дамп неизвестной школы — `404`
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
|
||||
@@ -111,5 +111,5 @@
|
||||
| [24. Числа поведения](24-behavior-numbers.md) | 🔄 | Веса целей в `BehaviorDef`, а не в коде |
|
||||
| [25. Золотые файлы](25-golden-fixtures.md) | ✅ | Отпечаток ростера, старый сейв, кривая голода, нехватка учителей |
|
||||
| [26. Свой сид](26-school-seed.md) | 🔄 | Состав школы перестаёт зависеть от порядка создания |
|
||||
| [27. Версия сейва и дамп](27-serviceability.md) | 🔄 | Формат читается, внутрь школы можно заглянуть |
|
||||
| [27. Версия сейва и дамп](27-serviceability.md) | ✅ | Формат читается, внутрь школы можно заглянуть |
|
||||
| [28. Тесты экранов](28-screen-tests.md) | ⬜ | DOM-окружение и логика клиента под тестом |
|
||||
|
||||
@@ -454,6 +454,57 @@ rebuilds the rest around it. Same success payload as GET timetable.
|
||||
Query: `classId`, `subject`, `day`, `period`. Drops that lock and rebuilds. Unknown lock is
|
||||
`404` `unknown-lesson`.
|
||||
|
||||
## Dev endpoints
|
||||
|
||||
These exist only when `HSchool:AllowSaveReload` is true (headless AppHost tests). They are never
|
||||
mapped in production by default. Same switch as `POST /api/dev/reload-schools`.
|
||||
|
||||
### `GET /api/dev/schools/{id}/dump`
|
||||
|
||||
Roster, live presence, live needs and the timetable as one JSON. The roster and lesson table come
|
||||
from the published snapshots; nodes and needs go through that school's mailbox — HTTP does not
|
||||
read the `World`. Unknown `{id}` is `404` `unknown-school`.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Гимназия №14",
|
||||
"gameTime": "2012-04-03T10:20:00Z",
|
||||
"running": true,
|
||||
"people": [
|
||||
{
|
||||
"id": "f3.p1",
|
||||
"fullName": "Иванова Ольга Михайловна",
|
||||
"nodeId": "classroom-101",
|
||||
"needs": { "Hunger": 0.92, "Toilet": 1, "Social": 0.8, "Sleep": 1 }
|
||||
}
|
||||
],
|
||||
"now": [
|
||||
{
|
||||
"classId": "c5A",
|
||||
"subject": "Mathematics",
|
||||
"teacherId": "f3.p1",
|
||||
"roomId": "classroom-101",
|
||||
"day": 1,
|
||||
"period": 3
|
||||
}
|
||||
],
|
||||
"lessons": [
|
||||
{
|
||||
"classId": "c5A",
|
||||
"subject": "Mathematics",
|
||||
"teacherId": "f3.p1",
|
||||
"roomId": "classroom-101",
|
||||
"day": 1,
|
||||
"period": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`nodeId` is null when the person is off campus. `now` is the lessons occurring at `gameTime`
|
||||
(empty on a break, night, weekend or holiday). `lessons` is the published table.
|
||||
|
||||
## WebSocket message ids
|
||||
|
||||
Client-to-server ids live in `0x00–0x7F`, server-to-client ids in `0x80–0xFF`, so a misrouted
|
||||
|
||||
Reference in New Issue
Block a user