Решили: снятие раны — один вид команды (HealInjury) на оба пути лечения, и внутри применителя оплата со снятием идут одним шагом.

Почему: торговец и привал снимают рану одинаково, а платят разным — золотом забега и бюджетом действий привала. Бюджет привала durable-состоянием не является (живёт свой узел и умирает с ним), поэтому в команду ему нечего класть; в ней остаётся только та оплата, что меняет забег. Два вида команды под одно действие развели бы одинаковое поведение по двум веткам применителя.

Атомарность — не педантизм: разнеси списание золота и снятие раны на два вызова, и появится состояние «золото списано, рана на месте», в которое попадает любой отказ между ними. Компилятор его не увидит, увидит игрок.

Грабли: цена НЕ едет в команде числом, а спрашивается у ассета при применении. Иначе старый лог, воспроизведённый после правки баланса, списал бы вчерашнее золото — и реплей разошёлся бы с игрой на ровном месте.

Второе: на привале эффект исполняется ДО списания бюджета. Порядок наоборот («заплатили, потом попробовали») дарил бы игроку «заплатил и не получил» на каждом промахе по цели — а промах там законен, целей выбора ран пока нет вовсе.

Владелец правды: RunStateService.HealInjury, CampSession.TryPerform, тесты InjuryHealingTests, CampSessionTests.