A migration que nunca rodou. O Prisma Client é reconstruído a cada deploy a partir do schema, então passou a esperar colunas que duas migrations criariam. As duas ficaram no disco, nunca aplicadas em produção, e o dashboard quebrou pedindo uma coluna inexistente. A parte que interessa não é o erro: a documentação afirmava que a Vercel rodava migrate deploy no build, e isso nunca tinha sido configurado. Um pressuposto escrito, nunca verificado, sustentado por dias de deploys que por acaso não tocavam nas colunas novas.
Sete deploys mortos aos 45 minutos. Com o migrate deploy no build, os deploys passaram a morrer no timeout sem mensagem de erro. O pooler de transação do Supabase, que é o correto para runtime serverless, não suporta as transações DDL longas do migrate deploy, e o comando trava em vez de falhar. A correção foi separar a URL de runtime da URL do CLI. O detalhe que só aparece quando dói: a mesma variável precisa existir na Vercel e nos secrets do CI, porque o CI roda o mesmo build.
A config que quebra só na infra da plataforma. Depois disso, aumentar o limite de corpo das Server Actions passou a quebrar o build com um erro de tipo, logo após a plataforma aplicar a própria modificação de config. O build local não reproduzia. Foram cerca de seis horas de bisect até isolar. A consequência ficou: o limite segue no default de 1MB e nenhuma Server Action pode receber arquivo, então todo upload do produto é route handler.
O que eu faria diferente: migrate deploy no pipeline desde o primeiro deploy, porque aplicar migration como passo manual falha em silêncio; e tratar a diferença entre o build local e o da plataforma como fato conhecido, rodando o build da plataforma antes de mesclar mudanças de configuração. O contorno do terceiro ato continua sendo dívida, não desenho: a regra vale porque um bug de terceiro não foi resolvido.