Решили: гейт состояний засчитывает покрытие по селектору, который СОДЕРЖИТ класс блока и псевдокласс, а не по точному виду селектора; выключенность признаётся и по :disabled, и по классу .unity-disabled.

Почему: строгий критерий («у блока обязано быть правило .gm-button:hover») объявил бы дефектом работающий код. Половина наших правил двухклассовые (.unity-button.gm-button:hover) — не по вкусу, а потому что одноклассовый селектор проигрывает теме Unity по специфичности; :checked вообще садится на потомка (.gm-toggle-row .unity-toggle:checked), так как псевдокласс держит сам Toggle. Гейт обязан проверять результат — отвечает ли элемент на состояние, — а не приём, которым этого добились. Обе приметы выключенности признаны по той же причине: SetEnabled(false) поднимает и псевдокласс, и класс, и у нас в ходу оба.

Грабли: первый прогон дал 50 нарушений — это не поломка, а перепись долга, которого никто не видел: строки настроек не отвечают ни на что, у карточек нет нажатия и фокуса, у переключателя нет :checked. Заодно закреплён порядок ярусов темы отдельным тестом: при равной специфичности USS выигрывает импортированный ПОЗЖЕ, поэтому перестановка @import молча меняет вид там, где никто ничего не правил, — а после разнесения components.uss по файлам таких мест станет на порядок больше.

Владелец правды: Assets/_Project/Tests/EditMode/UI/UiStateGateTests.cs.