Решили: состояния интерфейса снимаются контактным листом поверх ЖИВОЙ панели в 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.