Skip to main content
Documento interno da sessão noturna de 26/04. Para guia do usuário, veja:

Resumo executivo

14 commits no main, 6 migrations Supabase remotas, 1 deploy bloqueado por CVE.
BlocoCommitsMigrationsStatus
Spec + plan PR193bc17f, 7a1707d, 12332c4docs
PR1 — seed despesas + 5 íconesfad5264, 689e4e6add_slug_to_categorias, seed_categorias_sistema_despesas, cleanup_categorias_sistema_duplicadas✅ produção
CVE Next.js (bloqueou deploy)6392afa✅ patched 15.2.4 → 15.2.8
Spec + plan PR2e329dafdocs
PR2 — subcategorias + receita + arquivar242f806, 682e5e4, e1e3af9, a6c84f5, 10ceecd, fe5440f, 9fe1cebpr2_categorias_subcategoria_receita_arquivadas, pr2_seed_categorias_receita, pr2_relatorio_receita_categoria✅ produção
PR2 fixes pós-reviewafa3f56✅ produção
Bugfix CNPJ + origem receita5008efcfix_receitas_origem_check_aceita_todas_16✅ produção

1. PR1 — Seed 21 despesas sistema + 5 ícones lucide

O que mudou

  • Coluna slug text NULL em categorias + UNIQUE INDEX parcial onde sistema=true (idempotência)
  • INSERT de 21 categorias tipo='gasto' seedadas como sistema=true (Alimentação, Assinaturas e serviços, Bares e restaurantes, Casa, Compras, Cuidados pessoais, Dívidas e empréstimos, Educação, Família e filhos, Impostos e Taxas, Investimentos, Lazer e hobbies, Mercado, Outros, Pets, Presentes e doações, Roupas, Saúde, Trabalho, Transporte, Viagem)
  • 5 ícones lucide novos no LUCIDE_REGISTRY: Banknote, Coins, Landmark, Percent, Sparkles
    • Nota histórica: spec original previa HandCoins mas não existe em lucide-react@0.303 (foi adicionado em ~0.330+). Substituído por Receipt (já no registry) pra “Dívidas e empréstimos”. Bumar lucide foi descartado pra não quebrar 49 ícones existentes.
  • Cleanup: 6 antigas duplicadas exatas (Alimentação/Educação/Mercado/Outros/Saúde/Transporte sem slug, do seed pré-26/04) foram soft-deletadas (deletado=true) após remap de 19 gastos + 2 parcelas pras novas equivalentes. Categorias B2B antigas (Marketing, Funcionários, Almoço equipe, Frete, Sistemas SaaS, Streaming etc) preservadas.

Inspiração

Raio-x do Organizze (líder de finanças PF no BR) feito mais cedo no dia mostrou que catálogo pré-seedado é gap real: usuário novo abre /configuracoes/categorias e não vê tela em branco mais.

Spec / Plan

  • Spec: docs/superpowers/specs/2026-04-26-categorias-seed-subcategoria-receita-design.md
  • Plan: docs/superpowers/plans/2026-04-26-categorias-pr1-seed-despesas.md

2. CVE Next.js bloqueou deploy do PR1 (causa: vulnerabilidade RCE)

Sintoma

Deploy 689e4e6 (PR1) ficou com bolinha vermelha no Vercel mesmo build sucesso. Deploy verde anterior não foi promovido a produção automaticamente.

Causa real

Next.js 15.2.4 tem CVE crítica RCE em React Server Components (CVE-2025-66478 / React CVE-2025-55182 / GHSA-9qr9-h5gf-34mp). Vercel bloqueia auto-promote de deploys que rodam Next vulnerável. Bot Vercel abriu PR #31 sugerindo o fix.

Fix

Bump de next 15.2.415.2.8 em package.json + regen package-lock.json (commit 6392afa). Replicado fora do PR do bot pra preservar author gomktia (Vercel Hobby reclama de PR de bot).

Lição

Sempre que aparecer bolinha vermelha em deploy com build sucesso, suspeitar de CVE não-patchada antes de qualquer outra causa. Rolar npm audit localmente e conferir Pull Requests abertos pelo bot Vercel.

3. PR2 — Subcategorias 1-nível + categoria em receita + arquivar sistema por workspace

