a90d60a351
SendSmsCampaignJob после успешной отправки пишет мгновенный эпизод (started_at = ended_at) в летопись sales_ad_audience_warming_episodes — один на фирму за кампанию (у фирмы может быть несколько номеров в одной рассылке, это одна «стрельба»). Повтор в новой кампании = новый эпизод («СМС ×N» = число волн). Регистратор внедрён методным DI (nullable + app()). Отдельным коммитом намеренно: СМС-блок правит и параллельная сессия — правка изолирована в двух файлах. Проверено: SendSmsCampaignJobTest 9/9, Sales 427/427, stan 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>