A v0.21.5 sai sem release notes de novo — como auditar o que a sua instalação realmente recebeu


Você vê “Hermes Agent v0.21.5 released” num feed, clica, e o corpo é um único parágrafo curto: esta é uma tag de patch que fecha a janela numa release estável para as imagens Docker e as implantações hospedadas, e o texto curado completo fica adiado para a v0.22.0. Você roda hermes update e o terminal diz que a atualização deu certo. E então — o que você realmente recebeu? Você não consegue dizer isso a partir de nada do que leu, e não tem certeza se atualizar hoje era sequer a decisão certa. Isso não é paranoia; é o que as tags de patch fazem com as pessoas. Então este post é sobre uma coisa estreita e prática: como responder a essa pergunta sem esperar por release notes.

Por que tags de patch muitas vezes saem sem notas

Entenda esta parte de uma vez e você para de remoer o assunto a cada poucas semanas.

O Hermes publica dois tipos de tag. Uma release semântica — v0.20.0, v0.21.0 — vem com um texto longo: destaques, áreas de funcionalidade, créditos de contribuidores. Uma tag baseada em data como esta, v2026.9.24, existe para outro trabalho: selar tudo entre a tag anterior e agora numa única versão estável e possível de baixar.

Por que isso precisa existir? Porque as imagens Docker, o Hermes Cloud e as implantações hospedadas são todos construídos a partir da tag de release mais recente, não da main. Uma correção que você mescla na main não chega aos usuários de nuvem enquanto não estiver dentro de uma tag. Então, quando já se acumulou o suficiente, uma tag de patch fecha a janela.

O custo é que nada nessa janela recebe um texto próprio e um nome individual. Esta janela tem 460 PRs mesclados, 1.610 commits não-merge, 4.828 arquivos alterados (+164.132 / −149.440) e 475 issues fechadas desde a v0.21.4, medidos no commit f97608f178d1ffeca59860195ab7da295f7c8e5f. O corpo da release é explícito de que nada disso é pulado — tudo é documentado junto na v0.22.0, que cobre tudo a partir da v0.21.0.

Dito de outra forma: “sem release notes” não significa “nada ali dentro”. A sua atualização é real. A lista é que ainda não foi escrita.

Passo um: descubra em que versão você está

Não vá pela sensação. Um comando:

hermes --version

Você vai receber algo como Hermes Agent v0.21.5 (2026.9.24) · upstream <commit>. Repare na relação entre os dois números:

O que você vê O que significa
v2026.9.24 A tag baseada em data — o nome na página de release do GitHub
v0.21.5 A versão semântica — usada em artefatos, nomes de imagem e no seu config.yaml

São a mesma release, não duas. Ver v2026.9.24 no GitHub enquanto a sua máquina diz v0.21.5 é normal — não tente “corrigir” isso.

Numa instalação via git você também pode ver em qual commit está:

cd ~/path/to/hermes-agent && git log --oneline -1

No Docker, leia a tag da imagem: nousresearch/hermes-agent:v2026.9.24 é esta release. Esta também adicionou um eixo de variantes — :latest-desktop / :main-desktop / :v*-desktop trazem Xvnc/Xfce e o Chromium com interface do Playwright, que é o que entrega o Bot Screen nas implantações hospedadas. Esses pacotes não podem ser instalados em tempo de execução na imagem publicada (usuário sem privilégios, sem sudo, /opt/hermes selado), então a camada da imagem é o único caminho.

Passo dois: pule os 460 PRs e leia a comparação

O link de comparação do “changelog completo” é o ponto de entrada autoritativo:

https://github.com/NousResearch/hermes-agent/compare/v2026.9.21...v2026.9.24

É enorme, mas você só precisa de três fatias dele: os arquivos novos (especialmente páginas novas em website/docs/, que indicam que uma funcionalidade chegou), o diff do config_defaults.py (que indica novas chaves de configuração) e o diff de hermes_cli/ (que indica novos comandos ou flags). Passar os olhos por essas três fatias rende mais do que ler os títulos dos PRs de cima a baixo.

Passo três: oito coisas já utilizáveis nesta janela

Tudo abaixo está presente no conteúdo da própria tag. Cada item vem acompanhado do que você realmente digita.

1. O Desktop ganha catálogos completos de francês, alemão e espanhol

O Desktop agora traz catálogos de interface completos para os três, selecionados em Settings → Appearance → Language. display.language: fr|de|es, além de aliases regionais como fr-CA, de-AT e es-419, resolvem para o catálogo correspondente em vez de cair de volta no inglês. Nomes de produto e identificadores (Hermes, MCP, API, OAuth, IDs de modelo) permanecem sem tradução.

2. Uma configuração de direção do texto: Auto / RTL / LTR

Mais abaixo na mesma página está Chat display → Text direction. Cada bloco de prosa do chat inferia a sua direção pelo primeiro caractere forte, o que erra na certa num parágrafo em árabe que começa com um nome latino. Agora você pode dizer isso diretamente: Auto mantém o comportamento antigo, RTL/LTR aplica um único dir à prosa e aos dois composers. O código permanece LTR, a moldura do app não vira e nenhum caractere de controle bidi é adicionado ao seu texto. É uma preferência de leitura na interface, não uma chave do config.yaml.

3. Entregas de webhook podem ser espelhadas na sessão do chat de destino

Uma entrega costumava ser fire-and-forget, então responder “qual build?” naquele chat recebia de volta “a quem você está se referindo?”. Uma rota agora pode aderir:

hermes webhook subscribe ci-alerts \
  --prompt "build {route} failed: {payload}" \
  --deliver telegram \
  --mirror-to-session

