# FightRate Insights Científicos — Mini-spec ## Objetivo Implementar uma nova visualização de cálculos e insights na aba `Insights`, usando métricas derivadas do relatório científico `docs/research/bpm-indicators-fightrate-2026-06-10.md`, sem inventar dados e sem abandonar o design Corner Instrument. ## Escopo ### Incluir agora - Grade/tabela compacta de métricas com melhor aproveitamento vertical. - Cálculos com dados reais já disponíveis: - FC atual, média, mínima e máxima; - duração observada e contagem de amostras; - amplitude de BPM; - desvio padrão de BPM; - coeficiente de variação de BPM; - classificação operacional de estabilidade/oscilação; - tempo em zonas já calculadas; - carga observada existente; - tendência de deriva de FC quando a janela for longa o suficiente; - recuperação pós-janela quando houver amostras contínuas após o fim da sessão; - status de HRV/VFC baseado na presença de `rrIntervalsMs`. - Estados honestos para métricas que exigem perfil ou RR intervals. ### Não incluir agora - Cadastro de perfil do atleta. - Diagnóstico médico. - LF/HF, frequência espectral, SampEn ou DFA reais sem pipeline de RR validado. - Mudanças amplas de design fora de `Insights`. - Novas dependências. ## Arquitetura - Reutilizar `src/training/trainingMetrics.ts` para cálculos puros. - Estender `src/training/trainingTypes.ts` com tipos de resumo de insights. - Atualizar `src/screens/InsightsScreen.tsx` para renderizar uma tabela/grade de instrumentos, não lista simples. - Atualizar `src/app/FightRateApp.tsx` para passar `getContinuousSamples` ao Insights, permitindo cálculo de recuperação pós-janela com dados persistidos. - Testar cálculos puros em `__tests__/trainingMetrics.test.ts`. ## Critérios de sucesso - Insights usa somente amostras reais ou mostra estado indisponível. - Visual evita cards genéricos; usa trilhos, linhas tabulares, separadores e linguagem Corner Instrument. - Métricas BPM-only aparecem com valor/unidade/status/leitura curta. - HRV/VFC aparece como disponível somente quando existirem RR intervals; caso contrário, informa que requer RR. - Recuperação pós-janela só aparece quando há amostras depois de `endedAt`. - Typecheck, lint e testes passam. - Build release Android é gerado e enviado ao Telegram ao final. ## Reuso vs criação ### Reutilizar - `calculateLiveMetrics`, `calculateZones`, `formatDuration` em `trainingMetrics.ts`. - `HeartRateSample`, `CompletedTrainingSession` em `trainingTypes.ts`. - Tokens existentes em `src/theme`. - Fluxo nativo `getContinuousSamples` já exposto pelo hook. ### Criar/alterar - Criar funções puras em `trainingMetrics.ts`: - `buildInsightDashboard()`; - `calculateBpmVariability()`; - `calculateHeartRateDrift()`; - `calculatePostSessionRecovery()`; - `summarizeRrAvailability()`. - Criar tipos em `trainingTypes.ts`: - `InsightMetricStatus`; - `InsightMetricRow`; - `InsightDashboard`. - Reescrever o layout interno de `InsightsScreen.tsx` para matriz tabular. ## Plano de execução 1. Escrever testes para cálculos puros. 2. Implementar funções puras em `trainingMetrics.ts`. 3. Passar `getContinuousSamples` para `InsightsScreen` e carregar amostras persistidas de forma segura. 4. Recriar UI da aba Insights com tabela compacta e blocos de instrumentos. 5. Rodar validação completa.