## PR-5 — Aplicar e exibir os critérios de desempate

**PRD:** `docs/prd/pontuacao-e-ranking.md`

**Como** participante competitivo, **quero** ver qual critério está me
colocando à frente ou atrás de quem tem os mesmos pontos, **para** não haver
briga sobre a classificação.

**Prioridade:** Must — empate sem critério visível é briga garantida
justamente na hora que mais importa, o fim do campeonato.

**Critérios de aceite:**

- Dado que dois participantes têm o mesmo total de pontos, quando o ranking é
  montado, então fica à frente quem tem **mais placares exatos**.
- Dado que também empatam em placares exatos, então fica à frente quem tem
  **mais acertos de vencedor**.
- Dado que o empate persiste após os dois critérios, então os participantes
  **dividem a mesma posição** (co-campeões), sem desempate arbitrário.
- Dado que estou empatado com alguém, quando vejo o ranking, então vejo **qual
  critério** está definindo a ordem entre nós.
- Dado que três ou mais participantes empatam, então todos que persistem
  empatados dividem a posição, e a posição seguinte respeita a quantidade de
  empatados.

**Tasks:**

_Backend_
- [x] `BE-1` Contar placares exatos e acertos de vencedor por participante (depende de PR-1 BE-3)
- [x] `BE-2` Ordenar o ranking aplicando os critérios na ordem definida (depende de BE-1) — _reaberta em 06/08 por falha em `PR-5-08`; corrigida e reverificada_
- [x] `BE-3` Atribuir a mesma posição a empatados que persistem, e ajustar a posição seguinte (depende de BE-2)
- [x] `BE-4` Expor, na resposta do ranking, qual critério decidiu cada desempate (depende de BE-2)

_Mobile_
- [x] `FE-1` Exibir no ranking o critério que decidiu o desempate entre empatados (depende de BE-4)
- [x] `FE-2` Exibir posição compartilhada quando há co-campeões (depende de BE-3)
- [x] `FE-3` Deixar a ordem dos critérios consultável pelo participante

_QA_
- [x] `QA-1` Escrever o plano de casos de teste a partir desta story
- [x] `QA-2` Executar o plano com empate resolvido no 1º critério, no 2º, e persistente com 2 e com 3+ participantes

**Riscos/Dependências:**

- **PR-3 e PR-4 ficam com ordem indefinida entre empatados até esta story
  existir** — ela não é opcional para o ranking estar correto.
- A posição compartilhada muda a numeração seguinte; errar isso gera um
  ranking com duas pessoas em "2º" e ninguém em "3º" por engano.
- Interage com CV-2 (co-campeões no encerramento).

- **06/08:** `BE-4` estava marcado mas violava o AC "estou empatado com alguém →
  vejo qual critério está definindo a ordem entre nós": o critério era calculado
  só contra a linha **de cima**, então quem liderava o empate via `PONTOS` e
  ficava sem a justificativa — justamente quem é questionado. O `ordenar()`
  passou a olhar para os dois lados, e a tela deixou de filtrar por posição.
- `FE-2` (posição compartilhada) está coberto por teste de widget, inclusive
  contra estouro de layout com fonte a 2×, mas **não** foi exercitado em device:
  o cenário de co-campeões exige empate persistente, que não existe nos dados
  atuais. Fica pendente até a verificação em tela.

- **06/08:** plano de casos em `docs/testes/PR-5-plano.md`. Escrito a partir da
  story, não do código — caso escrito depois de olhar a implementação valida o
  que foi feito, não o que foi pedido.

- **06/08 — execução: ❌ reprovada, depois ✅ 11 de 11**
  (`docs/testes/PR-5-execucao.md`).
- `PR-5-08` derrubou `BE-2`, que estava marcada: a `tiebreakOrder` era
  persistida na criação, exposta na leitura, editável pelo admin e herdada na
  recriação — e o `ordenar` **nunca a lia**, usando exatos → vencedores fixo no
  código. Bolão configurado com a ordem invertida classificava errado **e
  explicava errado**, em silêncio: nada falha, nada loga. A descoberta só viria
  numa briga sobre empate no fim do campeonato, com o app dizendo uma coisa e o
  regulamento combinado dizendo outra.
- Corrigido com um mapa de comparadores aplicado na ordem do bolão, na
  ordenação **e** no `decidedBy` exibido. Ordem vazia ou desconhecida cai no
  padrão. Cobertura nova: `PR-5-08` (unit + e2e pelo endpoint, que é onde o
  defeito vivia), `PR-5-08b` e `PR-5-08c`.

- **06/08:** `FE-3` já estava atendida pela tela de regras, que mostra a ordem
  dos critérios do bolão em texto ("mais placares exatos, depois mais acertos de
  vencedor"). Marcada ao conferir, não implementada agora.

- **06/08 — verificado em device.** Montei um empate que resiste a todos os
  critérios (mesmos pontos, mesmos exatos, mesmos acertos) e o ranking mostrou os
  dois em **1º**, com o ícone de posição compartilhada e "empate mantido —
  dividem a posição". Era a última pendência da story, que estava coberta por
  teste de widget mas nunca vista em tela.
