## Why При тесте публикации с медиа сквозь веб выяснилось: `dry_run` в POST /api/v1/publish (services/publisher/app/main.py:42, модель `PublishRequest.dry_run: bool = False`) НИГДЕ не используется в теле — публикация уходит в Telegram реально даже при `"dry_run": true`. Это опасно: тестовые запросы засоряют канал (сегодня ушли реальные сообщения 11/12, пришлось удалять вручную). ## What Changes - services/publisher/app/main.py: при `payload.dry_run == True` НЕ вызывать telegram.publish, вернуть эмуляцию результата (ok, результаты с message_id=0 и флагом dry_run=true), при этом сделать вид, что опубликовано (для сквозного теста веб → publisher без TG). ## Why Not - Не менять веб: веб всегда шлёт dry_run=false (реальные approve). dry_run — только для тестов/curl. ## Acceprance - `curl ... -d '{"card":{...},"dry_run":true}'` → результат с dry_run:true, НЕ уходит в TG (можно проверить: views по message_id=0 → 404). - `curl ... -d '{"card":{...},"dry_run":false}'` → реальная публикация (как раньше).