ACCEPTANCE CRITERIA (23/23)
☑ Script `squads/traffic-ads/scripts/create-campaign.js` criado
☑ Zero dependências externas (Node.js stdlib only — padrão Epic 18/20)
☑ Cria campanha com objetivo `OUTCOME_ENGAGEMENT` (Click-to-WhatsApp — per @architect contract)
☑ Nome da campanha gerado automaticamente: `{produto}_{data}_{objetivo}` (ex: `ProPreto_2026-03-30_WA`)
☑ Status inicial: `PAUSED` (não ativa automaticamente — requer aprovação manual)
☑ Cria ad set com targeting: broad audience, idades 22-55, Brasil
☑ Ativa Advantage+ Audience se disponível na API
☑ Define budget diário recebido via configuração JSON
☑ Bid strategy: `LOWEST_COST_WITHOUT_CAP` (padrão Advantage+)
☑ Cria ads com criativos fornecidos (imagem ou video + copy)
☑ Aceita múltiplos criativos (max 5) para teste A/B
☑ Link do ad aponta para WhatsApp Business (`wa.me/55{numero}`)
☑ Script aceita arquivo de configuração `--config caminho/para/config.json`
☑ Schema da configuração documentado em `squads/traffic-ads/data/contracts/create-campaign-schema.md`
☑ Campos obrigatórios: `produto`, `budget_diario`, `criativos[]`, `copy`
☑ Flag `--dry-run` mostra o payload JSON que seria enviado à API sem criar nada
☑ Dry-run valida o schema da configuração e reporta erros
☑ Testes com mock da API Meta em `squads/traffic-ads/tests/create-campaign.test.js`
☑ Cobrir: criação bem-sucedida, dry-run, erro de API, configuração inválida
☑ @cyber-chief security review PASS (2026-03-31, Score 92/100, 0 CRITICAL/HIGH)
☑ Access token lido exclusivamente de `.env` (nunca hardcoded)
☑ Resposta da API (com IDs de campanhas) logada apenas em modo verbose
☑ Credentials não aparecem em stack traces ou logs de erro