Контент-фабрика для Дзена: ежедневная статья от новости до черновика
AI-пайплайн каждый день собирает новость, делает ресёрч, пишет и вычищает статью, генерирует обложку и кладёт готовый черновик в Дзен — человек только проверяет и публикует.
Задача
Ручной цикл от «нашёл новость» до «залил черновик в Дзен» занимает несколько часов: мониторинг, выбор темы, ресёрч, черновик, редактура, борьба с AI-водянистостью, промпт обложки, генерация, заливка в редактор. В ежедневном ритме это не масштабируется — либо публикуешь реже, либо качество падает, либо выгораешь.
Та же боль у любого бизнеса с регулярным контентом: корпоративный блог, SEO-статьи, товарные описания, новостные разделы. Различается масштаб, а не суть задачи. Задача — собрать автономный конвейер, который ежедневно проходит весь цикл без участия человека и оставляет за ним только проверку фактов и финальную публикацию.
Решение
Конвейер состоит из двух pipeline и двух CLI-инструментов, выстроенных последовательно.
news-digest собирает утренний дайджест: читает Gmail-рассылки через gcli, параллельно делает Exa web-search по AI/WebDev-топикам, группирует по 7 тематическим корзинам и сохраняет в researches/news/ai-news-YYYY-MM-DD.md. Автозапуск через systemd-timer 13:00 MSK. Идемпотентность: если дайджест за сегодня уже создан, повторный запуск ничего не делает — это важно при ручном перезапуске или сбое.
zen-article — 10-шаговый pipeline, оркестратор run.sh на bash. Каждый шаг пишет артефакт в .state/run-HHMMSS/, что даёт Smart Resume: упавший шаг перезапускается с места остановки без потери предыдущей работы. Ключевые решения:
- Разделение моделей по стоимости. Шаги 1–6 и 8 работают через qwen-code — agent harness поверх omnirouter, под ним Gemma 4 или GPT-5.5 в зависимости от шага. Дёшево, поддержка Exa MCP: выбор новости, ресёрч, черновик, критика, редактура, хуманизация, генерация промпта для обложки. Claude Sonnet 4.6 подключается только на шаге 7 — финальная стилизация под голос канала с калибровкой по последней опубликованной статье. Дорогую модель тратим точечно там, где разница в качестве ощутима.
- Критик — структурированный 23-пунктный чеклист (FAIL/WARN/OK). Каждое замечание содержит цитату из текста и конкретное предложение правки. Редактор на следующем шаге работает с этим выводом напрямую.
- Humanizer — 16 типов русско-специфичных AI-паттернов (шаблонные вводные, клишированные переходы, академический тон, избыточные уточнения и др.) плюс обязательный audit-пасс внутри того же вызова, который проверяет, что все 16 паттернов были явно рассмотрены.
- zen-style.md как база знаний. Единственный источник правды по стилю канала. Промпты не дублируют правила — они ссылаются на файл. Обновляешь один файл — все шаги автоматически получают актуальные правила. Это стандартный принцип контекстной инженерии: знания живут в базе, а не рассыпаны по промптам.
- Тестовый режим (
--test). Прогон по всем текстовым шагам без побочных эффектов: результат идёт в.state/test-run-*/, продакшен-лог не трогает, systemd-автозапуск не сбивается.
arena-cli генерирует обложку через Playwright — автоматизирует веб-интерфейс arena.ai без прямого API. Предыдущий шаг (08 — cover prompt) уже подготовил промпт под нужный стиль — arena-cli вставляет его в интерфейс и рендерит изображение через Nano Banana Pro или gpt-image-2. Внутри — паттерны Strategy (обход защит платформы), Template Method (цикл генерации), ModalWatcher для фоновой обработки модальных окон. Шаг fail-soft: если arena упала (rate-limit, login modal, timeout) — статья собирается без обложки, exit-code пишется в лог, пайплайн не останавливается.
content-bots dzen публикует собранный .md + PNG в черновик Дзен-студии через Playwright. BrowserManager хранит storage_state между запусками (повторный логин не нужен), добавляет human-like delays и обрабатывает fullscreen-оверлеи Дзена. Тоже fail-soft: если бот упал — файл статьи и PNG остаются, пайплайн завершается с предупреждением.

Human-in-the-loop — финальное «Опубликовать» намеренно оставлено ручным. Пайплайн не проверяет достоверность фактов, не знает о событиях после дайджеста, не контролирует соответствие заголовка и обложки. Пять минут ревью дешевле одного факапа.


Стек
Bash · qwen-code (agent harness, underlying: Gemma 4 / GPT-5.5 via omnirouter) · Claude Sonnet 4.6 · Exa MCP · Python 3.11 · Typer · Playwright (Chromium) · arena.ai (Nano Banana Pro · gpt-image-2) · pydantic-settings · systemd timers
Результат
- Автономность: ежедневный автозапуск (systemd 14:00 MSK), идемпотентность на уровне каждого pipeline, две fail-soft точки не останавливают выпуск статьи.
- Время ручного цикла (оценочно): мониторинг + выбор темы ~20 мин, ресёрч ~30–60 мин, черновик + редактура + дехантеризация ~60–90 мин, обложка ~15–30 мин, заливка в редактор ~10 мин — итого 2–4 ч/статья.
- Время пайплайна (оценочно): ~10–20 мин машинного времени (LLM-шаги последовательные) + ~5 мин ручной проверки на финале.
- [Метрика: дочитываемость статей — данные появятся после ~30 публикаций]
- [Метрика: CTR превью в Дзен — заполнить вручную]
- [Метрика: статей опубликовано за первый месяц работы пайплайна]
Что не сработало
Обложка нестабильна. arena.ai периодически падает: rate-limit, login modal, timeout генерации. Первая версия останавливала весь пайплайн при ошибке обложки. Решение — fail-soft: статья собирается без обложки, наличие PNG и exit-code пишутся в отдельный лог .state/run-*/08b-arena.log. Обложку можно добавить вручную позже.
Полная автопубликация опасна. Пробовал добавить шаг автоматического нажатия «Опубликовать» — отказался. Пайплайн не проверяет факты, не знает о свежих событиях после дайджеста, не контролирует заголовок и теги. Пять минут ручного ревью дешевле одного публичного факапа.
Тестовые прогоны ломали guard продакшена. Запуск --test через cron-обёртку (scripts/zen-article.sh) писал === done === в лог, и дневной guard считал статью уже готовой. Решение — отдельный префикс test-run-* и явный запрет запускать тест через cron-обёртку.