Mudanças DB

  • CHECK em categorias.tipo aceitando 'gasto', 'parcela', 'receita' (era varchar SEM check antes — primeira vez que ganha validação de schema)
  • categoria_pai_id uuid NULL FK→categorias(id) ON DELETE SET NULL + index parcial + trigger enforce_subcategoria_um_nivel (BEFORE INSERT/UPDATE OF categoria_pai_id, raises se neta detectada)
  • categoria_id uuid NULL FK→categorias(id) ON DELETE SET NULL em receitas + index parcial — reabre Opção C que tinha sido adiada em 24/04
  • Tabela categorias_sistema_arquivadas (workspace_id, categoria_id, arquivada_em, arquivada_por) com 3 RLS policies via workspace_members — permite cada workspace ocultar categoria sistema sem afetar globalmente
  • 4 categorias receita seedadas: Salário (Banknote/#34C759), Investimentos rendimento (TrendingUp/#34C759), Empréstimos (Receipt/#A2845E), Outras receitas (Coins/#FFCC00)
  • RPC relatorio_receita_categoria_workspace espelhando relatorio_categoria_workspace (clone limpo, não generalizado — DRY trade-off documentado)

Mudanças UI

  • /configuracoes/categorias: filtro Receitas, botão + Sub em cards non-sistema/non-subcategoria, botão Ocultar/Mostrar em cards sistema (substitui Editar/Arquivar/Excluir), badge “oculta”, lista hierárquica com border-l indentando filhas
  • receita-sheet.tsx: ganhou campo Categoria com <CategoriaPicker tipo="receita" /> — antes era buraco (DB tinha coluna mas UI não tinha picker)
  • categoria-picker.tsx: aceita tipo 'receita', renderiza filhas indentadas (pl-10 + ícone menor), filtra arquivadas no workspace
  • categoria-dialog.tsx: prop parent?: Categoria cria modo subcategoria (heading dedicado, tipo herdado, submit via createSubcategoria); toggle “Aplicar em” inclui Receita
  • dashboard-dre.tsx: card extra “Receitas por categoria” (top 5)
  • /relatorios: toggle Gastos|Receitas no topo (em vez de tab duplicada — DRY win), reaproveita RelatorioCharts + cards de totais + CategoriaRow

Final code review pegou 2 issues, fixados em afa3f56

  1. receita-sheet sem CategoriaPicker — backend tava pronto mas UI não. Sem isso, todo o investimento de schema/RPC/seed ficaria dormente.
  2. createSubcategoria workspace ambíguo — antes pegava workspace_members LIMIT 1 sem ORDER BY quando pai era sistema. Pra user multi-workspace daria sub no workspace errado. Agora exige workspaceId explícito do caller.

Spec / Plan

  • Spec: docs/superpowers/specs/2026-04-26-categorias-seed-subcategoria-receita-design.md
  • Plan: docs/superpowers/plans/2026-04-26-categorias-pr2-subcategoria-receita.md

4. Bugfix B — receitas_origem_check rejeitava 10 origens silenciosamente

Sintoma

User tentou criar receita com origem='salario' no smoke test do PR2, falhou com erro silencioso. Achei nos logs Postgres: new row for relation "receitas" violates check constraint "receitas_origem_check".

Causa

Migration antiga criou CHECK (origem IN ('venda_balcao','venda_online','servico','recebimento','mensalidade','outros')) — só 6 valores. Mas types/index.ts:68-89 tem 16 origens incluindo grupos PF (Salário, Bônus, Freelance, etc).

Fix

Migration fix_receitas_origem_check_aceita_todas_16 ampliou CHECK pra exatamente as 16 origens do ORIGENS_RECEITA. DB-only, sem deploy de código.

Lição

Sempre que adicionar valor novo a um array enum-like no front, conferir se CHECK correspondente no DB foi atualizado. Mismatch é silencioso.

5. Bugfix A — Cliente CNPJ “Salvando…” infinito (sintoma fixado, causa raiz pendente)

Sintoma

User reportou: tentar salvar cliente PJ no WS empresa fica em loop “Salvando…” e nunca grava no DB.

Investigação

  • DB aceita INSERT manual com CNPJ via SQL service-role (testado)
  • RLS permite (geison é owner do WS, deletado=false em workspace_members)
  • Sem trigger BEFORE INSERT em clientes que pudesse bloquear
  • Logs Supabase API mostraram ZERO POSTs pra /rest/v1/clientes nos minutos do bug — request nunca saiu do navegador
  • Conclusão: JS travou client-side ANTES de chamar supabase.from('clientes').insert()

Sintoma fixado em 5008efc

  • hooks/use-clientes.ts:createCliente.mutationFn agora corre via Promise.race com timeout 20s. Se travar mais que isso, joga “Timeout: request demorou mais de 20s” e libera o botão.
  • components/cliente-sheet.tsx:handleSubmit agora dispara toast “Preencha: X, Y, Z” em vez de retorno silencioso quando faltam campos obrigatórios (antes parecia sistema travado).

Causa raiz NÃO isolada

Próxima vez que travar, pedir user abrir F12 → Console ANTES de clicar Cadastrar e capturar:
  • Exception JS
  • Warning de unmounted setState
  • Network tab: confirmar se POST /clientes saiu

Hipóteses não-verificadas

  • Token refresh + insert race condition (vi muitos POST /auth/v1/token grant_type=refresh_token nos logs)
  • Múltiplas tabs com auth state inconsistente
  • supabase-js v2.x sem timeout default em certas versões

6. Auditoria WS empresa + roadmap recomendado

User pediu auditoria do modo “empresa” e o que faz sentido implementar. Documento dedicado: Roadmap WS empresa — focar prestador solo. Recomendação síntese: posicionar como “Organizze + prestador solo” (1-3 pessoas, vende serviço recorrente). NÃO competir com Conta Azul/Bling/Tiny. Sprint 1 (8-12h): régua de cobrança email + recibo PDF + bug cobrança→receita. Sprint 2 (15-25h): centro de custo por cliente. Sprint 3 (longo): integração externa NFE.io/Asaas, NÃO gateway próprio.