# Cómo actualizar una puerta de enlace de acciones local sin interrumpir el trabajo de los agentes

Una actualización de la puerta de enlace de acciones es un cambio del plano de control, no una tarea rutinaria de mantenimiento del ordenador. Si un agente está a mitad de una modificación en un repositorio, una escritura HTTP o una operación SSH, la actualización puede dividir un trabajo en dos partes inciertas. El enfoque seguro consiste en elegir un límite de trabajo, vaciar o detener deliberadamente las acciones activas y demostrar que la nueva versión puede autorizar, ejecutar y registrar el trabajo antes de permitir que la automatización continúe.

El error habitual es tratar a todos los agentes activos como desechables. Algunos lo son. Otros mantienen un plan cuidadosamente elaborado, una shell remota abierta o una solicitud cuyo resultado el solicitante todavía no ha recibido. Necesitas saber con qué tipo de agente estás trabajando antes de tocar la aplicación.

## Programa las actualizaciones en torno a un límite de trabajo

Una buena ventana de mantenimiento comienza cuando el agente ha llegado a un estado que una persona puede entender y retomar. El límite no tiene que significar que todas las tareas hayan terminado. Significa que la siguiente persona, proceso o agente puede saber qué ocurrió, qué queda pendiente y qué no debe repetirse.

Pide primero al agente que deje de iniciar nuevas acciones externas. Después, haz que escriba una breve entrega en el repositorio, el ticket o las notas del operador. La entrega debe indicar la rama y el commit actuales, los archivos modificados pero aún no confirmados, las pruebas ya ejecutadas, los sistemas remotos contactados y la siguiente acción prevista. Esto resulta más útil que una transcripción que obligue a alguien a reconstruir la intención a partir de cientos de llamadas a herramientas.

Una ventana de actualización razonable tiene cuatro fases:

1. Anunciar una congelación de nuevas ejecuciones de agentes y nuevas llamadas con credenciales.
2. Dejar que el trabajo acotado termine o detenerlo en un límite registrado.
3. Actualizar y realizar un pequeño conjunto de comprobaciones con un proceso de agente nuevo.
4. Levantar la congelación solo después de conciliar la actividad de la ventana.

No esperes a una fecha prevista si la puerta de enlace tiene un fallo de seguridad que afecta a las credenciales o la autorización. En ese caso, detén o revoca primero el trabajo expuesto, registra la interrupción y actualiza siguiendo la disciplina de un incidente. Pero no inventes urgencia porque exista una versión nueva. Las actualizaciones informales y frecuentes enseñan a los equipos a saltarse las comprobaciones que detectan supuestos incorrectos.

Para el mantenimiento rutinario, prefiere el momento posterior a la confirmación del código por parte del agente y anterior al inicio de un despliegue, una migración de datos, cambios de cuentas o tareas de limpieza remota. Una modificación de código local normalmente puede reanudarse. Un cambio de permisos a medias, a menudo no.

También necesitas una persona responsable de la ventana. Esa persona decide cuándo congelar el trabajo, evalúa los resultados ambiguos y declara que la puerta de enlace está lista. Un canal de chat lleno de personas que suponen que otra persona supervisó la actualización no es un modelo operativo.

## Trata la autorización del proceso y la finalización de la acción como hechos distintos

Un proceso de agente aprobado y una acción externa completada responden a preguntas diferentes. La gente los mezcla porque suelen aparecer casi al mismo tiempo, pero la diferencia determina cómo recuperarse de una interrupción.

La autorización del proceso pregunta: «¿Puede este programa concreto que está en ejecución pedirle a la puerta de enlace que actúe?». La finalización de la acción pregunta: «¿El sistema remoto aceptó y terminó esta solicitud concreta?». Reiniciar una aplicación puede cambiar la primera respuesta. Un fallo de red puede ocultar la segunda. Ninguna de las dos respuestas implica la otra.

