Del vibe al production-grade
La rutina diaria de un ingeniero de Google giró 180 grados: los coding agents producen mil líneas de código documentado antes del almuerzo. Pero velocidad de escritura no es software entregado. Esta guía resume el paper "Spec-Driven Production Grade Development in the Age of Vibe Coding" — el blueprint para transformar prototipos generados por IA en sistemas de producción confiables: specs como source of truth, code review en 3 tiers, guardrails zero-trust y evaluation continua.
El objetivo: escalar el output de agentes sin convertir el repositorio en un campo minado — specs sólidas, review que escala, guardrails externos y humanos en el loop correcto. Presupone familiaridad con desarrollo moderno; no con ML.
La ilusión de velocidad
Mil líneas antes del almuerzo impresionan — hasta que miras lo que llegó a producción.
La rutina cambió por completo. Antes, el día era excavar documentación de APIs, probar código línea por línea, descubrir si el lenguaje usa substring in string, string.includes() o string.contains() — y depurar la distancia entre el código funcional y la intención original. Hoy, coding agents como Antigravity y Gemini CLI no solo sugieren texto: usan herramientas, ejecutan tareas y producen mil líneas documentadas en minutos.
⏪ Antes: el artesano
- Excavar APIs y documentación manualmente
- Probar código línea por línea
- Descubrir sintaxis por prueba y error
- Depurar la distancia entre código e intención
⏩ Hoy: warp speed
- Los agentes usan herramientas y ejecutan tareas
- 1.000 líneas de código documentado, rápido
- La IA escribe tests, specs, roadmaps y análisis
- El cuello de botella migró a la revisión e integración humanas
Es como contratar una legión de pasantes que nunca duermen y nunca se quejan.
El problema: la Illusion of Speed es real. El bug-to-code ratio sigue siendo un desafío — la IA escribe mucho más rápido, pero también genera errores potenciales a una tasa sin precedentes. Y cuando un agente alucina (el modelo inventa confiadamente algo que no es verdad), no crea un bug: crea mil líneas de lógica "vibe-consistent" y funcionalmente rota.
Si los revisores humanos se están ahogando en un mar de PRs generados por IA, la velocidad de escritura se vuelve irrelevante: el proceso no se aceleró — solo creó una pila más grande de "cosas" para triar después.
🎲 Vibe Coding
- Genial para prototipos y experimentos
- Output de IA no validado
- Fallar es aceptable — es un borrador
🏭 Vibe in Production
- Todo intencional y controlado
- Confiabilidad production-grade
- En enterprise: "Development with Agentic AI"
Agentic AI difiere de la Generative AI estándar (autocompletado inteligente): el agente actúa como miembro híbrido del equipo — usa el LLM como cerebro para generar y herramientas como manos para integrar: razona, escribe specs y tests, usa el browser para probar la UI, commitea y mergea en Git. Hay formas de proteger este proceso — pero aplícalas desde el inicio, no a mitad de camino.
Spec-Driven Development
La mayor parte de tu tiempo ahora es escribir especificaciones — el código se volvió un subproducto desechable.
En el mundo tradicional, a los devs se les enseña a ser "Code-First": idea vaga → abrir el editor → escribir hasta que algo funcione. En la era de la Agentic AI, la mayor parte del tiempo se vuelve escribir especificaciones de alta calidad — instrucciones técnicas detalladas que le dicen a la IA exactamente qué construir. El rol del dev se acerca más a technical architect que a coder tradicional.
🧱 Code-First
Idea vaga → editor → escribir hasta que funcione. Apego emocional al código que costó 12 horas de depuración.
📐 Spec-First
Spec sólida → el agente genera → regenera cuando quieras. El dev se vuelve arquitecto; el código, output compilado.
Con una spec sólida, el codebase entero puede regenerarse repetidamente — un agente puede incluso convertir un proyecto entero de Python a JavaScript en una tarde. Sin apego emocional: como no pasaste 12 horas depurando un punto y coma, no hay miedo de tirar todo y recomenzar si los requisitos cambian.
Los coding agents usan el LLM como cerebro (razonar) y herramientas como manos (ejecutar). La consecuencia directa:
🎲 Vibe en lugar de blueprint
- El modelo llena huecos con suposiciones
- En enterprise, adivinar = incidentes de "Rogue Agent"
- Un agente actuando sin verificar nada
📐 Blueprint
- Cada requisito está escrito y revisado
- Código regenerable en cualquier momento
- Auditable por humanos y por IA
Anatomía de una buena spec
La spec es la Estrella del Norte arquitectónica — y el antídoto contra el "teléfono descompuesto" digital.
Una spec production-grade funciona como Architectural North Star: previene la "context fragmentation" — el equivalente digital del juego del teléfono descompuesto, donde la IA pierde el hilo porque mira snapshots desactualizados de archivos. La IA puede ser coautora o revisora de la spec; vive en el codebase (carpeta specs/, en Markdown o YAML) y actúa como source of truth para humanos y máquinas.
Qué contiene una spec de proyecto nuevo
📦 Full Technical Design
Nada de "make a login page". Descompón: requisitos, database schemas (la estructura de los datos) y API specifications (los "contratos" que permiten a las partes del software conversar).
🎨 Visual Aids
Diagramas + lista de herramientas y bibliotecas específicas con números de versión — sin versión, el agente puede sugerir releases antiguos.
🧭 Background Information
Dale al agente el "porqué" detrás del "qué". Sabiendo el objetivo, piensa adelante y anticipa los pasos que probablemente serán necesarios.
🧪 Scenarios
Cómo es lo "bueno", qué está mal — y los edge cases. Los escenarios son la materia prima de los tests.
Mejor que un humano detecte un fallo de lógica en el diseño a esperar a que la IA ya haya generado miles de líneas de código roto.
Mantener procesos antiguos con herramientas modernas es intentar colocar un motor a reacción en una carreta tirada por caballos: la tecnología no puede atornillarse en un workflow de 20 años esperando que vuele. La spec es el primer tornillo del nuevo workflow.
El formato correcto: YAML gana
Los LLMs tienen sensibilidad extrema al formato de las instrucciones — hasta 40% de caída con Markdown genérico.
El estudio SkCC (Ouyang et al., 2026 — "Portable and Secure Skill Compilation for Cross-Framework LLM Agents") mostró que los agentes exhiben sensibilidad extrema a cómo se formatean las instrucciones: hasta 40% de caída de performance con Markdown genérico no optimizado. Los investigadores crearon SkCC (Skill Compiler): una herramienta ultrarrápida que compila el archivo de instrucción single-source al formato objetivo óptimo del modelo en menos de 10 milisegundos.
Precisión de parsing — configuraciones profundamente anidadas
Fuente: SkCC (Ouyang et al., 2026). Para equipos con Gemini, la mejor estrategia absoluta es el híbrido Markdown + Conditional YAML.
Usa headers Markdown limpios para anclar la atención y cambia a YAML en cualquier configuración estructurada con anidamiento > 3. Renderizar specs anidadas en YAML + instrucciones narrativas en Markdown evita el "format tax" → Gemini opera con máxima precisión y economía óptima de tokens.
BDD & Gherkin
Convierte ideas humanas vagas en diseño arquitectónico preciso — sin espacio para adivinanzas.
Una spec BDD es la herramienta final para convertir ideas vagas y ambiguas en un diseño preciso que el agente puede construir sin adivinar. Behavior Driven Development usa lenguaje natural simple y estructurado para describir exactamente cómo debe comportarse el sistema desde la perspectiva del usuario antes de escribir cualquier código. La sintaxis estandarizada es Gherkin: un template declarativo Scenario / Given / When / Then que fuerza al LLM a pensar en State → Action → Outcome — eliminando completamente el "vibe coding" y manteniendo al agente en una pista estricta.
Feature: Retry de pagamentoScenario: Cartão recusado, nova tentativa automáticaGiven um pedido "#8842" com pagamento "recusado"And o cliente tem 2 tentativas restantesWhen o webhook "payment.retried" é recebidoThen o sistema agenda nova tentativa em 30 minutosAnd o cliente recebe notificação por email
Las specs ejecutables vencen a la prosa: cada escenario se vuelve un test verificable, y el agente sigue una pista estricta en lugar de interpretar párrafos ambiguos.
⚛️ La física de los tokens
Los LLMs no interpretan estructuras de datos — procesan texto tokenizado. Cada carácter enviado se descompone en tokens; cada token consume budget, tiempo y capacidad de contexto. Escribir specs production-grade es tratar la tokenización como una restricción física rígida: cada newline y espacio de indentación se traduce directamente en budget de desarrollo y latencia. Incluso plataformas generosas como Antigravity están limitadas por la física de tokens de los modelos subyacentes — cada espacio innecesario en un YAML anidado y cada Given/When/Then repetitivo consume ciclos y attention-heads en loops de razonamiento multi-turno. Trata /specs no como documentación, sino como un conjunto de instrucciones compilado y enxuto: Markdown legible por humanos + bloques YAML planos y altamente dirigidos.
Dónde viven las instrucciones
Tres capas con alcances y tiempos de vida diferentes — tirar todo en el chat agota el contexto.
Para practicar SDD, entiende cómo las herramientas de coding consumen instrucciones: no se escriben en un único lugar. Tirar un documento masivo de diseño de sistema de 100 páginas directo en la ventana de chat agota el budget de contexto de corto plazo, aumenta la latencia y fragmenta el contexto. Las instrucciones viven en tres capas:
Chat Interface — short-lived, session-specific capa 1
La caja conversacional efímera del IDE (side-panel Gemini o terminal). Vive con la sesión activa del dev — úsala puramente para orquestación de alto nivel y loops de feedback instantáneo.
- Ejemplo:
"Review the design in specs/payment_retry.md and generate the failing unit tests defined in Scenario 3." - Nunca: specs enteras pegadas en el prompt (prompt-stuffing manual)
Spec Folder — task-specific, versionado capa 2
Una carpeta estática commiteada directo en el repositorio: diseño técnico, escenarios BDD, contratos de API, schemas YAML estructurales. El agente indexa el directorio dinámicamente para construir y verificar código sin prompt-stuffing manual.
- Ejemplo:
./my-app/specs/my_spec.md - Source of truth compartida por humanos y agentes
Agent Skills — reusable, feature-focused capa 3
Archivos Markdown estructurados con workflows especializados trigger-based. Enseñan hábitos de ingeniería repetibles (ej.: mantener el CHANGELOG.md automáticamente cuando se detectan cambios de código). La carpeta de skills también puede contener data assets y scripts.
- Ejemplo:
./my-app/.agent/skills/docs-maintenance/SKILL.md - Deben vivir en el directorio
.agentpara que el Antigravity workspace manager las reconozca
Gemini CLI y Antigravity escanean y concatenan contexto jerárquicamente, de overrides globales hasta configuraciones locales: Global Profile (~/.gemini/GEMINI.md — persona universal, estilo estándar y principios centrales, independiente del proyecto) → AGENTS.md compartido (fundación cross-tool para equipos con múltiples clientes de IA; el GEMINI.md local retiene prioridad para configs Google-specific) → Project Spec (./my-app/.gemini/GEMINI.md — el DNA del proyecto, detectado y leído automáticamente).
Los 5 modos de ejecución
Cinco personajes, cinco mindsets: elige el prompt por el trabajo, no por costumbre.
No existe una única forma de transformar una spec en código — cada trabajo pide un execution mode diferente. Haz clic en los personajes para ver el playbook de cada uno:
Números de versión para toda biblioteca, siempre. El knowledge cutoff del modelo está en el pasado: sin versión explícita, el agente sugiere releases antiguos — y hasta sugiere versiones más bajas de modelos (ej.: gemini-1.5-flash) simplemente porque las nuevas no existen en el entrenamiento. Las versiones propuestas deben verificarse siempre dos veces; usa RAG del editor o descarga documentación como Markdown en specs/, skills o profile prompts.
MCP: una integración, todos los frameworks
El "USB-C de las herramientas de IA" — construye un servidor, conecta cualquier agente.
El Model Context Protocol (creado por Anthropic, hoy estándar abierto) es apodado "the USB-C for AI tools" — una exageración, pero la analogía captura la idea: construye un servidor MCP para tu base de datos, API o sistema de archivos, y cualquier agente compatible puede usarlo sin escribir integración personalizada.
1 servidor MCP
from mcp.server import Serverfrom mcp.server.stdio import stdio_serverimport sqlite3 server = Server("knowledge-base") conn = sqlite3.connect("knowledge.db")@server.list_tools()async def list_tools():return [{"name": "query_knowledge","description": "Query the knowledge base with SQL","inputSchema": {"sql": "SQL query to execute (SELECT only)"}},{"name": "add_knowledge","description": "Add a new knowledge entry","inputSchema": {"title": ..., "content": ..., "tags": "Comma-separated tags"}}, ]@server.call_tool()async def call_tool(name, arguments):if name == "query_knowledge": sql = arguments["sql"]if not sql.strip().upper().startswith("SELECT"):return "Error: Only SELECT queries allowed"rows = conn.execute(sql).fetchall()return [dict(zip(cols, r)) for r in rows] # → TextContentif name == "add_knowledge": conn.execute("INSERT INTO knowledge (title, content, tags) VALUES (?, ?, ?)", ...) conn.commit(); return "Knowledge entry added."async def main():async with stdio_server() as (r, w):await server.run(r, w, server.create_initialization_options())
El cliente (mcp_client.py, Snippet 2) es simétrico: StdioServerParameters(command="python", args=["mcp_server.py"]) → session.initialize() → session.list_tools() → session.call_tool("query_knowledge", {"sql": "SELECT * FROM knowledge WHERE tags LIKE '%agent%'"}). Una integración, todos los frameworks.
Cultura de equipo & evolución de procesos
PRs enormes, conflictos de merge y teléfono descompuesto: qué cambia cuando todo el equipo usa agentes.
Trabajar con coding agents modernos exige un cambio de mentalidad y de cultura. Sin él, el escenario clásico: los PRs se vuelven enormes, los conflictos de merge se multiplican (devs llegando a los mismos archivos) y la cadena de dependencias se vuelve imposible de desenredar — el PR #1 no mergea sin el PR #2, que necesita el PR #3, bloqueado por un revisor en otro huso horario. Algunos cambios aprobados mientras los relacionados esperan → aún más conflictos. De repente: branch roto.
⚔️ Merge conflicts
Múltiples devs (y sus agentes) llegando al mismo archivo en menos de una hora.
🪆 Review gridlock
El PR masivo se vuelve una "muñeca rusa" de sub-PRs anidados, imposible de revisar de una vez.
🧩 Context fragmentation
Mientras estás fuera, un colega renombra una variable en un archivo compartido; tu agente, citando un snapshot desactualizado, genera código que llama a una función que ya no existe.
Estrategias para integración de alta velocidad
📋 Bundled Summaries & Risk Assessments
Todo PR incluye un snapshot generado por IA de lo que cambió, potenciales puntos de quiebre y una evaluación de riesgo (Markdown o descripción de commit) — el revisor humano se enfoca en el impacto arquitectónico en lugar de perderse en las líneas.
🎯 Reimagined Ownership
El review humano sale del "nitpicking de estilo" en código desechable escrito por agente y pasa a garantizar la integridad de los blueprints arquitectónicos. El estilo es problema de herramientas automatizadas: linters compartidos y stylebooks (SKILLS.md).
⏱️ The "Conditional LGTM"
Elimina retrasos de 12 horas en equipos cross-timezone: el revisor aprueba el PR contingente a que todos los tests automatizados pasen — si quedan verdes, el código mergea automáticamente.
🕊️ No-Blame Culture
En entornos de alta velocidad, quien produce más código se vuelve el chivo expiatorio fácil de bugs y conflictos. Atribuye esos problemas a procesos de integración rotos — no al dev individual usando el agente.
Si puedes trabajar con un escuadrón de agentes, ¿realmente necesitas trabajar como equipo? Si la respuesta es sí, divide el trabajo para que los miembros raramente toquen los mismos archivos (ownership clara de APIs vs UX); cuando la superposición sea inevitable, un "part owner" designado se encarga de la sincronización final. Y automatiza: puedes escribir skills que hacen code review — y hasta skills que responden a code reviews (Snippet 3, code-check.md: analiza vulnerabilidades críticas, lógica, legibilidad y edge cases, devolviendo Description + Critical / Warnings / Best Practices / Quick Win), disparadas vía GitHub Actions o Gemini Code Assist on GitHub.
Act as a Senior Software Engineer and Security Researcher. Review the provided code for this Github PR or Diff using these strict criteria: Use the command line to fetch the Github PR: `gh pr view <PR NUMBER>` First analyze the code, then code review: 1. **Critical Vulnerabilities:** Check for hardcoded secrets (API keys), SQL injection, XSS, or broken authentication. 2. **Logic & Efficiency:** Identify "off-by-one" errors, infinite loops, or redundant API calls. 3. **Readability:** Suggest better naming conventions or breaking down "megafunctions" into smaller pieces. 4. **Edge Cases:** What happens if the input is null? What if the network fails? Output Format: - **Description:** - What is this PR doing? Explain in details. ISSUES: -⚠ **Critical:** (Stop-ship issues) -⚠️ **Warnings:** (Code smells or style issues) -✅ **Best Practices:** (Specific lines to refactor for better performance) -💡 **Quick Win:** (One sentence summary of the biggest improvement) When there are no issues return - **Description:** - What is this PR doing? Explain in details. LGTMLos 3 tiers de code review
¿Quién ejecuta el revisor en cada PR, sin un humano apretando el botón? Un espectro de control × simplicidad.
Puedes escribir un gran prompt de review — pero la skill solo corre cuando se invoca desde dentro del IDE. El siguiente paso es el revisor continuo: servicios que observan el repositorio, reaccionan a eventos (PR abierto, cron nocturno) y publican hallazgos sin que nadie lo pida. Atrapan lo que los revisores cansados pierden un viernes por la tarde: una dependencia con un CVE nuevo, un TODO de 6 meses que se volvió una brecha silenciosa. Cuando el equipo envía PRs generados por IA en volumen, el revisor continuo es lo único que escala con el output. La pregunta es qué tan custom necesitas ir — la respuesta es un espectro de 3 tiers:
| Criterio | Tier 1 · Managed | Tier 2 · Hybrid | Tier 3 · Custom |
|---|---|---|---|
| Ejemplo | Gemini Code Assist on GitHub · revisor SaaS | GitHub Action + CLI de coding agent (Antigravity CLI) | Agente ADK en Gemini Enterprise Agent Engine |
| Setup | Habilitar en la org · minutos | Skill en el repo + acción CI · ~1 día | Runtime propio + webhooks · semanas |
| Runtime | Del vendor · pagas por seat | Del proveedor de CI | Tuyo (Agent Engine: Sessions + Memory Bank) |
| Criterios de review | Del vendor (genéricos) | Tuyos (skill commiteada en el repo) | Tuyos + memoria de largo plazo |
| Memoria entre ejecuciones | No | No | Sí — contexto cross-PR, codebase memory |
| Eres dueño de | Nada más allá de la suscripción | Prompts, modelo, sandboxing, criterios | Todo: eval, observability, costo, on-call |
| Trade principal | Opiniones del vendor, no las tuyas | Punto de partida correcto para la mayoría | Máximo poder · máximo costo de operación |
Las 3 preguntas que te dicen qué tier necesitas
1️⃣ ¿Qué tan específicos son tus criterios?
Genéricos → Tier 1. Específicos del equipo/repo → Tier 2 o 3.
2️⃣ ¿El agente necesita recordar entre ejecuciones?
No → Tier 1 o 2. Sí (memoria de codebase, contexto cross-PR) → Tier 3.
3️⃣ ¿Cuál es el peor caso si sale mal?
Comentario ruidoso → cualquier tier. Regresión mergeada o secreto filtrado → Tier 3 con Policy Server frente a cada tool call.
En el momento en que el revisor gestionado pierde algo específico. Ejemplo del paper: un equipo de plataforma en una fintech mediana empezó en Tier 1 y descubrió que el revisor de compliance marcaba boilerplate que los auditores ya habían aprobado — mientras perdía el único patrón que importaba: PII sin enmascarar en declaraciones de log. Una skill compliance-check.md de 40 líneas en una GitHub Action (Tier 2) eliminó los falsos positivos en una semana. Tier 3 aún no fue necesario. Regla práctica: elige el tier más bajo que atrape lo que importa.
Tier 3 a escala total: review graph-native
No un agente que observa PRs — uno que entiende el sistema entero en el que viven los PRs.
En codebases legacy de cien millones de líneas, cargar código como texto plano en la ventana de contexto se queda sin espacio, y el RAG estándar elimina la estructura que hace el código legible (una clase pertenece a un archivo, una llamada de función remite a un doc de requisitos escrito hace una década). Aplanar todo en un vector store = el mapa desaparece. El patrón que emergió de las mayores modernizaciones: construir el agente sobre un knowledge graph — ingerir código, docs, tickets y PDFs de diseño en un graph database (ej.: Spanner Graph) y combinar 3 modos de retrieval:
La segunda mitad es descomposición: un único agente instruido a "refactorizar este módulo" falla. Dividido en un pipeline de sub-agentes ADK — explorar el grafo, capturar requisitos, predecir efectos colaterales, producir unidades atómicas de trabajo y SOLO ENTONCES codificar — el trabajo se vuelve manejable.
Figura 1 — Arquitectura Graph-Native de Code Understanding
Resumen del espectro: Managed = revisor genérico en minutos · Hybrid = TU revisor en un día · Custom = un revisor que entiende el sistema ENTERO — al costo de ser dueño del runtime y de la evaluation.
Approval fatigue: la sostenibilidad del proceso
Si cada tool call pide aprobación, nadie aprueba de verdad — solo hace clic.
Un fenómeno nuevo: ante un flujo constante de micro-aprobaciones (mejorar una sola línea, ajustar una tool call), los devs empiezan a hacer clic en "Approve" reflexivamente. Es una forma de agotamiento de bajo grado en la que el equipo deja de verificar el trabajo de la máquina solo para mantener el ritmo — y pierde atención a los detalles. La supervisión constante no escala; los límites estructurados, sí.
🌙 Digital Quiet Hours
Límites explícitos para que las solicitudes de aprobación no se filtren en noches y fines de semana. Un agente que nunca duerme no puede significar un humano que nunca duerme.
🤝 Agent Insight Sessions
Sesiones semanales donde los devs comparten patrones identificados por sus contrapartes de IA — convirtiendo hallazgos aislados en conocimiento organizacional compartido.
La respuesta a la fatiga no es quitar guardrails — es calibrarlos: reglas determinísticas y baratas (semáforos) para lo obvio, juicio inteligente (árbitro) para lo matizado, y humanos solo donde el riesgo realmente lo exige. Es exactamente el diseño del Policy Server de la sección 18.
El incidente del email: reacción en cadena
Un prompt inocente, modo YOLO y cincuenta colegas recibiendo contenido alucinado.
Durante una actualización de rutina, el autor descubrió el poder — y los límites — del browser integrado de Antigravity: el recurso permite al agente interactuar con aplicaciones en desarrollo sin credenciales de login (invaluable para tests de UX). Pero en modo YOLO (auto approve), el agente puede actuar más rápido de lo que un humano puede pensar. Un prompt simple para crear un botón disparó la siguiente cadena:
El incidente destacó el riesgo de context hallucination: cuando la IA no tiene datos suficientes, llena huecos usando cualquier string que exista en el contexto — incluyendo información sensible como direcciones de email hardcodeadas o URLs. Puede parecer menor si es "solo un email". Pero considera lo que el agente estaba haciendo: cumpliendo su directiva con los datos disponibles, sin ninguna verificación de si debía. Ese es el riesgo central de los sistemas autónomos.
Los guardrails no son opcionales; son lo que impide que una herramienta útil se vuelva impredecible.
Zero-Trust para agentes
Nunca confíes en la auto-policía del modelo — la gobernanza debe ser externa y a prueba de adulteración.
A medida que los límites de la Agentic AI se expanden, surge una paradoja: los agentes deben ser lo suficientemente autónomos para resolver problemas complejos, pero no puedes asumir el riesgo de que se vuelvan "rogue" en un entorno enterprise. Imagina un agente encargado de "resolver disputas de clientes": para ser eficaz, necesita acceso a datos de clientes, herramientas de email y sistemas internos — pero el desafío es garantizar que no envíe email accidentalmente a la base de datos entera o comparta código propietario.
🚫 Auto-policía del modelo
- Los LLMs son probabilísticos, no determinísticos
- Los contextos se desbordan; las reglas se pierden
- El prompt injection "convence" al agente de burlar las reglas
🛡️ Enforcement externo
- Políticas fuera del modelo, en el runtime
- Toda tool call interceptada antes de ejecutarse
- El agente no puede editar sus propias reglas
Sandboxing
Un entorno de ejecución restringido que contiene acciones destructivas (sección 15).
HITL Checkpoints
Aprobación humana para acciones de alto riesgo (sección 16).
Policy Server
Gating estructural + semántico antes de sistemas externos (sección 18).
Para profundizar en proteger y evaluar agentes contra código malicioso, ve la guía del Día 4 — Vibe Coding Agent Security and Evaluation (enlace en la sección Companions).
Sandboxing & blast radius
Si el agente es engañado, el daño debe caber en una caja desechable.
Más allá de sanitizar strings, la seguridad real requiere un entorno de ejecución restringido para contener las acciones del agente. Incluso con filtrado riguroso de output, el LLM puede generar código sintácticamente válido pero lógicamente malicioso. Ejecutar tareas en contenedores efímeros y de bajo privilegio — aislados de la red principal y de sistemas de archivos sensibles — crea un "blast radius" que protege la infraestructura central: si el agente es engañado para ejecutar un comando destructivo, el daño queda confinado a una instancia desechable, limpiada y reiniciada sin consecuencias.
comando destructivo → error de permisos rígido a nivel del kernel → host completamente intacto
⚙️ En Antigravity: un toggle
User Settings → habilitar "Terminal Sandboxing". Listo: los comandos del agente corren contenidos.
🐳 Para el equipo: sandbox portátil en la nube
Containeriza el workspace: un Dockerfile personalizado (ej.: .gemini/sandbox.Dockerfile) a partir de la imagen oficial Gemini CLI sandbox, inyecta credenciales cloud con alcance limitado y fuerza el modo con export GEMINI_SANDBOX=docker.
Human-in-the-loop & testing
La automatización es el objetivo — pero las operaciones de alto riesgo exigen un humano en el checkpoint.
Aunque la automatización es el objetivo, las operaciones de alto riesgo exigen un protocolo Human-in-the-Loop (HITL) como fail-safe final: checkpoint gates para acciones que cumplen un perfil de riesgo específico. Presentar la intención sanitizada del agente a un supervisor humano para aprobación manual equilibra la velocidad de la IA con el juicio matizado del dev — y garantiza que la responsabilidad final por la integridad arquitectónica permanezca en manos humanas.
Deploy a producción
El código generado por IA solo sube con aprobación explícita.
Cambios de database schema
Las migraciones son demasiado irreversibles para auto-approve.
Transacciones financieras
Ningún agente inicia movimiento de dinero solo.
El auge de los tests generados por IA
El auge del código generado por IA empuja el proceso de los tests manuales hacia la cobertura de tests generada por IA — y aquí la IA tiene ventaja estructural: como la implementación ya no es el cuello de botella, puede escribir una cobertura de tests más amplia que cualquier humano en el mismo tiempo, de forma programática y poderosa. En un entorno de alta velocidad, el test-driven development se vuelve realidad: la máquina escribe los propios tests que validan su output.
El proceso fuerza al agente a producir un test unitario que falle o un comando de reproducción (como un request curl) antes de intentar cualquier corrección. Incrustar estos tests en el codebase significa que cada iteración rápida está respaldada por una suite verificable — los bugs no vuelven, y los revisores humanos pueden confiar en la "luz verde" automatizada para la integración.
Evaluation continua
Los tests tradicionales son insuficientes cuando el output es GENERADO, no COMPUTADO.
¿Por qué chequeos de calidad especiales para sistemas dirigidos por ML? Porque los tests de software tradicionales son insuficientes para sistemas cuyo output es generado en lugar de computado. Un agente (o cualquier componente dirigido por ML — clasificador, resumidor, retriever) puede pasar 100 tests unitarios de sus herramientas y aún fallar espectacularmente eligiendo la herramienta equivocada, parafraseando una respuesta crítica o alucinando un hecho. El margen de error no es un defecto a eliminar — es una propiedad inherente del modelo, y la estrategia de tests debe acomodarlo.
🧪 Test unitario
- Respuesta binaria: pasa o falla
- Atrapa regresiones determinísticas
- El assert cambia → el gate se dispara
📊 Evaluation
- Score 0–5 de un LLM-as-judge (scorecard)
- Verificación de trayectoria que tolera variancia de orden en tool calls
- El gate se dispara cuando la calidad cae bajo un margen configurable — no cuando un assert cambia
Los tests atrapan regresiones determinísticas; la evaluation atrapa behavioural drift.
El Policy Server
Dos capas de gating interceptan toda acción antes de llegar a sistemas externos.
El ejemplo central de guardrail del paper es el Hybrid Policy Server: un middleware que intercepta acciones antes de que lleguen a sistemas externos, operando en dos capas complementarias.
Structural Gating — los semáforos
- Reglas determinísticas basadas en roles y entornos
- Chequeos binarios: el rol
viewerno puede usarsend_email - Previene violaciones arquitectónicas SIN preguntar a un LLM
Semantic Gating — el árbitro inteligente
- Un LLM secundario especializado (Gemini) inspecciona intención y contenido contra políticas en lenguaje natural
- Para cuando la tool ESTÁ PERMITIDA, pero la FORMA de usarla viola política: un admin puede usar
send_email, pero no con PII sin enmascarar - Aquí es donde las reglas estructurales fallan — no se puede hacer regex de toda fuga posible de PII
environments:localhost:blocked_tools:- send_emailroles:viewer:allowed_tools:- list_files- read_file
def is_tool_allowed(self, tool_name):# 1) Environment blocksif tool_name in env_blocked: return False# 2) Role permissionsreturn "*" in role_allows or \ tool_name in role_allowsdef check_action_semantic(self, action_description): client = Client(vertexai=True) prompt = "Evaluate if this action violates " \f"PII policies: {action_description}"response = client.ai.models.generate_content( model="gemini-3.1-pro", contents=prompt)return not response.text.startswith("VIOLATION")
🎛️ Simula el Policy Server
Cuando el agente decide usar una tool, el flujo se intercepta: structural check (¿la tool está permitida para este rol/entorno?) → semantic check (¿los argumentos son seguros?) → execution (si ambos pasan) o un mensaje "Policy Violation" devuelto al agente para autocorrección o fallo elegante. Elige un escenario:
El Policy Server crea una red de seguridad que separa la lógica de ejecución de la lógica de gobernanza — la separación crítica de concerns del software enterprise. El agente ejecuta; el servidor decide qué puede ejecutarse.
Context hygiene & el Context Resolver
El agente nunca debe ver PII real — solo placeholders resueltos en la última milla.
Un peligro significativo del desarrollo autónomo es la Context Hallucination: sin datos específicos, el agente llena huecos con cualquier string disponible en el contexto — potencialmente filtrando direcciones de email hardcodeadas o URLs privadas. La mitigación es Context Hygiene rigurosa vía middleware: PII masking e inyección de placeholders, para que el agente siempre opere con datos esterilizados. Y todo output del agente debe sanitizarse contra prompt injection e interacciones de UI rogue — el "vibe" de la máquina nunca debe volverse una vulnerabilidad arquitectónica.
ana@corp.com[[COMMENTER_EMAIL]]def resolve_context(template_str, override_state):def replacement(match): var_name = match.group(1)# 1) Prioriza overrides de runtime stateif var_name in state_to_check \and state_to_check[var_name] is not None:return state_to_check[var_name]# 2) Fallback para env vars validadasif var_name in os.environ:return os.environ[var_name]# 3) Deixa não resolvido — sem falhas silenciosasreturn match.group(0)return re.sub(r'\[\[([^\]]+)\]\]', replacement, template_str)# ex.: resolve [[COMMENTER_EMAIL]] dinamicamente
def validate_tool_call(tool_call): args = tool_call.function_call.args resolved_args = for k, v in args.items():if isinstance(v, str): resolved_args[k] = resolve_context( v, override_state)elif isinstance(v, list): resolved_args[k] = [resolve_context(i, override_state)if isinstance(i, str) else ifor i in v]else: resolved_args[k] = v args.clear(); args.update(resolved_args)# intercepta TODA tool call ANTES de rodar
Con el middleware conectado directamente al pipeline de ejecución, cualquier intento del agente de ejecutar una acción — enviar email, consultar una presentación en la nube — es interceptado. El engine traduce placeholders como [[COMMENTER_EMAIL]] o [[DEFAULT_PRESENTATION_ID]] en assets de prueba autorizados, de forma segura y silenciosa — eliminando PII hardcodeado de test suites y system prompts.
Resumen & dónde empezar
El cuello de botella se movió — y todo el blueprint se resume en tres comandos.
En menos de un año, los ciclos de desarrollo se volvieron dramáticamente más rápidos. Pero la velocidad reveló el cambio importante: la IA eliminó el cuello de botella de producción de código y movió la restricción río abajo — a los humanos que deben revisar, probar e integrar ese output. Esto es carga cognitiva compartida: los humanos actúan como arquitectos (Test Specs, Integration Specs, blueprints de MLOps/DevOps), mientras la IA se encarga del trabajo pesado (código de tests real, integraciones, detalles operacionales granulares).
🏭 Cuello de botella antiguo: producción
Escribir código era lo difícil. La IA lo resolvió — mil líneas antes del almuerzo.
🧭 Cuello de botella nuevo: integración
Verificar, integrar y entregar. Mejores prompts y modelos más rápidos, solos, no arreglan esto.
El éxito depende de evolucionar las dinámicas de equipo, refinar la colaboración con agentes y definir límites estrictos para herramientas que nunca duermen. El desafío cambió de la mera producción de código a orquestar sistemas que verifican, integran y entregan trabajo.
🚀 Los patrones se vuelven comandos que puedes ejecutar hoy
# geração de projeto spec-drivenagents-cli scaffold# gate de cobertura de testes gerada por IAagents-cli eval run# deployment com sandbox para Cloud Run ou Vertex AI Agent Engineagents-cli deploy
Los vibes prototipan. Las specs entregan.
Quiz: ¿sobrevives a producción?
Ocho preguntas cubriendo todo el paper — de las specs al zero-trust.
Cheatsheets copiables
Tres artefactos listos para pegar en tu repositorio.
# Feature: Payment Retry## 1. Background (o "porquê")Contexto de negócio, restrições, links para docs de design.Payments falham em ~3% dos checkouts; retry automático recupera ~40%.## 2. Technical Design (o "quê")requirements:- idempotency_key em toda tentativa- máximo de 3 tentativas, backoff 30/120/480 mindatabase_schema:payment_retries: {id, order_id, attempt, next_at, status}api_contract:POST /v1/payments/{id}/retry → 202 Accepted## 3. Libraries (com versão SEMPRE)dependencies:fastapi==0.115.0sqlalchemy==2.0.36## 4. Scenarios (Gherkin — vira teste)Scenario: Cartão recusado, nova tentativa automáticaGiven um pedido "#8842" com pagamento "recusado"When o webhook "payment.retried" é recebidoThen o sistema agenda nova tentativa em 30 minutos## 5. Out of scopeO que NÃO construir — evita alucinação de features.
# Gherkin — State → Action → OutcomeFeature: Nome do comportamento (perspectiva do usuário)Scenario: Caminho felizGiven [STATE] um estado inicial verificávelAnd [STATE] condições adicionaisWhen [ACTION] o evento/ação que dispara o comportamentoThen [OUTCOME] o resultado observável esperadoAnd [OUTCOME] efeitos colaterais verificáveisScenario: Edge case — rede falhaGiven um pedido pendenteWhen a gateway retorna timeoutThen o sistema agenda retry e notifica o clienteRegras de ouro:✓ Declarativo, nunca imperativo (descreva O QUÊ, não COMO)✓ Cada Scenario = um teste executável✓ Inclua o "bom", o "errado" e os edge cases✓ Curto: cada token consome budget e attention-heads
# Zero-Trust Checklist — agentes em produção[ ] Sandboxing[ ] Terminal Sandboxing habilitado (Antigravity) ou GEMINI_SANDBOX=docker [ ] Containers efêmeros e de baixo privilégio, isolados da rede principal [ ] Credenciais cloud limitadas por escopo, nunca amplas[ ] Human-in-the-Loop[ ] Checkpoint gates: deploy em produção [ ] Checkpoint gates: mudança de database schema [ ] Checkpoint gates: transações financeiras[ ] Policy Server (2 camadas)[ ] Structural: blocked_tools por ambiente, allowed_tools por role [ ] Semantic: LLM juiz contra policies.yaml (PII não mascarada) [ ] Toda tool call interceptada ANTES da execução[ ] Context Hygiene[ ] PII masking + placeholder injection ([[VAR]]) [ ] Context resolver conectado ao pipeline (tool_policy_engine) [ ] Outputs sanitizados contra prompt injection[ ] Verificação contínua[ ] Teste que falha ANTES de qualquer correção [ ] Eval com scorecard 0–5 vs baseline (behavioural drift) [ ] Revisor contínuo de PRs no tier adequado (1/2/3)[ ] Nunca[ ] Modo YOLO (auto approve) sem guardrails [ ] Confiar na auto-polícia do system prompt [ ] Versões de biblioteca sem verificação dupla
Checklist de adopción
Marca lo que tu equipo ya practica — el progreso queda guardado en el navegador.
📐Adoptar SDD
🛡️Montar la red de seguridad
🔄Escalar review & cultura
Glosario
El vocabulario mínimo para navegar el paper.
Guías companions
La serie completa — del nuevo SDLC a la seguridad y evaluation de agentes.
Hub de la serie — todos los días
El índice navegable de todas las guías de estudio de la serie de whitepapers.
The New SDLC with Vibe Coding
Cómo cambió el ciclo de vida de desarrollo con agentes — la base sobre la que esta guía construye.
Agent Tools & Interoperability
Los 5 protocolos abiertos que conectan agentes a herramientas y entre sí.
Context Engineering: Sessions, Memory & Skills
El complemento directo de la sección de context hygiene: cómo las sessions, la memoria y las skills alimentan al agente.
Vibe Coding Agent Security and Evaluation
Referenciado explícitamente en este paper: proteger y evaluar agentes contra código malicioso, en profundidad.
Referencias
Las 17 endnotes del paper + la cita principal.
GEMINI_SANDBOX=docker.BOONSTRA, Lee. "Spec-Driven Production Grade Development in the Age of Vibe Coding: The Blueprint for Scalable Workflows and Team Evolution — From Vibe Prototypes to Production Reality". Google, mayo de 2026.