feat(robot): per-game opponent names from a wide corpus + frozen seat-name snapshot #73
Reference in New Issue
Block a user
Delete Branch "feature/robot-name-variety"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что и зачем
Имя соперника-робота было жёстко привязано к 64 «вечным» аккаунтам (1 аккаунт = 1 имя), оттого имена повторялись от партии к партии. Теперь:
game_players.display_name.internal/robot/namevariety.go): западные локали (EN/DE/ES/IT/FR/PT), родные японские/китайские имена, расширенный русский пул и «человеческие» ники. Маршрутизация в духеPick: русская партия — кириллица + ≤20% латиницы, без CJK; английская — весь корпус. Черезrobot.PickNamed.account.ValidateDisplayName(и зеркалоui/src/lib/profileValidation.ts): разрешён хвост из ≤5 цифр, так что ники вида «Player2007» валидны и для человека — замаскированный робот остаётся неотличимым (ARCHITECTURE §7).Контракты / риски
display_nameослаблено (цифры хвостом ≤5). Backend + UI-зеркало + тесты синхронизированы.00007_seat_display_name.sql— аддитивная (ADD COLUMN ... NOT NULL DEFAULT ''), без бэкфилла; jet перегенерирован. Совместима со старой БД контура (goose донакатит 00007), вайп схемы не требуется.vs_ai) без изменений (имя аккаунта, GCG = «AI»); число роботов прежнее (64) — «толпу» делают per-game имена.Проверка (локально, всё зелёное)
build/vet/gofmt; весь unit; весь-tags=integration(testcontainers).pnpm check(0 ошибок) /test:unit(266) /build.ValidateDisplayName», маршрутизация скриптов по варианту, заморозка имени после переименования, round-trip per-game имени робота.Визуальная приёмка
После деплоя на тестовый контур — несколько авто-матчей в EN- и RU-партиях (разные имена соперников; RU без CJK; EN с JP/CN) и проверка профиля (имя с хвостом цифр сохраняется, цифра в середине / >5 цифр — отклоняется).
The seat display-name snapshot only reached the live-event path (seatNames); the REST DTO layer still resolved seat names from the account store (fillSeatNames), so the game screen and lobby list showed the robot's seeded account name ("Женя") while the your_turn toast showed its per-game name ("Звёздный_Барс2"). Carry the snapshot into gameDTOFromGame and have fillSeatNames fall back to the account only for a seat with no snapshot (a pre-snapshot legacy row). Friends and invitations keep account names (the persistent identity, not a per-game disguise).Cyrillic adjective+noun handles paired a masculine adjective with any noun, so a feminine noun read ungrammatically ("Вольный Комета"). Carry masculine + feminine adjective forms (cyrAdjective) and tag each noun's gender (cyrNoun); cyrillicNick now renders the adjective in the agreeing form ("Рыжая Комета", "Дикий Волк"), and a few feminine nouns (Комета/Звезда/Молния/Пантера/Рысь/Буря/Сова/Акула) are added for variety.