En las llamadas HTTP, deja constancia de si una operación se puede repetir de forma segura. Una solicitud de lectura normalmente sí. Crear un usuario, enviar un pago, publicar una versión o rotar una credencial puede no serlo. Si el agente agota el tiempo de espera después de enviar una solicitud de este tipo, debe consultar el sistema de destino para comprobar el objeto o evento resultante antes de reintentarlo. Reintentar porque la llamada de la herramienta no muestra un resultado visible es la forma en que aparecen trabajos duplicados.

SSH tiene sus propios modos de fallo. Un terminal puede contener un comando en primer plano, una tarea en segundo plano, un búfer de editor, una transacción de base de datos o una herramienta de despliegue que sigue ejecutándose después de que el cliente se desconecta. Antes del mantenimiento, pide al agente que informe del host remoto, el directorio de trabajo, el comando actual y los identificadores de cualquier tarea. Si ha iniciado una operación larga, decide si esperarás a que termine, si la finalizarás mediante un comando remoto explícito o si la transferirás a un proceso supervisado que sobreviva a la shell.

No uses el reinicio de la puerta de enlace como una forma vaga de «borrarlo todo». Eso crea incertidumbre y no deja ningún registro de la detención prevista. Revoca o termina la ejecución concreta del agente cuando quieras detenerla y haz que el agente indique lo último que observó.

Una nota práctica de entrega puede ser tan sencilla como esta:

```text
Agent run: release-fix
Repository state: commit 4f2c... created, working tree clean
Remote work: SSH command started on build host, job ID 8127
HTTP writes: staging deployment request accepted, status still pending
Safe next action: query deployment status; do not submit another deployment
```

Este registro ofrece al operador una forma de comprobar el estado del sistema después de la actualización. Sin él, el equipo suele reiniciar el agente y confundir una explicación nueva con continuidad.

## Congela el trabajo nuevo antes de vaciar el antiguo

Una congelación de mantenimiento solo funciona cuando cierra el punto de entrada para el trabajo nuevo. Decir a los desarrolladores que no inicien otro agente es educado, pero poco fiable, sobre todo cuando las integraciones del editor, los terminales y los scripts programados pueden iniciar procesos por separado.

Registra todos los procesos de agentes activos antes de la congelación. Captura suficiente información para distinguirlos: quién los inició, qué repositorio o tarea poseen, qué acceso externo necesitan y si tienen trabajo activo. Si la puerta de enlace ofrece una vista de sesiones, úsala como registro principal. Complétala con la persona responsable de la tarea, porque un registro de procesos no puede decirte si todavía se desea un cambio sin terminar.

Después, separa el trabajo activo en tres grupos:

- El trabajo que no tiene efectos externos puede detenerse de inmediato.
- Las acciones breves y observables pueden terminar bajo supervisión.
- Las operaciones largas o irreversibles necesitan una decisión explícita de la persona responsable de la tarea.

No vacíes el trabajo indefinidamente. Establece un plazo que se ajuste a la operación. Una solicitud que debería terminar en segundos pero lleva mucho más tiempo ya se ha convertido en una investigación, no en una razón para retrasar el mantenimiento sin límite. Captura sus identificadores y determina su estado en el servicio remoto.

Un agente que continúa produciendo modificaciones locales durante la congelación también puede crear confusión, aunque no pueda llamar a herramientas externas. Pídele que se detenga correctamente después de escribir su entrega. Si necesitas conservar el contexto, guarda las notas de la tarea y el estado del repositorio en lugar de depender de que el proceso siga vivo sin interrupciones.

Sallyport registra las ejecuciones de agentes en su diario de sesiones y las llamadas individuales en su diario de actividad. Usa esos registros para identificar el trabajo que permitiste terminar de forma deliberada, en lugar de inferirlo después a partir del desplazamiento de un terminal.

## Trata los resultados de red ambiguos como un incidente

Una solicitud que pierde su respuesta durante una actualización tiene un resultado desconocido hasta que el sistema remoto indique lo contrario. Considerarla fallida porque el cliente local ha visto un error es un atajo costoso.

