# Como Corrigir o Esquecimento de Validação de Variáveis de Ambiente pela IA

> 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.

**Type:** Failure  
**Tools:** Cursor, Claude Code, Codex, Windsurf  
**Stack:** Next.js, TypeScript, Cloudflare  
**Updated:** 2026-06-08

---

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.

## O sintoma

Leituras brutas de `process.env` espalhadas pela base de código sem esquema, sem segurança de tipo e sem asserção de inicialização.

```ts
// lib/stripe.ts — WRONG
import Stripe from "stripe";

export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
  apiVersion: "2024-06-20",
});
// If STRIPE_SECRET_KEY is undefined, Stripe SDK accepts it and every
// charge silently fails at runtime instead of at startup.
```

## Por que acontece

O 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.

## Como identificar

- `process.env.FOO` usado sem uma asserção não nula ou verificação de fallback.
- Nenhum arquivo de validação `env.ts` / `env.mjs` no projeto.
- O tipo TypeScript de um valor de ambiente é `string | undefined` no local da chamada.
- O aplicativo inicia sem erro mesmo quando `.env.local` está vazio.

## Como corrigir

Valide 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.

```ts
// lib/env.ts — CORRECT
import { z } from "zod";

const envSchema = z.object({
  STRIPE_SECRET_KEY: z.string().min(1),
  DATABASE_URL: z.string().url(),
  NEXTAUTH_SECRET: z.string().min(32),
  NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
});

export const env = envSchema.parse(process.env);
//                             ^^^^^ throws at startup if any var is missing
```

```ts
// lib/stripe.ts — CORRECT (import validated env)
import Stripe from "stripe";
import { env } from "@/lib/env";

export const stripe = new Stripe(env.STRIPE_SECRET_KEY, {
  apiVersion: "2024-06-20",
});
```

```txt
[ ] Create lib/env.ts with a Zod schema covering every required variable
[ ] Import env from lib/env everywhere — never use process.env directly
[ ] Add lib/env.ts to the module graph so it runs at server startup (import in next.config.ts)
[ ] Document all variables in .env.example with placeholder values
[ ] Use z.string().url() / z.string().min(n) for format constraints, not just presence
```

## Prompt de Correção

```txt title="Fix Prompt"
Every raw process.env access in this file is unvalidated. Create a lib/env.ts
module that parses and validates all required environment variables with Zod at
startup. Replace every process.env.FOO reference in the codebase with the
typed env.FOO import. Add a .env.example file listing every variable with a
placeholder value and comment.
```

## Teste

```bash
# Find any remaining raw process.env reads outside of lib/env.ts
grep -rn "process\.env\." --include="*.ts" --include="*.tsx" . \
  | grep -v "lib/env.ts" \
  | grep -v "next.config" \
  | grep -v "node_modules" \
  && echo "FAIL: raw process.env reads found" || echo "OK"
```