# Execução — `MG-1` Projeto Firebase e emuladores local

**Plano:** `MG-1-plano.md` · **Data:** 07/08/2026
**Ambiente:** `bolao-firebase/`, emuladores locais (Firestore 8080, Auth 9099,
Functions 5001), `firebase-tools` 15.26.0 pinado como devDependency.

**Resultado: 10/10 ✅** — e **dois defeitos encontrados no próprio script**, os
dois no caminho de erro.

| ID | Resultado | Onde |
| -- | --------- | ---- |
| MG-1-01 | ✅ | `emulators:exec --only firestore` sai com código 0 |
| MG-1-02 | ✅ | `emulators:exec --only firestore,auth` + Functions carregadas |
| MG-1-03 | ✅ | `npm --prefix functions run build` limpo |
| MG-1-04 | ✅ **corrigido** | ver abaixo |
| MG-1-05 | ✅ **corrigido** | `JDK_CANDIDATOS="" ./scripts/firebase.sh …` |
| MG-1-06 | ✅ | `FIREBASE_PROJETO=bolao-producao` → recusado |
| MG-1-07 | ✅ | a recusa cita `PERMITIR_PROJETO_REAL=true` |
| MG-1-08 | ✅ | `functions/src/rules-fechadas.spec.ts`, 4 casos |
| MG-1-09 | ✅ | mesmo arquivo, caso do contexto privilegiado |
| MG-1-10 | ✅ | `git check-ignore` em `node_modules` e `functions/lib` |

## Defeito 1 — `command -v java` mente no macOS

O script checava a existência do binário. No macOS existe um **stub** em
`/usr/bin/java` que satisfaz `command -v` e **falha ao executar**, com a mesma
mensagem de "Java não instalado". Resultado: o resolvedor de PATH nunca era
acionado, e o emulador continuava falhando exatamente como falharia sem script
nenhum.

Corrigido: o teste passou a ser **executar** (`java -version >/dev/null 2>&1`), não
verificar presença. Lição que vale além daqui: presença de binário não é
funcionamento.

## Defeito 2 — o caminho de erro morria antes de explicar

Ao testar "nenhum JDK encontrado", o script morria com `unbound variable` em vez de
mostrar a mensagem útil: `set -u` trata array vazio como variável não definida.
Um caminho de erro que quebra antes de falar é pior que não ter caminho de erro —
a pessoa recebe um traço de bash em vez da instrução.

Corrigido com a expansão guardada (`"${arr[@]+${arr[@]}}"`). E foi só para
**testar** esse caminho que a lista de candidatos virou `JDK_CANDIDATOS`
sobrescrevível: caminho de erro que ninguém consegue exercitar é caminho de erro
que mente.

## Observações

- **O `demo-` no id do projeto não é convenção nossa, é do Firebase:** projeto com
  esse prefixo nunca fala com serviço real. Usar isso como trava sai de graça e é
  mais forte que qualquer verificação nossa.
- **As rules começam `if false`** e há teste provando. As stories `MG-2` e `MG-3`
  vão abrir o que precisa, caso por caso, com o teste de rule já funcionando.
- **Nada disso exigiu plano Blaze**, confirmando a descoberta do spike: a migração
  pode ser construída e verificada inteira antes de qualquer decisão de cobrança.
- Pendência conhecida: o `npm` 11 bloqueou install scripts de `protobufjs` e `re2`
  (dependências do `firebase-tools`). A CLI e os emuladores funcionam assim; se
  algum comando reclamar de módulo nativo, é aqui que se olha.
