EEEugenio Estrada
Volver al blog

La arquitectura Frankenstein: el riesgo de los agentes sin dirección técnica

Ingeniería de SoftwareIA AgénticaArquitecturaGobernanza
Escuchar artículo
💡

Gobernar la IA para proteger la arquitectura

  • La paradoja de Jevons: La facilidad de generar código a coste marginal cero incrementa drásticamente el coste de auditoría e integración técnica.
  • Entropía acelerada: Al carecer de un modelo mental global del sistema, los agentes de IA introducen acoplamiento difuso y parches locales que degradan el diseño.
  • Pirámide de gobernanza: Se propone una jerarquía de control que abarca desde la consistencia pragmática (.editorconfig) hasta reglas arquitectónicas automatizadas e instrucciones semánticas.

La automatización del desarrollo mediante agentes autónomos promete resolver el eterno cuello de botella de la entrega de software, postulándose como un canto de sirena para la productividad a corto plazo. Sin embargo, bajo esta ilusión de velocidad se esconde una fuerza entrópica formidable. Cuando el coste marginal de generar código desciende a cero, las leyes fundamentales del diseño de sistemas reclaman su protagonismo. Sin límites técnicos explícitos y gobernados, la base de código experimenta una degradación acelerada, dando paso a lo que denominamos la arquitectura Frankenstein: una colcha de retazos inconexos optimizados localmente pero estructuralmente destructivos a nivel global.

La paradoja de Jevons en la economía del código

En 1865, el economista William Stanley Jevons observó que las mejoras tecnológicas que aumentaban la eficiencia en el uso del carbón no reducían su consumo, sino que lo multiplicaban al abaratar su aprovechamiento industrial y expandir su demanda. En la ingeniería de software moderna asistimos a un fenómeno análogo.

La capacidad de los modelos de lenguaje para escupir sintaxis a la velocidad del rayo no alivia la carga de los equipos de desarrollo. Al contrario: incrementa de forma exponencial el volumen de código que debe ser leído, integrado y mantenido. Escribir líneas de código ha dejado de ser la restricción del sistema. El nuevo cuello de botella es la capacidad cognitiva requerida para auditar la coherencia e intención de diseño de lo que se genera.

Si un agente de desarrollo puede implementar en tres minutos una funcionalidad que a un humano le tomaría tres horas, el rol del desarrollador no se elimina, sino que muta: ahora debe dedicar esas tres horas a verificar que las modificaciones no introduzcan regresiones silenciosas, fallos de seguridad o violaciones del diseño del sistema. El abaratamiento de la producción desplaza inevitablemente la responsabilidad hacia la gobernanza.

La entropía y las leyes de Lehman en la era agéntica

La termodinámica del software ya fue formulada por Manny Lehman en su segunda ley sobre la evolución del software (1974): a medida que un sistema evoluciona, su complejidad crece de forma natural a menos que se realice un trabajo activo y deliberado para simplificarlo.

El talón de Aquiles de los agentes de desarrollo radica en los límites de su ventana de contexto. Por masiva que sea, esta ventana representa un espacio de memoria efímero y estadístico, no un modelo mental coherente, histórico y evolutivo del producto. Un LLM no razona sobre la arquitectura en abstracto; infiere relaciones de tokens a partir de código preexistente.

Cuando se le pide a un agente corregir un defecto o añadir una nueva característica, este optimizará su respuesta para satisfacer la condición de parada del pipeline (generalmente el éxito de una suite de tests) por el camino de menor resistencia. Esta dinámica cataliza una optimización local subóptima:

  • Bypass arquitectónico: Para evitar comprender una abstracción de base de datos compleja, el agente puede optar por acoplar la lógica de presentación realizando consultas SQL crudas directamente en la capa de transporte (los controladores de la API).
  • Duplicación semántica inconsciente: Al no reconocer conceptualmente una abstracción existente que calcula impuestos o valida esquemas, el agente generará una utilidad paralela en otro directorio bajo sutiles variaciones sintácticas, fragmentando la lógica de negocio.
  • El sesgo del test verde: El agente puede pasar con éxito una batería de tests unitarios locales introduciendo un acoplamiento temporal tan severo que comprometa el rendimiento bajo concurrencia, dejando el diseño estructuralmente herido.

Como señala el informe de GitClear (2024), la adopción masiva de asistentes de IA ha provocado un incremento drástico en la rotación de código (code churn) y en la redundancia. Escribimos más código que nunca, pero su vida útil se ha desplomado debido a su baja calidad arquitectónica intrínseca.

La pirámide de gobernanza agéntica

