ACCEPTANCE CRITERIA (37/37)
☑ Adicionar `<script>` inline no HTML que calcula CSS custom properties baseadas em `new Date()`
☑ Propriedades emitidas no `document.body` a cada 30s (setInterval 30000ms):
☑ Manter classes `is-dawn / is-day / is-dusk / is-night` no `<body>` como fallback para CSS que depende delas (TV glow, balão, estrelas — features Sprint 2-3 preservadas)
☑ Elementos CSS que consomem as vars: `.sun` usa `--sun-position` para `left`, `.sky` usa `--sky-progress` para brilho
☑ `transition: all 30s linear` nos elementos que consomem as vars (transição suave, não snap)
☑ Fallback: se JS desabilitado, usa hora do sync (comportamento atual mantido)
☑ `prefers-reduced-motion`: interval continua rodando (é lógico, não visual), mas `transition` nos elementos é `none`
☑ Adicionar `analyzeCommitWeather(commits)` em `sync.js` que retorna um `weatherMode`:
☑ `weatherMode` emitido como atributo `data-weather` no `<body>` do HTML gerado
☑ CSS responde ao atributo:
☑ Classificação baseada apenas em `commits[].message` — fonte real de `getCommits()`, zero invenção
☑ `prefers-reduced-motion`: `data-weather` é aplicado (lógico), sem transições CSS de entrada
☑ Squad `high` activity (8+ commits): prédio recebe `data-mode="focused"` no HTML
☑ Squad `low` activity (0–2 commits): prédio recebe `data-mode="relaxed"` no HTML
☑ Squad `mid` (3–7): sem `data-mode` (comportamento padrão)
☑ Novos `@keyframes` para modo relaxed:
☑ CSS aplica os novos keyframes no modo relaxed:
☑ CSS aplica speed no modo focused:
☑ Aria (`agent-thinking`) SEMPRE relaxed, ignorando `data-mode` do squad
☑ `prefers-reduced-motion`: `data-mode` é emitido (lógico), mas CSS não muda `animation-duration`
☑ `getRecentDoneStories(stories)` em sync.js: filtra stories onde `status === 'Done'` e última modificação ≤ 7 dias
☑ Para cada story Done recente: emitir HTML de celebração sobre o prédio do squad correspondente
☑ Celebração principal no prédio (`@keyframes story-burst`):
☑ **Eco em cascata** via `animation-delay`:
☑ Apenas 1 celebração ativa por prédio (CSS: `animation-fill-mode: forwards` impede loop)
☑ `prefers-reduced-motion`: nenhum sparkle, nenhum eco, nenhuma cascata é renderizada
☑ Em sync.js: identificar 3 squads mais ativos por `recentCommits` (excluindo o próprio HQ)
☑ `generateDedicatedBuilding()` para HQ recebe `ecosystemData: { top3: Squad[], totalCommits: number, sprintCount: number }`
☑ **Janelas do andar comando** (2º andar do HQ): 3 janelas coloridas com `background: SQUAD_STYLES[squad.style].accent` dos 3 squads mais ativos
☑ **Antena do HQ**: `animation-duration` inversamente proporcional a `totalCommits`:
☑ **Andaimes progressivos** baseados em `sprintCount` (stories `story-6.2.x` com status Done):
☑ `node squads/hq/scripts/sync.js` gera sem erros (stderr vazio ou apenas warnings aceitáveis)
☑ Todos os features Sprint 1+2+3+4 continuam funcionando:
☑ `prefers-reduced-motion` cobre todos os novos elementos de AC1–AC5
☑ HTML gerado não aumenta mais que 20% em tamanho em relação ao Sprint 4 baseline
☑ Score audit-visual Lux pós-Sprint 5: >= 8.8/10 (meta 9.0)
☑ 10-minute test: pelo menos 5 elementos novos detectáveis após 5 minutos de observação