You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
brake_too_early — detecta frenagem ≥ 15m antes da referência com pressão similar (≤ 115% da referência). Distinto de overbrake_overslow pelo timing, não pela intensidade.
wheelspin_at_exit — detecta throttle excessivo com esterco > 25% do maxSteering no pickup, resultando em perda de delta na saída apesar do acelerador aberto.
high_steering_at_throttle — detecta esterco elevado (|steering| > 0.28, diferença > 0.12 vs ref) no momento do pickup de throttle. Sinal confirmatório de early apex sem posição GPS.
inconsistent_braking_point — detecta variância do ponto de frenagem ≥ 15m (desvio padrão) entre as últimas 3+ voltas limpas. Requer lapBrakeHistory no AnalyzeInput.
steering_correction_at_exit — detecta ≥ 2 reversões de esterco com amplitude > 15% na fase de saída durante aceleração. Suprimido quando carry-over explica a curva.
LapBrakeHistory — novo tipo exportado por driving-technique-analyzer.ts para acumular histórico de pontos de frenagem por curva entre voltas.
Regras completas de cada novo erro em docs/business-rules.md (seção "Erros de Técnica — 0.6.0").
13 novos testes em driving-technique-errors-0.6.0.test.ts cobrindo caso positivo, falso positivo e edge cases de cada erro.
Added (F1.2 — Filtro de Ruído de Telemetria)
telemetry-noise-filter.ts — novo módulo com dois mecanismos de filtragem de telemetria raw do iRacing:
Detector de spike: descarta amostras isoladas que desviam > 40% de ambos os vizinhos em throttle, freio ou esterco. Registra no debug log com [noise-filter].
Smoothing adaptativo por canal: média móvel centrada com janelas calibradas — throttle (3 amostras), freio (3 amostras), esterco (5 amostras). Canais de posição e velocidade não são alterados.
TECHNIQUE_THRESHOLDS.MIN_CONFIDENCE_TO_SPEAK: 0.55 — threshold separado de MIN_CONFIDENCE_TO_BLOCK_POINT_FEEDBACK (0.70). Issues com confiança < 0.55 são suprimidos com debug log [noise-filter] em vez de gerar voz.
6 novos testes em telemetry-noise-filter.test.ts: spike no throttle, spike no freio, ramp normal inalterada, smoothing de esterco, canais de velocidade/posição preservados, retorno inalterado com < 3 pontos.
Changed
LiveLapBuffer.flush() aplica applyTelemetryNoiseFilter após integratePosition, garantindo que apenas telemetria raw do iRacing seja filtrada (referências importadas não são afetadas).
analyzeDrivingTechniqueIssues agora usa MIN_CONFIDENCE_TO_SPEAK (0.55) como threshold mínimo para atribuir drivingTechniqueIssue, com log de debug quando suprimido.
F1.2.4 — Supressão por setor comprometido: issues com confiança < 0.75 são suprimidos quando carryOverFromCornerId está presente (COMPROMISED_SECTOR_MIN_CONFIDENCE: 0.75). Issues de carry-over de segunda ordem (N-2 → N-1 → N) exigem confiança ≥ 0.82 (SECOND_ORDER_CARRYOVER_MIN_CONFIDENCE).
F1.3.1 — Contexto multi-volta: novo tipo LapCornerHistory (Map cornerId → CornerLapMetrics) em AnalyzeInput. Detectores de throttle_feathering, throttle_partial_too_long, throttle_late_belly e excessive_coast_transition calibram seus thresholds contra o baseline histórico do piloto quando disponível.
F1.3.2 — consistencyScore: campo consistencyScore?: number (0–1) adicionado a DrivingTechniqueAnalysis. Calculado como z-score normalizado comparando o lap atual com o histórico de coast, partial throttle e lift count do piloto.
F1.3.3 — Carry-over de segunda ordem: o loop principal detecta quando o corner anterior no enriched[] também tinha carryOverFromCornerId, requerendo limiar mais alto (0.82) para acusar a curva atual.
F1.3.4 — Peso dinâmico por tipo de curva: chooseBestCandidate aplica multiplicadores de confiança para seleção (sem alterar o valor reportado) — hairpin (+15% em brake/coast issues), fast sweeper (+15% em trail braking), chicane (+10% em steering correction/early turn-in).
F1.4.1 — Causa raiz: frases para os 5 novos erros de F1.1 adicionadas em todos os 4 locais (pt-BR, en-US, es-ES, fr-FR). Todas focam no QUE fazer, não no sintoma.
F1.4.2 — Gradação por severidade: issueToMessageKey agora retorna _light (severity=low) ou _severe (severity=high) em vez de sempre a chave base. 28 novas chaves de voz por locale (14 erros × 2 variantes). Chaves de repetição continuam usando a chave base para lookup.
F1.4.3 — Feedback positivo por evolução: campo evolutionFeedbackKey?: string adicionado a CornerComparisonResult. Populado com technique_evolution_positive quando previousLapIssues indica que o piloto corrigiu um issue da volta anterior na mesma curva. Frases adicionadas nos 4 locais.
PilotSkillClassifier — novo módulo system/src/domain/pilot/pilot-skill-classifier.ts que calcula skillProfile com level (beginner | intermediate | advanced), confidence (0–1) e profileMetrics. Classificação por votação majoritária de 4 métricas: brakeConsistencyIndex, throttleCommitRate, trailBrakingAdoptionRate, errorRepeatRate. Confidence proporcional ao número de voltas (≥ 0.6 com 5+ voltas, satura em 1.0 com 10).
PilotSkillRepository — persistência do perfil em SQLite via pilot_skill_profile (chave composta track_key + car_id). INSERT OR REPLACE — perfil não reseta ao fechar o app.
FeedbackCalibrator — calibrateFeedback() retorna maxIssuesPerCorner, confidenceMinThreshold, includeAdvice e toneKey por nível. Fallback para intermediate quando confidence < 0.3.
Badge de nível na UI — componente PilotLevelBadge em CoachSessionScreen.tsx exibindo Iniciante/Intermediário/Avançado com cores #FF8C00/#00D46A/#E8002D. Animação badge-flash ao mudar de nível.
Barra de progresso de nível — LevelProgressBar mostra % de métricas já no nível seguinte (4 métricas: throttleCommitRate, trailBrakingAdoptionRate, brakeConsistencyIndex, errorRepeatRate). Barra 3px vermelha abaixo do badge.
Resumo de sessão — SessionSummaryPanel aparece ao parar o coach; exibe os 3 pontos fortes (verde ✓) e 3 pontos a melhorar (amarelo ⚠) baseados nas métricas do skillProfile.
Override manual de nível — campo pilotLevelOverride em CoachConfig; select "Nível do piloto" nas configurações com opções Automático / Iniciante / Intermediário / Avançado. calibrateFeedback() usa o override com prioridade máxima.
Added (F4 — Voice & Localization — completo)
Frases adicionadas e TTS gerado em pt-BR, en-US, es-ES, fr-FR para todas as chaves novas:
Variantes _light e _severe de todas as técnicas anteriores (feathering, partial, snap_brake, overbrake, early_turn_in, not_using_exit, excessive_coast)
148 arquivos .mp3 gerados via npm run generate:tts (OpenAI gpt-4o-mini-tts, voz onyx). Cobertura 100% — nenhuma chave sem áudio em nenhum locale.
Frases de resumo de sessão — 5 summary_strength_*, 5 summary_weakness_*, 3 summary_level_* em todos os 4 locales. 72 novos .mp3 gerados.
Frases de conselho para modo iniciante — 5 advice_* (brake_too_early, wheelspin_exit, throttle_feathering, inconsistent_braking, trail_braking) em todos os 4 locales.
system/tests/pilot-feedback-calibrator.test.ts — 9 testes: calibração por nível, fallback de confidence < 0.3, limítrofes 0.29/0.30/0.31.
Documentação atualizada: docs/business-rules.md (thresholds e confidence do PilotSkillClassifier); docs/developer-guide.md (contrato e uso do módulo); docs/qa-criteria.md (critérios dos 5 novos erros + PilotSkillClassifier + calibração por nível); docs/user-guide.md (seção "Classificação de Piloto" para pilotos).
184 testes passando, 0 falhas. Typecheck limpo.
Changed (F3 — UI/UX Redesign)
Renderer redesenhado para tema escuro oficial v0.6.0 com tokens CSS de produto (#0A0A0A, surfaces escuras, vermelho ApexLap, branco para texto, verde para ganho e laranja para alerta).
Tela desconectada agora usa splash central com marca ApexLap, glow vermelho, CTA "Abrir iRacing" em destaque e versão discreta no rodapé.
Tela ativa do coach recebeu header refinado, badge de perfil, referência em monoespaçado, rail de setores com chips escuros/condicionais, mapa com traçado escuro, linha branca e marcador vermelho com glow.
Feedback de voz ativo passou a mostrar waveform vermelho durante reprodução.
Histórico de voltas recebeu visual escuro, deltas destacados, grid de curvas e gráfico compacto de progresso da sessão.
Configurações foram reorganizadas em seções, com toggles customizados, seletor de idioma com ícones de bandeira em CSS e prévia visual de perfil do piloto.
Modal de referências recebeu cards com thumb de pista, indicador de fonte Catálogo/Minha, estado de download e busca textual em tempo real.