## MG-1 — Projeto Firebase e emuladores rodando local, sem custo

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

**Como** time, **quero** o Firebase configurado e os emuladores de pé na máquina,
**para** construir e testar a migração inteira antes de qualquer decisão de
cobrança.

**Prioridade:** Must — é o que separa "migração com prova" de reescrita no escuro.

**Critérios de aceite:**

- Dado o repositório recém-clonado, quando rodo um comando só, então Firestore,
  Auth e Functions sobem em emulador local.
- Dado que os emuladores estão de pé, então **nenhuma** requisição sai para um
  projeto real do Firebase — teste que fala com produção não é teste.
- Dado que não há plano Blaze habilitado, então tudo acima funciona igual: o
  emulador não exige cartão.
- Dado que o `java` do sistema é *keg-only* nesta máquina, então o comando
  documenta ou resolve o `PATH` — senão o emulador do Firestore falha com uma
  mensagem que não explica nada.
- Dado que outro dev abre o projeto, então o README diz o que instalar e o que
  rodar, sem passo implícito.

**Tasks:**

_Backend_
- [x] `BE-1` `firebase.json` com Firestore, Auth e Functions em emulador, portas fixas
- [x] `BE-2` Projeto de Functions em TypeScript, compartilhando o `tsconfig` de regra pura (depende de BE-1)
- [x] `BE-3` Script único de subida dos emuladores, resolvendo o JDK keg-only (depende de BE-1)
- [x] `BE-4` Barrar acidente: as Functions recusam subir apontando para projeto real em ambiente de teste (depende de BE-1)

_DevOps_
- [x] `OPS-1` `.firebaserc` e credenciais fora do versionamento, com `.env.example` atualizado
- [x] `OPS-2` README da migração: o que instalar, o que rodar, e por que Blaze não é necessário ainda

_QA_
- [x] `QA-1` Escrever o plano de casos de teste a partir desta story
- [x] `QA-2` Executar o plano do zero, simulando máquina nova (sem `firebase-tools`, sem JDK no PATH)

**Riscos/Dependências:**

- O emulador do Firestore exige JDK. Nesta máquina o OpenJDK **existe** via
  Homebrew mas é *keg-only* (`/opt/homebrew/opt/openjdk/bin/java`, fora do `PATH`)
  — verificado em 07/08. Sem tratar isso, o primeiro `firebase emulators:start`
  falha por um motivo que não tem a ver com Firebase.
- ⚠️ **Nada aqui exige plano Blaze.** É a razão desta story vir primeiro: destrava
  todo o resto sem decisão financeira.

- **07/08 — feita e verificada.** `bolao-firebase/` com `firebase-tools` 15.26.0
  **pinado como devDependency** (não global: instalação global não é reprodutível
  para quem clona). Plano em `docs/testes/MG-1-plano.md`, execução em
  `docs/testes/MG-1-execucao.md` (**10/10 ✅**).
- **O risco previsto aconteceu:** o primeiro `emulators:start` falhou por causa do
  JDK keg-only. Mas a causa era mais sutil que o previsto — o script checava
  `command -v java`, e o macOS tem um **stub** em `/usr/bin/java` que satisfaz essa
  checagem e falha ao executar. O teste passou a ser rodar `java -version`.
  Presença de binário não é funcionamento.
- **Segundo defeito, no caminho de erro:** com nenhum JDK, o script morria com
  `unbound variable` (array vazio sob `set -u`) em vez de mostrar a instrução. Foi
  para conseguir **testar** esse caminho que a lista de candidatos virou
  `JDK_CANDIDATOS` sobrescrevível — caminho de erro que ninguém exercita é caminho
  de erro que mente.
- **Trava contra projeto real de graça:** o id `demo-bolao` faz o Firebase tratar o
  projeto como demonstração, e o SDK **nunca** fala com serviço real. Apontar para
  projeto de verdade exige `PERMITIR_PROJETO_REAL=true`.
- **As rules começam `if false`**, com 4 casos de `@firebase/rules-unit-testing`
  provando — inclusive que `withSecurityRulesDisabled` semeia dado, que é o que
  `MG-2` e `MG-3` vão usar para testar leitura.
