## MG-3 — Sigilo do palpite e prazo aplicados nas security rules

**PRD:** `docs/prd/migracao-firebase.md`

**Como** participante, **quero** que meu palpite continue secreto até o jogo
terminar e o prazo continue sendo do servidor, **para** a competição não virar
disputa de quem viu o palpite de quem.

**Prioridade:** Must — são as duas regras que, quebradas, corrompem o bolão.

**Critérios de aceite:**

- Dado um jogo que não terminou, quando qualquer pessoa — **inclusive o
  administrador** — tenta ler o palpite de outro, então a leitura é recusada.
- Dado que o jogo terminou, então os palpites de todos ficam legíveis para os
  participantes.
- Dado que o jogo **começou mas não terminou**, então o palpite continua secreto:
  libera no fim, não no apito.
- Dado que o relógio do meu aparelho está adiantado, quando tento palpitar depois
  do apito, então a escrita é recusada pelo **`request.time`** do servidor.
- Dado que altero o palpite antes do apito, então a alteração é aceita e a versão
  anterior fica registrada.
- Dado que a Function que libera o sigilo falhar, então o palpite fica secreto **a
  mais** — nunca exposto antes do fim do jogo.

**Tasks:**

_Backend_
- [ ] `BE-1` Flag `jogoTerminado` no documento de palpite, escrita só por Function (depende de MG-2 BE-1)
- [ ] `BE-2` Rule de leitura de palpite: dono sempre, terceiros só com o jogo terminado (depende de BE-1)
- [ ] `BE-3` Rule de escrita de palpite comparando `request.time` com o `kickoffAt` do jogo (depende de MG-2 BE-1)
- [ ] `BE-4` Function no gatilho de status do jogo, virando status e flag **na mesma transação** (depende de BE-1)
- [ ] `BE-5` Revisão do palpite registrada na alteração de valor, e só nela (depende de BE-3)

_QA_
- [ ] `QA-1` Escrever o plano de casos de teste a partir desta story
- [ ] `QA-2` Executar reaproveitando os IDs de `PP-7` (sigilo), `PP-5` (apito) e `PP-2` (revisão), incluindo a falha da Function

**Riscos/Dependências:**

- Depende de `MG-1` e `MG-2`.
- 🔴 **O mecanismo do sigilo muda.** Hoje é filtro em consulta; passa a ser flag
  desnormalizada. O risco sai de "a consulta vaza" e vai para "a Function não
  rodou" — e por isso `QA-2` tem de testar a Function **não** rodando.
- Security rule não filtra resultado de query: listagem passa inteira ou falha
  inteira. É o que obriga a desnormalização.
