Files
h-school/docs/phases/off-queue/reviewed.md
T
Leonid Pershin 94c31c0dc1 Record off-queue lesson phases 48 and 50-53 as reviewed.
Journal the teacher/skill/warmth/textbook/commute pass without closing DX or portraits.
2026-08-20 17:13:22 +03:00

8.2 KiB
Raw Blame History

Проверенные фазы «Вне очереди»

Портреты 60–62 и связность урока (48, 5053). DX (49, 54, 55) этот журнал не закрывает.

Связность урока. Учитель, навык, тепло, учебник, дорога

  • Фазы: 48, 5053
  • Проверен на: aa20534, 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

  • Фазы: 6061
  • Проверен на: 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

Лифт positivestyle и kind positiveshotType, пикер Swarm ∩ каталог, слои промпта (модель → стиль → кадр → promptExtra → пустая поза → внешность → одежда), HTTP GET/PUT /api/settings/swarmui с models и копией в сейв при create — на месте. Resolve без оверрайда берёт steps/cfg с модели; с оверрайдом — с пресета.

Фаза 61

Discovery читает models.Embedding (офлайн — пустой список). LoRA и embeddings склеиваются модель → пресет → кадр. Промпт содержит <embed:…> и не содержит <lora:. Generate шлёт loras и loraweights раздельно. В диалоге поля embeddings есть у модели и у вида кадра.

Открытое

Ничего, что требовало бы решения. swarmui.json на диске не пишет ключи embeddings — после NormalizeAfterLoad списки пустые, как в Catalog().

Портреты. Промпт и Krea-модели

  • Фазы: 62
  • Проверен на: d093ea3, 2026-08-20
  • Пути: src/HSchool.Server/Game/PortraitPromptBuilder.cs, src/HSchool.Server/Game/SwarmUiSettingsStore.cs, src/HSchool.Server/swarmui.json, tests/HSchool.Server.Tests/PortraitPromptBuilderTests.cs, tests/HSchool.Server.Tests/SwarmUiSettingsStoreTests.cs, tests/HSchool.AppHost.Tests/PortraitApiTests.cs, docs/design/off-queue/portrait-prompt-craft.md
  • Итог: обещания фазы 62 совпадают с кодом. Сокет не бампили (ProtocolConstants.Version / PROTOCOL_VERSION = 9). Realism v2.0 в каталог не входит. Живые сейвы при Clone не получают Muse/v2.5. Позы в UI нет. Дописаны сверка swarmui.json с Catalog(), отказ лифтить старую копию и проза with black hair. Хостовые PortraitApiTests в этом проходе не гонялись (общий AppHost / живой сервер). Расхождений с дизайном нет.

Фаза 62

Каталог: четыре SDXL плюс Muse GGUF и Realism v2.5 INT8 с knobs 8 / CFG 1 / euler / simple; swarmui.json совпадает с CreateDefault(). Пресет default — v2.5, стиль и shotType прозой, negative без (word:1.4); child — DreamShaper. Внешность и одежда: N years old, with black hair, wearing a white shirt; слои и custom extra прежние.

Открытое

Хостовый GetPortraitPrompt_ReturnsBuiltPositiveAndNegative больше не ищет подстроку age (она есть в teenage); проверка \bage \d+ в этом проходе не гонялась.