Supón que un agente envía una solicitud de API para crear un despliegue y la puerta de enlace local se cierra o se reinicia antes de que llegue la respuesta. Siguen siendo posibles cuatro resultados: la solicitud nunca salió del equipo, el servicio la rechazó, el servicio la aceptó pero todavía no ha terminado o el servicio la completó. El mensaje de error local no distingue esos resultados de forma fiable.

Resuelve la ambigüedad en este orden:

1. Encuentra el identificador de solicitud, el nombre del despliegue, la referencia del commit u otro valor de correlación que haya usado el agente.
2. Consulta el servicio remoto para ese valor mediante una acción nueva y supervisada.
3. Compara el resultado remoto con el cambio previsto y el registro de auditoría.
4. Reintenta solo cuando el sistema remoto indique que no ocurrió ninguna operación equivalente.

Por eso importa la idempotencia. Cuando una API admite un token de idempotencia o un identificador de solicitud proporcionado por el cliente, haz que el agente use uno para las operaciones de escritura. El mismo token convierte un reintento incierto en una operación que se puede consultar. Si una API no lo admite, utiliza un nombre de objeto o una referencia de cambio que permita a una persona determinar si el primer intento tuvo efecto.

La especificación HTTP Semantics, RFC 9110, define los métodos idempotentes según el efecto previsto de las solicitudes repetidas, no según si el servidor devuelve siempre la misma respuesta. Esto resulta útil, pero no hace que todos los `PUT` o `DELETE` sean inofensivos en tu entorno. Una solicitud repetida todavía puede activar notificaciones, competir con otro escritor o eliminar un recurso que otro actor haya vuelto a crear. Trata la clasificación del RFC como un punto de partida y ten en cuenta el comportamiento del servicio de destino.

En SSH, recopila pruebas del host remoto. Comprueba las tablas de procesos, los registros del servicio, el estado del despliegue, el estado de las transacciones y los archivos creados por el comando. No pidas al agente que vuelva a ejecutar un comando de shell solo porque su sesión local desapareció. Los comandos de shell rara vez tienen las protecciones contra repeticiones que ofrecen las API maduras.

## Verifica la versión antes de ponerla en la ruta de acciones

Un paquete de aplicación firmado te indica quién firmó el código y si el paquete cambió después de la firma. No te dice si la versión conserva el formato de la bóveda, el comportamiento de las sesiones, la compatibilidad de los asistentes o el flujo de trabajo del operador.

Apple Platform Security explica que la firma de código permite a macOS identificar el código firmado y detectar modificaciones. Es una propiedad necesaria para una aplicación que gestiona credenciales. No sustituye a las notas de la versión, una ejecución de pruebas ni un plan de recuperación. Los equipos suelen atribuir demasiada importancia a la firma porque la comprobación criptográfica es clara y visible, mientras que la compatibilidad operativa no lo es.

Antes de la ventana, lee las notas de la versión y busca cambios en estas áreas:

- almacenamiento de la bóveda o comportamiento de las migraciones
- autorización y gestión de sesiones
- asistentes de comandos incluidos y detalles de conexión de los agentes
- almacenamiento, exportación o verificación de auditorías
- requisitos de versión y permisos de macOS

Registra la versión en ejecución y la versión de destino en la nota de mantenimiento. Decide también qué te haría detenerte: no poder desbloquear la bóveda, no poder establecer una sesión de agente nueva y aprobada, una denegación de acción inesperada o un fallo de verificación de auditoría son motivos válidos para parar.

Un plan de reversión necesita algo más que una copia antigua de la aplicación. Necesita una regla que indique cuándo usarla y un plan para el estado que la nueva versión pueda haber cambiado. Si una versión migra datos locales, volver atrás sin las indicaciones del proveedor puede convertir un problema recuperable en una pérdida de datos. Prueba la ruta exacta de actualización en un Mac de repuesto o una instalación no crítica cuando la versión cambie el almacenamiento o la autorización. Una instalación limpia no te dice casi nada sobre el estado que realmente administras.

