A v0.21.4 saiu sem release notes — eis dez mudanças que já estão rodando na sua máquina


Sábado de manhã você roda hermes update e a versão salta da v0.21.3 para a v0.21.4. Você abre as release notes para descobrir o que de fato mudou e encontra uma página de poucos parágrafos, com uma linha no final dizendo que a análise completa chega com a v0.22.0. Isso não é preguiça: os tags de patch do ciclo v0.21 existem para dar às imagens Docker, ao Hermes Cloud e às implantações hospedadas uma âncora estável, e a documentação curada chega com a próxima minor. O detalhe incômodo é que o comportamento já entregue na sua máquina não vai esperar pela v0.22.0.

Este post separa dez coisas dessa janela que estão mescladas na main e presentes neste tag, cada uma com um comando que você pode rodar ou um bloco de configuração que você pode colar. Nenhuma delas é refatoração interna: três mudam a topologia do seu gateway, duas mudam o seu formato de saída ou a sua conta, e o resto devolve tempo imediatamente.

Primeiro, as contas: por que este tag existe

O corpo da release é incomumente direto sobre isso. Este é um tag de patch que agrupa tudo o que foi mesclado desde a v0.21.3 numa versão estável para consumidores downstream (imagens Docker, Hermes Cloud, implantações hospedadas), com as notas curadas completas adiadas para a v0.22.0. Medido no commit 4b8a8134009a8727a289bcabeb0019fedd353128:

Métrica Valor (desde a v0.21.3)
Commits não-mesclados 5.071
Arquivos alterados 5.169 (+312.961 / −62.855)
PRs mesclados 1.812
Issues fechadas 2.116

Quem usa Docker pode baixar o tag diretamente como nousresearch/hermes-agent:v2026.9.21; instalações via git continuam atualizando com hermes update. Tudo abaixo está ordenado pelo quanto muda o seu dia.

Dez coisas que já foram entregues

1. Um processo de gateway por host, não um por profile

Esta é a maior convergência arquitetural da janela: exatamente um processo hermes gateway run por host, por usuário do SO, servindo todos os profiles. Os verbos de ciclo de vida mudaram de sentido junto. hermes -p X gateway run não inicia mais um segundo processo enquanto o gateway do host está vivo — ele se anexa: imprime o PID do gateway do host e o conjunto servido, e sai com 0. hermes gateway start --all e restart --all agora significam aquele único multiplexador de host, e nunca varrem um gateway que outro profile esteja rodando.

A chave antiga gateway.multiplex_profiles: false está aposentada: ela ainda é analisada, mas não consegue mais fixar um segundo processo de gateway — resolve exatamente como uma chave não definida, registra um aviso e aponta para o comando de migração. Se você está atualizando de uma topologia por profile, olhe o plano antes de tocar em qualquer coisa:

hermes gateway migrate --multiplex --dry-run   # imprime o plano, os bloqueadores e os reinícios que ele implica
hermes gateway migrate --multiplex             # converge de verdade (adicione --yes em shells não interativos)

O caminho de migração passo a passo, os três incidentes reais por trás dele (incluindo um P1 que podia apagar o MEMORY.md do profile errado) e uma checklist pós-atualização estão num post separado: Um gateway por host: a migração multiplex-only. O guia anterior, multiplex por padrão, cobre como o recurso chegou pela primeira vez.

2. Conectores: conecte um app de dentro da conversa

Conectar um app costumava significar editar configuração, abrir o navegador e colar chaves. Agora o usuário pede no chat para conectar o Notion e o backend faz toda a conexão: coleta os valores, mostra o link de login e o agent pode chamar a nova ferramenta no mesmo turno. Os três clientes interativos desenham o mesmo passo de configuração — um diálogo no app de desktop, um callout no hermes --tui, um painel no CLI clássico. O repositório traz um catálogo de 65 servidores MCP revisados, 55 dos quais declaram auth.type: oauth.

3. --format stream-json para execuções legíveis por máquina

Execuções one-shot agora podem emitir JSONL:

hermes chat -q "Summarize this repository" --format stream-json

