# Execução — plano `PR-5` (06/08)

**Veredito inicial: ❌ Reprovado** — `PR-5-08` falhou.
**Depois da correção: ✅ Aprovado** — 11 de 11.

| Caso | Resultado | Evidência |
| ---- | --------- | --------- |
| PR-5-01 | passou | `src/ranking/pr-5-plano.spec.ts` |
| PR-5-02 | passou | idem |
| PR-5-03 | passou | idem |
| PR-5-04 | passou | `src/ranking/ranking.service.spec.ts` + `pr-5-plano.spec.ts` |
| PR-5-05 | passou | `pr-5-plano.spec.ts` |
| PR-5-06 | passou | idem |
| PR-5-07 | passou | idem |
| PR-5-08 | **falhou → corrigido** | `pr-5-plano.spec.ts` + `test/ranking.e2e-spec.ts` |
| PR-5-09 | passou | `pr-5-plano.spec.ts` |
| PR-5-10 | passou | `test/correcao.e2e-spec.ts` (recálculo troca a ordem e avisa) |
| PR-5-11 | passou | `test/ranking_page_test.dart` (fonte 2×, posição de 2 dígitos) |

---

## Bug encontrado por `PR-5-08`

**Título:** a ordem de desempate configurada no bolão era ignorada pelo ranking

**Passos para reproduzir:**
1. Criar um bolão com `tiebreakOrder: ["WINNERS", "EXACT_SCORES"]` (a tela de
   criação oferece essa opção).
2. Deixar dois participantes com o mesmo total de pontos, um com mais placares
   exatos e o outro com mais acertos de vencedor.
3. Abrir o ranking.

**Esperado:** quem tem mais acertos de vencedor na frente, e o critério exibido
sendo "mais acertos de vencedor".

**Obtido:** quem tem mais placares exatos na frente, com o critério exibido
sendo "mais placares exatos" — a ordem padrão, como se o bolão não tivesse
configurado nada.

**Severidade: alta.** Não é cosmético: classifica errado e **explica errado**. O
campo `tiebreakOrder` era persistido na criação, exposto na leitura de regras,
editável pelo admin e herdado na recriação de temporada — e o cálculo nunca o
lia. `RankingService.ordenar` tinha a sequência exatos → vencedores fixa no
código.

O pior aspecto é o silêncio: nada falha, nada loga. O admin configura, a tela de
regras confirma a configuração dele, e a classificação sai por outra regra. A
descoberta só aconteceria numa discussão sobre empate no fim do campeonato — com
o app dando uma resposta e o regulamento do bolão dando outra.

**Task reaberta:** `PR-5 BE-2` ("Ordenar o ranking aplicando os critérios na
ordem definida"), que estava marcada como feita.

## A correção

Os critérios passaram a viver num mapa de comparadores e são aplicados **na
ordem do bolão**, tanto na ordenação quanto na escolha do `decidedBy` exibido.
Ordem vazia ou desconhecida cai no padrão — bolão sem ordem válida não pode
ficar sem desempate nenhum.

Cobertura acrescentada: `PR-5-08` (unit + e2e pelo endpoint, que é onde o
defeito vivia), `PR-5-08b` (ordem invertida caindo no segundo critério) e
`PR-5-08c` (ordem vazia/inválida).
