# Фаза 3. Каталог def и карта ## Зависимости - [Фаза 2](02-school-worker.md) — каталог и раскладка живут у работника школы ## Зачем Типы в JSONC, инстанс карты в школе, валидация связности. Без этого нечему редактировать в create. ## Задачи - [ ] Проект `HSchool.Content` (+ тесты): JSONC, defs, локали, граф карты, валидация. Не Arch, не ASP.NET - [ ] Загрузчик пачки документов (сервер потом подставит папки `mods/`) - [ ] `core` всегда первый; дальше моды по списку; повтор `defName` / ключа локали — последний победил, warning в лог - [ ] Резолв ссылок `ThingDef.actions`, слотов RoomDef после чтения всего набора - [ ] Карта-инстанс: двор (TerritoryDef) всегда есть; здания (BuildingDef), этажи (FloorDef + id), помещения, двусторонние рёбра - [ ] Валидация: неизвестный def, ребро в никуда, несвязный граф, изолированный узел - [ ] Пустая комната допустима; должности для панели — из def узла, если они там есть - [ ] Каталог замораживается на работнике при create/load; сейв хранит id модов и раскладку, не развёрнутый каталог - [ ] Нет папки мода из сейва — школу не стартовать, файл не удалять, в лог - [ ] Обновить ориентир в `AGENTS.md` (куда класть defs) - [ ] Наследование: `parent`, `abstract`, замена полей, запрет цикла и чужого вида, abstract нельзя на карту - [ ] Патчи из `patches/`: add / replace / remove по JSON Pointer; неизвестный op или нет target — ошибка каталога - [ ] Тесты Content: фикстуры JSONC, last-wins, parent/abstract, патч add в actions, связность, пустая комната, одна комната без двора — отказ ## Критерий готовности - `dotnet test` покрывает загрузчик и валидацию без хоста (`HSchool.Content.Tests`) - Ванильная раскладка `mods/core/maps/default.jsonc` проходит валидацию ## Стоп Не UI редактора. Не исполнение ActionDef. Не xpath и не новые op сверх add/replace/remove.