Решили: пресет кампании объявляет «расставлять можно только своих» явно, а права всех трёх видов мероприятия закрыты тестом.

Почему баг вообще стал возможен. Право трогать сторону — обычный bool с умолчанием false, и умолчание это верно ровно для Ристалища, где обе стороны и правда твои. Кампания завелась пресетом раньше, чем появился сам флаг, и с тех пор молча разрешала таскать врагов, которых приносит энкаунтер. Ни компилятор, ни ревью такого не показывают: строка выглядит полной, просто в ней нет того, чего в ней и не видно.

Сказано: «Кстати да, я почему-то мог даже в компании противников двигать. Это ведь баг?)» (05.08.2026, сессия 499c4dc5). Нашёл на живом прогоне — там же, где это единственно и видно.

Правило, которое из этого стоит держать: разрешение, заданное умолчанием, обязано иметь тест на каждый случай применения. Не на механизм (он работал безупречно), а именно на ПРИМЕНЕНИЕ — потому что забывают не механизм, а его подключение. В тесте есть и обратная запись: «на Ристалище обе стороны наши НАМЕРЕННО, и если этот тест покраснеет, чинить надо не его» — иначе следующий читатель «исправит» площадку под общее правило.

Грабли теста, а не игры: первая версия проверки отказа смотрела, что закрытое место не ожило, — оно и не должно было, и проверка не значила ничего. Переписана на бой: намерение приходит с опозданием, и проверяется, что боец не прыгнул туда, куда его звали. Сравнивать «позиция не изменилась» в бою нельзя — там бойцы двигаются сами.

Проверено саботажем: со снятой проверкой права боец переезжает ровно на заказанные полтора метра, и тест краснеет. Тест на отказ без такой проверки — украшение.

Владелец правды: Data/Definitions/Activity.cs (пресеты и комментарий при кампании), тесты ActivityPresetRightsTests, CoopIntentRightsTest.