Regras & Stack
11 regras — 3 testáveis agora, 8 com critério pendente de esclarecimento. 6 componentes stack abaixo (cluster).
RN-01 — Validação de CEP restrito à Grande SP
Tipo: restricao_geografica | Testável: ⚠️ não (critério ambíguo)
CEP informado deve pertencer à base da Grande São Paulo; caso contrário bloquear pedido. Enforcement em T06 (cadastro) e T09 (edição)
Acionador: usuario submete CEP no cadastro ou edição de endereço de entrega
Resultado esperado:
cep_validacao.regiao == 'grande_sp' → PASS | else → BLOCKRN-02 — Tela 4 só para novo cliente
Tipo: condicional_render | Testável: ⚠️ não (critério ambíguo)
Tela de Escolha da Máquina renderiza apenas para visitante deslogado ou cadastro novo sem assinatura ativa. Cliente existente com máquina ativa pula tela
Acionador: usuario avança do step 3 no fluxo de onboarding
Resultado esperado:
cliente.status == 'novo' → renderizar_tela_4 | cliente.status == 'existente_com_maquina' → skip_tela_4RN-03 — Checkbox de termos obrigatório
Tipo: validacao | Testável: ✅ sim
Botão Fechar Pedido fica desabilitado até checkbox de Termos da Assinatura ser marcado
Acionador: usuario tenta clicar em Fechar Pedido sem marcar termos
Resultado esperado:
termos_aceito == true → habilita_botao_fechar_pedido | else → desabilitaRN-04 — Pagamento recorrente via Pix ou cartão
Tipo: fluxo_pagamento | Testável: ✅ sim
Assinatura cobrada mensalmente — assinante escolhe Pix Automático (cobrança recorrente Bacen) ou cartão de crédito tokenizado. Gateway suporta os dois fluxos na mesma API.
Acionador: usuario escolhe método (Pix ou cartão) e confirma em T07
Resultado esperado:
assinatura.ciclo == 'mensal'; gateway.tipo_cobranca == 'recorrente'; gateway.metodo ∈ {'pix_automatico', 'cartao_recorrente'}; gateway.suporta_recorrencia == trueRN-05 — Alteração de recorrência aplica no próximo mês
Tipo: recorrencia | Testável: ⚠️ não (critério ambíguo)
Alterações na cesta de produtos salvadas pelo cliente em T10 aplicam no ciclo do próximo mês, não no atual
Acionador: cliente salva alteração de recorrência em Tela 10
Resultado esperado:
alteracoes_pendentes enfileiradas; aplicadas no próximo ciclo de cobrança mensalRN-06 — Admin pode Suspender/Cancelar/Forçar Cobrança
Tipo: permissao_admin | Testável: ⚠️ não (critério ambíguo)
Ações operacionais de suspender, cancelar e forçar cobrança disponíveis apenas para usuários com role admin em T12
Acionador: usuario acessa Gestão de Assinaturas
Resultado esperado:
usuario.role == 'admin' → acoes_operacionais_habilitadas (suspender, cancelar, forcar_cobranca) | else → ocultoRN-07 — Prazo mínimo de assinatura (comodato)
Tipo: contratual_comodato | Testável: ⚠️ não (critério ambíguo)
Cliente que usa máquina em comodato deve manter assinatura ativa por N meses; cancelamento antecipado paga multa proporcional. Valor e prazo a definir com o Cliente Master Espresso
Acionador: cliente solicita cancelamento via T8' Self-service ou Admin via T12
Resultado esperado:
ciclo_count(assinatura) < PRAZO_MIN_COMODATO → multa = (PRAZO_MIN - ciclo_count) × FATOR | else → sem multaRN-08 — Seguro de máquina em comodato
Tipo: contratual_comodato | Testável: ⚠️ não (critério ambíguo)
Responsabilidade por dano, furto ou roubo da máquina em comodato. Opções: embutido na mensalidade, opcional, ou totalmente do cliente. Indefinido no BRIEF
Acionador: cliente reporta sinistro ou máquina não devolvida pós-cancelamento
Resultado esperado:
regra_seguro == 'embutido' → reposicao_sem_custo | 'opcional+contratado' → reposicao | 'cliente' → cobrar_valor_reposicaoRN-09 — Substituição/troca de modelo de máquina
Tipo: contratual_comodato | Testável: ⚠️ não (critério ambíguo)
Cliente pode trocar modelo de máquina durante a vigência? Após quanto tempo? Diferença de mensalidade aplicada como? Indefinido no BRIEF
Acionador: cliente solicita troca de modelo via T8' Self-service
Resultado esperado:
TBD — pré-condições + ajuste de mensalidade + logística reversaRN-10 — Prazo de devolução pós-cancelamento
Tipo: contratual_comodato | Testável: ⚠️ não (critério ambíguo)
Após cancelamento, cliente tem N dias para devolver máquina. Expirado o prazo, multa por não-devolução é aplicada + máquina marcada como retida indevidamente
Acionador: evento `Assinatura cancelada` dispara timer de devolução
Resultado esperado:
tempo_pos_cancelamento > PRAZO_DEVOLUCAO → evento `Prazo de devolução expirado` + `Multa de comodato aplicada`RN-11 — Cesta vazia bloqueia checkout
Tipo: validacao_carrinho | Testável: ✅ sim
Pedido não pode ser fechado com carrinho sem nenhum item de café. Mínimo: 1 SKU de café. Bebidas e complementos opcionais
Acionador: usuario tenta avançar de T05 para T06 com cesta sem café
Resultado esperado:
carrinho.itens_cafe.length == 0 → bloquear_avanco + msg('Adicione pelo menos 1 café') | else → permitirMatriz de cobertura por tela
Seção intitulada “Matriz de cobertura por tela”| Regra | Tela de aplicação | Testável |
|---|---|---|
| Validação de CEP Grande SP | T06 Cadastro + T09 Dados Cadastrais | ⚠️ base Grande SP não definida |
| Tela 4 condicional | T04 Escolha da Máquina | ⚠️ “novo cliente” ambíguo |
| Checkbox de termos | T05 Revisão e Termos | ✅ |
| Pagamento recorrente | T07 Pagamento e Confirmação | ✅ |
| Alteração aplica próximo mês | T10 Alteração de Recorrência | ⚠️ data de corte não definida |
| Ações admin | T12 Gestão de Assinaturas | ⚠️ máquina de estados ausente |
Regras testáveis agora (sem ambiguidade)
Seção intitulada “Regras testáveis agora (sem ambiguidade)”RN-03 — Checkbox de termos
Seção intitulada “RN-03 — Checkbox de termos”RN-04 — Gateway com suporte a recorrência
Seção intitulada “RN-04 — Gateway com suporte a recorrência”Stack tecnológica (cluster)
Seção intitulada “Stack tecnológica (cluster)”6 componentes ativos — todos decididos firmes. Gateway Pagar.me ratificado por Gabriel em 2026-06-09 (Lane X research).
| Componente | Tecnologia | Status |
|---|---|---|
| Next.js 15 + TypeScript | Next.js 15 (App Router + Server Actions) | ✅ decidido |
| Tailwind CSS v4 | Tailwind CSS v4 (Oxide engine + CSS-first config) | ✅ decidido |
| Shadcn/ui | Shadcn/ui (Radix UI + Tailwind v4) | ✅ decidido |
| Supabase | Supabase (PostgreSQL + Auth) | ✅ decidido |
| Pagar.me (Pix Automático + cartão recorrente) | Pagar.me | ✅ decidido |
| ViaCEP | ViaCEP API | ✅ decidido |
Detalhe completo + justificativa por componente + alternativas
Página dedicada com justificativa técnica, alternativas consideradas e bloqueio por fase: /stack/.