12 KiB
Проверенные фазы «Вне очереди»
Разделы ниже — отдельные проходы. Чужой раздел не затирать.
Связность урока. Учитель, навык, тепло, учебник, дорога
- Фазы: 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 склеиваются модель → пресет → кадр. Промпт содержит <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+ в этом проходе не гонялась.
DX. Пропуск сборки, «Что нового», состояние экрана
- Фазы: 49, 54, 55
- Проверен на:
ee452b2, 2026-08-20 - Пути:
tools/apphost-uptodate.ps1,run-aspire.cmd,run-aspire.ps1,run-aspire.sh,tests/HSchool.AppHost.Tests/LaunchBuildStamp.cs,tests/HSchool.AppHost.Tests/LaunchBuildStampTests.cs,src/HSchool.Server/Changelog/BuildChangelog.cs,src/HSchool.Server/Api/ChangelogEndpoints.cs,src/HSchool.Server/HSchool.Server.csproj,tools/embed-changelog.ps1,tools/embed-changelog.sh,tests/HSchool.Server.Tests/BuildChangelogTests.cs,tests/HSchool.AppHost.Tests/ChangelogApiTests.cs,src/HSchool.Client/src/ui/whatsNew.ts,src/HSchool.Client/src/ui/whatsNew.test.ts,src/HSchool.Client/src/ui/seenRevision.ts,src/HSchool.Client/src/ui/viewState.ts,src/HSchool.Client/src/ui/viewState.test.ts,src/HSchool.Client/src/ui/gameScreen.ts,src/HSchool.Client/src/main.ts,docs/protocol.md,docs/design/off-queue/skip-stale-build.md,docs/design/off-queue/whats-new.md,docs/design/off-queue/view-state.md - Итог: обещания 49/54/55 совпадают с кодом. Сокет не бампили (v9). Дописаны порядок нескольких коммитов в changelog и восстановление вкладки с меню из
sessionStorage.run-aspireпередаёт-cвdotnet run, не только в штамп. Дизайн 49 догнан доrun-aspire.sh.BuildChangelogTestsзелёные (4). ХостовыеChangelogApiTestsиLaunchBuildStampTestsв этом проходе не гонялись (штамп не менялся; HTTP не менялся; живой сервер пользователя не трогали).
Фаза 49
apphost-uptodate.ps1 / LaunchBuildStamp / needs_build в .sh смотрят AppHost+Server dll против *.cs/*.csproj/*.props под src/ и трёх named props; TS/JSONC и bin/obj/node_modules не входы. Семь тестов штампа на временных папках есть, без AppHostFixture. --rebuild собирает и затем стартует AppHost.
Фаза 54
SHA и first-parent лог вшиваются при сборке Server, не из рантайма. GET /api/changelog за сессией: пусто без since / неизвестный / текущий SHA; Mark phase N в списке нет, якорем остаётся. Кука hschool.seen-rev (год, Path=/, SameSite=Lax, не HttpOnly). Модалка после ensureSession на старте и после logout, не при выходе из школы на меню.
Фаза 55
Query держит школу/режим/вкладки/выбор; sessionStorage ключ h-school.view.{id} — фильтры людей, соискателей, карточку и управление. Вход/выход — pushState, вкладки и фильтры — replaceState. Гость с mode=manage остаётся в обзоре. F5 с ?school= шлёт тот же OpenSchool.
Открытое
Ничего, что фаза 54 обещала и не сделала. Баги сессии из журнала среза 8 (другое имя при живой куке, Data Protection) сюда не входят — не трогали.