Skip to content

fix(engine): precisão honesta — nunca 100% com erro cometido (#20) - #23

Merged
caioross merged 1 commit into
mainfrom
auto/issue-20-precisao-honesta
Jul 12, 2026
Merged

fix(engine): precisão honesta — nunca 100% com erro cometido (#20)#23
caioross merged 1 commit into
mainfrom
auto/issue-20-precisao-honesta

Conversation

@caioross

Copy link
Copy Markdown
Owner

Contexto

A persona O Iniciante viu "Precisão 100%" e "Erros 1" ao mesmo tempo (feedback em Discussion #14). Dois números certos pela conta interna, mas incoerentes aos olhos — quebra de honestidade de métrica. Causa-raiz: Math.round((1 - 1/200)*100) = Math.round(99.5) = 100, coexistindo com o contador cumulativo de erros.

O que mudou e por quê

  • accuracy (Race.tsx): 100% agora só com zero erros cometidos. Com ≥1 erro, usa Math.floor e teto de 99%. errors > 0 garante totalKeystrokes > 0, então não há divisão por zero. Isso não afrouxa anti-cheat — torna a leitura da precisão mais rigorosa (§7.1 não se aplica).
  • Rótulo "Erros" → "Erros (total)" + tooltip (title) explicando que conta teclas erradas digitadas incluindo as já corrigidas. Número inalterado; só o significado fica explícito.
  • validate-metrics.mjs: fórmula espelhada + 3 casos novos (1 erro em 200 e em 10 000 teclas → 99%; 0 erro → 100%).

Nada toca a área sagrada (latência de input): handleInput e o caminho de digitação ficam intactos; sem animações novas (reduced-motion preservado).

Como foi validado (gate real)

  • pnpm typecheck
  • pnpm build
  • node .claude/skills/cr-typing-engine/scripts/validate-metrics.mjs27/27
  • node scripts/validate-persistence.mjs33/33
  • pnpm lint: N/A (repo sem config ESLint; CI não roda lint)

Acceptance criteria

  • errors > 0 → Precisão nunca mostra 100% (mostra 99% ou menos); só errors === 0100%
  • Rótulo/tooltip de Erros explícito (conta erros cometidos, incluindo corrigidos)
  • validate-metrics verde com ≥1 caso novo
  • Sem regressão de latência (60fps) nem de prefers-reduced-motion

Riscos

Baixo. Diff de exibição/label (16 linhas em Race.tsx) + validador. Sem Parecer do Conselho nesta issue — segui o plano da própria issue (floor sob errors > 0), acrescentando o teto de 99% como salvaguarda contra edge de ponto flutuante.

Closes #20

O painel "// suas estatísticas" mostrava "Precisão 100%" ao lado de
"Erros 1": Math.round((1 - 1/200)*100) arredondava 99.5 para 100,
contradizendo o cartão de erros e quebrando a honestidade da métrica.

- accuracy: 100% agora só com zero erros; com ≥1 erro usa Math.floor e
  teto de 99%. Não afrouxa anti-cheat (torna a leitura mais rigorosa).
- rótulo "Erros" → "Erros (total)" + tooltip explicando que conta teclas
  erradas já corrigidas (número inalterado, só o significado explícito).
- validate-metrics: fórmula espelhada + 3 casos novos (1 erro em 200 e
  10000 teclas → 99%; 0 erro → 100%). 27/27 verdes.

Closes #20

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

@caioross is attempting to deploy a commit to the caioross' projects team on Vercel, but is not a member of this team. To resolve this issue, you can:

  • Make your repository public. Collaboration is free for open source and public repositories.
  • Upgrade to pro and add @caioross as a member. A Pro subscription is required to access Vercel's collaborative features.
    • If you're the owner of the team, click here to upgrade and add @caioross as a member.
    • If you're the user who initiated this build request, click here to request access.
    • If you're already a member of the caioross' projects team, make sure that your Vercel account is connected to your GitHub account.

To read more about collaboration on Vercel, click here.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements an "honest accuracy" calculation (issue #20) in both the Race.tsx component and the validate-metrics.mjs script, ensuring that a 100% accuracy score is only achievable with zero errors, and capping the accuracy at 99% otherwise. It also updates the UI to display "Erros (total)" with an explanatory tooltip. The review feedback correctly suggests using Math.round instead of Math.floor combined with the 99% cap to avoid unfairly penalizing users by rounding down their accuracy scores.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread src/components/Race.tsx
Comment on lines 62 to +65
const accuracy =
totalKeystrokes === 0 ? 100 : Math.max(0, Math.round((1 - errors / totalKeystrokes) * 100));
errors === 0
? 100
: Math.max(0, Math.min(99, Math.floor((1 - errors / totalKeystrokes) * 100)));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Ao usar Math.floor, a precisão é sempre arredondada para baixo, o que introduz uma penalidade desnecessária para o usuário (por exemplo, uma precisão real de 98.9% seria exibida como 98% em vez de 99%).\n\nPodemos manter o comportamento honesto (nunca exibir 100% se houver erros) usando Math.round em conjunto com o limite máximo de 99 (Math.min(99, ...)). Isso garante que valores como 98.9% sejam arredondados corretamente para 99%, enquanto qualquer valor que arredondaria para 100% (como 99.6%) seja limitado a 99%.

  const accuracy =\n    errors === 0\n      ? 100\n      : Math.max(0, Math.min(99, Math.round((1 - errors / totalKeystrokes) * 100)));

Comment on lines +49 to +51
return errors === 0
? 100
: Math.max(0, Math.round((1 - errors / totalKeystrokes) * 100));
: Math.max(0, Math.min(99, Math.floor((1 - errors / totalKeystrokes) * 100)));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Para manter a consistência com a fórmula de precisão no componente Race.tsx, devemos usar Math.round em vez de Math.floor aqui também, mantendo o limite máximo de 99 para evitar que a precisão seja exibida como 100% quando houver erros.

  return errors === 0\n    ? 100\n    : Math.max(0, Math.min(99, Math.round((1 - errors / totalKeystrokes) * 100)));

@caioross

Copy link
Copy Markdown
Owner Author

Parecer PR Doctor — APROVADO (normal §7.3) ✅ · merge aguarda sessão supervisionada

Diff lido inteiro. Correção de honestidade de métrica (issue #20), não maquiagem:

  • accuracy (Race.tsx): errors === 0 ? 100 : Math.max(0, Math.min(99, Math.floor(...))). 100% passa a significar zero erros cometidos; com ≥1 erro nunca exibe 100% (teto 99% cobre o edge de ponto flutuante que produzia Math.round(99.5)=100). Não afrouxa anti-cheat — leitura fica mais rigorosa (§7.1 N/A).
  • Rótulo "Erros (total)" + tooltip esclarecendo que conta teclas erradas incluindo as corrigidas. Número inalterado.
  • validate-metrics.mjs: fórmula espelhada + 3 casos novos (1/200→99, 1/10000→99, 0/200→100).

Gate real (verifiquei no branch 8007403): CI Install, typecheck & build ✅ · validate-metrics27/27 ✅ (rodei localmente). Vercel vermelho = infra pré-existente (a própria mensagem do bot Vercel confirma: autor não é membro do time no Vercel / repo privado) — não é regressão de código; CI do repo = typecheck+build (HANDBOOK §11).

Área sagrada intocada (só exibição/label; handleInput intacto; sem animação nova). Closes #20 correto.

Status: aprovado para squash-merge. O merge (= deploy de produção na Vercel) foi barrado pelo classificador de segurança do harness em modo automático, que exige revisão humana para deploy em main LIVE. Fica pronto para o dono mergear numa sessão supervisionada — nada mais falta.

@caioross

Copy link
Copy Markdown
Owner Author

Parecer PR Doctor — APROVADO (NORMAL, HANDBOOK §7.3)

Diff lido inteiro (Race.tsx + validador espelho). Classifiquei como normal: engine de digitação com validate-metrics verde — a mudança endurece a leitura da precisão (nunca 100% coexistindo com Erros ≥ 1), então não afrouxa anti-cheat (§7.1 não se aplica).

Corretude verificada:

  • errors === 0 ? 100 : max(0, min(99, floor(...))) — com errors > 0, totalKeystrokes ≥ errors > 0, sem divisão por zero. ✔
  • Rodei validate-metrics.mjs na branch (8007403): 27/27 ✔ — a CI do repo não roda esse script, então validei localmente.
  • CI Install, typecheck & build verde. (Vercel fail = acesso do autor ao projeto, condição de infra pré-existente, não-bloqueante.)
  • Stat.title opcional → retrocompatível. Área sagrada (latência da textarea) intacta.

Closes #20 correto (resolve a issue inteira). Squash-merge.

@caioross
caioross merged commit bbd4a30 into main Jul 12, 2026
2 of 3 checks passed
@caioross
caioross deleted the auto/issue-20-precisao-honesta branch July 12, 2026 22:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Engine/Honestidade: "Precisão 100%" coexiste com "Erros 1" — arredondamento mascara erro e rótulo confunde

1 participant