Resumo executivo
14 commits nomain, 6 migrations Supabase remotas, 1 deploy bloqueado por CVE.
| Bloco | Commits | Migrations | Status |
|---|---|---|---|
| Spec + plan PR1 | 93bc17f, 7a1707d, 12332c4 | — | docs |
| PR1 — seed despesas + 5 ícones | fad5264, 689e4e6 | add_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 PR2 | e329daf | — | docs |
| PR2 — subcategorias + receita + arquivar | 242f806, 682e5e4, e1e3af9, a6c84f5, 10ceecd, fe5440f, 9fe1ceb | pr2_categorias_subcategoria_receita_arquivadas, pr2_seed_categorias_receita, pr2_relatorio_receita_categoria | ✅ produção |
| PR2 fixes pós-review | afa3f56 | — | ✅ produção |
| Bugfix CNPJ + origem receita | 5008efc | fix_receitas_origem_check_aceita_todas_16 | ✅ produção |
1. PR1 — Seed 21 despesas sistema + 5 ícones lucide
O que mudou
- Coluna
slug text NULLemcategorias+ UNIQUE INDEX parcial ondesistema=true(idempotência) - INSERT de 21 categorias
tipo='gasto'seedadas comosistema=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
HandCoinsmas não existe emlucide-react@0.303(foi adicionado em ~0.330+). Substituído porReceipt(já no registry) pra “Dívidas e empréstimos”. Bumar lucide foi descartado pra não quebrar 49 ícones existentes.
- Nota histórica: spec original previa
- 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
Deploy689e4e6 (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 denext 15.2.4 → 15.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. Rolarnpm 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.tipoaceitando'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 + triggerenforce_subcategoria_um_nivel(BEFORE INSERT/UPDATE OF categoria_pai_id, raises se neta detectada)categoria_id uuid NULL FK→categorias(id) ON DELETE SET NULLemreceitas+ 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 viaworkspace_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_workspaceespelhandorelatorio_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 comborder-lindentando filhasreceita-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 workspacecategoria-dialog.tsx: propparent?: Categoriacria modo subcategoria (heading dedicado, tipo herdado, submit viacreateSubcategoria); toggle “Aplicar em” inclui Receitadashboard-dre.tsx: card extra “Receitas por categoria” (top 5)/relatorios: toggle Gastos|Receitas no topo (em vez de tab duplicada — DRY win), reaproveitaRelatorioCharts+ cards de totais +CategoriaRow
Final code review pegou 2 issues, fixados em afa3f56
receita-sheetsemCategoriaPicker— backend tava pronto mas UI não. Sem isso, todo o investimento de schema/RPC/seed ficaria dormente.createSubcategoriaworkspace ambíguo — antes pegavaworkspace_members LIMIT 1sem ORDER BY quando pai era sistema. Pra user multi-workspace daria sub no workspace errado. Agora exigeworkspaceIdexplí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 comorigem='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 criouCHECK (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
Migrationfix_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=falseemworkspace_members) - Sem trigger BEFORE INSERT em
clientesque pudesse bloquear - Logs Supabase API mostraram ZERO POSTs pra
/rest/v1/clientesnos 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.mutationFnagora corre viaPromise.racecom timeout 20s. Se travar mais que isso, joga “Timeout: request demorou mais de 20s” e libera o botão.components/cliente-sheet.tsx:handleSubmitagora 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_tokennos logs) - Múltiplas tabs com auth state inconsistente
- supabase-js v2.x sem timeout default em certas versões