Do vibe ao production-grade
A rotina diária de um engenheiro do Google virou 180 graus: coding agents produzem mil linhas de código documentado antes do almoço. Mas velocidade de escrita não é software entregue. Este guia resume o paper "Spec-Driven Production Grade Development in the Age of Vibe Coding" — o blueprint para transformar protótipos gerados por IA em sistemas de produção confiáveis: specs como source of truth, code review em 3 tiers, guardrails zero-trust e evaluation contínua.
O objetivo: escalar o output de agentes sem transformar o repositório em um campo minado — specs sólidas, review que escala, guardrails externos e humanos no loop certo. Pressupõe familiaridade com desenvolvimento moderno; não com ML.
A ilusão da velocidade
Mil linhas antes do almoço impressionam — até você olhar o que chegou em produção.
A rotina mudou por completo. Antes, o dia era cavar documentação de API, testar código linha por linha, descobrir se a linguagem usa substring in string, string.includes() ou string.contains() — e debugar a distância entre o código funcional e a intenção original. Hoje, coding agents como Antigravity e Gemini CLI não apenas sugerem texto: usam ferramentas, executam tarefas e despejam mil linhas documentadas em minutos.
⏪ Antes: o artesão
- Cavar APIs e documentação manualmente
- Testar código linha por linha
- Descobrir sintaxe por tentativa e erro
- Debugar a distância entre código e intenção
⏩ Hoje: warp speed
- Agentes usam ferramentas e executam tarefas
- 1.000 linhas de código documentado rapidamente
- IA escreve testes, specs, roadmaps e análises
- Gargalo migrou para revisão e integração humanas
É como contratar uma legião de estagiários que nunca dormem e nunca reclamam.
O problema: a Illusion of Speed é real. O bug-to-code ratio continua sendo um desafio — a IA escreve muito mais rápido, mas também gera erros potenciais em taxa sem precedentes. E quando um agente alucina (o modelo inventa confiantemente algo que não é verdade), ele não cria um bug: cria mil linhas de lógica "vibe-consistent" e funcionalmente quebrada.
Se revisores humanos estão se afogando num mar de PRs gerados por IA, a velocidade de escrita se torna irrelevante: o processo não ficou mais rápido — só criou uma pilha maior de "coisas" para triar depois.
🎲 Vibe Coding
- Ótimo para protótipos e experimentos
- Output de IA não validado
- Falhar é aceitável — é rascunho
🏭 Vibe in Production
- Tudo intencional e controlado
- Confiabilidade production-grade
- Em enterprise: "Development with Agentic AI"
Agentic AI difere da Generative AI padrão (autocomplete inteligente): o agente age como membro híbrido do time — usa o LLM como cérebro para gerar e ferramentas como mãos para integrar: raciocina, escreve specs e testes, usa o browser para testar a UI, commita e mergeia no Git. Há formas de proteger esse processo — mas aplique-as desde o início, não no meio do caminho.
Spec-Driven Development
A maior parte do seu tempo agora é escrever especificações — o código virou subproduto descartável.
No mundo tradicional, devs são ensinados a ser "Code-First": ideia vaga → abrir o editor → digitar até algo funcionar. Na era da Agentic AI, a maior parte do tempo vira escrever especificações de alta qualidade — instruções técnicas detalhadas que dizem à IA exatamente o que construir. O papel do dev se aproxima mais de technical architect do que de coder tradicional.
🧱 Code-First
Ideia vaga → editor → digitar até funcionar. Apego emocional ao código que custou 12 horas de debug.
📐 Spec-First
Spec sólida → agente gera → regenera quando quiser. O dev vira arquiteto; o código, output compilado.
Com uma spec sólida, o codebase inteiro pode ser regenerado repetidamente — um agente pode até converter um projeto inteiro de Python para JavaScript em uma tarde. Sem apego emocional: como você não passou 12 horas debugando um ponto-e-vírgula, não há medo de jogar fora e recomeçar se os requisitos mudarem.
Coding agents usam o LLM como cérebro (raciocinar) e ferramentas como mãos (executar). A consequência direta:
🎲 Vibe em vez de blueprint
- O modelo preenche lacunas com suposições
- Em enterprise, adivinhar = incidentes de "Rogue Agent"
- Agente agindo sem verificação de nada
📐 Blueprint
- Cada requisito está escrito e revisado
- Código regenerável a qualquer momento
- Auditável por humanos e por IA
Anatomia de uma boa spec
A spec é a Estrela do Norte arquitetural — e o antídoto contra o "telefone sem fio" digital.
Uma spec production-grade funciona como Architectural North Star: previne a "context fragmentation" — o equivalente digital do jogo "telefone sem fio", em que a IA perde o fio da meada porque olha snapshots desatualizados de arquivos. A IA pode ser co-autora ou revisora da spec; ela vive no codebase (pasta specs/, em Markdown ou YAML) e age como source of truth para humanos e máquinas.
O que uma spec de projeto novo contém
📦 Full Technical Design
Nada de "make a login page". Decomponha: requisitos, database schemas (a estrutura dos dados) e API specifications (os "contratos" que permitem às partes do software conversar).
🎨 Visual Aids
Diagramas + lista de ferramentas e bibliotecas específicas com números de versão — sem versão, o agente pode sugerir releases antigos.
🧭 Background Information
Dê ao agente o "porquê" por trás do "quê". Sabendo o objetivo, ele pensa à frente e antecipa os passos que provavelmente serão necessários.
🧪 Scenarios
Como é o "bom", o que está errado — e os edge cases. Cenários são a matéria-prima dos testes.
Melhor um humano pegar uma falha de lógica no design do que esperar a IA já ter gerado milhares de linhas de código quebrado.
Manter processos antigos com ferramentas modernas é tentar colocar um motor a jato numa carroça puxada por cavalos: a tecnologia não pode ser parafusada num workflow de 20 anos esperando que voe. A spec é o primeiro parafuso do novo workflow.
O formato certo: YAML vence
LLMs têm sensibilidade extrema ao formato das instruções — até 40% de queda com Markdown genérico.
O estudo SkCC (Ouyang et al., 2026 — "Portable and Secure Skill Compilation for Cross-Framework LLM Agents") mostrou que agentes exibem sensibilidade extrema a como instruções são formatadas: até 40% de queda de performance com Markdown genérico não otimizado. Os pesquisadores criaram o SkCC (Skill Compiler): uma ferramenta ultrarrápida que compila o arquivo de instrução single-source para o formato-alvo ótimo do modelo em menos de 10 milissegundos.
Precisão de parsing — configurações profundamente aninhadas
Fonte: SkCC (Ouyang et al., 2026). Para equipes com Gemini, a melhor estratégia absoluta é o híbrido Markdown + Conditional YAML.
Use headers Markdown limpos para ancorar a atenção e troque para YAML em qualquer configuração estruturada com aninhamento > 3. Renderizar specs aninhadas em YAML + instruções narrativas em Markdown contorna o "format tax" → o Gemini opera com máxima precisão e economia ótima de tokens.
BDD & Gherkin
Transforme ideias humanas vagas em design arquitetural preciso — sem espaço para adivinhação.
Uma spec BDD é a ferramenta final para transformar ideias vagas e ambíguas em design preciso que o agente pode construir sem adivinhar. Behavior Driven Development usa linguagem natural simples e estruturada para descrever exatamente como o sistema deve se comportar da perspectiva do usuário antes de qualquer código ser escrito. A sintaxe padronizada é o Gherkin: um template declarativo Scenario / Given / When / Then que força o LLM a pensar em State → Action → Outcome — eliminando completamente o "vibe coding" e mantendo o agente em trilha estrita.
Feature: Retry de pagamento Scenario: Cartão recusado, nova tentativa automática Given um pedido "#8842" com pagamento "recusado" And o cliente tem 2 tentativas restantes When o webhook "payment.retried" é recebido Then o sistema agenda nova tentativa em 30 minutos And o cliente recebe notificação por email
Specs executáveis vencem prosa: cada cenário vira um teste verificável, e o agente segue uma trilha estrita em vez de interpretar parágrafos ambíguos.
⚛️ A física dos tokens
LLMs não interpretam estruturas de dados — processam texto tokenizado. Cada caractere enviado é decomposto em tokens; cada token consome budget, tempo e capacidade de contexto. Escrever specs production-grade é tratar a tokenização como restrição física rígida: cada newline e espaço de indentação se traduz diretamente em budget de desenvolvimento e latência. Mesmo plataformas generosas como o Antigravity estão limitadas pela física dos tokens dos modelos subjacentes — cada espaço desnecessário num YAML aninhado e cada Given/When/Then repetitivo consome ciclos e attention-heads em loops de raciocínio multi-turno. Trate /specs não como documentação, mas como conjunto de instruções compilado e enxuto: Markdown legível por humanos + blocos YAML planos e altamente direcionados.
Onde vivem as instruções
Três camadas com escopos e tempos de vida diferentes — jogar tudo no chat esgota o contexto.
Para praticar SDD, entenda como as ferramentas de coding consomem instruções: elas não são escritas num único lugar. Jogar um documento massivo de design de 100 páginas direto na janela de chat esgota o budget de contexto de curto prazo, aumenta a latência e fragmenta o contexto. As instruções vivem em três camadas:
Chat Interface — short-lived, session-specific camada 1
A caixa conversacional efêmera da IDE (side-panel Gemini ou terminal). Vive com a sessão ativa do dev — use puramente para orquestração de alto nível e loops de feedback instantâneo.
- Exemplo:
"Review the design in specs/payment_retry.md and generate the failing unit tests defined in Scenario 3." - Nunca: specs inteiras coladas no prompt (prompt-stuffing manual)
Spec Folder — task-specific, versionado camada 2
Pasta estática commitada direto no repositório: design técnico, cenários BDD, contratos de API, schemas YAML estruturais. O agente indexa o diretório dinamicamente para construir e verificar código sem prompt-stuffing manual.
- Exemplo:
./my-app/specs/my_spec.md - Source of truth compartilhada por humanos e agentes
Agent Skills — reusable, feature-focused camada 3
Arquivos Markdown estruturados com workflows especializados trigger-based. Ensinam hábitos de engenharia repetíveis (ex.: manter o CHANGELOG.md automaticamente quando mudanças de código são detectadas). A pasta de skills também pode conter data assets e scripts.
- Exemplo:
./my-app/.agent/skills/docs-maintenance/SKILL.md - Devem viver no diretório
.agentpara o Antigravity workspace manager reconhecê-las
Gemini CLI e Antigravity escaneiam e concatenam contexto hierarquicamente, de overrides globais até configurações locais: Global Profile (~/.gemini/GEMINI.md — persona universal, estilo padrão e princípios centrais, independente do projeto) → AGENTS.md compartilhado (fundação cross-tool para times com múltiplos clientes de IA; o GEMINI.md local retém prioridade para configs Google-specific) → Project Spec (./my-app/.gemini/GEMINI.md — o DNA do projeto, detectado e lido automaticamente).
Os 5 modos de execução
Cinco personagens, cinco mindsets: escolha o prompt pelo trabalho, não pelo hábito.
Não existe uma única forma de transformar spec em código — cada trabalho pede um execution mode diferente. Clique nos personagens para ver o playbook de cada um:
Números de versão para toda biblioteca, sempre. O knowledge cutoff do modelo está no passado: sem versão explícita, o agente sugere releases antigos — e até sugere versões mais baixas de modelos (ex.: gemini-1.5-flash) simplesmente porque as novas não existem no treinamento. Versões propostas devem sempre ser verificadas duas vezes; use RAG do editor ou baixe documentação como Markdown para specs/, skills ou profile prompts.
MCP: uma integração, todos os frameworks
O "USB-C das ferramentas de IA" — construa um servidor, conecte qualquer agente.
O Model Context Protocol (criado pela Anthropic, hoje padrão aberto) é apelidado de "the USB-C for AI tools" — um exagero, mas a analogia captura a ideia: construa um servidor MCP para seu banco de dados, API ou sistema de arquivos, e qualquer agente compatível pode usá-lo sem escrever integração customizada.
1 servidor MCP
from mcp.server import Server from mcp.server.stdio import stdio_server import 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] # → TextContent if 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())
O cliente (mcp_client.py, Snippet 2) é 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%'"}). Uma integração, todos os frameworks.
Cultura de time & evolução de processos
PRs enormes, conflitos de merge e telefone sem fio: o que muda quando o time inteiro usa agentes.
Trabalhar com coding agents modernos exige mudança de mentalidade e de cultura. Sem ela, o cenário clássico: PRs ficam enormes, conflitos de merge se multiplicam (devs chegando nos mesmos arquivos) e a cadeia de dependências fica impossível de desembaraçar — PR #1 não mergeia sem o PR #2, que precisa do PR #3, bloqueado por um reviewer em outro fuso horário. Algumas mudanças aprovadas enquanto as relacionadas esperam → ainda mais conflitos. De repente: branch quebrado.
⚔️ Merge conflicts
Múltiplos devs (e seus agentes) chegando no mesmo arquivo dentro de uma hora.
🪆 Review gridlock
O PR massivo vira uma "boneca russa" de sub-PRs aninhados, impossível de revisar de uma vez.
🧩 Context fragmentation
Enquanto você está fora, um colega renomeia uma variável em arquivo compartilhado; seu agente, citando snapshot desatualizado, gera código que chama uma função que não existe mais.
Estratégias para high-velocity integration
📋 Bundled Summaries & Risk Assessments
Todo PR inclui snapshot gerado por IA do que mudou, potenciais pontos de quebra e avaliação de risco (Markdown ou descrição de commit) — o revisor humano foca em impacto arquitetural em vez de se perder nas linhas.
🎯 Reimagined Ownership
O review humano sai do "nitpicking de estilo" em código descartável escrito por agente e passa a garantir a integridade dos blueprints arquiteturais. Estilo é problema de ferramentas automatizadas: linters compartilhados e stylebooks (SKILLS.md).
⏱️ The "Conditional LGTM"
Elimina atrasos de 12 horas em times cross-timezone: o revisor aprova o PR contingente a todos os testes automatizados passarem — se ficarem verdes, o código mergeia automaticamente.
🕊️ No-Blame Culture
Em ambientes high-velocity, quem produz mais código vira bode expiatório fácil de bugs e conflitos. Atribua esses problemas a processos de integração quebrados — não ao dev individual usando o agente.
Se você pode trabalhar com um esquadrão de agentes, precisa mesmo trabalhar como time? Se a resposta for sim, divida o trabalho para que membros raramente toquem os mesmos arquivos (ownership clara de APIs vs UX); quando a sobreposição for inevitável, um "part owner" designado cuida da sincronização final. E automatize: dá para escrever skills que fazem code review — e até skills que respondem a code reviews (Snippet 3, code-check.md: analisa vulnerabilidades críticas, lógica, legibilidade e edge cases, devolvendo Description + Critical / Warnings / Best Practices / Quick Win), disparadas via GitHub Actions ou 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. LGTM
Os 3 tiers de code review
Quem roda o revisor em todo PR, sem humano apertando botão? Um espectro de controle × simplicidade.
Você pode escrever um ótimo prompt de review — mas a skill só roda quando invocada de dentro da IDE. O próximo passo é o revisor contínuo: serviços que observam o repositório, reagem a eventos (PR aberto, cron noturno) e postam descobertas sem ninguém pedir. Pegam o que revisores cansados perdem numa sexta à tarde: dependência com CVE novo, TODO de 6 meses que virou brecha silenciosa. Quando o time envia PRs gerados por IA em volume, o revisor contínuo é a única coisa que escala com o output. A questão é quão custom você precisa ir — a resposta é um espectro de 3 tiers:
| Critério | Tier 1 · Managed | Tier 2 · Hybrid | Tier 3 · Custom |
|---|---|---|---|
| Exemplo | Gemini Code Assist on GitHub · revisor SaaS | GitHub Action + CLI de coding agent (Antigravity CLI) | Agente ADK no Gemini Enterprise Agent Engine |
| Setup | Habilitar na org · minutos | Skill no repo + ação CI · ~1 dia | Runtime próprio + webhooks · semanas |
| Runtime | Do vendor · paga por seat | Do provedor de CI | Seu (Agent Engine: Sessions + Memory Bank) |
| Critérios de review | Do vendor (genéricos) | Seus (skill commitada no repo) | Seus + memória de longo prazo |
| Memória entre execuções | Não | Não | Sim — contexto cross-PR, codebase memory |
| Você é dono de | Nada além da assinatura | Prompts, modelo, sandboxing, critérios | Tudo: eval, observability, custo, on-call |
| Trade principal | Opiniões do vendor, não as suas | Ponto de partida certo p/ maioria dos times | Máximo poder · máximo custo de operação |
As 3 perguntas que dizem qual tier você precisa
1️⃣ Quão específicos são seus critérios?
Genéricos → Tier 1. Específicos do time/repo → Tier 2 ou 3.
2️⃣ O agente precisa lembrar entre execuções?
Não → Tier 1 ou 2. Sim (memória de codebase, contexto cross-PR) → Tier 3.
3️⃣ Qual o pior caso se der errado?
Comentário ruidoso → qualquer tier. Regressão mergeada ou segredo vazado → Tier 3 com Policy Server na frente de toda tool call.
No momento em que o revisor gerenciado perde algo específico. Exemplo do paper: um time de plataforma em fintech médio começou no Tier 1 e descobriu que o revisor de compliance sinalizava boilerplate já aprovado por auditores — enquanto perdia o único padrão que importava: PII não mascarada em declarações de log. Uma skill compliance-check.md de 40 linhas numa GitHub Action (Tier 2) derrubou os falso-positivos em uma semana. Tier 3 ainda não foi necessário. Regra prática: escolha o tier mais baixo que pega o que importa.
Tier 3 em escala total: review graph-native
Não um agente que observa PRs — um que entende o sistema inteiro em que os PRs vivem.
Em codebases legacy de cem milhões de linhas, carregar código como texto plano na context window fica sem espaço, e RAG padrão remove a estrutura que torna o código legível (classe pertence a arquivo, chamada de função remete a um doc de requisitos escrito há uma década). Achatar tudo em vector store = o mapa desaparece. O padrão que emergiu nas maiores modernizações: construir o agente sobre um knowledge graph — ingerir código, docs, tickets e PDFs de design em um graph database (ex.: Spanner Graph) e combinar 3 modos de retrieval:
A segunda metade é decomposição: um único agente instruído a "refatorar este módulo" falha. Dividido num pipeline de sub-agentes ADK — explorar o grafo, capturar requisitos, prever efeitos colaterais, produzir unidades atômicas de trabalho e SÓ ENTÃO codificar — o trabalho se torna gerenciável.
Figura 1 — Arquitetura Graph-Native de Code Understanding
Resumo do espectro: Managed = revisor genérico em minutos · Hybrid = SEU revisor em um dia · Custom = revisor que entende o sistema INTEIRO — ao custo de ser dono do runtime e da evaluation.
Approval fatigue: a sustentabilidade do processo
Se cada tool call pede aprovação, ninguém aprova de verdade — só clica.
Um fenômeno novo: diante de um fluxo constante de micro-aprovações (melhorar uma única linha, ajustar uma tool call), devs começam a clicar "Approve" reflexivamente. É uma forma de exaustão de baixo grau em que o time para de verificar o trabalho da máquina só para acompanhar o ritmo — e perde atenção aos detalhes. A supervisão constante não escala; os limites estruturados, sim.
🌙 Digital Quiet Hours
Limites explícitos para que requests de aprovação não vazem para noites e fins de semana. Agente que não dorme não pode significar humano que não dorme.
🤝 Agent Insight Sessions
Sessões semanais em que devs compartilham padrões identificados por suas contrapartes de IA — transformando descobertas isoladas em conhecimento organizacional compartilhado.
A resposta à fadiga não é remover guardrails — é calibrá-los: regras determinísticas e baratas (semáforos) para o óbvio, julgamento inteligente (árbitro) para o nuançado, e humanos apenas onde o risco realmente exige. É exatamente o desenho do Policy Server da seção 18.
O incidente do email: reação em cadeia
Um prompt inocente, um modo YOLO e cinquenta colegas recebendo conteúdo alucinado.
Durante uma atualização de rotina, o autor descobriu o poder — e os limites — do browser built-in do Antigravity: o recurso deixa o agente interagir com aplicações em desenvolvimento sem credenciais de login (inestimável para testes de UX). Mas em modo YOLO (auto approve), o agente pode agir mais rápido do que um humano consegue pensar. Um prompt simples para criar um botão disparou a seguinte cadeia:
O incidente destacou o risco de context hallucination: quando a IA não tem dados suficientes, ela preenche lacunas usando quaisquer strings que existam no contexto — incluindo informação sensível como endereços de email hardcoded ou URLs. Pode parecer menor se for "só um email". Mas considere o que o agente estava fazendo: cumprindo sua diretiva com os dados disponíveis, sem qualquer verificação se deveria. Esse é o risco central de sistemas autônomos.
Guardrails não são opcionais; são o que impede uma ferramenta útil de se tornar imprevisível.
Zero-Trust para agentes
Nunca confie na auto-polícia do modelo — a governança tem que ser externa e à prova de adulteração.
Conforme os limites da Agentic AI se expandem, surge um paradoxo: agentes devem ser autônomos o suficiente para resolver problemas complexos, mas não dá para arcar com o risco de ficarem "rogue" em ambiente enterprise. Imagine um agente encarregado de "resolver disputas de clientes": para ser eficaz, precisa de acesso a dados de clientes, ferramentas de email e sistemas internos — mas o desafio é garantir que não envie email acidentalmente para o banco de dados inteiro ou compartilhe código proprietário.
🚫 Auto-polícia do modelo
- LLMs são probabilísticos, não determinísticos
- Contextos transbordam; regras se perdem
- Prompt injection "convence" o agente a burlar regras
🛡️ Enforcement externo
- Políticas fora do modelo, em runtime
- Toda tool call interceptada antes de executar
- O agente não pode editar as próprias regras
Sandboxing
Ambiente de execução restrito que contém ações destrutivas (seção 15).
HITL Checkpoints
Sign-off humano para ações de alto risco (seção 16).
Policy Server
Gating estrutural + semântico antes de sistemas externos (seção 18).
Para aprofundar em proteger e avaliar agentes contra código malicioso, veja o guia do Dia 4 — Vibe Coding Agent Security and Evaluation (link na seção Companions).
Sandboxing & blast radius
Se o agente for enganado, o dano deve caber numa caixa descartável.
Além de sanitizar strings, segurança de verdade requer um ambiente de execução restrito para conter as ações do agente. Mesmo com filtragem rigorosa de output, o LLM pode gerar código sintaticamente válido mas logicamente malicioso. Executar tarefas em containers efêmeros e de baixo privilégio — isolados da rede principal e de sistemas de arquivos sensíveis — cria um "blast radius" que protege a infraestrutura central: se o agente é enganado para executar um comando destrutivo, o dano fica confinado a uma instância descartável, limpa e resetada sem consequências.
comando destrutivo → erro de permissão rígido no nível do kernel → host completamente intocado
⚙️ No Antigravity: um toggle
User Settings → habilitar "Terminal Sandboxing". Pronto: comandos do agente rodam contidos.
🐳 Para o time: sandbox portátil na nuvem
Containerize o workspace: Dockerfile customizado (ex.: .gemini/sandbox.Dockerfile) a partir da imagem oficial Gemini CLI sandbox, injete credenciais cloud limitadas e force o modo com export GEMINI_SANDBOX=docker.
Human-in-the-loop & testes
Automação é o objetivo — mas operações de alto risco exigem um humano no checkpoint.
Embora automação seja o objetivo, operações de alto risco exigem protocolo Human-in-the-Loop (HITL) como fail-safe final: checkpoint gates para ações que atendem a um perfil de risco específico. Apresentar a intenção sanitizada do agente a um supervisor humano para sign-off manual balanceia a velocidade da IA com o julgamento nuançado do dev — e garante que a responsabilidade final pela integridade arquitetural permaneça em mãos humanas.
Deploy para produção
Código gerado por IA só sobe com sign-off explícito.
Mudança de database schema
Migrações são irreversíveis demais para auto-approve.
Transações financeiras
Nenhum agente inicia movimentação de dinheiro sozinho.
O surto de testes gerados por IA
O surto de código gerado por IA empurra o processo de testes manuais para cobertura de testes gerada por IA — e aqui a IA tem vantagem estrutural: como implementação não é mais o gargalo, ela pode escrever cobertura de testes mais abrangente que qualquer humano no mesmo tempo, de forma programática e poderosa. Em ambiente high-velocity, test-driven development vira realidade: a máquina escreve os próprios testes que validam seu output.
O processo força o agente a produzir um teste unitário que falha ou um comando de reprodução (como um request curl) antes de tentar qualquer correção. Embutir esses testes no codebase significa que toda iteração rápida é respaldada por uma suite verificável — bugs não voltam, e revisores humanos podem confiar no "sinal verde" automatizado para integração.
Evaluation contínua
Testes tradicionais são insuficientes quando o output é GERADO, não COMPUTADO.
Por que checagem de qualidade especial para sistemas dirigidos por ML? Porque testes de software tradicionais são insuficientes para sistemas cujo output é gerado em vez de computado. Um agente (ou qualquer componente dirigido por ML — classificador, sumarizador, retriever) pode passar em 100 testes unitários de suas ferramentas e ainda falhar espetacularmente escolhendo a ferramenta errada, parafraseando uma resposta crítica ou alucinando um fato. A margem de erro não é defeito a eliminar — é propriedade inerente do modelo, e a estratégia de testes deve acomodá-la.
🧪 Teste unitário
- Resposta binária: passa ou falha
- Pega regressões determinísticas
- Assert vira → gate dispara
📊 Evaluation
- Score 0–5 de LLM-as-judge (scorecard)
- Verificação de trajetória que tolera variância de ordem em tool calls
- Gate dispara quando a qualidade cai abaixo de margem configurável — não quando uma asserção vira
Testes pegam regressões determinísticas; evaluation pega behavioural drift.
O Policy Server
Duas camadas de gating interceptam toda ação antes de atingir sistemas externos.
O exemplo central de guardrail do paper é o Hybrid Policy Server: um middleware que intercepta ações antes de atingirem sistemas externos, operando em duas camadas complementares.
Structural Gating — os semáforos
- Regras determinísticas baseadas em roles e ambientes
- Checks binários: role
viewernão pode usarsend_email - Previne violações arquiteturais SEM perguntar a um LLM
Semantic Gating — o árbitro inteligente
- LLM secundário especializado (Gemini) inspeciona intenção e conteúdo contra políticas em linguagem natural
- Para quando a tool é PERMITIDA, mas a FORMA viola política: admin pode usar
send_email, mas não com PII não mascarada - É aqui que regras estruturais falham — não dá para fazer regex de todo vazamento possível de PII
environments: localhost: blocked_tools: - send_email roles: viewer: allowed_tools: - list_files - read_file
def is_tool_allowed(self, tool_name): # 1) Environment blocks if tool_name in env_blocked: return False # 2) Role permissions return "*" in role_allows or \ tool_name in role_allows def 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")
🎛️ Simule o Policy Server
Quando o agente decide usar uma tool, o fluxo é interceptado: structural check (tool permitida para este role/env?) → semantic check (os argumentos são seguros?) → execution (se ambos passarem) ou mensagem "Policy Violation" devolvida ao agente para auto-correção ou falha graciosa. Escolha um cenário:
O Policy Server cria uma rede de segurança que separa lógica de execução de lógica de governança — a separação crítica de concerns do software enterprise. O agente executa; o servidor decide o que pode ser executado.
Context hygiene & o Context Resolver
O agente nunca deve ver PII real — só placeholders resolvidos na última milha.
Um perigo significativo do desenvolvimento autônomo é a Context Hallucination: sem dados específicos, o agente preenche lacunas com quaisquer strings disponíveis no contexto — potencialmente vazando endereços de email hardcoded ou URLs privadas. A mitigação é Context Hygiene rigorosa via middleware: PII masking e placeholder injection, para que o agente opere sempre com dados esterilizados. E todos os outputs do agente devem ser sanitizados contra prompt injection e interações de UI rogue — o "vibe" da máquina nunca pode virar vulnerabilidade arquitetural.
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 state if 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 validadas if var_name in os.environ: return os.environ[var_name] # 3) Deixa não resolvido — sem falhas silenciosas return 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 i for i in v] else: resolved_args[k] = v args.clear(); args.update(resolved_args) # intercepta TODA tool call ANTES de rodar
Com o middleware conectado diretamente ao pipeline de execução, qualquer tentativa do agente de executar uma ação — enviar email, consultar uma apresentação na nuvem — é interceptada. O engine traduz placeholders como [[COMMENTER_EMAIL]] ou [[DEFAULT_PRESENTATION_ID]] em assets de teste autorizados, de forma segura e silenciosa — eliminando PII hardcoded de test suites e system prompts.
Resumo & onde começar
O gargalo mudou de lugar — e o blueprint inteiro se resume em três comandos.
Em menos de um ano, os ciclos de desenvolvimento ficaram dramaticamente mais rápidos. Mas a velocidade revelou a mudança importante: a IA eliminou o gargalo de produção de código e moveu a restrição downstream — para os humanos que devem revisar, testar e integrar esse output. Isso é carga cognitiva compartilhada: humanos agem como arquitetos (Test Specs, Integration Specs, blueprints de MLOps/DevOps), enquanto a IA cuida do trabalho pesado (código de teste real, integrações, detalhes operacionais granulares).
🏭 Gargalo antigo: produção
Escrever código era o difícil. A IA resolveu isso — mil linhas antes do almoço.
🧭 Gargalo novo: integração
Verificar, integrar e entregar. Melhores prompts e modelos mais rápidos, sozinhos, não consertam isso.
O sucesso depende de evoluir dinâmicas de time, refinar a colaboração com agentes e definir limites estritos para ferramentas que nunca dormem. O desafio mudou de mera produção de código para orquestrar sistemas que verificam, integram e entregam trabalho.
🚀 Os padrões viram comandos que você roda hoje
# geração de projeto spec-driven agents-cli scaffold # gate de cobertura de testes gerada por IA agents-cli eval run # deployment com sandbox para Cloud Run ou Vertex AI Agent Engine agents-cli deploy
Vibes prototipam. Specs entregam.
Quiz: você sobrevive à produção?
Oito perguntas cobrindo o paper inteiro — das specs ao zero-trust.
Cheatsheets copiáveis
Três artefatos prontos para colar no seu repositório.
# 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 min database_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.0 sqlalchemy==2.0.36 ## 4. Scenarios (Gherkin — vira teste) Scenario: Cartão recusado, nova tentativa automática Given um pedido "#8842" com pagamento "recusado" When o webhook "payment.retried" é recebido Then o sistema agenda nova tentativa em 30 minutos ## 5. Out of scope O que NÃO construir — evita alucinação de features.
# Gherkin — State → Action → Outcome Feature: Nome do comportamento (perspectiva do usuário) Scenario: Caminho feliz Given [STATE] um estado inicial verificável And [STATE] condições adicionais When [ACTION] o evento/ação que dispara o comportamento Then [OUTCOME] o resultado observável esperado And [OUTCOME] efeitos colaterais verificáveis Scenario: Edge case — rede falha Given um pedido pendente When a gateway retorna timeout Then o sistema agenda retry e notifica o cliente Regras 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 adoção
Marque o que seu time já pratica — o progresso fica salvo no navegador.
📐Adotar SDD
🛡️Montar a rede de segurança
🔄Escalar review & cultura
Glossário
O vocabulário mínimo para navegar o paper.
Guias companions
A série completa — do novo SDLC à segurança e evaluation de agentes.
Hub da série — todos os dias
O índice navegable de todos os guias de estudo da série de whitepapers.
The New SDLC with Vibe Coding
Como o ciclo de vida de desenvolvimento mudou com agentes — a base sobre a qual este guia constrói.
Agent Tools & Interoperability
Os 5 protocolos abertos que conectam agentes a ferramentas e entre si.
Context Engineering: Sessions, Memory & Skills
O complemento direto da seção de context hygiene: como sessions, memória e skills alimentam o agente.
Vibe Coding Agent Security and Evaluation
Referenciado explicitamente neste paper: proteger e avaliar agentes contra código malicioso em profundidade.
Referências
As 17 endnotes do paper + a citação 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, maio de 2026.