Решили: профиль больше не заводится молча — на чистой установке игру встречает экран слотов, а идентичность игрока (ник, мейн-цвет, скин курсора) переехала В профиль.

Почему: молчаливое создание было честной страховкой — «без профиля забегу некуда писаться», — и ровно поэтому у профиля не было места, где он виден как сущность. Игрок получал «Профиль 1», которого не заводил, и узнавал о слотах, только если специально их искал. Теперь состояние «профиля нет» законно: HasActiveProfile отвечает честно, а RunKey пуст, и вызывающий это видит.

Вторая развилка — где живут ник, цвет и курсор. ТЗ сейвов прямо говорит «настройки НЕ входят в профиль», и по делу: громкость и разрешение принадлежат машине, прыгать при смене профиля они не должны. Но идентичность — не настройка клиента, а ответ на вопрос «кем я играю», и она обязана меняться вместе со слотом. Граница проведена по этому признаку, а не по слову «настройки».

Сказано: «У профиля (у нас их может быть несколько) надо не ник, а просто Profile 1, Profile 2, т.е. просто номер и все. И все сейвы и настройки в нем. Т.е. при старте - просто требует создать профиль в одном из нескольких слотов (см все про это в документации), потом автоматически заходим через созданный слой.» (03.08.2026, сессия b307a49b).

Грабли:

  • Номер слота нельзя брать из числа профилей. Удалив первый из двух, игрок получил бы второй «Профиль 2» рядом с уже имеющимся. Берётся наименьший свободный номер, держит тест SlotNumber_FillsTheFirstFreeSeat.
  • Мейн-цвет едет ПОЖЕЛАНИЕМ, а не назначением. Цвет выбирается в профиле заранее и порознь, а в одной сессии цвета обязаны быть разными (ГДД, кооп-кластер). Конфликт разводит хост: кто вошёл раньше — оставляет желаемый, опоздавшему достаётся ближайший свободный. Отказать во входе значило бы наказание за совпадение вкусов, пустить двоих одним цветом — убить единственную функцию мейн-цвета.
  • UI не имеет права знать про Net и Game. Экрану профиля нужны имя из Steam и смена курсора; первая попытка притащила SteamBootstrap и CursorSkinService прямо в MenuRouter и не собралась на границе сборок — это правильный отказ. Оба факта пришли узкими швами в Core: IPlatformIdentity, ICursorSkinControl.
  • Тесты профиля держались на автосоздании. Восемь из одиннадцати падали не потому, что поведение сломалось, а потому что описывали прежнее. Переписаны под новое: «чистая установка» стала отдельным тестом, остальные заводят профиль явным шагом.

Владелец правды: Core/Persistence/IProfileService.cs, Game/Services/ProfileService.cs, Game/Session/Net/HostSessionRoster.cs, тесты ProfileServiceTests.