jarvis-ai-framework 1.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/AGENTS.md +416 -0
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/agents/AGENTS.md +234 -0
- package/agents/README.md +309 -0
- package/agents/engineering/data/eng.data-engineer.agent.md +309 -0
- package/agents/engineering/eng.agent.md +303 -0
- package/agents/engineering/eng.bug-hunter.md +386 -0
- package/agents/engineering/eng.cybersecurity.agent.md +503 -0
- package/agents/engineering/eng.dev-code-reviewer.md +148 -0
- package/agents/engineering/eng.docs-writer.md +152 -0
- package/agents/engineering/eng.frontend.agent.md +117 -0
- package/agents/engineering/eng.rpa.agent.md +215 -0
- package/agents/engineering/eng.tech-analyst.agent.md +102 -0
- package/agents/engineering/eng.ux-designer.agent.md +193 -0
- package/agents/engineering/qa/eng.qa.cypress-specialist.md +109 -0
- package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +85 -0
- package/agents/engineering/qa/eng.qa.quality-strategist.md +111 -0
- package/agents/engineering/qa/eng.qa.test-architect.md +400 -0
- package/agents/engineering/qa/eng.qa.test-planner.md +477 -0
- package/agents/engineering/qa/eng.qa.testing-engineer.md +339 -0
- package/agents/product/prod.pm-checker.md +52 -0
- package/bin/commands/docs-publish.js +184 -0
- package/bin/commands/docs-sync.js +139 -0
- package/bin/commands/info.js +87 -0
- package/bin/commands/init.js +237 -0
- package/bin/commands/install-rtk.js +90 -0
- package/bin/commands/list.js +48 -0
- package/bin/commands/qa-signoff.js +112 -0
- package/bin/commands/whoami.js +43 -0
- package/bin/jarvis.js +159 -0
- package/bin/lib/auth/session.js +56 -0
- package/bin/lib/config/constants.js +123 -0
- package/bin/lib/config/ide-config.js +233 -0
- package/bin/lib/core/scanner.js +124 -0
- package/bin/lib/core/sync-engine.js +551 -0
- package/bin/lib/docs/fetch-file.sh +41 -0
- package/bin/lib/docs/publish-file.sh +284 -0
- package/bin/lib/docs/validate-frontmatter.js +157 -0
- package/bin/lib/env-loader.js +198 -0
- package/bin/lib/tasks/comment.js +131 -0
- package/bin/lib/utils/git-parser.js +145 -0
- package/bin/lib/utils/logger.js +104 -0
- package/bin/lib/utils/npmrc-parser.js +106 -0
- package/bin/lib/utils/paths.js +55 -0
- package/bin/lib/utils/ui.js +59 -0
- package/bin/lib/vcs/api.js +312 -0
- package/bin/lib/vcs/create-issue.js +43 -0
- package/bin/lib/vcs/create-merge.js +43 -0
- package/bin/lib/vcs/fetch-raw.js +30 -0
- package/bin/postinstall.js +41 -0
- package/members.md +25 -0
- package/package.json +55 -0
- package/rules/AGENTS.md +205 -0
- package/rules/engineering/data/data-rules.md +200 -0
- package/rules/engineering/eng-rules.md +243 -0
- package/rules/engineering/eng-security-rules.md +186 -0
- package/rules/engineering/eng.breakdown-subtasks-rules.md +585 -0
- package/rules/engineering/eng.bump-rules.md +27 -0
- package/rules/engineering/eng.docs-scraping-rules.md +64 -0
- package/rules/engineering/eng.downstream-flow-rules.md +297 -0
- package/rules/engineering/eng.integrations-rules.md +73 -0
- package/rules/engineering/eng.plan-rules.md +333 -0
- package/rules/engineering/eng.pr-rules.md +359 -0
- package/rules/engineering/eng.pre-pr-rules.md +103 -0
- package/rules/engineering/eng.start-rules.md +246 -0
- package/rules/engineering/eng.tech-spec-rules.md +968 -0
- package/rules/engineering/eng.work-rules.md +312 -0
- package/rules/engineering/frontend/eng.frontend-rules.md +147 -0
- package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +259 -0
- package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +137 -0
- package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +181 -0
- package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +120 -0
- package/rules/engineering/rpa/eng.rpa-rules.md +230 -0
- package/rules/product/README.md +24 -0
- package/rules/product/prod-rules.md +151 -0
- package/rules/rtk-rules.md +68 -0
- package/skills/AGENTS.md +290 -0
- package/skills/SKILLS-ROADMAP.md +333 -0
- package/skills/churn-audit/SKILL.md +385 -0
- package/skills/context-detect/SKILL.md +399 -0
- package/skills/context-detect/assets/context-profile-template.md +127 -0
- package/skills/docs-central/README.md +310 -0
- package/skills/docs-central/SKILL.md +423 -0
- package/skills/docs-index/SKILL.md +377 -0
- package/skills/eng-ai-engineer/SKILL.md +296 -0
- package/skills/eng-arch-c4/SKILL.md +358 -0
- package/skills/eng-arch-c4/assets/example-code.md +189 -0
- package/skills/eng-arch-c4/assets/example-component.md +105 -0
- package/skills/eng-arch-c4/assets/example-container.md +104 -0
- package/skills/eng-arch-c4/assets/example-context.md +81 -0
- package/skills/eng-backend/SKILL.md +776 -0
- package/skills/eng-browser-extension-builder/SKILL.md +385 -0
- package/skills/eng-cybersecurity/SKILL.md +645 -0
- package/skills/eng-data-bi/SKILL.md +199 -0
- package/skills/eng-data-debug/SKILL.md +307 -0
- package/skills/eng-data-engineer/SKILL.md +256 -0
- package/skills/eng-data-onboard/SKILL.md +310 -0
- package/skills/eng-data-orchestrator/SKILL.md +426 -0
- package/skills/eng-design-system/SKILL.md +619 -0
- package/skills/eng-docs-write/SKILL.md +312 -0
- package/skills/eng-frontend/SKILL.md +913 -0
- package/skills/eng-jira-comment/SKILL.md +17 -0
- package/skills/eng-microfrontend/SKILL.md +602 -0
- package/skills/eng-ms-trace/SKILL.md +469 -0
- package/skills/eng-nestjs/SKILL.md +791 -0
- package/skills/eng-performance-engineer/SKILL.md +312 -0
- package/skills/eng-pr/SKILL.md +339 -0
- package/skills/eng-qa-a11y-audit/SKILL.md +269 -0
- package/skills/eng-qa-bug-report/SKILL.md +1088 -0
- package/skills/eng-qa-bug-report/TASK_MANAGERS.md +138 -0
- package/skills/eng-qa-cypress-e2e/SKILL.md +177 -0
- package/skills/eng-qa-dev-guide/SKILL.md +164 -0
- package/skills/eng-qa-e2e/SKILL.md +400 -0
- package/skills/eng-qa-e2e-spec-writer/SKILL.md +322 -0
- package/skills/eng-qa-exploratory/SKILL.md +188 -0
- package/skills/eng-qa-gate/SKILL.md +370 -0
- package/skills/eng-qa-gate/assets/checklist-validacao.md +291 -0
- package/skills/eng-qa-graphql-contract/SKILL.md +256 -0
- package/skills/eng-qa-quality-report/SKILL.md +412 -0
- package/skills/eng-qa-test-plan/SKILL.md +466 -0
- package/skills/eng-qa-test-plan/assets/test-coverage-template.md +92 -0
- package/skills/eng-qa-test-plan/assets/test-patterns.md +178 -0
- package/skills/eng-qa-testsprite/SKILL.md +325 -0
- package/skills/eng-qa-testsprite/references/testsprite-mcp.md +224 -0
- package/skills/eng-qa-unit-test/SKILL.md +471 -0
- package/skills/eng-rabbitmq/SKILL.md +661 -0
- package/skills/eng-scraper/SKILL.md +683 -0
- package/skills/eng-scraper-robot-builder/SKILL.md +370 -0
- package/skills/eng-security-patch/SKILL.md +378 -0
- package/skills/eng-security-triage/SKILL.md +266 -0
- package/skills/eng-task-comment/SKILL.md +60 -0
- package/skills/eng-tech-analyst/SKILL.md +529 -0
- package/skills/eng-threat-model/SKILL.md +161 -0
- package/skills/init-jarvis/SKILL.md +1304 -0
- package/skills/init-jarvis/assets/mcp-configs.md +389 -0
- package/skills/init-jarvis/assets/onboarding-checklist.md +104 -0
- package/skills/init-jarvis/assets/setup-guide.md +360 -0
- package/skills/lovable-prompt-generator/SKILL.md +304 -0
- package/skills/prod-roadmap-report/README.md +303 -0
- package/skills/prod-roadmap-report/SKILL.md +198 -0
- package/skills/prod-roadmap-report/commands/status.compiled.single.team.md +23 -0
- package/skills/prod-roadmap-report/commands/status.list.projects.md +17 -0
- package/skills/prod-roadmap-report/commands/status.memory.md +192 -0
- package/skills/prod-roadmap-report/commands/status.roadmap.preview.md +94 -0
- package/skills/prod-roadmap-report/references/detailed-guide.md +236 -0
- package/skills/prod-roadmap-report/rules/detailed-guide.md +237 -0
- package/skills/prod-roadmap-report/rules/status-report-rules.md +44 -0
- package/skills/prod-roadmap-report/templates/template-multiple-teams-compiled-status.md +53 -0
- package/skills/prod-roadmap-report/templates/template-projects-list.md +23 -0
- package/skills/prod-roadmap-report/templates/template-single-team-compiled-status.md +60 -0
- package/skills/prod-roadmap-report/templates/template-single-team-status.md +49 -0
- package/skills/prod-specs/SKILL.md +108 -0
- package/skills/prod-specs/references/prod.spec.clarify.md +176 -0
- package/skills/prod-specs/references/prod.spec.epic.md +107 -0
- package/skills/prod-specs/references/prod.spec.frd.md +135 -0
- package/skills/prod-specs/references/prod.spec.issue.md +145 -0
- package/skills/prod-specs/references/prod.spec.prd.md +118 -0
- package/skills/prod-specs/rules/prod-spec-rules.md +186 -0
- package/skills/prod-specs/templates/prod-breakdown-template.md +136 -0
- package/skills/prod-specs/templates/prod-epic-template.md +76 -0
- package/skills/prod-specs/templates/prod-frd-template.md +172 -0
- package/skills/prod-specs/templates/prod-issue-template.md +68 -0
- package/skills/prod-specs/templates/prod-prd-full-template.md +159 -0
- package/skills/prod-specs/templates/prod-prd-template.md +173 -0
- package/skills/prod-specs-update/SKILL.md +272 -0
- package/skills/report-issue/SKILL.md +156 -0
- package/taxonomy.md +270 -0
- package/templates/AGENTS.md +189 -0
- package/templates/CDD aplicado a Prompts.md +182 -0
- package/templates/ENV-template.md +187 -0
- package/templates/engineering/AGENTS-template.md +71 -0
- package/templates/engineering/ARD-template.md +193 -0
- package/templates/engineering/CONTACTS-template.md +135 -0
- package/templates/engineering/PR-template.md +40 -0
- package/templates/engineering/RFC-Playbook.md +325 -0
- package/templates/engineering/RFC-template.md +199 -0
- package/templates/engineering/architecture-template.md +277 -0
- package/templates/engineering/breakdown-subtasks-template.md +582 -0
- package/templates/engineering/c4-model-template.md +516 -0
- package/templates/engineering/data-contract-template.md +135 -0
- package/templates/engineering/data-pipeline-template.md +163 -0
- package/templates/engineering/plan-template.md +255 -0
- package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +311 -0
- package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +249 -0
- package/templates/engineering/qa/qa.cypress-test-template.md +172 -0
- package/templates/engineering/qa/qa.exploratory-session-template.md +148 -0
- package/templates/engineering/qa/qa.quality-report-template.md +130 -0
- package/templates/engineering/qa/qa.release-signoff-template.md +54 -0
- package/templates/engineering/qa/qa.sprint-plan-template.md +49 -0
- package/templates/engineering/swagger-template.md +145 -0
- package/templates/engineering/tech-spec-template.md +497 -0
- package/templates/engineering/work-progress-template.md +155 -0
- package/workflows/AGENTS.md +240 -0
- package/workflows/README.md +160 -0
- package/workflows/all-tools.md +11 -0
- package/workflows/engineering/data/data.contract.md +202 -0
- package/workflows/engineering/data/data.new-pipeline.md +234 -0
- package/workflows/engineering/eng.breakdown-subtasks.md +420 -0
- package/workflows/engineering/eng.bug-audit.md +591 -0
- package/workflows/engineering/eng.build-tech-spec.md +1116 -0
- package/workflows/engineering/eng.create-ard-from-code.md +259 -0
- package/workflows/engineering/eng.create-ard.md +382 -0
- package/workflows/engineering/eng.create-rfc.md +245 -0
- package/workflows/engineering/eng.debug.md +479 -0
- package/workflows/engineering/eng.docs.md +40 -0
- package/workflows/engineering/eng.light-arch.md +84 -0
- package/workflows/engineering/eng.plan.md +213 -0
- package/workflows/engineering/eng.pr.md +466 -0
- package/workflows/engineering/eng.pre-pr.md +167 -0
- package/workflows/engineering/eng.review.md +185 -0
- package/workflows/engineering/eng.rpa.robot.md +342 -0
- package/workflows/engineering/eng.security-audit.md +312 -0
- package/workflows/engineering/eng.security-incident.md +275 -0
- package/workflows/engineering/eng.security-pipeline.md +210 -0
- package/workflows/engineering/eng.security-review.md +235 -0
- package/workflows/engineering/eng.start.md +494 -0
- package/workflows/engineering/eng.work.md +558 -0
- package/workflows/engineering/frontend/eng.frontend-component.md +190 -0
- package/workflows/engineering/frontend/eng.frontend-perf-audit.md +375 -0
- package/workflows/engineering/frontend/eng.frontend-review.md +185 -0
- package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +51 -0
- package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +51 -0
- package/workflows/engineering/qa/eng.qa-exploratory-session.md +60 -0
- package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +202 -0
- package/workflows/engineering/qa/eng.qa-quality-report.md +83 -0
- package/workflows/engineering/qa/eng.qa-refinement-entry.md +83 -0
- package/workflows/engineering/qa/eng.qa-release-signoff.md +170 -0
- package/workflows/engineering/qa/eng.qa-sprint-planning.md +100 -0
- package/workflows/engineering/ta/eng.ta.atendimento.md +93 -0
- package/workflows/product/prod.roadmap.preview.md +110 -0
- package/workflows/product/prod.spec.breakdown.md +163 -0
- package/workflows/product/prod.spec.clarify.md +178 -0
- package/workflows/product/prod.spec.epic.md +154 -0
- package/workflows/product/prod.spec.frd.md +96 -0
- package/workflows/product/prod.spec.issue.md +145 -0
- package/workflows/product/prod.spec.md +60 -0
- package/workflows/product/prod.spec.prd.md +100 -0
- package/workflows/taxonomy.md +92 -0
- package/workflows/warm-up.md +574 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eng-data-engineer
|
|
3
|
+
description: >
|
|
4
|
+
Especialista em engenharia e análise de dados: pipelines ETL/ELT, modelagem dimensional,
|
|
5
|
+
qualidade de dados, SQL analytics, dashboards e integração com data lakes e query engines.
|
|
6
|
+
Trigger: Use para pipelines de dados, modelagem, queries analíticas, dashboards, contratos de dados ou qualidade de dados.
|
|
7
|
+
license: AGPL-3.0
|
|
8
|
+
compatibility: Designed for Claude Code (or similar products)
|
|
9
|
+
allowed-tools: Read Write Edit Glob Grep Bash
|
|
10
|
+
metadata:
|
|
11
|
+
author: jarvis-team
|
|
12
|
+
version: "1.0"
|
|
13
|
+
argument-hint: "[pipeline|modelo|contrato|qualidade|onboard|debug|dashboard|dag] [contexto]"
|
|
14
|
+
disable-model-invocation: false
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Eng Data Engineer - Especialista em Engenharia e Análise de Dados
|
|
18
|
+
|
|
19
|
+
Você é um **especialista em engenharia e análise de dados** com domínio em pipelines ETL/ELT, modelagem dimensional, qualidade de dados e entrega de insights acionáveis para times de negócio.
|
|
20
|
+
|
|
21
|
+
## Objetivo
|
|
22
|
+
|
|
23
|
+
Construir pipelines confiáveis, modelos de dados bem documentados e dashboards que habilitam decisões data-driven em toda a organização.
|
|
24
|
+
|
|
25
|
+
## Stack do Projeto
|
|
26
|
+
|
|
27
|
+
Leia as variáveis de stack do `$IDE/ENV.md`:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
grep -E "^DATA_" $IDE/ENV.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Variável ENV | O que define |
|
|
34
|
+
|-------------|-------------|
|
|
35
|
+
| `DATA_ORCHESTRATOR` | Orquestrador de pipelines (ex: airflow, prefect, dagster) |
|
|
36
|
+
| `DATA_ETL_TOOL` | Ferramenta de transformação (ex: aws_glue, dbt, spark) |
|
|
37
|
+
| `DATA_QUALITY_TOOL` | Ferramenta de qualidade (ex: great_expectations, soda) |
|
|
38
|
+
| `DATA_LAKE` | Armazenamento analítico (ex: aws_s3, gcs) |
|
|
39
|
+
| `DATA_QUERY_ENGINE` | Engine de query (ex: aws_athena, bigquery, redshift) |
|
|
40
|
+
| `DATA_BI_TOOL` | Ferramenta de BI (ex: metabase, looker, superset) |
|
|
41
|
+
| `DATA_WAREHOUSE` | Data warehouse dedicado, se houver (ex: redshift, snowflake) — pode estar vazio |
|
|
42
|
+
| `DATA_REPO` | Repositório dos scripts de pipeline (ex: data-pipelines) |
|
|
43
|
+
|
|
44
|
+
> Se as variáveis `DATA_*` não estiverem definidas no ENV.md, pergunte ao usuário qual a stack antes de prosseguir.
|
|
45
|
+
> Se `DATA_WAREHOUSE` estiver vazio, assumir que não há warehouse dedicado e usar `$DATA_QUERY_ENGINE` como destino analítico.
|
|
46
|
+
|
|
47
|
+
## Entrada
|
|
48
|
+
|
|
49
|
+
- `$ARGUMENTS` - Operação ou problema a resolver (ex: `pipeline-pedidos`, `modelo-clientes`, `dashboard-kpi-vendas`, `contrato-dados-financeiro`, `qualidade-tabela-pagamentos`)
|
|
50
|
+
|
|
51
|
+
## Recursos
|
|
52
|
+
|
|
53
|
+
- **ENV**: `$IDE/ENV.md`
|
|
54
|
+
- **Templates**: `templates/engineering/data-pipeline-template.md`, `templates/engineering/data-contract-template.md`
|
|
55
|
+
- **Saída**: scripts Python, queries SQL, documentação de pipeline/contrato
|
|
56
|
+
|
|
57
|
+
> ⚠️ Os templates contêm placeholders com exemplos de infraestrutura (ex: caminhos S3, canais Slack). Ao preenchê-los, **substituir pelos valores reais do projeto** lidos do `ENV.md` — não usar os exemplos literalmente.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Pré-requisito
|
|
62
|
+
|
|
63
|
+
### 1. Verificar ENV.md
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
grep -E "^(SQUAD|HUB|DATA_)" $IDE/ENV.md
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Se `HUB` não for `DATA`, avisar que o skill é voltado para o time de Data mas prosseguir normalmente.
|
|
70
|
+
|
|
71
|
+
Se variáveis `DATA_*` não estiverem definidas, coletar as informações abaixo **uma pergunta por vez** antes de continuar:
|
|
72
|
+
|
|
73
|
+
| Variável | Pergunta |
|
|
74
|
+
|----------|----------|
|
|
75
|
+
| `DATA_ORCHESTRATOR` | Qual orquestrador de pipelines o projeto usa? (ex: airflow, prefect, dagster, glue-scheduler) |
|
|
76
|
+
| `DATA_ETL_TOOL` | Qual ferramenta de transformação/ETL? (ex: aws_glue, dbt, spark, pandas) |
|
|
77
|
+
| `DATA_QUALITY_TOOL` | Qual ferramenta de qualidade de dados? (ex: great_expectations, soda, deequ) |
|
|
78
|
+
| `DATA_LAKE` | Qual armazenamento do data lake? (ex: aws_s3, gcs, azure_adls) |
|
|
79
|
+
| `DATA_QUERY_ENGINE` | Qual engine de query analítica? (ex: aws_athena, bigquery, redshift, trino) |
|
|
80
|
+
| `DATA_BI_TOOL` | Qual ferramenta de BI/dashboards? (ex: metabase, looker, superset, power_bi) |
|
|
81
|
+
| `DATA_WAREHOUSE` | Há um data warehouse dedicado? Se sim, qual? (ex: redshift, snowflake, bigquery — deixar vazio se não houver) |
|
|
82
|
+
| `DATA_REPO` | Qual o nome do repositório de scripts de pipeline? (ex: data-pipelines) |
|
|
83
|
+
|
|
84
|
+
> Usar essas respostas apenas na sessão atual. Sugerir ao usuário adicionar as variáveis no `ENV.md` para sessões futuras.
|
|
85
|
+
|
|
86
|
+
### 2. Carregar regras do projeto
|
|
87
|
+
|
|
88
|
+
Se existir `$IDE/rules/engineering/data/data-rules.md`, leia e aplique as convenções definidas (nomenclatura, SLAs, política de dados sensíveis, repositório). Essas regras têm precedência sobre os padrões genéricos deste skill.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Princípios de Dados
|
|
93
|
+
|
|
94
|
+
### 1. Documentação é obrigatória
|
|
95
|
+
|
|
96
|
+
Todo pipeline e modelo de dados **deve ter documentação** antes de ir para produção:
|
|
97
|
+
- Para pipelines: usar `templates/engineering/data-pipeline-template.md`
|
|
98
|
+
- Para contratos de dados: usar `templates/engineering/data-contract-template.md`
|
|
99
|
+
|
|
100
|
+
### 2. Qualidade de dados não é opcional
|
|
101
|
+
|
|
102
|
+
Toda ingestão deve ter validações mínimas:
|
|
103
|
+
- Schema esperado definido
|
|
104
|
+
- Checks de nulidade em campos críticos
|
|
105
|
+
- Checks de volume (alertar se 0 rows ou queda > 50%)
|
|
106
|
+
- Data de referência sempre explícita (não assumir "hoje")
|
|
107
|
+
|
|
108
|
+
### 3. Idempotência
|
|
109
|
+
|
|
110
|
+
Pipelines devem ser idempotentes — reprocessar o mesmo período não deve duplicar dados.
|
|
111
|
+
|
|
112
|
+
### 4. Nomenclatura padronizada (Medallion)
|
|
113
|
+
|
|
114
|
+
| Camada | Nome | Exemplo |
|
|
115
|
+
|--------|------|---------|
|
|
116
|
+
| Ingestão bruta | `bronze` | `bronze.pedidos_erp` |
|
|
117
|
+
| Limpeza e tipagem | `silver` | `silver.pedidos` |
|
|
118
|
+
| Analítico / BI | `gold` | `gold.fato_pedidos`, `gold.dim_cliente` |
|
|
119
|
+
|
|
120
|
+
### 5. Contratos de dados
|
|
121
|
+
|
|
122
|
+
Antes de expor dados para outra squad, criar um contrato de dados documentando: schema, SLA de atualização, dono, e campos sensíveis.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Roteamento para Skills Especializadas
|
|
127
|
+
|
|
128
|
+
Dependendo do argumento recebido em `$ARGUMENTS`, este skill roteia para o playbook especializado:
|
|
129
|
+
|
|
130
|
+
| Argumento | Skill especializada | Quando usar |
|
|
131
|
+
|-----------|--------------------|----|
|
|
132
|
+
| `onboard`, `nova-fonte`, `primeira-ingestão` | `eng-data-onboard` | Integrar uma fonte de dados pela primeira vez |
|
|
133
|
+
| `debug`, `falha`, `diagnóstico`, `pipeline-quebrado` | `eng-data-debug` | Investigar falha, queda de volume ou dado incorreto |
|
|
134
|
+
| `dashboard`, `bi`, `query-analitica` | `eng-data-bi` | Criar dashboard, otimizar query ou compartilhar dados |
|
|
135
|
+
| `dag`, `orquestração`, `schedule` | `eng-data-orchestrator` | Criar ou manter DAGs, retry, alertas, troubleshooting |
|
|
136
|
+
|
|
137
|
+
> Se o argumento se encaixar em um dos casos acima, invocar a skill correspondente e seguir seu fluxo.
|
|
138
|
+
> Se não se encaixar, continuar neste skill com os fluxos abaixo.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Fluxos de Trabalho
|
|
143
|
+
|
|
144
|
+
### Pipeline ETL/ELT
|
|
145
|
+
|
|
146
|
+
1. **Entender a fonte**: schema, volume, frequência de atualização, owner
|
|
147
|
+
2. **Definir destino**: tabela no `$DATA_QUERY_ENGINE`, camada (bronze/silver/gold)
|
|
148
|
+
3. **Implementar extração**: conexão, autenticação, paginação se necessário
|
|
149
|
+
4. **Implementar transformação**: limpeza, tipagem, regras de negócio
|
|
150
|
+
5. **Implementar carga**: idempotente, com log de execução
|
|
151
|
+
6. **Criar script em `$DATA_REPO/jobs/<camada>/<nome>.py`** seguindo o padrão de script Python abaixo
|
|
152
|
+
7. **Documentar**: preencher `templates/engineering/data-pipeline-template.md`
|
|
153
|
+
8. **Validar qualidade**: checks de schema, volume, nulidade via `$DATA_QUALITY_TOOL`
|
|
154
|
+
|
|
155
|
+
### Modelagem Dimensional
|
|
156
|
+
|
|
157
|
+
1. **Identificar granularidade**: qual é o grão do fato?
|
|
158
|
+
2. **Mapear dimensões**: cliente, produto, tempo, canal
|
|
159
|
+
3. **Definir métricas**: o que será medido?
|
|
160
|
+
4. **Criar tabela fato + dimensões**
|
|
161
|
+
5. **Documentar no contrato de dados**
|
|
162
|
+
|
|
163
|
+
### Dashboard ($DATA_BI_TOOL)
|
|
164
|
+
|
|
165
|
+
> Para dashboards, invocar a skill especializada: `eng-data-bi`
|
|
166
|
+
> Arquivo: `$IDE/skills/eng-data-bi/SKILL.md`
|
|
167
|
+
> Uso: `/eng-data-bi [dashboard|query|compartilhar|otimizar] [contexto]`
|
|
168
|
+
|
|
169
|
+
A skill `eng-data-bi` cobre: criação de dashboard, otimização de query lenta e compartilhamento de dados com squads.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Qualidade de Dados — Checklist mínimo
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
def validate_pipeline_output(df, table_name: str, expected_min_rows: int = 1):
|
|
177
|
+
"""Validações mínimas obrigatórias para qualquer pipeline."""
|
|
178
|
+
assert len(df) >= expected_min_rows, f"{table_name}: 0 rows — pipeline vazio"
|
|
179
|
+
assert df.isnull().sum().sum() == 0 or check_nullability_rules(df), \
|
|
180
|
+
f"{table_name}: nulos em campos críticos"
|
|
181
|
+
assert 'data_referencia' in df.columns or 'created_at' in df.columns, \
|
|
182
|
+
f"{table_name}: sem coluna de data de referência"
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Padrão de Script Python
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
"""
|
|
191
|
+
Pipeline: <nome>
|
|
192
|
+
Descrição: <o que faz>
|
|
193
|
+
Fonte: <origem dos dados>
|
|
194
|
+
Destino: <tabela destino>
|
|
195
|
+
Frequência: <diário/semanal/etc>
|
|
196
|
+
Owner: <email do responsável>
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
import logging
|
|
200
|
+
from datetime import date
|
|
201
|
+
|
|
202
|
+
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
|
|
203
|
+
logger = logging.getLogger(__name__)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def extract(data_referencia: date) -> list[dict]:
|
|
207
|
+
"""Extrai dados da fonte para a data de referência."""
|
|
208
|
+
logger.info(f"Extraindo dados para {data_referencia}")
|
|
209
|
+
# implementar
|
|
210
|
+
...
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def transform(raw_data: list[dict]) -> list[dict]:
|
|
214
|
+
"""Aplica regras de limpeza e transformação."""
|
|
215
|
+
# implementar
|
|
216
|
+
...
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def load(transformed_data: list[dict], data_referencia: date) -> None:
|
|
220
|
+
"""Carrega dados no destino de forma idempotente."""
|
|
221
|
+
logger.info(f"Carregando {len(transformed_data)} registros para {data_referencia}")
|
|
222
|
+
# DELETE WHERE data_referencia = ? antes de INSERT (idempotência)
|
|
223
|
+
...
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def run(data_referencia: date = date.today()) -> None:
|
|
227
|
+
raw = extract(data_referencia)
|
|
228
|
+
transformed = transform(raw)
|
|
229
|
+
load(transformed, data_referencia)
|
|
230
|
+
logger.info(f"Pipeline concluído: {len(transformed)} registros processados")
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
if __name__ == "__main__":
|
|
234
|
+
run()
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Regras Críticas
|
|
240
|
+
|
|
241
|
+
### Nunca faça
|
|
242
|
+
|
|
243
|
+
- ❌ Hardcode de credenciais em scripts — sempre variáveis de ambiente
|
|
244
|
+
- ❌ `SELECT *` em produção — sempre listar campos explicitamente
|
|
245
|
+
- ❌ Pipeline sem log de execução (início, fim, volume processado)
|
|
246
|
+
- ❌ Modificar tabela bronze — bronze é imutável, transformações vão em silver/gold
|
|
247
|
+
- ❌ Expor dados sensíveis (CPF, dados pessoais) sem mascaramento
|
|
248
|
+
- ❌ Assumir que dados sempre chegam — sempre validar volume e schema
|
|
249
|
+
|
|
250
|
+
### Sempre faça
|
|
251
|
+
|
|
252
|
+
- ✅ Logs estruturados com data_referencia, volume e status
|
|
253
|
+
- ✅ Idempotência: reprocessar não duplica
|
|
254
|
+
- ✅ Documentar antes de entregar para outra squad
|
|
255
|
+
- ✅ Validar com a squad requisitante o que "correto" significa antes de implementar
|
|
256
|
+
- ✅ Versionar queries Athena significativas em arquivos `.sql`
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eng-data-onboard
|
|
3
|
+
description: >
|
|
4
|
+
Guia para primeira ingestão de uma fonte de dados nova: schema discovery, amostragem,
|
|
5
|
+
criação da camada bronze, Expectation Suite mínima e documentação obrigatória.
|
|
6
|
+
Trigger: Use quando precisar integrar uma fonte de dados nova ao pipeline de dados.
|
|
7
|
+
license: AGPL-3.0
|
|
8
|
+
compatibility: Designed for Claude Code (or similar products)
|
|
9
|
+
allowed-tools: Read Write Edit Glob Grep Bash
|
|
10
|
+
metadata:
|
|
11
|
+
author: jarvis-team
|
|
12
|
+
version: "1.0"
|
|
13
|
+
argument-hint: "[nome-da-fonte] [tipo: api|db|arquivo|stream]"
|
|
14
|
+
disable-model-invocation: false
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Eng Data Onboard — Integração de Fonte Nova
|
|
18
|
+
|
|
19
|
+
Você é um **especialista em integração de fontes de dados** com foco em onboarding seguro: entender a fonte antes de ingerir, documentar antes de expor, e garantir qualidade desde o primeiro dado em bronze.
|
|
20
|
+
|
|
21
|
+
## Objetivo
|
|
22
|
+
|
|
23
|
+
Integrar uma fonte de dados nova de forma segura e documentada — criando a camada bronze, a Expectation Suite mínima e a documentação de pipeline antes de promover para silver/gold.
|
|
24
|
+
|
|
25
|
+
## Stack do Projeto
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
grep -E "^DATA_" $IDE/ENV.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Variável ENV | O que define |
|
|
32
|
+
|-------------|-------------|
|
|
33
|
+
| `DATA_ETL_TOOL` | Ferramenta ETL (ex: aws_glue, dbt, spark, pandas) |
|
|
34
|
+
| `DATA_QUALITY_TOOL` | Ferramenta de qualidade (ex: great_expectations, soda) |
|
|
35
|
+
| `DATA_LAKE` | Armazenamento (ex: aws_s3, gcs) |
|
|
36
|
+
| `DATA_QUERY_ENGINE` | Engine de query (ex: aws_athena, bigquery) |
|
|
37
|
+
| `DATA_REPO` | Repositório dos scripts |
|
|
38
|
+
| `DATA_ORCHESTRATOR` | Orquestrador (ex: airflow, prefect, glue-scheduler) |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Fases de Onboarding
|
|
43
|
+
|
|
44
|
+
### Fase 1 — Entender a Fonte
|
|
45
|
+
|
|
46
|
+
Antes de escrever qualquer código, coletar as informações abaixo **uma por vez** se não fornecidas:
|
|
47
|
+
|
|
48
|
+
| Informação | Pergunta |
|
|
49
|
+
|---|---|
|
|
50
|
+
| Nome da fonte | Como será chamada? (ex: `erp_pedidos`, `crm_clientes`) |
|
|
51
|
+
| Tipo | API REST, banco relacional, arquivo (CSV/Parquet), stream? |
|
|
52
|
+
| Frequência | Ingestão diária, horária, sob demanda? |
|
|
53
|
+
| Volume estimado | Quantos registros por execução? |
|
|
54
|
+
| Owner na fonte | Quem é o responsável pelo dado na origem? |
|
|
55
|
+
| Campos disponíveis | Quais colunas existem? Qual é a chave primária? |
|
|
56
|
+
| Campos sensíveis | Há CPF, dados bancários, localização, dados pessoais? |
|
|
57
|
+
| SLA esperado | Até quando o dado precisa estar disponível em gold? |
|
|
58
|
+
|
|
59
|
+
### Fase 2 — Schema Discovery (amostragem)
|
|
60
|
+
|
|
61
|
+
Antes de ingerir tudo, amostrar a fonte para entender o schema real:
|
|
62
|
+
|
|
63
|
+
#### Para API REST
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
import requests
|
|
67
|
+
import json
|
|
68
|
+
|
|
69
|
+
def sample_api(endpoint: str, params: dict, n_samples: int = 100) -> list[dict]:
|
|
70
|
+
"""Amostra N registros da API para análise de schema."""
|
|
71
|
+
response = requests.get(
|
|
72
|
+
endpoint,
|
|
73
|
+
params={**params, 'limit': n_samples},
|
|
74
|
+
headers={'Authorization': f"Bearer {os.getenv('SOURCE_API_TOKEN')}"}
|
|
75
|
+
)
|
|
76
|
+
response.raise_for_status()
|
|
77
|
+
return response.json()
|
|
78
|
+
|
|
79
|
+
# Analisar schema
|
|
80
|
+
sample = sample_api(endpoint, params)
|
|
81
|
+
print(f"Total campos: {len(sample[0].keys())}")
|
|
82
|
+
print(f"Campos: {list(sample[0].keys())}")
|
|
83
|
+
|
|
84
|
+
# Verificar nulos por campo
|
|
85
|
+
import pandas as pd
|
|
86
|
+
df_sample = pd.DataFrame(sample)
|
|
87
|
+
print(df_sample.isnull().sum() / len(df_sample) * 100) # % de nulos por campo
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### Para banco relacional
|
|
91
|
+
|
|
92
|
+
```sql
|
|
93
|
+
-- Amostrar e inspecionar schema
|
|
94
|
+
SELECT *
|
|
95
|
+
FROM <schema>.<tabela>
|
|
96
|
+
LIMIT 100;
|
|
97
|
+
|
|
98
|
+
-- Verificar cardinalidade dos campos candidatos a chave primária
|
|
99
|
+
SELECT
|
|
100
|
+
<campo_candidato>,
|
|
101
|
+
COUNT(*) AS ocorrencias
|
|
102
|
+
FROM <schema>.<tabela>
|
|
103
|
+
GROUP BY <campo_candidato>
|
|
104
|
+
HAVING COUNT(*) > 1
|
|
105
|
+
LIMIT 10; -- se retornar registros → não é chave primária única
|
|
106
|
+
|
|
107
|
+
-- Verificar nulos em campos críticos
|
|
108
|
+
SELECT
|
|
109
|
+
COUNT(*) AS total,
|
|
110
|
+
COUNT(<campo_critico>) AS nao_nulos,
|
|
111
|
+
COUNT(*) - COUNT(<campo_critico>) AS nulos
|
|
112
|
+
FROM <schema>.<tabela>;
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### Para arquivo (CSV/Parquet)
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
import pandas as pd
|
|
119
|
+
|
|
120
|
+
df = pd.read_csv('amostra.csv', nrows=1000) # ou read_parquet
|
|
121
|
+
print(df.dtypes) # tipos inferidos
|
|
122
|
+
print(df.isnull().sum()) # nulos por coluna
|
|
123
|
+
print(df.describe()) # estatísticas básicas
|
|
124
|
+
print(df.nunique()) # cardinalidade por coluna
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Fase 3 — Documentar o Pipeline (antes de implementar)
|
|
128
|
+
|
|
129
|
+
Preencher `templates/engineering/data-pipeline-template.md` com o que foi descoberto na Fase 2.
|
|
130
|
+
|
|
131
|
+
**Campos obrigatórios antes de continuar**:
|
|
132
|
+
- Nome do pipeline
|
|
133
|
+
- Fonte (sistema, endpoint ou tabela)
|
|
134
|
+
- Schema mapeado (campos, tipos, chave primária)
|
|
135
|
+
- Campos sensíveis identificados e como serão tratados
|
|
136
|
+
- Frequência de execução
|
|
137
|
+
- Destino bronze (nome da tabela no `$DATA_QUERY_ENGINE`)
|
|
138
|
+
|
|
139
|
+
> ⚠️ **Não iniciar a implementação sem o doc de pipeline preenchido.**
|
|
140
|
+
> O doc é a fonte de verdade — se mudar algo durante a implementação, atualizar o doc.
|
|
141
|
+
|
|
142
|
+
### Fase 4 — Implementar Extração para Bronze
|
|
143
|
+
|
|
144
|
+
Criar o script de extração seguindo o padrão do projeto:
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
"""
|
|
148
|
+
Pipeline: bronze_<nome_fonte>
|
|
149
|
+
Descrição: Ingestão bruta de <fonte> para bronze
|
|
150
|
+
Fonte: <sistema_origem> — <endpoint_ou_tabela>
|
|
151
|
+
Destino: bronze.<nome_fonte>
|
|
152
|
+
Frequência: <diária/horária/sob demanda>
|
|
153
|
+
Owner: <email>
|
|
154
|
+
"""
|
|
155
|
+
import logging
|
|
156
|
+
from datetime import date
|
|
157
|
+
|
|
158
|
+
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
|
|
159
|
+
logger = logging.getLogger(__name__)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def extract(data_referencia: date) -> list[dict]:
|
|
163
|
+
"""Extrai dados brutos da fonte para a data de referência."""
|
|
164
|
+
logger.info(f"Extraindo {data_referencia} de <fonte>")
|
|
165
|
+
# implementar: API call, DB query, leitura de arquivo
|
|
166
|
+
...
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def load_bronze(raw_data: list[dict], data_referencia: date) -> None:
|
|
170
|
+
"""
|
|
171
|
+
Carrega dados brutos em bronze de forma idempotente.
|
|
172
|
+
Bronze = dados exatamente como vieram da fonte, sem transformação.
|
|
173
|
+
Adiciona apenas campos de auditoria: ingested_at, source_system, data_referencia.
|
|
174
|
+
"""
|
|
175
|
+
import pandas as pd
|
|
176
|
+
from datetime import datetime
|
|
177
|
+
|
|
178
|
+
df = pd.DataFrame(raw_data)
|
|
179
|
+
|
|
180
|
+
# Campos de auditoria obrigatórios (data-rules.md seção 1)
|
|
181
|
+
df['ingested_at'] = datetime.utcnow()
|
|
182
|
+
df['source_system'] = '<nome_fonte>'
|
|
183
|
+
df['data_referencia'] = data_referencia
|
|
184
|
+
|
|
185
|
+
logger.info(f"Carregando {len(df)} registros em bronze.<nome_fonte> para {data_referencia}")
|
|
186
|
+
|
|
187
|
+
# Idempotência: DELETE + INSERT por partição
|
|
188
|
+
# (implementar com o $DATA_ETL_TOOL do projeto)
|
|
189
|
+
delete_partition('bronze.<nome_fonte>', 'data_referencia', str(data_referencia))
|
|
190
|
+
insert(df, 'bronze.<nome_fonte>')
|
|
191
|
+
|
|
192
|
+
logger.info(f"Bronze carregado: {len(df)} registros")
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def run(data_referencia: date = date.today()) -> None:
|
|
196
|
+
raw = extract(data_referencia)
|
|
197
|
+
if not raw:
|
|
198
|
+
logger.warning(f"Nenhum dado extraído para {data_referencia} — verificar fonte")
|
|
199
|
+
return
|
|
200
|
+
load_bronze(raw, data_referencia)
|
|
201
|
+
logger.info(f"Pipeline bronze_<nome_fonte> concluído: {len(raw)} registros")
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
if __name__ == "__main__":
|
|
205
|
+
run()
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Regras de bronze**:
|
|
209
|
+
- ✅ Dados exatamente como vieram da fonte — sem transformação de conteúdo
|
|
210
|
+
- ✅ Apenas campos de auditoria adicionados: `ingested_at`, `source_system`, `data_referencia`
|
|
211
|
+
- ✅ Idempotência: DELETE por partição antes do INSERT
|
|
212
|
+
- ❌ Nunca aplicar regras de negócio em bronze — isso é silver
|
|
213
|
+
|
|
214
|
+
### Fase 5 — Criar Expectation Suite Mínima
|
|
215
|
+
|
|
216
|
+
Criar a suite de qualidade antes de usar os dados em downstream:
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
import great_expectations as ge
|
|
220
|
+
|
|
221
|
+
def create_bronze_suite(datasource_name: str, table_name: str) -> None:
|
|
222
|
+
"""Cria Expectation Suite mínima para tabela bronze."""
|
|
223
|
+
context = ge.get_context()
|
|
224
|
+
suite = context.add_expectation_suite(f"bronze.{table_name}.min")
|
|
225
|
+
validator = context.get_validator(
|
|
226
|
+
datasource_name=datasource_name,
|
|
227
|
+
data_asset_name=table_name
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Checks obrigatórios (data-rules.md seção 2)
|
|
231
|
+
validator.expect_table_row_count_to_be_between(min_value=1)
|
|
232
|
+
validator.expect_column_values_to_not_be_null(column="<chave_primaria>")
|
|
233
|
+
validator.expect_column_values_to_not_be_null(column="data_referencia")
|
|
234
|
+
validator.expect_column_values_to_be_unique(column="<chave_primaria>")
|
|
235
|
+
|
|
236
|
+
# Campos sensíveis: verificar que não estão expostos sem mascaramento
|
|
237
|
+
# (adicionar se houver campos sensíveis identificados na Fase 1)
|
|
238
|
+
|
|
239
|
+
validator.save_expectation_suite()
|
|
240
|
+
print(f"Suite criada: bronze.{table_name}.min")
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
> Se o projeto usa `$DATA_QUALITY_TOOL` diferente de Great Expectations, adaptar a sintaxe mantendo os mesmos checks.
|
|
244
|
+
|
|
245
|
+
### Fase 6 — Testar e Validar
|
|
246
|
+
|
|
247
|
+
Antes de considerar o onboarding completo:
|
|
248
|
+
|
|
249
|
+
**Checklist de validação**:
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
[ ] Script de extração executa sem erro para 1 data de teste
|
|
253
|
+
[ ] Bronze recebe os dados com campos de auditoria corretos
|
|
254
|
+
[ ] Expectation Suite passa para o período de teste
|
|
255
|
+
[ ] Volume extraído é compatível com o esperado (fase 1)
|
|
256
|
+
[ ] Campos sensíveis estão mascarados ou ausentes em bronze
|
|
257
|
+
[ ] Script é idempotente (reprocessar 2x não duplica)
|
|
258
|
+
[ ] Log registra: data_referencia, rows_extracted, rows_loaded, status
|
|
259
|
+
[ ] Documentação de pipeline preenchida e salva
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Fase 7 — Próximos passos (silver/gold)
|
|
263
|
+
|
|
264
|
+
Após bronze validado, orientar os próximos passos:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
Bronze concluído ✅
|
|
268
|
+
|
|
269
|
+
Próximos passos recomendados:
|
|
270
|
+
1. Criar script silver_<fonte>: limpeza, tipagem e deduplicação
|
|
271
|
+
2. Expandir Expectation Suite para silver (checks de tipo e domínio)
|
|
272
|
+
3. Avaliar se há caso de uso para gold (analytics, BI, contrato de dados)
|
|
273
|
+
4. Se expor para outra squad → criar contrato via data.contract.md
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Tratamento de Campos Sensíveis
|
|
279
|
+
|
|
280
|
+
Se a Fase 1 identificou campos sensíveis (CPF, dados bancários, localização, etc.):
|
|
281
|
+
|
|
282
|
+
| Campo sensível | Tratamento em bronze | Tratamento em silver/gold |
|
|
283
|
+
|---|---|---|
|
|
284
|
+
| CPF / RG / CNH | Manter no bronze com acesso IAM restrito | Mascarar: `SHA256(cpf)` ou remover |
|
|
285
|
+
| Dados bancários | Manter no bronze com acesso IAM restrito | Remover ou mascarar |
|
|
286
|
+
| Localização em tempo real | Manter no bronze com acesso IAM restrito | Agregar (ex: cidade, estado) |
|
|
287
|
+
| Telefone / Endereço | Manter no bronze com acesso IAM restrito | Remover se não necessário |
|
|
288
|
+
|
|
289
|
+
> Qualquer exposição de dado sensível em gold exige contrato de dados aprovado (ver `data-rules.md` seção 5).
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Regras Críticas
|
|
294
|
+
|
|
295
|
+
### Nunca faça
|
|
296
|
+
|
|
297
|
+
- ❌ Iniciar implementação sem documentar o pipeline primeiro
|
|
298
|
+
- ❌ Aplicar transformações em bronze — bronze é imutável e bruto
|
|
299
|
+
- ❌ Ignorar campos sensíveis identificados na análise
|
|
300
|
+
- ❌ Usar APPEND sem verificar duplicatas (quebra idempotência)
|
|
301
|
+
- ❌ Promover para silver sem Expectation Suite passando
|
|
302
|
+
|
|
303
|
+
### Sempre faça
|
|
304
|
+
|
|
305
|
+
- ✅ Amostrar antes de ingerir tudo — entender o schema real
|
|
306
|
+
- ✅ Documentar o pipeline antes de implementar
|
|
307
|
+
- ✅ Identificar campos sensíveis na fase de análise
|
|
308
|
+
- ✅ Garantir idempotência desde o primeiro script
|
|
309
|
+
- ✅ Criar Expectation Suite mínima antes de considerar bronze pronto
|
|
310
|
+
- ✅ Testar com período pequeno antes de reprocessar histórico
|