Files
h-school/docs/phases/off-queue/reviewed.md
T

92 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Проверенные фазы «Вне очереди»
Разделы ниже — отдельные проходы. Чужой раздел не затирать.
## Связность урока. Учитель, навык, тепло, учебник, дорога
- **Фазы:** 48, 5053
- **Проверен на:** `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
- **Фазы:** 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
Лифт `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) сюда не входят — не трогали.