Evita probar con la credencial que pueda causar el mayor impacto. Empieza con una cuenta limitada a una lectura inofensiva o a un punto de conexión desechable. Estás comprobando el recorrido por la aplicación, la autorización, la inyección de credenciales y la gestión del resultado. No necesitas un despliegue de producción para demostrar que se ha iniciado una aplicación de la barra de menús.

## Realiza las comprobaciones posteriores con un proceso de agente nuevo

Una prueba posterior a la actualización debe demostrar que funcionan las rutas que utilizarán los agentes activos, no limitarse a demostrar que se abre la interfaz. Usa un proceso de agente recién iniciado para probar el límite de autorización que esperas después del mantenimiento.

Comprueba primero la barrera de la bóveda. Bloquéala y desbloquéala mediante el flujo local habitual. Mientras esté bloqueada, intenta realizar la acción de prueba segura y confirma que la puerta de enlace la deniega. Después, desbloquéala y confirma que un proceso nuevo recibe el aviso de autorización o el flujo de aprobación esperado. Esto detecta el supuesto incorrecto de que una aprobación antigua ha sobrevivido o que la nueva versión ya no puede identificar el proceso solicitante.

A continuación, ejecuta una solicitud HTTP segura y una solicitud SSH segura si tu equipo utiliza ambos canales. Una prueba HTTP útil solicita un punto de conexión de solo lectura que devuelva un resultado reconocible. Una prueba SSH útil ejecuta un comando inofensivo en un host no crítico, como mostrar el directorio actual o un marcador fijo. Registra la hora, el destino y el resultado para poder encontrar esas llamadas en el historial de actividad.

Sallyport guarda las credenciales en su bóveda cifrada y realiza directamente las acciones HTTP y SSH, de modo que el agente recibe el resultado y no el secreto. Este diseño reduce lo que la prueba de actualización necesita exponer, pero no elimina la necesidad de probar cada canal del que dependas.

Por último, prueba el registro de auditoría. Ejecuta el comando de verificación sin conexión documentado:

```sh
sp audit verify
```

El formato esperado de la salida debe indicar que la verificación de la cadena de auditoría se ha realizado correctamente. No dependas de recordar una frase concreta ni de extraerla con un script frágil, a menos que la documentación del comando prometa un formato estable y legible por máquinas. El resultado útil es sencillo: el comando termina correctamente, informa de que la verificación se ha realizado con éxito y puedes localizar las llamadas de prueba deliberadas en los diarios.

Si la verificación falla, detente. No lo dejes pasar porque la aplicación todavía pueda realizar una solicitud. Una cadena de auditoría que no se puede verificar después del mantenimiento elimina las pruebas justo cuando necesitas entender el cambio.

## Concilia todas las acciones que atravesaron la ventana de mantenimiento

La actualización no termina hasta que das cuenta de las acciones que comenzaron antes de la congelación, continuaron durante ella o aparecieron después de que se iniciara la nueva versión. Esta conciliación es donde los operadores cuidadosos encuentran el reintento que duplicó una llamada de API o la tarea SSH que siguió ejecutándose sin que nadie la viera.

Haz una tabla breve en el registro de mantenimiento. Para cada agente activo al principio, anota la última acción prevista, el resultado observado, la fuente que lo confirmó y si una persona autorizó algún reintento. La fuente puede ser un registro de actividad, el estado de un servicio remoto, un registro del host o un commit del repositorio. Si dos fuentes discrepan, trata el sistema remoto como la autoridad sobre el estado externo e investiga la diferencia.

Presta especial atención a las acciones que responden lentamente. Una puerta de enlace puede registrar que envió una solicitud mientras el sistema de destino sigue pendiente. No hay contradicción. El registro te indica hasta dónde llegó la acción, no si un trabajo remoto asíncrono ha terminado. Sigue supervisándolo mediante el mecanismo de estado habitual del destino hasta que alcance un estado final o la persona responsable de la tarea se haga cargo.

Los registros de sesiones te ayudan a responder quién tenía autorización durante la ventana. Los registros de actividad te ayudan a responder qué llamadas ocurrieron. No sustituyas uno por otro. Un proceso aprobado puede no hacer ninguna llamada, y una llamada completada puede haber comenzado antes de que se abriera el registro de mantenimiento.

