# Execução — `CC-7` Lista de participantes

**Plano:** `CC-7-plano.md` · **Data:** 06/08/2026
**Ambiente:** backend local (`test/membros.e2e-spec.ts`,
`test/ranking.e2e-spec.ts`), Flutter em teste de widget
(`test/participantes_page_test.dart`).

**Resultado: ✅ 9 de 9** — 1 defeito encontrado e corrigido. O décimo caso
(`CC-7-10`) foi **cancelado em 07/08** junto com as tasks `BE-1`/`FE-1`, por
decisão do dono: não rastrear quem só abriu o convite.

| ID | Resultado | Onde |
| -- | --------- | ---- |
| CC-7-01 | ✅ | e2e "lista participantes marcando quem é o criador" |
| CC-7-02 | ✅ | widget "lista todos e marca criador, você e quem saiu" |
| CC-7-03 | ✅ | e2e "quem não participa não vê a lista" |
| CC-7-04 | ✅ | widget "participante comum não recebe ações de admin" |
| CC-7-05 | ✅ | widget "bolão de uma pessoa diz o que fazer em vez de lista seca" |
| CC-7-06 | ✅ **novo** | widget "CC-7-06 falha ao carregar a lista mostra o motivo com retry" |
| CC-7-07 | ✅ **novo** | e2e "CC-7-07 lista paginada devolve o total completo" |
| CC-7-08 | ✅ **corrigido** | e2e "CC-7-08 paginação recusa faixa inválida e limita o teto" |
| CC-7-09 | ✅ | e2e "lista participantes…" (campo `role` por linha) |
| CC-7-10 | ~~cancelado~~ | decisão do dono em 07/08: não rastrear |

## Defeito encontrado — paginação sem faixa válida

`GET /pools/:id/members` (e as duas rotas de ranking) aceitavam qualquer
`limit`/`offset`:

- `limit=0` respondia **200 com lista vazia** — a tela mostra "ninguém no bolão"
  ou "ranking vazio" e quem lê acredita. Erro silencioso que parece dado.
- `limit=100000` era atendido inteiro, sem teto.
- `offset=-1` passava para o banco.

Corrigido em `src/common/paginacao.ts` (`LIMITE_MAXIMO = 100`), aplicado às três
rotas paginadas: pedido inválido é 400 com motivo, e `limit` grande é limitado ao
teto. Aplicar nas três de uma vez foi de propósito — regra de paginação diferente
por rota é o tipo de inconsistência que o app descobre na tela.

## Observações

- **`CC-7-10` é o único caso bloqueado, e por decisão de produto, não por
  técnica.** Registrar quem "só abriu o convite" guarda dado de alguém que **não
  entrou** no bolão; a story já pedia conferir se isso é desejável antes de
  implementar. Enquanto `BE-1` não existir, não há o que separar e `FE-1` (as duas
  listas) não tem como ser feita.
- `QA-2` ficou aberta até 07/08 por causa desse caso. Com o cancelamento, não há
  o que executar e ela fecha — a story é testada por inteiro no escopo que
  **existe**.
- `total` conta também quem saiu — correto aqui, porque a linha de quem saiu
  continua na lista (marcada e apagada). O contador de "quantos participam" da
  home é outro, e conta só ativos.
