O que este documento é
Registro cronológico de intervenções técnicas em produção: migrations aplicadas, bugs corrigidos, warnings do Supabase advisor e pendências de configuração manual. Atualizado sempre que uma rodada de auditoria operacional é executada. Diferença vs Auditoria Técnica: aquela é sobre arquitetura e sustentação (service layer, testes, acoplamento). Esta é sobre bugs concretos que impactam o app em produção. Cadência recomendada: mensal (rodarsupabase advisors security + performance), após cada lançamento relevante, ou quando surgir incidente em produção.
Sessão 2026-04-23 — Estabilização pós go-live
Go-live em pixdopix.com.br. Primeira auditoria operacional após deploy em produção.Migrations aplicadas (9)
| Migration | Impacto |
|---|---|
fix_cascade_on_delete_user | FKs de gastos, assinaturas, contas_fixas (coluna usuario_id) passam a CASCADE. Antes, tentar excluir usuário com dados vinculados retornava erro 500 no admin. |
fix_cascade_clientes_and_cobrancas | Mesmo padrão aplicado em clientes e cliente_cobrancas (coluna workspace_id). Evita bloqueio ao excluir workspaces com clientes. |
fix_security_definer_search_path | 4 funções SECURITY DEFINER (gerar_cobrancas_mensais, marcar_cobrancas_atrasadas, set_cron_service_key, trigger_send_monthly_reminders) ganham search_path = 'public' fixo. Previne privilege escalation via schema hijacking. |
fix_search_path_remaining_functions | Mais 5 funções (calcular_vencimento, set_updated_at, marcar_cobranca_paga, desfazer_cobranca_paga, gerar_cobrancas_retroativas) com a mesma correção. |
add_missing_fk_indexes | 7 índices faltantes em colunas FK: cliente_cobrancas.receita_id, clientes.deletado_por, clientes.usuario_id, compras_parceladas.categoria_id, ferramentas.deletado_por, ferramentas.usuario_id, workspace_invites.criado_por. |
drop_duplicate_and_redundant_policies | Remove índice duplicate user_subscriptions_user_id_unique (redundante com o UNIQUE constraint já existente) e policy RLS duplicada user_subscriptions_read_own em user_subscriptions. |
create_admin_audit_log | Nova tabela admin_audit_log + RLS (só super_admin lê, escrita via service role) + 3 índices (admin, target, action). |
Bugs de código corrigidos
| Commit | O que corrige |
|---|---|
adf5672 | Inputs numéricos travados em “1” ao tentar apagar (6 sheets afetados). Causa: parseInt(e.target.value) || 1 no onChange. Fix: e.target.valueAsNumber. |
cb1f96c | Preços aparecendo como “R 69.9,00”. Causa: concatenação manual de ,00 em strings. Fix: toLocaleString('pt-BR', { style: 'currency' }). |
85af1f5 | Duas sidebars renderizando em /admin (a do app cliente + a do admin). Fix: /admin adicionado em standaloneRoutes do LayoutWrapper. |
85af1f5 | Dropdown de workspace exibindo “Pessoal Pessoal” (nome == tipo). Fix: mostra “Padrão” quando redundante. |
f35f23d | Signup ficava mudo quando “Confirm email” estava ativo. Fix: detecta !data.session e exibe banner “Conta criada! Enviamos um link de confirmação para …” |
bb7b609 | changePlan aceitava qualquer string (incluindo “super_premium”). Fix: whitelist VALID_PLANS. |
179a20b | Middleware do /admin sem timeout no RPC is_super_admin. Risco de DoS se Supabase ficasse lento. Fix: Promise.race com timeout de 5s. |
179a20b | Checkout Stripe não invalidava cache user-subscription em onError. UI mostrava “plano ativo” mesmo com cartão recusado. Fix: invalidate no catch. |
179a20b | Audit log ausente. Fix: admin_audit_log + registro automático em 7 ações (impersonate, reset_password, create_user, delete_user, change_plan, grant_business_comp, revoke_comp). |
cf40194, ed9d6e4, dea36e9, d90d3ad, 9039d23 | Série de fixes de TypeScript após regeneração de database.types (tabela nova admin_audit_log, cast de Json, payload tipado em updateCategoria, remoção de queries em receitas.categoria_id inexistente, troca de Views<> por Tables<> no helper moderno). |
Features entregues na mesma janela
Em paralelo aos fixes, foram shipped:- Admin V2 (commit
77fc7fc): layout dedicado com 4 abas (Overview/Usuários/Assinaturas/Integrações), 3 gráficos no overview (MRR, signups, revenue por plano), visual dark + accent vermelho. - CRUD completo de usuários (
5897e28): criar, excluir com dupla confirmação, mudar plano manual, impersonate via magic link. - Admin Atividade (
1d5e89a): página/admin/atividadevisualizando oadmin_audit_logcom filtros por ação e busca. - Categorias customizadas (
5a272a3):/configuracoes/categoriascom 32 ícones + 12 cores, paywall Free 10 / Pro 25 / Business ∞, contador de uso por categoria, proteção contra excluir categoria com lançamentos. - CategoriaPicker visual (
7323f74): substituí select texto por picker com ícone+cor nos sheets de gasto e parcela.
Warnings do Supabase advisor (após fixes)
Rodadosget_advisors para security e performance:
Security — resolvido:
- 9 funções com
search_pathmutável → corrigido. - Policy RLS redundante → corrigido.
extension_in_public(pg_net): extensão no schemapublic(warning). Mover exige recriar cron que está funcionando — risco > benefício, manter.auth_leaked_password_protection: feature de bloquear senhas vazadas está desativada. Pendência de config manual (Supabase Dashboard → Authentication → toggle).
- 20+ policies com
auth.uid()direto (RLS initplan). Impacto desprezível abaixo de ~10k users. Refactor programado para Fase 2 (usar(select auth.uid())). - 30+ “unused indexes” detectados. Foram criados para patterns de uso esperado mas base ainda é pequena (~15 users), não deram tempo de acumular queries. Não remover — índice lento a adicionar depois, barato a manter.
multiple_permissive_policiesemuser_subscriptions: corrigido (drop da duplicata).
Pendências de configuração manual (fora de código)
| Pendência | Urgência | Ação |
|---|---|---|
SMTP Resend quebrado (signup retorna 500 com 535 Authentication credentials invalid) | Crítica | Gerar nova API key em https://resend.com/api-keys e colar em Supabase → Authentication → Emails → SMTP Settings (Host smtp.resend.com, Port 465, Username literal resend, Password = nova key). |
| Leaked Password Protection desativado | Média | Supabase Dashboard → Authentication → Sign In → ativar toggle (2 cliques). |
| Custom Domain do Supabase não configurado | Baixa | URL de verify fica otngwujtmtxamqprpbst.supabase.co (feio). Requer plano Pro (US$ 25/mês). Adiar até base crescer. |
Configurações aprovadas nesta sessão
- Criado super_admin dedicado
admin@pixdopix.com.br(não revogargeisonhoehr@gmail.comainda, até validar o admin novo em produção). - Gasolina movido de “Transações” para “Recursos” no sidebar (reposicionamento semântico).
- Admin V2 substituiu admin MVP anterior.
Próximas auditorias operacionais recomendadas
Cadência mínima
- Mensal — rodar
get_advisors(security + performance) e registrar mudanças aqui. - Após cada migration que cria tabela — regenerar
types/database.types.tsvia MCP Supabase para evitar quebra de build (aconteceu nesta sessão, 5 builds quebrados seguidos por types desatualizados). - Após cada lançamento de feature — rodar auditoria de código nos novos arquivos.
Indicadores de alerta
Abrir auditoria não-programada quando:- Logs do Vercel mostram >5 erros 5xx por hora
- Warning de
auth_rls_initplancomeçar a aparecer em queries lentas (>500ms) - Base ultrapassar 100 usuários ativos (gatilha refactor de paginação no admin)
- Resend/SMTP apresentar rate limit ou bounce >1%
Investigações pendentes para próxima sessão
- Picker de categoria em receita-sheet (hoje
receitas.categoria_idnão existe no schema — avaliar se vale migration). - Auditar
app/page.tsx(dashboard principal) — flagged como A3 na Auditoria Técnica. - Testes automatizados do fluxo de signup/login + subscription (A1).
Log de mudanças deste documento
- 2026-04-23 — Documento criado. Auditoria de estabilização pós go-live.