nexus-core-v3 3.0.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 (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/agents/README.md +133 -0
  4. package/agents/_protocol.md +107 -0
  5. package/agents/analyst.md +138 -0
  6. package/agents/architect.md +146 -0
  7. package/agents/data-engineer.md +170 -0
  8. package/agents/dev.md +134 -0
  9. package/agents/devops.md +141 -0
  10. package/agents/nexus-master.md +147 -0
  11. package/agents/pm.md +133 -0
  12. package/agents/po.md +138 -0
  13. package/agents/qa.md +192 -0
  14. package/agents/sm.md +122 -0
  15. package/agents/squad-creator.md +121 -0
  16. package/agents/ux-design-expert.md +165 -0
  17. package/artifact-manifest.json +903 -0
  18. package/bin/nexus.mjs +37 -0
  19. package/checklists/README.md +49 -0
  20. package/checklists/architect-checklist.md +47 -0
  21. package/checklists/change-checklist.md +61 -0
  22. package/checklists/db-predeploy-checklist.md +57 -0
  23. package/checklists/design-quality-checklist.md +57 -0
  24. package/checklists/discovery-checklist.md +36 -0
  25. package/checklists/foundation-checklist.md +39 -0
  26. package/checklists/launch-checklist.md +39 -0
  27. package/checklists/pm-checklist.md +48 -0
  28. package/checklists/po-master-checklist.md +64 -0
  29. package/checklists/reality-check-checklist.md +49 -0
  30. package/checklists/story-dod-checklist.md +52 -0
  31. package/checklists/story-draft-checklist.md +36 -0
  32. package/dist/bin/dashboard.html +279 -0
  33. package/dist/bin/nexus.mjs +20008 -0
  34. package/dist/constitution.yaml +76 -0
  35. package/knowledge/README.md +57 -0
  36. package/knowledge/architecture/architectural-styles-map.md +182 -0
  37. package/knowledge/architecture/design-patterns-gof.md +192 -0
  38. package/knowledge/architecture/distributed-patterns-cheatsheet.md +201 -0
  39. package/knowledge/architecture/saas-subscription-blueprint.md +355 -0
  40. package/knowledge/architecture/system-design-tradeoffs.md +231 -0
  41. package/knowledge/architecture/t3-fullstack-typesafe-stack.md +273 -0
  42. package/knowledge/copy/landing-copy-that-converts.md +168 -0
  43. package/knowledge/data/postgres-indexing-and-tuning.md +263 -0
  44. package/knowledge/data/schema-modeling-decisions.md +273 -0
  45. package/knowledge/data/supabase-rls-patterns.md +316 -0
  46. package/knowledge/data/zero-downtime-migrations.md +308 -0
  47. package/knowledge/devops/cicd-pipeline-best-practices.md +318 -0
  48. package/knowledge/devops/production-dockerfile.md +283 -0
  49. package/knowledge/devops/twelve-factor-app.md +398 -0
  50. package/knowledge/engineering/clean-code-principles.md +429 -0
  51. package/knowledge/engineering/effective-code-review.md +204 -0
  52. package/knowledge/engineering/testing-strategy-beyond-unit.md +307 -0
  53. package/knowledge/governance/risk-matrix.md +56 -0
  54. package/knowledge/integration/mcp-server-selection-matrix.md +235 -0
  55. package/knowledge/marketing/copy-que-converte.md +43 -0
  56. package/knowledge/marketing/funil-e-jornada.md +36 -0
  57. package/knowledge/negocios/proposta-vencedora.md +38 -0
  58. package/knowledge/negocios/roi-e-unit-economics.md +46 -0
  59. package/knowledge/pipeline/1-descobrir.md +26 -0
  60. package/knowledge/pipeline/2-estrategizar.md +26 -0
  61. package/knowledge/pipeline/3-estruturar.md +27 -0
  62. package/knowledge/pipeline/4-construir.md +27 -0
  63. package/knowledge/pipeline/5-endurecer.md +28 -0
  64. package/knowledge/pipeline/6-lancar.md +27 -0
  65. package/knowledge/pipeline/7-operar.md +27 -0
  66. package/knowledge/security/lgpd-conformidade-basica.md +35 -0
  67. package/knowledge/security/owasp-secure-coding-gates.md +220 -0
  68. package/knowledge/security/owasp-top10-threat-assessment.md +287 -0
  69. package/knowledge/security/threat-modeling-stride.md +34 -0
  70. package/knowledge/web-craft/a11y-audit-checklist.md +251 -0
  71. package/knowledge/web-craft/accessible-component-patterns.md +383 -0
  72. package/knowledge/web-craft/anti-ai-look.md +114 -0
  73. package/knowledge/web-craft/design-system-from-code.md +195 -0
  74. package/knowledge/web-craft/intrinsic-css-layout.md +420 -0
  75. package/knowledge/web-craft/style-cloning.md +185 -0
  76. package/knowledge/web-craft/visual-polish-review.md +183 -0
  77. package/package.json +55 -0
  78. package/runbooks/campanha-de-conteudo.md +36 -0
  79. package/runbooks/feature-em-projeto-existente.md +37 -0
  80. package/runbooks/mvp-startup.md +38 -0
  81. package/runbooks/resposta-a-incidente.md +37 -0
  82. package/squads/exemplo-conteudo/agents/editor-chefe.md +48 -0
  83. package/squads/exemplo-conteudo/agents/pesquisador.md +44 -0
  84. package/squads/exemplo-conteudo/agents/redator.md +45 -0
  85. package/squads/exemplo-conteudo/knowledge/estilo-editorial.md +21 -0
  86. package/squads/exemplo-conteudo/squad.yaml +19 -0
  87. package/squads/exemplo-conteudo/tasks/pesquisar-fontes.md +26 -0
  88. package/squads/exemplo-conteudo/tasks/planejar-pauta.md +27 -0
  89. package/squads/exemplo-conteudo/tasks/redigir-artigo.md +26 -0
  90. package/squads/exemplo-conteudo/tasks/revisar-artigo.md +27 -0
  91. package/squads/marketing/agents/analista.md +56 -0
  92. package/squads/marketing/agents/chefe-marketing.md +65 -0
  93. package/squads/marketing/agents/conteudo.md +55 -0
  94. package/squads/marketing/agents/copy.md +55 -0
  95. package/squads/marketing/agents/growth.md +56 -0
  96. package/squads/marketing/agents/social.md +55 -0
  97. package/squads/marketing/squad.yaml +17 -0
  98. package/squads/marketing/tasks/aprovar-campanha.md +43 -0
  99. package/squads/negocios/agents/chefe-negocios.md +65 -0
  100. package/squads/negocios/agents/financas-roi.md +55 -0
  101. package/squads/negocios/agents/suporte.md +55 -0
  102. package/squads/negocios/agents/vendas-proposta.md +56 -0
  103. package/squads/negocios/squad.yaml +17 -0
  104. package/squads/negocios/tasks/aprovar-proposta.md +40 -0
  105. package/squads/security/agents/appsec-reviewer.md +59 -0
  106. package/squads/security/agents/chefe-seguranca.md +65 -0
  107. package/squads/security/agents/compliance-auditor.md +60 -0
  108. package/squads/security/agents/threat-modeler.md +60 -0
  109. package/squads/security/squad.yaml +20 -0
  110. package/squads/security/tasks/aprovar-gate-seguranca.md +42 -0
  111. package/squads/security/tasks/emitir-parecer-conformidade.md +42 -0
  112. package/tasks/README.md +72 -0
  113. package/tasks/accessibility-wcag-checklist.md +69 -0
  114. package/tasks/advanced-elicitation.md +42 -0
  115. package/tasks/analyze-performance.md +54 -0
  116. package/tasks/analyze-project-structure.md +59 -0
  117. package/tasks/apply-qa-fixes.md +57 -0
  118. package/tasks/architect-analyze-impact.md +62 -0
  119. package/tasks/archive-squad.md +52 -0
  120. package/tasks/audit-codebase.md +53 -0
  121. package/tasks/build-component.md +61 -0
  122. package/tasks/calculate-roi.md +63 -0
  123. package/tasks/ci-cd-configuration.md +51 -0
  124. package/tasks/collect-visual-evidence.md +62 -0
  125. package/tasks/compose-molecule.md +57 -0
  126. package/tasks/consolidate-patterns.md +54 -0
  127. package/tasks/create-brownfield-prd.md +54 -0
  128. package/tasks/create-competitor-analysis.md +42 -0
  129. package/tasks/create-deep-research-prompt.md +62 -0
  130. package/tasks/create-doc.md +62 -0
  131. package/tasks/create-epic.md +49 -0
  132. package/tasks/create-front-end-spec.md +56 -0
  133. package/tasks/create-migration-plan.md +57 -0
  134. package/tasks/create-next-story.md +66 -0
  135. package/tasks/create-prd.md +53 -0
  136. package/tasks/create-project-brief.md +47 -0
  137. package/tasks/create-rls-policies.md +59 -0
  138. package/tasks/create-schema.md +57 -0
  139. package/tasks/create-service.md +55 -0
  140. package/tasks/create-squad.md +100 -0
  141. package/tasks/create-suite.md +62 -0
  142. package/tasks/db-apply-migration.md +56 -0
  143. package/tasks/db-domain-modeling.md +57 -0
  144. package/tasks/db-dry-run.md +50 -0
  145. package/tasks/db-env-check.md +57 -0
  146. package/tasks/db-load-csv.md +54 -0
  147. package/tasks/db-policy-apply.md +58 -0
  148. package/tasks/db-rollback.md +51 -0
  149. package/tasks/db-run-sql.md +61 -0
  150. package/tasks/db-seed.md +52 -0
  151. package/tasks/db-smoke-test.md +51 -0
  152. package/tasks/db-snapshot.md +48 -0
  153. package/tasks/db-verify-order.md +49 -0
  154. package/tasks/deliberate.md +46 -0
  155. package/tasks/design-indexes.md +59 -0
  156. package/tasks/dev-develop-story.md +61 -0
  157. package/tasks/document-project.md +59 -0
  158. package/tasks/execute-checklist.md +57 -0
  159. package/tasks/execute-epic-plan.md +52 -0
  160. package/tasks/execute-subtask.md +51 -0
  161. package/tasks/extend-pattern.md +63 -0
  162. package/tasks/extend-squad.md +60 -0
  163. package/tasks/extract-patterns.md +64 -0
  164. package/tasks/extract-tokens.md +59 -0
  165. package/tasks/facilitate-brainstorming-session.md +42 -0
  166. package/tasks/generate-ai-frontend-prompt.md +57 -0
  167. package/tasks/generate-documentation.md +60 -0
  168. package/tasks/generate-migration-strategy.md +57 -0
  169. package/tasks/generate-shock-report.md +56 -0
  170. package/tasks/mcp-management.md +66 -0
  171. package/tasks/orchestrate.md +50 -0
  172. package/tasks/perform-market-research.md +42 -0
  173. package/tasks/plan-create-context.md +57 -0
  174. package/tasks/plan-create-implementation.md +58 -0
  175. package/tasks/po-close-story.md +60 -0
  176. package/tasks/po-manage-story-backlog.md +59 -0
  177. package/tasks/po-pull-story.md +60 -0
  178. package/tasks/po-sync-story.md +59 -0
  179. package/tasks/pr-automation.md +50 -0
  180. package/tasks/pre-push-quality-gate.md +54 -0
  181. package/tasks/push.md +53 -0
  182. package/tasks/qa-browser-console-check.md +52 -0
  183. package/tasks/qa-create-fix-request.md +58 -0
  184. package/tasks/qa-evidence-requirements.md +55 -0
  185. package/tasks/qa-false-positive-detection.md +55 -0
  186. package/tasks/qa-fix-issues.md +55 -0
  187. package/tasks/qa-gate.md +53 -0
  188. package/tasks/qa-migration-validation.md +58 -0
  189. package/tasks/qa-nfr-assess.md +45 -0
  190. package/tasks/qa-review-story.md +56 -0
  191. package/tasks/qa-risk-profile.md +45 -0
  192. package/tasks/qa-security-checklist.md +64 -0
  193. package/tasks/qa-test-design.md +47 -0
  194. package/tasks/qa-trace-requirements.md +48 -0
  195. package/tasks/release-management.md +53 -0
  196. package/tasks/repository-cleanup.md +61 -0
  197. package/tasks/route.md +44 -0
  198. package/tasks/run-tests.md +50 -0
  199. package/tasks/security-audit.md +54 -0
  200. package/tasks/setup-database.md +60 -0
  201. package/tasks/setup-design-system.md +60 -0
  202. package/tasks/shard-doc.md +60 -0
  203. package/tasks/spec-assess-complexity.md +55 -0
  204. package/tasks/spec-critique.md +64 -0
  205. package/tasks/spec-gather-requirements.md +48 -0
  206. package/tasks/spec-research-dependencies.md +42 -0
  207. package/tasks/spec-write-spec.md +50 -0
  208. package/tasks/test-as-user.md +52 -0
  209. package/tasks/ux-create-wireframe.md +54 -0
  210. package/tasks/ux-user-research.md +55 -0
  211. package/tasks/validate-next-story.md +61 -0
  212. package/tasks/validate-squad.md +55 -0
  213. package/tasks/verify-subtask.md +52 -0
  214. package/tasks/version-management.md +45 -0
  215. package/templates/README.md +47 -0
  216. package/templates/architecture-tmpl.md +115 -0
  217. package/templates/competitor-analysis-tmpl.md +87 -0
  218. package/templates/epic-tmpl.md +83 -0
  219. package/templates/front-end-spec-tmpl.md +110 -0
  220. package/templates/market-research-tmpl.md +98 -0
  221. package/templates/migration-plan-tmpl.md +92 -0
  222. package/templates/prd-tmpl.md +95 -0
  223. package/templates/project-brief-tmpl.md +100 -0
  224. package/templates/qa-verdict-tmpl.md +73 -0
  225. package/templates/rls-policies-tmpl.md +93 -0
  226. package/templates/schema-design-tmpl.md +107 -0
  227. package/templates/spec-tmpl.md +88 -0
  228. package/templates/squad/agent-dna-tmpl.md +72 -0
  229. package/templates/squad/chief-dna-tmpl.md +98 -0
  230. package/templates/squad/squad-task-tmpl.md +50 -0
  231. package/templates/squad/squad-yaml-tmpl.md +47 -0
  232. package/templates/story-tmpl.md +63 -0
@@ -0,0 +1,50 @@
1
+ ---
2
+ id: db-dry-run
3
+ agent: data-engineer
4
+ title: Testar uma migration sem commitar (dry-run)
5
+ inputs: [migration (path)]
6
+ outputs: [relatório de dry-run (sucesso/erro, objetos afetados, avisos)]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Testar uma migration sem commitar (dry-run)
12
+
13
+ **Objetivo:** rodar a migration dentro de uma transação que é sempre revertida no fim, para descobrir
14
+ erros, conflitos e efeitos colaterais **antes** de aplicar de verdade — sem alterar o banco.
15
+
16
+ **Pré-condições:**
17
+ - A migration existe no path informado.
18
+ - Há um ambiente de teste/dev acessível (`db-env-check` ok). Nunca rodo dry-run contra produção sem
19
+ justificativa explícita — prefiro um clone/staging.
20
+
21
+ ## Passos
22
+
23
+ 1. **Abra uma transação** (`BEGIN`) no ambiente de teste. Tudo aqui dentro vai ser descartado no fim —
24
+ por isso é seguro.
25
+ 2. **Execute o DDL/DML da migration** dentro dessa transação, capturando cada erro com a linha/objeto
26
+ que o causou.
27
+ 3. **Colete os efeitos:** quais objetos seriam criados/alterados/removidos, quais constraints e FKs
28
+ entram, se o baseline (`id`/`created_at`/`updated_at`) está presente nas tabelas novas.
29
+ 4. **Sinalize riscos:** FK sem índice, coluna `NOT NULL` sem default em tabela com dados, operação que
30
+ reescreve tabela grande (lock), tabela pública sem RLS. Aviso, não silencio.
31
+ 5. **Reverta sempre** (`ROLLBACK`) ao final — com sucesso ou com erro. O dry-run **nunca** deixa
32
+ resíduo no banco.
33
+ 6. **Emita o relatório:** veredito (passa / falha), objetos afetados, avisos e a recomendação (seguir
34
+ para `db-verify-order` + `db-apply-migration`, ou corrigir antes).
35
+
36
+ ## Critério de pronto (DoD)
37
+
38
+ - [ ] Migration executada dentro de transação revertida (`ROLLBACK` garantido)
39
+ - [ ] Objetos afetados e avisos de risco listados
40
+ - [ ] Veredito claro: passa para aplicação ou volta para correção
41
+ - [ ] Nenhum resíduo deixado no banco
42
+
43
+ ## Falha / recuperação
44
+
45
+ - **A migration falha no dry-run** → ótimo, foi exatamente pra isso. Reporto o erro com objeto/linha e
46
+ devolvo para correção; **não** sigo para `db-apply-migration`.
47
+ - **O `ROLLBACK` não pôde ser garantido** (ex.: comando que faz commit implícito) → HALT, aviso que a
48
+ migration não é dry-run-safe e exijo refatorá-la antes de qualquer aplicação real.
49
+ - **Sem ambiente de teste disponível** → escalo para o @devops provisionar; não rodo dry-run em
50
+ produção como atalho.
@@ -0,0 +1,57 @@
1
+ ---
2
+ id: db-env-check
3
+ agent: data-engineer
4
+ title: Validar variáveis de ambiente do banco
5
+ inputs: [ambiente alvo (local/staging/prod)]
6
+ outputs: [relatório de validação, veredito GO/NO-GO para operar o banco]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Validar variáveis de ambiente do banco
12
+
13
+ **Objetivo:** confirmar que as variáveis de ambiente do banco estão presentes, coerentes e seguras
14
+ antes de qualquer operação — para nenhuma task de banco rodar às cegas ou contra o alvo errado.
15
+
16
+ **Pré-condições:**
17
+ - Existe uma fonte de configuração de ambiente (`.env`, variáveis exportadas, ou config do projeto).
18
+ Se nenhuma fonte existe, **pare** e reporte: não há o que validar.
19
+ - O ambiente alvo está claro (local, staging ou prod). Se ambíguo, elicito qual — operar no alvo
20
+ errado é o pior erro de banco que existe.
21
+
22
+ ## Passos
23
+
24
+ 1. **Liste as variáveis exigidas** pelo ambiente alvo: host, porta, nome do banco, usuário, senha/
25
+ credencial, e — em Supabase — URL do projeto, anon key e service role key.
26
+ 2. **Verifique presença e formato** de cada variável. Vazia, ausente ou malformada (URL inválida,
27
+ porta não numérica) é falha imediata para aquele item.
28
+ 3. **Cheque coerência de alvo:** o host/URL aponta para o ambiente declarado? Uma string de produção
29
+ num check de "local" é **NO-GO** — sinalizo antes que alguém escreva no lugar errado.
30
+ 4. **Valide a postura de segurança:** em produção, exijo Pooler com `sslmode=require`. Service role
31
+ bypassa RLS — confirmo que está presente só onde é justificado e nunca exposto em cliente.
32
+ 5. **Teste a conexão** com uma query trivial e read-only (`SELECT 1`), sem escrever nada. Confirma que
33
+ a credencial conecta de fato, não só que a string existe.
34
+ 6. **Redija os segredos** no relatório: presença e formato são reportados como OK/FALHA, nunca o valor
35
+ inteiro de senha ou token.
36
+ 7. **Emita o veredito:** **GO** (todas as variáveis presentes, coerentes, conexão OK) ou **NO-GO**
37
+ (lista objetiva do que falta ou está errado, com o que corrigir).
38
+
39
+ ## Critério de pronto (DoD)
40
+
41
+ - [ ] Todas as variáveis exigidas pelo alvo verificadas (presença + formato)
42
+ - [ ] Coerência de alvo confirmada (host/URL bate com o ambiente declarado)
43
+ - [ ] Postura de segurança validada (SSL em prod; service role só onde justificado)
44
+ - [ ] Conexão testada com query read-only
45
+ - [ ] Segredos redigidos no relatório (nunca valor inteiro)
46
+ - [ ] Veredito GO/NO-GO emitido com itens acionáveis no caso de NO-GO
47
+
48
+ ## Falha / recuperação
49
+
50
+ - **Variável ausente ou malformada** → **NO-GO**; reporto exatamente qual e o formato esperado, sem
51
+ adivinhar o valor.
52
+ - **Alvo incoerente** (string de prod num check de local) → **NO-GO** imediato e **HALT** em qualquer
53
+ operação subsequente até a correção.
54
+ - **Conexão falha** → reporto o erro bruto (redigido) e o veredito NO-GO; nenhuma task de banco deve
55
+ prosseguir.
56
+ - **Segredo exposto em cliente ou local inseguro** → sinalizo como achado de segurança e bloqueio até
57
+ remediar; gestão de MCP/infra de credencial, se necessária, é delegada ao @devops.
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: db-load-csv
3
+ agent: data-engineer
4
+ title: Carregar CSV com segurança (staging → merge)
5
+ inputs: [table, file, story]
6
+ outputs: [linhas carregadas idempotentemente, relatório de rejeitadas]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Carregar CSV com segurança (staging → merge)
12
+
13
+ **Objetivo:** carregar um CSV numa tabela alvo de forma idempotente e segura — via tabela de staging e
14
+ merge por chave — sem corromper dados existentes nem quebrar no replay.
15
+
16
+ **Pré-condições:**
17
+ - O arquivo CSV existe em `file` e a tabela alvo `table` existe. Se faltar qualquer um, **pare** e
18
+ reporte.
19
+ - A tabela alvo tem chave natural ou única para o merge (ex.: `email`, `external_id`). Sem chave de
20
+ conflito, o merge não tem como ser idempotente — **pare** e peça a chave.
21
+
22
+ ## Passos
23
+
24
+ 1. **Snapshot antes de carregar** (`*snapshot load-{table}`): carga em massa é mudança de dados;
25
+ preciso do ponto de rollback.
26
+ 2. **Inspecione o CSV:** cabeçalho, encoding, delimitador, tipos por coluna e amostra de linhas. Mapeie
27
+ colunas do CSV → colunas da tabela. Mapeamento ambíguo eu elicito — não adivinho coluna.
28
+ 3. **Crie a staging idempotente:** `CREATE TABLE IF NOT EXISTS stg_{table} (...)` com os tipos do CSV
29
+ (texto onde houver dúvida, para validar antes de converter). `TRUNCATE stg_{table};` antes de cada
30
+ carga.
31
+ 4. **Carregue na staging** (`COPY stg_{table} FROM ...` ou loader equivalente). Sem auto-commit na
32
+ alvo: a alvo só é tocada após validação.
33
+ 5. **Valide na staging:** tipos convertem? NOT NULL respeitado? duplicatas na chave de conflito?
34
+ linhas inválidas vão para um relatório de rejeitadas — não barram as válidas, mas são reportadas.
35
+ 6. **Merge idempotente em transação:** `BEGIN; INSERT INTO {table} (...) SELECT ... FROM stg_{table}
36
+ ON CONFLICT ({chave}) DO UPDATE/NOTHING; COMMIT;`. Rodar de novo não duplica nem corrompe.
37
+ 7. **Reconcilie:** linhas no CSV vs. válidas vs. carregadas vs. rejeitadas. Os números têm que fechar.
38
+ 8. **Limpe a staging** se for descartável, ou deixe-a para auditoria conforme a story pedir.
39
+
40
+ ## Critério de pronto (DoD)
41
+
42
+ - [ ] Snapshot criado antes da carga
43
+ - [ ] Carga via staging + merge por chave de conflito (idempotente no replay)
44
+ - [ ] Merge rodou em transação (sem estado parcial na alvo)
45
+ - [ ] Linhas rejeitadas reportadas; contagens reconciliam (CSV = válidas + rejeitadas)
46
+ - [ ] Mapeamento de colunas rastreia à story/spec — nada inventado
47
+
48
+ ## Falha / recuperação
49
+
50
+ - **Sem chave de conflito** → **pare**; merge idempotente é impossível sem ela.
51
+ - **Erro no merge** → `ROLLBACK` deixou a alvo intacta; investigo na staging e repito. Se preciso,
52
+ `*rollback load-{table}`.
53
+ - **Muitas linhas rejeitadas** → suspendo e reporto a qualidade do CSV em vez de empurrar dado sujo.
54
+ - **Subir o resultado (push/PR)** → delego ao @devops. Eu carrego no banco, não faço push.
@@ -0,0 +1,58 @@
1
+ ---
2
+ id: db-policy-apply
3
+ agent: data-engineer
4
+ title: Instalar política RLS numa tabela
5
+ inputs: [table, mode, story]
6
+ outputs: [política RLS aplicada, casos de teste positivo/negativo, snapshot]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Instalar política RLS numa tabela
12
+
13
+ **Objetivo:** habilitar Row Level Security e instalar a política de acesso de uma tabela — no modo
14
+ KISS (dono-só) ou granular — de forma idempotente e reversível, rastreando à story/spec.
15
+
16
+ **Pré-condições:**
17
+ - A tabela existe e tem a coluna de posse esperada (ex.: `user_id`/`owner_id`). Se não tiver, **pare**
18
+ e devolva ao design de schema — RLS sem coluna de posse não tem como filtrar.
19
+ - Existe camada de auth (Supabase Auth ou equivalente). Sem ela, `auth.uid()` retorna NULL — aviso
20
+ explicitamente que a política vai negar tudo.
21
+ - O `mode` é `kiss` (dono lê/escreve só o que é dele) ou `granular` (regras por operação/role). Se
22
+ ambíguo, elicito — não invento a regra de acesso.
23
+
24
+ ## Passos
25
+
26
+ 1. **Snapshot antes de tocar** (`*snapshot policy-{table}`): RLS é mudança de schema; preciso de ponto
27
+ de rollback antes de qualquer `ALTER`.
28
+ 2. **Confirme a regra de acesso na story/spec.** Quem pode ler? Quem pode escrever? Há leitura pública?
29
+ A regra rastreia a um requisito — não deduzo permissão por conta própria.
30
+ 3. **Habilite RLS idempotente:** `ALTER TABLE {table} ENABLE ROW LEVEL SECURITY;` (seguro repetir).
31
+ Sem isso a tabela fica aberta mesmo com política definida.
32
+ 4. **Escreva a(s) política(s)** com `DROP POLICY IF EXISTS ... ; CREATE POLICY ...` para idempotência:
33
+ - **kiss:** uma política `USING (auth.uid() = user_id)` + `WITH CHECK` igual, cobrindo SELECT/
34
+ INSERT/UPDATE/DELETE do dono.
35
+ - **granular:** políticas separadas por comando/role, cada uma justificada pela regra de acesso.
36
+ 5. **Aplique em transação** (via `*run-sql` ou `*apply-migration`): `BEGIN; ... COMMIT;`. Erro =
37
+ `ROLLBACK` automático, tabela intacta.
38
+ 6. **Valide com `*test-as-user`** (positivo E negativo): o dono enxerga o dele; um terceiro NÃO enxerga
39
+ nem altera. Política sem teste negativo é política não-comprovada.
40
+ 7. **Registre** a política e os casos de teste no rastro da story (File List / nota de banco).
41
+
42
+ ## Critério de pronto (DoD)
43
+
44
+ - [ ] RLS habilitada na tabela e política(s) criada(s) de forma idempotente
45
+ - [ ] Teste positivo passa (dono acessa o dele) e teste negativo passa (terceiro é bloqueado)
46
+ - [ ] Snapshot criado antes da aplicação; rollback possível
47
+ - [ ] Regra de acesso rastreia à story/spec — nada inventado
48
+ - [ ] Aplicação rodou em transação (sem estado parcial)
49
+
50
+ ## Falha / recuperação
51
+
52
+ - **`auth.uid()` é NULL (sem auth)** → política nega tudo; **pare**, sinalize a dependência de auth e
53
+ não declare pronto.
54
+ - **Teste negativo falha (terceiro enxerga o dado)** → política está vazando; reverto via snapshot,
55
+ corrijo o predicado e revalido. Não entrego com vazamento.
56
+ - **Erro na aplicação** → `ROLLBACK` deixou a tabela intacta; investigo o DDL e repito. Se o snapshot
57
+ for necessário, `*rollback policy-{table}`.
58
+ - **Subir a mudança (push/PR)** → delego ao @devops. Eu aplico no banco, mas não faço push.
@@ -0,0 +1,51 @@
1
+ ---
2
+ id: db-rollback
3
+ agent: data-engineer
4
+ title: Reverter banco para um snapshot ou rodar rollback script
5
+ inputs: [snapshot (label) ou rollback script (path)]
6
+ outputs: [banco restaurado, registro do rollback]
7
+ elicit: true
8
+ modes: [interactive]
9
+ ---
10
+
11
+ # Reverter banco para um snapshot ou rodar rollback script
12
+
13
+ **Objetivo:** desfazer uma mudança de schema/dados restaurando um snapshot ou aplicando o rollback
14
+ script — devolvendo o banco a um estado bom conhecido, com confirmação humana antes de qualquer
15
+ operação destrutiva.
16
+
17
+ **Pré-condições:**
18
+ - Existe o snapshot rotulado OU o rollback script correspondente à mudança a desfazer.
19
+ - O ambiente-alvo está identificado (`db-env-check` ok). Reverter no ambiente errado é dano duplo.
20
+
21
+ ## Passos
22
+
23
+ 1. **Identifique o alvo da reversão:** qual migration/operação está sendo desfeita, e qual o ponto de
24
+ destino (snapshot label ou rollback script).
25
+ 2. **PONTO DE ELICITAÇÃO — confirme com o humano** antes de qualquer operação destrutiva: mostre o
26
+ ambiente, o ponto de destino e o que será perdido (dados gravados após o snapshot, por exemplo).
27
+ **Só prossiga com confirmação explícita.** Em produção, isso é inegociável.
28
+ 3. **Crie um snapshot de segurança do estado atual** antes de reverter — para poder desfazer o próprio
29
+ rollback se for preciso. Reversibilidade vale também para a reversão.
30
+ 4. **Execute a reversão** em transação: restaure o snapshot OU rode o rollback script idempotente
31
+ (`IF EXISTS`), com `ROLLBACK` automático em caso de erro.
32
+ 5. **Verifique o estado pós-rollback:** as estruturas voltaram ao esperado, constraints/FKs/RLS estão
33
+ coerentes, e o smoke-test (`db-smoke-test`) passa no estado restaurado.
34
+ 6. **Registre o rollback** (alvo, ponto de destino, ambiente, timestamp, snapshot de segurança criado)
35
+ na trilha da story.
36
+
37
+ ## Critério de pronto (DoD)
38
+
39
+ - [ ] Confirmação humana obtida antes da operação destrutiva
40
+ - [ ] Snapshot de segurança do estado atual criado antes de reverter
41
+ - [ ] Reversão executada em transação; estado pós-rollback verificado
42
+ - [ ] Smoke-test verde no estado restaurado
43
+ - [ ] Rollback registrado na trilha da story
44
+
45
+ ## Falha / recuperação
46
+
47
+ - **A reversão falha no meio** → a transação faz `ROLLBACK`; confirmo que o banco continua no estado
48
+ pré-rollback e reporto. Não improviso correção destrutiva ao vivo.
49
+ - **O snapshot/script não restaura limpo** → recorro ao snapshot de segurança criado no passo 3 e
50
+ escalo, em vez de empurrar um estado inconsistente.
51
+ - **Humano não confirma** → não executo. Rollback sem confirmação não acontece.
@@ -0,0 +1,61 @@
1
+ ---
2
+ id: db-run-sql
3
+ agent: data-engineer
4
+ title: Executar SQL bruto em transação
5
+ inputs: [arquivo .sql, objetivo/story que justifica a execução]
6
+ outputs: [resultado da execução, snapshot prévio, log da transação]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Executar SQL bruto em transação
12
+
13
+ **Objetivo:** rodar um arquivo SQL contra o banco dentro de uma transação reversível, com snapshot
14
+ antes e rollback garantido se algo falhar — sem inventar SQL fora do que o arquivo e a story pedem.
15
+
16
+ **Pré-condições:**
17
+ - O arquivo `.sql` existe, é legível e rastreia a uma story/spec/objetivo. Se não rastreia, **pare**
18
+ e elicito o porquê — não executo SQL órfão (Constituição Art. IV).
19
+ - As variáveis de ambiente do banco estão válidas (rode `db-env-check` antes se houver dúvida). Sem
20
+ conexão verificada, **pare**.
21
+ - Eu li o conteúdo do SQL inteiro. Se ele contém DDL destrutivo (`DROP`, `TRUNCATE`, `DELETE` sem
22
+ `WHERE`), confirmo o alvo e o escopo antes de prosseguir.
23
+
24
+ ## Passos
25
+
26
+ 1. **Leia o arquivo `.sql` por completo** e classifique a operação: leitura pura, DML, ou DDL que
27
+ altera schema. DDL/DML destrutivo exige snapshot obrigatório no passo 2; leitura pura pode pular.
28
+ 2. **Tire um snapshot** do estado relevante (`db-snapshot {label}`) como ponto de rollback, sempre que
29
+ o SQL escreve ou altera schema. Sem snapshot, eu não aplico mudança que escreve.
30
+ 3. **Abra uma transação explícita** (`BEGIN`) e execute o conteúdo do arquivo dentro dela. Nada de
31
+ autocommit por statement em mudança de schema/dados — ou tudo entra, ou nada entra.
32
+ 4. **Verifique o resultado antes do commit:** contagem de linhas afetadas, ausência de erro, e
33
+ coerência com o que a story esperava. Se algo destoa do esperado, faço `ROLLBACK` e reporto.
34
+ 5. **Commit** (`COMMIT`) só quando o resultado bate com o esperado. Em qualquer erro durante a
35
+ execução, `ROLLBACK` automático — a transação garante que rodar de novo é seguro.
36
+ 6. **Redija segredos** em qualquer eco de resultado ou log (senhas, tokens nunca aparecem inteiros).
37
+ 7. **Registre** o que rodou: arquivo, label do snapshot, linhas afetadas e status final, na story ou
38
+ no log da operação — é o rastro de auditoria.
39
+ 8. **Smoke-test rápido** quando o SQL alterou schema/dados críticos: uma query de verificação que
40
+ prova que o estado pós-execução está consistente.
41
+
42
+ ## Critério de pronto (DoD)
43
+
44
+ - [ ] SQL rastreia a uma story/spec; nada órfão foi executado
45
+ - [ ] Snapshot prévio criado para qualquer operação que escreve ou altera schema
46
+ - [ ] Execução ocorreu dentro de transação explícita (`BEGIN`…`COMMIT`/`ROLLBACK`)
47
+ - [ ] Resultado verificado contra o esperado antes do commit
48
+ - [ ] Segredos redigidos em logs e ecos
49
+ - [ ] Operação registrada (arquivo, snapshot, linhas afetadas, status)
50
+
51
+ ## Falha / recuperação
52
+
53
+ - **Erro durante a execução** → `ROLLBACK` automático da transação; reporto o erro e o estado
54
+ preservado pelo snapshot. Nada parcial fica no banco.
55
+ - **Resultado destoa do esperado** → `ROLLBACK`, registro a divergência e devolvo à origem (story/
56
+ @architect) em vez de forçar o commit.
57
+ - **Snapshot falhou** → **HALT**. Sem ponto de rollback eu não escrevo no banco.
58
+ - **Conexão indisponível ou env inválido** → paro e rodo/encaminho `db-env-check`; não tento conexão
59
+ às cegas.
60
+ - **O SQL exige subir algo (push, release)** → eu não faço; delego ao @devops. Eu só executo contra o
61
+ banco, localmente.
@@ -0,0 +1,52 @@
1
+ ---
2
+ id: db-seed
3
+ agent: data-engineer
4
+ title: Aplicar seed idempotente
5
+ inputs: [seed (path), story/spec de origem]
6
+ outputs: [dados de seed aplicados, registro da carga]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Aplicar seed idempotente
12
+
13
+ **Objetivo:** popular o banco com dados de referência/iniciais de forma idempotente — rodar de novo
14
+ não duplica nem quebra nada — sempre rastreando os dados a uma story/spec.
15
+
16
+ **Pré-condições:**
17
+ - O arquivo de seed existe e os dados rastreiam a um requisito/story (dados de referência, lookup,
18
+ fixtures). Seed que inventa dados fora do escopo é **bloqueado** (Constituição Art. IV).
19
+ - O schema-alvo já está aplicado (as tabelas que o seed popula existem). Se não, **pare** e aplique a
20
+ migration antes.
21
+
22
+ ## Passos
23
+
24
+ 1. **Confirme o ambiente-alvo** (dev / staging / produção). Seed de fixtures de teste **não** vai para
25
+ produção; seed de dados de referência pode — confirmo qual é qual.
26
+ 2. **Garanta a idempotência:** o seed usa `INSERT … ON CONFLICT DO NOTHING/UPDATE`, `MERGE` ou check
27
+ por chave natural. Se o script não for idempotente, refatoro antes — rodar duas vezes tem que ser
28
+ seguro.
29
+ 3. **Aplique em transação** (`BEGIN … COMMIT`), respeitando a ordem de dependências (pais antes de
30
+ filhos, FKs satisfeitas).
31
+ 4. **Verifique a carga:** as linhas esperadas existem, sem duplicatas, com FKs válidas e constraints
32
+ satisfeitas. Conto os registros e comparo com o esperado.
33
+ 5. **Rode o seed uma segunda vez** num ambiente de teste para provar a idempotência: a contagem não
34
+ muda. Essa é a prova, não a promessa.
35
+ 6. **Registre a carga** (seed id, ambiente, linhas afetadas, timestamp) na trilha da story.
36
+
37
+ ## Critério de pronto (DoD)
38
+
39
+ - [ ] Seed aplicado em transação, na ordem de dependências
40
+ - [ ] Idempotência provada (segunda execução não duplica)
41
+ - [ ] Contagem e integridade (FKs/constraints) verificadas
42
+ - [ ] Carga registrada na trilha da story; ambiente correto confirmado
43
+
44
+ ## Falha / recuperação
45
+
46
+ - **O seed falha no meio** → `ROLLBACK` da transação; banco intacto. Reporto a linha/registro que
47
+ causou e corrijo o seed.
48
+ - **A segunda execução duplica ou quebra** → o seed não é idempotente; HALT e refatoro antes de
49
+ considerar pronto.
50
+ - **Seed mira produção com fixtures de teste** → bloqueio e reconfirmo o ambiente; dados de teste não
51
+ contaminam produção.
52
+ - **Dados não rastreiam a story** → recuso a carga e escalo para alinhar escopo.
@@ -0,0 +1,51 @@
1
+ ---
2
+ id: db-smoke-test
3
+ agent: data-engineer
4
+ title: Bateria de smoke-test do banco pós-migração
5
+ inputs: [versão/migration alvo, story/spec de origem]
6
+ outputs: [relatório de smoke-test (verde/vermelho por checagem)]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Bateria de smoke-test do banco pós-migração
12
+
13
+ **Objetivo:** provar rapidamente que o banco está saudável depois de uma migration/seed — estruturas,
14
+ integridade, RLS e queries de caminho crítico — antes de declarar a operação pronta.
15
+
16
+ **Pré-condições:**
17
+ - A migration/seed da versão-alvo já foi aplicada.
18
+ - As checagens rastreiam aos ACs/padrões de acesso da story/spec — não invento teste fora do escopo.
19
+
20
+ ## Passos
21
+
22
+ 1. **Estrutura:** confirme que as tabelas, colunas, FKs, constraints e índices esperados pela versão
23
+ existem, e que toda tabela tem o baseline (`id`, `created_at`, `updated_at`).
24
+ 2. **Integridade:** rode checagens de FK órfã, constraints `CHECK`/`NOT NULL` e unicidade nas chaves
25
+ que importam. Nada de linha violando o contrato do schema.
26
+ 3. **RLS:** para tabelas públicas, confirme que o RLS está ativo e teste um caso **positivo** (usuário
27
+ autorizado lê o que deve) e um **negativo** (usuário não-autorizado é barrado). RLS sem teste
28
+ negativo é RLS não-verificado.
29
+ 4. **Queries de caminho crítico:** execute as principais leituras/escritas dos padrões de acesso da
30
+ story e confirme que retornam o esperado, com explain plan sem regressão grosseira (ex.: seq scan
31
+ onde havia índice).
32
+ 5. **Idempotência operacional:** confirme que reaplicar a migration/seed não quebra (replay seguro).
33
+ 6. **Emita o relatório:** verde/vermelho por checagem, com o detalhe de qualquer falha. Verde em tudo
34
+ → operação pronta. Qualquer vermelho → bloqueia o "pronto".
35
+
36
+ ## Critério de pronto (DoD)
37
+
38
+ - [ ] Estrutura e baseline verificados
39
+ - [ ] Integridade (FKs, constraints, unicidade) sem violação
40
+ - [ ] RLS ativo com caso positivo E negativo passando
41
+ - [ ] Queries de caminho crítico verdes, sem regressão de plano
42
+ - [ ] Relatório emitido com veredito claro
43
+
44
+ ## Falha / recuperação
45
+
46
+ - **Qualquer checagem vermelha** → a operação **não** está pronta. Reporto a falha e, se for regressão
47
+ da migration aplicada, aciono `db-rollback {snapshot}` para o ponto anterior.
48
+ - **RLS falha no caso negativo** (vaza dado para quem não devia) → trato como CRÍTICO, bloqueio e
49
+ corrijo a política antes de qualquer outra coisa.
50
+ - **Regressão de performance num caminho crítico** → registro com explain plan e devolvo para ajuste de
51
+ índice/query; não declaro pronto com regressão conhecida.
@@ -0,0 +1,48 @@
1
+ ---
2
+ id: db-snapshot
3
+ agent: data-engineer
4
+ title: Criar snapshot do banco (ponto de rollback)
5
+ inputs: [label, escopo (schema | schema+dados)]
6
+ outputs: [snapshot rotulado, manifesto do snapshot (label, escopo, timestamp, ambiente)]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Criar snapshot do banco (ponto de rollback)
12
+
13
+ **Objetivo:** capturar um ponto de restauração rotulado do banco — para que toda mudança subsequente
14
+ seja reversível. Nenhuma migration acontece sem um snapshot antes.
15
+
16
+ **Pré-condições:**
17
+ - O ambiente-alvo está acessível e identificado (`db-env-check` ok).
18
+ - Há um label significativo (ex.: `pre-{migration-id}`, `baseline`). Snapshot sem label é snapshot que
19
+ ninguém acha depois.
20
+
21
+ ## Passos
22
+
23
+ 1. **Defina o escopo:** só schema (estrutura/DDL) ou schema + dados. Para ponto de rollback de
24
+ migration de estrutura, schema basta; quando dados podem ser afetados, incluo dados.
25
+ 2. **Identifique o ambiente** (dev / staging / produção) e registre-o no manifesto — restaurar no
26
+ ambiente errado é desastre, então o ambiente fica gravado.
27
+ 3. **Gere o snapshot** (dump de schema e, se no escopo, de dados) com o label informado, em local
28
+ versionado/seguro de snapshots.
29
+ 4. **Verifique a integridade** do snapshot: o arquivo existe, não está vazio e é restaurável (checagem
30
+ de consistência do dump).
31
+ 5. **Escreva o manifesto:** label, escopo, ambiente, timestamp e a operação que ele protege. Segredos
32
+ eventuais no dump são tratados com cuidado — nunca ecoo conteúdo sensível em log.
33
+ 6. **Reporte o label do snapshot** para que `db-apply-migration` e `db-rollback` possam referenciá-lo.
34
+
35
+ ## Critério de pronto (DoD)
36
+
37
+ - [ ] Snapshot gerado com o label e escopo corretos
38
+ - [ ] Integridade verificada (existe, não-vazio, restaurável)
39
+ - [ ] Manifesto registrado (label, escopo, ambiente, timestamp)
40
+ - [ ] Label reportado para uso por apply/rollback
41
+
42
+ ## Falha / recuperação
43
+
44
+ - **A geração do snapshot falha** → HALT. Sem snapshot válido, **bloqueio** qualquer migration que
45
+ dependia dele — reversibilidade é pré-condição.
46
+ - **O snapshot sai vazio ou corrompido** → descarto, recrio e só prossigo com um snapshot verificado.
47
+ - **Ambiente ambíguo** → paro e confirmo o ambiente antes de gerar; nunca assumo produção/dev por
48
+ conta própria.
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: db-verify-order
3
+ agent: data-engineer
4
+ title: Lint da ordem do DDL de uma migration
5
+ inputs: [migration_path]
6
+ outputs: [veredito de ordem (OK/erros), lista de dependências fora de ordem]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Lint da ordem do DDL de uma migration
12
+
13
+ **Objetivo:** garantir que o DDL de uma migration está em ordem topológica — dependências criadas
14
+ antes de quem as usa — para que a aplicação não falhe no meio por referência a objeto inexistente.
15
+
16
+ **Pré-condições:**
17
+ - O arquivo de migration existe em `migration_path`. Se não existir, **pare** e reporte.
18
+ - A migration é DDL (cria/altera estruturas). Se for só DML/seed, esta task não se aplica — use
19
+ `*dry-run` ou `*seed`.
20
+
21
+ ## Passos
22
+
23
+ 1. **Leia a migration inteira** e liste os objetos definidos: tabelas, tipos/enums, funções,
24
+ sequences, índices, FKs, políticas RLS, triggers, views.
25
+ 2. **Monte o grafo de dependências:** tipo/enum antes da coluna que o usa; tabela referenciada antes
26
+ da FK; tabela antes do índice/política/trigger dela; função antes do trigger que a chama.
27
+ 3. **Verifique a ordem de declaração contra o grafo.** Todo objeto deve aparecer DEPOIS de tudo que
28
+ ele depende. Marque cada violação (linha X usa objeto definido só na linha Y > X).
29
+ 4. **Cheque idempotência junto:** `IF NOT EXISTS`/`IF EXISTS` nas criações e drops, para o replay ser
30
+ seguro. Ausência é débito a sinalizar.
31
+ 5. **Detecte ciclos** (A depende de B que depende de A): exigem `ALTER TABLE ADD CONSTRAINT` separado
32
+ após ambas as tabelas existirem.
33
+ 6. **Emita o veredito:** OK (ordem topológica válida) ou ERROS (lista de objetos fora de ordem, com
34
+ linha e dependência faltante), sem aplicar nada — esta é uma task de lint, não de execução.
35
+
36
+ ## Critério de pronto (DoD)
37
+
38
+ - [ ] Todos os objetos do DDL inventariados e mapeados em dependências
39
+ - [ ] Cada dependência aparece antes de quem a usa — ou a violação foi reportada com linha
40
+ - [ ] Ciclos detectados e a correção (constraint separada) apontada
41
+ - [ ] Idempotência verificada (IF [NOT] EXISTS)
42
+ - [ ] Veredito emitido; nada aplicado no banco
43
+
44
+ ## Falha / recuperação
45
+
46
+ - **Objeto fora de ordem** → veredito ERROS com a linha exata; devolvo ao autor da migration para
47
+ reordenar antes do `*dry-run`/`*apply-migration`.
48
+ - **Ciclo de FK** → recomendo quebrar em `CREATE TABLE` (ambas) → `ALTER TABLE ADD CONSTRAINT`.
49
+ - **Migration ilegível/parcial** → **pare** e reporte; não dou veredito OK por arquivo incompleto.
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: deliberate
3
+ agent: nexus-master
4
+ title: Deliberar — abrir a sala para DECIDIR
5
+ inputs: [tópico]
6
+ outputs: [Decisão, Racional, Dissensos registrados, Próximo passo]
7
+ elicit: false
8
+ modes: [yolo]
9
+ ---
10
+
11
+ # Deliberar — abrir a sala para DECIDIR
12
+
13
+ **Objetivo:** decidir uma questão de alto valor com trade-off real, abrindo a sala (party-mode) onde
14
+ N personas deliberam com transcript compartilhado — e o desacordo vira ativo.
15
+
16
+ **Pré-condições:**
17
+ - A questão é **decisão**, não execução. Se é construir, use `orchestrate`.
18
+ - Para abrir **debate** (várias rodadas, ~15× mais caro), a questão tem que ser alto-valor,
19
+ paralelizável e de baixo acoplamento (gate de admissão). Senão, roda `quick` (1 rodada + síntese).
20
+
21
+ ## Passos
22
+
23
+ 1. **Formulo o tópico** de forma decidível (uma pergunta com trade-off), não vaga.
24
+ 2. **Escolho as 3-5 personas que mais tensionam** o tópico — não convoco a sala inteira. O valor é o
25
+ desacordo; chamo as lentes que vão divergir (ex.: @architect vs @pm num "monólito vs micro?").
26
+ 3. **Abro a sala** (`nexus party "{tópico}" {personas} [--debate]`): cada persona lê o que a sala já
27
+ disse (transcript compartilhado) e responde pela sua lente — concorda, DISCORDA, constrói.
28
+ 4. **Sintetizo no fim** (eu, a Sofia): leio a sala e entrego **Decisão → Racional → Dissensos →
29
+ Próximo passo**. A decisão rastreia ao que a sala disse — não invento posição que ninguém defendeu.
30
+ 5. **Registro os dissensos.** Onde a sala discordou e quem defendeu o quê vira registro — um dissenso
31
+ marca um risco que a decisão assume conscientemente. Dissenso registrado é um ativo (vira uma
32
+ proposta rastreável na governança).
33
+
34
+ ## Critério de pronto (DoD)
35
+
36
+ - [ ] Tópico decidível e personas que genuinamente tensionam escolhidas
37
+ - [ ] A sala deliberou com transcript compartilhado (não monólogos paralelos)
38
+ - [ ] Síntese entregue: Decisão + Racional + Dissensos + Próximo passo
39
+ - [ ] Cada dissenso real registrado (não varrido para debaixo do tapete)
40
+
41
+ ## Falha / recuperação
42
+
43
+ - **A sala convergiu cedo (todos concordam)** → ou a questão era fácil (decida e siga), ou faltou uma
44
+ lente que tensiona — adiciono a persona que falta.
45
+ - **Debate sem a declaração de admissão** → o motor rebaixa para `quick` automaticamente; aceito.
46
+ - **Síntese ficaria inventando** → emito INCONCLUSIVO honesto em vez de fabricar consenso.
@@ -0,0 +1,59 @@
1
+ ---
2
+ id: design-indexes
3
+ agent: data-engineer
4
+ title: Desenhar a estratégia de índices
5
+ inputs: [schema, padrões de acesso (do modelo de domínio)]
6
+ outputs: [DDL de índices, docs/data/indexes.md]
7
+ elicit: false
8
+ modes: [interactive, yolo]
9
+ ---
10
+
11
+ # Desenhar a estratégia de índices
12
+
13
+ **Objetivo:** criar índices guiados por padrão de acesso real — cada índice serve a uma query que
14
+ existe. Índice sem query que o justifique é peso morto; FK sem índice é débito.
15
+
16
+ **Pré-condições:**
17
+ - O schema existe (saída de `create-schema`).
18
+ - Os padrões de acesso estão documentados no modelo de domínio (quais queries, por qual chave, com
19
+ qual frequência). Se faltam, **pare** — índice sem padrão de acesso é palpite, e eu não otimizo por
20
+ palpite.
21
+
22
+ ## Passos
23
+
24
+ 1. **Releia os padrões de acesso** do modelo de domínio. Liste as queries quentes: filtros, ordenações,
25
+ joins frequentes. Cada índice que eu criar vai apontar para uma dessas queries.
26
+ 2. **Indexe toda foreign key** que participa de join ou filtro. FK sem índice é a causa silenciosa de
27
+ query lenta — eu sinalizo e cubro.
28
+ 3. **Crie índices compostos na ordem certa de colunas** (igualdade antes de range), casando com os
29
+ filtros `WHERE`/`ORDER BY` reais. Coluna na ordem errada é índice que o planner ignora.
30
+ 4. **Considere índices especializados quando o acesso justifica:** parcial (`WHERE deleted_at IS
31
+ NULL`), `GIN`/`GIN trgm` para busca textual/JSONB, `UNIQUE` para identidade de negócio. Cada um
32
+ com a query que o motiva anotada.
33
+ 5. **Evite over-indexing.** Todo índice custa em escrita e espaço. Não crio índice "por garantia" — se
34
+ não há query, não há índice.
35
+ 6. **Escreva DDL idempotente** com `CREATE INDEX IF NOT EXISTS` e, em produção, `CREATE INDEX
36
+ CONCURRENTLY` para não travar a tabela. Isso vai virar migration via `create-migration-plan`.
37
+ 7. **Valide com evidência, não intuição:** rode `EXPLAIN (ANALYZE)` (ou a task `analyze-performance`)
38
+ na query alvo antes/depois para confirmar que o índice é usado e melhora o plano. Decisão de
39
+ performance vem de medição.
40
+ 8. **Documente em `docs/data/indexes.md`:** cada índice, a query que o justifica e a evidência do
41
+ explain plan.
42
+
43
+ ## Critério de pronto (DoD)
44
+
45
+ - [ ] Cada índice rastreia a uma query/padrão de acesso documentado
46
+ - [ ] Toda FK que participa de join/filtro está indexada
47
+ - [ ] Índices compostos com ordem de coluna correta
48
+ - [ ] Sem over-indexing (nenhum índice sem query que o justifique)
49
+ - [ ] DDL idempotente (`IF NOT EXISTS`, `CONCURRENTLY` em produção)
50
+ - [ ] Uso e ganho confirmados por `EXPLAIN ANALYZE`
51
+ - [ ] `docs/data/indexes.md` escrito com a evidência
52
+
53
+ ## Falha / recuperação
54
+
55
+ - **Padrões de acesso ausentes** → volto a `db-domain-modeling`; não crio índice no escuro.
56
+ - **`EXPLAIN` mostra que o índice não é usado** → reviso ordem de colunas/tipo do índice em vez de
57
+ empilhar índices; índice que o planner ignora é só custo.
58
+ - **A indexação vira parte de uma migration** → encaminho para `create-migration-plan`; aplicação em
59
+ ambiente remoto é delegada ao @devops, eu não dou push.