Cada linha do stdout é um objeto JSON (system, text, tool_use, tool_result, result), diagnósticos e a linha session_id: ficam no stderr, e o registro final result carrega exit_code, estatísticas de token e duração. Ele exige -q (ou --query-file), implica modo quiet e rejeita --tui. A tabela completa de campos de evento, a semântica de exit code (0 / 1 / 130, mais 75 para um worker de Kanban) e como consumi-lo num pipeline estão aqui: Ensinando o CI a ler o Hermes: o fluxo de eventos stream-json.

4. skills.auto_load fixa skills em cada nova sessão

Três linhas no config.yaml fazem essas skills serem totalmente carregadas no início de cada nova sessão, e não apenas listadas no catálogo:

skills:
  auto_load:
    - release-notes
    - qa-multilingual

Ele vale para agentes de CLI, TUI, gateway, cron e API, e tem escopo de profile. A injeção resolve uma vez por agent — trocas de modelo, compressão e restauração de prefixo estático reutilizam os mesmos bytes renderizados — então o seu cache de prompt permanece intacto. Quando evitá-lo e como ele deduplica contra --skills: Fixando skills em cada sessão.

5. mcp.discovery_concurrency acaba com a tempestade de spawn no boot

A descoberta de MCP antes fazia fan-out com um asyncio.gather sem limite: oito servidores stdio significavam oito árvores de processos nascendo no mesmo instante, e numa frota multi-profile cada profile servido rodava a sua própria passada. As conexões agora são limitadas por mcp.discovery_concurrency, padrão 4, com 0 significando ilimitado:

hermes config set mcp.discovery_concurrency 2   # máquinas mais lentas, memória mais apertada

As medições no PR (8 servidores stdio): a concorrência de pico caiu de 8 para 4 no valor padrão, com a passada levando 4,0 s → 5,6 s; definido como 2, o pico virou 2 e 13,2 s; 0 restaurou o pico 8 e 3,5 s. Você troca um boot um pouco mais lento por nenhuma tempestade de processos.

6. hermes sessions set-journal-mode converte o store offline

Se você configura database.journal_mode: delete enquanto o state.db já está em modo WAL, o Hermes nunca vai fazer downgrade ao vivo — o gateway, o dashboard ou o cron podem segurar commits não checkpointados, e fazer downgrade por baixo deles destrói esses commits. A única saída antes era rodar um PRAGMA na mão. Agora existe um comando:

hermes sessions set-journal-mode delete                          # WAL -> rollback journal
hermes sessions set-journal-mode wal                             # de volta para WAL
hermes sessions set-journal-mode delete --db ~/.hermes/kanban.db # outro store do Hermes

Ele varre os detentores primeiro, recusa enquanto qualquer processo (ou seus sidecars -wal/-shm) ainda tiver o arquivo aberto, nomeia cada pid — comando: caminho e relê os bytes do cabeçalho para verificar o novo modo. Ele também recusa de saída no Windows, onde a varredura de detentores não está disponível, e recusa habilitar WAL num sistema de arquivos entre VMs (virtiofs/9p). Contexto: doctor e escritores WAL ao vivo e state.db WAL dentro do Docker.

7. DMs não autorizadas podem ser recusadas com educação

O gateway tinha duas respostas para uma DM não autorizada: pair (mandar para a pareação) ou ignore (descartar). Agora existe uma terceira, com texto personalizável:

gateway:
  unauthorized_dm_behavior: decline
  unauthorized_dm_decline_message: "This bot is private. Ask the owner for an invite."

Você também pode sobrescrevê-la por plataforma no bloco extra daquela plataforma. Para um assistente pessoal acessível num canal público, isso é mais profissional do que silêncio: o remetente descobre que a mensagem chegou e por que não foi respondida.

8. session_search ganhou uma janela temporal e um retry relaxado

A recuperação entre sessões agora aceita limites after / before, tanto datas ISO quanto durações relativas (7d, 24h, 2w):

  • after="7d" — apenas sessões iniciadas na última semana;
  • before="2026-09-01" — apenas o histórico até 1 de setembro (um valor só de data significa meia-noite UTC daquele dia);
  • a forma relativa before="7d" significa mais antigo que uma semana, não a última semana — fácil de inverter.

