@luanpdd/kit-mcp 1.29.0 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +82 -82
- package/kit/COMANDOS.md +138 -138
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +106 -106
- package/kit/agents/assumptions-analyzer.md +107 -107
- package/kit/agents/audit-log-implementer.md +313 -313
- package/kit/agents/auditor-consistencia-isolamento.md +413 -413
- package/kit/agents/b2b-saas-architect.md +156 -156
- package/kit/agents/cascading-failures-auditor.md +298 -298
- package/kit/agents/codebase-mapper.md +768 -768
- package/kit/agents/crm-pipeline-implementer.md +256 -256
- package/kit/agents/debugger.md +813 -813
- package/kit/agents/detector-tenant-quente.md +337 -337
- package/kit/agents/evolution-go-integrator.md +200 -200
- package/kit/agents/example-reviewer.md +21 -21
- package/kit/agents/executor.md +564 -564
- package/kit/agents/integration-checker.md +200 -200
- package/kit/agents/invite-flow-implementer.md +189 -189
- package/kit/agents/legacy-characterizer.md +368 -368
- package/kit/agents/lgpd-compliance-auditor.md +295 -295
- package/kit/agents/multi-tenant-isolation-auditor.md +253 -253
- package/kit/agents/multi-tenant-rls-writer.md +340 -340
- package/kit/agents/nyquist-auditor.md +178 -178
- package/kit/agents/observability-coverage-auditor.md +315 -315
- package/kit/agents/org-onboarding-implementer.md +223 -223
- package/kit/agents/payload-capture-instrumenter.md +273 -273
- package/kit/agents/phase-researcher.md +696 -696
- package/kit/agents/plan-checker.md +272 -272
- package/kit/agents/planner.md +922 -922
- package/kit/agents/project-researcher.md +652 -652
- package/kit/agents/refactor-safety-auditor.md +404 -404
- package/kit/agents/research-synthesizer.md +245 -245
- package/kit/agents/roadmapper.md +677 -677
- package/kit/agents/seam-finder.md +359 -359
- package/kit/agents/shotgun-surgery-detector.md +349 -349
- package/kit/agents/supabase-branching-architect.md +562 -562
- package/kit/agents/supabase-cicd-pipeline-implementer.md +777 -777
- package/kit/agents/supabase-column-privileges-writer.md +399 -399
- package/kit/agents/supabase-edge-fn-tester.md +287 -0
- package/kit/agents/supabase-edge-fn-writer.md +239 -210
- package/kit/agents/supabase-migration-writer.md +385 -385
- package/kit/agents/supabase-rbac-implementer.md +392 -392
- package/kit/agents/supabase-realtime-implementer.md +363 -267
- package/kit/agents/supabase-rls-hardener.md +521 -521
- package/kit/agents/supabase-rls-writer.md +323 -323
- package/kit/agents/supabase-roles-implementer.md +355 -355
- package/kit/agents/super-admin-implementer.md +281 -281
- package/kit/agents/ui-auditor.md +437 -437
- package/kit/agents/ui-checker.md +302 -302
- package/kit/agents/ui-researcher.md +355 -355
- package/kit/agents/user-profiler.md +175 -175
- package/kit/agents/validador-evolucao-schema.md +335 -335
- package/kit/agents/verifier.md +728 -728
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +30 -7
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +14 -8
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/_shared-supabase/glossary.md +17 -0
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +229 -141
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -0
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -0
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -0
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -0
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -0
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -236
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/package.json +1 -1
- package/src/core/kit.js +216 -216
- package/src/core/reflect.js +247 -247
- package/src/core/reverse-sync.js +372 -372
- package/src/core/sync.js +418 -418
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +693 -693
|
@@ -1,544 +1,544 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supabase-branching-workflow
|
|
3
|
-
description: Use ao adotar Supabase Branching — preview vs persistent branches, deploy DAG 7 steps (clone→pull→health→configure→migrate→seed→deploy), GitHub integration setup, Dashboard alpha…
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Supabase — Branching Workflow
|
|
7
|
-
|
|
8
|
-
## Quando usar
|
|
9
|
-
|
|
10
|
-
Supabase Branching cria cópias **isoladas** do projeto Postgres + Edge Functions + Storage config para cada branch git — workflow tipo Vercel preview deployments, mas com schema/migrations versionados.
|
|
11
|
-
|
|
12
|
-
Trigger phrases:
|
|
13
|
-
|
|
14
|
-
- "preview branch Supabase", "persistent branch staging"
|
|
15
|
-
- "deploy DAG Supabase", "branching workflow"
|
|
16
|
-
- "GitHub integration Supabase", "automatic branching"
|
|
17
|
-
- "Dashboard branching alpha"
|
|
18
|
-
- "Branching Compute Hours custo", "custo branching Supabase"
|
|
19
|
-
- "preview ephemeral vs long-lived"
|
|
20
|
-
- "PR-driven Supabase workflow"
|
|
21
|
-
|
|
22
|
-
**Use Supabase Branching APENAS para:**
|
|
23
|
-
|
|
24
|
-
- Validar migrations + schema declarativo em PR antes do merge
|
|
25
|
-
- Isolar mudanças destrutivas (DROP COLUMN, ALTER TYPE) em preview
|
|
26
|
-
- QA team rodar smoke tests em staging persistente
|
|
27
|
-
- Validar deploy de Edge Functions com `[remotes]` block em `config.toml`
|
|
28
|
-
|
|
29
|
-
**NÃO use Supabase Branching para:**
|
|
30
|
-
|
|
31
|
-
- QA com dados reais de produção — branches são **dataless by design** (seed.sql é dados sintéticos)
|
|
32
|
-
- Replicar production traffic — preview branches têm compute Micro por default (não dimensionado para load)
|
|
33
|
-
- Substituir staging Supabase project separado quando precisar SLA/uptime
|
|
34
|
-
- Test environments sem expirar — preview branches são **ephemeral** (auto-delete em PR merge/close)
|
|
35
|
-
|
|
36
|
-
## Princípio canônico
|
|
37
|
-
|
|
38
|
-
**Preview branches:** ephemeral, criados em PR open, auto-pause em inatividade, **auto-delete em PR merge/close**.
|
|
39
|
-
|
|
40
|
-
**Persistent branches:** long-lived (staging/QA), NÃO auto-pause, requerem delete **manual** via Dashboard ou CLI.
|
|
41
|
-
|
|
42
|
-
Critério de escolha canônico:
|
|
43
|
-
|
|
44
|
-
- PR-driven dev workflow + features curtas (< 1 semana) → **preview**
|
|
45
|
-
- Staging compartilhada + features longas + manual control → **persistent**
|
|
46
|
-
- Mix possível: 1 persistent staging compartilhado + N ephemeral previews por PR
|
|
47
|
-
|
|
48
|
-
## ALERTA DE CUSTO — Branching Compute Hours
|
|
49
|
-
|
|
50
|
-
> **ATENÇÃO CANÔNICA — leia antes de habilitar branching em produção.**
|
|
51
|
-
>
|
|
52
|
-
> Cada branch Supabase (preview ou persistent) consome **Branching Compute Hours** independentes do projeto principal.
|
|
53
|
-
>
|
|
54
|
-
> - **Micro Compute size starts at $0.01344/h** (cobrança por hora de branch ativo)
|
|
55
|
-
> - **Branching Compute Hours FORA do Spend Cap** — Spend Cap do projeto NÃO protege contra este custo
|
|
56
|
-
> - **Compute Credits NÃO aplicam** a Branching Compute (FAQ pricing oficial)
|
|
57
|
-
> - **Billing aparece como "Branching Compute Hours"** no invoice (linha separada)
|
|
58
|
-
>
|
|
59
|
-
> ### Estimativa concreta
|
|
60
|
-
>
|
|
61
|
-
> - **10 PRs/mês × 24h média de vida útil** = 240h × $0.01344 = **~$3.23/mês adicional**
|
|
62
|
-
> - **30 PRs/mês × 72h média (PRs grandes)** = 2160h × $0.01344 = **~$29.03/mês adicional**
|
|
63
|
-
> - **Persistent staging branch 24/7** = 720h × $0.01344 = **~$9.67/mês adicional** (acumula continuamente)
|
|
64
|
-
>
|
|
65
|
-
> ### Atenção
|
|
66
|
-
>
|
|
67
|
-
> - Persistent branches **acumulam horas continuamente** (não pausam) — custo previsível por mês
|
|
68
|
-
> - Preview branches **auto-pausam** em inatividade — custo varia com atividade do PR
|
|
69
|
-
> - Branch creation pode levar até **30 minutos** (health check) — primeira hora já é cobrada
|
|
70
|
-
>
|
|
71
|
-
> ### Mitigações canônicas
|
|
72
|
-
>
|
|
73
|
-
> - Habilitar **"Supabase changes only" filter** (Pattern 3) — preview branch SÓ para PRs que tocam `supabase/`
|
|
74
|
-
> - Considerar **1 persistent staging** compartilhado em vez de N preview branches
|
|
75
|
-
> - Monitorar billing manualmente — **Spend Cap NÃO protege**, reforço
|
|
76
|
-
|
|
77
|
-
## Pattern 1: Preview vs Persistent Branches
|
|
78
|
-
|
|
79
|
-
Distinção operacional canônica (BRANCH-01):
|
|
80
|
-
|
|
81
|
-
| | Preview Branch | Persistent Branch |
|
|
82
|
-
|---|---|---|
|
|
83
|
-
| Ciclo de vida | Ephemeral (criado em PR open) | Long-lived (criado manualmente) |
|
|
84
|
-
| Auto-pause | Sim (inatividade) | NÃO |
|
|
85
|
-
| Auto-delete | Sim (PR merge/close) | NÃO (delete manual via Dashboard/CLI) |
|
|
86
|
-
| Caso de uso | PR-driven dev workflow | Staging/QA compartilhada |
|
|
87
|
-
| Custo (Branching Compute Hours) | Acumula durante PR vida útil | Acumula continuamente 24/7 |
|
|
88
|
-
| Trigger | GitHub PR webhook (automatic) | CLI ou Dashboard (manual) |
|
|
89
|
-
| Naming | Auto: `pr-<N>-<branch-name>` | User-defined (ex: `staging`, `qa`) |
|
|
90
|
-
| Health check inicial | Até 30 minutos | Até 30 minutos |
|
|
91
|
-
|
|
92
|
-
### Critério de escolha
|
|
93
|
-
|
|
94
|
-
**Use preview SE:**
|
|
95
|
-
|
|
96
|
-
- Equipe usa PR workflow disciplinado (features curtas, < 1 semana de PR aberto)
|
|
97
|
-
- Cada PR deve ter ambiente isolado para review
|
|
98
|
-
- Aceita custo proporcional a número de PRs ativos
|
|
99
|
-
|
|
100
|
-
**Use persistent SE:**
|
|
101
|
-
|
|
102
|
-
- Precisa staging compartilhado para QA team validar release
|
|
103
|
-
- Features longas (sprints multi-semana com PR aberto continuamente)
|
|
104
|
-
- Manual control sobre lifecycle (não querer auto-delete)
|
|
105
|
-
|
|
106
|
-
**Pode haver MIX (recomendação canônica para times maduros):**
|
|
107
|
-
|
|
108
|
-
- 1 persistent branch `staging` para QA team rodar smoke tests pós-merge para `main`
|
|
109
|
-
- N preview branches ephemeral, 1 por PR ativo, para review de mudanças
|
|
110
|
-
|
|
111
|
-
### CLI canônico
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
# criar persistent branch via CLI
|
|
115
|
-
supabase --experimental branches create staging --persistent
|
|
116
|
-
|
|
117
|
-
# listar branches do projeto
|
|
118
|
-
supabase --experimental branches list
|
|
119
|
-
|
|
120
|
-
# inspecionar branch específico
|
|
121
|
-
supabase --experimental branches get staging
|
|
122
|
-
|
|
123
|
-
# deletar branch
|
|
124
|
-
supabase --experimental branches delete staging
|
|
125
|
-
|
|
126
|
-
# atualizar persistent branch para latest main
|
|
127
|
-
supabase --experimental branches update staging
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Caveat — Health check pode levar 30 minutos
|
|
131
|
-
|
|
132
|
-
Branch creation aplica DAG (Pattern 2) — health check do Postgres pode demorar **até 30 minutos** dependendo de:
|
|
133
|
-
|
|
134
|
-
- Tamanho do schema migrado
|
|
135
|
-
- Número de migrations
|
|
136
|
-
- Tamanho do seed.sql
|
|
137
|
-
|
|
138
|
-
Durante este tempo, a primeira **hora de Branching Compute** já é cobrada (Pattern 5 — custo arrendondado a hora cheia inicial).
|
|
139
|
-
|
|
140
|
-
## Pattern 2: Deploy DAG — 7 steps canônicos
|
|
141
|
-
|
|
142
|
-
Cada branch (preview ou persistent) aplica um **DAG (Directed Acyclic Graph)** de 7 steps em ordem (BRANCH-02):
|
|
143
|
-
|
|
144
|
-
1. **clone** — clone do repositório git no contexto do branch Supabase
|
|
145
|
-
2. **pull** — pull das migrations (`supabase/migrations/`) e schema declarativo (`supabase/schemas/`)
|
|
146
|
-
3. **health** — health check do branch DB (espera até 30 min — Postgres ready + connection pooler ativo)
|
|
147
|
-
4. **configure** — aplica `config.toml` (incluindo `[remotes.<branch>]` block — cross-ref skill `supabase-config-toml-remotes` v1.27)
|
|
148
|
-
5. **migrate** — executa migrations em ordem cronológica (`supabase/migrations/*.sql`)
|
|
149
|
-
6. **seed** — aplica `supabase/seed.sql` (dataless by design — sem dados de produção)
|
|
150
|
-
7. **deploy** — deploy de Edge Functions e secrets (via `supabase functions deploy`)
|
|
151
|
-
|
|
152
|
-
### Diagrama ASCII
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
clone → pull → health → configure → migrate → seed → deploy
|
|
156
|
-
✓ ✓ ✓ ✓ ✓ ✓ ✓
|
|
157
|
-
↓ falha
|
|
158
|
-
[seed: SKIPPED]
|
|
159
|
-
[deploy: SKIPPED]
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Skip behavior canônico (anti-cascading failure)
|
|
163
|
-
|
|
164
|
-
**Falha em step N → todos steps N+1...7 são SKIPPED.**
|
|
165
|
-
|
|
166
|
-
Exemplo concreto:
|
|
167
|
-
|
|
168
|
-
- **migrate falha no step 5** (ex: migration com `DROP COLUMN` em coluna que tem FK)
|
|
169
|
-
- **seed (step 6) é SKIPPED** — sem aplicar seed.sql
|
|
170
|
-
- **deploy (step 7) é SKIPPED** — sem deploy de Edge Functions
|
|
171
|
-
- DAG status no Dashboard mostra: ✗ migrate (step 5), ⊘ seed (skipped), ⊘ deploy (skipped)
|
|
172
|
-
|
|
173
|
-
Este comportamento previne **cascading failures** — se schema falha, não aplicar Edge Functions que dependem do schema.
|
|
174
|
-
|
|
175
|
-
### Logs por step
|
|
176
|
-
|
|
177
|
-
Cada step tem stdout/stderr **próprio** acessível no Dashboard:
|
|
178
|
-
|
|
179
|
-
- **Settings → Integrations → GitHub → "View deployment logs"** (link no PR comment)
|
|
180
|
-
- Logs persistidos durante vida útil do branch
|
|
181
|
-
- Útil para debug: step 5 (migrate) tem stderr com SQL error específico
|
|
182
|
-
|
|
183
|
-
### Recovery pattern
|
|
184
|
-
|
|
185
|
-
**Sem rollback automático** — branch fica em estado "failed".
|
|
186
|
-
|
|
187
|
-
Para recovery:
|
|
188
|
-
|
|
189
|
-
1. Push **novo commit** no PR com migration corrigida
|
|
190
|
-
2. GitHub webhook → re-run DAG (steps 1-7 do zero)
|
|
191
|
-
3. Se step 5 (migrate) passa → step 6 (seed) e step 7 (deploy) executam
|
|
192
|
-
|
|
193
|
-
Se migration drift entre branches → ver skill `supabase-migration-repair` (v1.27, Phase 153) para `migration list/repair`.
|
|
194
|
-
|
|
195
|
-
### Caveat — Dataless by design
|
|
196
|
-
|
|
197
|
-
`seed.sql` aplicado no step 6 NÃO deve conter:
|
|
198
|
-
|
|
199
|
-
- Dados sensíveis de produção (PII, tokens, secrets)
|
|
200
|
-
- Snapshot real de tabelas grandes
|
|
201
|
-
- Dados com FKs para tabelas Auth (`auth.users`) — preview branches têm Auth schema separado
|
|
202
|
-
|
|
203
|
-
**Recomendação canônica:** seed.sql contém apenas:
|
|
204
|
-
|
|
205
|
-
- Dados de referência (ex: lista de países, categorias estáticas)
|
|
206
|
-
- Fixtures sintéticos pequenos para smoke tests
|
|
207
|
-
- Setup de roles + permissions iniciais (cross-ref skill `supabase-postgres-roles` v1.26)
|
|
208
|
-
|
|
209
|
-
Preview branches são para **dev workflow**, não para QA com dados reais — se precisar dados reais, use staging Supabase project separado.
|
|
210
|
-
|
|
211
|
-
## Pattern 3: GitHub Integration Setup
|
|
212
|
-
|
|
213
|
-
Setup canônico para preview branching automatizado via GitHub (BRANCH-03):
|
|
214
|
-
|
|
215
|
-
### Step 1: Authorize Supabase no GitHub
|
|
216
|
-
|
|
217
|
-
1. Dashboard → **Project Settings → Integrations → GitHub**
|
|
218
|
-
2. Clicar **"Authorize Supabase"** — OAuth flow do GitHub
|
|
219
|
-
3. Selecionar **organization** + **repos específicos** (princípio do least privilege — não autorizar todos os repos)
|
|
220
|
-
|
|
221
|
-
### Step 2: Working directory
|
|
222
|
-
|
|
223
|
-
Definir diretório raiz do projeto Supabase no repositório:
|
|
224
|
-
|
|
225
|
-
- **Monorepo single Supabase project:** `./`
|
|
226
|
-
- **Monorepo com Supabase em subdiretório:** `./supabase` ou `./apps/api/supabase`
|
|
227
|
-
- **Default:** `./` (raiz do repo)
|
|
228
|
-
|
|
229
|
-
Working directory deve conter `supabase/migrations/`, `supabase/schemas/`, `supabase/config.toml`.
|
|
230
|
-
|
|
231
|
-
### Step 3: Automatic branching toggle
|
|
232
|
-
|
|
233
|
-
- **ON (recomendado):** preview branch criado **automaticamente** quando PR é aberto
|
|
234
|
-
- **OFF:** branches criados apenas manualmente via CLI ou Dashboard
|
|
235
|
-
|
|
236
|
-
Recomendação: **ON** para workflow PR-driven canônico.
|
|
237
|
-
|
|
238
|
-
### Step 4: "Supabase changes only" filter
|
|
239
|
-
|
|
240
|
-
**Recomendação canônica para reduzir custo Branching Compute Hours:**
|
|
241
|
-
|
|
242
|
-
- **ON:** preview branch criado **APENAS** se o PR toca arquivos em `supabase/` (migrations, schemas, functions, config.toml)
|
|
243
|
-
- **OFF:** preview branch criado em **TODOS** os PRs (alto custo se time abre muitos PRs frontend-only)
|
|
244
|
-
|
|
245
|
-
Recomendação: **ON** em todos projetos com Spend Cap awareness (cross-ref Pattern 5).
|
|
246
|
-
|
|
247
|
-
### Step 5: Deploy to production toggle
|
|
248
|
-
|
|
249
|
-
- **ON:** quando PR é merged para `main`, mudanças são automaticamente push para production project Supabase
|
|
250
|
-
- **OFF:** merge não trigger deploy production (deploy manual via CLI ou outro workflow CI)
|
|
251
|
-
|
|
252
|
-
**Use com CAUTELA** — exige:
|
|
253
|
-
|
|
254
|
-
- Migrations bem testadas em preview branch
|
|
255
|
-
- Required check "Supabase Preview" gating merge (sem ✓ verde, sem merge)
|
|
256
|
-
- Política de rollback documentada (cross-ref skill `supabase-migration-repair` v1.27)
|
|
257
|
-
|
|
258
|
-
Recomendação inicial: **OFF** até equipe estabelecer disciplina de PR review.
|
|
259
|
-
|
|
260
|
-
### Workflow esperado após setup
|
|
261
|
-
|
|
262
|
-
```
|
|
263
|
-
Dev abre PR
|
|
264
|
-
↓
|
|
265
|
-
GitHub webhook → Supabase cria preview branch
|
|
266
|
-
↓
|
|
267
|
-
Deploy DAG roda (7 steps canônicos)
|
|
268
|
-
↓
|
|
269
|
-
Required check "Supabase Preview" reportado no PR
|
|
270
|
-
↓
|
|
271
|
-
Dev valida em preview (smoke tests, manual QA)
|
|
272
|
-
↓
|
|
273
|
-
Merge para main (se check ✓ verde)
|
|
274
|
-
↓
|
|
275
|
-
(se "deploy to production" ON) → push para production project Supabase
|
|
276
|
-
↓
|
|
277
|
-
Preview branch auto-delete (em PR merge ou close)
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
### Required check enforcement
|
|
281
|
-
|
|
282
|
-
GitHub branch protection rules:
|
|
283
|
-
|
|
284
|
-
1. Settings → Branches → Add rule para `main`
|
|
285
|
-
2. **Require status checks to pass before merging** — selecionar **"Supabase Preview"** como required
|
|
286
|
-
3. **Sem check ✓ verde → bloqueia merge** (gate canônico — DAG falha = merge bloqueado)
|
|
287
|
-
|
|
288
|
-
### Recomendação canônica
|
|
289
|
-
|
|
290
|
-
**Use GitHub integration em qualquer projeto sério.** Dashboard branching alpha (Pattern 4) tem limitações documentadas que tornam unsuitable para production workflow.
|
|
291
|
-
|
|
292
|
-
## Pattern 4: Dashboard Branching Alpha — Caveats canônicos
|
|
293
|
-
|
|
294
|
-
**Dashboard branching está em ALPHA — desencorajado para projetos sério. Use GitHub integration (Pattern 3).**
|
|
295
|
-
|
|
296
|
-
Caveats canônicos documentados (BRANCH-04):
|
|
297
|
-
|
|
298
|
-
### Caveat 1: Custom roles NÃO capturados
|
|
299
|
-
|
|
300
|
-
Branches criados via Dashboard alpha **NÃO capturam Postgres custom roles** definidos no DB principal.
|
|
301
|
-
|
|
302
|
-
- **Roles definidos em migrations** (`CREATE ROLE` em arquivo `.sql`) → aplicados pelo DAG step 5 (migrate) → presentes no branch
|
|
303
|
-
- **Roles criados via Dashboard SQL editor** ou diretamente no DB → **perdidos** no branch creation
|
|
304
|
-
|
|
305
|
-
Cross-ref skill `supabase-postgres-roles` v1.26: roles **DEVEM** ser definidos em migrations versionadas, nunca via Dashboard ad-hoc.
|
|
306
|
-
|
|
307
|
-
### Caveat 2: Merge só para `main`
|
|
308
|
-
|
|
309
|
-
Dashboard alpha aceita **merge só para `main`** — não suporta merge entre preview branches.
|
|
310
|
-
|
|
311
|
-
- Direção suportada: `preview → main` (1 sentido apenas)
|
|
312
|
-
- **NÃO suportado:** `preview-A → preview-B`, ou seja, não combinar 2 features em desenvolvimento via Dashboard
|
|
313
|
-
|
|
314
|
-
**Workaround:** combinar features via git workflow:
|
|
315
|
-
|
|
316
|
-
```
|
|
317
|
-
git checkout feature-B
|
|
318
|
-
git rebase feature-A # ou git merge feature-A
|
|
319
|
-
git push --force-with-lease
|
|
320
|
-
# PR-B atualizado contém commits de A + B
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
### Caveat 3: Edge Functions sobrescritas no "update branch"
|
|
324
|
-
|
|
325
|
-
Clicar **"Update branch"** no Dashboard sobrescreve **TODAS** as Edge Functions no preview branch com versão atual de `main`.
|
|
326
|
-
|
|
327
|
-
- **Perda silenciosa** — sem confirmation prompt
|
|
328
|
-
- Mudanças in-flight em Edge Functions no preview são **perdidas**
|
|
329
|
-
- Deploy de edge functions via Dashboard alpha é **high-risk**
|
|
330
|
-
|
|
331
|
-
**Mitigação:** sempre commit Edge Functions em git antes de clicar "Update branch".
|
|
332
|
-
|
|
333
|
-
### Caveat 4: Delete de functions MANUAL em main
|
|
334
|
-
|
|
335
|
-
Se você **deleta** uma Edge Function em preview branch, no merge para `main` a deletion **NÃO é propagada automaticamente**.
|
|
336
|
-
|
|
337
|
-
- Edge Function continua existindo em produção mesmo após merge
|
|
338
|
-
- Você deve **manualmente** executar `supabase functions delete <name>` em main após merge
|
|
339
|
-
|
|
340
|
-
Cross-ref: GitHub integration (Pattern 3) propaga deletion via git diff — comportamento esperado em production workflow.
|
|
341
|
-
|
|
342
|
-
### Recomendação canônica explícita
|
|
343
|
-
|
|
344
|
-
- Para qualquer projeto em produção: **GitHub integration** (Pattern 3)
|
|
345
|
-
- Dashboard alpha aceitável APENAS para:
|
|
346
|
-
- Experimentação solo (1 dev, sem time)
|
|
347
|
-
- Prototipagem rápida (sem intenção de production)
|
|
348
|
-
- Projetos sem migration history estável
|
|
349
|
-
|
|
350
|
-
### Tabela comparativa Dashboard alpha vs GitHub integration
|
|
351
|
-
|
|
352
|
-
| | Dashboard alpha | GitHub integration |
|
|
353
|
-
|---|---|---|
|
|
354
|
-
| Custom roles capturados | NÃO | SIM (via migrations) |
|
|
355
|
-
| Merge entre previews | NÃO | SIM (git workflow) |
|
|
356
|
-
| Edge functions safety | Sobrescreve silenciosamente | Versioned via git |
|
|
357
|
-
| Delete propagation | Manual em main | Automatic via merge |
|
|
358
|
-
| Required check enforcement | NÃO | SIM (branch protection rules) |
|
|
359
|
-
| Audit trail | Limited Dashboard logs | Full git history |
|
|
360
|
-
| Maturity | Alpha | Estável (recomendação canônica) |
|
|
361
|
-
| Recomendação | Experimentação solo | Produção |
|
|
362
|
-
|
|
363
|
-
## Pattern 5: Custo Branching Compute Hours
|
|
364
|
-
|
|
365
|
-
Branching tem custo **independente** do projeto principal — atenção canônica para evitar surpresas no invoice (BRANCH-05).
|
|
366
|
-
|
|
367
|
-
### Pricing oficial
|
|
368
|
-
|
|
369
|
-
- **Micro Compute size** (default para preview branches): **$0.01344/h**
|
|
370
|
-
- **Maior compute sizes** disponíveis para persistent branches via `supabase branches update --size <size>`
|
|
371
|
-
- Cobrança **por hora** (arredonda para hora cheia mesmo em branches curtos)
|
|
372
|
-
|
|
373
|
-
### Spend Cap canônico — caveat crítico
|
|
374
|
-
|
|
375
|
-
> **Branching Compute Hours são FORA do Spend Cap do projeto.**
|
|
376
|
-
>
|
|
377
|
-
> Mesmo com Spend Cap configurado em $0 (Pro plan), Branching Compute Hours **continuam sendo cobradas**.
|
|
378
|
-
|
|
379
|
-
Implicação: equipe que adota branching sem revisar billing pode receber invoice surpresa de $50-200/mês adicional em projetos com muitos PRs.
|
|
380
|
-
|
|
381
|
-
### Compute Credits NÃO aplicam
|
|
382
|
-
|
|
383
|
-
- Pro plan vem com **$10/mês de Compute Credits** que cobrem instance do projeto principal
|
|
384
|
-
- **Compute Credits NÃO aplicam a Branching Compute Hours** (FAQ pricing oficial)
|
|
385
|
-
- Cada hora de branch é cobrada **adicionalmente** ao plan base
|
|
386
|
-
|
|
387
|
-
### Linha de billing canônica
|
|
388
|
-
|
|
389
|
-
No invoice mensal Supabase, Branching Compute aparece como linha separada:
|
|
390
|
-
|
|
391
|
-
```
|
|
392
|
-
Pro Plan $25.00/mês
|
|
393
|
-
Compute (Project Main) $0.00 (covered by Compute Credits)
|
|
394
|
-
Branching Compute Hours 240h × $0.01344 = $3.23/mês
|
|
395
|
-
Database egress $0.00 (under threshold)
|
|
396
|
-
-------
|
|
397
|
-
Total $28.23/mês
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
### Mitigações canônicas
|
|
401
|
-
|
|
402
|
-
1. **"Supabase changes only" filter ON** (Pattern 3) — preview branch só para PRs com mudanças em `supabase/`
|
|
403
|
-
2. **1 persistent staging** compartilhado em vez de N preview branches (custo previsível)
|
|
404
|
-
3. **PR lifetime curto** — disciplina de team merge em < 1 semana reduz horas acumuladas
|
|
405
|
-
4. **Monitorar billing manualmente** — Spend Cap NÃO protege contra Branching Compute
|
|
406
|
-
5. **Documentar custo esperado** no onboarding do projeto — equipe sabe o trade-off
|
|
407
|
-
|
|
408
|
-
### Cálculo de capacity planning
|
|
409
|
-
|
|
410
|
-
Fórmula canônica:
|
|
411
|
-
|
|
412
|
-
```
|
|
413
|
-
Custo Branching Compute/mês = (N_PRs_ativos × duracao_media_horas × compute_size_hourly_rate)
|
|
414
|
-
|
|
415
|
-
Exemplo:
|
|
416
|
-
20 PRs/mês × 48h média × $0.01344/h = $12.90/mês adicional
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
Para persistent branches:
|
|
420
|
-
|
|
421
|
-
```
|
|
422
|
-
Custo persistent branch/mês = (24h × 30 dias × compute_size_hourly_rate)
|
|
423
|
-
|
|
424
|
-
Exemplo (Micro 24/7):
|
|
425
|
-
720h × $0.01344/h = $9.67/mês por branch persistent
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
## Anti-patterns
|
|
429
|
-
|
|
430
|
-
### Anti-pattern 1: Usar Dashboard branching alpha para projeto sério
|
|
431
|
-
|
|
432
|
-
**Errado:** Time de 5+ devs gerencia branches via Dashboard alpha em projeto production.
|
|
433
|
-
|
|
434
|
-
**Por quê:** custom roles não capturados + edge functions sobrescritas silenciosamente + merge só p/ main = surprise bugs em produção; sem audit trail confiável; sem required check enforcement.
|
|
435
|
-
|
|
436
|
-
**Certo:** GitHub integration (Pattern 3) — versionado, audit trail completo via git, branch protection rules enforced, deploy DAG transparente com logs por step.
|
|
437
|
-
|
|
438
|
-
### Anti-pattern 2: Ignorar Spend Cap caveat
|
|
439
|
-
|
|
440
|
-
**Errado:** Habilitar branching assumindo Spend Cap protege contra cost overrun.
|
|
441
|
-
|
|
442
|
-
**Por quê:** Branching Compute Hours são **FORA do Spend Cap** — projeto Pro plan com 30 PRs/mês de 72h média pode gerar **$29-100/mês adicional sem alert algum**. Compute Credits NÃO aplicam — cada hora é cobrança nova.
|
|
443
|
-
|
|
444
|
-
**Certo:**
|
|
445
|
-
|
|
446
|
-
- monitorar billing manualmente (Settings → Usage → Branching Compute Hours)
|
|
447
|
-
- "Supabase changes only" filter ON (Pattern 3 step 4)
|
|
448
|
-
- considerar persistent branch único compartilhado em vez de 1 preview/PR
|
|
449
|
-
- documentar custo no onboarding do time
|
|
450
|
-
|
|
451
|
-
### Anti-pattern 3: Tentar merge entre preview branches
|
|
452
|
-
|
|
453
|
-
**Errado:** Time tenta `preview-feature-A → preview-feature-B` via Dashboard branching.
|
|
454
|
-
|
|
455
|
-
**Por quê:** Dashboard NÃO suporta merge entre preview branches — só direção `preview → main`. Tentativa resulta em state inconsistente, schemas dessincronizados, ou silent no-op.
|
|
456
|
-
|
|
457
|
-
**Certo:** combinar features via git workflow:
|
|
458
|
-
|
|
459
|
-
```
|
|
460
|
-
# PR-A merges to main primeiro
|
|
461
|
-
git checkout main
|
|
462
|
-
git pull
|
|
463
|
-
|
|
464
|
-
# PR-B rebase on top
|
|
465
|
-
git checkout feature-B
|
|
466
|
-
git rebase main
|
|
467
|
-
git push --force-with-lease
|
|
468
|
-
|
|
469
|
-
# preview-B é recriado com mudanças de A + B
|
|
470
|
-
# merge to main
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
### Anti-pattern 4: Push direto na main sem preview branch
|
|
474
|
-
|
|
475
|
-
**Errado:** Dev pusha migration direto em `main` sem PR/preview branch — "vai dar certo, é só um ALTER TABLE".
|
|
476
|
-
|
|
477
|
-
**Por quê:** sem validação de DAG → migration falha em production → downtime + rollback complexo + possíveis dados perdidos. Especialmente perigoso para `DROP COLUMN`, `ALTER TYPE`, mudanças destrutivas.
|
|
478
|
-
|
|
479
|
-
**Certo:** SEMPRE PR + preview branch validado:
|
|
480
|
-
|
|
481
|
-
1. Migration em PR aberto
|
|
482
|
-
2. Preview branch DAG executa (step 5 migrate validado)
|
|
483
|
-
3. Required check "Supabase Preview" ✓ verde
|
|
484
|
-
4. Merge gated por required check + branch protection rule
|
|
485
|
-
5. (Se "deploy to production" ON) → automatic push para production
|
|
486
|
-
|
|
487
|
-
Cross-ref skill `evolucao-schema-compativel` (v1.22) — 3-step migration safe para mudanças destrutivas.
|
|
488
|
-
|
|
489
|
-
### Anti-pattern 5: Esperar persistent branch funcionar como production
|
|
490
|
-
|
|
491
|
-
**Errado:** Assumir persistent staging branch é "cópia de produção" para QA team.
|
|
492
|
-
|
|
493
|
-
**Por quê:** branches são **dataless by design** — `seed.sql` é dados sintéticos, não snapshot real. Auth.users separado, sem dados de prod, sem volume real, sem latência real.
|
|
494
|
-
|
|
495
|
-
**Certo:**
|
|
496
|
-
|
|
497
|
-
- persistent branches são para **schema/code validation**, NÃO para QA com dados reais
|
|
498
|
-
- Se precisar QA com dados reais → use staging Supabase project **separado** (não branching)
|
|
499
|
-
- Staging project separado tem SLA, dados reais via replicação, custo previsível Pro plan
|
|
500
|
-
|
|
501
|
-
### Anti-pattern 6: Criar persistent branch sem cleanup policy
|
|
502
|
-
|
|
503
|
-
**Errado:** Criar persistent branches ad-hoc sem documentar lifecycle ou owner.
|
|
504
|
-
|
|
505
|
-
**Por quê:** persistent branches não auto-pausam — acumulam Branching Compute Hours **24/7 indefinidamente**. 6 meses depois, ninguém sabe pra que serve o branch `qa-test-old`, mas continua sendo cobrado $9.67/mês × 6 = **$58 desperdiçados**.
|
|
506
|
-
|
|
507
|
-
**Certo:**
|
|
508
|
-
|
|
509
|
-
- documentar persistent branches em README ou onboarding doc
|
|
510
|
-
- definir owner por branch (Slack handle + função)
|
|
511
|
-
- review trimestral: `supabase --experimental branches list` + cleanup
|
|
512
|
-
- comment no Dashboard descrevendo propósito + data de criação
|
|
513
|
-
|
|
514
|
-
## Cross-suite integration (v1.27)
|
|
515
|
-
|
|
516
|
-
Esta skill é base para skills v1.27 (Phases 150-153):
|
|
517
|
-
|
|
518
|
-
- **supabase-config-toml-remotes** (Phase 150) — `[remotes]` block + branch-specific config + secrets per-branch
|
|
519
|
-
- **supabase-ci-cd-github-actions** (Phase 151) — 8 workflows canônicos GitHub Actions (preview deploy, prod deploy, migration gates)
|
|
520
|
-
- **supabase-pgtap-testing** (Phase 152) — testes pgTAP que rodam no DAG step 5/6
|
|
521
|
-
- **supabase-migration-repair** (Phase 153) — `migration list/repair` + rollback preview branch quando step migrate falha
|
|
522
|
-
|
|
523
|
-
Base para agents v1.27 (Phase 154):
|
|
524
|
-
|
|
525
|
-
- **supabase-branching-architect** — projeta strategy (preview-only vs preview + persistent staging mix)
|
|
526
|
-
- **supabase-cicd-pipeline-implementer** — materializa GitHub Actions workflows + Supabase integration config
|
|
527
|
-
|
|
528
|
-
Pattern de handoff cooperativo herdado v1.23-v1.26: **architect** projeta → **cicd-pipeline-implementer** materializa → **release-pipeline-auditor** (v1.10) audita hermeticidade do pipeline final. Nenhum agente descarta upstream — handoff cooperativo SQL (princípio canônico v1.23).
|
|
529
|
-
|
|
530
|
-
## Ver também
|
|
531
|
-
|
|
532
|
-
- [supabase-config-toml-remotes](../supabase-config-toml-remotes/SKILL.md) (v1.27, Phase 150) — `[remotes]` block + branch-specific config + secrets per-branch
|
|
533
|
-
- [supabase-ci-cd-github-actions](../supabase-ci-cd-github-actions/SKILL.md) (v1.27, Phase 151) — 8 workflows canônicos GitHub Actions
|
|
534
|
-
- [supabase-pgtap-testing](../supabase-pgtap-testing/SKILL.md) (v1.27, Phase 152) — testes pgTAP integrados no DAG
|
|
535
|
-
- [supabase-migration-repair](../supabase-migration-repair/SKILL.md) (v1.27, Phase 153) — `migration list/repair` + rollback preview branch
|
|
536
|
-
- [supabase-migrations](../supabase-migrations/SKILL.md) (v1.23) — 5 blocos obrigatórios CREATE TABLE, naming canônico
|
|
537
|
-
- [supabase-declarative-schema](../supabase-declarative-schema/SKILL.md) — schema declarative workflow (`supabase/schemas/`)
|
|
538
|
-
- [evolucao-schema-compativel](../evolucao-schema-compativel/SKILL.md) (v1.22) — 3-step migration safe rolling upgrade (expand → migrate data → contract)
|
|
539
|
-
- [release-engineering](../release-engineering/SKILL.md) — deployment philosophy + self-service deploys
|
|
540
|
-
- [hermetic-builds](../hermetic-builds/SKILL.md) — pipeline reproducibility + isolation + provenance
|
|
541
|
-
- [supabase-postgres-roles](../supabase-postgres-roles/SKILL.md) (v1.26) — caveat custom roles NÃO capturados em Dashboard alpha (Pattern 4 Caveat 1)
|
|
542
|
-
- [supabase-edge-functions](../supabase-edge-functions/SKILL.md) — Edge Functions deploy no DAG step 7
|
|
543
|
-
- [glossário compartilhado](../_shared-supabase/glossary.md) — termos branching workflow, preview branch, persistent branch, deploy DAG, Branching Compute Hours (será +10 termos em REL-04 v1.27)
|
|
544
|
-
- Doc oficial: [Supabase Branching](https://supabase.com/docs/guides/deployment/branching), [GitHub Integration](https://supabase.com/docs/guides/deployment/branching#github-integration), [Pricing](https://supabase.com/pricing)
|
|
1
|
+
---
|
|
2
|
+
name: supabase-branching-workflow
|
|
3
|
+
description: Use ao adotar Supabase Branching — preview vs persistent branches, deploy DAG 7 steps (clone→pull→health→configure→migrate→seed→deploy), GitHub integration setup, Dashboard alpha…
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Supabase — Branching Workflow
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
Supabase Branching cria cópias **isoladas** do projeto Postgres + Edge Functions + Storage config para cada branch git — workflow tipo Vercel preview deployments, mas com schema/migrations versionados.
|
|
11
|
+
|
|
12
|
+
Trigger phrases:
|
|
13
|
+
|
|
14
|
+
- "preview branch Supabase", "persistent branch staging"
|
|
15
|
+
- "deploy DAG Supabase", "branching workflow"
|
|
16
|
+
- "GitHub integration Supabase", "automatic branching"
|
|
17
|
+
- "Dashboard branching alpha"
|
|
18
|
+
- "Branching Compute Hours custo", "custo branching Supabase"
|
|
19
|
+
- "preview ephemeral vs long-lived"
|
|
20
|
+
- "PR-driven Supabase workflow"
|
|
21
|
+
|
|
22
|
+
**Use Supabase Branching APENAS para:**
|
|
23
|
+
|
|
24
|
+
- Validar migrations + schema declarativo em PR antes do merge
|
|
25
|
+
- Isolar mudanças destrutivas (DROP COLUMN, ALTER TYPE) em preview
|
|
26
|
+
- QA team rodar smoke tests em staging persistente
|
|
27
|
+
- Validar deploy de Edge Functions com `[remotes]` block em `config.toml`
|
|
28
|
+
|
|
29
|
+
**NÃO use Supabase Branching para:**
|
|
30
|
+
|
|
31
|
+
- QA com dados reais de produção — branches são **dataless by design** (seed.sql é dados sintéticos)
|
|
32
|
+
- Replicar production traffic — preview branches têm compute Micro por default (não dimensionado para load)
|
|
33
|
+
- Substituir staging Supabase project separado quando precisar SLA/uptime
|
|
34
|
+
- Test environments sem expirar — preview branches são **ephemeral** (auto-delete em PR merge/close)
|
|
35
|
+
|
|
36
|
+
## Princípio canônico
|
|
37
|
+
|
|
38
|
+
**Preview branches:** ephemeral, criados em PR open, auto-pause em inatividade, **auto-delete em PR merge/close**.
|
|
39
|
+
|
|
40
|
+
**Persistent branches:** long-lived (staging/QA), NÃO auto-pause, requerem delete **manual** via Dashboard ou CLI.
|
|
41
|
+
|
|
42
|
+
Critério de escolha canônico:
|
|
43
|
+
|
|
44
|
+
- PR-driven dev workflow + features curtas (< 1 semana) → **preview**
|
|
45
|
+
- Staging compartilhada + features longas + manual control → **persistent**
|
|
46
|
+
- Mix possível: 1 persistent staging compartilhado + N ephemeral previews por PR
|
|
47
|
+
|
|
48
|
+
## ALERTA DE CUSTO — Branching Compute Hours
|
|
49
|
+
|
|
50
|
+
> **ATENÇÃO CANÔNICA — leia antes de habilitar branching em produção.**
|
|
51
|
+
>
|
|
52
|
+
> Cada branch Supabase (preview ou persistent) consome **Branching Compute Hours** independentes do projeto principal.
|
|
53
|
+
>
|
|
54
|
+
> - **Micro Compute size starts at $0.01344/h** (cobrança por hora de branch ativo)
|
|
55
|
+
> - **Branching Compute Hours FORA do Spend Cap** — Spend Cap do projeto NÃO protege contra este custo
|
|
56
|
+
> - **Compute Credits NÃO aplicam** a Branching Compute (FAQ pricing oficial)
|
|
57
|
+
> - **Billing aparece como "Branching Compute Hours"** no invoice (linha separada)
|
|
58
|
+
>
|
|
59
|
+
> ### Estimativa concreta
|
|
60
|
+
>
|
|
61
|
+
> - **10 PRs/mês × 24h média de vida útil** = 240h × $0.01344 = **~$3.23/mês adicional**
|
|
62
|
+
> - **30 PRs/mês × 72h média (PRs grandes)** = 2160h × $0.01344 = **~$29.03/mês adicional**
|
|
63
|
+
> - **Persistent staging branch 24/7** = 720h × $0.01344 = **~$9.67/mês adicional** (acumula continuamente)
|
|
64
|
+
>
|
|
65
|
+
> ### Atenção
|
|
66
|
+
>
|
|
67
|
+
> - Persistent branches **acumulam horas continuamente** (não pausam) — custo previsível por mês
|
|
68
|
+
> - Preview branches **auto-pausam** em inatividade — custo varia com atividade do PR
|
|
69
|
+
> - Branch creation pode levar até **30 minutos** (health check) — primeira hora já é cobrada
|
|
70
|
+
>
|
|
71
|
+
> ### Mitigações canônicas
|
|
72
|
+
>
|
|
73
|
+
> - Habilitar **"Supabase changes only" filter** (Pattern 3) — preview branch SÓ para PRs que tocam `supabase/`
|
|
74
|
+
> - Considerar **1 persistent staging** compartilhado em vez de N preview branches
|
|
75
|
+
> - Monitorar billing manualmente — **Spend Cap NÃO protege**, reforço
|
|
76
|
+
|
|
77
|
+
## Pattern 1: Preview vs Persistent Branches
|
|
78
|
+
|
|
79
|
+
Distinção operacional canônica (BRANCH-01):
|
|
80
|
+
|
|
81
|
+
| | Preview Branch | Persistent Branch |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| Ciclo de vida | Ephemeral (criado em PR open) | Long-lived (criado manualmente) |
|
|
84
|
+
| Auto-pause | Sim (inatividade) | NÃO |
|
|
85
|
+
| Auto-delete | Sim (PR merge/close) | NÃO (delete manual via Dashboard/CLI) |
|
|
86
|
+
| Caso de uso | PR-driven dev workflow | Staging/QA compartilhada |
|
|
87
|
+
| Custo (Branching Compute Hours) | Acumula durante PR vida útil | Acumula continuamente 24/7 |
|
|
88
|
+
| Trigger | GitHub PR webhook (automatic) | CLI ou Dashboard (manual) |
|
|
89
|
+
| Naming | Auto: `pr-<N>-<branch-name>` | User-defined (ex: `staging`, `qa`) |
|
|
90
|
+
| Health check inicial | Até 30 minutos | Até 30 minutos |
|
|
91
|
+
|
|
92
|
+
### Critério de escolha
|
|
93
|
+
|
|
94
|
+
**Use preview SE:**
|
|
95
|
+
|
|
96
|
+
- Equipe usa PR workflow disciplinado (features curtas, < 1 semana de PR aberto)
|
|
97
|
+
- Cada PR deve ter ambiente isolado para review
|
|
98
|
+
- Aceita custo proporcional a número de PRs ativos
|
|
99
|
+
|
|
100
|
+
**Use persistent SE:**
|
|
101
|
+
|
|
102
|
+
- Precisa staging compartilhado para QA team validar release
|
|
103
|
+
- Features longas (sprints multi-semana com PR aberto continuamente)
|
|
104
|
+
- Manual control sobre lifecycle (não querer auto-delete)
|
|
105
|
+
|
|
106
|
+
**Pode haver MIX (recomendação canônica para times maduros):**
|
|
107
|
+
|
|
108
|
+
- 1 persistent branch `staging` para QA team rodar smoke tests pós-merge para `main`
|
|
109
|
+
- N preview branches ephemeral, 1 por PR ativo, para review de mudanças
|
|
110
|
+
|
|
111
|
+
### CLI canônico
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# criar persistent branch via CLI
|
|
115
|
+
supabase --experimental branches create staging --persistent
|
|
116
|
+
|
|
117
|
+
# listar branches do projeto
|
|
118
|
+
supabase --experimental branches list
|
|
119
|
+
|
|
120
|
+
# inspecionar branch específico
|
|
121
|
+
supabase --experimental branches get staging
|
|
122
|
+
|
|
123
|
+
# deletar branch
|
|
124
|
+
supabase --experimental branches delete staging
|
|
125
|
+
|
|
126
|
+
# atualizar persistent branch para latest main
|
|
127
|
+
supabase --experimental branches update staging
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Caveat — Health check pode levar 30 minutos
|
|
131
|
+
|
|
132
|
+
Branch creation aplica DAG (Pattern 2) — health check do Postgres pode demorar **até 30 minutos** dependendo de:
|
|
133
|
+
|
|
134
|
+
- Tamanho do schema migrado
|
|
135
|
+
- Número de migrations
|
|
136
|
+
- Tamanho do seed.sql
|
|
137
|
+
|
|
138
|
+
Durante este tempo, a primeira **hora de Branching Compute** já é cobrada (Pattern 5 — custo arrendondado a hora cheia inicial).
|
|
139
|
+
|
|
140
|
+
## Pattern 2: Deploy DAG — 7 steps canônicos
|
|
141
|
+
|
|
142
|
+
Cada branch (preview ou persistent) aplica um **DAG (Directed Acyclic Graph)** de 7 steps em ordem (BRANCH-02):
|
|
143
|
+
|
|
144
|
+
1. **clone** — clone do repositório git no contexto do branch Supabase
|
|
145
|
+
2. **pull** — pull das migrations (`supabase/migrations/`) e schema declarativo (`supabase/schemas/`)
|
|
146
|
+
3. **health** — health check do branch DB (espera até 30 min — Postgres ready + connection pooler ativo)
|
|
147
|
+
4. **configure** — aplica `config.toml` (incluindo `[remotes.<branch>]` block — cross-ref skill `supabase-config-toml-remotes` v1.27)
|
|
148
|
+
5. **migrate** — executa migrations em ordem cronológica (`supabase/migrations/*.sql`)
|
|
149
|
+
6. **seed** — aplica `supabase/seed.sql` (dataless by design — sem dados de produção)
|
|
150
|
+
7. **deploy** — deploy de Edge Functions e secrets (via `supabase functions deploy`)
|
|
151
|
+
|
|
152
|
+
### Diagrama ASCII
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
clone → pull → health → configure → migrate → seed → deploy
|
|
156
|
+
✓ ✓ ✓ ✓ ✓ ✓ ✓
|
|
157
|
+
↓ falha
|
|
158
|
+
[seed: SKIPPED]
|
|
159
|
+
[deploy: SKIPPED]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Skip behavior canônico (anti-cascading failure)
|
|
163
|
+
|
|
164
|
+
**Falha em step N → todos steps N+1...7 são SKIPPED.**
|
|
165
|
+
|
|
166
|
+
Exemplo concreto:
|
|
167
|
+
|
|
168
|
+
- **migrate falha no step 5** (ex: migration com `DROP COLUMN` em coluna que tem FK)
|
|
169
|
+
- **seed (step 6) é SKIPPED** — sem aplicar seed.sql
|
|
170
|
+
- **deploy (step 7) é SKIPPED** — sem deploy de Edge Functions
|
|
171
|
+
- DAG status no Dashboard mostra: ✗ migrate (step 5), ⊘ seed (skipped), ⊘ deploy (skipped)
|
|
172
|
+
|
|
173
|
+
Este comportamento previne **cascading failures** — se schema falha, não aplicar Edge Functions que dependem do schema.
|
|
174
|
+
|
|
175
|
+
### Logs por step
|
|
176
|
+
|
|
177
|
+
Cada step tem stdout/stderr **próprio** acessível no Dashboard:
|
|
178
|
+
|
|
179
|
+
- **Settings → Integrations → GitHub → "View deployment logs"** (link no PR comment)
|
|
180
|
+
- Logs persistidos durante vida útil do branch
|
|
181
|
+
- Útil para debug: step 5 (migrate) tem stderr com SQL error específico
|
|
182
|
+
|
|
183
|
+
### Recovery pattern
|
|
184
|
+
|
|
185
|
+
**Sem rollback automático** — branch fica em estado "failed".
|
|
186
|
+
|
|
187
|
+
Para recovery:
|
|
188
|
+
|
|
189
|
+
1. Push **novo commit** no PR com migration corrigida
|
|
190
|
+
2. GitHub webhook → re-run DAG (steps 1-7 do zero)
|
|
191
|
+
3. Se step 5 (migrate) passa → step 6 (seed) e step 7 (deploy) executam
|
|
192
|
+
|
|
193
|
+
Se migration drift entre branches → ver skill `supabase-migration-repair` (v1.27, Phase 153) para `migration list/repair`.
|
|
194
|
+
|
|
195
|
+
### Caveat — Dataless by design
|
|
196
|
+
|
|
197
|
+
`seed.sql` aplicado no step 6 NÃO deve conter:
|
|
198
|
+
|
|
199
|
+
- Dados sensíveis de produção (PII, tokens, secrets)
|
|
200
|
+
- Snapshot real de tabelas grandes
|
|
201
|
+
- Dados com FKs para tabelas Auth (`auth.users`) — preview branches têm Auth schema separado
|
|
202
|
+
|
|
203
|
+
**Recomendação canônica:** seed.sql contém apenas:
|
|
204
|
+
|
|
205
|
+
- Dados de referência (ex: lista de países, categorias estáticas)
|
|
206
|
+
- Fixtures sintéticos pequenos para smoke tests
|
|
207
|
+
- Setup de roles + permissions iniciais (cross-ref skill `supabase-postgres-roles` v1.26)
|
|
208
|
+
|
|
209
|
+
Preview branches são para **dev workflow**, não para QA com dados reais — se precisar dados reais, use staging Supabase project separado.
|
|
210
|
+
|
|
211
|
+
## Pattern 3: GitHub Integration Setup
|
|
212
|
+
|
|
213
|
+
Setup canônico para preview branching automatizado via GitHub (BRANCH-03):
|
|
214
|
+
|
|
215
|
+
### Step 1: Authorize Supabase no GitHub
|
|
216
|
+
|
|
217
|
+
1. Dashboard → **Project Settings → Integrations → GitHub**
|
|
218
|
+
2. Clicar **"Authorize Supabase"** — OAuth flow do GitHub
|
|
219
|
+
3. Selecionar **organization** + **repos específicos** (princípio do least privilege — não autorizar todos os repos)
|
|
220
|
+
|
|
221
|
+
### Step 2: Working directory
|
|
222
|
+
|
|
223
|
+
Definir diretório raiz do projeto Supabase no repositório:
|
|
224
|
+
|
|
225
|
+
- **Monorepo single Supabase project:** `./`
|
|
226
|
+
- **Monorepo com Supabase em subdiretório:** `./supabase` ou `./apps/api/supabase`
|
|
227
|
+
- **Default:** `./` (raiz do repo)
|
|
228
|
+
|
|
229
|
+
Working directory deve conter `supabase/migrations/`, `supabase/schemas/`, `supabase/config.toml`.
|
|
230
|
+
|
|
231
|
+
### Step 3: Automatic branching toggle
|
|
232
|
+
|
|
233
|
+
- **ON (recomendado):** preview branch criado **automaticamente** quando PR é aberto
|
|
234
|
+
- **OFF:** branches criados apenas manualmente via CLI ou Dashboard
|
|
235
|
+
|
|
236
|
+
Recomendação: **ON** para workflow PR-driven canônico.
|
|
237
|
+
|
|
238
|
+
### Step 4: "Supabase changes only" filter
|
|
239
|
+
|
|
240
|
+
**Recomendação canônica para reduzir custo Branching Compute Hours:**
|
|
241
|
+
|
|
242
|
+
- **ON:** preview branch criado **APENAS** se o PR toca arquivos em `supabase/` (migrations, schemas, functions, config.toml)
|
|
243
|
+
- **OFF:** preview branch criado em **TODOS** os PRs (alto custo se time abre muitos PRs frontend-only)
|
|
244
|
+
|
|
245
|
+
Recomendação: **ON** em todos projetos com Spend Cap awareness (cross-ref Pattern 5).
|
|
246
|
+
|
|
247
|
+
### Step 5: Deploy to production toggle
|
|
248
|
+
|
|
249
|
+
- **ON:** quando PR é merged para `main`, mudanças são automaticamente push para production project Supabase
|
|
250
|
+
- **OFF:** merge não trigger deploy production (deploy manual via CLI ou outro workflow CI)
|
|
251
|
+
|
|
252
|
+
**Use com CAUTELA** — exige:
|
|
253
|
+
|
|
254
|
+
- Migrations bem testadas em preview branch
|
|
255
|
+
- Required check "Supabase Preview" gating merge (sem ✓ verde, sem merge)
|
|
256
|
+
- Política de rollback documentada (cross-ref skill `supabase-migration-repair` v1.27)
|
|
257
|
+
|
|
258
|
+
Recomendação inicial: **OFF** até equipe estabelecer disciplina de PR review.
|
|
259
|
+
|
|
260
|
+
### Workflow esperado após setup
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
Dev abre PR
|
|
264
|
+
↓
|
|
265
|
+
GitHub webhook → Supabase cria preview branch
|
|
266
|
+
↓
|
|
267
|
+
Deploy DAG roda (7 steps canônicos)
|
|
268
|
+
↓
|
|
269
|
+
Required check "Supabase Preview" reportado no PR
|
|
270
|
+
↓
|
|
271
|
+
Dev valida em preview (smoke tests, manual QA)
|
|
272
|
+
↓
|
|
273
|
+
Merge para main (se check ✓ verde)
|
|
274
|
+
↓
|
|
275
|
+
(se "deploy to production" ON) → push para production project Supabase
|
|
276
|
+
↓
|
|
277
|
+
Preview branch auto-delete (em PR merge ou close)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Required check enforcement
|
|
281
|
+
|
|
282
|
+
GitHub branch protection rules:
|
|
283
|
+
|
|
284
|
+
1. Settings → Branches → Add rule para `main`
|
|
285
|
+
2. **Require status checks to pass before merging** — selecionar **"Supabase Preview"** como required
|
|
286
|
+
3. **Sem check ✓ verde → bloqueia merge** (gate canônico — DAG falha = merge bloqueado)
|
|
287
|
+
|
|
288
|
+
### Recomendação canônica
|
|
289
|
+
|
|
290
|
+
**Use GitHub integration em qualquer projeto sério.** Dashboard branching alpha (Pattern 4) tem limitações documentadas que tornam unsuitable para production workflow.
|
|
291
|
+
|
|
292
|
+
## Pattern 4: Dashboard Branching Alpha — Caveats canônicos
|
|
293
|
+
|
|
294
|
+
**Dashboard branching está em ALPHA — desencorajado para projetos sério. Use GitHub integration (Pattern 3).**
|
|
295
|
+
|
|
296
|
+
Caveats canônicos documentados (BRANCH-04):
|
|
297
|
+
|
|
298
|
+
### Caveat 1: Custom roles NÃO capturados
|
|
299
|
+
|
|
300
|
+
Branches criados via Dashboard alpha **NÃO capturam Postgres custom roles** definidos no DB principal.
|
|
301
|
+
|
|
302
|
+
- **Roles definidos em migrations** (`CREATE ROLE` em arquivo `.sql`) → aplicados pelo DAG step 5 (migrate) → presentes no branch
|
|
303
|
+
- **Roles criados via Dashboard SQL editor** ou diretamente no DB → **perdidos** no branch creation
|
|
304
|
+
|
|
305
|
+
Cross-ref skill `supabase-postgres-roles` v1.26: roles **DEVEM** ser definidos em migrations versionadas, nunca via Dashboard ad-hoc.
|
|
306
|
+
|
|
307
|
+
### Caveat 2: Merge só para `main`
|
|
308
|
+
|
|
309
|
+
Dashboard alpha aceita **merge só para `main`** — não suporta merge entre preview branches.
|
|
310
|
+
|
|
311
|
+
- Direção suportada: `preview → main` (1 sentido apenas)
|
|
312
|
+
- **NÃO suportado:** `preview-A → preview-B`, ou seja, não combinar 2 features em desenvolvimento via Dashboard
|
|
313
|
+
|
|
314
|
+
**Workaround:** combinar features via git workflow:
|
|
315
|
+
|
|
316
|
+
```
|
|
317
|
+
git checkout feature-B
|
|
318
|
+
git rebase feature-A # ou git merge feature-A
|
|
319
|
+
git push --force-with-lease
|
|
320
|
+
# PR-B atualizado contém commits de A + B
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Caveat 3: Edge Functions sobrescritas no "update branch"
|
|
324
|
+
|
|
325
|
+
Clicar **"Update branch"** no Dashboard sobrescreve **TODAS** as Edge Functions no preview branch com versão atual de `main`.
|
|
326
|
+
|
|
327
|
+
- **Perda silenciosa** — sem confirmation prompt
|
|
328
|
+
- Mudanças in-flight em Edge Functions no preview são **perdidas**
|
|
329
|
+
- Deploy de edge functions via Dashboard alpha é **high-risk**
|
|
330
|
+
|
|
331
|
+
**Mitigação:** sempre commit Edge Functions em git antes de clicar "Update branch".
|
|
332
|
+
|
|
333
|
+
### Caveat 4: Delete de functions MANUAL em main
|
|
334
|
+
|
|
335
|
+
Se você **deleta** uma Edge Function em preview branch, no merge para `main` a deletion **NÃO é propagada automaticamente**.
|
|
336
|
+
|
|
337
|
+
- Edge Function continua existindo em produção mesmo após merge
|
|
338
|
+
- Você deve **manualmente** executar `supabase functions delete <name>` em main após merge
|
|
339
|
+
|
|
340
|
+
Cross-ref: GitHub integration (Pattern 3) propaga deletion via git diff — comportamento esperado em production workflow.
|
|
341
|
+
|
|
342
|
+
### Recomendação canônica explícita
|
|
343
|
+
|
|
344
|
+
- Para qualquer projeto em produção: **GitHub integration** (Pattern 3)
|
|
345
|
+
- Dashboard alpha aceitável APENAS para:
|
|
346
|
+
- Experimentação solo (1 dev, sem time)
|
|
347
|
+
- Prototipagem rápida (sem intenção de production)
|
|
348
|
+
- Projetos sem migration history estável
|
|
349
|
+
|
|
350
|
+
### Tabela comparativa Dashboard alpha vs GitHub integration
|
|
351
|
+
|
|
352
|
+
| | Dashboard alpha | GitHub integration |
|
|
353
|
+
|---|---|---|
|
|
354
|
+
| Custom roles capturados | NÃO | SIM (via migrations) |
|
|
355
|
+
| Merge entre previews | NÃO | SIM (git workflow) |
|
|
356
|
+
| Edge functions safety | Sobrescreve silenciosamente | Versioned via git |
|
|
357
|
+
| Delete propagation | Manual em main | Automatic via merge |
|
|
358
|
+
| Required check enforcement | NÃO | SIM (branch protection rules) |
|
|
359
|
+
| Audit trail | Limited Dashboard logs | Full git history |
|
|
360
|
+
| Maturity | Alpha | Estável (recomendação canônica) |
|
|
361
|
+
| Recomendação | Experimentação solo | Produção |
|
|
362
|
+
|
|
363
|
+
## Pattern 5: Custo Branching Compute Hours
|
|
364
|
+
|
|
365
|
+
Branching tem custo **independente** do projeto principal — atenção canônica para evitar surpresas no invoice (BRANCH-05).
|
|
366
|
+
|
|
367
|
+
### Pricing oficial
|
|
368
|
+
|
|
369
|
+
- **Micro Compute size** (default para preview branches): **$0.01344/h**
|
|
370
|
+
- **Maior compute sizes** disponíveis para persistent branches via `supabase branches update --size <size>`
|
|
371
|
+
- Cobrança **por hora** (arredonda para hora cheia mesmo em branches curtos)
|
|
372
|
+
|
|
373
|
+
### Spend Cap canônico — caveat crítico
|
|
374
|
+
|
|
375
|
+
> **Branching Compute Hours são FORA do Spend Cap do projeto.**
|
|
376
|
+
>
|
|
377
|
+
> Mesmo com Spend Cap configurado em $0 (Pro plan), Branching Compute Hours **continuam sendo cobradas**.
|
|
378
|
+
|
|
379
|
+
Implicação: equipe que adota branching sem revisar billing pode receber invoice surpresa de $50-200/mês adicional em projetos com muitos PRs.
|
|
380
|
+
|
|
381
|
+
### Compute Credits NÃO aplicam
|
|
382
|
+
|
|
383
|
+
- Pro plan vem com **$10/mês de Compute Credits** que cobrem instance do projeto principal
|
|
384
|
+
- **Compute Credits NÃO aplicam a Branching Compute Hours** (FAQ pricing oficial)
|
|
385
|
+
- Cada hora de branch é cobrada **adicionalmente** ao plan base
|
|
386
|
+
|
|
387
|
+
### Linha de billing canônica
|
|
388
|
+
|
|
389
|
+
No invoice mensal Supabase, Branching Compute aparece como linha separada:
|
|
390
|
+
|
|
391
|
+
```
|
|
392
|
+
Pro Plan $25.00/mês
|
|
393
|
+
Compute (Project Main) $0.00 (covered by Compute Credits)
|
|
394
|
+
Branching Compute Hours 240h × $0.01344 = $3.23/mês
|
|
395
|
+
Database egress $0.00 (under threshold)
|
|
396
|
+
-------
|
|
397
|
+
Total $28.23/mês
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Mitigações canônicas
|
|
401
|
+
|
|
402
|
+
1. **"Supabase changes only" filter ON** (Pattern 3) — preview branch só para PRs com mudanças em `supabase/`
|
|
403
|
+
2. **1 persistent staging** compartilhado em vez de N preview branches (custo previsível)
|
|
404
|
+
3. **PR lifetime curto** — disciplina de team merge em < 1 semana reduz horas acumuladas
|
|
405
|
+
4. **Monitorar billing manualmente** — Spend Cap NÃO protege contra Branching Compute
|
|
406
|
+
5. **Documentar custo esperado** no onboarding do projeto — equipe sabe o trade-off
|
|
407
|
+
|
|
408
|
+
### Cálculo de capacity planning
|
|
409
|
+
|
|
410
|
+
Fórmula canônica:
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
Custo Branching Compute/mês = (N_PRs_ativos × duracao_media_horas × compute_size_hourly_rate)
|
|
414
|
+
|
|
415
|
+
Exemplo:
|
|
416
|
+
20 PRs/mês × 48h média × $0.01344/h = $12.90/mês adicional
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Para persistent branches:
|
|
420
|
+
|
|
421
|
+
```
|
|
422
|
+
Custo persistent branch/mês = (24h × 30 dias × compute_size_hourly_rate)
|
|
423
|
+
|
|
424
|
+
Exemplo (Micro 24/7):
|
|
425
|
+
720h × $0.01344/h = $9.67/mês por branch persistent
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
## Anti-patterns
|
|
429
|
+
|
|
430
|
+
### Anti-pattern 1: Usar Dashboard branching alpha para projeto sério
|
|
431
|
+
|
|
432
|
+
**Errado:** Time de 5+ devs gerencia branches via Dashboard alpha em projeto production.
|
|
433
|
+
|
|
434
|
+
**Por quê:** custom roles não capturados + edge functions sobrescritas silenciosamente + merge só p/ main = surprise bugs em produção; sem audit trail confiável; sem required check enforcement.
|
|
435
|
+
|
|
436
|
+
**Certo:** GitHub integration (Pattern 3) — versionado, audit trail completo via git, branch protection rules enforced, deploy DAG transparente com logs por step.
|
|
437
|
+
|
|
438
|
+
### Anti-pattern 2: Ignorar Spend Cap caveat
|
|
439
|
+
|
|
440
|
+
**Errado:** Habilitar branching assumindo Spend Cap protege contra cost overrun.
|
|
441
|
+
|
|
442
|
+
**Por quê:** Branching Compute Hours são **FORA do Spend Cap** — projeto Pro plan com 30 PRs/mês de 72h média pode gerar **$29-100/mês adicional sem alert algum**. Compute Credits NÃO aplicam — cada hora é cobrança nova.
|
|
443
|
+
|
|
444
|
+
**Certo:**
|
|
445
|
+
|
|
446
|
+
- monitorar billing manualmente (Settings → Usage → Branching Compute Hours)
|
|
447
|
+
- "Supabase changes only" filter ON (Pattern 3 step 4)
|
|
448
|
+
- considerar persistent branch único compartilhado em vez de 1 preview/PR
|
|
449
|
+
- documentar custo no onboarding do time
|
|
450
|
+
|
|
451
|
+
### Anti-pattern 3: Tentar merge entre preview branches
|
|
452
|
+
|
|
453
|
+
**Errado:** Time tenta `preview-feature-A → preview-feature-B` via Dashboard branching.
|
|
454
|
+
|
|
455
|
+
**Por quê:** Dashboard NÃO suporta merge entre preview branches — só direção `preview → main`. Tentativa resulta em state inconsistente, schemas dessincronizados, ou silent no-op.
|
|
456
|
+
|
|
457
|
+
**Certo:** combinar features via git workflow:
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
# PR-A merges to main primeiro
|
|
461
|
+
git checkout main
|
|
462
|
+
git pull
|
|
463
|
+
|
|
464
|
+
# PR-B rebase on top
|
|
465
|
+
git checkout feature-B
|
|
466
|
+
git rebase main
|
|
467
|
+
git push --force-with-lease
|
|
468
|
+
|
|
469
|
+
# preview-B é recriado com mudanças de A + B
|
|
470
|
+
# merge to main
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Anti-pattern 4: Push direto na main sem preview branch
|
|
474
|
+
|
|
475
|
+
**Errado:** Dev pusha migration direto em `main` sem PR/preview branch — "vai dar certo, é só um ALTER TABLE".
|
|
476
|
+
|
|
477
|
+
**Por quê:** sem validação de DAG → migration falha em production → downtime + rollback complexo + possíveis dados perdidos. Especialmente perigoso para `DROP COLUMN`, `ALTER TYPE`, mudanças destrutivas.
|
|
478
|
+
|
|
479
|
+
**Certo:** SEMPRE PR + preview branch validado:
|
|
480
|
+
|
|
481
|
+
1. Migration em PR aberto
|
|
482
|
+
2. Preview branch DAG executa (step 5 migrate validado)
|
|
483
|
+
3. Required check "Supabase Preview" ✓ verde
|
|
484
|
+
4. Merge gated por required check + branch protection rule
|
|
485
|
+
5. (Se "deploy to production" ON) → automatic push para production
|
|
486
|
+
|
|
487
|
+
Cross-ref skill `evolucao-schema-compativel` (v1.22) — 3-step migration safe para mudanças destrutivas.
|
|
488
|
+
|
|
489
|
+
### Anti-pattern 5: Esperar persistent branch funcionar como production
|
|
490
|
+
|
|
491
|
+
**Errado:** Assumir persistent staging branch é "cópia de produção" para QA team.
|
|
492
|
+
|
|
493
|
+
**Por quê:** branches são **dataless by design** — `seed.sql` é dados sintéticos, não snapshot real. Auth.users separado, sem dados de prod, sem volume real, sem latência real.
|
|
494
|
+
|
|
495
|
+
**Certo:**
|
|
496
|
+
|
|
497
|
+
- persistent branches são para **schema/code validation**, NÃO para QA com dados reais
|
|
498
|
+
- Se precisar QA com dados reais → use staging Supabase project **separado** (não branching)
|
|
499
|
+
- Staging project separado tem SLA, dados reais via replicação, custo previsível Pro plan
|
|
500
|
+
|
|
501
|
+
### Anti-pattern 6: Criar persistent branch sem cleanup policy
|
|
502
|
+
|
|
503
|
+
**Errado:** Criar persistent branches ad-hoc sem documentar lifecycle ou owner.
|
|
504
|
+
|
|
505
|
+
**Por quê:** persistent branches não auto-pausam — acumulam Branching Compute Hours **24/7 indefinidamente**. 6 meses depois, ninguém sabe pra que serve o branch `qa-test-old`, mas continua sendo cobrado $9.67/mês × 6 = **$58 desperdiçados**.
|
|
506
|
+
|
|
507
|
+
**Certo:**
|
|
508
|
+
|
|
509
|
+
- documentar persistent branches em README ou onboarding doc
|
|
510
|
+
- definir owner por branch (Slack handle + função)
|
|
511
|
+
- review trimestral: `supabase --experimental branches list` + cleanup
|
|
512
|
+
- comment no Dashboard descrevendo propósito + data de criação
|
|
513
|
+
|
|
514
|
+
## Cross-suite integration (v1.27)
|
|
515
|
+
|
|
516
|
+
Esta skill é base para skills v1.27 (Phases 150-153):
|
|
517
|
+
|
|
518
|
+
- **supabase-config-toml-remotes** (Phase 150) — `[remotes]` block + branch-specific config + secrets per-branch
|
|
519
|
+
- **supabase-ci-cd-github-actions** (Phase 151) — 8 workflows canônicos GitHub Actions (preview deploy, prod deploy, migration gates)
|
|
520
|
+
- **supabase-pgtap-testing** (Phase 152) — testes pgTAP que rodam no DAG step 5/6
|
|
521
|
+
- **supabase-migration-repair** (Phase 153) — `migration list/repair` + rollback preview branch quando step migrate falha
|
|
522
|
+
|
|
523
|
+
Base para agents v1.27 (Phase 154):
|
|
524
|
+
|
|
525
|
+
- **supabase-branching-architect** — projeta strategy (preview-only vs preview + persistent staging mix)
|
|
526
|
+
- **supabase-cicd-pipeline-implementer** — materializa GitHub Actions workflows + Supabase integration config
|
|
527
|
+
|
|
528
|
+
Pattern de handoff cooperativo herdado v1.23-v1.26: **architect** projeta → **cicd-pipeline-implementer** materializa → **release-pipeline-auditor** (v1.10) audita hermeticidade do pipeline final. Nenhum agente descarta upstream — handoff cooperativo SQL (princípio canônico v1.23).
|
|
529
|
+
|
|
530
|
+
## Ver também
|
|
531
|
+
|
|
532
|
+
- [supabase-config-toml-remotes](../supabase-config-toml-remotes/SKILL.md) (v1.27, Phase 150) — `[remotes]` block + branch-specific config + secrets per-branch
|
|
533
|
+
- [supabase-ci-cd-github-actions](../supabase-ci-cd-github-actions/SKILL.md) (v1.27, Phase 151) — 8 workflows canônicos GitHub Actions
|
|
534
|
+
- [supabase-pgtap-testing](../supabase-pgtap-testing/SKILL.md) (v1.27, Phase 152) — testes pgTAP integrados no DAG
|
|
535
|
+
- [supabase-migration-repair](../supabase-migration-repair/SKILL.md) (v1.27, Phase 153) — `migration list/repair` + rollback preview branch
|
|
536
|
+
- [supabase-migrations](../supabase-migrations/SKILL.md) (v1.23) — 5 blocos obrigatórios CREATE TABLE, naming canônico
|
|
537
|
+
- [supabase-declarative-schema](../supabase-declarative-schema/SKILL.md) — schema declarative workflow (`supabase/schemas/`)
|
|
538
|
+
- [evolucao-schema-compativel](../evolucao-schema-compativel/SKILL.md) (v1.22) — 3-step migration safe rolling upgrade (expand → migrate data → contract)
|
|
539
|
+
- [release-engineering](../release-engineering/SKILL.md) — deployment philosophy + self-service deploys
|
|
540
|
+
- [hermetic-builds](../hermetic-builds/SKILL.md) — pipeline reproducibility + isolation + provenance
|
|
541
|
+
- [supabase-postgres-roles](../supabase-postgres-roles/SKILL.md) (v1.26) — caveat custom roles NÃO capturados em Dashboard alpha (Pattern 4 Caveat 1)
|
|
542
|
+
- [supabase-edge-functions](../supabase-edge-functions/SKILL.md) — Edge Functions deploy no DAG step 7
|
|
543
|
+
- [glossário compartilhado](../_shared-supabase/glossary.md) — termos branching workflow, preview branch, persistent branch, deploy DAG, Branching Compute Hours (será +10 termos em REL-04 v1.27)
|
|
544
|
+
- Doc oficial: [Supabase Branching](https://supabase.com/docs/guides/deployment/branching), [GitHub Integration](https://supabase.com/docs/guides/deployment/branching#github-integration), [Pricing](https://supabase.com/pricing)
|