Os fluxos que o v0.1.0 entrega.

Quatro fluxos navegáveis, feitos com as telas já desenhadas no protótipo v4 e ligados ao contrato do quero-apoiar-api no estado de hoje (MVP RBAC). O que o protótipo já tinha e o backend ainda não sustenta continua no pacote, escondido atrás de feature flag.

Os quatro fluxos

Cada tela abre de verdade. Com FLAGS.MOCK = true (padrão), o pacote responde sozinho, no mesmo contrato do §3 do handoff; com false, fala com a API em .

O que ficou atrás de feature flag

Nada do protótipo foi jogado fora. Estas telas e blocos continuam no código, desligados em assets/js/config.js. Para ver onde cada um aparece, abra qualquer página com ?flags=1: o que está OFF fica visível, apagado e etiquetado.

TELA OU BLOCO DO PROTÓTIPOFLAGENTRA EMPOR QUÊ AINDA NÃO
Código de 6 números no WhatsApp (T04, T05, T06)WHATSAPP_OTPOnda 1 · F1/F2O MVP entrou com senha; o passwordless voltou para a Onda 1 (D01 revertida).
Selo de número não verificado em T07VERIFICACAO_NUMEROOnda 1 · F2Depende do fluxo de confirmação por WhatsApp.
Escape de 3 minutosESCAPE_3MINOnda 1 · F1Sem verificação de número não existe o que escapar.
Retomar rascunho de 48 horasRASCUNHO_48HOnda 1 · M1O register atual é uma chamada só, sem rascunho no servidor.
Quem eu trouxe (lista de indicados)QUEM_EU_TROUXEOnda 1 · M5/me devolve só o directCount, não a lista.
Árvore da redeARVORE_REDEOnda 1 · M3Sem endpoint de rede.
Materiais da campanhaMATERIAISOnda 1 · M4Sem endpoint de materiais nem engagement_events.
Meta, conquista e recomeçoMETAS_CONQUISTASOnda 2Sem metas por apoiador na API.
Eventos e presençaEVENTOS_PRESENCAOnda 2Sem módulo de eventos.
Mandar recado pra rede (disparos)DISPAROS_WHATSAPPOnda 2Sem módulo de disparo, orçamento ou aprovação.
Meus dados, sair da rede, apagar cadastroLGPD_AUTOATENDIMENTOOnda 1 · M10Sem endpoints de consentimento e exclusão.
Aplicativo de códigos (TOTP) e códigos de recuperaçãoADMIN_TOTPOnda 1 · M9admin/login só checa e-mail e senha no MVP.
Apoiadores e rede (busca, ficha, telefone)ADMIN_BUSCA_APOIADORESOnda 1 · M9Sem endpoint de busca de apoiadores.
Exportação auditada com motivoADMIN_EXPORTACAOOnda 1 · M9Sem endpoint de exportação nem audit_log exposto.
Relatórios R1..R4 em PDFADMIN_RELATORIOSOnda 1 · M9Sem endpoints de relatório.
Cadastro repetido: comparar e fundirADMIN_FUSAO_CADASTROSOnda 1 · M9Sem endpoint de fusão.

Antes de ligar na API de verdade

  1. CORS (§5.1) — o backend não chama app.enableCors(). Sem isso, o navegador bloqueia toda chamada a partir do Hosting. Liberar só o domínio custom de produção e localhost.
  2. PUBLIC_APP_URL (§5.2) — é o backend que monta a URL do convite. Precisa apontar para o domínio deste front, não para a API.
  3. Admin não é seedado (§5.3) — criar o registro em admin_users com hash argon2 e totp_secret placeholder antes de testar o Fluxo D.
  4. SUPPORTER_PASSWORD_CHANGE_REQUIRED (§5.4) — teste com true: é assim que o 403 de /me aparece e o Fluxo B fecha.
  5. Token em localStorage (§5.6) — aceito para o MVP; o CSP restritivo já vai no firebase.json.

Como rodar

# demonstração, sem backend
npx serve .            # ou: python3 -m http.server 5000

# contra a API de verdade
# 1) assets/js/config.js → FLAGS.MOCK = false
# 2) backend: npm run start:dev  (porta 3000, CORS liberado para http://localhost:5000)

# publicar
firebase deploy --only hosting

Rede de Apoiadores · v0.1.0 · telas do protótipo telas-rede-apoiadores_4.html · contrato de HANDOFF_FRONTEND.md (20/08/2026).