Skip to content

Releases: patrick095/ApexLap-Coach

ApexLap Coach v0.6.2

Choose a tag to compare

@github-actions github-actions released this 03 Jun 21:06

[0.6.2] — 2026-06-03

Correções

  • Delta ao vivo (#1/#2): cálculo corrigido para lapElapsedTime − referenceLapTime × lapPct em vez de comparar com o tempo total da referência
  • Tag "Calibrando" (#3): classifyPilotSkill() agora chamado após cada volta válida; badge atualiza corretamente para o nível classificado
  • Mapa da referência (#4): sanity check de GPS relaxada (threshold 2°→5°); traçado real da pista exibido para referências Garage61
  • Nível iniciante (#5): calibrateFeedback() integrado ao fluxo; nível do piloto aplicado ao limite e tom do feedback
  • Referência visível (#6): badge fixo com tempo da referência ativa exibido durante toda a sessão de coaching
  • Volta inválida e setores (#7): chips de setor e painel de detalhe ocultados quando volta comprometida (lapCompromised = true)
  • Saída do pit (#8): primeira volta da sessão detectada como out-lap mesmo sem samples com inPit = true
  • Feedback com setor ruim (#9): close_to_reference verifica delta de crescimento de todas as fases, não apenas timeLoss total

ApexLap Coach v0.6.1

Choose a tag to compare

@github-actions github-actions released this 29 May 17:58

[0.6.1] - 2026-05-29

Fixed

  • BUG-01 — Primeira volta da sessão não gera mais feedbacks de voz incorretos. O coach pula o processamento da volta 1 após ser iniciado, evitando comparações com referências desalinhadas.
  • BUG-01bcurrentLapTrace é limpo ao completar uma volta, eliminando dados residuais nos timings em tempo real.
  • BUG-02 — Voz que travava silenciosamente agora tem timeout de 15s por reprodução. Após 3 falhas consecutivas, um banner de aviso aparece na tela de coaching.
  • BUG-03 — SDK do iRacing conecta automaticamente ao abrir o app; botão "Abrir iRacing" removido da idle screen.
  • BUG-04 — Saída de pista, reboque e colisão detectados em tempo real no loop de telemetria. Feedbacks de técnica são suprimidos pelo resto da volta comprometida. Saídas brevíssimas (< 2 samples) ignoradas para evitar falsos positivos em kerbs. Anúncio tardio no fim da volta suprimido se já anunciado em tempo real.

Added

  • Menu Electron > Configurações com atalho ⌘, / Ctrl+,.
  • Menu Electron > Abrir iRacing para abertura manual.
  • VoiceErrorBanner — banner não-obstrutivo com aviso de falha de áudio.
  • CoachingDataGrid — grid de 4 colunas (Volta, Delta, Melhor, Setor) inspirado no SimHub Lovely Dashboard.
  • Auto-navegação de setor acompanhando posição do piloto; clique manual suspende por 5s.
  • Indicador "INVÁLIDA" em laranja na célula DELTA quando a volta está comprometida em tempo real.
  • Componentes ProjectIcon e SettingsIcon (SVG inline) substituindo "A" e "S".
  • Tela de loading com ícone do projeto + spinner animado.
  • Layout vertical na coaching screen (painel acima do mapa).

Changed

  • Removido badge "Sessão iRacing conectada" da topbar.
  • session-body usa flex-direction: column.

ApexLap Coach v0.6.0

Choose a tag to compare

@github-actions github-actions released this 29 May 00:33

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

ApexLap Coach v0.5.1

Choose a tag to compare

@github-actions github-actions released this 28 May 19:49

[0.5.1] - 2026-05-28

Fixed

  • IRacingTelemetryService parou de ler Lat/Lon/Latitude/Longitude (variáveis ausentes na maioria das pistas do iRacing) e passou a capturar VelocityX/VelocityY (world-space m/s), que são sempre disponíveis.
  • LiveLapBuffer agora integra VelocityX/Y por integração trapezoidal com cap de dt (MAX_INTEGRATION_DT_S = 0.15 s) para derivar trackPositionX/Y em metros com origem no primeiro ponto da volta — eliminando o problema de posição sempre undefined nas sessões ao vivo.
  • tdf-reference-reader.ts adicionou convertGpsToMeters(): converte as coordenadas GPS (graus) do arquivo TDF de referência para metros via projeção equiretangular, tornando a referência compatível em escala com a integração de velocidade do live.
  • Adicionado business-rules-compliance.test.ts com 11 novos testes cobrindo early_turn_in_bad_entry, not_using_exit_track, blocksPointFeedback, outlap, volta comprometida e volta boa — gaps identificados pela QA.

ApexLap Coach v0.4.2

Choose a tag to compare

@github-actions github-actions released this 26 May 22:31

[0.4.2] - 2026-05-26

Fixed

  • Auto-updater buscava latest.yml na raiz do bucket em vez de updates/latest.yml: publishUrl no workflow passou a incluir o updatePrefix (/file/updates), e remoteUpdateBaseUrl() no app agora concatena updatePrefix ao updateBaseUrl explícito antes de chamar autoUpdater.setFeedURL.

ApexLap Coach v0.4.1

Choose a tag to compare

@github-actions github-actions released this 26 May 21:49

[0.4.1] - 2026-05-26

Added

  • Cloudflare Worker (devops/r2-signing-worker/worker.js) com dois endpoints: /sign?path= (autenticado via CF-Access, retorna JSON com URL assinada para arquivos .apexc/.json) e /file/<path> (sem auth, retorna redirect 302 para arquivos de update .exe/.yml/.blockmap). Bucket R2 permanece privado; nenhuma URL pública é exposta.
  • Campo prefix em ApexcRemoteConfig e remote.json: prefixo de caminho dentro do bucket aplicado antes de chamar o Worker, permitindo usar um único bucket para referências e updates com subdiretórios distintos.
  • Método público fetchRemoteIndex() em ApexcRemoteCache para buscar o index.json remoto via Worker sem expor o fetchIndex privado.
  • remote.json.example versionado em system/assets/reference-laps/ documentando a estrutura esperada do arquivo de configuração remota.

Changed

  • reference:list-remote (IPC) reescrito para usar ApexcRemoteCache em vez de fetch direto com baseUrl: agora funciona com signingWorkerUrl sem precisar de URL pública.
  • GitHub Actions (release.yml): step "Configure R2 runtime feeds" simplificado — remove APEXC_REMOTE_BASE_URL e UPDATE_REMOTE_BASE_URL; usa apenas SIGNING_WORKER_URL, SIGNING_WORKER_PREFIX, CF_ACCESS_CLIENT_ID e CF_ACCESS_CLIENT_SECRET. O updateBaseUrl é derivado automaticamente como {SIGNING_WORKER_URL}/file.
  • remote.json adicionado ao .gitignore (contém credenciais).

Fixed

  • Dois testes em corner-analysis-0.4.0.test.ts que falhavam por condições de borda no detector de curvas e no comparador de trail brake: gap entre zonas ajustado para respeitar o limiar de merge (0.01) vs complexo (0.02); cenário de trail_brake_needed redesenhado para evitar que coast_excessive_exit ou brake_release_fast mascarassem o sinal correto.

ApexLap Coach v0.4.0

Choose a tag to compare

@github-actions github-actions released this 26 May 21:38

[0.4.0] - 2026-05-26

Added

  • Análise de perda de tempo por fase de curva (entrada, meio, saída, pós-saída) via cálculo de slope do TDiff, identificando a fase dominante de perda em cada curva.
  • Classificação de curvas Tipo A (segue reta longa) e Tipo B (chicane/sequência), com peso de prioridade de saída (exitPriority) aplicado ao score de aceleração e saída no comparador.
  • Agrupamento automático de curvas em complexos (complexId) quando o gap entre elas for menor que 2% da volta; apenas o grupo com maior perda de tempo fala por complexo.
  • Detecção de carry-over: quando a saída ruim de uma curva compromete a entrada da seguinte, o resultado recebe carryOverFromCornerId e a dica pré-curva aponta para a curva anterior.
  • Detecção de trail_brake_absent: diferencia o caso em que a referência usa trail brake e o piloto não usa (trail_brake_absent) do caso em que ambos usam, mas o piloto precisa melhorar (trail_brake_needed).
  • Score de qualidade de trail braking (trailBrakingQuality: excellent / good / partial / absent) calculado por sobreposição de freio+volante, suavidade de release e comprimento da zona de coast.
  • Índice de subesterço/sobreesterço por curva (understeerIndex) calculado via yaw rate teórico × medido.
  • Fase dominante de perda (dominantLossPhase) exportada no resultado de cada curva.
  • Seleção automática da referência mais rápida ao conectar ao iRacing: compara a melhor volta do piloto salva localmente com a referência do catálogo e ativa a mais rápida no modo auto.
  • Novas frases de voz em pt-BR, en-US, es-ES e fr-FR: trail_brake_absent, trail_brake_absent_light, coast_excessive_long, carry_over_note, understeer_exit, oversteer_exit, pre_trail_brake, pre_coast_less, pre_carry_over_focus_previous.
  • Dica pré-curva pre_carry_over_focus_previous quando a curva atual tem carry-over detectado da anterior.
  • Dica pré-curva pre_trail_brake para casos de trail_brake_absent e trail_brake_needed.

Changed

  • compareLapByCorners migrado de map para loop imperativo para suportar carry-over entre curvas consecutivas.
  • rankLossScores aplica multiplicador exitPriority nos scores de aceleração e saída de curvas Tipo A.
  • issueWeight incluiu trail_brake_absent com prioridade 71 (igual ao trail_brake_needed).
  • Dica pré-curva para trail_brake_needed e trail_brake_excessive agora retorna pre_trail_brake em vez de pre_brake_later.

ApexLap Coach v0.3.2

Choose a tag to compare

@github-actions github-actions released this 26 May 19:10

[0.3.2] - 2026-05-26

Changed

  • visual-track-layouts.json foi movido para assets/reference-laps/visual-track-layouts.json, fora da pasta apexc, para não ser apagado nem publicado junto com as referências geradas.
  • generate-upload:apexc e upload:apexc agora respeitam filtros de carros e pistas grátis e permitem concorrência maior no upload.
  • O manifest local de geração ApexC passou a ser gravado incrementalmente em build-manifest.local.jsonl e compactado em build-manifest.local.json ao finalizar.
  • upload:apexc ganhou filtro --references para reenviar referências específicas por basePath.
  • Adicionado rebuild:apexc-index para reconstruir index.json local a partir de build-manifest.local.json.
  • Tela do coach ficou mais compacta: a lateral ao vivo mostra setores com referência/atual/delta e curvas somente como indicadores coloridos.
  • Histórico de voltas passou a usar seletor de volta e exibir detalhes completos de setores e curvas, incluindo tooltip com a mensagem de feedback da curva.

Fixed

  • Corrigido o consumo crescente de memória na geração ApexC, substituindo workers por arquivo por um pool persistente de workers.
  • Corrigido o --force da geração ApexC para limpar apenas artefatos gerados, sem apagar templates visuais.
  • Corrigida a geração ApexC para exigir o template visual e evitar fallback silencioso para detecção antiga de curvas.
  • Corrigido o upload para não enviar manifests locais de build ao R2.
  • Corrigido upload R2 para evitar streams não retryable em PutObject, reduzindo falhas socket hang up.
  • Corrigido cálculo de tempo em lapPct=1 quando a telemetria não possui sample exatamente no fim da volta, evitando último setor sem tempo de referência e deltas deslocados.
  • Corrigido carregamento de referências ApexC para preservar time e distance reais do traçado completo, evitando comparar curvas contra uma referência reconstruída com velocidade média constante.
  • Corrigido leitor de TDF binário do Garage61 para reconstruir o tempo por integração de velocidade, em vez de assumir tempo linear por percentual da volta.
  • Referências locais criadas pelo piloto agora reaproveitam os templates visuais padronizados de curvas e setores quando não há uma referência ApexC do mesmo carro.
  • Histórico da sessão agora mantém voltas inválidas, exceto a volta inicial de saída dos boxes.

ApexLap Coach v0.3.1

Choose a tag to compare

@github-actions github-actions released this 26 May 16:36

[0.3.1] - 2026-05-26

Changed

  • Referências remotas baixadas (catálogo) agora são efêmeras: apagadas ao abrir o app, ao fechar, ao desconectar do iRacing e ao fechar o ReferenceViewer quando não há sessão ativa.
  • Ao fechar o ReferenceViewer com uma sessão do iRacing conectada, as referências remotas são mantidas até o fim da sessão.
  • Referências criadas a partir de voltas válidas do próprio piloto (top-10 por combinação pista/carro) continuam persistentes e só são removidas por reset explícito nas configurações.
  • Na abertura do app, referências remotas de sessões anteriores encerradas de forma abrupta são apagadas automaticamente.
  • Label de fonte no ReferenceViewer renomeado de "Catálogo" para "App"; badge de referências do piloto alterado para ★.

Fixed

  • Referências baixadas do catálogo apareciam incorretamente com badge "minha" no ReferenceViewer: o renderer não filtrava o source retornado por listAvailableReferences(), forçando todos os itens como local. Agora apenas entradas com source === "local" vão para a lista de voltas do piloto.

ApexLap Coach v0.3.0

Choose a tag to compare

@github-actions github-actions released this 26 May 00:45

[0.3.0] - 2026-05-25

Added

  • Módulo telemetry-event-analyzer.ts para extração de eventos granulares por canal: throttle, freio, coast, volante e marcha, com limites por fase da curva.
  • Fases ENTRY, MID, EXIT e POST_EXIT com janelas calculadas pela geometria da curva (computePhaseBoundaries).
  • Ledger de delta por fase (PhaseDeltaLedger) com entryDeltaGrowth, midDeltaGrowth, exitDeltaGrowth, postExitDeltaGrowth e totalCornerDeltaGrowth; postExitDeltaGrowth captura perdas que continuam após o fim da curva.
  • Detecção de auto-blip: pico curto de throttle durante redução de marcha em zona de frenagem é classificado e ignorado na análise de throttle.
  • Detecção de throttle parcial sustentado (partialDurationSeconds, partialDeltaGrowth) — separa "50% constante" de "100% por metade do trecho, 0% no restante".
  • Novas causas de mainIssue: throttle_partial_exit, throttle_hesitation, throttle_early_with_steering, coast_excessive_entry, coast_excessive_exit, trail_brake_excessive, entry_too_aggressive, steering_scrub, gear_too_high, gear_too_low.
  • Pesos de fase no scoring: ENTRY=0.90, MID=1.00, EXIT=1.35, POST_EXIT=1.50.
  • Supressão de steering: não ganha quando throttle parcial, coast ou freio explicam melhor a perda no exit; só pontua quando yawEfficiency ou scrub confirmam understeer real.
  • throttle_committed como nova causa de ganho, ativada quando o piloto acelerou mais decisivamente na saída.
  • Novas frases de voz em pt-BR, en-US, es-ES e fr-FR para todas as novas causas.
  • Testes telemetry-causality.test.ts e throttle-events.test.ts cobrindo throttle parcial, auto-blip, coast por fase, ledger de delta e análise causal.
  • Debug log aprimorado: exibe postΔ, partialDiff e causas secundárias em modo desenvolvedor.

Changed

  • lap-comparator.ts refatorado para usar telemetry-event-analyzer.ts; scoring agora baseado em eventos + delta de fase em vez de médias simples.
  • throttleSeverity inclui partialDurationDiff com peso dobrado quando exitDeltaGrowth > 0.06s.
  • steeringSeverity reduzida a 20% quando outras causas explicam o exit; requer confirmação de yaw/lateral efficiency.
  • coastIssue diferencia coast_excessive_entry de coast_excessive_exit conforme a fase onde ocorre.
  • gearIssue retorna gear_too_high ou gear_too_low em vez de sempre gear_wrong.
  • corner-feedback.service.ts mapeado para todas as novas causas.
  • issueWeight em electron-main.ts atualizado com prioridades para as novas causas.