Um subscribe bem-sucedido imprime uma linha extra informando que cada entrega é espelhada na sessão do chat de destino. Desligado por padrão; só um booleano true de verdade adere. Os limites estão no guia dedicado linkado abaixo.

4. Adicione um modelo por slug em todos os seletores de modelo

Uma nova linha de rodapé Add custom model… transforma a caixa de busca do menu de modelos em entrada de slug, oferecendo uma linha por provider configurado conforme você digita, e o slug memorizado permanece na lista como uma linha normal com um × de remoção. Funciona no menu do composer, no diálogo de troca de modelo, em Settings → Model e na lista de edição de modelos.

5. Vozes locais param de recarregar a cada ativação

Uma nova chave de configuração, tts.keep_warm_seconds, padrão 60:

hermes config get tts.keep_warm_seconds    # 60
hermes config set tts.keep_warm_seconds 0  # descarrega imediatamente

Depois que o último lease é liberado, o descarregamento espera esse tempo; reativar a fala dentro da janela o cancela e reutiliza o modelo carregado. Isso importa principalmente para conversas de voz apenas por ativação, que terminam logo depois do aquecimento de ~2s e costumavam perder a voz carregada milissegundos depois.

6. O loop de voz do desktop passa a ler a sua configuração

O Read Aloud não fala mais placeholders em inglês como code block omitted ou link e não descarta mais tabelas em silêncio — blocos de código e URLs ficam mudos, e as tabelas passam a falar a sua linha de cabeçalho. O spoken stop agora lê voice.stop_phrases (padrão ["stop"]); antes ele casava com uma lista fixa em inglês, então um usuário russo dizendo отбой conforme o aviso instruía tinha isso enviado ao agent como prompt. O gatilho de reprodução com barge-in agora usa voice.barge_in_threshold_multiplier (padrão 3.0) em vez de um 0.14 fixo que ficava acima do nível de fala de um headset Bluetooth HFP, e é por isso que falar por cima de uma resposta nunca a interrompia.

7. Atalhos de voz por tecla de função são remapeáveis

O ditado pontual agora é uma ação de teclado composer.dictate sem binding, separada da conversa por voz, reutilizando o caminho de captura canônico do Desktop para teclas F, Caps Lock, Delete, Space e combinações de modificadores; um F12 atribuído chega ao renderer enquanto um F12 não atribuído mantém o comportamento do DevTools. Na mesma janela, as teclas de função do macOS também foram corrigidas — o parser da TUI mantém as sequências de terminal F1–F12 intactas, e o dock de trabalho ao vivo ganhou Ctrl+R como fallback portátil do F7.

8. Uma leva de falhas que só atingiam Windows localizados

  • Em Windows francês, espanhol ou alemão, %Z levantava UnicodeEncodeError dentro do strftime, porque os nomes de fuso chegam como bytes da code page ANSI que decodificam em surrogates soltos. O hermes_time.safe_strftime() agora resolve isso e, em locales saudáveis, a sua saída é byte a byte idêntica à de antes, então o invariante do cache de prompt se mantém.
  • O [gateway-crash] ... UnicodeDecodeError: 'gbk' codec can't decode que rolava na tela no Windows chinês está corrigido: a saída dos processos filhos agora é fixada em UTF-8.
  • C:\...\report.html e caminhos UNC \\server\share\... são reconhecidos como caminhos e pré-visualizados corretamente, em vez de serem juntados ao diretório de trabalho como /repo/C:\....
  • Num cold start do Windows, o event loop do backend local trava por 12–28s enquanto os módulos do gateway são importados, e uma sonda de boot fixa de 10s travava isso como uma falha de boot. Um backend que este app gerou agora continua esperando enquanto o filho estiver vivo, até um teto de 90s.

Uma autoverificação de cinco minutos

Depois de atualizar, estes confirmam que você realmente tem a nova superfície (na v0.21.5 ou mais nova):

hermes --version                                        # esperado v0.21.5 (2026.9.24)
hermes config get tts.keep_warm_seconds                 # 60
hermes config get voice.stop_phrases                    # - stop
hermes config get voice.barge_in_threshold_multiplier   # 3.0
hermes webhook list                                     # mostra quais rotas espelham

Quando você deveria de fato esperar pela v0.22.0

Você não deveria. Tudo numa tag de patch já é o código rodando na sua máquina — nenhum documento bloqueia a sua atualização. Dois grupos têm, sim, um motivo para esperar: os distribuidores downstream (quem empacota imagens ou corta builds internos para um time) e qualquer pessoa escrevendo um tutorial sobre esta janela, porque a lista deles vai ficar melhor.

Se o Hermes é só algo que você usa, o único teste que importa é: um problema específico que você está enfrentando foi corrigido aqui? Esta janela tem candidatos de sobra — pegue qualquer um dos oito grupos acima e teste.

A versão curta

  • Uma tag de patch sem notas é um mecanismo, não um dar de ombros: ela existe para que as imagens Docker e as implantações hospedadas possam receber correções que vivem na main.
  • A versão tem duas formas; v2026.9.24 e v0.21.5 são uma única release.
  • Para a lista, passe os olhos por três fatias da comparação — docs novos, o diff do config_defaults.py, o diff de hermes_cli/.
  • Oito grupos de mudanças desta janela são utilizáveis agora, dos novos catálogos do Desktop a quatro correções de crash de localização no Windows.

Para o registro mais completo desta janela, a nossa página de release da v0.21.5 a agrupa por área de funcionalidade; para a janela de patch anterior, veja o passeio pela janela da v0.21.4. O espelhamento de webhook tem o seu próprio guia, e as mudanças de voz estão em keep-warm e streaming por frase. Começando de uma máquina limpa? O guia de instalação tem o caminho completo.