Cron-планировщик Hermes Agent — третья крупная форма агентской работы, после чата ход-за-ходом и /goal-циклов. С cron'ом агент крутится по расписанию, без присмотра, и результат уходит в ту мессенджер-платформу, которую ты захотел — или сразу во все через deliver=all (#21495).
Этот пост проходит через сборку одного конкретного джоба — ежедневного утреннего отчёта — и на нём же объясняет, как планировщик реально работает. Тот же паттерн справляется с ночными бэкапами, недельными security-аудитами, on-call-передачей, или с чем угодно, что ты иначе вытягивал бы хрупким bash + cron'ом.
Что мы собираем
По будням в 8 утра:
- 1.Прочитать ночную почту (с 5 вечера вчерашнего дня)
- 2.Подтянуть GitHub-уведомления (issue, PR review, упоминания)
- 3.Глянуть сегодняшний календарь на первые 4 часа
- 4.Свести три источника в одно сообщение в Telegram
Если случилось что-то важное — сообщение подробное. Если ничего не случилось — сообщение в одну фразу: «Ночь тихая. Календарь лёгкий до 11.»
Шаг 1: определить джоб
hermes cron add проведёт через это. CLI запрашивает: имя, расписание, описание джоба (естественным языком) и таргеты доставки.
$ hermes cron add
Name: daily-morning-report
Schedule (cron expression or natural language): 0 8 * * MON-FRI
Description: |
Read overnight email (since 5 PM yesterday).
Pull GitHub notifications via the github skill.
Check today's calendar via google-calendar for the first 4 hours.
Summarize all three into one Telegram message.
Be brief when nothing important happened.
Delivery: telegram
0 8 <em class="italic text-slate-200"> </em> MON-FRI — это стандартный cron-синтаксис: минута 0, час 8, каждый день месяца, каждый месяц, понедельник–пятница. Hermes принимает и cron-синтаксис, и более рыхлые формулировки естественного языка вроде «every weekday at 8 AM».
Шаг 2: что крутится в 8 утра
В следующий будний день в 8 утра Hermes поднимает изолированную сессию агента с таким содержимым:
- •Описание джоба — как начальное user-сообщение
- •Те скилы, которые агент решит вызвать (
email,github,google-calendar) - •Delivery-hook, который заливает финальный ответ в Telegram
Никакого персистентного контекста, никакого пользователя, который что-то печатает. Агент читает описание, дёргает скилы, готовит черновик сообщения, отправляет. Обычно — 15–30 секунд.
Вывод приходит в Telegram сообщением от твоего Hermes-бота. Если джоб занял больше обычного или попал в ошибку — на тот же канал прилетает ещё и error-сообщение.
Шаг 3: deliver=all — расходящийся веер по всем платформам
По умолчанию доставка идёт на одну платформу — ту, что ты задал в cron add. Если хочешь, чтобы отчёт упал везде, куда ты можешь до него дотянуться, ставь:
hermes cron edit daily-morning-report --deliver all
Теперь сообщение летит на каждую подключённую мессенджер-платформу разом — твой Telegram, Discord, Slack, WhatsApp, Signal, LINE, SimpleX, что бы ты ни настроил. v0.14.0 явно протянул per-платформенную доставку для cron'а (#21495).
Когда это полезно: хочешь гарантию, что увидишь сообщение, в каком бы из приложений ты сейчас ни сидел.
Когда это overkill: утром ты смотришь только в одну платформу. Тогда выбираешь её одну.
Шаг 4: посмотреть, что в расписании
hermes cron list
Показывает всё, что в расписании, время следующего запуска, статус последнего запуска. v0.14.0 добавил lookup по имени для операций над джобами (#26231), так что можно ссылаться на джобы по имени, а не по ID:
hermes cron logs daily-morning-report --last 5
hermes cron disable daily-morning-report
hermes cron run-now daily-morning-report # дёрнуть сразу, вне расписания
Что происходит, когда джоб падает
Cron-джобы крутятся в своей собственной sandbox-сессии (те же бэкенды, что у интерактивного Hermes — см. пост про sandbox-бэкенды). Если вызов скила падает, агент получает ошибку и либо ретраит, либо честно докладывает.
Если падает весь джоб (сам агент завершается с ошибкой), Hermes уведомляет тебя на дефолтную мессенджер-платформу — с ошибкой и ссылкой на логи. Работа v0.13.0 над session durability означает, что перезапуск gateway не теряет ожидающие cron-доставки — дедупликация идёт через атомарный claim с откатом при сбое (#23401).
Несколько реально полезных джобов
Это паттерны, которые люди реально гоняют:
Верификация ночного бэкапа. Cron в 3 ночи: перечислить бэкап-снапшоты, проверить, что сегодняшний есть и не пустой, громко орать, если нет. deliver=all, чтобы, если что-то сломалось, ты увидел, как только проснулся.
Недельный security-аудит. Cron в воскресенье в 10 вечера: подтянуть advisory по зависимостям, отсканировать известные CVE в твоих lockfile'ах, суммировать новые уязвимости. Supply-chain-advisory-checker из v0.14.0 (#24220) делает это чище, чем самодельные скрипты.
Handoff on-call. Cron в пятницу в 5 вечера: прочитать пейджи этой недели, написать абзац передачи следующему дежурному. Доставка в общий Slack-канал.
Watchers (скил из v0.14.0, #21881). Опросить RSS-фид, HTTP-JSON-endpoint или GitHub-репо на изменения; уведомлять только когда что-то изменилось. В связке с cron'ом получается «скажи мне, когда X изменится» — одна из самых недооценённых примитивов автоматизации.
Куда уезжают логи
hermes cron logs daily-morning-report
По умолчанию — последние 10 прогонов. Каждый показывает: timestamp, длительность, какие скилы вызывались, что доставлено, что упало, если упало. Логи лежат в ~/.hermes/cron/logs/ и сами ротируются.
Почему это лучше, чем писать shell-скрипт
Тот же ежедневный отчёт можно собрать как bash-скрипт + cron + curl-в-Telegram + может, ещё крохотный вызов LLM. Многие так и делали.
Почему cron-на-агенте интересен:
- 1.Описание джоба — это спека. Никакого кода поддерживать не надо. Поменять «первые 4 часа» на «первые 6 часов» — отредактируй описание, никакого redeploy.
- 2.Скилы композятся. Добавить «ещё проверь Linear на новые тикеты» — одно предложение в описании. На shell-скрипте — это новый API-клиент.
- 3.Доставка развязана.
deliver=allозначает, что ты не пишешь 5 разных webhook'ов для 5 разных чат-приложений. Gateway уже говорит на всех 22. - 4.Ошибки можно отлаживать. Когда джоб падает, агент рассказывает, что он пробовал и почему упал, по-человечески. Bash-скрипты дают тебе exit code 1.
Это не значит, что agent-cron всегда правильный ответ — для джобов, которые должны быть на 100% детерминированными и завершаться за 30 мс, shell-скрипт всё равно лучше. Но для «сделай в это время что-нибудь осмысленное и расскажи мне» — cron-on-Hermes самый чистый инструмент в ящике.