A recuperação também tenta de novo uma vez com correspondência OR relaxada quando a correspondência estrita não encontra nada, então um vago “acho que mencionei a coisa do deploy” acerta com mais frequência. O índice em si foi reconstruído como um caminho rápido sem LLM antes (veja limites de sessão); isto preenche a dimensão temporal.

9. Uma pilha de pequenas vitórias no desktop

  • Seletor de fonte do chat/interface — escolha uma fonte para a transcrição e outra para a interface, separadamente, incluindo faces de legibilidade como a OpenDyslexic.
  • Minimizar para a bandeja — opt-in: minimizar esconde as janelas sem destruir renderers nem parar o trabalho; Close, Alt+F4 e Cmd+Q mantêm o comportamento atual, e a bandeja oferece Show Hermes / Quit Hermes.
  • Toque para invocar o HUD — toque e solte Cmd+Option no macOS, Ctrl+Alt no Windows/Linux X11, para trazer o HUD à frente a partir de outro app (desligado por padrão, salvo por dispositivo, as duas teclas precisam ser soltas em até 500 ms).
  • Gaveta de status por chat — uma crista acima do composer esconde a pilha de status e a linha do git juntas; cada conversa lembra a sua escolha.
  • Desinstalação de plugin pelo hub de Plugins, além de atualizações do motor local com um clique.

10. Atualizações de catálogo: modelos de vídeo e páginas de plugin

A família de vídeo da FAL ganhou LTX 2.5 (o modelo aberto de áudio e vídeo da Lightricks: áudio nativo, até 20 s / 4K para image-to-video, presets de movimento de câmera) e Kling O3 Standard (Kuaishou: narrativa nativa multi-shot, áudio opcional, 3–15 s). O catálogo de plugins ganhou uma dúzia de plugins da comunidade (tailscale, ssh, shodan, terminal, rss, resetwatch, done-bell, kiwi, cognee e outros), e todo plugin e autor do catálogo agora tem a sua própria página, com o README fixado num commit revisado.

Vale a pena saber, sem ação necessária

A mesma janela também estreitou uma série de arestas: hermes -p X update agora reinicia o gateway do host uma vez para a máquina inteira, com o aviso chegando a todos os profiles servidos (#118108); o Desktop se anexa ao backend do host em execução em vez de gerar um por profile (#118246); profiles nomeados leem de novo o auth.json do profile raiz, corrigindo as falhas No Codex credentials stored pós-atualização (#118373); um aviso pós-atualização endereçado a uma plataforma que nunca se conecta para de tentar novamente, em vez de registrar a cada 2 segundos para sempre (#118312); um 429 de gateway gerenciado em image_generate ou em vídeo FAL é reportado como rate limit e repetido uma vez, em vez de te mandar trocar de modelo ou definir FAL_KEY (#118311); e a chamada de auto-título não corre mais com a resposta num servidor de modelo self-hosted de slot único (#117494).

Cinco minutos de verificação após atualizar

hermes version                        # esperado v0.21.4 (tag v2026.9.21)
hermes doctor                         # avisos de storage / topologia de gateway primeiro
hermes gateway status                 # quem serve quais profiles
hermes gateway migrate --multiplex --dry-run   # atualizações de uma topologia por profile: leia o plano

Se você roda mais de um profile na máquina, o item 1 é o que vale o seu tempo: ele é ao mesmo tempo uma fronteira de segurança (profiles param de ler as credenciais uns dos outros) e uma de disponibilidade (um reinício de gateway por atualização, em vez de um por profile).

A versão curta

Um tag de patch sem notas curadas é normal; “sem release notes” não é o mesmo que “nada mudou”. As partes desta janela que merecem a sua atenção são a convergência da topologia de gateway e as correções de isolamento de profile — a primeira decide quantos processos rodam na sua máquina, a segunda decide se um profile pode ler as chaves e a memória de outro. O resto (saída estruturada, skills fixadas, concorrência de boot do MCP, conversão de journal mode) é o tipo de mudança que você adota no momento em que sabe que ela existe. A análise curada completa sai com a v0.22.0 e cobre tudo desde a v0.21.0; para o tag em si, veja a nossa página de release da v0.21.4.