IA · 26 oct 2026 · 10 min de lectura
Fundaia es la plataforma de despliegue que hemos construido para nosotros: lleva un repositorio de GitHub a su propio dominio, con base de datos. Cuando un despliegue falla, en su menú hay un botón que dice Arreglar con Claude. Al pulsarlo, el fallo pasa a Claude Code, que lee el log y el repositorio, escribe una prueba que falla por culpa del error, lo arregla y deja el cambio como pull request. Este post va de ese botón y, sobre todo, de todo lo que hay alrededor: qué puede tocar el agente, quién aprueba el cambio y qué pasa cuando no consigue arreglar nada.
Un proyecto de Fundaia tiene servicios. Un servicio suele venir de un repositorio de GitHub: la plataforma construye una imagen, la arranca en un contenedor de podman sin root y la publica en su propia dirección. Las variables pueden apuntar unas a otras, así que una aplicación lee la dirección de su base de datos del Postgres que tiene al lado sin que nadie la copie a mano.
Cada despliegue pasa por las mismas seis etapas: la cola, la descarga del código, la construcción, el arranque, la comprobación de salud y la puesta en marcha. El contenedor nuevo solo recibe tráfico cuando pasa la comprobación de salud. Si un despliegue falla por el camino, el anterior sigue sirviendo, así que un despliegue en rojo es un problema que resolver, no una caída. Eso es lo que hace razonable dejar que un agente lo mire con calma.
Antes de cualquier modelo hay un diagnóstico hecho con reglas normales. Lee el estado del servicio y responde con un veredicto (sano, necesita atención, fallando, dormido o parado), sus hallazgos ordenados por gravedad y, para cada uno, el siguiente comando que conviene ejecutar. No llama a ningún modelo, así que no cuesta nada y da la misma respuesta dos veces.
Muchos fallos acaban aquí: una variable que no apunta a nada no necesita un agente. Claude Code entra cuando la causa está en el código o en la receta de construcción, y solo si una persona lo pide.
El despliegue fallido se convierte en una incidencia: su mensaje de error es la muestra (hasta 2.000 caracteres) y las últimas 60 líneas de su log son el contexto. A partir de ahí el arreglo sigue cuatro pasos, cada uno visible en directo en el panel: reunir el contexto, diagnosticar, reproducir y arreglar, más un quinto, abrir el pull request, que es de la plataforma y no del agente.
De un despliegue fallido a un pull request: la plataforma manda el log a un contenedor de Claude Code que solo edita un clon desechable, revisa el diff, abre ella misma el pull request y deja la fusión a una persona; si el agente no puede arreglarlo, se para y la persona puede abrir una issue.
Cada paso es una llamada distinta al componente de Claude Code, que ejecuta claude en modo no interactivo con un límite de diez minutos por prompt. La plataforma lee la respuesta de cada paso y decide si sigue. Estas son las comprobaciones, sacadas del código:
const diagnosis = parseAnswer<Diagnosis>(answer)
if (diagnosis === null) throw new Error('El agente no devolvió un diagnóstico legible')
if (diagnosis.confidence === 'low') {
throw new RunStopped(
'rejected',
'El agente no encontró la causa con los logs disponibles, y no ha tocado nada',
)
}
// ...
if (!reproduction.reproduced) {
throw new RunStopped(
'notReproducible',
reproduction.note === ''
? 'No se pudo reproducir el fallo, así que no se ha cambiado nada'
: reproduction.note,
)
}
// ...
if (!fix.fixed) throw new RunStopped('rejected', 'El agente no consiguió arreglarlo')
if (diff.trim() === '') throw new Error('El agente dijo haberlo arreglado sin cambiar nada')Dentro de su contenedor, Claude Code trabaja con las peticiones de permiso desactivadas, porque no hay nadie para contestarlas. Eso solo tiene sentido si el límite es el propio contenedor, así que el límite está hecho por capas:
const clone = Bun.spawn([
'git',
'-c', 'credential.helper=',
'-c', 'core.hooksPath=/dev/null',
'clone', '--depth', '1', '--single-branch', '--branch', branch,
// ...
])
// ...
await git(target, ['remote', 'remove', 'origin'])Aquí no hay ninguna credencial de red que pueda empujar: la plataforma toma tus cambios como un parche, los valida y abre ella misma el pull request. Editar ficheros es todo lo que puedes hacer, y basta.
El texto con el que empiezan los tres prompts (traducido del inglés)
Antes de que nada llegue a GitHub, la plataforma revisa el diff con su propio validador, sin ningún modelo. Algunas cosas paran el arreglo. Otras el validador las clasifica como cosas que necesitan a una persona: no lo paran y llegan al pull request, que nadie fusiona de forma automática. El prompt ya le pide al agente que no toque workflows de CI, hooks de git ni scripts de instalación salvo que el fallo esté literalmente en uno de ellos:
| El cambio | Qué hace la plataforma |
|---|---|
| Una ruta que apunta fuera del repositorio | Para el arreglo |
| Un fichero con pinta de credencial (.env, claves privadas, .pem, .key…) | Para el arreglo |
| Una línea añadida con forma de secreto (claves de Anthropic, GitHub o AWS, claves privadas) | Para el arreglo |
| Workflows de CI, hooks de git, .npmrc u otros ficheros que deciden de dónde vienen las dependencias | Lo deja pasar al pull request |
| Un script de instalación en package.json (preinstall, postinstall…) | Lo deja pasar al pull request |
| Ficheros binarios, más de 40 ficheros o más de 2.000 líneas añadidas | Lo deja pasar al pull request |
const credentialLike = [
/(^|\/)\.env(\..+)?$/,
/(^|\/)id_(rsa|dsa|ecdsa|ed25519)$/,
/\.(pem|key|p12|pfx|keystore)$/,
// ...
]
const secretPatterns = [
/\bsk-ant-[A-Za-z0-9_-]{16,}/,
/\bgh[pousr]_[A-Za-z0-9]{16,}/,
/\bAKIA[0-9A-Z]{16}\b/,
// ...
]Solo después la plataforma aplica el parche por su lado, hace el commit y empuja la rama con un segundo token, uno que puede escribir contenido y pull requests y que nunca sale del proceso de la plataforma. Viaja en el entorno, no en la línea de comandos, donde cualquier usuario de la máquina podría leerlo.
Una persona, siempre. La plataforma abre el pull request en una rama propia, le pone la etiqueta autofix y escribe la descripción para quien tenga que revisarlo: qué fallaba, por qué, el comando y la salida de la prueba que fallaba antes del cambio, qué se ha cambiado y qué podría seguir saliendo mal. Empieza con una frase sin rodeos: nadie lo ha revisado todavía, eso te toca a ti.
Fundaia nunca fusiona estos pull requests. Cuando alguien del equipo fusiona uno, la rama se mueve y la plataforma lo despliega como cualquier otro push. La plataforma mira además quién respalda ese push: el autor del commit es su propio bot, Fundaia Autofix, pero que lo fusione un miembro del espacio de trabajo lo avala. Un push que nadie del espacio avala espera hasta que un miembro lo aprueba.
Casi todo el diseño gira alrededor de este caso. Cada forma de pararse tiene su nombre, y en todas la incidencia vuelve a quedar abierta, así que nada se queda a medio reclamar:
| Qué pasó | Cómo acaba |
|---|---|
| El agente abrió el pull request | Terminado, y la incidencia espera a que una persona revise el arreglo |
| El log no basta para encontrar la causa (confianza baja) | Descartado, sin tocar nada |
| No pudo escribir una prueba que falle | No se pudo reproducir, con el motivo del agente en una frase |
| Lo intentó y no consiguió arreglarlo | Descartado |
| Dijo que lo había arreglado, pero el diff está vacío | Fallido |
| El diff toca algo que no puede tocar | Descartado, con el fichero y el motivo |
| Llegó al techo de coste | Descartado |
Desde el mismo menú, un despliegue fallido se puede convertir en una issue de GitHub con sus pruebas: el commit, el mensaje de error y las últimas líneas del log. El token para eso solo puede escribir issues. Pedirlo dos veces enlaza la misma issue en vez de abrir otra, así que un equipo que prefiere arreglar a mano no pierde nada por probar antes con el agente.
Un agente que se queda dando vueltas a un fallo terco puede gastar mucho. Estos son los valores por defecto de cada servicio:
Tenemos el autofix de errores en producción desde agosto de 2026 y el de despliegues fallidos desde septiembre. La parte que usa IA son tres prompts. El resto es código que no se fía de ella: un diagnóstico determinista primero, un contenedor que solo puede editar ficheros, un validador que lee el diff, un techo de dinero y una persona que decide.
Es el mismo reparto que usamos cuando construimos agentes de IA para los procesos de un cliente: el modelo propone, código normal comprueba lo que ha propuesto y el paso que no se puede deshacer es de una persona. También es como entendemos el mantenimiento de software: el agente ahorra la primera hora de leer logs, no la revisión. Si estás eligiendo el modelo para este tipo de trabajo, comparamos los actuales en Opus 5.5, GPT-6 Astra o GPT-6.1 Sol.
No. Edita ficheros en un clon desechable y devuelve un diff. La plataforma lo valida y abre un pull request, que nunca fusiona. Un cambio solo llega a producción cuando una persona del equipo lo fusiona y el despliegue de siempre lo recoge.
Recibe el repositorio, el mensaje de error y las últimas líneas del log, no las variables del servicio. Si la aplicación escribe un secreto en sus propios logs, esa línea viaja como cualquier otra, que es un motivo más para no escribir secretos en los logs. En sentido contrario, un cambio que añade un fichero de credenciales o una línea con forma de clave para el arreglo antes de llegar a GitHub.
Para eso tiene que reproducirlo primero. Si su diagnóstico tiene confianza baja, o no consigue escribir una prueba que falle por culpa del error, el arreglo se para sin cambiar nada. Si pasa, el pull request lleva la prueba y su salida, así que quien revisa puede comprobarlo en vez de creérselo.
Depende del modelo y de cuánto tenga que leer, así que no damos una media. Lo que está fijo es el techo: cada incidencia tiene un límite de coste (2 € por defecto), que se comprueba tras cada prompt, y el agente funciona con crédito por adelantado que lo para cuando se acaba.
IA · 25 oct 2026 · 9 min de lectura
No hay un ganador para todo. Opus 5.5 saca las mejores notas en los cambios largos y difíciles, GPT-6.1 Sol hace casi lo mismo por la duodécima parte del coste por tarea y GPT-6 Astra manda en operaciones. Cómo repartimos el trabajo entre ellos, qué pasa con los datos de tu empresa y qué traen los demás modelos de octubre.
Casos de estudio · 26 oct 2026 · 11 min de lectura
El equipo comercial de Leaderbrock trabaja por Europa y América. Cómo sustituimos una hoja de cálculo compartida, un sobre de tickets y la falta de un mapa por un backend reactivo en Java, una app con Expo y un panel web: gastos con la foto que la IA rellena y una persona presenta, una agenda en la hora del móvil y una ruta GPS que distingue un vuelo del ruido.
Casos de estudio · 26 oct 2026 · 12 min de lectura
ReservPark detecta por el Bluetooth del coche que has aparcado, te pregunta si te vas cuando vuelves a él y avisa a los conductores cercanos, y deja alquilar un garaje por horas o con abono. Cómo construimos la detección nativa, las reglas de la ubicación en segundo plano, las plazas libres de 30 minutos y unas reservas de garaje que no se pueden vender dos veces.