9f3be090e4
Приёмка блока Яндекса 03.08.2026 вскрыла неверный порядок в запуске кампании. Заморозка стояла последней — уже после создания в Директе кампании, группы, объявлений, отправки на модерацию и ВКЛЮЧЕНИЯ показа. Не хватило денег: клиент получал отказ, кампания в портале оставалась черновиком, а в Яндексе крутилась включённая реклама, за которую платила Лидерра. Правильный порядок в проекте был известен — у кнопки «Возобновить» деньги резервируются до обращения к Директу, и там об этом написано прямо. В запуске он просто не был применён. Сначала сторож, потом починка. CampaignLauncherTest → «не хватает денег — в Директе ничего не создано»: кошелёк 100 руб, смета 12000 руб. На прежнем коде упал с «записано неожиданное обращение». Держит именно ПОРЯДОК: пока деньги не заморожены, Директ можно только читать — ни одного вызова с методом кроме get. Проверка «деньги не списались» тут бесполезна, она зелёная и при поломке. Новый порядок в CampaignLauncher::run: 1. годность аудитории — может ответить «зайдите позже», деньги ещё не тронуты; 2. сверка настоящих размеров креативов — это чтение, метод get; 3. заморозка денег; 4. и только теперь все записи в Директ. Заодно закрылась вторая беда: сверка размеров стояла после создания кампании и группы, и несовпадение размера оставляло в кабинете кампанию-сироту. Сторож принят вырезанием: старый порядок — красный, починка — зелёный. 362 теста блока рекламы зелёные, статанализ 0 ошибок. Отчёт приёмки с остальными находками — в docs/superpowers/runbooks/. Боевого не касался: кошелёк и кампании остались как были. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>