{
  "id": "ai-forgets-env-validation",
  "type": "failures",
  "category": "failures",
  "locale": "pt",
  "url": "/pt/failures/ai-forgets-env-validation",
  "title": "Como Corrigir o Esquecimento de Validação de Variáveis de Ambiente pela IA",
  "description": "Agentes de IA leem valores de process.env diretamente sem validação, causando bugs silenciosos de undefined e erros de inicialização ausentes quando variáveis de ambiente estão faltando.",
  "tools": [
    "Cursor",
    "Claude Code",
    "Codex",
    "Windsurf"
  ],
  "stack": [
    "Next.js",
    "TypeScript",
    "Cloudflare"
  ],
  "tags": [
    "security",
    "typescript",
    "cloudflare"
  ],
  "difficulty": null,
  "updated": "2026-06-08",
  "markdown": "O agente acessa `process.env.SOME_KEY` diretamente, então quando a variável está ausente, o aplicativo inicia silenciosamente quebrado — sem falha, sem aviso, apenas `undefined` fluindo pela lógica de negócios.\n\n## O sintoma\n\nLeituras brutas de `process.env` espalhadas pela base de código sem esquema, sem segurança de tipo e sem asserção de inicialização.\n\n```ts\n// lib/stripe.ts — WRONG\nimport Stripe from \"stripe\";\n\nexport const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {\n  apiVersion: \"2024-06-20\",\n});\n// If STRIPE_SECRET_KEY is undefined, Stripe SDK accepts it and every\n// charge silently fails at runtime instead of at startup.\n```\n\n## Por que acontece\n\nO agente otimiza para brevidade e para alcançar código funcional rapidamente. A validação de variáveis de ambiente é um boilerplate que não aparece na maioria dos exemplos de treinamento, então o modelo a ignora e vai direto para a integração.\n\n## Como identificar\n\n- `process.env.FOO` usado sem uma asserção não nula ou verificação de fallback.\n- Nenhum arquivo de validação `env.ts` / `env.mjs` no projeto.\n- O tipo TypeScript de um valor de ambiente é `string | undefined` no local da chamada.\n- O aplicativo inicia sem erro mesmo quando `.env.local` está vazio.\n\n## Como corrigir\n\nValide todas as variáveis de ambiente necessárias na inicialização usando um esquema Zod para que o processo falhe com uma mensagem clara antes de servir uma única requisição.\n\n```ts\n// lib/env.ts — CORRECT\nimport { z } from \"zod\";\n\nconst envSchema = z.object({\n  STRIPE_SECRET_KEY: z.string().min(1),\n  DATABASE_URL: z.string().url(),\n  NEXTAUTH_SECRET: z.string().min(32),\n  NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\n});\n\nexport const env = envSchema.parse(process.env);\n//                             ^^^^^ throws at startup if any var is missing\n```\n\n```ts\n// lib/stripe.ts — CORRECT (import validated env)\nimport Stripe from \"stripe\";\nimport { env } from \"@/lib/env\";\n\nexport const stripe = new Stripe(env.STRIPE_SECRET_KEY, {\n  apiVersion: \"2024-06-20\",\n});\n```\n\n```txt\n[ ] Create lib/env.ts with a Zod schema covering every required variable\n[ ] Import env from lib/env everywhere — never use process.env directly\n[ ] Add lib/env.ts to the module graph so it runs at server startup (import in next.config.ts)\n[ ] Document all variables in .env.example with placeholder values\n[ ] Use z.string().url() / z.string().min(n) for format constraints, not just presence\n```\n\n## Prompt de Correção\n\n```txt title=\"Fix Prompt\"\nEvery raw process.env access in this file is unvalidated. Create a lib/env.ts\nmodule that parses and validates all required environment variables with Zod at\nstartup. Replace every process.env.FOO reference in the codebase with the\ntyped env.FOO import. Add a .env.example file listing every variable with a\nplaceholder value and comment.\n```\n\n## Teste\n\n```bash\n# Find any remaining raw process.env reads outside of lib/env.ts\ngrep -rn \"process\\.env\\.\" --include=\"*.ts\" --include=\"*.tsx\" . \\\n  | grep -v \"lib/env.ts\" \\\n  | grep -v \"next.config\" \\\n  | grep -v \"node_modules\" \\\n  && echo \"FAIL: raw process.env reads found\" || echo \"OK\"\n```"
}