Решили: лок-ключи заводятся ТОЛЬКО через LocalizationEditorSettings (например из execute_code) с точечным SaveAssetIfDirty. Правка Content_*.asset и Content Shared Data.asset как текста — запрещённый путь, даже когда кажется, что формат простой.

Почему: правка файла проигрывает открытому редактору дважды. Во-первых, он держит таблицы в памяти и перезаписывает диск своей версией — ручные вставки просто исчезают. Во-вторых, и это дороже: в Shared Data после списка m_Entries идут ещё m_Metadata и m_KeyGenerator, поэтому вставка «перед последним references:» кладёт записи ВНЕ списка. Такой YAML Unity разбирает частично (Parser Failure at line N: Unexpected sequence indicator) и пересохраняет обрезанным — ru-таблица потеряла 203 живых строки. Восстановлено git checkout, затем 36 ключей заведены API. Порядок восстановления важен: после checkout нужен ImportAsset(ForceUpdate), иначе редактор перезапишет диск обрезанной версией, которую всё ещё держит в памяти.

Та же ловушка накрывает любой ассет: правка AiPresets/Nightblade.asset через sed «не сработала» — тесты гоняли то, что редактор держал в памяти, и зеркальный бой падал с прежним трейсом до принудительного переимпорта.

Грабли: теневой проект один на все сессии (LOCALAPPDATA\<name>-UnityShadow). Два параллельных прогона дерутся за bee_backend («More than one copy of bee_backend running»), и второй висит без единого слова в консоли — видно только в %TEMP%\guildmaster-tests\EditMode.log.

Владелец правды: Content Shared Data.asset (структура), docs/roster-expansion-progress.md §Операционные ловушки.