ACCEPTANCE CRITERIA (12/13)
☑ Script `squads/traffic-ads/scripts/collect-metrics.js` criado
☑ Lê credenciais exclusivamente de `.env` via `process.env.META_*` (nunca hardcoded)
☑ Faz GET `/act_{ad_account_id}/insights` na Meta Graph API v19+
☑ Salva resultado em `squads/traffic-ads/data/metrics-YYYY-MM-DD.json`
☑ Campos coletados: `impressions`, `clicks`, `spend`, `cpc`, `cpm`, `ctr`, `actions` (conversões), `purchase_roas`
☑ Suporta filtro por `date_range` (default: hoje, formato `YYYY-MM-DD`)
☐ Suporta filtro por `campaign_id` (default: todas as campanhas ativas)
☑ Error handling com mensagens descritivas (ex: "Token expirado", "Ad account inválido")
☑ Dry-run mode via flag `--dry-run` que simula sem chamar a API real
☑ Testes unitários com mock da API em `squads/traffic-ads/tests/collect-metrics.test.js`
☑ @cyber-chief security review PASS
☑ Nenhum token ou credencial logada em `console.log` ou arquivos de saída
☑ Access token não aparece em stack traces ou mensagens de erro
TIMELINE
01/04/2026
chore: session cleanup — 10 stories Done, security+QA gates, MCC setup, V4 audit [Stories 6.3, 7.2, 9.9, 9.10, 9.11, 9.12, 19.4, 20.1, 20.2, 21.3]
550daa2
31/03/2026
feat: Epic 18 — Traffic Ads infrastructure, scripts, agents, 1a campanha WhatsApp [Epic 18] [Story 6.1-sales-intelligence-bot]
9bd5473