Skip to content

ApexLap Coach v0.6.0

Choose a tag to compare

@github-actions github-actions released this 29 May 00:33
· 3 commits to main since this release

[0.6.0] - 2026-05-28

Added (F1.1 — Novos Erros de Técnica)

  • 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.

Added (F1.2.4 / F1.3 / F1.4 — Coach Intelligence restante)

  • 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.
  • driving-technique-f1-remaining.test.ts — 16 novos testes cobrindo F1.2.4, F1.3.1-4, F1.4.2-3.

Added (F2 — Pilot Ranking — completo)

  • 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.
  • FeedbackCalibratorcalibrateFeedback() 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ívelLevelProgressBar 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ãoSessionSummaryPanel 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:
    • technique_brake_too_early / _light / _severe
    • technique_wheelspin_at_exit / _light / _severe
    • technique_high_steering_at_throttle / _light / _severe
    • technique_inconsistent_braking_point / _light / _severe
    • technique_steering_correction_at_exit / _light / _severe
    • technique_evolution_positive
    • technique_repeat_brake_too_early, _wheelspin_at_exit, _inconsistent_braking_point
    • 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.

Added (F5 — QA)

  • system/tests/pilot-skill-classifier.test.ts — 8 testes: beginner, advanced, dados insuficientes (< 5 voltas), intermediate, votação majoritária, cálculo de confidence exato (5 voltas → 0.60, 10 voltas → 1.0).
  • 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.