@luanpdd/kit-mcp 1.30.2 → 1.31.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.
Files changed (347) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +168 -168
  3. package/gates/agent-no-recursive-dispatch.md +84 -82
  4. package/kit/COMANDOS.md +138 -138
  5. package/kit/README.md +76 -76
  6. package/kit/agents/advisor-researcher.md +107 -106
  7. package/kit/agents/ai-mutation-tester.md +1 -0
  8. package/kit/agents/assumptions-analyzer.md +108 -107
  9. package/kit/agents/audit-log-implementer.md +314 -313
  10. package/kit/agents/auditor-consistencia-isolamento.md +414 -413
  11. package/kit/agents/b2b-saas-architect.md +157 -156
  12. package/kit/agents/burn-rate-forecaster.md +1 -0
  13. package/kit/agents/cascading-failures-auditor.md +299 -298
  14. package/kit/agents/codebase-mapper.md +769 -768
  15. package/kit/agents/crm-pipeline-implementer.md +257 -256
  16. package/kit/agents/debugger.md +814 -813
  17. package/kit/agents/detector-tenant-quente.md +338 -337
  18. package/kit/agents/evolution-go-integrator.md +201 -200
  19. package/kit/agents/example-reviewer.md +22 -21
  20. package/kit/agents/executor.md +565 -564
  21. package/kit/agents/golden-signals-instrumenter.md +1 -0
  22. package/kit/agents/incident-investigator.md +1 -0
  23. package/kit/agents/integration-checker.md +201 -200
  24. package/kit/agents/invite-flow-implementer.md +190 -189
  25. package/kit/agents/legacy-characterizer.md +369 -368
  26. package/kit/agents/lgpd-compliance-auditor.md +296 -295
  27. package/kit/agents/load-shedding-instrumenter.md +1 -0
  28. package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
  29. package/kit/agents/multi-tenant-rls-writer.md +341 -340
  30. package/kit/agents/nyquist-auditor.md +179 -178
  31. package/kit/agents/observability-coverage-auditor.md +316 -315
  32. package/kit/agents/observability-instrumenter.md +1 -0
  33. package/kit/agents/omm-auditor.md +1 -0
  34. package/kit/agents/org-onboarding-implementer.md +224 -223
  35. package/kit/agents/payload-capture-instrumenter.md +274 -273
  36. package/kit/agents/phase-researcher.md +697 -696
  37. package/kit/agents/plan-checker.md +273 -272
  38. package/kit/agents/planner.md +923 -922
  39. package/kit/agents/postmortem-writer.md +1 -0
  40. package/kit/agents/project-researcher.md +653 -652
  41. package/kit/agents/prr-conductor.md +1 -0
  42. package/kit/agents/refactor-safety-auditor.md +405 -404
  43. package/kit/agents/release-pipeline-auditor.md +1 -0
  44. package/kit/agents/research-synthesizer.md +246 -245
  45. package/kit/agents/roadmapper.md +678 -677
  46. package/kit/agents/schema-checker.md +1 -0
  47. package/kit/agents/seam-finder.md +360 -359
  48. package/kit/agents/shotgun-surgery-detector.md +350 -349
  49. package/kit/agents/slo-engineer.md +1 -0
  50. package/kit/agents/storytelling-analyst.md +1 -0
  51. package/kit/agents/supabase-architect.md +1 -0
  52. package/kit/agents/supabase-auth-bootstrapper.md +1 -0
  53. package/kit/agents/supabase-branching-architect.md +563 -562
  54. package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
  55. package/kit/agents/supabase-column-privileges-writer.md +400 -399
  56. package/kit/agents/supabase-edge-fn-tester.md +2 -1
  57. package/kit/agents/supabase-edge-fn-writer.md +2 -1
  58. package/kit/agents/supabase-migration-writer.md +386 -385
  59. package/kit/agents/supabase-rbac-implementer.md +393 -392
  60. package/kit/agents/supabase-realtime-implementer.md +364 -363
  61. package/kit/agents/supabase-rls-hardener.md +522 -521
  62. package/kit/agents/supabase-rls-writer.md +324 -323
  63. package/kit/agents/supabase-roles-implementer.md +356 -355
  64. package/kit/agents/supabase-storage-implementer.md +1 -0
  65. package/kit/agents/super-admin-implementer.md +282 -281
  66. package/kit/agents/toil-auditor.md +1 -0
  67. package/kit/agents/ui-auditor.md +438 -437
  68. package/kit/agents/ui-checker.md +303 -302
  69. package/kit/agents/ui-researcher.md +356 -355
  70. package/kit/agents/user-profiler.md +176 -175
  71. package/kit/agents/validador-evolucao-schema.md +336 -335
  72. package/kit/agents/verifier.md +729 -728
  73. package/kit/commands/adicionar-backlog.md +75 -75
  74. package/kit/commands/adicionar-fase.md +42 -42
  75. package/kit/commands/adicionar-tarefa.md +45 -45
  76. package/kit/commands/adicionar-testes.md +41 -41
  77. package/kit/commands/ajuda.md +21 -21
  78. package/kit/commands/atualizar.md +37 -37
  79. package/kit/commands/auditar-cascading.md +111 -111
  80. package/kit/commands/auditar-marco.md +179 -179
  81. package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
  82. package/kit/commands/auditar-refactor.md +219 -219
  83. package/kit/commands/auditar-release.md +109 -109
  84. package/kit/commands/auditar-uat.md +23 -23
  85. package/kit/commands/autonomo.md +40 -40
  86. package/kit/commands/branch-pr.md +24 -24
  87. package/kit/commands/burn-rate-status.md +408 -408
  88. package/kit/commands/capturar-payloads.md +193 -193
  89. package/kit/commands/caracterizar.md +212 -212
  90. package/kit/commands/concluir-marco.md +247 -247
  91. package/kit/commands/configuracoes.md +36 -36
  92. package/kit/commands/dados-distribuidos.md +188 -188
  93. package/kit/commands/definir-perfil.md +10 -10
  94. package/kit/commands/depurar.md +190 -190
  95. package/kit/commands/detectar-duplicacao.md +197 -197
  96. package/kit/commands/discutir-fase.md +131 -131
  97. package/kit/commands/encontrar-seams.md +136 -136
  98. package/kit/commands/entrar-discord.md +17 -17
  99. package/kit/commands/estatisticas.md +18 -18
  100. package/kit/commands/example-greeting.md +33 -33
  101. package/kit/commands/executar-fase.md +58 -58
  102. package/kit/commands/expresso.md +56 -56
  103. package/kit/commands/fase-ui.md +34 -34
  104. package/kit/commands/fazer.md +57 -57
  105. package/kit/commands/fio.md +125 -125
  106. package/kit/commands/fluxos-trabalho.md +64 -64
  107. package/kit/commands/forense.md +176 -176
  108. package/kit/commands/gerenciador.md +38 -38
  109. package/kit/commands/inserir-fase.md +31 -31
  110. package/kit/commands/legacy.md +263 -263
  111. package/kit/commands/limpeza.md +17 -17
  112. package/kit/commands/listar-hipoteses-fase.md +45 -45
  113. package/kit/commands/listar-workspaces.md +18 -18
  114. package/kit/commands/load-shedding.md +117 -117
  115. package/kit/commands/mapear-codebase.md +70 -70
  116. package/kit/commands/multi-tenant.md +163 -163
  117. package/kit/commands/nota.md +33 -33
  118. package/kit/commands/novo-marco.md +43 -43
  119. package/kit/commands/novo-projeto.md +41 -41
  120. package/kit/commands/novo-workspace.md +43 -43
  121. package/kit/commands/pausar-trabalho.md +37 -37
  122. package/kit/commands/perfil-usuario.md +45 -45
  123. package/kit/commands/pesquisar-fase.md +195 -195
  124. package/kit/commands/planejar-fase.md +67 -67
  125. package/kit/commands/planejar-lacunas.md +33 -33
  126. package/kit/commands/plantar-ideia.md +25 -25
  127. package/kit/commands/progresso.md +24 -24
  128. package/kit/commands/proximo.md +30 -30
  129. package/kit/commands/publicar.md +490 -490
  130. package/kit/commands/rapido.md +35 -35
  131. package/kit/commands/reaplicar-patches.md +124 -124
  132. package/kit/commands/refactor-seguro.md +321 -321
  133. package/kit/commands/relatorio-sessao.md +19 -19
  134. package/kit/commands/remover-fase.md +31 -31
  135. package/kit/commands/remover-workspace.md +26 -26
  136. package/kit/commands/resumo-marco.md +50 -50
  137. package/kit/commands/retomar-trabalho.md +40 -40
  138. package/kit/commands/revisar-backlog.md +60 -60
  139. package/kit/commands/revisar-ui.md +32 -32
  140. package/kit/commands/revisar.md +37 -37
  141. package/kit/commands/saude.md +21 -21
  142. package/kit/commands/setup-notion.md +93 -93
  143. package/kit/commands/storytelling.md +179 -179
  144. package/kit/commands/sync-main.md +68 -68
  145. package/kit/commands/validar-fase.md +35 -35
  146. package/kit/commands/verificar-tarefas.md +44 -44
  147. package/kit/commands/verificar-trabalho.md +64 -64
  148. package/kit/file-manifest.json +82 -81
  149. package/kit/framework/bin/lib/commands.cjs +959 -959
  150. package/kit/framework/bin/lib/config.cjs +442 -442
  151. package/kit/framework/bin/lib/core.cjs +1230 -1230
  152. package/kit/framework/bin/lib/frontmatter.cjs +336 -336
  153. package/kit/framework/bin/lib/init.cjs +1442 -1442
  154. package/kit/framework/bin/lib/milestone.cjs +252 -252
  155. package/kit/framework/bin/lib/model-profiles.cjs +68 -68
  156. package/kit/framework/bin/lib/phase.cjs +888 -888
  157. package/kit/framework/bin/lib/profile-output.cjs +952 -952
  158. package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
  159. package/kit/framework/bin/lib/roadmap.cjs +329 -329
  160. package/kit/framework/bin/lib/security.cjs +382 -382
  161. package/kit/framework/bin/lib/state.cjs +1031 -1031
  162. package/kit/framework/bin/lib/template.cjs +222 -222
  163. package/kit/framework/bin/lib/uat.cjs +282 -282
  164. package/kit/framework/bin/lib/verify.cjs +888 -888
  165. package/kit/framework/bin/lib/workstream.cjs +491 -491
  166. package/kit/framework/bin/tools.cjs +918 -918
  167. package/kit/framework/commands/workstreams.md +63 -63
  168. package/kit/framework/references/checkpoints.md +778 -778
  169. package/kit/framework/references/continuation-format.md +249 -249
  170. package/kit/framework/references/decimal-phase-calculation.md +64 -64
  171. package/kit/framework/references/git-integration.md +295 -295
  172. package/kit/framework/references/git-planning-commit.md +38 -38
  173. package/kit/framework/references/model-profile-resolution.md +36 -36
  174. package/kit/framework/references/model-profiles.md +139 -139
  175. package/kit/framework/references/phase-argument-parsing.md +61 -61
  176. package/kit/framework/references/planning-config.md +202 -202
  177. package/kit/framework/references/questioning.md +162 -162
  178. package/kit/framework/references/tdd.md +263 -263
  179. package/kit/framework/references/ui-brand.md +160 -160
  180. package/kit/framework/references/user-profiling.md +657 -657
  181. package/kit/framework/references/verification-patterns.md +612 -612
  182. package/kit/framework/references/workstream-flag.md +58 -58
  183. package/kit/framework/templates/DEBUG.md +164 -164
  184. package/kit/framework/templates/UAT.md +265 -265
  185. package/kit/framework/templates/UI-SPEC.md +100 -100
  186. package/kit/framework/templates/VALIDATION.md +76 -76
  187. package/kit/framework/templates/claude-md.md +122 -122
  188. package/kit/framework/templates/codebase/architecture.md +185 -185
  189. package/kit/framework/templates/codebase/concerns.md +205 -205
  190. package/kit/framework/templates/codebase/conventions.md +204 -204
  191. package/kit/framework/templates/codebase/integrations.md +192 -192
  192. package/kit/framework/templates/codebase/stack.md +158 -158
  193. package/kit/framework/templates/codebase/structure.md +199 -199
  194. package/kit/framework/templates/codebase/testing.md +301 -301
  195. package/kit/framework/templates/config.json +44 -44
  196. package/kit/framework/templates/context.md +352 -352
  197. package/kit/framework/templates/continue-here.md +78 -78
  198. package/kit/framework/templates/copilot-instructions.md +7 -7
  199. package/kit/framework/templates/debug-subagent-prompt.md +91 -91
  200. package/kit/framework/templates/dev-preferences.md +20 -20
  201. package/kit/framework/templates/discovery.md +146 -146
  202. package/kit/framework/templates/discussion-log.md +63 -63
  203. package/kit/framework/templates/milestone-archive.md +123 -123
  204. package/kit/framework/templates/milestone.md +115 -115
  205. package/kit/framework/templates/phase-prompt.md +610 -610
  206. package/kit/framework/templates/planner-subagent-prompt.md +117 -117
  207. package/kit/framework/templates/project.md +186 -186
  208. package/kit/framework/templates/requirements.md +231 -231
  209. package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
  210. package/kit/framework/templates/research-project/FEATURES.md +147 -147
  211. package/kit/framework/templates/research-project/PITFALLS.md +200 -200
  212. package/kit/framework/templates/research-project/STACK.md +120 -120
  213. package/kit/framework/templates/research-project/SUMMARY.md +170 -170
  214. package/kit/framework/templates/research.md +419 -419
  215. package/kit/framework/templates/retrospective.md +54 -54
  216. package/kit/framework/templates/roadmap.md +202 -202
  217. package/kit/framework/templates/state.md +176 -176
  218. package/kit/framework/templates/summary-complex.md +59 -59
  219. package/kit/framework/templates/summary-minimal.md +41 -41
  220. package/kit/framework/templates/summary-standard.md +48 -48
  221. package/kit/framework/templates/summary.md +209 -209
  222. package/kit/framework/templates/user-profile.md +146 -146
  223. package/kit/framework/templates/user-setup.md +256 -256
  224. package/kit/framework/templates/verification-report.md +258 -258
  225. package/kit/framework/workflows/add-phase.md +112 -112
  226. package/kit/framework/workflows/add-tests.md +351 -351
  227. package/kit/framework/workflows/add-todo.md +158 -158
  228. package/kit/framework/workflows/audit-milestone.md +340 -340
  229. package/kit/framework/workflows/audit-uat.md +109 -109
  230. package/kit/framework/workflows/autonomous.md +891 -891
  231. package/kit/framework/workflows/check-todos.md +177 -177
  232. package/kit/framework/workflows/cleanup.md +152 -152
  233. package/kit/framework/workflows/complete-milestone.md +696 -696
  234. package/kit/framework/workflows/diagnose-issues.md +231 -231
  235. package/kit/framework/workflows/discovery-phase.md +289 -289
  236. package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
  237. package/kit/framework/workflows/discuss-phase.md +784 -784
  238. package/kit/framework/workflows/do.md +104 -104
  239. package/kit/framework/workflows/execute-phase.md +838 -838
  240. package/kit/framework/workflows/execute-plan.md +510 -510
  241. package/kit/framework/workflows/fast.md +102 -102
  242. package/kit/framework/workflows/forensics.md +265 -265
  243. package/kit/framework/workflows/health.md +181 -181
  244. package/kit/framework/workflows/help.md +619 -619
  245. package/kit/framework/workflows/insert-phase.md +130 -130
  246. package/kit/framework/workflows/list-phase-assumptions.md +178 -178
  247. package/kit/framework/workflows/list-workspaces.md +56 -56
  248. package/kit/framework/workflows/manager.md +362 -362
  249. package/kit/framework/workflows/map-codebase.md +377 -377
  250. package/kit/framework/workflows/milestone-summary.md +223 -223
  251. package/kit/framework/workflows/new-milestone.md +486 -486
  252. package/kit/framework/workflows/new-project.md +1159 -1159
  253. package/kit/framework/workflows/new-workspace.md +237 -237
  254. package/kit/framework/workflows/next.md +97 -97
  255. package/kit/framework/workflows/node-repair.md +92 -92
  256. package/kit/framework/workflows/note.md +156 -156
  257. package/kit/framework/workflows/pause-work.md +176 -176
  258. package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
  259. package/kit/framework/workflows/plan-phase.md +765 -765
  260. package/kit/framework/workflows/plant-seed.md +169 -169
  261. package/kit/framework/workflows/pr-branch.md +129 -129
  262. package/kit/framework/workflows/profile-user.md +450 -450
  263. package/kit/framework/workflows/progress.md +507 -507
  264. package/kit/framework/workflows/quick.md +757 -757
  265. package/kit/framework/workflows/remove-phase.md +155 -155
  266. package/kit/framework/workflows/remove-workspace.md +90 -90
  267. package/kit/framework/workflows/research-phase.md +82 -82
  268. package/kit/framework/workflows/resume-project.md +326 -326
  269. package/kit/framework/workflows/review.md +228 -228
  270. package/kit/framework/workflows/session-report.md +146 -146
  271. package/kit/framework/workflows/settings.md +283 -283
  272. package/kit/framework/workflows/ship.md +228 -228
  273. package/kit/framework/workflows/stats.md +60 -60
  274. package/kit/framework/workflows/transition.md +671 -671
  275. package/kit/framework/workflows/ui-phase.md +302 -302
  276. package/kit/framework/workflows/ui-review.md +165 -165
  277. package/kit/framework/workflows/update.md +323 -323
  278. package/kit/framework/workflows/validate-phase.md +174 -174
  279. package/kit/framework/workflows/verify-phase.md +252 -252
  280. package/kit/framework/workflows/verify-work.md +637 -637
  281. package/kit/hooks/check-update.js +118 -118
  282. package/kit/hooks/context-monitor.js +163 -163
  283. package/kit/hooks/kit-attribution-reminder.cjs +29 -50
  284. package/kit/hooks/kit-router.cjs +137 -0
  285. package/kit/hooks/prompt-guard.js +103 -103
  286. package/kit/hooks/statusline.js +125 -125
  287. package/kit/hooks/workflow-guard.js +101 -101
  288. package/kit/settings.json +45 -45
  289. package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
  290. package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
  291. package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
  292. package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
  293. package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
  294. package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
  295. package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
  296. package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
  297. package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
  298. package/kit/skills/example-skill/SKILL.md +42 -42
  299. package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
  300. package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
  301. package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
  302. package/kit/skills/legacy-extract-class/SKILL.md +203 -203
  303. package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
  304. package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
  305. package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
  306. package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
  307. package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
  308. package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
  309. package/kit/skills/member-invite-flow/SKILL.md +305 -305
  310. package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
  311. package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
  312. package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
  313. package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
  314. package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
  315. package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
  316. package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
  317. package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
  318. package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
  319. package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
  320. package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
  321. package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
  322. package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
  323. package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
  324. package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
  325. package/kit/skills/supabase-edge-functions/SKILL.md +1 -1
  326. package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
  327. package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
  328. package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
  329. package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
  330. package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
  331. package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
  332. package/kit/skills/supabase-migrations/SKILL.md +297 -297
  333. package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
  334. package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
  335. package/kit/skills/supabase-realtime/SKILL.md +460 -460
  336. package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
  337. package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
  338. package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
  339. package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
  340. package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
  341. package/package.json +1 -1
  342. package/src/core/kit.js +216 -216
  343. package/src/core/reflect.js +247 -247
  344. package/src/core/reverse-sync.js +372 -372
  345. package/src/core/sync.js +437 -418
  346. package/src/core/watch.js +121 -121
  347. package/src/mcp-server/index.js +794 -746
