## AC-1 — Cadastro com e-mail, senha e nome de exibição

**PRD:** `docs/prd/identificacao-e-acesso.md`

**Como** convidado que abriu o link do bolão, **quero** criar minha conta com
o mínimo de campos, **para** começar a palpitar sem perder a rodada em que
fui convidado.

**Prioridade:** Must — bloqueia CC-5 e PP-1, as posições #4 e #5 do backlog.

**Critérios de aceite:**

- Dado que informo e-mail, senha e nome de exibição válidos, quando me
  cadastro, então a conta é criada e eu fico identificado no app.
- Dado que vim de um link de convite, quando termino o cadastro, então caio
  **no bolão daquele convite**, não numa tela inicial genérica.
- Dado que informo um e-mail já cadastrado, então o cadastro é recusado com
  mensagem que aponta para o login, sem revelar mais que isso.
- Dado que informo e-mail malformado ou senha abaixo do mínimo, então o
  cadastro é recusado com erro no próprio campo.
- Dado que meu cadastro foi criado, então minha senha não pode ser recuperada
  em texto nem aparecer em log.
- Dado que estou com conexão ruim, quando o cadastro falha por rede, então o
  que eu digitei não é perdido.

**Tasks:**

_Backend_
- [x] `BE-1` Modelar conta: e-mail único, senha com hash, nome de exibição
- [x] `BE-2` Endpoint de cadastro com validação de e-mail e política de senha (depende de BE-1)
- [x] `BE-3` Recusar e-mail duplicado sem vazar se a conta existe além do necessário (depende de BE-2)
- [x] `BE-4` Garantir que senha não apareça em log nem em resposta (depende de BE-2)

_Mobile_
- [x] `FE-1` Tela de cadastro com os três campos e nada além disso
- [x] `FE-2` Validação por campo alinhada à do servidor (depende de BE-2)
- [x] `FE-3` Preservar o que foi digitado quando o envio falha por rede
- [x] `FE-4` Ao concluir vindo de convite, seguir direto para o bolão (depende de CC-5 BE-1)

_QA_
- [x] `QA-1` Escrever o plano de casos de teste a partir desta story
- [x] `QA-2` Executar o plano com e-mail duplicado, senha fraca, conexão caindo e entrada via convite

**Riscos/Dependências:**

- **Está no caminho crítico do convite** — cada campo a mais é participante
  que não entra, e o casual chega com o prazo estourando.
- **Pergunta aberta que afeta esta story:** confirmação de e-mail é
  obrigatória antes de palpitar? Se for, ela entra no caminho crítico e o
  convidado pode não conseguir palpitar na rodada em que foi convidado. Esta
  story **não** implementa o bloqueio por confirmação — se a decisão for
  exigir, é escopo adicional.
- Depende de serviço de e-mail (ainda não escolhido) só se a confirmação for
  exigida.

- **06/08:** quem chega por convite vê, no cadastro **e** no login, o aviso de que
  o convite continua valendo — e entra no bolão na sequência, sem voltar ao
  WhatsApp para copiar o código. Depende do deep link (`CC-5 FE-1`), que é o que
  dá ao app o sinal de "vindo de convite"; antes dele esta task não tinha como ser
  feita.

- **07/08 — QA:** plano em `docs/testes/AC-1-plano.md`, execução em
  `docs/testes/AC-1-execucao.md` (**12/12 ✅**). Um caso novo: o digitado sobrevive
  à falha **de rede**, não só à de validação — que era o que estava coberto. Sem
  recuperação de senha nesta versão, quem desiste no cadastro desiste do convite.
