← story.propek
STORY 20.2
optimization-state.json com Cooldowns e Histórico
PENDING
ACCEPTANCE CRITERIA (18/18)
Arquivo `squads/traffic-ads/data/optimization-state.json` é criado na primeira execução se não existir
Arquivo é atualizado a cada execução do `optimize-campaign.js`
Backup automático (`optimization-state.bak.json`) criado antes de cada atualização
`lastBudgetAdjustments`: objeto `{adSetId: {date, amount, cooldownUntil}}`
`pausedCreatives`: array de `{creativeId, pausedAt, reason}`
`winners`: array de `{creativeId, markedAt, reason}` — criativos vencedores (Ice Cream Strategy)
`budgetHistory`: array de `{adSetId, date, previousBudget, newBudget, reason}` (últimos 30 registros)
Cooldown de 3 dias entre ajustes de budget no mesmo ad set
Script verifica `cooldownUntil` antes de qualquer ajuste de budget
Se em cooldown: loga motivo, pula o ajuste para aquele ad set (não falha)
Criativo marcado como `winner` NUNCA é pausado pelo script automático
Antes de pausar qualquer criativo, verificar se está em `winners`
Se estiver em `winners`: loga aviso e pula a pausa
Testes unitários para lógica de cooldown (`isInCooldown`, `updateCooldown`)
Testes para proteção de vencedores (`isWinner`, `canPause`)
Testes para criação do arquivo de estado quando não existe
Testes para rotação de backup
Testes em `squads/traffic-ads/tests/optimization-state.test.js`
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 20 — Traffic Manager Autonomo, 7 stories, 393+ testes, 4 security gates [Epic 20] [Story 6.1-sales-intelligence-bot]
7a8b92d
ARQUIVOS (3)
squads/traffic-ads/scripts/optimization-state.js CREATED
squads/traffic-ads/scripts/optimize-campaign.js MODIFIED
squads/traffic-ads/tests/optimization-state.test.js CREATED