# Execução — `CC-9` Remover participante do bolão

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

**Resultado: 12/12 ✅** — nenhum defeito; 6 casos novos, todos verdes na
primeira execução.

| ID | Resultado | Onde |
| -- | --------- | ---- |
| CC-9-01 | ✅ | e2e "remoção pelo admin usa a mesma regra da saída" + "quem saiu não palpita mais nem lê o bolão" |
| CC-9-02 | ✅ | e2e mesma suíte (contagem de palpites intacta) |
| CC-9-03 | ✅ **novo** | e2e "CC-9-03 remoção pelo admin não recalcula o ponto de quem ficou" |
| CC-9-04 | ✅ **novo** | e2e "CC-9-04 participante comum não remove ninguém" |
| CC-9-05 | ✅ **novo** | e2e "CC-9-05 quem foi removido não entra de novo pelo convite" |
| CC-9-06 | ✅ **novo** | e2e "CC-9-06 não lembra quem foi removido pelo admin" |
| CC-9-07 | ✅ | e2e "o criador não pode ser removido" |
| CC-9-08 | ✅ **novo** | e2e "CC-9-08 remover quem já saiu é recusado e não reescreve a data" |
| CC-9-09 | ✅ **novo** | e2e "CC-9-09 admin removendo a si mesmo é mandado para a ação de sair" |
| CC-9-10 | ✅ **novo** | e2e "CC-9-10 remover quem não é do bolão responde 404" |
| CC-9-11 | ✅ | widget "remover avisa que não há volta pelo convite" |
| CC-9-12 | ✅ | widget "participante comum não recebe ações de admin" + "admin não recebe ação sobre o criador nem sobre quem saiu" |

## Observações

- **CC-9-03 é o caso que protege a integridade do ranking.** O ponto de quem
  ficou não muda; só a posição pode subir por o removido sair da lista. Se o
  ponto mudasse, a remoção seria uma alavanca para o admin alterar a
  classificação depois do jogo — exatamente o poder que o produto tenta não dar
  a ninguém.
- **CC-9-06 fecha a lacuna entre os dois caminhos de saída.** O lembrete filtra
  por `leftAt`, e a remoção preenche o mesmo campo que a saída voluntária —
  então a regra valia, mas ninguém tinha verificado pelo caminho da remoção. Um
  refactor que trocasse `leftAt` por um campo próprio de remoção passaria por
  todos os testes antigos e voltaria a cobrar prazo de quem foi expulso.
- **CC-9-09:** remover a si mesmo responde 400 mandando usar "sair". É o que
  impede uma porta lateral: a saída tem regras (último admin, criador) que a
  remoção não aplica.
- `FE-3` continua **em aberto de propósito** — a recusa ao remover o criador é
  inalcançável pela UI porque a ação não aparece para ele. Decisão pendente do
  PO, registrada na story: ou a story troca "mensagem na recusa" por "ação
  indisponível para o criador", ou a UI passa a oferecer e explicar.
