← story.propek
STORY 6.2.5
Emergência
Epic: HQ Dashboard Evolution
PENDING
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
ARQUIVOS (4)
squads/hq/scripts/sync.js MODIFICADO — todas as mudanças aqui
squads/hq/output/hq.html GERADO — executar `node squads/hq/scripts/sync.js`
squads/hq/agents/MEMORY-vigil-visual.md ATUALIZAR (score pós-sprint)
squads/hq/agents/MEMORY-vigil-dev.md ATUALIZAR (benchmarks + HTML size)