Pular para o conteúdo

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 → BLOCK

RN-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_4

RN-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 → desabilita

RN-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 == true

RN-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 mensal

RN-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 → oculto

RN-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 multa

RN-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_reposicao

RN-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 reversa

RN-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 → permitir

RegraTela de aplicaçãoTestável
Validação de CEP Grande SPT06 Cadastro + T09 Dados Cadastrais⚠️ base Grande SP não definida
Tela 4 condicionalT04 Escolha da Máquina⚠️ “novo cliente” ambíguo
Checkbox de termosT05 Revisão e Termos
Pagamento recorrenteT07 Pagamento e Confirmação
Alteração aplica próximo mêsT10 Alteração de Recorrência⚠️ data de corte não definida
Ações adminT12 Gestão de Assinaturas⚠️ máquina de estados ausente
termos_aceito == true  →  botao_fechar_pedido.disabled = false
termos_aceito == false →  botao_fechar_pedido.disabled = true
gateway.suporta_recorrencia == true
gateway.tipo_cobranca == "recorrente"
assinatura.ciclo == "mensal"

6 componentes ativos — todos decididos firmes. Gateway Pagar.me ratificado por Gabriel em 2026-06-09 (Lane X research).

ComponenteTecnologiaStatus
Next.js 15 + TypeScriptNext.js 15 (App Router + Server Actions)✅ decidido
Tailwind CSS v4Tailwind CSS v4 (Oxide engine + CSS-first config)✅ decidido
Shadcn/uiShadcn/ui (Radix UI + Tailwind v4)✅ decidido
SupabaseSupabase (PostgreSQL + Auth)✅ decidido
Pagar.me (Pix Automático + cartão recorrente)Pagar.me✅ decidido
ViaCEPViaCEP API✅ decidido

Detalhe completo + justificativa por componente + alternativas

Página dedicada com justificativa técnica, alternativas consideradas e bloqueio por fase: /stack/.