Решили: пресет кампании объявляет «расставлять можно только своих» явно, а права всех трёх видов мероприятия закрыты тестом.
Почему баг вообще стал возможен. Право трогать сторону — обычный bool с умолчанием false, и
умолчание это верно ровно для Ристалища, где обе стороны и правда твои. Кампания завелась пресетом
раньше, чем появился сам флаг, и с тех пор молча разрешала таскать врагов, которых приносит
энкаунтер. Ни компилятор, ни ревью такого не показывают: строка выглядит полной, просто в ней нет
того, чего в ней и не видно.
Сказано: «Кстати да, я почему-то мог даже в компании противников двигать. Это ведь баг?)» (05.08.2026, сессия 499c4dc5). Нашёл на живом прогоне — там же, где это единственно и видно.
Правило, которое из этого стоит держать: разрешение, заданное умолчанием, обязано иметь тест на каждый случай применения. Не на механизм (он работал безупречно), а именно на ПРИМЕНЕНИЕ — потому что забывают не механизм, а его подключение. В тесте есть и обратная запись: «на Ристалище обе стороны наши НАМЕРЕННО, и если этот тест покраснеет, чинить надо не его» — иначе следующий читатель «исправит» площадку под общее правило.
Грабли теста, а не игры: первая версия проверки отказа смотрела, что закрытое место не ожило, — оно и не должно было, и проверка не значила ничего. Переписана на бой: намерение приходит с опозданием, и проверяется, что боец не прыгнул туда, куда его звали. Сравнивать «позиция не изменилась» в бою нельзя — там бойцы двигаются сами.
Проверено саботажем: со снятой проверкой права боец переезжает ровно на заказанные полтора метра, и тест краснеет. Тест на отказ без такой проверки — украшение.
Владелец правды: Data/Definitions/Activity.cs (пресеты и комментарий при кампании), тесты
ActivityPresetRightsTests, CoopIntentRightsTest.