Para domar a los agentes no deterministas y evitar la acumulación caótica de complejidad accidental, los equipos de desarrollo deben estructurar el entorno de trabajo mediante restricciones explícitas. Si los límites de diseño no se codifican como barreras infranqueables, el agente, impulsado por su función de pérdida estadística, los erosionará de forma incremental.

Nivel 1: Gobernanza pragmática y formateo determinista

La gobernanza comienza en la capa más baja y física del desarrollo: el estándar de formateo. Un error clásico al delegar cambios a un agente es permitirle decidir el estilo estético del código. En cada iteración, el agente puede alternar entre espacios y tabulaciones, cambiar la codificación de archivos o reformatear bloques enteros, generando commits masivos que inutilizan el historial de Git y ocultan los cambios reales de lógica.

La primera línea de defensa es un archivo determinista como .editorconfig. Al establecer directrices explícitas y rígidas sobre sangría, codificación y saltos de línea en la raíz del proyecto, forzamos a que cualquier agente que lea y edite el repositorio configure su motor de edición bajo los mismos parámetros matemáticos.

root = true

[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf

Este simple paso reduce el ruido estilístico a cero, aislando los commits estrictamente a los cambios conceptuales.

Nivel 2: Gobernanza sintáctica mediante análisis estático

El segundo nivel consiste en automatizar la captura de code smells y vulnerabilidades comunes en tiempo real. Configurar herramientas como ESLint, Prettier y analizadores estáticos de seguridad en pre-commit hooks asegura que el agente reciba feedback inmediato de sus errores sintácticos antes de que intente publicar su trabajo. Si el código no compila o viola las reglas estrictas del linter, el pipeline local detiene la ejecución del agente y lo obliga a iterar sobre sus propios errores en un bucle cerrado de autorreparación.

Nivel 3: Gobernanza arquitectónica y aserciones sobre el diseño

Aquí es donde impedimos que el agente desfigure la arquitectura de la aplicación. Un agente no tiene respeto intrínseco por la separación de responsabilidades de una arquitectura limpia o modular. Si necesita una dependencia, la importará cruzando cualquier frontera lógica si con ello hace pasar su test local.

Debemos codificar la arquitectura en tests automatizados. En ecosistemas estructurados, herramientas como ArchUnit permiten escribir aserciones explícitas sobre la organización del código:

// El dominio nunca debe depender de la infraestructura de persistencia
classes().that().resideInAPackage("..domain..")
    .should().onlyDependOnClassesThat().resideInAPackage("..domain..");

En TypeScript o JavaScript, herramientas como dependency-cruiser permiten definir grafos de dependencias permitidas en un archivo JSON. Si el agente intenta realizar una importación prohibida (por ejemplo, importar la capa de infraestructura desde el dominio), el build fallará en local de forma inmediata. Las decisiones de diseño dejan de ser guías pasivas de estilo para convertirse en tests deterministas que bloquean la compilación.

Nivel 4: Gobernanza semántica mediante instrucciones del sistema

En la cima de la pirámide se encuentra la gobernanza semántica. A través de archivos de contexto como AGENTS.md o .cursorrules, los ingenieros humanos comunicamos al agente los invariantes de diseño abstractos, la filosofía de la base de código y las heurísticas del proyecto.

Este canal de comunicación define las reglas de intención:

  • “Favorece la inmutabilidad de datos en toda la capa de dominio.”
  • “No importes librerías externas para utilidades que puedan resolverse con la API nativa de JavaScript.”
  • “Al modificar un caso de uso, actualiza de forma obligatoria el test de aceptación correspondiente en lugar de escribir un nuevo test unitario.”

Estas instrucciones semánticas rellenan el vacío interpretativo que las herramientas deterministas no pueden analizar, moldeando el comportamiento conceptual de la IA.

Conclusión: El ingeniero sénior como diseñador de límites

La llegada de la IA agéntica no reduce la importancia del diseño de software; la eleva a una dimensión crítica. En un flujo de desarrollo tradicional, el ingeniero pasa gran parte de su jornada escribiendo código secuencialmente. En la era agéntica, el valor diferencial del ingeniero sénior reside en su capacidad para actuar como un arquitecto de sandbox: un profesional capaz de construir el marco de aserciones, límites y validaciones dentro del cual los agentes de IA pueden producir código de forma segura, coherente y alineada con los objetivos a largo plazo del sistema.

La próxima vez que un agente genere una Pull Request, no te limites a mirar si los tests pasan. Pregúntate si estás ante un diseño limpio y sostenible o ante las primeras costuras de una arquitectura Frankenstein que devorará tu productividad mañana. La gobernanza de la IA no es un paso opcional; es la única red de seguridad para la supervivencia de tu base de código.