# Execução — plano `AC-3` (06/08)

**Veredito: ✅ Aprovado** — 12 de 12 casos.

| Caso | Resultado | Evidência |
| ---- | --------- | --------- |
| AC-3-01 | passou | `test/sessao.e2e-spec.ts` — `AC-3-01` (novo): refresh não em texto |
| AC-3-02 | passou | `test/sessao_offline_test.dart` + device |
| AC-3-03 | passou | `test/sessao_offline_test.dart` |
| AC-3-04 | passou | idem — limpa access, refresh **e** a conta em cache |
| AC-3-05 | passou | `test/sessao.e2e-spec.ts` — rotação |
| AC-3-06 | passou | idem |
| AC-3-07 | passou | idem — logout invalida o access na hora |
| AC-3-08 | passou | idem — idempotente |
| AC-3-09 | passou | idem — devices independentes |
| AC-3-10 | passou | `test/sessao.e2e-spec.ts` — `AC-3-10` (novo) |
| AC-3-11 | passou | idem — `AC-3-11` (novo) |
| AC-3-12 | passou | `test/rascunho_offline_test.dart` — `AC-3-12` (novo) |

## Lacunas que a execução expôs

Três casos de **segurança** não tinham cobertura, todos no mesmo tema: o que
acontece com credencial que deveria estar morta.

- **`AC-3-10`** — renovar com o refresh de uma sessão **já revogada** pelo logout.
  Se funcionasse, o logout seria decorativo: bastaria guardar o refresh antes de
  sair. Passou, e o teste também confirma que nenhuma sessão nova é criada no
  caminho.
- **`AC-3-11`** — token válido de conta **apagada**. É o caminho mais fácil de
  derrubar o guard com exceção não tratada e devolver 500 em vez de 401. Passou
  com 401.
- **`AC-3-01`** — o refresh não fica em texto no banco. Já havia teste de que o
  token não é o hash; acrescentei a checagem de que o hash não é **prefixo** do
  token, que é o jeito de um hash truncado passar pelo teste ingênuo.

## Erro meu no plano, corrigido na execução

Escrevi `AC-3-10` presumindo que o logout se identifica pelo **access token** no
header. Ele usa o **refresh no corpo** — e essa é a escolha certa: é o refresh que
está gravado (hasheado) e portanto revogável. O access é um JWT, que não existe no
banco para ser revogado. Corrigi o caso.

## Nota sobre o defeito já corrigido

`AC-3-03` (cold start sem rede) está no plano porque **falhou de verdade** mais
cedo em 06/08: os dois ramos do `restaurar()` deslogavam, contrariando o próprio
comentário do código. Sem recuperação de senha nesta versão, deslogar por rede
ruim pode custar a conta e o histórico. O caso fica aqui para a regressão ter
nome.
