# Проверенные фазы «Вне очереди» Разделы ниже — отдельные проходы. Чужой раздел не затирать. ## Связность урока. Учитель, навык, тепло, учебник, дорога - **Фазы:** 48, 50–53 - **Проверен на:** `efa27ab`, 2026-08-20 - **Пути:** `src/HSchool.Ai/LessonLearning.cs`, `src/HSchool.Ai/DayPlan.cs`, `src/HSchool.Simulation/LessonLearningSystem.cs`, `src/HSchool.Simulation/OutdoorWeather.cs`, `src/HSchool.Simulation/PresenceSystem.cs`, `src/HSchool.Simulation/PersonLog.cs`, `src/HSchool.Simulation/School.cs`, `src/HSchool.Content/PeopleDefs.cs`, `src/HSchool.Content/PeopleDefValidator.cs`, `src/HSchool.Server/mods/core/defs/behavior/rules.jsonc`, `src/HSchool.Server/mods/core/localizations/ru.jsonc`, `src/HSchool.Server/mods/core/localizations/en.jsonc`, `tests/HSchool.Ai.Tests/LessonLearningTests.cs`, `tests/HSchool.Ai.Tests/WalkingTests.cs`, `tests/HSchool.Simulation.Tests/LessonTeacherPresentTests.cs`, `tests/HSchool.Simulation.Tests/WeatherTests.cs`, `tests/HSchool.Content.Tests/BehaviorDefTests.cs`, `docs/protocol.md`, `docs/design/off-queue/lesson-consequences.md`, `docs/design/07-inventory/inventory.md` - **Итог:** обещания фаз 48 и 50–53 совпадают с кодом; сокет не бампили (`ProtocolConstants.Version` / `PROTOCOL_VERSION` = 9). Дописаны тесты на действие учителя, тепло без нужды, снег в плане дня и ленивого на снегу. Критерий фазы 53 «класс наполняется позже» поправлен на `AppearAt` раньше (запас на дорогу). DX 49/54/55 и портреты не трогались. ### Фаза 48 Рост только если назначенный учитель стоит в `lesson.RoomId` (путь пуст, остаток 0). Нет id в мире — как отсутствующий. Лог `lesson-no-teacher` один раз на предмет в сутки, `thingDef` — предмет, подпись из каталога. Голод по-прежнему режет, когда учитель на месте. Действие учителя урок не отменяет — это проверяет `TeacherActionInRoom_StillGains`. ### Фаза 50 `TeacherFactor` — та же кривая, что `NeedFactor` (0 → 0.25, 100 → 1). Навык — среднее по `SubjectDef.skills`, нет ключа — `Range.Min`. Учителя нет в кабинете — рост нулевой. ### Фаза 51 `Gain` умножает `NeedFactor(голод) × NeedFactor(тепло)`; нет ключа `Warmth` — как 1. Лог `lesson-cold` один раз на предмет, только если учитель в кабинете. В `inventory.md` штраф рядом с голодом. ### Фаза 52 Полный рост только при учебнике этого предмета в сумке; шкафчик и дом — `lessonNoTextbookFactor` (ваниль 0.5). Пак без поля — 0.5. Лог `lesson-no-textbook` один раз на предмет. ### Фаза 53 `DayPlans.Build` берёт уже посчитанные минуты; симуляция подставляет `OutdoorWeather.ExtraCommuteMinutes`. Ваниль 3 / 6; пак без полей — 0. Лога нет. `HSchool.Ai` не знает `Precipitation`. ### Открытое Планы дня не пересобираются, если осадки сменились после первой сборки этого утра — так записано («в момент сборки»). Учитель, стоящий в своём кабинете, тоже получает `Gain` по скиллам предмета (`Duty.LessonsToday` для штата); фазы это не запрещают. ## Портреты. Модели, слои промпта, LoRA и embeddings - **Фазы:** 60–61 - **Проверен на:** `5e23d1f`, 2026-08-20 - **Пути:** `src/HSchool.Server/Game/SwarmUiSettingsStore.cs`, `src/HSchool.Server/Game/SwarmUiLoraFormatter.cs`, `src/HSchool.Server/Game/SwarmUiClient.cs`, `src/HSchool.Server/Game/SwarmUiDiscovery.cs`, `src/HSchool.Server/Game/PortraitPromptBuilder.cs`, `src/HSchool.Server/Game/PortraitService.cs`, `src/HSchool.Server/Api/SettingsEndpoints.cs`, `src/HSchool.Server/swarmui.json`, `src/HSchool.Client/src/ui/swarmUiSettingsDialog.ts`, `src/HSchool.Client/src/net/api.ts`, `tests/HSchool.Server.Tests`, `tests/HSchool.AppHost.Tests/PortraitApiTests.cs`, `docs/protocol.md`, `docs/design/off-queue/portrait-models.md`, `docs/design/off-queue/portrait-loras-embeds.md` - **Итог:** обещания фаз 60–61 совпадают с кодом и тестами; сокет не бампили (`ProtocolConstants.Version` / `PROTOCOL_VERSION` = 9). Дописаны проверки cfg без оверрайда, склейки negative и смены модели в диалоге. Хостовые `PortraitApiTests` в этом проходе не гонялись (общий AppHost / живой сервер). Расхождений с дизайном нет. ### Фаза 60 Лифт `positive` → `style` и kind `positive` → `shotType`, пикер Swarm ∩ каталог, слои промпта (модель → стиль → кадр → `promptExtra` → пустая поза → внешность → одежда), HTTP `GET`/`PUT /api/settings/swarmui` с `models` и копией в сейв при create — на месте. Resolve без оверрайда берёт steps/cfg с модели; с оверрайдом — с пресета. ### Фаза 61 Discovery читает `models.Embedding` (офлайн — пустой список). LoRA и embeddings склеиваются модель → пресет → кадр. Промпт содержит `` и не содержит `