Hermes v0.20.3: O Patch da Resiliência — Cron Jobs que se Curam Sozinhos


Seu cron job morreu às 3h da manhã. Sem erro, sem notificação — o painel do agendador mostrava tudo “saudável”, e você só descobriu às 9h, quando os dados já estavam desatualizados. Isso não é hipotético: em 2026-08-14, a própria frota hospedada do Hermes perdeu 4 execuções noturnas consecutivas, e o único rastro era um único WARNING banal enterrado em um arquivo de log. A v0.20.3 (tag v2026.8.16.2) é o patch exatamente para essa classe de problema: ela ensina o Hermes a perceber as próprias falhas e corrigi-las em vez de deixar a bagunça para você.

A janela mesclou cerca de 125 PRs e 250 commits. As notas oficiais prometem a documentação completa com a v0.21.0 — mas as partes mais valiosas deste patch podem ser explicadas agora mesmo.

Cron: de “morrer em silêncio” a “se auto-curar”

Comece pela parte que mais dói. O agendador do Hermes costumava ter várias maneiras de morrer “saudável” — cada uma delas podia parar jobs por horas ou dias enquanto o sistema parecia normal:

  • Esgotamento de file descriptors (EMFILE): o ticker tratava todo erro de lock como “alguém mais está segurando o lock”, então um esgotamento de fd no arquivo de lock era registrado como um tick bem-sucedido — e nenhum job voltou a rodar;
  • Jobs travados: um job que errou uma vez tinha o next_run_at estacionado no futuro, invisível para qualquer varredura e imune a reinícios do gateway;
  • Disparos perdidos de providers externos: quando um cron hospedado como o Chronos nunca entregava um disparo, o job ficava estacionado no passado para sempre.

A v0.20.3 corrige os três. O EMFILE agora é reportado com honestidade e o ticker tenta recuperar file descriptors no melhor esforço (backoff exponencial, limitado a 15 minutos); jobs travados se rearmam automaticamente no próximo tick — respeitando a expressão cron, então um agendamento só de dias úteis nunca dispara num sábado; e os disparos perdidos por providers externos são recuperados localmente pelo gateway após um período de graça.

A janela de recuperação é configurável:

cron:
  misfire_grace_minutes: 10   # padrão 10; 0 ou negativo desativa a recuperação

Igualmente importante: as execuções perdidas finalmente ficam visíveis. Cada disparo com falha grava um last_fire_error no registro do job, exibido como uma linha vermelha ⚠ Missed scheduled fire: no hermes cron list, além do dashboard e da saída da própria ferramenta cronjob list do agent; a próxima execução bem-sucedida limpa o erro. Em vez de vasculhar logs para descobrir se um job rodou, você roda:

hermes cron list

Se você usa um provider de cron externo (Chronos / cron gerenciado hospedado), rode esse comando uma vez após atualizar para confirmar que nada está pendente. Para o panorama completo de agendamento, monitoramento e preflight checks, veja o nosso guia completo de automação de cron.

MCP: falando o protocolo stateless de 2026-07-28

Esta janela também trouxe a migração para o SDK MCP 2.x e suporte de ponta a ponta ao protocolo stateless publicado em 2026-07-28 — em termos simples, a nova geração de servidores MCP não exige mais o handshake initialize, e o Hermes se conecta a eles sem configuração extra.

Cada servidor MCP pode declarar uma chave protocol:

mcp:
  servers:
    my-server:
      url: https://example.com/mcp
      protocol: auto   # auto (padrão): tenta o handshake legado, com fallback para server/discover

auto custa zero round-trips extras para os servidores existentes, stateless força o discover primeiro e legacy desativa o fallback por completo. Dois detalhes da especificação também são tratados: as dicas de cache ttlMs/cacheScope vindas de tools/list vão para um cache de schema com expiração (TTL), e o registro OAuth segue a nova especificação (application_type nativo + validação de iss do RFC 9207). Mais profundidade de configuração de MCP está no nosso guia de variáveis de contexto do MCP.

Novos providers: CommandCode e Muse Spark

Esta janela trouxe duas adições de providers:

CommandCode (commandcode.ai) agora é um provider de primeira classe — uma única chave cobre 30+ modelos abertos e proprietários nos planos GOAT/Pro/Max/Provider:

hermes setup   # ou configure manualmente
export COMMANDCODE_API_KEY="your-key"
hermes --provider commandcode

Prefere a Messages API da Anthropic? O profile commandcode-anthropic fala essa língua com a mesma chave. E no main (ainda sem nenhuma tag de release), a Meta Model API (Muse Spark) entra como um plugin embutido — --provider meta-ai funciona direto, com autenticação via MODEL_API_KEY (o alias META_API_KEY também funciona), oferecendo muse-spark-1.2 e muse-spark-1.2-contributor.

Botões de desfazer para edições do agent: /worktree e /rollback

Dois comandos inspirados no Copilot CLI chegaram para acalmar a ansiedade de “o agent detonou meu repositório”.

/worktree new abre um git worktree isolado no meio da sessão, sem reiniciar:

/worktree new my-experiment

O Hermes cria .worktrees/my-experiment/ dentro do repositório (branch baseada na tip do remoto recém-buscada) e redireciona para dentro dela as operações de terminal e arquivos da sessão. Ao terminar, a tree só é mantida se tiver commits ainda não enviados (unpushed), exatamente como no hermes -w. /worktree sozinho mostra a tree ativa; /worktree list lista todas.

/rollback agora usa por padrão a restauração segura: o Hermes mantém um ledger por projeto de cada arquivo que escreveu (sha256 de cada gravação efetivada), então um rollback reverte apenas as alterações feitas pelo agent, apaga os arquivos criados pelo agent e preserva suas edições manuais. Passe --all ou --force para restaurar tudo; os arquivos pulados são reportados com uma dica. Se o agent estragou um arquivo que você também editou à mão, é a diferença entre um resgate e um desastre.

Como atualizar

hermes update

Em seguida, rode hermes doctor para verificar a instalação e reinicie o gateway (hermes gateway). Se você usa um provider de cron externo, confira hermes cron list uma vez — certifique-se de que não há acúmulo pendente.

A lista completa de mudanças está nas notas de release da v0.20.3; os destaques do patch anterior — registro de conexões e deep links de MCP — estão na nossa análise da v0.20.2.