Merge branch 'review/slice-11-a'
This commit is contained in:
@@ -0,0 +1,35 @@
|
|||||||
|
# Журнал ревью — срез 11
|
||||||
|
|
||||||
|
Сводка: [`../reviewed.md`](../reviewed.md). Индекс среза: [`README.md`](README.md).
|
||||||
|
|
||||||
|
## Срез 11. Этап A — только Krea 2
|
||||||
|
|
||||||
|
- **Фазы:** 63
|
||||||
|
- **Проверен на:** `1002aeb`, 2026-08-21
|
||||||
|
- **Пути:** `src/HSchool.Server/swarmui.json`, `src/HSchool.Server/Game/SwarmUiSettingsStore.cs`, `tests/HSchool.Server.Tests/SwarmUiSettingsStoreTests.cs`, `tests/HSchool.AppHost.Tests/PortraitApiTests.cs`
|
||||||
|
- **Итог:** обещания фазы 63 совпадают с кодом. Сокет в коммите фазы не бампили. Живые сейвы с SDXL в `models` не лифтятся; пустой `models` поднимает id с пресетов, а не подменяет каталог Krea. Дописаны границы возраста 6–11, сверка shotType `child` с файлом и отказ лифтить сейв без списка моделей. Хостовые `PortraitApiTests` в этом проходе не гонялись (общий AppHost / живой сервер). Этапы B–D (64–67) в этот проход не входили.
|
||||||
|
|
||||||
|
### 63. Каталог Krea 2
|
||||||
|
|
||||||
|
`Catalog()` — только `museByStableYogi_v30TurboGguf.gguf` и `realismByStableYogi_v25INT8Turbo.safetensors` (8 / CFG 1 / euler / simple). `swarmui.json` совпадает после `NormalizeAfterLoad`. Пресеты `default` и `child` — Realism v2.5; стиль, negative и shotType `child` — проза без `(low quality` и `:1.4)`. `ageRules` 6–11 → `child`. Константы babes / DreamShaper / epicrealism / lustify остались для живых копий, в ванильный список не входят. v2.0 GGUF нет.
|
||||||
|
|
||||||
|
`NormalizeAfterLoad` не переписывает непустой SDXL-каталог; `Clone` не подмешивает Muse/v2.5. Если `models` пуст, `LiftModelsFromPresets` копирует id с пресетов **до** подстановки `Catalog()` — иначе DreamShaper в пресете резолвился бы в Muse.
|
||||||
|
|
||||||
|
HTTP: `GET /api/settings/swarmui` и create копируют два Krea-id (тесты в `PortraitApiTests` на месте; здесь не прогонялись). Пикер — Swarm ∩ каталог (`AllowedModelIds` / `allowedSwarmModels`). Сокет: коммит `6fb6efb` не трогал `ProtocolConstants.Version` / `PROTOCOL_VERSION`; текущая 10 — от фазы 64. Абзац каталога в `protocol.md` описывает Krea 2 без четырёх SDXL.
|
||||||
|
|
||||||
|
`dotnet test tests/HSchool.Server.Tests --filter FullyQualifiedName~SwarmUiSettingsStoreTests`: 20 зелёных.
|
||||||
|
|
||||||
|
Дописано:
|
||||||
|
|
||||||
|
- `Resolve_AgeRuleCoversSixThroughElevenInclusive` — 6 и 11 → child, 5 и 12 → default, модель v2.5
|
||||||
|
- `CreateDefault_SeedsCatalogModels` — `ageRules` ровно 6–11 / `child`
|
||||||
|
- `SwarmUiJson_MatchesCatalogAndDefaultPresets` — shotType avatar/fullBody у `child`
|
||||||
|
- `NormalizeAfterLoad_EmptyModelsKeepSdxlPresetIdsInsteadOfKreaCatalog` — пустой `models` не становится Krea
|
||||||
|
|
||||||
|
Код фазы не чинился.
|
||||||
|
|
||||||
|
### Открытое
|
||||||
|
|
||||||
|
- Пример JSON у `GET .../portrait/prompt` в `protocol.md` всё ещё с `cinematic photo`, `age 12` и `(low quality, worst quality:1.4)` — это HTTP промпта/сцены (этапы C–D), не каталог. Здесь не правился: соседний проход трогает `protocol.md`.
|
||||||
|
- Хостовый GET/create на Krea-id не перегонялся в этом worktree.
|
||||||
|
- Этапы B–D (тосты, пауза, сборщик сцены, `generateImage`) — не этот проход.
|
||||||
@@ -37,3 +37,4 @@
|
|||||||
| Портреты (вне очереди) 60–61 | `5e23d1f` | [off-queue](off-queue/reviewed.md) |
|
| Портреты (вне очереди) 60–61 | `5e23d1f` | [off-queue](off-queue/reviewed.md) |
|
||||||
| Портреты (вне очереди) 62 | `d093ea3` | [off-queue](off-queue/reviewed.md) |
|
| Портреты (вне очереди) 62 | `d093ea3` | [off-queue](off-queue/reviewed.md) |
|
||||||
| Вне очереди. DX 49/54/55 | `ee452b2` | [off-queue](off-queue/reviewed.md) |
|
| Вне очереди. DX 49/54/55 | `ee452b2` | [off-queue](off-queue/reviewed.md) |
|
||||||
|
| Срез 11. Этап A — только Krea 2 | `1002aeb` | [11-events](11-events/reviewed.md) |
|
||||||
|
|||||||
@@ -233,6 +233,25 @@ public class SwarmUiSettingsStoreTests
|
|||||||
|
|
||||||
var child = Assert.Single(config.Presets, preset => preset.Id == "child");
|
var child = Assert.Single(config.Presets, preset => preset.Id == "child");
|
||||||
Assert.Equal(SwarmUiModelDefinition.RealismV25Id, child.Model);
|
Assert.Equal(SwarmUiModelDefinition.RealismV25Id, child.Model);
|
||||||
|
|
||||||
|
var ageRule = Assert.Single(config.AgeRules);
|
||||||
|
Assert.Equal(6, ageRule.MinAge);
|
||||||
|
Assert.Equal(11, ageRule.MaxAge);
|
||||||
|
Assert.Equal("child", ageRule.PresetId);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(6, "child")]
|
||||||
|
[InlineData(11, "child")]
|
||||||
|
[InlineData(5, "default")]
|
||||||
|
[InlineData(12, "default")]
|
||||||
|
public void Resolve_AgeRuleCoversSixThroughElevenInclusive(int age, string presetId)
|
||||||
|
{
|
||||||
|
var config = SwarmUiConfigFile.CreateDefault();
|
||||||
|
var profile = config.Resolve(age, PortraitKind.Avatar);
|
||||||
|
|
||||||
|
Assert.Equal(presetId, profile.PresetId);
|
||||||
|
Assert.Equal(SwarmUiModelDefinition.RealismV25Id, profile.Model);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -288,6 +307,8 @@ public class SwarmUiSettingsStoreTests
|
|||||||
Assert.Equal(expected.Presets[1].Model, loaded.Presets[1].Model);
|
Assert.Equal(expected.Presets[1].Model, loaded.Presets[1].Model);
|
||||||
Assert.Equal(expected.Presets[1].Style, loaded.Presets[1].Style);
|
Assert.Equal(expected.Presets[1].Style, loaded.Presets[1].Style);
|
||||||
Assert.Equal(expected.Presets[1].Negative, loaded.Presets[1].Negative);
|
Assert.Equal(expected.Presets[1].Negative, loaded.Presets[1].Negative);
|
||||||
|
Assert.Equal(expected.Presets[1].Avatar?.ShotType, loaded.Presets[1].Avatar?.ShotType);
|
||||||
|
Assert.Equal(expected.Presets[1].FullBody?.ShotType, loaded.Presets[1].FullBody?.ShotType);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -354,6 +375,48 @@ public class SwarmUiSettingsStoreTests
|
|||||||
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, living.Resolve(8, PortraitKind.Avatar).Model);
|
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, living.Resolve(8, PortraitKind.Avatar).Model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void NormalizeAfterLoad_EmptyModelsKeepSdxlPresetIdsInsteadOfKreaCatalog()
|
||||||
|
{
|
||||||
|
var living = new SwarmUiConfigFile
|
||||||
|
{
|
||||||
|
ActivePresetId = "default",
|
||||||
|
Presets =
|
||||||
|
[
|
||||||
|
new SwarmUiPresetDefinition
|
||||||
|
{
|
||||||
|
Id = "default",
|
||||||
|
Label = "Default",
|
||||||
|
Model = SwarmUiModelDefinition.BabesId,
|
||||||
|
Avatar = new SwarmUiKindPreset { Width = 1024, Height = 1024 },
|
||||||
|
Custom = new SwarmUiKindPreset { Width = 896, Height = 1152 },
|
||||||
|
FullBody = new SwarmUiKindPreset { Width = 896, Height = 1152 },
|
||||||
|
},
|
||||||
|
new SwarmUiPresetDefinition
|
||||||
|
{
|
||||||
|
Id = "child",
|
||||||
|
Label = "Children",
|
||||||
|
Model = SwarmUiModelDefinition.DreamShaperId,
|
||||||
|
Avatar = new SwarmUiKindPreset { Width = 1024, Height = 1024 },
|
||||||
|
Custom = new SwarmUiKindPreset { Width = 896, Height = 1152 },
|
||||||
|
FullBody = new SwarmUiKindPreset { Width = 896, Height = 1152 },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
AgeRules = [new SwarmUiAgeRule { MinAge = 6, MaxAge = 11, PresetId = "child" }],
|
||||||
|
};
|
||||||
|
|
||||||
|
living.NormalizeAfterLoad();
|
||||||
|
|
||||||
|
Assert.Equal(
|
||||||
|
[SwarmUiModelDefinition.BabesId, SwarmUiModelDefinition.DreamShaperId],
|
||||||
|
living.Models.Select(model => model.Id));
|
||||||
|
Assert.DoesNotContain(living.Models, model => model.Id == SwarmUiModelDefinition.MuseId);
|
||||||
|
Assert.DoesNotContain(living.Models, model => model.Id == SwarmUiModelDefinition.RealismV25Id);
|
||||||
|
Assert.Equal(SwarmUiModelDefinition.BabesId, living.Presets[0].Model);
|
||||||
|
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, living.Presets[1].Model);
|
||||||
|
Assert.Equal(SwarmUiModelDefinition.DreamShaperId, living.Resolve(8, PortraitKind.Avatar).Model);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Clone_DoesNotInjectKreaModelsIntoAnExistingSchoolCopy()
|
public void Clone_DoesNotInjectKreaModelsIntoAnExistingSchoolCopy()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user