Runbooks de diagnóstico para problemas operacionais conhecidos.
- Score desaparece ao finalizar lição
- Streak some quando o status muda para FINISHED
- Status "pisca" entre HIT/WAITING rapidamente
- Status mostra WAITING depois de já ter mostrado FINISHED
// O score deve permanecer visível mesmo se updateHud for chamado sem scoreTotal
// Verificar src/viewer/ui-service.ts — campos scoreShown, streakShown, isTerminalProcurar em src/viewer/index.tsx por chamadas ui.updateHud({ ... status: "FINISHED" }) que omitem scoreTotal e streak. Essas chamadas não devem esconder os valores.
// Após FINISHED, qualquer updateHud com outro status (exceto RESET) deve ser ignorado
// Testar no console: observer o HUD-status não mudar após FINISHEDUIServiceimplementa sticky visibility + status terminal lock- Testes:
hud-score-visibility-regression.test.ts,hud-status-priority-regression.test.ts,hud-streak-combo-regression.test.ts
Runbooks de diagnóstico para problemas operacionais conhecidos.
- Catálogo não carrega (lista vazia)
- Console mostra
Failed to fetchouCORS error - Network mostra OPTIONS → 400/403
- Requisições não aparecem no DevTools (preflight bloqueado)
# No console do browser:
# Verificar se as chamadas vão para o proxy (não direto para api.devoltecomele.com)
# Network tab → filtrar por "api-proxy" ou "functions/v1"- Acessar logs da Edge Function
api-proxyno Lovable Cloud - Procurar por:
[api-proxy] GET /v1/catalog— confirma que a requisição chegou - Se não aparecer: o preflight pode estar falhando antes da função
// No console do browser:
// Verificar se há token disponível
localStorage.getItem('sb-tcpbogzrawoiyjjbxiiw-auth-token') !== null- Se
401: token expirado ou inválido → app fazclearAuthStorage() + reload() - Se
502: proxy não conseguiu alcançar o backend - Se
200mas dados vazios: backend retornou{ chapters: [] }
| Sintoma | Causa provável | Solução |
|---|---|---|
| CORS error no preview | Chamada direta ao backend (não via proxy) | Verificar se proxyFetch está sendo usado |
| 401 no catalog | Token expirado | Fazer logout e login novamente |
| 502 no proxy | Backend api.devoltecomele.com offline |
Verificar status do backend |
| Lista vazia sem erro | Backend retornou catalog vazio | Verificar dados no backend |
| Chamada duplicada | CatalogService sem dedup |
Já tem guard de loading + loadPromise |
Browser → OPTIONS /functions/v1/api-proxy/v1/catalog → 200 (CORS preflight)
Browser → GET /functions/v1/api-proxy/v1/catalog → 200 (catalog data)
Runbooks de diagnóstico para problemas operacionais conhecidos.
- Ativei
showStepQualityFeedbacke/ouuseStepQualityStreakmas nenhum feedback visual aparece. - Nenhum badge (Perfeito/Ótimo/Boa/Recuperou) aparece após completar um step.
- Nenhum feedback de nota (✓, ✗, ♪ x/y) aparece durante a prática.
- Console não mostra logs de Step Quality.
Lição é V1 — Step Quality só funciona em V2Atualizado 2026-04-08: Note feedback (✓/✗) funciona em V1. Quality badge permanece V2-only.- Modo é FILM — Step Quality só funciona em WAIT
- Flag
showStepQualityFeedbacknão está ativa - Flag
useStepQualityStreaknão está ativa (necessária apenas para quality badge) - Elemento DOM (
#hud-quality-badge,#judge-feedback) não existe no HTML - Controller não foi instanciado (regressão no boot de index.tsx)
featureFlagSnapshotnão está sendo atualizado (regressão no subscribe)
window.__flags.snapshot()
// Esperado: { showStepQualityFeedback: true, useStepQualityStreak: true, ... }document.getElementById('hud-quality-badge') // Deve retornar HTMLElement
document.getElementById('judge-feedback') // Deve retornar HTMLElement[v2:polyphonic] lesson loaded→ V2 (badge + note feedback)- Sem esse log → V1 (apenas note feedback ✓/✗)
O modo deve ser WAIT. FILM usa streak legado.
| Resultado | Diagnóstico |
|---|---|
Flags estão false |
Ative manualmente via window.__flags.set(...) |
Flags true mas DOM null |
Problema de HTML/template |
Flags true, DOM existe, sem feedback |
Problema de guard (FILM, engine null) |
| V1 sem badge mas com ✓/✗ | Comportamento correto — badge é V2-only |
- Ativar
showStepQualityFeedback— sem reload - Ativar
useStepQualityStreak— sem reload - Lição V2 WAIT: nota errada → ✗, acorde completo → ✓ + badge
- Lição V1 WAIT: nota errada → ✗, nota correta → ✓, sem badge
- Repetir nota já tocada → flash sutil de duplicata
- Alternar qualquer flag no painel de debug causa re-render visível da partitura.
O subscriber de featureFlags.subscribe() chamava rebuildSheetMappings() incondicionalmente quando showSheetMusic era true, mesmo para flags não relacionadas.
O subscriber compara prevFlagSnapshot vs next e só reconstrói quando showSheetMusic ou showFallingNotes mudam.
flag-toggle-sheet-flicker-regression.test.ts— 7 testes