92 lines
12 KiB
Markdown
92 lines
12 KiB
Markdown
# Проверенные фазы «Вне очереди»
|
||
|
||
Разделы ниже — отдельные проходы. Чужой раздел не затирать.
|
||
|
||
## Связность урока. Учитель, навык, тепло, учебник, дорога
|
||
|
||
- **Фазы:** 48, 50–53
|
||
- **Проверен на:** `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
|
||
|
||
- **Фазы:** 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) сюда не входят — не трогали.
|