# Execução — `PR-4` Ranking da rodada, separado do geral

**Plano:** `PR-4-plano.md` · **Data:** 07/08/2026
**Ambiente:** backend local (`test/ranking.e2e-spec.ts`,
`src/ranking/pr-3-plano.spec.ts`), Flutter em teste de widget
(`test/ranking_page_test.dart`).

**Resultado: 10/10 ✅** — nenhum defeito; 2 casos novos (rodada sem apuração e
custo constante).

| ID | Resultado | Onde |
| -- | --------- | ---- |
| PR-4-01 | ✅ | widget "alterna entre geral e rodada, mantendo os dois separados" |
| PR-4-02 | ✅ | widget mesma suíte (os dois rótulos, um por vez) |
| PR-4-03 | ✅ | widget "o seletor abre qualquer rodada do intervalo do bolão" |
| PR-4-04 | ✅ | e2e "ranking da rodada avisa que a apuração está parcial" |
| PR-4-05 | ✅ | widget "rodada parcial avisa quantos jogos foram apurados" |
| PR-4-06 | ✅ **novo** | widget "PR-4-06 rodada sem jogo apurado tem mensagem própria" |
| PR-4-07 | ✅ | e2e "quem não participa não vê ranking nem extrato" |
| PR-4-08 | ✅ | e2e "PR-3 paginação do ranking recusa faixa inválida" (cobre a rota da rodada) |
| PR-4-09 | ✅ | widget "o seletor abre qualquer rodada do intervalo do bolão" |
| PR-4-10 | ✅ **novo** | unidade "PR-4-10 o ranking da rodada também não cresce com a galera" |

## Observações

- **O risco desta story é social, não técnico:** confundir a liderança da rodada
  com a do bolão. Por isso `PR-4-01`/`PR-4-02` verificam que **um exclui o
  outro** na tela — o teste garante que os 100 pontos do geral desaparecem quando
  a visão da rodada está aberta.
- **`PR-4-05` existe porque "parcial" sozinho não informa nada:** faltar um jogo
  ou nove muda completamente o que aquele ranking significa. A tela diz "x de y
  apurados".
- `PR-4-08` reusa o caso de paginação do geral **de propósito**: a asserção cobre
  as duas rotas. Regra de paginação diferente por rota é o tipo de inconsistência
  que só aparece na tela, e foi por isso que a validação nasceu compartilhada
  (`src/common/paginacao.ts`).
