Skip to content

fix(db): torna migrations pendentes idempotentes p/ destravar integração prod#335

Merged
adm01-debug merged 1 commit into
mainfrom
claude/idempotent-pending-migrations
May 25, 2026
Merged

fix(db): torna migrations pendentes idempotentes p/ destravar integração prod#335
adm01-debug merged 1 commit into
mainfrom
claude/idempotent-pending-migrations

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 25, 2026

Contexto

Após o PR #334 reparar as 4 migrations órfãs, a integração main→prod (Supabase
protected branch) passou a aplicar as migrations pendentes em ordem — e falhou
na primeira não-idempotente, 20260524210002, com:

ERROR: policy "Anyone can request a password reset (validated)" for table
"password_reset_requests" already exists (SQLSTATE 42710)  (run 11:29:23)

A causa raiz: vários objetos foram criados out-of-band (MCP/dashboard pela sessão
paralela), então os CREATE POLICY/CREATE VIEW dessas migrations colidem ao serem
re-aplicados pela integração.

Diagnóstico (validado contra o estado real de prod)

Das 10 migrations pendentes, só 3 eram não-idempotentes. As outras 7 já usavam
IF NOT EXISTS / IF EXISTS / REVOKE (no-op) / CREATE OR REPLACE sem conflito de
assinatura. 0 migrations órfãs (confirmado: o erro "Remote migration versions not
found" sumiu).

Migration Problema Correção
20260524210002 CREATE POLICY "...(validated)" já existe em prod DROP POLICY IF EXISTS do nome validado antes do CREATE
20260524210300 3 policies kill_switches_{insert,update,delete}_admin já existem DROP POLICY IF EXISTS antes de cada CREATE
20260525063000 CREATE OR REPLACE VIEW não troca tipo das colunas count(*) (bigint→integer) DROP VIEW IF EXISTS + CREATE VIEW (nada depende delas — checado em pg_depend)

Validações feitas

  • pg_policy: confirmado que as policies de password_reset_requests e
    system_kill_switches já existiam em prod.
  • pg_proc/information_schema: fn_run_schema_drift_check (210400) e as funções
    de smoke-test ainda não existem em prod → CREATE OR REPLACE cria limpo, sem
    conflito de tipo de retorno.
  • pg_depend: nada depende de v_smoke_tests_latest_run/v_smoke_tests_trend, então
    o DROP+CREATE é seguro.
  • 223000: as 5 tabelas e seus parents/funções já existem → IF NOT EXISTS torna
    tudo no-op.

Observação (overlap com sessão paralela)

As views de smoke-test em prod apontam para smoke_tests_runs (plural), enquanto
063000 cria/usa smoke_test_runs (singular) — esse é o contrato pretendido pela
migration da sessão paralela. Após aplicada, as views passam a ler a tabela singular
(inicialmente vazia, repopulada por fn_run_and_persist_smoke_tests). O histórico na
tabela plural fica preservado, apenas órfão. Não renomeei — é decisão de design da
sessão paralela; apenas garanti que aplica sem erro.

Test plan

  • Integração main→prod aplica as 10 pendentes sem erro 42710 (branch-action log verde)
  • schema_migrations passa a conter as 10 versões pendentes
  • Dashboard admin de observabilidade (smoke tests) carrega as views

https://claude.ai/code/session_01MBTzmQYmrgwLnwfxRS3PNU


Generated by Claude Code


Summary by cubic

Torna três migrations pendentes idempotentes para destravar a integração main→prod no Supabase. As demais pendentes já eram idempotentes; não restam migrations órfãs.

  • Bug Fixes
    • 20260524210002: DROP POLICY IF EXISTS da "Anyone can request a password reset (validated)" antes do CREATE em public.password_reset_requests.
    • 20260524210300: DROP POLICY IF EXISTS das policies admin (insert/update/delete) em public.system_kill_switches antes dos CREATEs.
    • 20260525063000: DROP VIEW IF EXISTS + CREATE VIEW para v_smoke_tests_latest_run e v_smoke_tests_trend (permite mudar count(*) de bigint para integer; sem dependências).

Written for commit ef5fec4. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • Melhorias
    • Fortalecidas políticas de segurança para o processo de redefinição de senha
    • Otimizado gerenciamento de controles administrativos do sistema
    • Melhorada confiabilidade dos processos de observabilidade

Review Change Stack

…ção prod

A integração main->prod (Supabase protected branch) aplicava as migrations
pendentes em ordem e falhava em 20260524210002 com SQLSTATE 42710 — a policy
"Anyone can request a password reset (validated)" já existia em prod (criada
out-of-band). Mesmo padrão em 20260524210300 (3 policies kill_switches admin) e
20260525063000 (CREATE OR REPLACE VIEW não pode mudar count(*) de bigint p/ integer).

Correções idempotência-only (validadas contra o estado real de prod):
- 210002: DROP POLICY IF EXISTS do nome validado antes do CREATE.
- 210300: DROP POLICY IF EXISTS antes de cada CREATE POLICY (insert/update/delete admin).
- 063000: DROP VIEW IF EXISTS + CREATE VIEW (em vez de OR REPLACE) p/ permitir
  troca de tipo das colunas de contagem; nada depende das views (verificado em pg_depend).

Os outros 7 pendentes já eram idempotentes (IF NOT EXISTS / IF EXISTS / REVOKE /
CREATE OR REPLACE sem conflito de assinatura). 0 migrations órfãs.

https://claude.ai/code/session_01MBTzmQYmrgwLnwfxRS3PNU
@supabase
Copy link
Copy Markdown

supabase Bot commented May 25, 2026

This pull request has been ignored for the connected project doufsxqlfjyuvxuezpln due to reaching the limit of concurrent preview branches.
Go to Project Integrations Settings ↗︎ if you wish to update this limit.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@vercel
Copy link
Copy Markdown

vercel Bot commented May 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
we-dream-big Ready Ready Preview, Comment May 25, 2026 11:47am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 25, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9450db54-ba55-45cb-b529-8b2e2900588a

📥 Commits

Reviewing files that changed from the base of the PR and between ae8e2ec and ef5fec4.

📒 Files selected for processing (3)
  • supabase/migrations/20260524210002_harden_password_reset_requests_rls.sql
  • supabase/migrations/20260524210300_kill_switches_fk_index_and_policy_consolidation.sql
  • supabase/migrations/20260525063000_restore_smoke_test_observability_contract.sql

Walkthrough

Três migrations SQL consolidam padrões de idempotência em políticas RLS, adicionam índice de performance em kill_switches, e recriam views observability com drop explícito antes da criação para evitar conflitos em re-execução.

Changes

Database Migrations: RLS Hardening and View Redeploy

Layer / File(s) Summary
Password reset RLS idempotence
supabase/migrations/20260524210002_harden_password_reset_requests_rls.sql
Migration torna idempotente o drop de policies password_reset_requests ao dropar explicitamente a policy "(validated)" antes de recriar, evitando falhas em re-execução.
Kill switches admin policies and index
supabase/migrations/20260524210300_kill_switches_fk_index_and_policy_consolidation.sql
Migration adiciona índice idx_system_kill_switches_updated_by em updated_by para performance e consolida policies admin com DROP POLICY IF EXISTS antes de recriar, separando INSERT/UPDATE/DELETE com verificação public.is_admin_or_above().
Smoke test observability views redeploy
supabase/migrations/20260525063000_restore_smoke_test_observability_contract.sql
Migration recria views v_smoke_tests_latest_run e v_smoke_tests_trend usando DROP VIEW IF EXISTS + CREATE VIEW em vez de CREATE OR REPLACE VIEW, garantindo limpeza em ambientes com conflitos de definição.

🎯 Effort Estimate

🎯 2 (Simple) | ⏱️ ~8 minutes

As três migrations são padrões diretos de SQL: adds de políticas com DROP IF EXISTS (idempotência), criação de índice single-column, e redeploy de views com padrão drop-create. Baixa densidade lógica, sem lógica condicional complexa ou dependências entre migrations. Review é verificação de syntax SQL, correção de nomes de policies/índices e impacto em RLS.

Suggested Labels

codex

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/idempotent-pending-migrations

Comment @coderabbitai help to get the list of available commands and usage tips.

@adm01-debug adm01-debug marked this pull request as ready for review May 25, 2026 12:08
Copilot AI review requested due to automatic review settings May 25, 2026 12:08
@adm01-debug adm01-debug merged commit 83ea01b into main May 25, 2026
35 of 38 checks passed
@adm01-debug adm01-debug deleted the claude/idempotent-pending-migrations branch May 25, 2026 12:08
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR ajusta três migrations Supabase pendentes para serem idempotentes (replay-safe), evitando falhas na integração main → prod quando objetos (policies/views) já existem em produção por terem sido criados out-of-band.

Changes:

  • 20260524210002: adiciona DROP POLICY IF EXISTS da policy "Anyone can request a password reset (validated)" antes do CREATE POLICY.
  • 20260524210300: adiciona DROP POLICY IF EXISTS para as policies admin (insert/update/delete) em system_kill_switches antes de recriá-las.
  • 20260525063000: troca CREATE OR REPLACE VIEW por DROP VIEW IF EXISTS + CREATE VIEW para permitir mudança de tipo nas colunas agregadas (ex.: count(*)).

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
supabase/migrations/20260524210002_harden_password_reset_requests_rls.sql Torna a recriação da policy de password reset idempotente ao dropar também o nome “(validated)” antes do CREATE.
supabase/migrations/20260524210300_kill_switches_fk_index_and_policy_consolidation.sql Evita colisões ao recriar policies admin existentes em prod, adicionando DROP IF EXISTS por policy.
supabase/migrations/20260525063000_restore_smoke_test_observability_contract.sql Evita erro de alteração de tipo em views existentes usando DROP+CREATE mantendo GRANT/REVOKE/COMMENT após recriação.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants