v0.21.4 llega sin notas de versión: diez cambios que ya están corriendo en tu máquina

Un sábado por la mañana ejecutas hermes update y la versión salta de v0.21.3 a v0.21.4. Abres las notas de versión para ver qué ha cambiado de verdad y te encuentras con unos pocos párrafos y una línea al final que dice que el artículo completo llegará con v0.22.0. No es pereza: las etiquetas de parche del ciclo v0.21 existen para dar un ancla estable a las imágenes Docker, Hermes Cloud y los despliegues alojados, y la documentación curada llega con la siguiente versión menor. El problema es que el comportamiento que ya se ha enviado a tu máquina no va a esperar a v0.22.0.
Este artículo extrae diez cosas de esa ventana que están mergeadas en main y presentes en esta etiqueta, cada una con un comando que puedes ejecutar o un bloque de config que puedes pegar. Ninguna es un refactor interno: tres cambian tu topología de gateway, dos cambian tu formato de salida o tu factura, y el resto te devuelve tiempo de inmediato.
Primero, las cuentas: por qué existe esta etiqueta
El cuerpo del release es inusualmente directo al respecto. Es una etiqueta de parche que agrupa todo lo mergeado desde v0.21.3 en una release estable para consumidores downstream (imágenes Docker, Hermes Cloud, despliegues alojados), con las notas curadas completas aplazadas a v0.22.0. Medido en el commit 4b8a8134009a8727a289bcabeb0019fedd353128:
| Métrica | Valor (desde v0.21.3) |
|---|---|
| Commits no merge | 5.071 |
| Archivos cambiados | 5.169 (+312.961 / −62.855) |
| PR mergeados | 1.812 |
| Issues cerrados | 2.116 |
Quien use Docker puede descargar la etiqueta directamente como nousresearch/hermes-agent:v2026.9.21; las instalaciones por git siguen actualizándose con hermes update. Todo lo que viene a continuación está ordenado según cuánto te cambia el día.
Diez cosas que ya se han publicado
1. Un proceso de gateway por host, no uno por profile
Esta es la mayor convergencia arquitectónica de la ventana: exactamente un proceso hermes gateway run por host y por usuario del sistema operativo, sirviendo todos los profiles. Los verbos de ciclo de vida cambiaron de significado con ella. hermes -p X gateway run ya no arranca un segundo proceso mientras el gateway del host está vivo: se engancha (attach): imprime el PID del gateway del host y el conjunto de profiles servidos, y sale con 0. hermes gateway start --all y restart --all ahora significan el único multiplexor del host, y nunca barren con un gateway que esté ejecutando otro profile.
El antiguo interruptor gateway.multiplex_profiles: false está retirado: sigue parseándose, pero ya no puede fijar un segundo proceso de gateway; se resuelve exactamente igual que una clave sin definir, registra un aviso y apunta al comando de migración. Si vienes de una topología por profile, mira el plan antes de tocar nada:
hermes gateway migrate --multiplex --dry-run # imprime el plan, los bloqueos y los reinicios que implica
hermes gateway migrate --multiplex # converge de verdad (añade --yes en shells no interactivos)
La ruta de migración paso a paso, los tres incidentes reales que hay detrás (incluido un P1 que podía borrar el MEMORY.md del profile equivocado) y una checklist posterior a la actualización están en un artículo aparte: Un gateway por host: la migración a multiplex-only. La guía anterior de multiplex por defecto cubre cómo llegó la capacidad la primera vez.
2. Conectores: conecta una app desde la propia conversación
Conectar una app solía significar editar config, abrir un navegador y pegar claves. Ahora un usuario pide en el chat conectar Notion y el backend ejecuta toda la conexión: recoge los valores, muestra el enlace de inicio de sesión, y el agent puede llamar a la nueva herramienta en el mismo turno. Los tres clientes interactivos dibujan el mismo paso de configuración: un diálogo en la app de escritorio, un callout en hermes --tui, un panel en la CLI clásica. El repositorio incluye un catálogo de 65 servidores MCP revisados, de los cuales 55 declaran auth.type: oauth.
3. --format stream-json para ejecuciones legibles por máquina
Las ejecuciones one-shot ahora pueden emitir JSONL:
hermes chat -q "Summarize this repository" --format stream-json
Cada línea de stdout es un objeto JSON (system, text, tool_use, tool_result, result), los diagnósticos y la línea session_id: se quedan en stderr, y el registro terminal result lleva exit_code, estadísticas de tokens y duración. Requiere -q (o --query-file), implica el modo silencioso y rechaza --tui. La tabla completa de campos de evento, la semántica de los códigos de salida (0 / 1 / 130, más 75 para un worker de Kanban) y cómo consumirlo en un pipeline: Enseñar a la CI a leer Hermes: el flujo de eventos stream-json.
4. skills.auto_load fija skills en cada sesión nueva
Tres líneas en config.yaml hacen que esos skills queden completamente cargados al inicio de cada sesión nueva, y no solo listados en el catálogo:
skills:
auto_load:
- release-notes
- qa-multilingual
Se aplica a agentes de CLI, TUI, gateway, cron y API, y tiene alcance de profile. La inyección se resuelve una vez por agent (los cambios de modelo, la compresión y la restauración del prefijo estático reutilizan los mismos bytes renderizados), así que tu caché de prompt se mantiene intacta. Cuándo evitarlo y cómo deduplica frente a --skills: Fijar skills en cada sesión.
5. mcp.discovery_concurrency frena la tormenta de procesos al arrancar
El descubrimiento de MCP se desplegaba antes con un asyncio.gather sin límite: ocho servidores stdio significaban ocho árboles de procesos naciendo en el mismo instante, y en una flota multi-profile cada profile servido ejecutaba su propia pasada. Ahora las conexiones están acotadas por mcp.discovery_concurrency, por defecto 4, donde 0 significa ilimitado:
hermes config set mcp.discovery_concurrency 2 # máquinas más lentas, memoria más ajustada
Las mediciones del PR (8 servidores stdio): la concurrencia máxima bajó de 8 a 4 con el valor por defecto, con la pasada pasando de 4,0 s a 5,6 s; ponerlo en 2 dio un máximo de 2 y 13,2 s; 0 restauró el máximo de 8 y 3,5 s. Cambias un arranque algo más lento por no tener una tormenta de procesos.
6. hermes sessions set-journal-mode convierte el almacén sin conexiones activas
Si configuras database.journal_mode: delete cuando state.db ya está en modo WAL, Hermes nunca lo degradará en caliente: el gateway, el dashboard o cron pueden tener commits sin checkpoint, y degradar por debajo de ellos destruye esos commits. La única salida era antes un PRAGMA lanzado a mano. Ahora hay un comando:
hermes sessions set-journal-mode delete # WAL -> rollback journal
hermes sessions set-journal-mode wal # volver a WAL
hermes sessions set-journal-mode delete --db ~/.hermes/kanban.db # otro almacén de Hermes
Primero busca a los tenedores del archivo; se niega mientras cualquier proceso (o sus sidecars -wal/-shm) siga con el archivo abierto, nombra cada uno como pid — comando: ruta, y vuelve a leer los bytes de cabecera para verificar el nuevo modo. También se niega directamente en Windows, donde el escaneo de tenedores no está disponible, y se niega a habilitar WAL en un sistema de archivos entre VMs (virtiofs/9p). Contexto: doctor y escritores WAL en caliente y state.db WAL dentro de Docker.
7. Los DM no autorizados se pueden declinar con educación
El gateway tenía dos respuestas para un DM no autorizado: pair (mandarlo al emparejamiento) o ignore (descartarlo). Ahora hay una tercera, con texto personalizado:
gateway:
unauthorized_dm_behavior: decline
unauthorized_dm_decline_message: "Este bot es privado. Pide una invitación al propietario."
También puedes sobrescribirlo por plataforma en el bloque extra de esa plataforma. Para un asistente personal accesible desde un canal público, esto es más profesional que el silencio: quien escribe se entera de que el mensaje llegó y de por qué no se respondió.
8. session_search ganó una ventana temporal y un reintento relajado
El recuerdo entre sesiones ahora acepta límites after / before, ya sean fechas ISO o duraciones relativas (7d, 24h, 2w):
after="7d"— solo las sesiones iniciadas en la última semana;before="2026-09-01"— solo el histórico hasta el 1 de septiembre (un valor solo de fecha significa la medianoche UTC de ese día);- la forma relativa
before="7d"significa más de una semana atrás, no la última semana; es fácil confundirse.
El recall también reintenta una vez con coincidencia OR relajada cuando la coincidencia estricta no encuentra nada, así que un vago «creo que mencioné lo del despliegue» aterriza más a menudo. El índice en sí se reconstruyó como una ruta rápida sin LLM hace tiempo (ver límites de sesión); esto añade la dimensión temporal.
9. Un montón de pequeñas mejoras de escritorio
- Selector de fuente de chat/interfaz — elige una fuente para la transcripción y otra para la interfaz por separado, incluidas tipografías de legibilidad como OpenDyslexic.
- Minimizar a la bandeja — opcional: minimizar oculta las ventanas sin destruir renderers ni detener el trabajo; Cerrar, Alt+F4 y Cmd+Q mantienen su comportamiento actual, y la bandeja ofrece Show Hermes / Quit Hermes.
- Tocar para invocar el HUD — pulsa y suelta Cmd+Option en macOS, Ctrl+Alt en Windows/Linux X11, para traer el HUD al frente desde otra app (desactivado por defecto, se guarda por dispositivo, y ambas teclas deben soltarse en menos de 500 ms).
- Cajón de estado por chat — una cresta encima del compositor oculta juntos la pila de estado y la fila de git; cada conversación recuerda su elección.
- Desinstalación de plugins desde el hub de Plugins, más actualizaciones del motor local con un clic.
10. Actualizaciones de catálogo: modelos de vídeo y páginas de plugins
La familia de vídeo FAL incorporó LTX 2.5 (el modelo abierto de audio y vídeo de Lightricks: audio nativo, hasta 20 s / 4K para image-to-video, presets de movimiento de cámara) y Kling O3 Standard (Kuaishou: narración nativa multi-shot, audio opcional, 3–15 s). El catálogo de plugins sumó una docena de plugins de la comunidad (tailscale, ssh, shodan, terminal, rss, resetwatch, done-bell, kiwi, cognee y más), y todos los plugins y autores del catálogo tienen ahora su propia página, con el README fijado a un commit revisado.
Vale la pena saberlo, sin acción necesaria
La misma ventana también afinó un montón de bordes: hermes -p X update ahora reinicia el gateway del host una sola vez para toda la máquina, y el aviso llega a todos los profiles servidos (#118108); Desktop se engancha al backend del host en ejecución en lugar de arrancar uno por profile (#118246); los profiles con nombre vuelven a leer el auth.json del profile raíz, lo que corrige los fallos No Codex credentials stored posteriores a la actualización (#118373); un aviso posterior a la actualización dirigido a una plataforma que nunca se conecta deja de reintentar en vez de registrar un log cada 2 segundos para siempre (#118312); un 429 del gateway gestionado en image_generate o en vídeo FAL se reporta como límite de tasa y se reintenta una vez en lugar de decirte que cambies de modelo o definas FAL_KEY (#118311); y la llamada de auto-título ya no compite con la respuesta en un servidor de modelo autoalojado de una sola ranura (#117494).
Cinco minutos de comprobación después de actualizar
hermes version # espera v0.21.4 (etiqueta v2026.9.21)
hermes doctor # primero los avisos de almacenamiento / topología de gateway
hermes gateway status # quién sirve qué profiles
hermes gateway migrate --multiplex --dry-run # actualizaciones desde una topología por profile: lee el plan
Si ejecutas más de un profile en la máquina, el punto 1 es el que merece tu tiempo: es a la vez una frontera de seguridad (los profiles dejan de leer las credenciales de los demás) y de disponibilidad (un reinicio de gateway por actualización en lugar de uno por profile).
La versión corta
Una etiqueta de parche sin notas curadas es normal; «sin notas de versión» no es lo mismo que «no cambió nada». Las partes de esta ventana que merecen tu atención son la convergencia de la topología de gateway y los arreglos de aislamiento de profiles: la primera decide cuántos procesos corren en tu máquina, la segunda decide si un profile puede leer las claves y la memoria de otro. El resto (salida estructurada, skills fijados, concurrencia de arranque de MCP, conversión del journal mode) son del tipo de cambio que adoptas en cuanto sabes que existe. El artículo curado completo llega con v0.22.0 y cubre todo desde v0.21.0; para la etiqueta en sí, mira nuestra página de release v0.21.4.