Restore Slavic save lift and redress abstract underwear on load.

Recheck of slice 7 stage A found UpgradeOlderSave removed after UpperUnderwear, so format-2 nameSetId saves never started, and golden people.json wearing abstract Underwear failed RequireKnownApparel. Bring back the lift, treat unusable items as undressed, and restore GoldenSaveTests.
This commit is contained in:
Leonid Pershin
2026-08-20 15:52:17 +03:00
parent 0ec02dde8d
commit 5df341f91b
7 changed files with 250 additions and 40 deletions
+35 -30
View File
@@ -5,53 +5,58 @@
## Срез 7. Этап A — данные и гардероб
- **Фазы:** 2931
- **Проверен на:** `d5547b7`, 2026-08-20
- **Пути:** `src/HSchool.Content/{CountryDef,ApparelDefs,CatalogLoader}.cs`,
- **Проверен на:** `PENDING`, 2026-08-20**перепроверка** после `d5547b7`
- **Пути:** `src/HSchool.Content/{ApparelDefs,CatalogLoader}.cs`,
`src/HSchool.People/{DressGenerator,CountryClimate,RosterJson}.cs`,
`src/HSchool.Server/{Game/SchoolStore.cs,Api/{ModEndpoints,SchoolEndpoints}.cs,Api/PeopleModels.cs}`,
`src/HSchool.Client/src/ui/{createSchoolDialog.ts,personCard.ts}`,
`src/HSchool.Server/{Game/SchoolStore.cs,Game/SchoolWorker.Tick.cs,Api/{ModEndpoints,SchoolEndpoints}.cs,Api/PeopleModels.cs}`,
`src/HSchool.Client/src/ui/{createSchoolDialog.ts,personCard.ts,personCardApparel.ts,personCardCarry.ts}`,
`tests/HSchool.Content.Tests/{CountryDefTests,ApparelDefTests,VanillaCoreTests}.cs`,
`tests/HSchool.People.Tests/{DressGeneratorTests,GoldenRosterTests}.cs`,
`tests/HSchool.AppHost.Tests/{SchoolApiTests,InventoryApiTests,GoldenSaveTests,ServiceabilityTests}.cs`,
`src/HSchool.Client/src/ui/createSchoolDialog.test.ts`
- **Итог:** все 17 тестов из списков фаз на месте; исправлен дубликат `peopleTabOverview` в
`strings.ts` (ломал `npm run build`); одно замечание рядом про вкладки карточки
- **Итог:** обещания 29–31 после дрейфа (сессия, владельцы, UpperUnderwear, сплит карточки)
в целом держатся; снятый в `660340c` подъём `nameSetId: Slavic` возвращён; золотой сейв с
абстрактным `Underwear` снова одевается. B–C не трогался.
Что подтверждено:
- **29:** `CountryDef`/`ClimatePresetDef`; `namesets/` убран; ваниль `Russia` с двумя пресетами;
каталог отдаёт `countries`; create принимает `countryId`, `unknown-country` на чужую страну;
пресет от сида (`CreateSchool_WithTheSameSeed_GetsTheSameClimatePreset`); `nameSetId: Slavic`
поднимается через `UpgradeOlderSave` (`GoldenSaveTests`, `legacy-no-native/`); формат без
страны не стартует (`ServiceabilityTests`); диалог — страны и языки (`createSchoolDialog.test.ts`);
золотой ростер обновлён (`GoldenRosterTests`).
- **30:** поля `ThingDef`/`ColorDef`, слои как роли, мебель без `layers`; ванильная палитра и
одежда в `VanillaCoreTests`; локали ru/en (`EveryVanillaLabel_ExistsInBothLocales`); учебник
один def без `subject` на def.
- **31:** `InventoryItem` с `def`/`color`/`condition`/`location`/`subject`; `DressGenerator`
детерминирован (`DressGeneratorTests`, `InventoryApiTests.SameSeed_YieldsTheSameShirt`); слои
без пересечения, платье на два слоя; пол/яркость/учебник/родители/соискатели/масса/Hauling;
карточка отдаёт worn+carried, список — нет (`InventoryApiTests`); старый `people.json` без
items одевается на reload (`PeopleJsonWithoutInventory_IsDressedOnReloadAndRewritten`);
`HSchool.People`/`HSchool.Content` без ASP.NET; протокол не тронут.
- **29:** `CountryDef`/`ClimatePresetDef`; `namesets/` нет; ваниль `Russia` с двумя пресетами;
каталог отдаёт `countries`, не `nameSets`; create — `countryId`, `unknown-country`;
пресет от сида (`CreateSchool_WithTheSameSeed_GetsTheSameClimatePreset`); формат 3 без
`countryId` не стартует (`ServiceabilityTests`); диалог — страны и языки;
золотой ростер (`GoldenRosterTests`). `UpgradeOlderSave` снова в `SchoolStore`: format 2
`nameSetId: Slavic` поднимается как `Russia` + первый пресет в памяти, файл не
переписывается, пока школа сама не сохранится (`GoldenSaveTests`, `legacy-no-native/`).
- **30:** поля `ThingDef`/`ColorDef`, слои включая `UpperUnderwear`; мебель без `layers`;
каталог редактора без футболки/учебника; ваниль и локали (`VanillaCoreTests`); учебник —
один def без предмета на def.
- **31:** `InventoryItem`; `DressGenerator` от `ApparelSalt`; слои без пересечения, платье,
пол/яркость/учебник/родители/соискатели/масса/`Hauling`; карточка worn+carried, список —
нет; пустой `people.json` одевается на reload. Протокол этапа A не тронут;
`HSchool.People`/`Content` без ASP.NET.
Дописано:
- (нет новых тестов — списки фаз закрыты существующими)
- `GoldenSaveTests.CurrentFormatSave_LoadsTheSamePeopleAndTime` — возвращён (снят в фазе 39)
- `GoldenSaveTests.SaveWithoutNativeLanguage_LoadsWithoutReshuffling` — Slavic-сейв стартует, одежда дописывается
- `DressGeneratorTests.AbstractUnderwearInASave_IsRedressedOnEnsure`
Исправлено:
- Дубликат ключа `peopleTabOverview` в `strings.ts` (ru/en): vitest не ловит TS2300/TS1117,
`npm run build` падал; ключ перенесён, `peopleTabPortrait` рядом с остальными вкладками.
- Повтор `using HSchool.Content` в `SchoolStore.cs` (CS0105).
- `660340c` выкинул `NameSetId`/`UpgradeOlderSave` и сузил `CanStart` до format == 3: старые
сейвы с `nameSetId: Slavic` не стартовали. Подъём возвращён; `CanStart` — format ≤ 3 и
непустой `countryId`.
- После `UpperUnderwear` золотой `people.json` носил абстрактный `Underwear`, и
`RequireKnownApparel` не пускал школу. `NeedsDressing`/`EnsureDressed` переодевают
неизвестный или абстрактный def тем же сидом.
Замечено рядом:
- Карточка уже с вкладками (`personCard.ts`, фаза 31 обещала один свиток — позже по
`../../design/07-inventory/inventory.md`); портрет/SwarmUI-строки в `strings.ts` — не этап A.
- `ResolveClimatePreset` в `SchoolWorker` при reload без сохранённого пресета берёт первый
пресет страны (`schoolSeed: 0`, `rollIfOmitted: false`) — по дизайну для legacy; create
кидает пресет из `GameLoopService` до spawn.
- Карточка с вкладками — этап C (фаза 36); сплит в `personCardApparel.ts` / `personCardCarry.ts`.
- `ResolveClimatePreset` на reload без сохранённого пресета берёт первый пресет страны.
- POST `nameSetId` по-прежнему игнорируется (поля нет на create); пустой `countryId` на create
берёт первую страну каталога — это create, не сейв.
- Этап B–C в этом проходе не проверялся.
## Срез 7. Этап B–C — климат, жизнь одежды и правила
+1 -1
View File
@@ -26,7 +26,7 @@
| Срез 4. Расписание | `01ef277` | [04-schedule](04-schedule/reviewed.md) |
| Срез 5. Жизнь школы | `cbe739a` | [05-ai](05-ai/reviewed.md) |
| Срез 6. Фундамент | `cbe739a` | [06-foundation](06-foundation/reviewed.md) |
| Срез 7. Этап A — данные и гардероб | `d5547b7` | [07-inventory](07-inventory/reviewed.md) |
| Срез 7. Этап A — данные и гардероб | `PENDING` | [07-inventory](07-inventory/reviewed.md) |
| Срез 7. Этап B–C — климат, жизнь одежды и правила | `5dcdee6` | [07-inventory](07-inventory/reviewed.md) |
| Срез 8. Сессия и темп | `1c3ae9a` | [08-session](08-session/reviewed.md) |
| Срез 9. Этапы A–B — мнения и разговоры | `b38d0bb` | [09-social](09-social/reviewed.md) |