🛡️ Por que esse é o primeiro cron
Backup diário pro GitHub é o cron de menor risco e maior valor que você pode criar no dia 1. Ele só faz git add && commit && push dentro de ~/.hermes. Não toca em sistema, não chama API externa de risco, não gasta tokens caros, não tem efeito colateral além de subir um commit.
⚖️Por que NÃO começar com cron ambicioso
- "Responder email automaticamente" → risco alto de enviar mensagem errada antes de você confiar
- "Postar conteúdo no Twitter/IG" → impacto público se errar tom
- "Pagar boleto/agendar transferência" → financeiro merece muita validação manual
- "Backup pro GitHub" → puramente útil, zero efeito colateral, falha é silenciosa
✓Princípio de progressão
Começar pelo cron mais útil e mais seguro testa o sistema inteiro (gateway → AIAgent → tools → permissions → entrega) sem pôr nada importante em risco. Se funcionar, você ganha confiança e proteção real. Se quebrar, você não perde nada além de tempo de debug.
💬 Sintaxe natural via Telegram
A forma mais rápida de criar um cron: comando slash no Telegram. Você não precisa decorar a sintaxe cron clássica (0 0 * * *) — Hermes interpreta linguagem natural e gera o job estruturado.
📤 Comando completo
/cron add "every 1d at 00:00" "Faça commit com timestamp e push das mudanças do agente para o GitHub. Use mensagem 'Backup automático {data}'. Se não houver mudanças, apenas reporte 'Sem alterações'."
🕐 Sintaxes aceitas
"every 30m"— a cada 30 minutos"every 2h"— a cada 2 horas"every 1d at 09:00"— diariamente às 9h"every 1d at 00:00"— diariamente meia-noite"every monday at 08:00"— toda segunda às 8h"weekly"— uma vez por semana
🔧Comandos relacionados
/cron list— todos os jobs agendados, com next_run_at/cron remove ID— apaga um job/cron run ID— força execução agora (útil pra testar)/cron pause ID//cron resume ID— pausar temporariamente
⌨️ Sintaxe CLI: hermes cron create
Equivalente CLI da criação de cron. Mais explícito que o slash command — ideal para script de provisioning idempotente quando você for replicar o setup em outro VPS. Pode versionar como bootstrap.sh e rodar em ambientes novos.
⚡ Comando equivalente
docker exec -it hermes hermes cron create \
"every 1d at 00:00" \
"Backup do agente: commit + push das mudanças" \
--workdir /root/.hermes \
--deliver telegram \
--name backup-diario
🚩 Flags principais
| Flag | Função |
|---|---|
--workdir <path> | cwd do job; carrega AGENTS.md/CLAUDE.md daqui |
--deliver <plat> | destino: telegram, discord, all, origin |
--skill <name> | injeta skill no início da sessão fresh |
--no-agent | script-only sem LLM (pra watchdogs) |
--script <path> | (com --no-agent) script .sh ou .py a executar |
--name <str> | identificador legível pra você (default: gerado) |
💡Telegram vs CLI: quando usar qual
Telegram = exploração interativa, feedback imediato, ajuste rápido. CLI = automação, replicação, scripts de bootstrap. Pra criar 1 cron, Telegram é mais rápido. Pra subir 10 crons numa VPS nova, CLI num .sh é determinístico.
🌍 Timezone: UTC vs local
Pegadinha clássica: container Docker roda em UTC por padrão. "every 1d at 00:00" dispara à meia-noite UTC, que é 21:00 do dia anterior em Brasília (UTC-3). Cron rodando 3 horas antes do esperado destrói percepção e bagunça logs.
🛠️ Duas formas de configurar
# Opção 1: env var no docker-compose.yml (preferida)
services:
hermes:
environment:
- TZ=America/Sao_Paulo
# Opção 2: config.yaml dentro de ~/.hermes/
timezone: "America/Sao_Paulo"
# Após mudar, restart
docker compose restart
# Verificar timezone ativo
docker exec hermes date
# Esperado: "Sun May 10 18:32:00 -03 2026" (não UTC)
🗺️IANA timezone strings comuns
America/Sao_Paulo— Brasil sudeste (UTC-3)America/Bahia— Bahia (UTC-3, mesmo offset)America/Manaus— Amazonas (UTC-4)Europe/Lisbon— Portugal (UTC+0/+1 com DST)UTC— meridiano de Greenwich (default container)
⚠️Sintoma típico
"Marquei o cron pra meia-noite mas ele rodou às 21h." Container ainda em UTC. Hermes injeta timezone do sistema no system prompt — sem TZ certo, ele "pensa" estar 3 horas adiantado. Configurar timezone certo no início economiza muito retrabalho.
✅ Permissões: always allow git push
Na primeira execução do cron, Hermes vai pedir permissão pra rodar git commit e git push. Marque "always allow" — é uma ação segura, recorrente, com escopo travado pelo PAT fine-grained do módulo 2.5.
🤝Por que confiar nessa permissão
- Token cirúrgico: só permite mexer em 1 repo (o de backup)
- Operação reversível: commits sempre podem ser revertidos com
git revert - .gitignore protege segredos: mesmo se commit estranho, .env não vai junto
- Audit trail: cada push fica registrado no GitHub com timestamp
- Sem "always": cron diário trava esperando você responder — quebra o propósito
🔍 Auditar permissões periodicamente
# Listar permissões aprovadas
docker exec hermes hermes permissions list
# Revogar uma específica
docker exec hermes hermes permissions revoke ID
# Arquivo bruto (raramente preciso)
docker exec hermes cat /root/.hermes/permissions.json
📋Checklist mensal de auditoria
- Listar permissions e revogar as que você não reconhece
- Confirmar que tokens (GitHub, OpenRouter) ainda estão ativos e com escopo certo
- Olhar último push no GitHub — algum dia sem backup?
- Verificar
~/.hermes/logs/por erros recorrentes
🔍 Verificação: /cron list, logs, GitHub
"Achar que rodou" é diferente de "ter rodado". Confirmar com fato fecha o loop. Três pontos de verificação: /cron list (mostra próximo run), logs (mostram execução), GitHub (mostra commit real).
✓ Checklist de verificação
# 1. Cron está agendado?
/cron list # via Telegram, ou:
docker exec hermes hermes cron list
# 2. Forçar execução agora pra testar (não esperar 24h)
docker exec hermes hermes cron run backup-diario
# 3. Ver logs do tick
docker exec hermes tail -50 /root/.hermes/logs/cron.log
# 4. Conferir commit real no GitHub
# Abre o repo no browser, vê commits do dia
# 5. Buscar histórico via session_search
"Mostre as últimas execuções do cron de backup"
📁Onde fica o estado do cron
~/.hermes/cron/jobs.json— todos os jobs com next_run_at~/.hermes/cron/.tick.lock— lockfile previne double-run~/.hermes/logs/cron.log— execuções, erros, exit codes~/.hermes/state.db— sessões SQLite com histórico de cada cron
🔧Se não rodou no horário esperado
- Container parou:
docker ps; se off,docker compose up -d - Timezone errado:
docker exec hermes date, ajustar TZ se UTC - Lock file travado: apagar
~/.hermes/cron/.tick.locke restart - Permissão bloqueada: ver
permissions list, marcar always allow - Token expirado: regere PAT no GitHub, atualize via
config set
🎯Resumo do módulo
Próxima trilha:
Trilha 3 - 🏛️ Os 6 pilares do Hermes (Soul, Memory, Skills, Crons, Permissions, Sessions)