Решили: «удар в тыл» для Ночного лезвия считается от конвенции сторон
(CombatPositioning.IsRearAttack: атакующий в конусе ±60° со стороны домашнего края цели), а не от
разворота юнита.
Почему: своего «лица» у юнита в симуляции нет — ни поля, ни угла; общий слой C позиционики
(фланг и тыл для всех, ГДД positioning) принят в дизайне, но в коде отсутствует. Альтернатива
«завести настоящее лицо и сектора» отвергнута на эту ночь сознательно: она меняет баланс ВСЕХ
юнитов, а не одного кита, и её нельзя ввести без замеров. Прокси берёт направление оттуда же, откуда
его берёт побег (FleeSteering.HomeDir), поэтому не требует ни истории движения, ни разворотов и
остаётся детерминированным.
Цена названа вслух: удар в спину цели, которая сама зашла за твою линию, тыловым не считается.
Грабли: кит вскрыл чужой дефект детерминизма. Фокус автоатак «меньше всего HP%» уронил
Mirror_SquadSeries_NeverDiverges: в начале боя HP% у всех ровно 1.0, скоры равны, и выбор решает
тай-брейк o.Id < best.Id — а глобальный Id у левой команды меньше, то есть «меньший Id» указывает
на РАЗНЫЕ роли в отражённых командах. Обошли дефолтом карточки («Ближайший»), сам дефект открыт: тот
же изъян у MarkTransferComponent (перенос метки при равных дистанциях). Лечится тай-брейком по
слоту в команде вместо глобального Id — это меняет исходы существующих боёв, поэтому решение за
Максом.
Владелец правды: CombatPositioning.IsRearAttack, RearStrikeEffectComponent.cs;
открытый дефект — ProfileBrain.cs:80, docs/roster-expansion-progress.md §Проблемы.