8e91be53c3
Часть 3b-1 из 6. Из одной картинки клиента генерируется и сохраняется полный набор баннеров кампании (15 размеров Яндекса). - Таблица ad_campaign_banners (RLS tenant_isolation, GRANT crm_app_user SELECT/INSERT/DELETE, клиентская — srv_bypass не нужен). Модель AdCampaignBanner. - CampaignBannerService::generate — прогон исходной картинки по BannerSizes через BannerGenerator, файлы на приватный диск local, строки в БД; перегенерация заменяет набор. - CHANGELOG_schema v8.97 + предупреждение для Части 4 (джоб под crm_supplier_worker потребует GRANT + srv_bypass re-run, иначе тихий ноль). Тесты: 9/9 зелёные (Storage::fake). rls-reviewer: PASS. Spec: docs/superpowers/specs/2026-07-25-yandex-reklama-medijnaya-pokazy-design.md §4 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>