Esta conciliación también debe revelar a los solicitantes inesperados. Un proceso nuevo que aparezca durante la congelación significa que la congelación estaba incompleta, aunque su solicitud no haya causado daños. Encuentra la ruta de inicio antes de la próxima ventana. Puede ser un terminal de desarrollador, una extensión del editor o un script local desatendido que nadie consideraba parte del flujo de trabajo del agente.

## Conserva los límites de aprobación después de la actualización

Las actualizaciones son un momento tentador para debilitar los controles porque los operadores quieren que las pruebas pasen rápido. Evita convertir una aprobación amplia en la solución permanente para un flujo de trabajo ruidoso.

La autorización por sesión encaja con el trabajo habitual de los agentes cuando un proceso conocido necesita realizar varias llamadas relacionadas. Permite al operador identificar y aprobar esa ejecución y después revisar su actividad como una unidad. La confirmación por llamada encaja con las credenciales cuyo uso merece una decisión humana intencionada, como las acciones que modifican el acceso a producción, eliminan datos o inician un evento externo irreversible.

El error consiste en configurar el ajuste más estricto como castigo después de un incidente y dejarlo activo para lecturas rutinarias de bajo riesgo hasta que la gente apruebe los avisos sin mirar. Las aprobaciones repetidas enseñan a hacer clic en la pantalla que debería hacerles detenerse. Usa la confirmación por llamada para las credenciales donde el coste de una acción incorrecta sea alto. Mantén el resto bajo revisión por sesión y limita el alcance de las credenciales siempre que sea posible.

El bloqueo de la bóveda debe seguir siendo una detención absoluta. Durante el mantenimiento planificado, bloquéala cuando necesites un límite firme que deniegue todas las acciones. Cuando la desbloquees para verificar algo, hazlo con el proceso de prueba deliberado ya elegido. Así, un evento de mantenimiento amplio se convierte en un pequeño número de acciones observadas.

No confundas una puerta de enlace de acciones con un motor de políticas general. Una puerta de enlace puede mantener las credenciales alejadas del agente y situar a una persona en los límites de autorización. No puede inferir el significado empresarial de cada llamada de API, reparar un plan de despliegue incorrecto ni saber que un punto de conexión aparentemente inofensivo activa un flujo de trabajo posterior costoso. La persona responsable de la tarea sigue siendo quien toma esas decisiones.

## Escribe el procedimiento para la interrupción que realmente tendrás

Un procedimiento útil no dice «actualizar la puerta de enlace y probar». Indica las pruebas que debes capturar, las decisiones que debes tomar bajo incertidumbre y el punto exacto en el que puede reanudarse el trabajo autónomo.

Mantén el procedimiento lo bastante corto para que alguien lo use bajo presión. El mío incluye una persona responsable de la congelación, una lista de ejecuciones activas, una regla explícita para las sesiones SSH activas y las escrituras HTTP ambiguas, la versión de destino, una decisión de reversión, pruebas con un proceso nuevo, verificación de auditoría y conciliación. También tiene un espacio para registrar la pregunta incómoda que siempre aparece: «¿Terminó esa acción antes de que la interrumpiéramos?»

Si no puedes responder a esa pregunta a partir de la entrega del agente, el registro de actividad y el sistema de destino, no reinicies el agente con permiso para repetir la acción. Pausa la tarea y resuelve primero el estado externo. Esta disciplina tarda unos minutos más y resulta mucho más rápida que desenredar dos despliegues, dos cambios de acceso o un comando remoto que tanto el agente como el operador creían haber detenido.

La primera mejora que debes hacer es sencilla: exige que todo agente con acceso a sistemas externos deje una entrega que permita reanudar el trabajo antes del mantenimiento. Cuando esto se vuelve habitual, los tiempos de publicación, la autorización, las pruebas de actualización y la recuperación dejan de depender de la memoria de alguien sobre una ventana de terminal.
