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.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/agents/README.md +133 -0
- package/agents/_protocol.md +107 -0
- package/agents/analyst.md +138 -0
- package/agents/architect.md +146 -0
- package/agents/data-engineer.md +170 -0
- package/agents/dev.md +134 -0
- package/agents/devops.md +141 -0
- package/agents/nexus-master.md +147 -0
- package/agents/pm.md +133 -0
- package/agents/po.md +138 -0
- package/agents/qa.md +192 -0
- package/agents/sm.md +122 -0
- package/agents/squad-creator.md +121 -0
- package/agents/ux-design-expert.md +165 -0
- package/artifact-manifest.json +903 -0
- package/bin/nexus.mjs +37 -0
- package/checklists/README.md +49 -0
- package/checklists/architect-checklist.md +47 -0
- package/checklists/change-checklist.md +61 -0
- package/checklists/db-predeploy-checklist.md +57 -0
- package/checklists/design-quality-checklist.md +57 -0
- package/checklists/discovery-checklist.md +36 -0
- package/checklists/foundation-checklist.md +39 -0
- package/checklists/launch-checklist.md +39 -0
- package/checklists/pm-checklist.md +48 -0
- package/checklists/po-master-checklist.md +64 -0
- package/checklists/reality-check-checklist.md +49 -0
- package/checklists/story-dod-checklist.md +52 -0
- package/checklists/story-draft-checklist.md +36 -0
- package/dist/bin/dashboard.html +279 -0
- package/dist/bin/nexus.mjs +20008 -0
- package/dist/constitution.yaml +76 -0
- package/knowledge/README.md +57 -0
- package/knowledge/architecture/architectural-styles-map.md +182 -0
- package/knowledge/architecture/design-patterns-gof.md +192 -0
- package/knowledge/architecture/distributed-patterns-cheatsheet.md +201 -0
- package/knowledge/architecture/saas-subscription-blueprint.md +355 -0
- package/knowledge/architecture/system-design-tradeoffs.md +231 -0
- package/knowledge/architecture/t3-fullstack-typesafe-stack.md +273 -0
- package/knowledge/copy/landing-copy-that-converts.md +168 -0
- package/knowledge/data/postgres-indexing-and-tuning.md +263 -0
- package/knowledge/data/schema-modeling-decisions.md +273 -0
- package/knowledge/data/supabase-rls-patterns.md +316 -0
- package/knowledge/data/zero-downtime-migrations.md +308 -0
- package/knowledge/devops/cicd-pipeline-best-practices.md +318 -0
- package/knowledge/devops/production-dockerfile.md +283 -0
- package/knowledge/devops/twelve-factor-app.md +398 -0
- package/knowledge/engineering/clean-code-principles.md +429 -0
- package/knowledge/engineering/effective-code-review.md +204 -0
- package/knowledge/engineering/testing-strategy-beyond-unit.md +307 -0
- package/knowledge/governance/risk-matrix.md +56 -0
- package/knowledge/integration/mcp-server-selection-matrix.md +235 -0
- package/knowledge/marketing/copy-que-converte.md +43 -0
- package/knowledge/marketing/funil-e-jornada.md +36 -0
- package/knowledge/negocios/proposta-vencedora.md +38 -0
- package/knowledge/negocios/roi-e-unit-economics.md +46 -0
- package/knowledge/pipeline/1-descobrir.md +26 -0
- package/knowledge/pipeline/2-estrategizar.md +26 -0
- package/knowledge/pipeline/3-estruturar.md +27 -0
- package/knowledge/pipeline/4-construir.md +27 -0
- package/knowledge/pipeline/5-endurecer.md +28 -0
- package/knowledge/pipeline/6-lancar.md +27 -0
- package/knowledge/pipeline/7-operar.md +27 -0
- package/knowledge/security/lgpd-conformidade-basica.md +35 -0
- package/knowledge/security/owasp-secure-coding-gates.md +220 -0
- package/knowledge/security/owasp-top10-threat-assessment.md +287 -0
- package/knowledge/security/threat-modeling-stride.md +34 -0
- package/knowledge/web-craft/a11y-audit-checklist.md +251 -0
- package/knowledge/web-craft/accessible-component-patterns.md +383 -0
- package/knowledge/web-craft/anti-ai-look.md +114 -0
- package/knowledge/web-craft/design-system-from-code.md +195 -0
- package/knowledge/web-craft/intrinsic-css-layout.md +420 -0
- package/knowledge/web-craft/style-cloning.md +185 -0
- package/knowledge/web-craft/visual-polish-review.md +183 -0
- package/package.json +55 -0
- package/runbooks/campanha-de-conteudo.md +36 -0
- package/runbooks/feature-em-projeto-existente.md +37 -0
- package/runbooks/mvp-startup.md +38 -0
- package/runbooks/resposta-a-incidente.md +37 -0
- package/squads/exemplo-conteudo/agents/editor-chefe.md +48 -0
- package/squads/exemplo-conteudo/agents/pesquisador.md +44 -0
- package/squads/exemplo-conteudo/agents/redator.md +45 -0
- package/squads/exemplo-conteudo/knowledge/estilo-editorial.md +21 -0
- package/squads/exemplo-conteudo/squad.yaml +19 -0
- package/squads/exemplo-conteudo/tasks/pesquisar-fontes.md +26 -0
- package/squads/exemplo-conteudo/tasks/planejar-pauta.md +27 -0
- package/squads/exemplo-conteudo/tasks/redigir-artigo.md +26 -0
- package/squads/exemplo-conteudo/tasks/revisar-artigo.md +27 -0
- package/squads/marketing/agents/analista.md +56 -0
- package/squads/marketing/agents/chefe-marketing.md +65 -0
- package/squads/marketing/agents/conteudo.md +55 -0
- package/squads/marketing/agents/copy.md +55 -0
- package/squads/marketing/agents/growth.md +56 -0
- package/squads/marketing/agents/social.md +55 -0
- package/squads/marketing/squad.yaml +17 -0
- package/squads/marketing/tasks/aprovar-campanha.md +43 -0
- package/squads/negocios/agents/chefe-negocios.md +65 -0
- package/squads/negocios/agents/financas-roi.md +55 -0
- package/squads/negocios/agents/suporte.md +55 -0
- package/squads/negocios/agents/vendas-proposta.md +56 -0
- package/squads/negocios/squad.yaml +17 -0
- package/squads/negocios/tasks/aprovar-proposta.md +40 -0
- package/squads/security/agents/appsec-reviewer.md +59 -0
- package/squads/security/agents/chefe-seguranca.md +65 -0
- package/squads/security/agents/compliance-auditor.md +60 -0
- package/squads/security/agents/threat-modeler.md +60 -0
- package/squads/security/squad.yaml +20 -0
- package/squads/security/tasks/aprovar-gate-seguranca.md +42 -0
- package/squads/security/tasks/emitir-parecer-conformidade.md +42 -0
- package/tasks/README.md +72 -0
- package/tasks/accessibility-wcag-checklist.md +69 -0
- package/tasks/advanced-elicitation.md +42 -0
- package/tasks/analyze-performance.md +54 -0
- package/tasks/analyze-project-structure.md +59 -0
- package/tasks/apply-qa-fixes.md +57 -0
- package/tasks/architect-analyze-impact.md +62 -0
- package/tasks/archive-squad.md +52 -0
- package/tasks/audit-codebase.md +53 -0
- package/tasks/build-component.md +61 -0
- package/tasks/calculate-roi.md +63 -0
- package/tasks/ci-cd-configuration.md +51 -0
- package/tasks/collect-visual-evidence.md +62 -0
- package/tasks/compose-molecule.md +57 -0
- package/tasks/consolidate-patterns.md +54 -0
- package/tasks/create-brownfield-prd.md +54 -0
- package/tasks/create-competitor-analysis.md +42 -0
- package/tasks/create-deep-research-prompt.md +62 -0
- package/tasks/create-doc.md +62 -0
- package/tasks/create-epic.md +49 -0
- package/tasks/create-front-end-spec.md +56 -0
- package/tasks/create-migration-plan.md +57 -0
- package/tasks/create-next-story.md +66 -0
- package/tasks/create-prd.md +53 -0
- package/tasks/create-project-brief.md +47 -0
- package/tasks/create-rls-policies.md +59 -0
- package/tasks/create-schema.md +57 -0
- package/tasks/create-service.md +55 -0
- package/tasks/create-squad.md +100 -0
- package/tasks/create-suite.md +62 -0
- package/tasks/db-apply-migration.md +56 -0
- package/tasks/db-domain-modeling.md +57 -0
- package/tasks/db-dry-run.md +50 -0
- package/tasks/db-env-check.md +57 -0
- package/tasks/db-load-csv.md +54 -0
- package/tasks/db-policy-apply.md +58 -0
- package/tasks/db-rollback.md +51 -0
- package/tasks/db-run-sql.md +61 -0
- package/tasks/db-seed.md +52 -0
- package/tasks/db-smoke-test.md +51 -0
- package/tasks/db-snapshot.md +48 -0
- package/tasks/db-verify-order.md +49 -0
- package/tasks/deliberate.md +46 -0
- package/tasks/design-indexes.md +59 -0
- package/tasks/dev-develop-story.md +61 -0
- package/tasks/document-project.md +59 -0
- package/tasks/execute-checklist.md +57 -0
- package/tasks/execute-epic-plan.md +52 -0
- package/tasks/execute-subtask.md +51 -0
- package/tasks/extend-pattern.md +63 -0
- package/tasks/extend-squad.md +60 -0
- package/tasks/extract-patterns.md +64 -0
- package/tasks/extract-tokens.md +59 -0
- package/tasks/facilitate-brainstorming-session.md +42 -0
- package/tasks/generate-ai-frontend-prompt.md +57 -0
- package/tasks/generate-documentation.md +60 -0
- package/tasks/generate-migration-strategy.md +57 -0
- package/tasks/generate-shock-report.md +56 -0
- package/tasks/mcp-management.md +66 -0
- package/tasks/orchestrate.md +50 -0
- package/tasks/perform-market-research.md +42 -0
- package/tasks/plan-create-context.md +57 -0
- package/tasks/plan-create-implementation.md +58 -0
- package/tasks/po-close-story.md +60 -0
- package/tasks/po-manage-story-backlog.md +59 -0
- package/tasks/po-pull-story.md +60 -0
- package/tasks/po-sync-story.md +59 -0
- package/tasks/pr-automation.md +50 -0
- package/tasks/pre-push-quality-gate.md +54 -0
- package/tasks/push.md +53 -0
- package/tasks/qa-browser-console-check.md +52 -0
- package/tasks/qa-create-fix-request.md +58 -0
- package/tasks/qa-evidence-requirements.md +55 -0
- package/tasks/qa-false-positive-detection.md +55 -0
- package/tasks/qa-fix-issues.md +55 -0
- package/tasks/qa-gate.md +53 -0
- package/tasks/qa-migration-validation.md +58 -0
- package/tasks/qa-nfr-assess.md +45 -0
- package/tasks/qa-review-story.md +56 -0
- package/tasks/qa-risk-profile.md +45 -0
- package/tasks/qa-security-checklist.md +64 -0
- package/tasks/qa-test-design.md +47 -0
- package/tasks/qa-trace-requirements.md +48 -0
- package/tasks/release-management.md +53 -0
- package/tasks/repository-cleanup.md +61 -0
- package/tasks/route.md +44 -0
- package/tasks/run-tests.md +50 -0
- package/tasks/security-audit.md +54 -0
- package/tasks/setup-database.md +60 -0
- package/tasks/setup-design-system.md +60 -0
- package/tasks/shard-doc.md +60 -0
- package/tasks/spec-assess-complexity.md +55 -0
- package/tasks/spec-critique.md +64 -0
- package/tasks/spec-gather-requirements.md +48 -0
- package/tasks/spec-research-dependencies.md +42 -0
- package/tasks/spec-write-spec.md +50 -0
- package/tasks/test-as-user.md +52 -0
- package/tasks/ux-create-wireframe.md +54 -0
- package/tasks/ux-user-research.md +55 -0
- package/tasks/validate-next-story.md +61 -0
- package/tasks/validate-squad.md +55 -0
- package/tasks/verify-subtask.md +52 -0
- package/tasks/version-management.md +45 -0
- package/templates/README.md +47 -0
- package/templates/architecture-tmpl.md +115 -0
- package/templates/competitor-analysis-tmpl.md +87 -0
- package/templates/epic-tmpl.md +83 -0
- package/templates/front-end-spec-tmpl.md +110 -0
- package/templates/market-research-tmpl.md +98 -0
- package/templates/migration-plan-tmpl.md +92 -0
- package/templates/prd-tmpl.md +95 -0
- package/templates/project-brief-tmpl.md +100 -0
- package/templates/qa-verdict-tmpl.md +73 -0
- package/templates/rls-policies-tmpl.md +93 -0
- package/templates/schema-design-tmpl.md +107 -0
- package/templates/spec-tmpl.md +88 -0
- package/templates/squad/agent-dna-tmpl.md +72 -0
- package/templates/squad/chief-dna-tmpl.md +98 -0
- package/templates/squad/squad-task-tmpl.md +50 -0
- package/templates/squad/squad-yaml-tmpl.md +47 -0
- 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.
|
package/tasks/db-seed.md
ADDED
|
@@ -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.
|