Sintoma (confirmado por persona em produção)
No painel "// suas estatísticas" durante a corrida, os cartões Precisão e Erros se
contradizem: a persona O Iniciante viu "Precisão 100%" e "Erros 1" ao mesmo tempo
(feedback em Discussion #14). Dois rótulos verdadeiros no cálculo, mas incoerentes aos olhos —
quebra de honestidade de métrica, o oposto da nossa promessa de engine transparente.
Causa-raiz (arquivo:linha)
src/components/Race.tsx
errors é um contador vitalício e cumulativo — setErrors(e => e + newErrors) em
Race.tsx:88. Cada tecla errada soma; backspace + correção não subtrai (linha 90-92
ignora backspace de propósito). Então "Erros" conta erros já corrigidos, não erros vivos.
accuracy arredonda para cima — Race.tsx:56-57:
Math.round((1 - errors / totalKeystrokes) * 100). Com 1 erro em ~200 teclas:
1 - 1/200 = 0.995 → Math.round = 100%. Logo "100%" e "Erros 1" coexistem.
Ou seja: dois números certos pela sua própria conta, mas a UI não explica que "Erros" é
erros cometidos no total enquanto "Precisão" é taxa arredondada. O jogador lê como bug.
Correção proposta (honestidade, não maquiagem)
Duas mudanças pequenas e independentes, ambas na engine/label:
- Precisão nunca exibe 100% se houve ≥1 erro. Trocar o arredondamento por floor quando
errors > 0 (ou exibir 1 casa decimal). 100% deve significar zero erros cometidos, ponto.
- Deixar o rótulo "Erros" honesto: esclarecer que conta erros cometidos (inclui
corrigidos), p.ex. rótulo "Erros (total)" ou tooltip "teclas erradas digitadas, mesmo que
corrigidas". Sem mudar o número — só o significado explícito.
Não mexer no cálculo de WPM nem na área sagrada (latência de input). Mudança é de exibição.
Acceptance criteria (verificáveis)
Dica de abordagem
accuracy em Race.tsx:56-57 é o ponto único de exibição; use Math.floor sob condição
errors > 0. O rótulo está em Race.tsx:152. A skill cr-typing-engine cobre a engine e o
validador. Fecha o loop pré-prometido em Discussion #14 (chapéu de Engine, sexta).
Sintoma (confirmado por persona em produção)
No painel "// suas estatísticas" durante a corrida, os cartões Precisão e Erros se
contradizem: a persona O Iniciante viu "Precisão 100%" e "Erros 1" ao mesmo tempo
(feedback em Discussion #14). Dois rótulos verdadeiros no cálculo, mas incoerentes aos olhos —
quebra de honestidade de métrica, o oposto da nossa promessa de engine transparente.
Causa-raiz (arquivo:linha)
src/components/Race.tsxerrorsé um contador vitalício e cumulativo —setErrors(e => e + newErrors)emRace.tsx:88. Cada tecla errada soma; backspace + correção não subtrai (linha 90-92ignora backspace de propósito). Então "Erros" conta erros já corrigidos, não erros vivos.
accuracyarredonda para cima —Race.tsx:56-57:Math.round((1 - errors / totalKeystrokes) * 100). Com 1 erro em ~200 teclas:1 - 1/200 = 0.995→Math.round= 100%. Logo "100%" e "Erros 1" coexistem.Ou seja: dois números certos pela sua própria conta, mas a UI não explica que "Erros" é
erros cometidos no total enquanto "Precisão" é taxa arredondada. O jogador lê como bug.
Correção proposta (honestidade, não maquiagem)
Duas mudanças pequenas e independentes, ambas na engine/label:
errors > 0(ou exibir 1 casa decimal).100%deve significar zero erros cometidos, ponto.corrigidos), p.ex. rótulo "Erros (total)" ou tooltip "teclas erradas digitadas, mesmo que
corrigidas". Sem mudar o número — só o significado explícito.
Não mexer no cálculo de WPM nem na área sagrada (latência de input). Mudança é de exibição.
Acceptance criteria (verificáveis)
errors > 0etotalKeystrokesalto, o cartão Precisão nunca mostra100%(mostra
99%ou99.5%). Sóerrors === 0→100%.(incluindo corrigidos), eliminando a leitura de "bug".
node scripts/validate-metrics.mjsverde, com ao menos 1 caso novo: 1 erro em Nteclas → precisão < 100% e Erros ≥ 1 coerentes.
prefers-reduced-motion.Dica de abordagem
accuracyemRace.tsx:56-57é o ponto único de exibição; useMath.floorsob condiçãoerrors > 0. O rótulo está emRace.tsx:152. A skillcr-typing-enginecobre a engine e ovalidador. Fecha o loop pré-prometido em Discussion #14 (chapéu de Engine, sexta).