Capacidades
Antes de pensar em telas, pense em capacidades. Cada capability é um verbo + outcome testável, executável em qualquer surface — tela web, app mobile, API REST, ferramenta MCP pra agente, chatbot, voz. São 16 capacidades agrupadas em 6 grupos. Pra mapeamento UI legado, veja Mapa de Telas.
Por que capability-first? Telas eram o default de escopo de SaaS entre 2000–2010 porque cliente fechava contrato por número de telas entregues. Hoje a mesma capability “Cliente assina recorrência” se manifesta em 5 surfaces: web, mobile, MCP tool para agente, chatbot, voz. Modelar por capability é futureproof — a tela vira uma manifestação possível, não o unit de escopo.
G1 · Aquisição (Visitante)
Seção intitulada “G1 · Aquisição (Visitante)”G2 · Conversão em Cliente (Visitante → Cliente)
Seção intitulada “G2 · Conversão em Cliente (Visitante → Cliente)”G3 · Autoatendimento (Cliente)
Seção intitulada “G3 · Autoatendimento (Cliente)”G4 · Operação Recorrente (Sistema)
Seção intitulada “G4 · Operação Recorrente (Sistema)”G5 · Governança (Admin)
Seção intitulada “G5 · Governança (Admin)”G6 · Backstage (TBD — 🟥 crítico)
Seção intitulada “G6 · Backstage (TBD — 🟥 crítico)”Arquitetura — Application Layer por capability
Seção intitulada “Arquitetura — Application Layer por capability”Premissa sênior: cada capability acima vira um use-case independente na pasta application/. Cada provider externo (gateway, CEP, e-mail, logística, catálogo) vira uma interface em infrastructure/ com um adapter default. Isso converte 3 dos 21 edge cases abertos (gateway · provider e-mail · provider logística) de “blockers de produto” em “swap de adapter” — reversível em ~1 dia cada.
apps/master-espresso/ ├── src/ │ ├── domain/ ← entidades + invariantes + state machine │ │ ├── assinatura.ts ← Pendente/Ativa/Inadimplente/Suspensa/Cancelada/AguardandoConfirmacao │ │ ├── cliente.ts ← persona: Visitante/ExCliente/ClienteAtivo │ │ ├── pedido.ts ← ciclo + itens cesta + entrega │ │ ├── maquina-comodato.ts ← nº série, status, prazo devolução │ │ └── catalogo.ts ← SKU café/bebida/complemento/máquina │ │ │ ├── application/ ← 1 use-case por capability (16) │ │ ├── g1-aquisicao/ │ │ │ ├── adicionar-ao-carrinho.ts ← C1 │ │ │ ├── escolher-maquina-comodato.ts ← C2 │ │ │ └── aceitar-termos-e-submeter.ts ← C3 │ │ ├── g2-conversao/ │ │ │ ├── validar-endereco-entrega.ts ← C4 (usa CepValidator) │ │ │ ├── criar-conta-cliente.ts ← C5 (usa Auth) │ │ │ └── ativar-assinatura.ts ← C6 (usa PaymentGateway) │ │ ├── g3-autoatendimento/ │ │ │ ├── consultar-status.ts ← C7 │ │ │ ├── atualizar-dados-cadastrais.ts ← C8 │ │ │ └── alterar-cesta-proximo-ciclo.ts ← C9 │ │ ├── g4-operacao-recorrente/ │ │ │ ├── executar-ciclo-cobranca.ts ← C10 (PaymentGateway + Notifier) │ │ │ ├── despachar-pedido.ts ← C11 (LogisticsProvider) │ │ │ └── enviar-notificacoes-recorrentes.ts ← C12 (Notifier) │ │ ├── g5-governanca/ │ │ │ ├── suspender-cancelar-assinatura.ts ← C13 │ │ │ ├── consultar-kpis.ts ← C14 │ │ │ └── forcar-cobranca.ts ← C15 (guard duplo EC-10) │ │ └── g6-backstage/ │ │ └── publicar-catalogo.ts ← C16 (CatalogStore — TBD) │ │ │ └── infrastructure/ ← adapters trocáveis │ ├── payment-gateway/ │ │ ├── interface.ts ← PaymentGateway │ │ ├── asaas.ts ← default (ASSUMPTION-01) │ │ └── stripe.ts ← alternativa arquivada │ ├── cep-validator/ │ │ ├── interface.ts ← CepValidator │ │ ├── viacep.ts ← default │ │ └── local-fallback.ts ← cache + manual │ ├── notifier/ │ │ ├── interface.ts ← Notifier │ │ ├── resend.ts ← default e-mail (EC-17) │ │ └── twilio-sms.ts ← deferred │ ├── logistics-provider/ │ │ ├── interface.ts ← LogisticsProvider │ │ ├── melhor-envio.ts ← default (EC-12) │ │ └── csv-import.ts ← MVP fallback manual │ ├── catalog-store/ │ │ ├── interface.ts ← CatalogStore │ │ ├── json-seed.ts ← default MVP (EC-11) │ │ └── supabase-cms.ts ← deferred (CMS futuro) │ └── auth/ │ ├── interface.ts ← AuthProvider │ └── supabase-auth.ts ← default (magic link)
DOMAIN
- Entidades + state machine (já modelada)
- Invariantes — checados na entidade, não na DB
- Zero deps em provider externo
- Test puro com fixtures
APPLICATION
- 1 use-case = 1 capability
- Entrada explícita (DTO) → saída (DTO ou evento)
- Orquestra domain + chama interfaces de infra
- Testável com mocks dos providers
INFRASTRUCTURE
- Adapter por provider externo
interface.tsfixa o contrato- Swap = mudar import + DI; zero mudança em
application/ - Mocks pra teste em
infrastructure/mocks/
Pay-off MVP: dos 21 edge cases, 3 (EC-02 gateway · EC-12 logística · EC-17 e-mail provider) viram “escolha de adapter” em vez de “blocker de produto”. Time pode entregar Fase 1 sem confirmação de Cliente Master Espresso nesses 3 — Asaas/Melhor Envio/Resend são defaults que rodam, troca depois custa ~1 dia cada.
🗂️ Mapa de Telas (auxiliar) — 13 telas por fluxo
Visão UI legada (paradigma 2010 do BRIEF). Mantida como referência para designers/devs. A visão primária é capability-first (acima) porque tela = uma manifestação possível de uma capability — a mesma “Cliente alterou cesta” pode aparecer em tela web, app mobile, MCP, chatbot ou voz. Página completa com funcionalidades por tela: /escopo/.
| Fluxo | Telas | Capacidades servidas |
|---|---|---|
| E-commerce onboarding | T1, T2, T3, T4, T5, T6, T7 | C1–C6 |
| Painel Cliente | Dashboard, Dados Cadastrais, Alteração Recorrência | C7–C9 |
| Painel Admin | Dashboard Admin, Gestão Assinaturas, Gestão Clientes | C13–C15 |