# Нарезка проектов (целевая) Сейчас в коде: `Protocol ← Server → Simulation → People → Content`. Каталог не в Simulation (рядом с Arch) и не в Server (рядом с Kestrel) — парсер JSONC и проверка графа не знают, что такое tick. ## Зависимости ``` Protocol — ни на кого из игровых проектов (только байты) Content — ни на Protocol, ни на Simulation, ни на ASP.NET People → Content (defs, карта, склонения; без Arch и хоста) Simulation → People, Content (ростер в World; без HTTP) Server → Protocol, Simulation, People, Content Client — своя сторона Protocol (TS) + HTTP ``` Клиент по-прежнему не ссылается на C#-проекты. ## Кто чем владеет | Проект | Да | Нет | | --- | --- | --- | | **HSchool.Content** | Типы def, JSONC-загрузчик, наследование, патчи, слияние локалей, граф карты, валидация связности | Arch, часы, HTTP, потоки, пути `mods/` с диска хоста | | **HSchool.People** | Генерация ростера: семьи, классы, тело/навыки/черты из каталога и сида | Arch, ASP.NET, сокеты, `DateTime.Now`, файлы сейва | | **HSchool.Simulation** | `School`, `GameClock`, Arch `World`, тик, применение раскладки к миру | Kestrel, сокеты, `Directory.Enumerate`, сейв-файлы | | **HSchool.Server** | Хост, супервизор, работник-поток, `mods/` и `saves/` из конфига, HTTP/WS, DTO запросов | Правила «комната должна быть связана», схема Chair | | **HSchool.Protocol** | Кадры сокета, в том числе снимок карты и locale в Hello | Имена комнат, JSONC | | **HSchool.Client** | DOM, `t()` для хрома, рисует снимок | Файлы модов, симуляция | Content принимает уже открытые потоки или список документов (сервер прочитал папки и отдал байты/пути через узкий порт вроде «вот корневые каталоги этих id»). Тогда тесты Content кормят фикстурами из `tests/`, без `appsettings`. Сейв: **форма** (часы + id модов + раскладка) собирается из типов Simulation/Content; **запись файла** — Server, и только с потока работника. ## Зачем не сваливать в Simulation Arch и фиксированный тик — про живую школу. Парсер JSONC, `defName` и проверка графа не знают, что такое tick. Их гоняют сотни раз в юните без мира. Если загрузчик сидит в Simulation, любой тест каталога тащит ECS и наоборот. ## Зачем не сваливать в Server Иначе связность карты и last-wins нельзя проверить без Aspire. Хост должен быть тонким: найти папки, сериализовать HTTP, крутить потоки. ## Тесты - `tests/HSchool.Content.Tests` — фикстуры JSONC, коллизии имён, дырявый граф, двор обязателен. - `tests/HSchool.People.Tests` — тот же сид даёт тот же ростер; места и должности заполнены. - `HSchool.Simulation.Tests` — часы, тик, «школа с таким каталогом живёт». - `HSchool.AppHost.Tests` — create с картой, рестарт, сейв на диске. Ориентир в `AGENTS.md` обновить в фазе, которая заводит проект (сейчас это фаза 3).