@@ -1,297 +1,297 @@
1
- ---
2
- name: supabase-migrations
3
- description: Use ao criar arquivos de migration Supabase — naming YYYYMMDDHHmmss_short.sql, header de metadados, GRANT antes de ENABLE RLS, RLS obrigatório em toda nova tabela, granular policies, indice…
4
- ---
5
-
6
- # Supabase — Migrations
7
-
8
- ## Quando usar
9
-
10
- LLM carrega esta skill quando criar/editar arquivos em `supabase/migrations/`. Trigger phrases:
11
-
12
- - "criar migration Supabase", "supabase migration new"
13
- - "alterar schema do banco", "alter table"
14
- - "criar nova tabela em Postgres/Supabase"
15
- - "adicionar coluna a tabela existente"
16
- - "drop column / drop table" (operações destrutivas — exige cuidado extra)
17
-
18
- ## Regras absolutas
19
-
20
- - **Naming canônico:** `YYYYMMDDHHmmss_short_description.sql` em UTC (ex: `20260506120000_create_tasks.sql`). Use `supabase migration new <name>` para gerar timestamp correto.
21
- - **Header de metadados** no topo de cada migration (block comment) descrevendo Migration / Created / Purpose / Affects.
22
- - **lowercase em todo SQL** (alinhado com `supabase-postgres-style`).
23
- - **Comentários copiosos** em comandos destrutivos: `drop table`, `drop column`, `alter table ... drop column`, `truncate`, `delete from` em massa. Comentário explica o porquê + impacto.
24
- - **`GRANT` antes de `ENABLE RLS`** (v1.23) — sempre conceda privilégios necessários aos roles `anon`/`authenticated`/`service_role` ANTES de habilitar RLS. Sem GRANT, mesmo policies "permissive" falham porque o role não tem permissão de tabela.
25
- - **`RLS` obrigatório em toda nova tabela** — `alter table public.<name> enable row level security;` no mesmo arquivo da criação.
26
- - **`granular policies`** — uma `for select`, uma `for insert`, uma `for update`, uma `for delete`. **Nunca** `for all`.
27
- - **`(select auth.uid())`** sempre wrapped (REGRA #1 de RLS).
28
- - **`IS NOT NULL AND` em policies de auth** (v1.23) — `(select auth.uid()) is not null and (select auth.uid()) = user_id` para evitar silent-fail em usuários não-logados.
29
- - **Index nas colunas referenciadas por RLS:** `create index on public.<table> (user_id);` no mesmo arquivo.
30
- - Idempotência onde possível: `create table if not exists`, `create index if not exists`. Migrations rodam em ordem mas tooling pode re-executar.
31
- - Migrations são **append-only**. Para reverter, criar nova migration que desfaz — nunca editar migration já aplicada.
32
-
33
- ## Template canônico v1.23 — CREATE TABLE com 5 blocos obrigatórios
34
-
35
- Toda migration que cria tabela em schema exposto (`public`) deve conter os 5 blocos abaixo em ordem. Nenhum bloco é opcional. Bloco ausente = migration BLOCK pelo `supabase-rls-hardener` (v1.23).
36
-
37
- ```sql
38
- /*
39
- Migration: create_<table_name>
40
- Created: <YYYY-MM-DD>
41
- Purpose: <one-line description>
42
- Affects: public.<table> (new), public.<table> policies (new — 4), public.<table> index (new)
43
- */
44
-
45
- -- BLOCO 1: CREATE TABLE
46
- create table if not exists public.<table> (
47
- id uuid primary key default gen_random_uuid(),
48
- user_id uuid not null references auth.users (id) on delete cascade,
49
- -- ... outras colunas
50
- created_at timestamptz not null default now(),
51
- updated_at timestamptz not null default now()
52
- );
53
-
54
- -- BLOCO 2: GRANTs por role (ANTES de ENABLE RLS — v1.23)
55
- grant select on public.<table> to anon;
56
- grant select, insert, update, delete on public.<table> to authenticated;
57
- grant select, insert, update, delete on public.<table> to service_role;
58
-
59
- -- BLOCO 3: ENABLE RLS
60
- alter table public.<table> enable row level security;
61
-
62
- -- BLOCO 4: 4 policies granulares (uma por operação)
63
- create policy "<table>_select_own"
64
- on public.<table> for select to authenticated
65
- using (
66
- (select auth.uid()) is not null
67
- and (select auth.uid()) = user_id
68
- );
69
-
70
- create policy "<table>_insert_own"
71
- on public.<table> for insert to authenticated
72
- with check (
73
- (select auth.uid()) is not null
74
- and (select auth.uid()) = user_id
75
- );
76
-
77
- create policy "<table>_update_own"
78
- on public.<table> for update to authenticated
79
- using (
80
- (select auth.uid()) is not null
81
- and (select auth.uid()) = user_id
82
- )
83
- with check (
84
- (select auth.uid()) is not null
85
- and (select auth.uid()) = user_id
86
- );
87
-
88
- create policy "<table>_delete_own"
89
- on public.<table> for delete to authenticated
90
- using (
91
- (select auth.uid()) is not null
92
- and (select auth.uid()) = user_id
93
- );
94
-
95
- -- BLOCO 5: Index obrigatório em colunas referenciadas pelas policies
96
- create index if not exists <table>_user_id_idx on public.<table> (user_id);
97
-
98
- -- BLOCO 6 (v1.24, OPCIONAL): Column-Level Privileges
99
- -- ⚠ Adicionar APENAS se há colunas sensíveis (PII, billing, audit payload, tokens raw)
100
- -- Para casos comuns, prefira RLS + dedicated role table (skill supabase-column-level-security)
101
- -- Exemplo: tabela posts com coluna admin_notes visível apenas para service_role
102
- -- revoke select on table public.<table> from authenticated;
103
- -- grant select (id, user_id, title, content, created_at) on table public.<table> to authenticated;
104
- -- (service_role mantém acesso total — não precisa GRANT extra)
105
-
106
- -- BLOCO 7 (v1.26, OPCIONAL): CREATE ROLE para custom service accounts
107
- -- ⚠ Adicionar APENAS se há service accounts internos (cron jobs, BI tools, ETL, admin scripts)
108
- -- Para application access (end-users), prefira RLS + Custom Claims (skill supabase-custom-claims-rbac v1.25)
109
- -- Exemplo: role dedicado para cron job de cleanup
110
- -- create role "cron_cleanup_role" noinherit;
111
- -- alter role "cron_cleanup_role" with bypassrls;
112
- -- grant usage on schema public to cron_cleanup_role;
113
- -- grant delete on public.<table> to cron_cleanup_role;
114
- -- comment on role "cron_cleanup_role" is 'Service account para cron job de cleanup. Owner: team@company.com';
115
- ```
116
-
117
- ## Patterns canônicos
118
-
119
- ### Criar tabela com 5 blocos obrigatórios (v1.23) — example concreto
120
-
121
- ```sql
122
- /*
123
- Migration: create_tasks
124
- Created: 2026-05-06
125
- Purpose: Cria tabela tasks com GRANT + RLS habilitado + policies granulares por operação + index.
126
- Affects: public.tasks (new), public.tasks policies (new — 4 policies), public.tasks index (new)
127
- */
128
-
129
- -- BLOCO 1: CREATE TABLE
130
- create table if not exists public.tasks (
131
- id uuid primary key default gen_random_uuid(),
132
- user_id uuid not null references auth.users (id) on delete cascade,
133
- title text not null,
134
- status text not null default 'todo',
135
- created_at timestamptz not null default now(),
136
- updated_at timestamptz not null default now()
137
- );
138
-
139
- -- BLOCO 2: GRANTs por role (v1.23 — antes de ENABLE RLS)
140
- grant select on public.tasks to anon;
141
- grant select, insert, update, delete on public.tasks to authenticated;
142
- grant select, insert, update, delete on public.tasks to service_role;
143
-
144
- -- BLOCO 3: ENABLE RLS
145
- alter table public.tasks enable row level security;
146
-
147
- -- BLOCO 4: granular policies (uma por operação) com IS NOT NULL anti silent-fail
148
- create policy "users_select_own_tasks"
149
- on public.tasks for select to authenticated
150
- using (
151
- (select auth.uid()) is not null
152
- and (select auth.uid()) = user_id
153
- );
154
-
155
- create policy "users_insert_own_tasks"
156
- on public.tasks for insert to authenticated
157
- with check (
158
- (select auth.uid()) is not null
159
- and (select auth.uid()) = user_id
160
- );
161
-
162
- create policy "users_update_own_tasks"
163
- on public.tasks for update to authenticated
164
- using (
165
- (select auth.uid()) is not null
166
- and (select auth.uid()) = user_id
167
- )
168
- with check (
169
- (select auth.uid()) is not null
170
- and (select auth.uid()) = user_id
171
- );
172
-
173
- create policy "users_delete_own_tasks"
174
- on public.tasks for delete to authenticated
175
- using (
176
- (select auth.uid()) is not null
177
- and (select auth.uid()) = user_id
178
- );
179
-
180
- -- BLOCO 5: index obrigatório nas colunas usadas pela policy
181
- create index if not exists tasks_user_id_idx on public.tasks (user_id);
182
-
183
- -- BLOCO 6 (v1.24, OPCIONAL): Column-Level Privileges
184
- -- Não aplicável neste exemplo — tasks não tem colunas sensíveis
185
- -- Ver skill supabase-column-level-security para casos com PII / audit log / billing
186
- ```
187
-
188
- ### Adicionar coluna a tabela existente
189
-
190
- ```sql
191
- /*
192
- Migration: add_priority_to_tasks
193
- Created: 2026-05-06
194
- Purpose: Adiciona coluna priority (low/medium/high) a tasks com default low.
195
- Affects: public.tasks (column added — non-destructive)
196
- */
197
-
198
- alter table public.tasks
199
- add column if not exists priority text not null default 'low';
200
-
201
- -- check constraint para enum-like
202
- alter table public.tasks
203
- add constraint tasks_priority_check
204
- check (priority in ('low', 'medium', 'high'));
205
- ```
206
-
207
- ### Operação destrutiva — drop column com comentário extensivo
208
-
209
- ```sql
210
- /*
211
- Migration: drop_legacy_subtitle_column
212
- Created: 2026-05-06
213
- Purpose: Remove coluna subtitle (deprecated em v3.0 — nunca foi usada em produção).
214
- Affects: public.tasks (column dropped — DESTRUCTIVE)
215
- Risk: Baixo — coluna nullable nunca populada (validado via select count(*) where subtitle is not null = 0).
216
- Rollback: criar nova migration `add subtitle column` se necessário.
217
- */
218
-
219
- -- DROP de coluna deprecated. Validado upstream: zero linhas com valor não-null.
220
- -- Operação destrutiva — irreversível sem backup.
221
- alter table public.tasks
222
- drop column if exists subtitle;
223
- ```
224
-
225
- ## Anti-patterns
226
-
227
- ### Anti-pattern 1: Criar tabela sem RLS
228
-
229
- **Errado:**
230
- ```sql
231
- create table public.tasks (
232
- id uuid primary key default gen_random_uuid(),
233
- user_id uuid not null,
234
- title text not null
235
- );
236
- -- esqueceu enable row level security
237
- ```
238
-
239
- **Por quê:** sem RLS, tabela exposta ao role `anon` e `authenticated` sem filtro — qualquer cliente lê tudo. RLS habilitado sem policies bloqueia tudo (mais seguro como default que deixar aberto).
240
-
241
- **Certo:** sempre `alter table public.tasks enable row level security;` + policies granulares no mesmo arquivo.
242
-
243
- ### Anti-pattern 2: `for all` em vez de granular policies
244
-
245
- **Errado:**
246
- ```sql
247
- create policy "users_manage_tasks" on public.tasks
248
- for all to authenticated
249
- using ((select auth.uid()) = user_id);
250
- ```
251
-
252
- **Por quê:** mistura `using` (controla SELECT/UPDATE/DELETE) com `with check` (controla INSERT/UPDATE) — em UPDATE você pode querer regras diferentes para "qual linha tocar" vs "qual estado novo".
253
-
254
- **Certo:** 4 policies separadas (uma por operação) — ver pattern "Criar tabela" acima.
255
-
256
- ### Anti-pattern 3: `drop column` sem comentário
257
-
258
- **Errado:**
259
- ```sql
260
- alter table public.tasks drop column legacy_field;
261
- ```
262
-
263
- **Por quê:** futuros leitores não sabem por que a coluna foi removida; rollback fica difícil; risk não documentado.
264
-
265
- **Certo:** comentário no header explica Purpose + Affects + Risk + Rollback (ver pattern destrutivo acima).
266
-
267
- ### Anti-pattern 4: `auth.uid()` sem `(select)` wrapper
268
-
269
- **Errado:**
270
- ```sql
271
- using (auth.uid() = user_id)
272
- ```
273
-
274
- **Por quê:** degradação 1000× em queries com filtro RLS (Postgres reavalia por linha).
275
-
276
- **Certo:**
277
- ```sql
278
- using ((select auth.uid()) = user_id)
279
- ```
280
-
281
- ## Padrão Rolling-Upgrade para Migrations Arriscadas (v1.22+)
282
-
283
- > Migrations que adicionam `NOT NULL` em coluna existente, mudam tipo, ou removem column quebram backward compat com app rodando V1+V2 em paralelo. Padrão canônico **3-passos** (DDIA Ch 4):
284
- > 1. `ALTER TABLE ... ADD COLUMN x text` (nullable)
285
- > 2. `UPDATE ... SET x = ... WHERE x IS NULL LIMIT 10000` em loop até 100% backfill
286
- > 3. `ALTER TABLE ... ALTER COLUMN x SET NOT NULL` apenas após verificação
287
- >
288
- > Padrão completo em [`evolucao-schema-compativel`](../evolucao-schema-compativel/SKILL.md) (v1.22).
289
- > Validação automática via agent [`validador-evolucao-schema`](../../agents/validador-evolucao-schema.md) (v1.22).
290
-
291
- ## Ver também
292
-
293
- - [supabase-postgres-style](../supabase-postgres-style/SKILL.md) — convenção de naming + style aplicada
294
- - [supabase-rls-policies](../supabase-rls-policies/SKILL.md) — granular policies + WARNING user_metadata
295
- - [supabase-database-functions](../supabase-database-functions/SKILL.md) — funções com `set search_path = ''`
296
- - [supabase-declarative-schema](../supabase-declarative-schema/SKILL.md) — workflow alternativo (declarative-first → diff)
297
- - [glossário](../_shared-supabase/glossary.md) — termos PT-BR↔EN + comandos CLI
1
+ ---
2
+ name: supabase-migrations
3
+ description: Use ao criar arquivos de migration Supabase — naming YYYYMMDDHHmmss_short.sql, header de metadados, GRANT antes de ENABLE RLS, RLS obrigatório em toda nova tabela, granular policies, indice…
4
+ ---
5
+
6
+ # Supabase — Migrations
7
+
8
+ ## Quando usar
9
+
10
+ LLM carrega esta skill quando criar/editar arquivos em `supabase/migrations/`. Trigger phrases:
11
+
12
+ - "criar migration Supabase", "supabase migration new"
13
+ - "alterar schema do banco", "alter table"
14
+ - "criar nova tabela em Postgres/Supabase"
15
+ - "adicionar coluna a tabela existente"
16
+ - "drop column / drop table" (operações destrutivas — exige cuidado extra)
17
+
18
+ ## Regras absolutas
19
+
20
+ - **Naming canônico:** `YYYYMMDDHHmmss_short_description.sql` em UTC (ex: `20260506120000_create_tasks.sql`). Use `supabase migration new <name>` para gerar timestamp correto.
21
+ - **Header de metadados** no topo de cada migration (block comment) descrevendo Migration / Created / Purpose / Affects.
22
+ - **lowercase em todo SQL** (alinhado com `supabase-postgres-style`).
23
+ - **Comentários copiosos** em comandos destrutivos: `drop table`, `drop column`, `alter table ... drop column`, `truncate`, `delete from` em massa. Comentário explica o porquê + impacto.
24
+ - **`GRANT` antes de `ENABLE RLS`** (v1.23) — sempre conceda privilégios necessários aos roles `anon`/`authenticated`/`service_role` ANTES de habilitar RLS. Sem GRANT, mesmo policies "permissive" falham porque o role não tem permissão de tabela.
25
+ - **`RLS` obrigatório em toda nova tabela** — `alter table public.<name> enable row level security;` no mesmo arquivo da criação.
26
+ - **`granular policies`** — uma `for select`, uma `for insert`, uma `for update`, uma `for delete`. **Nunca** `for all`.
27
+ - **`(select auth.uid())`** sempre wrapped (REGRA #1 de RLS).
28
+ - **`IS NOT NULL AND` em policies de auth** (v1.23) — `(select auth.uid()) is not null and (select auth.uid()) = user_id` para evitar silent-fail em usuários não-logados.
29
+ - **Index nas colunas referenciadas por RLS:** `create index on public.<table> (user_id);` no mesmo arquivo.
30
+ - Idempotência onde possível: `create table if not exists`, `create index if not exists`. Migrations rodam em ordem mas tooling pode re-executar.
31
+ - Migrations são **append-only**. Para reverter, criar nova migration que desfaz — nunca editar migration já aplicada.
32
+
33
+ ## Template canônico v1.23 — CREATE TABLE com 5 blocos obrigatórios
34
+
35
+ Toda migration que cria tabela em schema exposto (`public`) deve conter os 5 blocos abaixo em ordem. Nenhum bloco é opcional. Bloco ausente = migration BLOCK pelo `supabase-rls-hardener` (v1.23).
36
+
37
+ ```sql
38
+ /*
39
+ Migration: create_<table_name>
40
+ Created: <YYYY-MM-DD>
41
+ Purpose: <one-line description>
42
+ Affects: public.<table> (new), public.<table> policies (new — 4), public.<table> index (new)
43
+ */
44
+
45
+ -- BLOCO 1: CREATE TABLE
46
+ create table if not exists public.<table> (
47
+ id uuid primary key default gen_random_uuid(),
48
+ user_id uuid not null references auth.users (id) on delete cascade,
49
+ -- ... outras colunas
50
+ created_at timestamptz not null default now(),
51
+ updated_at timestamptz not null default now()
52
+ );
53
+
54
+ -- BLOCO 2: GRANTs por role (ANTES de ENABLE RLS — v1.23)
55
+ grant select on public.<table> to anon;
56
+ grant select, insert, update, delete on public.<table> to authenticated;
57
+ grant select, insert, update, delete on public.<table> to service_role;
58
+
59
+ -- BLOCO 3: ENABLE RLS
60
+ alter table public.<table> enable row level security;
61
+
62
+ -- BLOCO 4: 4 policies granulares (uma por operação)
63
+ create policy "<table>_select_own"
64
+ on public.<table> for select to authenticated
65
+ using (
66
+ (select auth.uid()) is not null
67
+ and (select auth.uid()) = user_id
68
+ );
69
+
70
+ create policy "<table>_insert_own"
71
+ on public.<table> for insert to authenticated
72
+ with check (
73
+ (select auth.uid()) is not null
74
+ and (select auth.uid()) = user_id
75
+ );
76
+
77
+ create policy "<table>_update_own"
78
+ on public.<table> for update to authenticated
79
+ using (
80
+ (select auth.uid()) is not null
81
+ and (select auth.uid()) = user_id
82
+ )
83
+ with check (
84
+ (select auth.uid()) is not null
85
+ and (select auth.uid()) = user_id
86
+ );
87
+
88
+ create policy "<table>_delete_own"
89
+ on public.<table> for delete to authenticated
90
+ using (
91
+ (select auth.uid()) is not null
92
+ and (select auth.uid()) = user_id
93
+ );
94
+
95
+ -- BLOCO 5: Index obrigatório em colunas referenciadas pelas policies
96
+ create index if not exists <table>_user_id_idx on public.<table> (user_id);
97
+
98
+ -- BLOCO 6 (v1.24, OPCIONAL): Column-Level Privileges
99
+ -- ⚠ Adicionar APENAS se há colunas sensíveis (PII, billing, audit payload, tokens raw)
100
+ -- Para casos comuns, prefira RLS + dedicated role table (skill supabase-column-level-security)
101
+ -- Exemplo: tabela posts com coluna admin_notes visível apenas para service_role
102
+ -- revoke select on table public.<table> from authenticated;
103
+ -- grant select (id, user_id, title, content, created_at) on table public.<table> to authenticated;
104
+ -- (service_role mantém acesso total — não precisa GRANT extra)
105
+
106
+ -- BLOCO 7 (v1.26, OPCIONAL): CREATE ROLE para custom service accounts
107
+ -- ⚠ Adicionar APENAS se há service accounts internos (cron jobs, BI tools, ETL, admin scripts)
108
+ -- Para application access (end-users), prefira RLS + Custom Claims (skill supabase-custom-claims-rbac v1.25)
109
+ -- Exemplo: role dedicado para cron job de cleanup
110
+ -- create role "cron_cleanup_role" noinherit;
111
+ -- alter role "cron_cleanup_role" with bypassrls;
112
+ -- grant usage on schema public to cron_cleanup_role;
113
+ -- grant delete on public.<table> to cron_cleanup_role;
114
+ -- comment on role "cron_cleanup_role" is 'Service account para cron job de cleanup. Owner: team@company.com';
115
+ ```
116
+
117
+ ## Patterns canônicos
118
+
119
+ ### Criar tabela com 5 blocos obrigatórios (v1.23) — example concreto
120
+
121
+ ```sql
122
+ /*
123
+ Migration: create_tasks
124
+ Created: 2026-05-06
125
+ Purpose: Cria tabela tasks com GRANT + RLS habilitado + policies granulares por operação + index.
126
+ Affects: public.tasks (new), public.tasks policies (new — 4 policies), public.tasks index (new)
127
+ */
128
+
129
+ -- BLOCO 1: CREATE TABLE
130
+ create table if not exists public.tasks (
131
+ id uuid primary key default gen_random_uuid(),
132
+ user_id uuid not null references auth.users (id) on delete cascade,
133
+ title text not null,
134
+ status text not null default 'todo',
135
+ created_at timestamptz not null default now(),
136
+ updated_at timestamptz not null default now()
137
+ );
138
+
139
+ -- BLOCO 2: GRANTs por role (v1.23 — antes de ENABLE RLS)
140
+ grant select on public.tasks to anon;
141
+ grant select, insert, update, delete on public.tasks to authenticated;
142
+ grant select, insert, update, delete on public.tasks to service_role;
143
+
144
+ -- BLOCO 3: ENABLE RLS
145
+ alter table public.tasks enable row level security;
146
+
147
+ -- BLOCO 4: granular policies (uma por operação) com IS NOT NULL anti silent-fail
148
+ create policy "users_select_own_tasks"
149
+ on public.tasks for select to authenticated
150
+ using (
151
+ (select auth.uid()) is not null
152
+ and (select auth.uid()) = user_id
153
+ );
154
+
155
+ create policy "users_insert_own_tasks"
156
+ on public.tasks for insert to authenticated
157
+ with check (
158
+ (select auth.uid()) is not null
159
+ and (select auth.uid()) = user_id
160
+ );
161
+
162
+ create policy "users_update_own_tasks"
163
+ on public.tasks for update to authenticated
164
+ using (
165
+ (select auth.uid()) is not null
166
+ and (select auth.uid()) = user_id
167
+ )
168
+ with check (
169
+ (select auth.uid()) is not null
170
+ and (select auth.uid()) = user_id
171
+ );
172
+
173
+ create policy "users_delete_own_tasks"
174
+ on public.tasks for delete to authenticated
175
+ using (
176
+ (select auth.uid()) is not null
177
+ and (select auth.uid()) = user_id
178
+ );
179
+
180
+ -- BLOCO 5: index obrigatório nas colunas usadas pela policy
181
+ create index if not exists tasks_user_id_idx on public.tasks (user_id);
182
+
183
+ -- BLOCO 6 (v1.24, OPCIONAL): Column-Level Privileges
184
+ -- Não aplicável neste exemplo — tasks não tem colunas sensíveis
185
+ -- Ver skill supabase-column-level-security para casos com PII / audit log / billing
186
+ ```
187
+
188
+ ### Adicionar coluna a tabela existente
189
+
190
+ ```sql
191
+ /*
192
+ Migration: add_priority_to_tasks
193
+ Created: 2026-05-06
194
+ Purpose: Adiciona coluna priority (low/medium/high) a tasks com default low.
195
+ Affects: public.tasks (column added — non-destructive)
196
+ */
197
+
198
+ alter table public.tasks
199
+ add column if not exists priority text not null default 'low';
200
+
201
+ -- check constraint para enum-like
202
+ alter table public.tasks
203
+ add constraint tasks_priority_check
204
+ check (priority in ('low', 'medium', 'high'));
205
+ ```
206
+
207
+ ### Operação destrutiva — drop column com comentário extensivo
208
+
209
+ ```sql
210
+ /*
211
+ Migration: drop_legacy_subtitle_column
212
+ Created: 2026-05-06
213
+ Purpose: Remove coluna subtitle (deprecated em v3.0 — nunca foi usada em produção).
214
+ Affects: public.tasks (column dropped — DESTRUCTIVE)
215
+ Risk: Baixo — coluna nullable nunca populada (validado via select count(*) where subtitle is not null = 0).
216
+ Rollback: criar nova migration `add subtitle column` se necessário.
217
+ */
218
+
219
+ -- DROP de coluna deprecated. Validado upstream: zero linhas com valor não-null.
220
+ -- Operação destrutiva — irreversível sem backup.
221
+ alter table public.tasks
222
+ drop column if exists subtitle;
223
+ ```
224
+
225
+ ## Anti-patterns
226
+
227
+ ### Anti-pattern 1: Criar tabela sem RLS
228
+
229
+ **Errado:**
230
+ ```sql
231
+ create table public.tasks (
232
+ id uuid primary key default gen_random_uuid(),
233
+ user_id uuid not null,
234
+ title text not null
235
+ );
236
+ -- esqueceu enable row level security
237
+ ```
238
+
239
+ **Por quê:** sem RLS, tabela exposta ao role `anon` e `authenticated` sem filtro — qualquer cliente lê tudo. RLS habilitado sem policies bloqueia tudo (mais seguro como default que deixar aberto).
240
+
241
+ **Certo:** sempre `alter table public.tasks enable row level security;` + policies granulares no mesmo arquivo.
242
+
243
+ ### Anti-pattern 2: `for all` em vez de granular policies
244
+
245
+ **Errado:**
246
+ ```sql
247
+ create policy "users_manage_tasks" on public.tasks
248
+ for all to authenticated
249
+ using ((select auth.uid()) = user_id);
250
+ ```
251
+
252
+ **Por quê:** mistura `using` (controla SELECT/UPDATE/DELETE) com `with check` (controla INSERT/UPDATE) — em UPDATE você pode querer regras diferentes para "qual linha tocar" vs "qual estado novo".
253
+
254
+ **Certo:** 4 policies separadas (uma por operação) — ver pattern "Criar tabela" acima.
255
+
256
+ ### Anti-pattern 3: `drop column` sem comentário
257
+
258
+ **Errado:**
259
+ ```sql
260
+ alter table public.tasks drop column legacy_field;
261
+ ```
262
+
263
+ **Por quê:** futuros leitores não sabem por que a coluna foi removida; rollback fica difícil; risk não documentado.
264
+
265
+ **Certo:** comentário no header explica Purpose + Affects + Risk + Rollback (ver pattern destrutivo acima).
266
+
267
+ ### Anti-pattern 4: `auth.uid()` sem `(select)` wrapper
268
+
269
+ **Errado:**
270
+ ```sql
271
+ using (auth.uid() = user_id)
272
+ ```
273
+
274
+ **Por quê:** degradação 1000× em queries com filtro RLS (Postgres reavalia por linha).
275
+
276
+ **Certo:**
277
+ ```sql
278
+ using ((select auth.uid()) = user_id)
279
+ ```
280
+
281
+ ## Padrão Rolling-Upgrade para Migrations Arriscadas (v1.22+)
282
+
283
+ > Migrations que adicionam `NOT NULL` em coluna existente, mudam tipo, ou removem column quebram backward compat com app rodando V1+V2 em paralelo. Padrão canônico **3-passos** (DDIA Ch 4):
284
+ > 1. `ALTER TABLE ... ADD COLUMN x text` (nullable)
285
+ > 2. `UPDATE ... SET x = ... WHERE x IS NULL LIMIT 10000` em loop até 100% backfill
286
+ > 3. `ALTER TABLE ... ALTER COLUMN x SET NOT NULL` apenas após verificação
287
+ >
288
+ > Padrão completo em [`evolucao-schema-compativel`](../evolucao-schema-compativel/SKILL.md) (v1.22).
289
+ > Validação automática via agent [`validador-evolucao-schema`](../../agents/validador-evolucao-schema.md) (v1.22).
290
+
291
+ ## Ver também
292
+
293
+ - [supabase-postgres-style](../supabase-postgres-style/SKILL.md) — convenção de naming + style aplicada
294
+ - [supabase-rls-policies](../supabase-rls-policies/SKILL.md) — granular policies + WARNING user_metadata
295
+ - [supabase-database-functions](../supabase-database-functions/SKILL.md) — funções com `set search_path = ''`
296
+ - [supabase-declarative-schema](../supabase-declarative-schema/SKILL.md) — workflow alternativo (declarative-first → diff)
297
+ - [glossário](../_shared-supabase/glossary.md) — termos PT-BR↔EN + comandos CLI