Приёмка 03.08.2026 на боевом нашла три дыры вокруг одной и той же суммы: у клиента
заморожены 3 333,36 ₽, и узнать за что было негде. Деньги не терялись — терялось
объяснение, а для клиента, у которого заперта треть кошелька, это неотличимо от пропажи.
1) Денежная плашка врала после паузы и возобновления (Я-Ф1/Я-Ф4 FAIL).
Она грузилась ОДИН раз, при открытии страницы, и о переменах не узнавала. После
«Возобновить» экран обещал 9 991 ₽ свободных, когда на деле оставалось 6 657,64 ₽:
клиент считал новую кампанию на несуществующие деньги и получал отказ, которого
не ждал. Правда появлялась только после перезагрузки.
Стало: список кампаний сообщает «деньги подвинулись», экран перечитывает плашку.
Сигнал шлют ровно те три действия, что двигают деньги: запуск, пауза, возобновление.
Сторож держит не содержимое плашки (оно зелено и при поломке), а сам факт
повторного обращения за кошельком после денежного действия.
2) Летопись не фиксировала ни постановку заморозки, ни снятие.
Заморозка писалась суммой 0,00 ₽ — жёстко зашитой, снятие не писалось вовсе.
Стало: заморозка пишется настоящей суммой со знаком минус (деньги ушли из
свободных, баланс не двигается), снятие — отдельной строкой типа release.
Подпись человеческая и с номером: «Заморозили под кампанию №6».
3) На экране кошелька вместо истории стояло «появится позже».
Стало: живая история движений — новая ручка GET /api/advertising/wallet/transactions
(последние 100, свежие сверху, чужие не отдаёт) и лента на экране: подпись
человеческими словами, сумма со знаком, дата по Москве. У заморозки и её снятия
отдельная пометка «баланс не изменился», чтобы клиент не принял резерв за списание.
4) Карточка кампании называла не ту сумму.
Показывалось поле budget_rub — число, которое клиент когда-то вписал сам и которое
в расчёте денег не участвует вообще: «Бюджет показов 200 ₽» при заморозке 3 333,36 ₽.
Стало: «Смета показов» — считанная сервером (показы × цена за 1000, та же арифметика,
что и у заморозки), плюс строка «Зарезервировано» с живой бронёй по этой кампании.
Схема не менялась — все поля летописи уже были.
Проверено: 375 сторожей рекламы, 748 по смежным кошелькам (телеграм и СМС ходят тем же
сервисом), 2042 на фронте — все зелёные. Статанализ 0 ошибок, типы Vue чисты, стиль
в изменённых файлах чист. Все четыре сторожа приняты вырезанием: на старом коде красные.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>