diff --git a/docs/BATERIA-DE-TESTES.md b/docs/BATERIA-DE-TESTES.md
new file mode 100644
index 0000000..0dc092f
--- /dev/null
+++ b/docs/BATERIA-DE-TESTES.md
@@ -0,0 +1,212 @@
+# Bateria de testes — Reem Notas (ambiente de teste)
+
+Roteiro de regressão para ser executado por um agente (inclusive modelos menores)
+com a skill `agent-browser`. Não é preciso conhecer o projeto: siga os casos na
+ordem e preencha o relatório do final.
+
+## Regras de segurança (leia antes de tudo)
+
+1. **Somente leitura + interações seguras.** É PROIBIDO:
+ - clicar em qualquer botão que abra confirmação (`Tem certeza?`, `Rebuscar o
+ plano?` etc.) — se a confirmação abrir por engano, cancele;
+ - finalizar, arquivar, excluir ou registrar pagamento de consolidação;
+ - criar, editar ou excluir usuários, perfis, contatos, grupos ou eventos;
+ - qualquer envio de WhatsApp/notificação.
+ - Formulários só podem ser preenchidos nos casos em que o roteiro mandar
+ explicitamente (login e campos de busca).
+2. **Ambiente**: `https://teste.reemtransportes.com.br` (nunca o domínio de
+ produção).
+3. **Avisos do ambiente de teste** (não são falhas):
+ - Não há pagamentos registrados (`pago_em` vazio) — gráficos e tabelas de
+ pagamento vazios são o esperado;
+ - O deploy é manual: o site pode estar atrás do código do repositório. Se um
+ caso falhar por algo que parece "código novo que não chegou lá", registre
+ como `DEPLOY?` em vez de `FALHOU`.
+4. Screenshots de evidência vão para o diretório de scratchpad da sessão.
+
+## Credenciais
+
+- **Admin (web)**: e-mail `admin@reem.com`, senha `Reem@2026!` — em
+ `https://teste.reemtransportes.com.br/auth/login`, aba "E-mail".
+- **Motorista**: aba "PIN Motorista" da mesma tela (PIN de 4 dígitos; se nenhum
+ PIN de teste for fornecido na tarefa, marque o caso 8 como `PULADO`).
+
+## Teste 0 — transversal (rodar em TODA página visitada)
+
+Depois de abrir cada página do roteiro, sempre rode:
+
+```bash
+agent-browser errors # deve vir vazio
+agent-browser network requests | grep -E " (4[0-9]{2}|5[0-9]{2})$" # deve vir vazio
+```
+
+- Qualquer erro de console JS ⇒ FALHOU (anote a mensagem).
+- Qualquer request com status ≥ 400 ⇒ FALHOU (anote a URL — um asset
+ `*_controller-*.js` com 404 significa Stimulus quebrado na página inteira; foi
+ exatamente assim que o bug do preview do romaneio passou despercebido).
+- Exceção: chamadas para domínios de terceiros (cloudflareinsights etc.) com
+ falha não reprovam o caso; registre como observação.
+
+## Roteiro
+
+### Caso 1 — Login por e-mail
+
+```bash
+agent-browser open https://teste.reemtransportes.com.br/auth/login
+agent-browser snapshot -i # localizar refs de E-mail, Senha e Entrar
+agent-browser fill @eX "admin@reem.com"
+agent-browser fill @eY "Reem@2026!"
+agent-browser press Enter
+agent-browser wait --load networkidle
+agent-browser get url
+```
+
+**PASSOU se**: a URL final é `/dashboard` (ou a home do perfil) e o Teste 0 passa.
+Obs.: use `press Enter` — o clique no botão às vezes não navega no primeiro clique.
+
+### Caso 2 — Dashboards
+
+```bash
+agent-browser open https://teste.reemtransportes.com.br/dashboard
+agent-browser eval "document.querySelectorAll('canvas').length" # gráficos Chart.js
+agent-browser eval "document.documentElement.scrollWidth <= window.innerWidth" # sem overflow horizontal
+agent-browser screenshot dashboard.png
+agent-browser open https://teste.reemtransportes.com.br/dashboard/operacoes
+# repetir os três comandos acima (operacoes.png)
+```
+
+**PASSOU se**: as duas páginas carregam, há pelo menos 1 `canvas` em cada, sem
+overflow horizontal, Teste 0 limpo.
+
+**Versão mobile** (obrigatória no dashboard):
+
+```bash
+agent-browser set device "iPhone 16"
+agent-browser open https://teste.reemtransportes.com.br/dashboard
+agent-browser eval "document.documentElement.scrollWidth <= window.innerWidth"
+agent-browser screenshot dashboard-mobile.png
+agent-browser set viewport 1280 800 # voltar ao desktop
+```
+
+**PASSOU se**: sem scroll horizontal no mobile (regra do projeto: nada de tabela
+que exija zoom).
+
+### Caso 3 — Consolidações (abas e filtros)
+
+```bash
+agent-browser open "https://teste.reemtransportes.com.br/consolidacoes?visao=lista"
+agent-browser snapshot -i | head -40
+agent-browser open "https://teste.reemtransportes.com.br/consolidacoes?visao=motoristas"
+agent-browser get url
+```
+
+**PASSOU se**: as duas visões abrem sem erro; ao trocar de visão os filtros da URL
+se mantêm (as visões são abas da MESMA tela, não telas separadas); Teste 0 limpo.
+
+### Caso 4 — Romaneios (inclui o preview)
+
+```bash
+agent-browser open https://teste.reemtransportes.com.br/admin/romaneios
+agent-browser snapshot -i | head -30 # lista de romaneios
+# abrir o primeiro romaneio da lista (link do item):
+agent-browser click @eX
+agent-browser wait --load networkidle
+```
+
+Na tela do romaneio:
+
+```bash
+# 4a. O modal de prévia NÃO pode estar visível no carregamento:
+agent-browser eval "const o=document.querySelector('[data-romaneio-target=overlay]'); o?getComputedStyle(o).display:'sem overlay'"
+# esperado: "none"
+
+# 4b. Abrir a prévia:
+agent-browser snapshot -i | grep -i "prévia" # achar o botão "Ver prévia do PDF"
+agent-browser click @eY
+agent-browser eval "const o=document.querySelector('[data-romaneio-target=overlay]'); getComputedStyle(o).display + ' src:' + (document.querySelector('iframe[data-romaneio-target=preview]')?.src||'')"
+# esperado: "flex src:https://.../pdf?veiculo=..."
+
+# 4c. Fechar com Esc:
+agent-browser press Escape
+agent-browser eval "getComputedStyle(document.querySelector('[data-romaneio-target=overlay]')).display"
+# esperado: "none"
+
+# 4d. PDF responde:
+agent-browser eval "fetch(document.querySelector('a[href*=pdf]').href).then(r=>r.status)"
+# esperado: 200
+```
+
+**PASSOU se**: 4a="none", 4b="flex" com src preenchido, 4c="none", 4d=200,
+Teste 0 limpo. **NÃO** clicar em "Reimportar plano" (tem confirmação).
+
+### Caso 5 — Planilha SimpliRoute
+
+```bash
+agent-browser open https://teste.reemtransportes.com.br/admin/planilha_simpli_route
+agent-browser snapshot -i | head -20
+```
+
+**PASSOU se**: a tela abre com a lista de operações disponíveis, Teste 0 limpo.
+(Não é preciso baixar o arquivo.)
+
+### Caso 6 — Telas de admin
+
+Abrir cada URL e rodar o Teste 0:
+
+```
+/admin/usuarios
+/admin/perfis
+/admin/configuracoes
+/admin/auditoria_logs
+/admin/edicao_lancamento
+```
+
+**PASSOU se**: todas abrem com conteúdo (título + tabela/cards), sem erro.
+**NÃO** editar nada nessas telas.
+
+### Caso 7 — Notificações
+
+Abrir cada URL e rodar o Teste 0:
+
+```
+/admin/contatos
+/admin/grupos
+/admin/eventos
+/admin/envios
+```
+
+**PASSOU se**: todas abrem, sem erro. **NÃO** disparar envio nem mexer no
+WhatsApp/sessão.
+
+### Caso 8 — Login PIN do motorista (mobile)
+
+Somente se um PIN de teste foi fornecido na tarefa; senão marcar `PULADO`.
+
+```bash
+agent-browser set device "iPhone 16"
+agent-browser open https://teste.reemtransportes.com.br/auth/login
+# clicar na aba "PIN Motorista", digitar o PIN, entrar
+```
+
+**PASSOU se**: cai no dashboard do motorista, valores legíveis sem zoom,
+Teste 0 limpo. Ao final: `agent-browser set viewport 1280 800`.
+
+## Relatório final (obrigatório)
+
+Terminar a execução com uma tabela e a lista de falhas:
+
+| Caso | Resultado | Evidência |
+|------|-----------|-----------|
+| 0 (por página) | PASSOU/FALHOU | página + erro |
+| 1 Login | PASSOU/FALHOU/DEPLOY?/PULADO | screenshot |
+| 2 Dashboards | … | … |
+| 3 Consolidações | … | … |
+| 4 Romaneios/preview | … | … |
+| 5 Planilha | … | … |
+| 6 Admin | … | … |
+| 7 Notificações | … | … |
+| 8 PIN motorista | … | … |
+
+Depois da tabela, listar **somente as falhas**, cada uma com: URL, o que era
+esperado, o que aconteceu (mensagem de erro/console) e o caminho do screenshot.
+Se tudo passou, dizer isso em uma linha. Encerrar com `agent-browser close`.