Решили: состояния интерфейса снимаются контактным листом поверх ЖИВОЙ панели в play;
наведение, нажатие и фокус навязываются через VisualElement.pseudoStates (internal, рефлексией), а
выключенность — честным SetEnabled(false).
Почему: псевдосостояние нельзя вызвать снаружи — форсировать его в UI Toolkit Debugger Unity не
даёт, это подтверждённая дыра движка. Значит на обычном скриншоте состояний нет вовсе, и до
06.08.2026 их не проверял никто: за весь архив сессий нет ни одного случая, где регрессию состояния
поймала бы Никси раньше Макса. Отвергли изолированный стенд (решение Макса 05.08: он отвечает на
вопрос «как это выглядит само по себе», а спрашивают «как в игре» — на живом фоне и в своём
соседстве). Отвергли форс выключенности через pseudoStates: движок при SetEnabled(false) поднимает
ещё и класс .unity-disabled, на котором висит половина наших правил, — форс показал бы картину,
которой в игре не бывает. Пишемость internal-свойства проверена контролем до написания инструмента:
покой даёт --gm-plate-fill = RGBA(0.024, 0.255, 0.278), навязанное наведение — RGBA(0.047, 0.408,
0.439).
Грабли: трижды, и каждый раз инструмент поправлял МЕНЯ, а не наоборот.
FindAnyObjectByType<UIDocument>() вернул дев-оверлей «Dev Encounter Panel» — в CoreScene документов
два, и лист лёг бы под интерфейс; ищем теперь по UiRootBootstrap. Фабрика образцов врала на трёх
блоках: gm-tab и gm-loadout__start-btn стоят в разметке БЕЗ gm-button, а лента забега — это
чипы с --collapsible. И gm-runbar__tab отвечает на курсор, не имея ни одного своего правила: он
наследует от .gm-chip — отсюда поле Base в реестре, без которого гейт состояний требовал бы
писать дубли ради зелёного.
Владелец правды: Assets/_Project/Scripts/DevTools/UiContactSheet.cs,
UiSampleFactory.cs, тесты UiComponentRegistryTests.